woj-server/internal/api/status/query.go

81 lines
2.1 KiB
Go
Raw Permalink Normal View History

package status
import (
2023-07-14 21:47:11 +08:00
"git.0x7f.app/WOJ/woj-server/internal/e"
"git.0x7f.app/WOJ/woj-server/internal/model"
"github.com/gin-gonic/gin"
)
type queryRequest struct {
Pid uint `form:"pid" json:"pid"`
Uid uint `form:"uid" json:"uid"`
Offset int `form:"offset" json:"offset"`
Limit int `form:"limit" json:"limit" binding:"required"`
}
2023-12-23 15:36:42 +08:00
type submissionWithScore struct {
Submission model.Submission `json:"submission"`
Point int32 `json:"point"`
}
// Query
// @Summary query status via problem id or user id
// @Description Batch query judgement status based on either the question or user.
2023-12-18 21:21:15 +08:00
// @Tags status
// @Accept application/x-www-form-urlencoded
// @Produce json
// @Param pid formData uint false "problem id"
// @Param uid formData uint false "user id"
// @Param offset formData int false "start position"
// @Param limit formData int true "limit number of records"
2023-12-23 15:36:42 +08:00
// @Response 200 {object} e.Response[e.WithCount[submissionWithScore]] "status"
// @Security Authentication
// @Router /v1/status/query [post]
func (h *handler) Query(c *gin.Context) {
claim, exist := c.Get("claim")
if !exist {
e.Pong[any](c, e.UserUnauthenticated, nil)
return
}
2023-07-16 16:27:12 +08:00
req := new(queryRequest)
if err := c.ShouldBind(req); err != nil {
e.Pong(c, e.InvalidParameter, err.Error())
return
}
uid := claim.(*model.Claim).UID
role := claim.(*model.Claim).Role
2023-12-23 15:37:24 +08:00
if req.Pid == 0 && req.Uid == 0 {
req.Uid = uid
}
2023-12-23 15:36:42 +08:00
var count int64
submissions, status := h.submissionService.Query(req.Pid, req.Uid, req.Offset, req.Limit, &count)
var response []*submissionWithScore
for _, submission := range submissions {
cur, _ := h.statusService.Query(submission.ID, false)
point := int32(-1)
if cur != nil {
point = cur.Point
}
2023-12-23 15:36:42 +08:00
resp := &submissionWithScore{
Submission: *submission,
Point: point,
}
if role < model.RoleAdmin || uid != submission.UserID {
// strip out code
resp.Submission.Code = ""
}
response = append(response, resp)
}
2023-12-23 15:36:42 +08:00
e.Pong(c, status, e.WithCount[*submissionWithScore]{Count: count, Data: response})
}