Skip to content

Commit

Permalink
Merge pull request #9 from shaaibu7/handle-donation-event
Browse files Browse the repository at this point in the history
implement donation recieved event processing
  • Loading branch information
EjembiEmmanuel authored Dec 1, 2024
2 parents 8296c4d + 1d2f412 commit d026e98
Show file tree
Hide file tree
Showing 4 changed files with 67 additions and 2 deletions.
1 change: 1 addition & 0 deletions prisma/schema.prisma
Original file line number Diff line number Diff line change
Expand Up @@ -17,5 +17,6 @@ model Campaign {
id Int @id
campaign_address String
campaign_owner String
totalDonations Int
createdAt DateTime
}
3 changes: 2 additions & 1 deletion src/app.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { GraphQLModule } from '@nestjs/graphql';
import { ApolloDriver, ApolloDriverConfig } from '@nestjs/apollo';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { handleDonationReceivedService } from './donation.service';
import { getEnvPath } from './common/utils';
import { PrismaModule } from './prisma/prisma.module';
import { SharedIndexerModule } from './shared-indexer/shared-indexer.module';
Expand All @@ -23,6 +24,6 @@ import { ResolversModule } from './resolvers/resolvers.module';
ResolversModule,
],
controllers: [AppController],
providers: [AppService],
providers: [AppService, handleDonationReceivedService],
})
export class AppModule {}
59 changes: 59 additions & 0 deletions src/donation.service.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
import { Injectable, Logger } from '@nestjs/common';
import { PrismaService } from 'src/prisma/prisma.service';
import { SharedIndexerService } from './shared-indexer/shared-indexer.service';
import { Campaign } from './resolvers/models/campaign.model';
import { num, hash } from 'starknet';

@Injectable()
export class handleDonationReceivedService {
private readonly logger = new Logger(handleDonationReceivedService.name);

constructor(
private readonly prismaService: PrismaService,
private readonly sharedIndexerService: SharedIndexerService,
) {}

onModuleInit() {
const donationEventKey = num.toHex(hash.starknetKeccak('DonationCreated'));

this.sharedIndexerService.registerIndexer(
[donationEventKey],
this.handleDonationReceivedEvent.bind(this),
);
}

private async handleDonationReceivedEvent(
event: any,
): Promise<Campaign | null> {
try {
// Extract donation details from the event
const [campaign_id, amount] = event.data;

this.logger.log(
`Processing DonationReceived event for campaign ${campaign_id}`,
);

//updating the specific campaign's donation total
const campaign = await this.prismaService.campaign.update({
where: { id: Number(campaign_id) },
data: {
totalDonations: {
increment: Number(amount),
},
},
});

this.logger.log(
`Donation of ${amount} successfully updated for campaign ${campaign_id}.`,
);

return campaign;
} catch (error) {
this.logger.error(
`Error processing DonationReceived event: ${error.message}`,
error.stack,
);
throw error;
}
}
}
6 changes: 5 additions & 1 deletion src/resolvers/models/campaign.model.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Field, Int, ObjectType } from '@nestjs/graphql';
import { Field, Float, Int, ObjectType } from '@nestjs/graphql';

@ObjectType({ description: 'campaign' })
export class Campaign {
Expand All @@ -12,6 +12,10 @@ export class Campaign {
@Field()
campaign_owner: string;

// eslint-disable-next-line @typescript-eslint/no-unused-vars
@Field((type) => Float)
totalDonations: number;

@Field()
createdAt: Date;
}

0 comments on commit d026e98

Please sign in to comment.