2024-07-20 23:37:50 +01:00

122 lines
3.3 KiB
Go

package api
import (
"context"
dbclient "github.com/TicketsBot/GoPanel/database"
"github.com/TicketsBot/GoPanel/utils"
"github.com/TicketsBot/GoPanel/utils/types"
"github.com/TicketsBot/database"
"github.com/gin-gonic/gin"
"golang.org/x/sync/errgroup"
"strconv"
)
func ListPanels(ctx *gin.Context) {
type panelResponse struct {
database.Panel
WelcomeMessage *types.CustomEmbed `json:"welcome_message"`
UseCustomEmoji bool `json:"use_custom_emoji"`
Emoji types.Emoji `json:"emote"`
Mentions []string `json:"mentions"`
Teams []int `json:"teams"`
UseServerDefaultNamingScheme bool `json:"use_server_default_naming_scheme"`
AccessControlList []database.PanelAccessControlRule `json:"access_control_list"`
}
guildId := ctx.Keys["guildid"].(uint64)
panels, err := dbclient.Client.Panel.GetByGuildWithWelcomeMessage(ctx, guildId)
if err != nil {
ctx.JSON(500, utils.ErrorJson(err))
return
}
accessControlLists, err := dbclient.Client.PanelAccessControlRules.GetAllForGuild(ctx, guildId)
if err != nil {
ctx.JSON(500, utils.ErrorJson(err))
return
}
allFields, err := dbclient.Client.EmbedFields.GetAllFieldsForPanels(ctx, guildId)
if err != nil {
ctx.JSON(500, utils.ErrorJson(err))
return
}
wrapped := make([]panelResponse, len(panels))
// we will need to lookup role mentions
group, _ := errgroup.WithContext(context.Background())
for i, p := range panels {
i := i
p := p
group.Go(func() error {
var mentions []string
// get if we should mention the ticket opener
shouldMention, err := dbclient.Client.PanelUserMention.ShouldMentionUser(ctx, p.PanelId)
if err != nil {
return err
}
if shouldMention {
mentions = append(mentions, "user")
}
// get role mentions
roles, err := dbclient.Client.PanelRoleMentions.GetRoles(ctx, p.PanelId)
if err != nil {
return err
}
// convert to strings
for _, roleId := range roles {
mentions = append(mentions, strconv.FormatUint(roleId, 10))
}
teamIds, err := dbclient.Client.PanelTeams.GetTeamIds(ctx, p.PanelId)
if err != nil {
return err
}
// Don't serve null
if teamIds == nil {
teamIds = make([]int, 0)
}
var welcomeMessage *types.CustomEmbed
if p.WelcomeMessage != nil {
fields := allFields[p.WelcomeMessage.Id]
welcomeMessage = types.NewCustomEmbed(p.WelcomeMessage, fields)
}
accessControlList := accessControlLists[p.PanelId]
if accessControlList == nil {
accessControlList = make([]database.PanelAccessControlRule, 0)
}
wrapped[i] = panelResponse{
Panel: p.Panel,
WelcomeMessage: welcomeMessage,
UseCustomEmoji: p.EmojiId != nil,
Emoji: types.NewEmoji(p.EmojiName, p.EmojiId),
Mentions: mentions,
Teams: teamIds,
UseServerDefaultNamingScheme: p.NamingScheme == nil,
AccessControlList: accessControlList,
}
return nil
})
}
if err := group.Wait(); err != nil {
ctx.JSON(500, utils.ErrorJson(err))
return
}
ctx.JSON(200, wrapped)
}