chore: consolidate full database schema into single init_schema.sql
This commit is contained in:
@@ -1,106 +0,0 @@
|
||||
-- member_center: API 呼叫方白名單表
|
||||
-- 位置: public schema
|
||||
|
||||
BEGIN;
|
||||
|
||||
CREATE EXTENSION IF NOT EXISTS pgcrypto;
|
||||
|
||||
DO $$
|
||||
BEGIN
|
||||
IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'client_status') THEN
|
||||
CREATE TYPE client_status AS ENUM ('active', 'inactive');
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS api_clients (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
client_key TEXT NOT NULL UNIQUE,
|
||||
name TEXT NOT NULL,
|
||||
status client_status NOT NULL DEFAULT 'active',
|
||||
|
||||
-- 只存 hash,不存明文 key
|
||||
api_key_hash TEXT NOT NULL,
|
||||
|
||||
-- 可先留空,之後再嚴格化
|
||||
allowed_origins JSONB NOT NULL DEFAULT '[]'::jsonb,
|
||||
allowed_ips JSONB NOT NULL DEFAULT '[]'::jsonb,
|
||||
allowed_paths JSONB NOT NULL DEFAULT '[]'::jsonb,
|
||||
|
||||
rate_limit_per_min INTEGER,
|
||||
expires_at TIMESTAMPTZ,
|
||||
last_used_at TIMESTAMPTZ,
|
||||
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_api_clients_status ON api_clients(status);
|
||||
CREATE INDEX IF NOT EXISTS idx_api_clients_expires_at ON api_clients(expires_at);
|
||||
|
||||
CREATE OR REPLACE FUNCTION set_updated_at_api_clients()
|
||||
RETURNS TRIGGER AS $$
|
||||
BEGIN
|
||||
NEW.updated_at = NOW();
|
||||
RETURN NEW;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
DO $$
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM pg_trigger WHERE tgname = 'trg_api_clients_set_updated_at'
|
||||
) THEN
|
||||
CREATE TRIGGER trg_api_clients_set_updated_at
|
||||
BEFORE UPDATE ON api_clients
|
||||
FOR EACH ROW EXECUTE FUNCTION set_updated_at_api_clients();
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
-- 建議初始化 2~3 個 client(api_key_hash 先放占位,後續再更新)
|
||||
INSERT INTO api_clients (
|
||||
client_key,
|
||||
name,
|
||||
status,
|
||||
api_key_hash,
|
||||
allowed_origins,
|
||||
allowed_ips,
|
||||
allowed_paths,
|
||||
rate_limit_per_min
|
||||
)
|
||||
VALUES
|
||||
(
|
||||
'mkt-backend',
|
||||
'MKT Backend Service',
|
||||
'active',
|
||||
'REPLACE_WITH_BCRYPT_OR_ARGON2_HASH',
|
||||
'[]'::jsonb,
|
||||
'[]'::jsonb,
|
||||
'["/internal/users/upsert-by-sub", "/internal/permissions"]'::jsonb,
|
||||
600
|
||||
),
|
||||
(
|
||||
'admin-frontend',
|
||||
'Admin Frontend',
|
||||
'active',
|
||||
'REPLACE_WITH_BCRYPT_OR_ARGON2_HASH',
|
||||
'["https://admin.ose.tw", "https://member.ose.tw"]'::jsonb,
|
||||
'[]'::jsonb,
|
||||
'["/admin"]'::jsonb,
|
||||
300
|
||||
),
|
||||
(
|
||||
'ops-local',
|
||||
'Ops Local Tooling',
|
||||
'inactive',
|
||||
'REPLACE_WITH_BCRYPT_OR_ARGON2_HASH',
|
||||
'[]'::jsonb,
|
||||
'["127.0.0.1"]'::jsonb,
|
||||
'["/internal", "/admin"]'::jsonb,
|
||||
120
|
||||
)
|
||||
ON CONFLICT (client_key) DO NOTHING;
|
||||
|
||||
COMMIT;
|
||||
|
||||
-- 快速檢查
|
||||
-- SELECT client_key, status, expires_at, created_at FROM api_clients ORDER BY client_key;
|
||||
@@ -23,8 +23,8 @@
|
||||
- 前端任務進度與驗收條件
|
||||
- `docs/TASKPLAN_BACKEND.md`
|
||||
- 後端任務進度與驗收條件
|
||||
- `docs/API_CLIENTS_SQL.sql`
|
||||
- `api_clients` 白名單表與初始資料 SQL
|
||||
- `backend/scripts/init_schema.sql`
|
||||
- 一次建立完整 schema(含 `api_clients`)
|
||||
- `docs/DB_SCHEMA_SNAPSHOT.md`
|
||||
- 目前資料庫 schema 快照(欄位/索引/約束)
|
||||
|
||||
|
||||
@@ -10,9 +10,9 @@ cp .env.example .env
|
||||
```
|
||||
|
||||
## 2. 建立資料表
|
||||
1. 先執行 `member.ose.tw/docs/API_CLIENTS_SQL.sql`
|
||||
2. 再執行 `member.ose.tw/backend/scripts/init_schema.sql`
|
||||
3. 若是舊資料庫,補跑 `member.ose.tw/backend/scripts/migrate_add_authentik_user_id.sql`
|
||||
1. 先執行 `member.ose.tw/backend/scripts/init_schema.sql`(已含 `api_clients`)
|
||||
2. 若是舊資料庫,補跑 `member.ose.tw/backend/scripts/migrate_align_company_site_member_system.sql`
|
||||
3. 若是更舊資料庫,再補 `member.ose.tw/backend/scripts/migrate_add_authentik_user_id.sql`
|
||||
|
||||
## 3. 啟動服務
|
||||
```bash
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
- `docs/ORG_MEMBER_MANAGEMENT_PLAN.md`(公司組織/會員管理規劃)
|
||||
|
||||
## SQL 與配置
|
||||
- `docs/API_CLIENTS_SQL.sql`
|
||||
- `backend/scripts/init_schema.sql`
|
||||
- `docs/DB_SCHEMA_SNAPSHOT.md`
|
||||
|
||||
## 給前端 AI 的一句話交接
|
||||
|
||||
Reference in New Issue
Block a user