Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion src/modules/certificate/certificate.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,13 @@ import { TypeOrmModule } from '@nestjs/typeorm';
import { UserCourseCertificate } from './entities/user_course_certificate';
import { LoggerService } from 'src/common/logger/logger.service';
import { AxiosRequest } from 'src/common/middleware/axios.middleware';
import { KafkaModule } from 'src/kafka/kafka.module';

@Module({
imports: [TypeOrmModule.forFeature([UserCourseCertificate])],
imports: [
TypeOrmModule.forFeature([UserCourseCertificate]),
KafkaModule,
],
controllers: [CertificateController],
providers: [CertificateService, LoggerService, AxiosRequest],
})
Expand Down
77 changes: 75 additions & 2 deletions src/modules/certificate/certificate.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import { UserCourseCertificate } from './entities/user_course_certificate';
import { Repository } from 'typeorm';
import { Response } from 'express';
import puppeteer from 'puppeteer';
import { KafkaService } from 'src/kafka/kafka.service';

@Injectable()
export class CertificateService {
Expand All @@ -16,6 +17,7 @@ export class CertificateService {
private userCourseCertificateRepository: Repository<UserCourseCertificate>,
private configService: ConfigService,
private loggerService: LoggerService,
private readonly kafkaService: KafkaService,
) {}
async generateDid(userId: string, res: Response) {
let apiId = 'api.generate.did';
Expand Down Expand Up @@ -278,13 +280,84 @@ export class CertificateService {
userCertificate.certificateId = data.certificateId;
userCertificate.issuedOn = data.issuedOn;
userCertificate.status = data.status;
await this.userCourseCertificateRepository.save(userCertificate);
const savedCertificate = await this.userCourseCertificateRepository.save(userCertificate);

this.loggerService.log('Successfully updated user certificate');

// Publish Kafka event after successful update
await this.publishCertificateIssuedEvent(
savedCertificate.usercertificateId,
'api.updateUserCertificate',
);
}
this.loggerService.log('Successfully updated user certificate');
} catch (error) {
this.loggerService.error('Error while updating usercertificate', error);
}
}

/**
* Publish certificate issued event to Kafka with event name 'course_updated'
* Fetches complete data from user_course_certificate table and publishes it
* @param usercertificateId - The user certificate ID from database
* @param apiId - API identifier for logging
*/
private async publishCertificateIssuedEvent(
usercertificateId: string,
apiId: string,
): Promise<void> {
try {
// Fetch complete user certificate data from database
const userCertificate = await this.userCourseCertificateRepository.findOne({
where: { usercertificateId: usercertificateId },
});

if (!userCertificate) {
this.loggerService.error(
`User certificate not found for ID: ${usercertificateId}`,
apiId,
);
return;
}

// Prepare event data with complete certificate information
const eventData = {
usercertificateId: userCertificate.usercertificateId,
userId: userCertificate.userId,
courseId: userCertificate.courseId,
certificateId: userCertificate.certificateId,
tenantId: userCertificate.tenantId,
status: userCertificate.status,
issuedOn: userCertificate.issuedOn,
completedOn: userCertificate.completedOn,
completionPercentage: userCertificate.completionPercentage,
lastReadContentId: userCertificate.lastReadContentId,
lastReadContentStatus: userCertificate.lastReadContentStatus,
progress: userCertificate.progress,
createdOn: userCertificate.createdOn,
updatedOn: userCertificate.updatedOn,
createdBy: userCertificate.createdBy,
eventType: 'CERTIFICATE_ISSUED',
};

// Publish event with event name 'course_updated'
await this.kafkaService.publishUserCourseEvent(
'course_updated',
eventData,
userCertificate.courseId,
);

this.loggerService.log(
`Certificate issued event published for user ${userCertificate.userId} and course ${userCertificate.courseId}`,
apiId,
);
} catch (error) {
// Log error but don't fail the certificate update
this.loggerService.error(
`Failed to publish certificate issued event: ${error.message}`,
apiId,
);
}
}
async renderCredentials(
credentialId: string,
templateId: string,
Expand Down