fix(guilds): фон комнаты в READY и без дублей категорий в шаблонах

- ReadyChannel отдаёт background_file_id: после перезагрузки фон комнаты больше
  не теряется до REST-запроса (AGENT.md 7.5)
- шаблон больше не создаёт категории дважды: они перечислены в шаблоне и
  раньше создавались ещё и по ссылке из комнаты
- тест: структура «Сообщества» ровно 7 комнат без повторов
This commit is contained in:
2026-09-21 18:16:18 +03:00
parent b43452aa04
commit afcdf9c1c4
4 changed files with 62 additions and 18 deletions
+23 -18
View File
@@ -150,26 +150,31 @@ func (s *Server) applyGuildTemplate(ctx context.Context, guild *store.Guild, tem
}
}
// Категории создаются до комнат: комнаты ссылаются на них через parent_id.
// Категории создаём первыми: комнаты ссылаются на них через parent_id.
// В шаблоне категория перечислена отдельной записью, поэтому повторно её
// не создаём — только запоминаем идентификатор.
categories := map[string]uint64{}
position := 0
for _, channel := range template.Channels {
parentID := uint64(0)
if channel.Category != "" {
id, ok := categories[channel.Category]
if !ok {
created, err := s.store.CreateChannel(ctx, store.CreateChannelParams{
GuildID: &guild.ID, Type: store.ChannelCategory,
Name: channel.Category, Position: position,
})
if err != nil {
return humaError(err)
}
categories[channel.Category] = created.ID
position++
id = created.ID
}
parentID = id
if channel.Type != store.ChannelCategory {
continue
}
if _, exists := categories[channel.Name]; exists {
continue
}
created, err := s.store.CreateChannel(ctx, store.CreateChannelParams{
GuildID: &guild.ID, Type: store.ChannelCategory,
Name: channel.Name, Position: position,
})
if err != nil {
return humaError(err)
}
categories[channel.Name] = created.ID
position++
}
for _, channel := range template.Channels {
if channel.Type == store.ChannelCategory {
continue
}
params := store.CreateChannelParams{
GuildID: &guild.ID,
@@ -177,7 +182,7 @@ func (s *Server) applyGuildTemplate(ctx context.Context, guild *store.Guild, tem
Name: channel.Name,
Position: position,
}
if parentID != 0 && channel.Type != store.ChannelCategory {
if parentID, ok := categories[channel.Category]; ok {
params.ParentID = &parentID
}
if _, err := s.store.CreateChannel(ctx, params); err != nil {