Clean public release with: - Go/Gin/PostgreSQL/Redis architecture - Multi-tenant support - JWT authentication - Docker Compose deployment - Environment-based configuration
38 lines
1.3 KiB
SQL
38 lines
1.3 KiB
SQL
-- Initial schema: tenants + users
|
|
CREATE TABLE IF NOT EXISTS tenants (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
name VARCHAR(128) NOT NULL,
|
|
slug VARCHAR(64) NOT NULL UNIQUE,
|
|
status INT NOT NULL DEFAULT 1,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
deleted_at TIMESTAMPTZ
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_tenants_deleted_at ON tenants(deleted_at);
|
|
|
|
CREATE TABLE IF NOT EXISTS users (
|
|
id BIGSERIAL,
|
|
tenant_id UUID NOT NULL,
|
|
username VARCHAR(64) NOT NULL,
|
|
email VARCHAR(128) NOT NULL,
|
|
password VARCHAR(256) NOT NULL,
|
|
nickname VARCHAR(64) NOT NULL DEFAULT '',
|
|
avatar VARCHAR(512) NOT NULL DEFAULT '',
|
|
status INT NOT NULL DEFAULT 1,
|
|
last_login TIMESTAMPTZ,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
deleted_at TIMESTAMPTZ,
|
|
PRIMARY KEY (id, tenant_id)
|
|
);
|
|
|
|
CREATE UNIQUE INDEX IF NOT EXISTS idx_users_username ON users(username);
|
|
CREATE UNIQUE INDEX IF NOT EXISTS idx_tenant_email ON users(tenant_id, email);
|
|
CREATE INDEX IF NOT EXISTS idx_users_deleted_at ON users(deleted_at);
|
|
|
|
-- Seed: default tenant
|
|
INSERT INTO tenants (id, name, slug, status)
|
|
VALUES ('00000000-0000-0000-0000-000000000001', 'Default Tenant', 'default', 1)
|
|
ON CONFLICT (id) DO NOTHING;
|