35 lines
1.5 KiB
PL/PgSQL
35 lines
1.5 KiB
PL/PgSQL
CREATE TABLE user_verifications (
|
||
id BIGINT PRIMARY KEY,
|
||
user_id BIGINT NOT NULL REFERENCES users(id),
|
||
role VARCHAR(20) NOT NULL,
|
||
status VARCHAR(20) NOT NULL DEFAULT 'pending',
|
||
materials JSONB NOT NULL,
|
||
reject_reason TEXT,
|
||
reviewed_by BIGINT,
|
||
reviewed_at TIMESTAMPTZ,
|
||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||
|
||
CONSTRAINT chk_verification_status CHECK (status IN ('pending', 'approved', 'rejected')),
|
||
UNIQUE(user_id, role) -- 每个角色只有一条最新的认证记录
|
||
);
|
||
|
||
-- Note:Auto update verification_status of users table
|
||
CREATE OR REPLACE FUNCTION sync_user_verification_status()
|
||
RETURNS TRIGGER AS $$
|
||
DECLARE
|
||
status_json JSONB;
|
||
BEGIN
|
||
SELECT jsonb_object_agg(role, status)
|
||
INTO status_json
|
||
FROM user_verifications
|
||
WHERE user_id = NEW.user_id;
|
||
|
||
UPDATE users SET verification_status = status_json WHERE id = NEW.user_id;
|
||
RETURN NEW;
|
||
END;
|
||
$$ LANGUAGE plpgsql;
|
||
|
||
CREATE TRIGGER trigger_sync_verifications
|
||
AFTER INSERT OR UPDATE ON user_verifications
|
||
FOR EACH ROW EXECUTE FUNCTION sync_user_verification_status(); |