87 lines
1.8 KiB
Go

package api
import (
"context"
"errors"
dbclient "github.com/TicketsBot/GoPanel/database"
"github.com/TicketsBot/GoPanel/rpc/cache"
"github.com/TicketsBot/GoPanel/utils"
"github.com/TicketsBot/database"
"github.com/gin-gonic/gin"
cache2 "github.com/rxdn/gdl/cache"
gdlutils "github.com/rxdn/gdl/utils"
"golang.org/x/sync/errgroup"
"strconv"
)
// ListSelfTranscripts TODO: Give user option to rate ticket
func ListSelfTranscripts(ctx *gin.Context) {
userId := ctx.Keys["userid"].(uint64)
page, err := strconv.Atoi(ctx.Query("page"))
if err != nil {
ctx.JSON(400, utils.ErrorJson(err))
return
}
var offset int
if page > 1 {
offset = pageLimit * (page - 1)
}
opts := database.TicketQueryOptions{
UserIds: []uint64{userId},
Open: gdlutils.BoolPtr(false),
Order: database.OrderTypeDescending,
Limit: pageLimit,
Offset: offset,
}
tickets, err := dbclient.Client.Tickets.GetByOptions(opts)
if err != nil {
ctx.JSON(500, utils.ErrorJson(err))
return
}
type TranscriptData struct {
TicketId int `json:"ticket_id"`
GuildId uint64 `json:"guild_id"`
GuildName string `json:"guild_name"`
}
// TODO: Not O(n)
data := make([]TranscriptData, len(tickets))
group, _ := errgroup.WithContext(context.Background())
for i, ticket := range tickets {
group.Go(func() error {
var guildName string
{
guild, err := cache.Instance.GetGuild(context.Background(), ticket.GuildId)
if err == nil {
guildName = guild.Name
} else if errors.Is(err, cache2.ErrNotFound) {
guildName = "Unknown server"
} else {
return err
}
}
data[i] = TranscriptData{
TicketId: ticket.Id,
GuildId: ticket.GuildId,
GuildName: guildName,
}
return nil
})
}
if err := group.Wait(); err != nil {
ctx.JSON(500, utils.ErrorJson(err))
return
}
ctx.JSON(200, data)
}