From 40f30b4a5db1ee138ec6743d2fb20c2d82d231bd Mon Sep 17 00:00:00 2001 From: kevin-asprec Date: Mon, 4 May 2026 17:39:01 +0800 Subject: [PATCH] fix: resolve TS build errors - missing schema fields, types, and packages - Add mustChangePassword field to User model in schema.prisma - Add latitude/longitude fields to Client model (matching existing migration) - Remove @nestjs/serve-static import from app.module (not in dependencies) - Add @types/multer to devDependencies and type multer config explicitly - Create migration for mustChangePassword column Co-Authored-By: Claude Opus 4.6 --- package.json | 1 + .../migration.sql | 2 ++ packages/db/prisma/schema.prisma | 5 ++++- src/app.module.ts | 6 ------ src/common/multer/multer.config.ts | 9 ++++++--- 5 files changed, 13 insertions(+), 10 deletions(-) create mode 100644 packages/db/prisma/migrations/20260504100000_add_user_must_change_password/migration.sql diff --git a/package.json b/package.json index ec0378d..245a134 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "@nestjs/testing": "^11.0.0", "@types/bcrypt": "^5.0.2", "@types/express": "^5.0.0", + "@types/multer": "^1.4.12", "@types/passport-jwt": "^4.0.1", "typescript": "^5.7.0", "vitest": "^3.1.0" diff --git a/packages/db/prisma/migrations/20260504100000_add_user_must_change_password/migration.sql b/packages/db/prisma/migrations/20260504100000_add_user_must_change_password/migration.sql new file mode 100644 index 0000000..030324b --- /dev/null +++ b/packages/db/prisma/migrations/20260504100000_add_user_must_change_password/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "users" ADD COLUMN "mustChangePassword" BOOLEAN NOT NULL DEFAULT false; diff --git a/packages/db/prisma/schema.prisma b/packages/db/prisma/schema.prisma index 7704953..02d6a79 100644 --- a/packages/db/prisma/schema.prisma +++ b/packages/db/prisma/schema.prisma @@ -44,7 +44,8 @@ model User { password String firstName String lastName String - isActive Boolean @default(true) + isActive Boolean @default(true) + mustChangePassword Boolean @default(false) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt deletedAt DateTime? @@ -203,6 +204,8 @@ model Client { address String areaId String? status String @default("active") // active, inactive, suspended + latitude Float? + longitude Float? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt deletedAt DateTime? diff --git a/src/app.module.ts b/src/app.module.ts index 7874216..f784743 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -2,8 +2,6 @@ import { Module } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; import { APP_FILTER, APP_GUARD, APP_INTERCEPTOR } from '@nestjs/core'; import { ThrottlerModule, ThrottlerGuard } from '@nestjs/throttler'; -import { ServeStaticModule } from '@nestjs/serve-static'; -import { join } from 'path'; import { HealthModule } from './health/health.module'; import { PrismaModule } from './prisma/prisma.module'; import { AuthModule } from './auth/auth.module'; @@ -73,10 +71,6 @@ import { AccessGuard } from './common/guards/access.guard'; PayrollModule, RoleModule, CommentModule, - ServeStaticModule.forRoot({ - rootPath: join(__dirname, '..', 'uploads'), - serveRoot: '/uploads', - }), ], providers: [ { provide: APP_FILTER, useClass: GlobalExceptionFilter }, diff --git a/src/common/multer/multer.config.ts b/src/common/multer/multer.config.ts index 9630c56..db9e6c3 100644 --- a/src/common/multer/multer.config.ts +++ b/src/common/multer/multer.config.ts @@ -1,11 +1,14 @@ import { MulterOptions } from '@nestjs/platform-express/multer/interfaces/multer-options.interface'; import { diskStorage } from 'multer'; import { extname } from 'path'; +import { Request } from 'express'; export const multerOptions: MulterOptions = { storage: diskStorage({ - destination: './uploads', - filename: (_req, file, cb) => { + destination: (_req: Request, _file: Express.Multer.File, cb: (error: Error | null, destination: string) => void) => { + cb(null, './uploads'); + }, + filename: (_req: Request, file: Express.Multer.File, cb: (error: Error | null, filename: string) => void) => { const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1e9); cb(null, uniqueSuffix + extname(file.originalname)); }, @@ -13,7 +16,7 @@ export const multerOptions: MulterOptions = { limits: { fileSize: 5 * 1024 * 1024, // 5MB per file }, - fileFilter: (_req, file, cb) => { + fileFilter: (_req: Request, file: Express.Multer.File, cb: (error: Error | null, acceptFile: boolean) => void) => { const allowed = [ 'image/jpeg', 'image/png',