From 80f2b956d1c31b141c07e221fb7735213b369a55 Mon Sep 17 00:00:00 2001 From: thureinhtet99 Date: Fri, 10 Jul 2026 13:32:10 +0700 Subject: [PATCH 1/3] feat: implement academic year context service and module - Add AcademicYearContextService to manage active academic year retrieval. - Create AcademicYearContextModule for dependency injection. - Update seeders to accommodate new academic year structure. - Refactor imports and adjust class and exam seeders for consistency. --- server/package.json | 2 +- server/src/app.module.ts | 2 +- .../academic-year-context.module.ts | 0 .../academic-year-context.service.spec.ts | 0 .../academic-year-context.service.ts | 0 .../src/database/seeders/seed-academic-years.ts | 14 ++++++++++++-- server/src/database/seeders/seed-classes.ts | 15 +++------------ server/src/database/seeders/seed-exams.ts | 4 ++-- .../academic-years/academic-years.service.ts | 6 +++++- server/src/modules/classes/classes.service.ts | 2 +- 10 files changed, 25 insertions(+), 20 deletions(-) rename server/src/common/{academic-year => academic-year-context}/academic-year-context.module.ts (100%) rename server/src/common/{academic-year => academic-year-context}/academic-year-context.service.spec.ts (100%) rename server/src/common/{academic-year => academic-year-context}/academic-year-context.service.ts (100%) diff --git a/server/package.json b/server/package.json index 8822f0d..b0680eb 100644 --- a/server/package.json +++ b/server/package.json @@ -22,7 +22,7 @@ "db:generate": "pnpm dlx prisma generate", "db:migrate": "pnpm dlx prisma migrate dev --name init", "db:reset": "pnpm dlx prisma migrate reset", - "db:seed": "pnpm build && node dist/database/seeders/seed.js" + "db:seed": "pnpm build && node dist/src/database/seeders/seed.js" }, "dependencies": { "@nestjs/common": "^11.0.1", diff --git a/server/src/app.module.ts b/server/src/app.module.ts index 3c43706..1094e9a 100644 --- a/server/src/app.module.ts +++ b/server/src/app.module.ts @@ -6,7 +6,7 @@ import { AuthModule } from '@thallesp/nestjs-better-auth'; import rateLimit from 'express-rate-limit'; import { AppController } from './app.controller'; import { AppService } from './app.service'; -import { AcademicYearContextModule } from './common/academic-year/academic-year-context.module.js'; +import { AcademicYearContextModule } from './common/academic-year-context/academic-year-context.module'; import { auth } from './common/utils/auth'; import { PrismaModule } from './database/prisma/prisma.module'; import { AcademicYearsModule } from './modules/academic-years/academic-years.module.js'; diff --git a/server/src/common/academic-year/academic-year-context.module.ts b/server/src/common/academic-year-context/academic-year-context.module.ts similarity index 100% rename from server/src/common/academic-year/academic-year-context.module.ts rename to server/src/common/academic-year-context/academic-year-context.module.ts diff --git a/server/src/common/academic-year/academic-year-context.service.spec.ts b/server/src/common/academic-year-context/academic-year-context.service.spec.ts similarity index 100% rename from server/src/common/academic-year/academic-year-context.service.spec.ts rename to server/src/common/academic-year-context/academic-year-context.service.spec.ts diff --git a/server/src/common/academic-year/academic-year-context.service.ts b/server/src/common/academic-year-context/academic-year-context.service.ts similarity index 100% rename from server/src/common/academic-year/academic-year-context.service.ts rename to server/src/common/academic-year-context/academic-year-context.service.ts diff --git a/server/src/database/seeders/seed-academic-years.ts b/server/src/database/seeders/seed-academic-years.ts index cfdedfd..cf187ce 100644 --- a/server/src/database/seeders/seed-academic-years.ts +++ b/server/src/database/seeders/seed-academic-years.ts @@ -12,13 +12,23 @@ export async function seedAcademicYears(appContext: INestApplicationContext) { return; } - await prismaService.academicYear.create({ - data: { + const academicYearToCreate = [ + { name: '2023-2024', startDate: new Date('2023-09-01'), endDate: new Date('2024-06-30'), isCurrent: true, }, + { + name: '2024-2025', + startDate: new Date('2024-09-01'), + endDate: new Date('2025-06-30'), + isCurrent: false, + }, + ]; + + await prismaService.academicYear.createMany({ + data: academicYearToCreate, }); console.log('Academic years seeded successfully!'); } catch (error) { diff --git a/server/src/database/seeders/seed-classes.ts b/server/src/database/seeders/seed-classes.ts index 0ee0a22..e0c3676 100644 --- a/server/src/database/seeders/seed-classes.ts +++ b/server/src/database/seeders/seed-classes.ts @@ -12,19 +12,10 @@ export async function seedClasses(appContext: INestApplicationContext) { return; } - const academicYear = await prismaService.academicYear.findFirst({ - where: { isCurrent: true }, - }); - - if (!academicYear) { - console.log('No current academic year found. Skipping class seeding.'); - return; - } - const classesToCreate = [ - { name: 'Grade 1A', academicYearId: academicYear.id }, - { name: 'Grade 1B', academicYearId: academicYear.id }, - { name: 'Grade 2A', academicYearId: academicYear.id }, + { name: 'Grade 1A' }, + { name: 'Grade 1B' }, + { name: 'Grade 2A' }, ]; await prismaService.class.createMany({ diff --git a/server/src/database/seeders/seed-exams.ts b/server/src/database/seeders/seed-exams.ts index 6352a3f..19a65c9 100644 --- a/server/src/database/seeders/seed-exams.ts +++ b/server/src/database/seeders/seed-exams.ts @@ -34,7 +34,7 @@ export async function seedExams(appContext: INestApplicationContext) { startTime: new Date('2024-03-15T09:00:00Z'), endTime: new Date('2024-03-15T11:00:00Z'), teachingAllocationId: teachingAllocations[0].id, - academicYearId: academicYear.id, + // academicYearId: academicYear.id, }, { title: 'Mid-term Science', @@ -44,7 +44,7 @@ export async function seedExams(appContext: INestApplicationContext) { startTime: new Date('2024-03-16T09:00:00Z'), endTime: new Date('2024-03-16T11:00:00Z'), teachingAllocationId: teachingAllocations[1].id, - academicYearId: academicYear.id, + // academicYearId: academicYear.id, }, ]; diff --git a/server/src/modules/academic-years/academic-years.service.ts b/server/src/modules/academic-years/academic-years.service.ts index 9327768..d496425 100644 --- a/server/src/modules/academic-years/academic-years.service.ts +++ b/server/src/modules/academic-years/academic-years.service.ts @@ -1,5 +1,6 @@ import { Injectable, NotFoundException } from '@nestjs/common'; import { Prisma } from '../../../prisma/generated/prisma/client.js'; +import { AcademicYearContextService } from '../../common/academic-year-context/academic-year-context.service.js'; import { PaginatedResponseDto } from '../../common/dto/paginated-response.dto.js'; import { PrismaService } from '../../database/prisma/prisma.service.js'; import { AcademicYearResponseDto } from './dto/academic-year-response.dto.js'; @@ -9,7 +10,10 @@ import { UpdateAcademicYearDto } from './dto/update-academic-year.dto.js'; @Injectable() export class AcademicYearsService { - constructor(private readonly prisma: PrismaService) {} + constructor( + private readonly prisma: PrismaService, + private readonly academicYearContext: AcademicYearContextService, + ) {} async create( createAcademicYearDto: CreateAcademicYearDto, diff --git a/server/src/modules/classes/classes.service.ts b/server/src/modules/classes/classes.service.ts index 3179012..11bba41 100644 --- a/server/src/modules/classes/classes.service.ts +++ b/server/src/modules/classes/classes.service.ts @@ -4,7 +4,7 @@ import { NotFoundException, } from '@nestjs/common'; import { Prisma } from '../../../prisma/generated/prisma/client.js'; -import { AcademicYearContextService } from '../../common/academic-year/academic-year-context.service.js'; +import { AcademicYearContextService } from '../../common/academic-year-context/academic-year-context.service.js'; import { PaginatedResponseDto } from '../../common/dto/paginated-response.dto.js'; import { formatClass } from '../../common/formatters/class.formatter.js'; import { PrismaService } from '../../database/prisma/prisma.service.js'; From 9ef8fb8c147c131724949dc52559ea15265ea5d7 Mon Sep 17 00:00:00 2001 From: thureinhtet99 Date: Fri, 10 Jul 2026 13:59:56 +0700 Subject: [PATCH 2/3] fix update service and api docs --- .../academic-years/academic-years.service.ts | 2 +- .../dto/create-academic-year.dto.ts | 2 +- .../dto/update-academic-year.dto.ts | 23 ++++++++++++++++--- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/server/src/modules/academic-years/academic-years.service.ts b/server/src/modules/academic-years/academic-years.service.ts index d496425..b53969d 100644 --- a/server/src/modules/academic-years/academic-years.service.ts +++ b/server/src/modules/academic-years/academic-years.service.ts @@ -116,13 +116,13 @@ export class AcademicYearsService { return await this.prisma.academicYear.update({ where: { id }, data: { + name: updateAcademicYearDto.name, startDate: updateAcademicYearDto.startDate ? new Date(updateAcademicYearDto.startDate) : undefined, endDate: updateAcademicYearDto.endDate ? new Date(updateAcademicYearDto.endDate) : undefined, - isCurrent: updateAcademicYearDto.isCurrent, }, }); } diff --git a/server/src/modules/academic-years/dto/create-academic-year.dto.ts b/server/src/modules/academic-years/dto/create-academic-year.dto.ts index f797b3d..535c1d8 100644 --- a/server/src/modules/academic-years/dto/create-academic-year.dto.ts +++ b/server/src/modules/academic-years/dto/create-academic-year.dto.ts @@ -25,7 +25,7 @@ export class CreateAcademicYearDto { @IsNotEmpty() endDate!: string; - @ApiProperty({ example: false, nullable: true }) + @ApiProperty({ example: false }) @IsBoolean() @IsOptional() isCurrent!: boolean; diff --git a/server/src/modules/academic-years/dto/update-academic-year.dto.ts b/server/src/modules/academic-years/dto/update-academic-year.dto.ts index 7f03670..e981d49 100644 --- a/server/src/modules/academic-years/dto/update-academic-year.dto.ts +++ b/server/src/modules/academic-years/dto/update-academic-year.dto.ts @@ -1,7 +1,24 @@ import { PartialType } from '@nestjs/mapped-types'; -import { OmitType } from '@nestjs/swagger'; +import { ApiProperty, OmitType } from '@nestjs/swagger'; +import { IsDateString, IsNotEmpty, IsString, MaxLength } from 'class-validator'; import { CreateAcademicYearDto } from './create-academic-year.dto.js'; export class UpdateAcademicYearDto extends PartialType( - OmitType(CreateAcademicYearDto, ['name'] as const), -) {} + OmitType(CreateAcademicYearDto, ['isCurrent'] as const), +) { + @ApiProperty({ type: String, example: '2025-2026' }) + @IsString() + @IsNotEmpty() + @MaxLength(100) + name!: string; + + @ApiProperty({ type: String, example: '2025-06-01T00:00:00.000Z' }) + @IsDateString() + @IsNotEmpty() + startDate!: string; + + @ApiProperty({ type: String, example: '2026-05-31T23:59:59.000Z' }) + @IsDateString() + @IsNotEmpty() + endDate!: string; +} From 48d4d9e5b9625ecfe4fc5dfb725b375a4349bc3a Mon Sep 17 00:00:00 2001 From: thureinhtet99 Date: Fri, 10 Jul 2026 14:14:12 +0700 Subject: [PATCH 3/3] fix imports error in class service --- server/src/modules/classes/classes.service.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/modules/classes/classes.service.spec.ts b/server/src/modules/classes/classes.service.spec.ts index 267dc61..514faff 100644 --- a/server/src/modules/classes/classes.service.spec.ts +++ b/server/src/modules/classes/classes.service.spec.ts @@ -1,5 +1,5 @@ import { Test, TestingModule } from '@nestjs/testing'; -import { AcademicYearContextService } from '../../common/academic-year/academic-year-context.service.js'; +import { AcademicYearContextService } from '../../common/academic-year-context/academic-year-context.service.js'; import { PrismaService } from '../../database/prisma/prisma.service.js'; import { ClassesService } from './classes.service';