feat: enhanced paging support
This commit is contained in:
parent
17123e6911
commit
b45963f9b5
@ -14,7 +14,7 @@ type queryRequest struct {
|
||||
Limit int `form:"limit" json:"limit" binding:"required"`
|
||||
}
|
||||
|
||||
type queryResponse struct {
|
||||
type submissionWithScore struct {
|
||||
Submission model.Submission `json:"submission"`
|
||||
Point int32 `json:"point"`
|
||||
}
|
||||
@ -29,7 +29,8 @@ type queryResponse struct {
|
||||
// @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"
|
||||
// @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")
|
||||
@ -55,10 +56,14 @@ func (h *handler) Query(c *gin.Context) {
|
||||
role := claim.(*model.Claim).Role
|
||||
var response []*queryResponse
|
||||
|
||||
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 := utils.If(cur == nil, -1, cur.Point)
|
||||
resp := &queryResponse{
|
||||
resp := &submissionWithScore{
|
||||
Submission: *submission,
|
||||
Point: point,
|
||||
}
|
||||
@ -71,5 +76,5 @@ func (h *handler) Query(c *gin.Context) {
|
||||
response = append(response, resp)
|
||||
}
|
||||
|
||||
e.Pong(c, status, response)
|
||||
e.Pong(c, status, e.WithCount[*submissionWithScore]{Count: count, Data: response})
|
||||
}
|
||||
|
@ -21,7 +21,7 @@ type queryByVersionRequest struct {
|
||||
// @Param pvid formData uint true "problem version"
|
||||
// @Param offset formData int false "start position"
|
||||
// @Param limit formData int true "max number of results"
|
||||
// @Response 200 {object} e.Response[[]model.Status] "submission status array"
|
||||
// @Response 200 {object} e.Response[e.WithCount[model.Status]] "submission status array"
|
||||
// @Security Authentication
|
||||
// @Router /v1/status/query/version [post]
|
||||
func (h *handler) QueryByProblemVersion(c *gin.Context) {
|
||||
@ -44,6 +44,7 @@ func (h *handler) QueryByProblemVersion(c *gin.Context) {
|
||||
return
|
||||
}
|
||||
|
||||
submitStatus, status := h.statusService.QueryByVersion(req.ProblemVersionID, req.Offset, req.Limit)
|
||||
e.Pong(c, status, submitStatus)
|
||||
var count int64
|
||||
submitStatus, status := h.statusService.QueryByVersion(req.ProblemVersionID, req.Offset, req.Limit, &count)
|
||||
e.Pong(c, status, e.WithCount[*model.Status]{Count: count, Data: submitStatus})
|
||||
}
|
||||
|
@ -12,6 +12,11 @@ type Response[T any] struct {
|
||||
Body T `json:"body"`
|
||||
}
|
||||
|
||||
type WithCount[T any] struct {
|
||||
Count int64 `json:"count"`
|
||||
Data []T `json:"data"`
|
||||
}
|
||||
|
||||
func wrap[T any](status Status, body T) Response[interface{}] {
|
||||
return Response[interface{}]{
|
||||
Code: int(status),
|
||||
|
@ -36,8 +36,8 @@ func (s *service) Query(sid uint, associations bool) (*model.Status, e.Status) {
|
||||
return status, e.Success
|
||||
}
|
||||
|
||||
func (s *service) QueryByVersion(pvid uint, offset int, limit int) ([]*model.Status, e.Status) {
|
||||
var statuses []*model.Status
|
||||
func (s *service) QueryByVersion(pvid uint, offset int, limit int, count *int64) ([]*model.Status, e.Status) {
|
||||
var ret []*model.Status
|
||||
status := &model.Status{
|
||||
ProblemVersionID: pvid,
|
||||
IsEnabled: true,
|
||||
@ -45,12 +45,13 @@ func (s *service) QueryByVersion(pvid uint, offset int, limit int) ([]*model.Sta
|
||||
|
||||
err := s.db.Get().Preload(clause.Associations).
|
||||
Where(status).
|
||||
Limit(limit).
|
||||
Offset(offset).
|
||||
Find(&statuses).Error
|
||||
Order("created_at DESC").
|
||||
Offset(offset).Limit(limit).Find(&ret).
|
||||
Offset(-1).Limit(-1).Count(count).
|
||||
Error
|
||||
if err != nil {
|
||||
s.log.Warn("DatabaseError", zap.Error(err), zap.Any("status", status))
|
||||
return nil, e.DatabaseError
|
||||
}
|
||||
return statuses, e.Success
|
||||
return ret, e.Success
|
||||
}
|
||||
|
@ -14,7 +14,7 @@ var _ Service = (*service)(nil)
|
||||
type Service interface {
|
||||
Create(data *CreateData) (*model.Status, e.Status)
|
||||
Query(sid uint, associations bool) (*model.Status, e.Status)
|
||||
QueryByVersion(pvid uint, offset int, limit int) ([]*model.Status, e.Status)
|
||||
QueryByVersion(pvid uint, offset int, limit int, count *int64) ([]*model.Status, e.Status)
|
||||
|
||||
HealthCheck() error
|
||||
}
|
||||
|
@ -9,7 +9,7 @@ import (
|
||||
"gorm.io/gorm/clause"
|
||||
)
|
||||
|
||||
func (s *service) Query(pid uint, uid uint, offset int, limit int) ([]*model.Submission, e.Status) {
|
||||
func (s *service) Query(pid uint, uid uint, offset int, limit int, count *int64) ([]*model.Submission, e.Status) {
|
||||
submissions := make([]*model.Submission, 0)
|
||||
|
||||
submission := &model.Submission{
|
||||
@ -19,9 +19,10 @@ func (s *service) Query(pid uint, uid uint, offset int, limit int) ([]*model.Sub
|
||||
|
||||
err := s.db.Get().Preload(clause.Associations).
|
||||
Where(submission).
|
||||
Limit(limit).
|
||||
Offset(offset).
|
||||
Find(&submissions).Error
|
||||
Order("created_at DESC").
|
||||
Offset(offset).Limit(limit).Find(&submissions).
|
||||
Offset(-1).Limit(-1).Count(count).
|
||||
Error
|
||||
|
||||
//if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
// return nil, e.ProblemNotFound
|
||||
|
@ -13,7 +13,7 @@ var _ Service = (*service)(nil)
|
||||
|
||||
type Service interface {
|
||||
Create(data *CreateData) (*model.Submission, e.Status)
|
||||
Query(pid uint, uid uint, offset int, limit int) ([]*model.Submission, e.Status)
|
||||
Query(pid uint, uid uint, offset int, limit int, count *int64) ([]*model.Submission, e.Status)
|
||||
QueryBySid(sid uint, associations bool) (*model.Submission, e.Status)
|
||||
|
||||
HealthCheck() error
|
||||
|
Loading…
Reference in New Issue
Block a user