2
0
Эх сурвалжийг харах

✨ feat(advertisement): add user tracking and time management for advertisement entities

- add createdBy and updatedBy fields to track responsible users
- replace createTime/updateTime with standard createdAt/updatedAt timestamps
- update database schema and API documentation accordingly
- enable automatic user tracking in CRUD routes for advertisements and types

♻️ refactor(advertisement): update status field type definition

- fix status field type definition in Create/Update DTO schemas
- change from z.coerce.number() to z.coerce.number<number>() for better type safety
yourname 4 сар өмнө
parent
commit
8df106706e

+ 5 - 1
src/server/api/advertisement-types/index.ts

@@ -10,7 +10,11 @@ const advertisementTypeRoutes = createCrudRoutes({
   getSchema: AdvertisementTypeSchema,
   listSchema: AdvertisementTypeSchema,
   searchFields: ['name', 'code'],
-  middleware: [authMiddleware]
+  middleware: [authMiddleware],
+  userTracking: {
+    createdByField: 'createdBy',
+    updatedByField: 'updatedBy'
+  }
 });
 
 export default advertisementTypeRoutes;

+ 5 - 1
src/server/api/advertisements/index.ts

@@ -11,7 +11,11 @@ const advertisementRoutes = createCrudRoutes({
   listSchema: AdvertisementSchema,
   searchFields: ['title', 'code'],
   relations: ['imageFile', 'advertisementType'],
-  middleware: [authMiddleware]
+  middleware: [authMiddleware],
+  userTracking: {
+    createdByField: 'createdBy',
+    updatedByField: 'updatedBy'
+  }
 });
 
 export default advertisementRoutes;

+ 21 - 7
src/server/modules/advertisements/advertisement-type.entity.ts

@@ -1,4 +1,4 @@
-import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';
+import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn } from 'typeorm';
 
 @Entity('ad_type')
 export class AdvertisementType {
@@ -30,23 +30,37 @@ export class AdvertisementType {
   })
   remark!: string | null;
 
+  @CreateDateColumn({ 
+    name: 'created_at',
+    type: 'timestamp',
+    comment: '创建时间'
+  })
+  createdAt!: Date;
+
+  @UpdateDateColumn({ 
+    name: 'updated_at',
+    type: 'timestamp',
+    comment: '更新时间'
+  })
+  updatedAt!: Date;
+
   @Column({ 
-    name: 'create_time', 
+    name: 'created_by', 
     type: 'int',
     unsigned: true,
     nullable: true,
-    comment: '创建时间'
+    comment: '创建用户ID'
   })
-  createTime!: number | null;
+  createdBy!: number | null;
 
   @Column({ 
-    name: 'update_time', 
+    name: 'updated_by', 
     type: 'int',
     unsigned: true,
     nullable: true,
-    comment: '更新时间'
+    comment: '更新用户ID'
   })
-  updateTime!: number | null;
+  updatedBy!: number | null;
 
   @Column({ 
     name: 'status', 

+ 16 - 8
src/server/modules/advertisements/advertisement-type.schema.ts

@@ -18,13 +18,21 @@ export const AdvertisementTypeSchema = z.object({
     description: '备注',
     example: '用于首页轮播图展示'
   }),
-  createTime: z.number().int().positive().nullable().openapi({
-    description: '创建时间(时间戳)',
-    example: 1700000000
+  createdAt: z.coerce.date().openapi({
+    description: '创建时间',
+    example: '2024-01-01T00:00:00Z'
   }),
-  updateTime: z.number().int().nonnegative().nullable().openapi({
-    description: '更新时间(时间戳)',
-    example: 1700000000
+  updatedAt: z.coerce.date().openapi({
+    description: '更新时间',
+    example: '2024-01-01T00:00:00Z'
+  }),
+  createdBy: z.number().int().positive().nullable().openapi({
+    description: '创建用户ID',
+    example: 1
+  }),
+  updatedBy: z.number().int().positive().nullable().openapi({
+    description: '更新用户ID',
+    example: 1
   }),
   status: z.number().int().min(0).max(1).default(0).openapi({
     description: '状态 0禁用 1启用',
@@ -46,7 +54,7 @@ export const CreateAdvertisementTypeDto = z.object({
     description: '备注',
     example: '用于首页轮播图展示'
   }),
-  status: z.coerce.number().int().min(0).max(1).default(0).optional().openapi({
+  status: z.coerce.number<number>().int().min(0).max(1).default(0).optional().openapi({
     description: '状态 0禁用 1启用',
     example: 1
   })
@@ -66,7 +74,7 @@ export const UpdateAdvertisementTypeDto = z.object({
     description: '备注',
     example: '用于首页轮播图展示'
   }),
-  status: z.coerce.number().int().min(0).max(1).optional().openapi({
+  status: z.coerce.number<number>().int().min(0).max(1).optional().openapi({
     description: '状态 0禁用 1启用',
     example: 1
   })

+ 24 - 8
src/server/modules/advertisements/advertisement.entity.ts

@@ -1,4 +1,4 @@
-import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn } from 'typeorm';
+import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn, CreateDateColumn, UpdateDateColumn } from 'typeorm';
 import { File } from '@/server/modules/files/file.entity';
 import { AdvertisementType } from './advertisement-type.entity';
 
@@ -74,21 +74,37 @@ export class Advertisement {
   })
   sort!: number;
 
+  @CreateDateColumn({ 
+    name: 'created_at',
+    type: 'timestamp',
+    comment: '创建时间'
+  })
+  createdAt!: Date;
+
+  @UpdateDateColumn({ 
+    name: 'updated_at',
+    type: 'timestamp',
+    comment: '更新时间'
+  })
+  updatedAt!: Date;
+
   @Column({ 
-    name: 'create_time', 
+    name: 'created_by', 
     type: 'int',
+    unsigned: true,
     nullable: true,
-    comment: '创建时间'
+    comment: '创建用户ID'
   })
-  createTime!: number | null;
+  createdBy!: number | null;
 
   @Column({ 
-    name: 'update_time', 
+    name: 'updated_by', 
     type: 'int',
-    default: 0,
-    comment: '更新时间'
+    unsigned: true,
+    nullable: true,
+    comment: '更新用户ID'
   })
-  updateTime!: number;
+  updatedBy!: number | null;
 
   @Column({ 
     name: 'status', 

+ 14 - 6
src/server/modules/advertisements/advertisement.schema.ts

@@ -46,13 +46,21 @@ export const AdvertisementSchema = z.object({
     description: '排序值',
     example: 10
   }),
-  createTime: z.number().int().positive().nullable().openapi({
-    description: '创建时间(时间戳)',
-    example: 1700000000
+  createdAt: z.coerce.date().openapi({
+    description: '创建时间',
+    example: '2024-01-01T00:00:00Z'
   }),
-  updateTime: z.number().int().nonnegative().default(0).openapi({
-    description: '更新时间(时间戳)',
-    example: 1700000000
+  updatedAt: z.coerce.date().openapi({
+    description: '更新时间',
+    example: '2024-01-01T00:00:00Z'
+  }),
+  createdBy: z.number().int().positive().nullable().openapi({
+    description: '创建用户ID',
+    example: 1
+  }),
+  updatedBy: z.number().int().positive().nullable().openapi({
+    description: '更新用户ID',
+    example: 1
   }),
   status: z.number().int().min(0).max(1).default(0).openapi({
     description: '状态 0禁用 1启用',