File

apps/recallassess/recallassess-api/src/api/shared/media/media.service.ts

Extends

BNestBaseModuleService

Index

Properties
Methods

Methods

Async addMediaFiles
addMediaFiles(fileList: DiskStorageFile[], module: string, mediaType: string, mediaName: string, id: number)
Parameters :
Name Type Optional
fileList DiskStorageFile[] No
module string No
mediaType string No
mediaName string No
id number No
Returns : unknown
Private Async checkCourseEnrollments
checkCourseEnrollments(courseId: number)

Check if a course has enrollments

Parameters :
Name Type Optional
courseId number No
Returns : Promise<void>
Async deleteMedia
deleteMedia(module: string, mediaType: string, mediaName: string, record_id: number, id: number)
Parameters :
Name Type Optional
module string No
mediaType string No
mediaName string No
record_id number No
id number No
Returns : unknown
Private Async getCourseIdForModule
getCourseIdForModule(module: string, recordId: number)

Get course ID from module and record ID

Parameters :
Name Type Optional
module string No
recordId number No
Returns : Promise<number | null>

Properties

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);
  }
}

results matching ""

    No results matching ""