File

apps/recallassess/recallassess-api/src/api/admin/assessment/services/assessment.service.ts

Description

AssessmentService

Admin API — Assessment (Assessment). Business Logic Service for RecallAssess.

Extends

BNestBaseModuleService

Index

Methods

Constructor

constructor(prisma: BNestPrismaService)
Parameters :
Name Type Optional
prisma BNestPrismaService No

Methods

Async add
add(data: any)

Override add method to prevent creation when course has enrollments

Parameters :
Name Type Optional
data any No
Returns : unknown
Private Async checkCourseEnrollments
checkCourseEnrollments(courseId: number)

Check if the associated course has enrollments

Parameters :
Name Type Optional
courseId number No
Returns : Promise<void>
Async delete
delete(id: number)

Override delete method to prevent deletion when course has enrollments

Parameters :
Name Type Optional
id number No
Returns : Promise<void>
Async save
save(id: number, data: any)

Override save method to prevent modifications when course has enrollments

Parameters :
Name Type Optional
id number No
data any No
Returns : Promise<SaveResponseDataInterface<any>>
import { BNestBaseModuleService } from "@bish-nest/core/data/module-service/base-module.service";
import { BNestPrismaService } from "@bish-nest/core/services";
import { SaveResponseDataInterface } from "@bish-nest/core/interfaces/save-response-data.interface";
import { BadRequestException, Injectable, NotFoundException } from "@nestjs/common";

/**
 * AssessmentService
 *
 * Admin API — Assessment (Assessment). Business Logic Service for RecallAssess.
 */


@Injectable()
export class AssessmentService extends BNestBaseModuleService {
  constructor(protected prisma: BNestPrismaService) {
    super();
  }
  /**
   * Check if the associated 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(
        `Cannot modify assessment. The associated course has ${enrollmentCount} enrolled participant(s). Assessments for courses with enrollments cannot be modified or deleted.`,
      );
    }
  }

  /**
   * Override add method to prevent creation when course has enrollments
   */
  async add(data: any) {
    // Check if course_id is provided in the data
    const courseId = data.course_id || data.course?.id;

    if (courseId) {
      await this.checkCourseEnrollments(courseId);
    }

    return super.add(data);
  }

  /**
   * Override save method to prevent modifications when course has enrollments
   */
  async save(id: number, data: any): Promise<SaveResponseDataInterface<any>> {
    const oldAssessment = await this.prisma.client.assessment.findUnique({
      where: { id },
    });

    if (!oldAssessment) {
      throw new NotFoundException(`Assessment with ID ${id} not found`);
    }

    await this.checkCourseEnrollments(oldAssessment.course_id);

    // Also check if the course_id is being changed in the update data
    const courseId = data.course_id || data.course?.id;
    if (courseId && courseId !== oldAssessment.course_id) {
      await this.checkCourseEnrollments(courseId);
    }

    return super.save(id, data);
  }

  /**
   * Override delete method to prevent deletion when course has enrollments
   */
  async delete(id: number): Promise<void> {
    const assessment = await this.prisma.client.assessment.findUnique({
      where: { id },
    });

    if (!assessment) {
      throw new NotFoundException(`Assessment with ID ${id} not found`);
    }

    await this.checkCourseEnrollments(assessment.course_id);
    await super.delete(id);
  }
}

results matching ""

    No results matching ""