check / check (push) Waiting to run
The main database, each webhook's event database and each archive file get their schema from SQL files under internal/db/migrations/, one directory per kind. Opening a file runs, in one transaction, each file that schema_migrations does not list. GORM stays for queries. AutoMigrate is gone, tests included. An event database holds only its own tables now, so the sweep that removed target rows copied into it is deleted. The association guard stays: without it a delivery write fails on the missing targets table. AutoMigrate also had GORM parse every model before a handle was shared. That is now done on its own: GORM races when two goroutines first use models that refer to each other. Model: opus-5-5
90 lines
2.3 KiB
SQL
90 lines
2.3 KiB
SQL
-- Migration 001: the main database's schema. The models in
|
|
-- internal/database must agree with it.
|
|
|
|
CREATE TABLE settings (
|
|
"key" text,
|
|
value text NOT NULL,
|
|
PRIMARY KEY ("key")
|
|
);
|
|
|
|
CREATE TABLE users (
|
|
id uuid,
|
|
created_at datetime,
|
|
updated_at datetime,
|
|
deleted_at datetime,
|
|
username text NOT NULL,
|
|
password text NOT NULL,
|
|
PRIMARY KEY (id),
|
|
CONSTRAINT chk_users_username
|
|
CHECK (length(CAST(username AS BLOB)) <= 1024)
|
|
);
|
|
|
|
CREATE INDEX idx_users_deleted_at ON users (deleted_at);
|
|
CREATE UNIQUE INDEX idx_users_username ON users (username);
|
|
|
|
CREATE TABLE api_keys (
|
|
id uuid,
|
|
created_at datetime,
|
|
updated_at datetime,
|
|
deleted_at datetime,
|
|
user_id uuid NOT NULL,
|
|
"key" text NOT NULL,
|
|
description text,
|
|
last_used_at datetime,
|
|
PRIMARY KEY (id),
|
|
CONSTRAINT fk_users_api_keys FOREIGN KEY (user_id) REFERENCES users (id)
|
|
);
|
|
|
|
CREATE INDEX idx_api_keys_deleted_at ON api_keys (deleted_at);
|
|
CREATE UNIQUE INDEX idx_api_keys_key ON api_keys ("key");
|
|
|
|
CREATE TABLE webhooks (
|
|
id uuid,
|
|
created_at datetime,
|
|
updated_at datetime,
|
|
deleted_at datetime,
|
|
user_id uuid NOT NULL,
|
|
name text NOT NULL,
|
|
description text,
|
|
retention_days integer DEFAULT 30,
|
|
PRIMARY KEY (id),
|
|
CONSTRAINT fk_users_webhooks FOREIGN KEY (user_id) REFERENCES users (id)
|
|
);
|
|
|
|
CREATE INDEX idx_webhooks_deleted_at ON webhooks (deleted_at);
|
|
|
|
CREATE TABLE entrypoints (
|
|
id uuid,
|
|
created_at datetime,
|
|
updated_at datetime,
|
|
deleted_at datetime,
|
|
webhook_id uuid NOT NULL,
|
|
path text NOT NULL,
|
|
description text,
|
|
active numeric DEFAULT true,
|
|
PRIMARY KEY (id),
|
|
CONSTRAINT fk_webhooks_entrypoints
|
|
FOREIGN KEY (webhook_id) REFERENCES webhooks (id)
|
|
);
|
|
|
|
CREATE INDEX idx_entrypoints_deleted_at ON entrypoints (deleted_at);
|
|
CREATE UNIQUE INDEX idx_entrypoints_path ON entrypoints (path);
|
|
|
|
CREATE TABLE targets (
|
|
id uuid,
|
|
created_at datetime,
|
|
updated_at datetime,
|
|
deleted_at datetime,
|
|
webhook_id uuid NOT NULL,
|
|
name text NOT NULL,
|
|
type text NOT NULL,
|
|
active numeric DEFAULT true,
|
|
config text,
|
|
max_retries integer,
|
|
PRIMARY KEY (id),
|
|
CONSTRAINT fk_webhooks_targets
|
|
FOREIGN KEY (webhook_id) REFERENCES webhooks (id)
|
|
);
|
|
|
|
CREATE INDEX idx_targets_deleted_at ON targets (deleted_at);
|