diff --git a/app/http/endpoints/api/transcripts/list.go b/app/http/endpoints/api/transcripts/list.go index c680677..258344d 100644 --- a/app/http/endpoints/api/transcripts/list.go +++ b/app/http/endpoints/api/transcripts/list.go @@ -11,10 +11,11 @@ import ( const pageLimit = 15 type transcript struct { - TicketId int `json:"ticket_id"` - Username string `json:"username"` - CloseReason *string `json:"close_reason"` - Rating *uint8 `json:"rating"` + TicketId int `json:"ticket_id"` + Username string `json:"username"` + CloseReason *string `json:"close_reason"` + Rating *uint8 `json:"rating"` + HasTranscript bool `json:"has_transcript"` } func ListTranscripts(ctx *gin.Context) { @@ -90,8 +91,9 @@ func ListTranscripts(ctx *gin.Context) { transcripts := make([]transcript, len(tickets)) for i, ticket := range tickets { transcript := transcript{ - TicketId: ticket.Id, - Username: usernames[ticket.UserId], + TicketId: ticket.Id, + Username: usernames[ticket.UserId], + HasTranscript: ticket.HasTranscript, } if v, ok := ratings[ticket.Id]; ok { diff --git a/app/http/endpoints/api/transcripts/listself.go b/app/http/endpoints/api/transcripts/listself.go new file mode 100644 index 0000000..2796abd --- /dev/null +++ b/app/http/endpoints/api/transcripts/listself.go @@ -0,0 +1,82 @@ +package api + +import ( + "context" + 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" + 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, ok := cache.Instance.GetGuild(ticket.GuildId, false) + if ok { + guildName = guild.Name + } else { + guildName = "Unknown server" + } + } + + 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) +} diff --git a/frontend/src/views/Transcripts.svelte b/frontend/src/views/Transcripts.svelte index 370729d..e39be4d 100644 --- a/frontend/src/views/Transcripts.svelte +++ b/frontend/src/views/Transcripts.svelte @@ -71,7 +71,7 @@ {/if}