27 lines
1.3 KiB
SQL
27 lines
1.3 KiB
SQL
-- +goose Up
|
|
CREATE TABLE
|
|
IF NOT EXISTS user_agreements (
|
|
id SERIAL PRIMARY KEY,
|
|
-- user_id NULL-able: при удалении аккаунта FK-ограничение обнуляет
|
|
-- ссылку (ON DELETE SET NULL), а сама запись об акцепте остаётся в
|
|
-- обезличенном виде (факт согласия, ст. 9 ч. 4 152-ФЗ — бремя
|
|
-- доказывания на операторе). Персональные данные внутри записи
|
|
-- (ip, user_agent) обнуляет users_repo.DeleteUser.
|
|
user_id INTEGER,
|
|
agreement_type VARCHAR(50) NOT NULL,
|
|
version VARCHAR(50) NOT NULL,
|
|
accepted_at TIMESTAMP NOT NULL DEFAULT NOW (),
|
|
ip VARCHAR(45),
|
|
user_agent TEXT,
|
|
|
|
CONSTRAINT fk_user_agreements_user FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE SET NULL,
|
|
CONSTRAINT uq_user_agreement UNIQUE (user_id, agreement_type, version),
|
|
CONSTRAINT chk_user_agreement_type CHECK (agreement_type IN ('terms', 'privacy'))
|
|
);
|
|
|
|
-- Отдельный индекс по user_id не нужен: UNIQUE (user_id, agreement_type, version)
|
|
-- уже покрывает выборки по префиксу user_id.
|
|
|
|
-- +goose Down
|
|
DROP TABLE IF EXISTS user_agreements;
|