summaryrefslogtreecommitdiff
path: root/db/schema/notification.ts
diff options
context:
space:
mode:
authordujinkim <dujin.kim@dtsolution.co.kr>2025-07-18 07:52:02 +0000
committerdujinkim <dujin.kim@dtsolution.co.kr>2025-07-18 07:52:02 +0000
commit48a2255bfc45ffcfb0b39ffefdd57cbacf8b36df (patch)
tree0c88b7c126138233875e8d372a4e999e49c38a62 /db/schema/notification.ts
parent2ef02e27dbe639876fa3b90c30307dda183545ec (diff)
(대표님) 파일관리변경, 클라IP추적, 실시간알림, 미들웨어변경, 알림API
Diffstat (limited to 'db/schema/notification.ts')
-rw-r--r--db/schema/notification.ts65
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