feat(PROJ-9): implement labels backend - DB schema, labelstore, API handlers, Xapian integration

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
sysops
2026-03-18 08:32:30 +01:00
parent bd09992441
commit 5a6289c83d
8 changed files with 995 additions and 2 deletions
@@ -0,0 +1,32 @@
-- PROJ-9: Labels, email-label assignments, and auto-label rules.
-- This file is documentation; the actual schema is applied by labelstore.initSchema().
CREATE TABLE IF NOT EXISTS labels (
id BIGSERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
color VARCHAR(7) NOT NULL DEFAULT '#6366f1',
owner_id BIGINT REFERENCES users(id) ON DELETE CASCADE,
tenant_id BIGINT REFERENCES tenants(id) ON DELETE CASCADE,
created_at TIMESTAMPTZ DEFAULT NOW(),
UNIQUE(name, owner_id, tenant_id)
);
CREATE TABLE IF NOT EXISTS email_labels (
email_id VARCHAR(64) NOT NULL,
label_id BIGINT NOT NULL REFERENCES labels(id) ON DELETE CASCADE,
assigned_at TIMESTAMPTZ DEFAULT NOW(),
assigned_by VARCHAR(20) NOT NULL DEFAULT 'user',
PRIMARY KEY (email_id, label_id)
);
CREATE TABLE IF NOT EXISTS label_rules (
id BIGSERIAL PRIMARY KEY,
condition_field VARCHAR(30) NOT NULL,
condition_value VARCHAR(255) NOT NULL,
label_id BIGINT NOT NULL REFERENCES labels(id) ON DELETE CASCADE,
tenant_id BIGINT REFERENCES tenants(id) ON DELETE CASCADE,
created_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_email_labels_label_id ON email_labels(label_id);
CREATE INDEX IF NOT EXISTS idx_label_rules_tenant_id ON label_rules(tenant_id);