35 lines
1.7 KiB
SQL
35 lines
1.7 KiB
SQL
|
|
-- +goose Up
|
||
|
|
-- Фаза 4 (по запросу): друзья, личные беседы, присутствие и часовой пояс.
|
||
|
|
|
||
|
|
CREATE TABLE relationships (
|
||
|
|
user_id INTEGER NOT NULL REFERENCES users (id) ON DELETE CASCADE,
|
||
|
|
target_id INTEGER NOT NULL REFERENCES users (id) ON DELETE CASCADE,
|
||
|
|
-- friend | outgoing (заявка отправлена) | incoming (заявка получена) | blocked
|
||
|
|
type TEXT NOT NULL,
|
||
|
|
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
|
||
|
|
updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
|
||
|
|
PRIMARY KEY (user_id, target_id)
|
||
|
|
);
|
||
|
|
CREATE INDEX relationships_type_idx ON relationships (user_id, type);
|
||
|
|
CREATE INDEX relationships_target_idx ON relationships (target_id, type);
|
||
|
|
|
||
|
|
-- Участники личной беседы: канал типа dm без сервера (AGENT.md 7.8).
|
||
|
|
CREATE TABLE dm_participants (
|
||
|
|
channel_id INTEGER NOT NULL REFERENCES channels (id) ON DELETE CASCADE,
|
||
|
|
user_id INTEGER NOT NULL REFERENCES users (id) ON DELETE CASCADE,
|
||
|
|
joined_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
|
||
|
|
PRIMARY KEY (channel_id, user_id)
|
||
|
|
);
|
||
|
|
CREATE INDEX dm_participants_user_idx ON dm_participants (user_id);
|
||
|
|
|
||
|
|
-- Присутствие: когда пользователя видели в последний раз и его часовой пояс
|
||
|
|
-- для показа времени друзьям.
|
||
|
|
ALTER TABLE users ADD COLUMN last_seen_at TEXT;
|
||
|
|
ALTER TABLE users ADD COLUMN timezone TEXT NOT NULL DEFAULT 'Europe/Moscow';
|
||
|
|
|
||
|
|
-- +goose Down
|
||
|
|
ALTER TABLE users DROP COLUMN timezone;
|
||
|
|
ALTER TABLE users DROP COLUMN last_seen_at;
|
||
|
|
DROP TABLE dm_participants;
|
||
|
|
DROP TABLE relationships;
|