This commit is contained in:
michael committed 2026-09-23 11:09:10 +00:00
1 parent 9be6c6e36a
commit fa6db04370
16 files changed
+1123 -118

No files matched your search

+46 -1
View File
@@ -87,6 +87,15 @@ export async function migrate() {
await query("ALTER TABLE users ADD COLUMN IF NOT EXISTS zammad_api_token TEXT;");
await query("ALTER TABLE users ADD COLUMN IF NOT EXISTS zammad_user_id BIGINT;");
await query("ALTER TABLE users ADD COLUMN IF NOT EXISTS zammad_email_session_webhook_enabled BOOLEAN NOT NULL DEFAULT false;");
await query("ALTER TABLE users ADD COLUMN IF NOT EXISTS session_billing_prompt_enabled BOOLEAN NOT NULL DEFAULT true;");
await query("ALTER TABLE users ADD COLUMN IF NOT EXISTS zammad_session_note_default_enabled BOOLEAN NOT NULL DEFAULT false;");
await query("ALTER TABLE users ADD COLUMN IF NOT EXISTS zammad_time_unit_rounding_enabled BOOLEAN NOT NULL DEFAULT false;");
await query("ALTER TABLE users ADD COLUMN IF NOT EXISTS zammad_time_unit_rounding_minutes INTEGER NOT NULL DEFAULT 15;");
await query(`
ALTER TABLE users
DROP CONSTRAINT IF EXISTS users_zammad_time_unit_rounding_minutes_valid,
ADD CONSTRAINT users_zammad_time_unit_rounding_minutes_valid CHECK (zammad_time_unit_rounding_minutes IN (5, 10, 15, 30));
`);
await query(`
CREATE TABLE IF NOT EXISTS auth_sessions (
@@ -207,7 +216,7 @@ export async function migrate() {
billing_updated_at TIMESTAMPTZ,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
CONSTRAINT work_type_valid CHECK (work_type IN ('support', 'consulting')),
CONSTRAINT billing_status_valid CHECK (billing_status IS NULL OR billing_status IN ('billed', 'non_billable')),
CONSTRAINT billing_status_valid CHECK (billing_status IS NULL OR billing_status IN ('billable', 'billed', 'non_billable')),
CONSTRAINT duration_non_negative CHECK (duration_seconds >= 0),
CONSTRAINT rounded_minutes_positive CHECK (rounded_minutes >= 1),
CONSTRAINT ended_after_started CHECK (ended_at >= started_at)
@@ -221,6 +230,11 @@ export async function migrate() {
await query("ALTER TABLE sessions ADD COLUMN IF NOT EXISTS recurring_occurrence_date DATE;");
await query("ALTER TABLE sessions ADD COLUMN IF NOT EXISTS recurring_occurrence_key TEXT;");
await query("ALTER TABLE sessions ADD COLUMN IF NOT EXISTS project_teamspace_entry_id BIGINT;");
await query(`
ALTER TABLE sessions
DROP CONSTRAINT IF EXISTS billing_status_valid,
ADD CONSTRAINT billing_status_valid CHECK (billing_status IS NULL OR billing_status IN ('billable', 'billed', 'non_billable'));
`);
await query(`
CREATE TABLE IF NOT EXISTS zammad_email_session_events (
id BIGSERIAL PRIMARY KEY,
@@ -242,6 +256,37 @@ export async function migrate() {
ON zammad_email_session_events(delivery_id)
WHERE delivery_id IS NOT NULL;
`);
await query(`
CREATE TABLE IF NOT EXISTS zammad_session_article_queue (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
session_id BIGINT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,
ticket_id BIGINT NOT NULL REFERENCES tickets(id) ON DELETE CASCADE,
ticket_number TEXT NOT NULL,
zammad_ticket_id BIGINT,
activity TEXT NOT NULL,
time_unit NUMERIC(10, 2) NOT NULL,
status TEXT NOT NULL DEFAULT 'pending',
attempt_count INTEGER NOT NULL DEFAULT 0,
last_error TEXT,
last_attempt_at TIMESTAMPTZ,
sent_at TIMESTAMPTZ,
zammad_article_id BIGINT,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
CONSTRAINT zammad_session_article_queue_status_valid CHECK (status IN ('pending', 'sent'))
);
`);
await query(`
CREATE UNIQUE INDEX IF NOT EXISTS idx_zammad_session_article_queue_pending_session
ON zammad_session_article_queue(session_id)
WHERE status = 'pending';
`);
await query(`
CREATE INDEX IF NOT EXISTS idx_zammad_session_article_queue_user_pending
ON zammad_session_article_queue(user_id, created_at)
WHERE status = 'pending';
`);
if (adminId) {
await query("UPDATE sessions SET user_id = $1 WHERE user_id IS NULL;", [adminId]);
}