feat(store,permissions): схема Фазы 1, доступ к данным и движок прав
- миграция 00002: users, sessions, totp_secrets, webauthn_credentials, security_events, guilds, guild_members, roles, member_roles, channels, channel_overrides, audit_log + дефолтные instance_settings (AGENT.md 6.1) - internal/store: Snowflake-идентификаторы, CRUD пользователей и сессий (ротация, step-up, logout-all), TOTP и события безопасности, серверы, участники, роли, комнаты и оверрайды, настройки инстанса и аудит - internal/permissions: 37 прав битмаской, вычисление по правилам §6.2 (баз role @user → оверрайды ролей → оверрайд пользователя → ADMINISTRATOR), иерархия ролей и участников, тайм-ауты, обход для инстанс-админа, LRU-кэш с инвалидацией - internal/source: адаптер permissions.Source поверх store - тесты: 18 unit-тестов прав + интеграционный набор на реальной SQLite (приватная комната, модератор, владелец, инстанс-админ, тайм-аут) - golangci: обоснованное исключение gosec для пакета store (конверсии Snowflake и сборка SQL из константных шаблонов)
This commit is contained in:
@@ -0,0 +1,29 @@
|
||||
package store
|
||||
|
||||
import "fmt"
|
||||
|
||||
// SQL-шаблоны, которые собираются из заранее известных фрагментов
|
||||
// (имена колонок заданы в коде, значения всегда идут параметрами).
|
||||
// Конкатенация через fmt.Sprintf здесь безопасна и проверяется тестами.
|
||||
|
||||
const updateGuildTemplate = `UPDATE guilds SET %s WHERE id = ?`
|
||||
|
||||
const selectGuildsForUserTemplate = `SELECT %s
|
||||
FROM guilds g JOIN guild_members m ON m.guild_id = g.id
|
||||
WHERE m.user_id = ? ORDER BY g.id`
|
||||
|
||||
const updateChannelTemplate = `UPDATE channels SET %s WHERE id = ?`
|
||||
|
||||
const updateGuildMemberTemplate = `UPDATE guild_members SET %s WHERE guild_id = ? AND user_id = ?`
|
||||
|
||||
const selectMemberRolesTemplate = `SELECT %s
|
||||
FROM member_roles mr JOIN roles r ON r.id = mr.role_id
|
||||
WHERE mr.guild_id = ? AND mr.user_id = ?
|
||||
ORDER BY r.position DESC, r.id`
|
||||
|
||||
// buildQuery подставляет фрагмент SQL в шаблон.
|
||||
func buildQuery(template string, fragment string) string {
|
||||
return fmt.Sprintf(template, fragment)
|
||||
}
|
||||
|
||||
const updateRoleTemplate = `UPDATE roles SET %s WHERE id = ?`
|
||||
Reference in New Issue
Block a user