122 lines
3.3 KiB
Go
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(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(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(p.PanelId)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if shouldMention {
|
|
mentions = append(mentions, "user")
|
|
}
|
|
|
|
// get role mentions
|
|
roles, err := dbclient.Client.PanelRoleMentions.GetRoles(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(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)
|
|
}
|