package status import ( "git.0x7f.app/WOJ/woj-server/internal/e" "git.0x7f.app/WOJ/woj-server/internal/model" "git.0x7f.app/WOJ/woj-server/pkg/utils" "github.com/gin-gonic/gin" ) type queryRequest struct { Pid uint `form:"pid"` Uid uint `form:"uid"` Offset int `form:"offset"` Limit int `form:"limit" binding:"required"` } type queryResponse 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. // @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" // @Response 200 {object} e.Response[[]queryResponse] "queryResponse" // @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 } req := new(queryRequest) if err := c.ShouldBind(req); err != nil { e.Pong(c, e.InvalidParameter, err.Error()) return } if req.Pid == 0 && req.Uid == 0 { e.Pong[any](c, e.InvalidParameter, nil) return } submissions, status := h.submissionService.Query(req.Pid, req.Uid, req.Offset, req.Limit) uid := claim.(*model.Claim).UID role := claim.(*model.Claim).Role var response []*queryResponse for _, submission := range submissions { cur, _ := h.statusService.Query(submission.ID, false) point := utils.If(cur == nil, -1, cur.Point) resp := &queryResponse{ Submission: *submission, Point: point, } if role < model.RoleAdmin || uid != submission.UserID { // strip out code resp.Submission.Code = "" } response = append(response, resp) } e.Pong(c, status, response) }