feat: Replace Meetings with Calendar - events with types and assigned users
- Rename meetings table to events with type field (meeting/event) - Add eventUsers junction table for user assignments - Members see only events they're assigned to - Calendar endpoint returns events + todos for month - Add migration SQL for database changes 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
21
src/db/migrations/0001_meetings_to_events.sql
Normal file
21
src/db/migrations/0001_meetings_to_events.sql
Normal file
@@ -0,0 +1,21 @@
|
||||
-- Migration: Convert meetings to events with type and assigned users
|
||||
-- Run this migration manually or via drizzle-kit
|
||||
|
||||
-- Step 1: Rename meetings table to events
|
||||
ALTER TABLE meetings RENAME TO events;
|
||||
|
||||
-- Step 2: Add type column
|
||||
ALTER TABLE events ADD COLUMN type TEXT NOT NULL DEFAULT 'meeting';
|
||||
|
||||
-- Step 3: Create event_users junction table
|
||||
CREATE TABLE event_users (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
event_id UUID NOT NULL REFERENCES events(id) ON DELETE CASCADE,
|
||||
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
assigned_at TIMESTAMP DEFAULT NOW() NOT NULL,
|
||||
UNIQUE(event_id, user_id)
|
||||
);
|
||||
|
||||
-- Step 4: Assign existing events to their creators
|
||||
INSERT INTO event_users (event_id, user_id)
|
||||
SELECT id, created_by FROM events WHERE created_by IS NOT NULL;
|
||||
@@ -242,11 +242,12 @@ export const timesheets = pgTable('timesheets', {
|
||||
updatedAt: timestamp('updated_at').defaultNow().notNull(),
|
||||
});
|
||||
|
||||
// Meetings table - meetingy/stretnutia (iba admin môže CRUD)
|
||||
export const meetings = pgTable('meetings', {
|
||||
// Events table - udalosti v kalendári (meeting/event)
|
||||
export const events = pgTable('events', {
|
||||
id: uuid('id').primaryKey().defaultRandom(),
|
||||
title: text('title').notNull(),
|
||||
description: text('description'),
|
||||
type: text('type').notNull().default('meeting'), // 'meeting' | 'event'
|
||||
start: timestamp('start', { withTimezone: true }).notNull(),
|
||||
end: timestamp('end', { withTimezone: true }).notNull(),
|
||||
createdBy: uuid('created_by').references(() => users.id, { onDelete: 'set null' }),
|
||||
@@ -254,6 +255,16 @@ export const meetings = pgTable('meetings', {
|
||||
updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
|
||||
});
|
||||
|
||||
// Event Users - many-to-many medzi events a users (kto vidí udalosť)
|
||||
export const eventUsers = pgTable('event_users', {
|
||||
id: uuid('id').primaryKey().defaultRandom(),
|
||||
eventId: uuid('event_id').references(() => events.id, { onDelete: 'cascade' }).notNull(),
|
||||
userId: uuid('user_id').references(() => users.id, { onDelete: 'cascade' }).notNull(),
|
||||
assignedAt: timestamp('assigned_at').defaultNow().notNull(),
|
||||
}, (table) => ({
|
||||
eventUserUnique: unique('event_user_unique').on(table.eventId, table.userId),
|
||||
}));
|
||||
|
||||
// Time Entries table - sledovanie odpracovaného času používateľov
|
||||
export const timeEntries = pgTable('time_entries', {
|
||||
id: uuid('id').primaryKey().defaultRandom(),
|
||||
|
||||
Reference in New Issue
Block a user