apps/recallassess/recallassess-api/src/api/shared/media/media.service.ts
BNestBaseModuleService
Properties |
|
Methods |
|
| Async addMediaFiles | ||||||||||||||||||
addMediaFiles(fileList: DiskStorageFile[], module: string, mediaType: string, mediaName: string, id: number)
|
||||||||||||||||||
|
Parameters :
Returns :
unknown
|
| Private Async checkCourseEnrollments | ||||||
checkCourseEnrollments(courseId: number)
|
||||||
|
Check if a course has enrollments
Parameters :
Returns :
Promise<void>
|
| Async deleteMedia | ||||||||||||||||||
deleteMedia(module: string, mediaType: string, mediaName: string, record_id: number, id: number)
|
||||||||||||||||||
|
Parameters :
Returns :
unknown
|
| Private Async getCourseIdForModule |
getCourseIdForModule(module: string, recordId: number)
|
|
Get course ID from module and record ID
Returns :
Promise<number | null>
|
| Protected mediaUtilService |
Type : BNestMediaUtilService
|
Decorators :
@Inject()
|
| Protected prisma |
Type : BNestPrismaService
|
Decorators :
@Inject()
|
import { BNestBaseModuleService } from "@bish-nest/core/data/module-service/base-module.service";
import { BNestMediaUtilService } from "@bish-nest/core/services/media-util.service";
import { BNestPrismaService } from "@bish-nest/core/services";
import { DiskStorageFile } from "@blazity/nest-file-fastify";
import { BadRequestException, Inject, Injectable } from "@nestjs/common";
@Injectable()
export class MediaService extends BNestBaseModuleService {
@Inject() protected mediaUtilService!: BNestMediaUtilService;
@Inject() protected prisma!: BNestPrismaService;
/**
* Check if a course has enrollments
*/
private async checkCourseEnrollments(courseId: number): Promise<void> {
const enrollmentCount = await this.prisma.client.learningGroupParticipant.count({
where: {
course_id: courseId,
},
});
if (enrollmentCount > 0) {
throw new BadRequestException(
`Sorry, this course has ${enrollmentCount} enrolled participant${enrollmentCount > 1 ? 's' : ''}. To keep everyone's learning progress safe, we can't modify media for courses that have active participants.`,
);
}
}
/**
* Get course ID from module and record ID
*/
private async getCourseIdForModule(module: string, recordId: number): Promise<number | null> {
if (module === "course") {
// For course media, the recordId IS the courseId
return recordId;
} else if (module === "course-module") {
// CourseModule no longer has course_id, so we can't check enrollments
// Return null to skip enrollment check
return null;
} else if (module === "course-module-page") {
// For course-module-page media, get the course_id directly from the course module page
const courseModulePage = await this.prisma.client.courseModulePage.findUnique({
where: { id: recordId },
select: { course_id: true },
});
return courseModulePage?.course_id || null;
}
// For other modules, return null (no enrollment check needed)
return null;
}
async addMediaFiles(
fileList: DiskStorageFile[],
module: string,
mediaType: string,
mediaName: string,
id: number,
) {
// Check enrollments for course and course-module media, but allow 100DJ documents
// const courseId = await this.getCourseIdForModule(module, id);
// if (courseId !== null && !mediaName.startsWith('hundred_dj_email')) {
// await this.checkCourseEnrollments(courseId);
// }
const normalizedMediaType = this.mediaUtilService.normalizeMediaType(mediaType);
const normalizedMediaName = this.mediaUtilService.normalizeMediaName(module, mediaName);
return this.mediaUtilService.addMediaFiles(fileList, module, normalizedMediaType, normalizedMediaName, id);
}
async deleteMedia(module: string, mediaType: string, mediaName: string, record_id: number, id: number) {
// Check enrollments for course and course-module media, but allow 100DJ documents
// const courseId = await this.getCourseIdForModule(module, record_id);
// if (courseId !== null && !mediaName.startsWith('hundred_dj_email')) {
// await this.checkCourseEnrollments(courseId);
// }
const normalizedMediaType = this.mediaUtilService.normalizeMediaType(mediaType);
const normalizedMediaName = this.mediaUtilService.normalizeMediaName(module, mediaName);
return this.mediaUtilService.deleteMedia(module, normalizedMediaType, normalizedMediaName, record_id, id);
}
}