feat(calendar): add ics_subscriptions table and calendar_events columns (migrations v10-v11)

This commit is contained in:
Ulas Kalayci
2026-04-20 23:32:42 +02:00
parent 8479072afd
commit a64635b669
5 changed files with 216 additions and 2 deletions
+39
View File
@@ -192,6 +192,45 @@ const MIGRATIONS_SQL = {
CREATE INDEX IF NOT EXISTS idx_reminders_remind ON reminders(remind_at);
CREATE INDEX IF NOT EXISTS idx_reminders_user ON reminders(created_by);
`,
10: `
CREATE TABLE IF NOT EXISTS ics_subscriptions (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
url TEXT NOT NULL,
color TEXT NOT NULL DEFAULT '#6366f1',
shared INTEGER NOT NULL DEFAULT 0,
created_by INTEGER REFERENCES users(id) ON DELETE SET NULL,
etag TEXT,
last_modified TEXT,
last_sync TEXT,
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ', 'now'))
);
`,
11: `
CREATE TABLE calendar_events (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
description TEXT,
start_datetime TEXT NOT NULL,
end_datetime TEXT,
all_day INTEGER NOT NULL DEFAULT 0,
location TEXT,
color TEXT NOT NULL DEFAULT '#007AFF',
assigned_to INTEGER REFERENCES users(id) ON DELETE SET NULL,
created_by INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
external_calendar_id TEXT,
external_source TEXT NOT NULL DEFAULT 'local'
CHECK(external_source IN ('local', 'google', 'apple', 'ics')),
recurrence_rule TEXT,
subscription_id INTEGER REFERENCES ics_subscriptions(id) ON DELETE CASCADE,
user_modified INTEGER NOT NULL DEFAULT 0,
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ', 'now'))
);
CREATE UNIQUE INDEX idx_calendar_sub_extid
ON calendar_events (subscription_id, external_calendar_id)
WHERE subscription_id IS NOT NULL;
`,
};
export { MIGRATIONS_SQL };
+70
View File
@@ -405,6 +405,76 @@ const MIGRATIONS = [
END;
`,
},
{
version: 10,
description: 'ICS-Abonnements Tabelle',
up: `
CREATE TABLE IF NOT EXISTS ics_subscriptions (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
url TEXT NOT NULL,
color TEXT NOT NULL DEFAULT '#6366f1',
shared INTEGER NOT NULL DEFAULT 0,
created_by INTEGER REFERENCES users(id) ON DELETE SET NULL,
etag TEXT,
last_modified TEXT,
last_sync TEXT,
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ', 'now'))
);
`,
},
{
version: 11,
description: 'calendar_events: external_source ICS, subscription_id, user_modified',
up: `
CREATE TABLE calendar_events_new (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
description TEXT,
start_datetime TEXT NOT NULL,
end_datetime TEXT,
all_day INTEGER NOT NULL DEFAULT 0,
location TEXT,
color TEXT NOT NULL DEFAULT '#007AFF',
assigned_to INTEGER REFERENCES users(id) ON DELETE SET NULL,
created_by INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
external_calendar_id TEXT,
external_source TEXT NOT NULL DEFAULT 'local'
CHECK(external_source IN ('local', 'google', 'apple', 'ics')),
recurrence_rule TEXT,
subscription_id INTEGER REFERENCES ics_subscriptions(id) ON DELETE CASCADE,
user_modified INTEGER NOT NULL DEFAULT 0,
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ', 'now'))
);
INSERT INTO calendar_events_new
(id, title, description, start_datetime, end_datetime, all_day, location, color,
assigned_to, created_by, external_calendar_id, external_source, recurrence_rule,
subscription_id, user_modified, created_at, updated_at)
SELECT id, title, description, start_datetime, end_datetime, all_day, location, color,
assigned_to, created_by, external_calendar_id, external_source, recurrence_rule,
NULL, 0, created_at, updated_at
FROM calendar_events;
DROP TRIGGER IF EXISTS trg_calendar_events_updated_at;
DROP TABLE calendar_events;
ALTER TABLE calendar_events_new RENAME TO calendar_events;
CREATE TRIGGER trg_calendar_events_updated_at
AFTER UPDATE ON calendar_events FOR EACH ROW
BEGIN UPDATE calendar_events SET updated_at = strftime('%Y-%m-%dT%H:%M:%SZ', 'now') WHERE id = OLD.id; END;
CREATE INDEX IF NOT EXISTS idx_calendar_start ON calendar_events(start_datetime);
CREATE INDEX IF NOT EXISTS idx_calendar_assigned ON calendar_events(assigned_to);
CREATE INDEX IF NOT EXISTS idx_calendar_external_id ON calendar_events(external_calendar_id);
CREATE INDEX IF NOT EXISTS idx_calendar_sub ON calendar_events(subscription_id);
CREATE UNIQUE INDEX idx_calendar_sub_extid
ON calendar_events (subscription_id, external_calendar_id)
WHERE subscription_id IS NOT NULL;
`,
},
];
/**