feat(guilds): оформление сервера — иконка, баннер, splash и акцентный цвет
Фаза 4 (AGENT.md 7.4): сервер можно оформить, поля в схеме были с Фазы 1, но
ручек и отдачи в API не было.
- `POST/DELETE /guilds/{id}/appearance/{icon|banner|splash}` (multipart,
MANAGE_GUILD, только изображения до 8 МБ): файл сохраняется назначением
`guild_icon|guild_banner|guild_splash`, предыдущий удаляется, пишется аудит
и уходит `GUILD_UPDATE`; ответ — обновлённый сервер;
- `PATCH /guilds/{id}` принимает `accent_color` (0 — цвет темы);
- оформление отдаётся в READY, в списке серверов, в детальной карточке и в
предпросмотре приглашения — клиенту не нужен отдельный запрос;
- анимированные GIF/APNG/WebP сохраняются как есть: изображения не
перекодируются, поэтому анимация не теряется;
- тесты: загрузка и очистка всех трёх видов, замена файла, запрет без
MANAGE_GUILD и без сессии, отказ для не-изображения, акцентный цвет.
This commit is contained in:
@@ -176,7 +176,9 @@ func (s *Server) deleteStoredFile(ctx context.Context, fileID uint64) {
|
||||
return
|
||||
}
|
||||
if file.StoragePath != "" {
|
||||
if err := os.Remove(file.StoragePath); err != nil && !os.IsNotExist(err) {
|
||||
// Путь собран из идентификатора файла и каталога данных (saveUpload),
|
||||
// имя от клиента в него не попадает (AGENT.md 9.2).
|
||||
if err := os.Remove(file.StoragePath); err != nil && !os.IsNotExist(err) { //nolint:gosec // путь формирует сам инстанс
|
||||
s.logger.WarnContext(ctx, "failed to remove file from disk",
|
||||
slog.String("file_id", formatSnowflake(fileID)), slog.Any("error", err))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user