v1.0.11-rc1

This commit is contained in:
michael committed 2026-10-02 08:50:10 +02:00
1 parent d5952d82bb
commit e1456ed4ca
8 files changed
+1315 -501

No files matched your search

+103 -3
View File
@@ -206,6 +206,7 @@ export async function migrate() {
await query("ALTER TABLE tickets ADD COLUMN IF NOT EXISTS zammad_state_id BIGINT;");
await query("UPDATE tickets SET zammad_state_id = 2 WHERE zammad_state_id = 1;");
await query("ALTER TABLE tickets ADD COLUMN IF NOT EXISTS zammad_owner_id BIGINT;");
await query("ALTER TABLE tickets ADD COLUMN IF NOT EXISTS user_id BIGINT REFERENCES users(id) ON DELETE SET NULL;");
await query("ALTER TABLE tickets ADD COLUMN IF NOT EXISTS zammad_merged_from_ticket_id BIGINT;");
await query("ALTER TABLE tickets ADD COLUMN IF NOT EXISTS zammad_merged_from_ticket_number TEXT;");
await query("ALTER TABLE tickets ADD COLUMN IF NOT EXISTS zammad_preferences JSONB NOT NULL DEFAULT '{}'::jsonb;");
@@ -225,6 +226,55 @@ export async function migrate() {
END IF;
END $$;
`);
await query(`
WITH unique_zammad_users AS (
SELECT zammad_user_id, MIN(id) AS user_id
FROM users
WHERE role = 'user'
AND active
AND zammad_user_id IS NOT NULL
GROUP BY zammad_user_id
HAVING COUNT(*) = 1
),
zammad_ticket_owners AS (
SELECT t.id, uzu.user_id
FROM tickets t
LEFT JOIN unique_zammad_users uzu ON uzu.zammad_user_id = t.zammad_owner_id
WHERE t.zammad_owner_id IS NOT NULL
)
UPDATE tickets t
SET user_id = zto.user_id
FROM zammad_ticket_owners zto
WHERE t.id = zto.id
AND t.user_id IS DISTINCT FROM zto.user_id;
`);
await query(`
UPDATE tickets t
SET user_id = owner.user_id
FROM (
SELECT ticket_id, MIN(user_id) AS user_id
FROM projects
GROUP BY ticket_id
) owner
WHERE t.user_id IS NULL
AND t.zammad_owner_id IS NULL
AND t.id = owner.ticket_id;
`);
await query(`
UPDATE tickets t
SET user_id = owner.user_id
FROM (
SELECT ticket_id, MIN(user_id) AS user_id
FROM sessions
WHERE user_id IS NOT NULL
GROUP BY ticket_id
) owner
WHERE t.user_id IS NULL
AND t.zammad_owner_id IS NULL
AND t.id = owner.ticket_id;
`);
await query("CREATE INDEX IF NOT EXISTS idx_tickets_user ON tickets(user_id);");
await query("CREATE INDEX IF NOT EXISTS idx_tickets_zammad_owner ON tickets(zammad_owner_id);");
await query(`
CREATE TABLE IF NOT EXISTS sessions (
@@ -708,6 +758,43 @@ export async function migrate() {
await query("ALTER TABLE projects ADD COLUMN IF NOT EXISTS closed_at TIMESTAMPTZ;");
await query("ALTER TABLE projects ADD COLUMN IF NOT EXISTS close_review_required BOOLEAN NOT NULL DEFAULT false;");
await query("ALTER TABLE projects ADD COLUMN IF NOT EXISTS manual_consumption_minutes INTEGER NOT NULL DEFAULT 0;");
await query("ALTER TABLE projects ADD COLUMN IF NOT EXISTS zammad_owner_id BIGINT;");
await query("ALTER TABLE projects ALTER COLUMN user_id DROP NOT NULL;");
await query(`
UPDATE projects p
SET zammad_owner_id = t.zammad_owner_id
FROM tickets t
WHERE p.ticket_id = t.id
AND p.zammad_owner_id IS NULL
AND t.zammad_owner_id IS NOT NULL;
`);
await query(`
UPDATE projects p
SET user_id = t.user_id,
zammad_owner_id = t.zammad_owner_id
FROM tickets t
WHERE p.ticket_id = t.id
AND t.zammad_owner_id IS NOT NULL
AND (
p.user_id IS DISTINCT FROM t.user_id
OR p.zammad_owner_id IS DISTINCT FROM t.zammad_owner_id
)
AND NOT EXISTS (
SELECT 1
FROM projects existing
WHERE existing.ticket_id = p.ticket_id
AND existing.id <> p.id
AND (
(t.user_id IS NOT NULL AND existing.user_id = t.user_id)
OR (
t.user_id IS NULL
AND existing.user_id IS NULL
AND existing.zammad_owner_id IS NOT DISTINCT FROM t.zammad_owner_id
)
)
);
`);
await query("CREATE UNIQUE INDEX IF NOT EXISTS idx_projects_zammad_owner_ticket ON projects(zammad_owner_id, ticket_id) WHERE user_id IS NULL AND zammad_owner_id IS NOT NULL;");
await query(`
DO $$
BEGIN
@@ -799,13 +886,26 @@ export async function migrate() {
`);
await query(`
INSERT INTO projects (user_id, ticket_id, teamspace_project, description, goals)
SELECT DISTINCT s.user_id, s.ticket_id, COALESCE(t.title, ''), '', ''
INSERT INTO projects (user_id, zammad_owner_id, ticket_id, teamspace_project, description, goals)
SELECT DISTINCT
CASE
WHEN t.zammad_owner_id IS NOT NULL THEN zammad_owner_user.id
ELSE s.user_id
END,
t.zammad_owner_id,
s.ticket_id,
COALESCE(t.title, ''),
'',
''
FROM sessions s
JOIN tickets t ON t.id = s.ticket_id
LEFT JOIN users zammad_owner_user
ON zammad_owner_user.role = 'user'
AND zammad_owner_user.active
AND zammad_owner_user.zammad_user_id = t.zammad_owner_id
WHERE s.work_type = 'consulting'
AND s.user_id IS NOT NULL
ON CONFLICT (user_id, ticket_id) DO NOTHING;
ON CONFLICT DO NOTHING;
`);
await query(`