feat: Group chat and push notifications

- Add group chat tables (chat_groups, chat_group_members, group_messages)
- Add push subscriptions table for web push notifications
- Add group service, controller, routes
- Add push service, controller, routes
- Integrate push notifications with todos, messages, group messages

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
richardtekula
2026-01-20 07:27:13 +01:00
parent 73a3c6bf95
commit d9f16ad0a6
15 changed files with 1233 additions and 4 deletions

View File

@@ -337,3 +337,43 @@ export const messages = pgTable('messages', {
createdAt: timestamp('created_at').defaultNow().notNull(),
updatedAt: timestamp('updated_at').defaultNow().notNull(),
});
// Chat Groups table - skupinové chaty
export const chatGroups = pgTable('chat_groups', {
id: uuid('id').primaryKey().defaultRandom(),
name: text('name').notNull(),
createdById: uuid('created_by_id').references(() => users.id, { onDelete: 'set null' }),
createdAt: timestamp('created_at').defaultNow().notNull(),
updatedAt: timestamp('updated_at').defaultNow().notNull(),
});
// Chat Group Members - členovia skupiny
export const chatGroupMembers = pgTable('chat_group_members', {
id: uuid('id').primaryKey().defaultRandom(),
groupId: uuid('group_id').references(() => chatGroups.id, { onDelete: 'cascade' }).notNull(),
userId: uuid('user_id').references(() => users.id, { onDelete: 'cascade' }).notNull(),
joinedAt: timestamp('joined_at').defaultNow().notNull(),
}, (table) => ({
uniqueMember: unique('chat_group_member_unique').on(table.groupId, table.userId),
}));
// Group Messages - správy v skupinách
export const groupMessages = pgTable('group_messages', {
id: uuid('id').primaryKey().defaultRandom(),
groupId: uuid('group_id').references(() => chatGroups.id, { onDelete: 'cascade' }).notNull(),
senderId: uuid('sender_id').references(() => users.id, { onDelete: 'set null' }),
content: text('content').notNull(),
createdAt: timestamp('created_at').defaultNow().notNull(),
});
// Push Subscriptions - web push notifikácie
export const pushSubscriptions = pgTable('push_subscriptions', {
id: uuid('id').primaryKey().defaultRandom(),
userId: uuid('user_id').references(() => users.id, { onDelete: 'cascade' }).notNull(),
endpoint: text('endpoint').notNull(),
p256dh: text('p256dh').notNull(),
auth: text('auth').notNull(),
createdAt: timestamp('created_at').defaultNow().notNull(),
}, (table) => ({
uniqueEndpoint: unique('push_subscription_endpoint_unique').on(table.userId, table.endpoint),
}));