feat(cosmetics): оформление профиля — галерея, роли и личные стили
- миграция 00013: guild_cosmetics (рамки и иконки) и user_styles («для друзей» и пер-серверные стили) (AGENT.md 7.2, 7.4) - store: CRUD галереи, личные стили и вычисление оформления поэлементно (роль → пер-серверный стиль → «для друзей» → дефолт) с откатом, когда роль больше не выдаёт элемент - API: галерея сервера под MANAGE_ROLES, оформление роли в create/update, GET/PUT/DELETE /users/@me/styles с доступными элементами по областям - клиент: редактор личного стиля с предпросмотром, галерея оформления в настройках сервера, оформление роли в разделе «Роли» - рендер: рамка под аватаром, иконка рядом с ником, цвет и встроенные эффекты ника (CSS, при reduced-motion статично) в ленте и списке участников
This commit is contained in:
@@ -0,0 +1,32 @@
|
||||
-- +goose Up
|
||||
-- Галерея оформления сервера (AGENT.md 7.4): рамки аватара и иконки рядом с
|
||||
-- ником. Файлы лежат обычными загрузками, поэтому анимация сохраняется.
|
||||
CREATE TABLE guild_cosmetics (
|
||||
id INTEGER PRIMARY KEY,
|
||||
guild_id INTEGER NOT NULL REFERENCES guilds (id) ON DELETE CASCADE,
|
||||
kind TEXT NOT NULL,
|
||||
name TEXT NOT NULL,
|
||||
file_id INTEGER NOT NULL REFERENCES files (id) ON DELETE CASCADE,
|
||||
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
|
||||
);
|
||||
CREATE INDEX guild_cosmetics_guild_idx ON guild_cosmetics (guild_id, kind, id);
|
||||
|
||||
-- Личные стили профиля: guild_id IS NULL — стиль «для друзей» (DM, друзья,
|
||||
-- глобальные места), иначе переопределение для конкретного сервера (7.2).
|
||||
CREATE TABLE user_styles (
|
||||
id INTEGER PRIMARY KEY,
|
||||
user_id INTEGER NOT NULL REFERENCES users (id) ON DELETE CASCADE,
|
||||
guild_id INTEGER REFERENCES guilds (id) ON DELETE CASCADE,
|
||||
frame_id INTEGER REFERENCES guild_cosmetics (id) ON DELETE SET NULL,
|
||||
badge_id INTEGER REFERENCES guild_cosmetics (id) ON DELETE SET NULL,
|
||||
nick_color INTEGER,
|
||||
nick_effect TEXT,
|
||||
updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
|
||||
);
|
||||
CREATE UNIQUE INDEX user_styles_scope_idx ON user_styles (user_id, IFNULL(guild_id, 0));
|
||||
|
||||
-- +goose Down
|
||||
DROP INDEX user_styles_scope_idx;
|
||||
DROP TABLE user_styles;
|
||||
DROP INDEX guild_cosmetics_guild_idx;
|
||||
DROP TABLE guild_cosmetics;
|
||||
Reference in New Issue
Block a user