diff --git a/internal/models/participant.go b/internal/models/participant.go index a5e8fb3..9960ba7 100644 --- a/internal/models/participant.go +++ b/internal/models/participant.go @@ -19,3 +19,7 @@ type ParticipantsListItem struct { CreatedAt time.Time `db:"created_at"` UpdatedAt time.Time `db:"updated_at"` } + +type ParticipantUpdate struct { + Name *string `json:"name"` +} diff --git a/internal/tester/delivery.go b/internal/tester/delivery.go index c2fbb69..f16d4cc 100644 --- a/internal/tester/delivery.go +++ b/internal/tester/delivery.go @@ -21,4 +21,5 @@ type Handlers interface { ListParticipants(c *fiber.Ctx, params testerv1.ListParticipantsParams) error UpdateProblem(c *fiber.Ctx, id int32) error UpdateContest(c *fiber.Ctx, id int32) error + UpdateParticipant(c *fiber.Ctx, params testerv1.UpdateParticipantParams) error } diff --git a/internal/tester/delivery/rest/handlers.go b/internal/tester/delivery/rest/handlers.go index 3c13004..1bbcdbc 100644 --- a/internal/tester/delivery/rest/handlers.go +++ b/internal/tester/delivery/rest/handlers.go @@ -307,3 +307,20 @@ func (h *TesterHandlers) UpdateContest(c *fiber.Ctx, id int32) error { return c.SendStatus(fiber.StatusOK) } + +func (h *TesterHandlers) UpdateParticipant(c *fiber.Ctx, params testerv1.UpdateParticipantParams) error { + var req testerv1.UpdateParticipantRequest + err := c.BodyParser(&req) + if err != nil { + return err + } + + err = h.contestsUC.UpdateParticipant(c.Context(), params.ParticipantId, models.ParticipantUpdate{ + Name: req.Name, + }) + if err != nil { + return c.SendStatus(pkg.ToREST(err)) + } + + return c.SendStatus(fiber.StatusOK) +} diff --git a/internal/tester/pg_repository.go b/internal/tester/pg_repository.go index 77e502f..806185e 100644 --- a/internal/tester/pg_repository.go +++ b/internal/tester/pg_repository.go @@ -43,4 +43,5 @@ type ContestRepository interface { ListContests(ctx context.Context, page int32, pageSize int32) ([]*models.ContestsListItem, int32, error) ListParticipants(ctx context.Context, contestId int32, page int32, pageSize int32) ([]*models.ParticipantsListItem, int32, error) UpdateContest(ctx context.Context, id int32, contestUpdate models.ContestUpdate) error + UpdateParticipant(ctx context.Context, id int32, participantUpdate models.ParticipantUpdate) error } diff --git a/internal/tester/repository/pg_contests_repository.go b/internal/tester/repository/pg_contests_repository.go index 96ba888..be6038b 100644 --- a/internal/tester/repository/pg_contests_repository.go +++ b/internal/tester/repository/pg_contests_repository.go @@ -228,3 +228,19 @@ func (r *ContestRepository) UpdateContest(ctx context.Context, id int32, contest return nil } + +const ( + updateParticipantQuery = "UPDATE participants SET name = COALESCE(?, name) WHERE id = ?" +) + +func (r *ContestRepository) UpdateParticipant(ctx context.Context, id int32, participantUpdate models.ParticipantUpdate) error { + const op = "ContestRepository.UpdateParticipant" + + query := r.db.Rebind(updateParticipantQuery) + _, err := r.db.ExecContext(ctx, query, participantUpdate.Name, id) + if err != nil { + return handlePgErr(err, op) + } + + return nil +} diff --git a/internal/tester/usecase.go b/internal/tester/usecase.go index 3685c70..1c615fe 100644 --- a/internal/tester/usecase.go +++ b/internal/tester/usecase.go @@ -25,4 +25,5 @@ type ContestUseCase interface { ListContests(ctx context.Context, page int32, pageSize int32) ([]*models.ContestsListItem, int32, error) ListParticipants(ctx context.Context, contestId int32, page int32, pageSize int32) ([]*models.ParticipantsListItem, int32, error) UpdateContest(ctx context.Context, id int32, contestUpdate models.ContestUpdate) error + UpdateParticipant(ctx context.Context, id int32, participantUpdate models.ParticipantUpdate) error } diff --git a/internal/tester/usecase/contests_usecase.go b/internal/tester/usecase/contests_usecase.go index b901af7..73afd78 100644 --- a/internal/tester/usecase/contests_usecase.go +++ b/internal/tester/usecase/contests_usecase.go @@ -61,3 +61,7 @@ func (uc *ContestUseCase) ListParticipants(ctx context.Context, contestId int32, func (uc *ContestUseCase) UpdateContest(ctx context.Context, id int32, contestUpdate models.ContestUpdate) error { return uc.contestRepo.UpdateContest(ctx, id, contestUpdate) } + +func (uc *ContestUseCase) UpdateParticipant(ctx context.Context, id int32, participantUpdate models.ParticipantUpdate) error { + return uc.contestRepo.UpdateParticipant(ctx, id, participantUpdate) +} diff --git a/proto b/proto index 9be6a6c..d021cf2 160000 --- a/proto +++ b/proto @@ -1 +1 @@ -Subproject commit 9be6a6ca9859e44d4b4502b89c071bc8587491b6 +Subproject commit d021cf202fde8ba13409b9031d01e8b068b82ca9