fix(tester): extend ListProblems endpoint
This commit is contained in:
parent
81d7aa2366
commit
700cdecfc5
7 changed files with 75 additions and 3 deletions
|
@ -16,3 +16,12 @@ type Problem struct {
|
||||||
CreatedAt time.Time `db:"created_at"`
|
CreatedAt time.Time `db:"created_at"`
|
||||||
UpdatedAt time.Time `db:"updated_at"`
|
UpdatedAt time.Time `db:"updated_at"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ProblemListItem struct {
|
||||||
|
Id int32 `db:"id"`
|
||||||
|
Title string `db:"title"`
|
||||||
|
MemoryLimit int32 `db:"memory_limit"`
|
||||||
|
TimeLimit int32 `db:"time_limit"`
|
||||||
|
CreatedAt time.Time `db:"created_at"`
|
||||||
|
UpdatedAt time.Time `db:"updated_at"`
|
||||||
|
}
|
||||||
|
|
|
@ -14,7 +14,7 @@ type Handlers interface {
|
||||||
AddParticipant(c *fiber.Ctx, id int32, params testerv1.AddParticipantParams) error
|
AddParticipant(c *fiber.Ctx, id int32, params testerv1.AddParticipantParams) error
|
||||||
DeleteTask(c *fiber.Ctx, id int32, params testerv1.DeleteTaskParams) error
|
DeleteTask(c *fiber.Ctx, id int32, params testerv1.DeleteTaskParams) error
|
||||||
AddTask(c *fiber.Ctx, id int32, params testerv1.AddTaskParams) error
|
AddTask(c *fiber.Ctx, id int32, params testerv1.AddTaskParams) error
|
||||||
ListProblems(c *fiber.Ctx) error
|
ListProblems(c *fiber.Ctx, params testerv1.ListProblemsParams) error
|
||||||
CreateProblem(c *fiber.Ctx) error
|
CreateProblem(c *fiber.Ctx) error
|
||||||
DeleteProblem(c *fiber.Ctx, id int32) error
|
DeleteProblem(c *fiber.Ctx, id int32) error
|
||||||
GetProblem(c *fiber.Ctx, id int32) error
|
GetProblem(c *fiber.Ctx, id int32) error
|
||||||
|
|
|
@ -23,8 +23,35 @@ func (h *TesterHandlers) ListContests(c *fiber.Ctx) error {
|
||||||
return c.SendStatus(fiber.StatusNotImplemented)
|
return c.SendStatus(fiber.StatusNotImplemented)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *TesterHandlers) ListProblems(c *fiber.Ctx) error {
|
func (h *TesterHandlers) ListProblems(c *fiber.Ctx, params testerv1.ListProblemsParams) error {
|
||||||
return c.SendStatus(fiber.StatusNotImplemented)
|
problems, count, err := h.problemsUC.ListProblems(c.Context(), params.Page, params.PageSize)
|
||||||
|
if err != nil {
|
||||||
|
return c.SendStatus(pkg.ToREST(err))
|
||||||
|
}
|
||||||
|
|
||||||
|
resp := testerv1.ListProblemsResponse{
|
||||||
|
Problems: make([]testerv1.ProblemListItem, len(problems)),
|
||||||
|
Page: params.Page,
|
||||||
|
MaxPage: func() int32 {
|
||||||
|
if count%params.PageSize == 0 {
|
||||||
|
return count / params.PageSize
|
||||||
|
}
|
||||||
|
return count/params.PageSize + 1
|
||||||
|
}(),
|
||||||
|
}
|
||||||
|
|
||||||
|
for i, problem := range problems {
|
||||||
|
resp.Problems[i] = testerv1.ProblemListItem{
|
||||||
|
Id: problem.Id,
|
||||||
|
Title: problem.Title,
|
||||||
|
MemoryLimit: problem.MemoryLimit,
|
||||||
|
TimeLimit: problem.TimeLimit,
|
||||||
|
CreatedAt: problem.CreatedAt,
|
||||||
|
UpdatedAt: problem.UpdatedAt,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return c.JSON(resp)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *TesterHandlers) CreateContest(c *fiber.Ctx) error {
|
func (h *TesterHandlers) CreateContest(c *fiber.Ctx) error {
|
||||||
|
|
|
@ -9,6 +9,7 @@ type ProblemPostgresRepository interface {
|
||||||
CreateProblem(ctx context.Context, title string) (int32, error)
|
CreateProblem(ctx context.Context, title string) (int32, error)
|
||||||
ReadProblemById(ctx context.Context, id int32) (*models.Problem, error)
|
ReadProblemById(ctx context.Context, id int32) (*models.Problem, error)
|
||||||
DeleteProblem(ctx context.Context, id int32) error
|
DeleteProblem(ctx context.Context, id int32) error
|
||||||
|
ListProblems(ctx context.Context, page int32, pageSize int32) ([]*models.ProblemListItem, int32, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
type ContestRepository interface {
|
type ContestRepository interface {
|
||||||
|
|
|
@ -67,3 +67,33 @@ func (r *ProblemRepository) DeleteProblem(ctx context.Context, id int32) error {
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
ListProblemsQuery = `SELECT id, title, time_limit, memory_limit, created_at, updated_at
|
||||||
|
FROM problems
|
||||||
|
LIMIT ? OFFSET ?`
|
||||||
|
CountProblemsQuery = "SELECT COUNT(*) FROM problems"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (r *ProblemRepository) ListProblems(ctx context.Context, page int32, pageSize int32) ([]*models.ProblemListItem, int32, error) {
|
||||||
|
const op = "ContestRepository.ListProblems"
|
||||||
|
|
||||||
|
if pageSize > 20 || pageSize < 1 {
|
||||||
|
pageSize = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
var problems []*models.ProblemListItem
|
||||||
|
query := r.db.Rebind(ListProblemsQuery)
|
||||||
|
err := r.db.SelectContext(ctx, &problems, query, pageSize, (page-1)*pageSize)
|
||||||
|
if err != nil {
|
||||||
|
return nil, 0, handlePgErr(err, op)
|
||||||
|
}
|
||||||
|
|
||||||
|
var count int32
|
||||||
|
err = r.db.GetContext(ctx, &count, CountProblemsQuery)
|
||||||
|
if err != nil {
|
||||||
|
return nil, 0, handlePgErr(err, op)
|
||||||
|
}
|
||||||
|
|
||||||
|
return problems, count, nil
|
||||||
|
}
|
||||||
|
|
|
@ -9,6 +9,7 @@ type ProblemUseCase interface {
|
||||||
CreateProblem(ctx context.Context, title string) (int32, error)
|
CreateProblem(ctx context.Context, title string) (int32, error)
|
||||||
ReadProblemById(ctx context.Context, id int32) (*models.Problem, error)
|
ReadProblemById(ctx context.Context, id int32) (*models.Problem, error)
|
||||||
DeleteProblem(ctx context.Context, id int32) error
|
DeleteProblem(ctx context.Context, id int32) error
|
||||||
|
ListProblems(ctx context.Context, page int32, pageSize int32) ([]*models.ProblemListItem, int32, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
type ContestUseCase interface {
|
type ContestUseCase interface {
|
||||||
|
|
|
@ -32,3 +32,7 @@ func (u *ProblemUseCase) ReadProblemById(ctx context.Context, id int32) (*models
|
||||||
func (u *ProblemUseCase) DeleteProblem(ctx context.Context, id int32) error {
|
func (u *ProblemUseCase) DeleteProblem(ctx context.Context, id int32) error {
|
||||||
return u.problemRepo.DeleteProblem(ctx, id)
|
return u.problemRepo.DeleteProblem(ctx, id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (u *ProblemUseCase) ListProblems(ctx context.Context, page int32, pageSize int32) ([]*models.ProblemListItem, int32, error) {
|
||||||
|
return u.problemRepo.ListProblems(ctx, page, pageSize)
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue