diff options
| author | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-07-18 07:52:02 +0000 |
|---|---|---|
| committer | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-07-18 07:52:02 +0000 |
| commit | 48a2255bfc45ffcfb0b39ffefdd57cbacf8b36df (patch) | |
| tree | 0c88b7c126138233875e8d372a4e999e49c38a62 /db/schema/notification.ts | |
| parent | 2ef02e27dbe639876fa3b90c30307dda183545ec (diff) | |
(대표님) 파일관리변경, 클라IP추적, 실시간알림, 미들웨어변경, 알림API
Diffstat (limited to 'db/schema/notification.ts')
| -rw-r--r-- | db/schema/notification.ts | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/db/schema/notification.ts b/db/schema/notification.ts new file mode 100644 index 00000000..8b745ac2 --- /dev/null +++ b/db/schema/notification.ts @@ -0,0 +1,65 @@ +// db/schema/notifications.ts +import { + pgTable, + uuid, + varchar, + text, + boolean, + timestamp, + index + } from 'drizzle-orm/pg-core'; + import { users } from './users'; // 기존 users 테이블 + import { relations } from 'drizzle-orm'; + + export const notifications = pgTable('notifications', { + id: uuid('id').primaryKey().defaultRandom(), + userId: varchar('user_id', { length: 255 }).notNull(), + title: varchar('title', { length: 255 }).notNull(), + message: text('message').notNull(), + type: varchar('type', { length: 50 }).notNull(), // 'assignment', 'update', 'reminder' 등 + relatedRecordId: varchar('related_record_id', { length: 255 }), + relatedRecordType: varchar('related_record_type', { length: 100 }), // 'project', 'task', 'order' 등 + isRead: boolean('is_read').default(false).notNull(), + createdAt: timestamp('created_at').defaultNow().notNull(), + readAt: timestamp('read_at'), + }, (table) => ({ + userIdIdx: index('idx_notifications_user_id').on(table.userId), + createdAtIdx: index('idx_notifications_created_at').on(table.createdAt.desc()), + isReadIdx: index('idx_notifications_is_read').on(table.isRead), + userReadIdx: index('idx_notifications_user_read').on(table.userId, table.isRead), + })); + + // 관계 정의 + export const notificationsRelations = relations(notifications, ({ one }) => ({ + user: one(users, { + fields: [notifications.userId], + references: [users.id], + }), + })); + + // 타입 정의 + export type Notification = typeof notifications.$inferSelect; + export type NewNotification = typeof notifications.$inferInsert; + + // 알림 타입 enum + export const NotificationType = { + ASSIGNMENT: 'assignment', + UPDATE: 'update', + REMINDER: 'reminder', + APPROVAL: 'approval', + DEADLINE: 'deadline', + STATUS_CHANGE: 'status_change' + } as const; + + export type NotificationTypeValue = typeof NotificationType[keyof typeof NotificationType]; + + // 관련 레코드 타입 enum + export const RelatedRecordType = { + PROJECT: 'project', + TASK: 'task', + ORDER: 'order', + DOCUMENT: 'document', + USER: 'user' + } as const; + + export type RelatedRecordTypeValue = typeof RelatedRecordType[keyof typeof RelatedRecordType];
\ No newline at end of file |
