From dded9e807b42d61ecae4cf3b1a55d3fa4507c985 Mon Sep 17 00:00:00 2001 From: MacBook Air M1 Date: Tue, 6 Jan 2026 23:59:16 +0700 Subject: [PATCH] add api check uncheck assignment --- .../controllers/daily-checklist.controller.go | 18 +++++++++ internal/modules/daily-checklists/route.go | 16 ++++++++ .../services/daily-checklist.service.go | 37 +++++++++++++++++++ .../validations/daily-checklist.validation.go | 7 ++++ 4 files changed, 78 insertions(+) diff --git a/internal/modules/daily-checklists/controllers/daily-checklist.controller.go b/internal/modules/daily-checklists/controllers/daily-checklist.controller.go index b5a9b7b5..351c408b 100644 --- a/internal/modules/daily-checklists/controllers/daily-checklist.controller.go +++ b/internal/modules/daily-checklists/controllers/daily-checklist.controller.go @@ -241,3 +241,21 @@ func (u *DailyChecklistController) GetAllTasks(c *fiber.Ctx) error { Data: result, }) } + +func (u *DailyChecklistController) UpdateAssignment(c *fiber.Ctx) error { + req := new(validation.UpdateAssignment) + if err := c.BodyParser(req); err != nil { + return fiber.NewError(fiber.StatusBadRequest, "Invalid request body") + } + + if err := u.DailyChecklistService.UpdateAssignment(c, req); err != nil { + return err + } + + return c.Status(fiber.StatusOK). + JSON(response.Success{ + Code: fiber.StatusOK, + Status: "success", + Message: "Assignment updated successfully", + }) +} diff --git a/internal/modules/daily-checklists/route.go b/internal/modules/daily-checklists/route.go index c8542671..bffb5013 100644 --- a/internal/modules/daily-checklists/route.go +++ b/internal/modules/daily-checklists/route.go @@ -19,16 +19,32 @@ func DailyChecklistRoutes(v1 fiber.Router, u user.UserService, s dailyChecklist. route.Post("/", ctrl.CreateOne) // create task + /* + ketika add phase + */ route.Post("/phase/:idDailyChecklist", ctrl.CreateDailyChecklistPhase) // create assigment + /* + ketika add ABK + */ route.Post("/assignment/:idDailyChecklist", ctrl.CreateAssignment) + // remove assignment + /* + ketika remove ABK + */ route.Delete("/:idDailyChecklist/assignments/:idEmployee", ctrl.RemoveAssignment) //get all tasks route.Get("/tasks", ctrl.GetAllTasks) + // update assignment + /* + ketika check dan uncheck tugas oleh ABK + */ + route.Post("/assignment", ctrl.UpdateAssignment) + route.Get("/:id", ctrl.GetOne) route.Patch("/:id", ctrl.UpdateOne) route.Delete("/:id", ctrl.DeleteOne) diff --git a/internal/modules/daily-checklists/services/daily-checklist.service.go b/internal/modules/daily-checklists/services/daily-checklist.service.go index bf5320e6..63c3cc9c 100644 --- a/internal/modules/daily-checklists/services/daily-checklist.service.go +++ b/internal/modules/daily-checklists/services/daily-checklist.service.go @@ -29,6 +29,7 @@ type DailyChecklistService interface { AssignTasks(ctx *fiber.Ctx, id uint, req *validation.AssignTask) error RemoveAssignment(ctx *fiber.Ctx, id uint, employeeID uint) error GetTasks(ctx *fiber.Ctx, checklistID uint) ([]entity.DailyChecklistActivityTask, error) + UpdateAssignment(ctx *fiber.Ctx, req *validation.UpdateAssignment) error } type dailyChecklistService struct { @@ -296,6 +297,42 @@ func (s dailyChecklistService) GetTasks(c *fiber.Ctx, checklistID uint) ([]entit return tasks, nil } +func (s dailyChecklistService) UpdateAssignment(c *fiber.Ctx, req *validation.UpdateAssignment) error { + if err := s.Validate.Struct(req); err != nil { + return err + } + + task := new(entity.DailyChecklistActivityTask) + if err := s.Repository.DB().WithContext(c.Context()).First(task, req.TaskID).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return fiber.NewError(fiber.StatusNotFound, "Task not found") + } + return err + } + + if req.EmployeeID == 0 { + return fiber.NewError(fiber.StatusBadRequest, "Invalid employee id") + } + + updates := map[string]any{"updated_at": time.Now()} + if req.Checked != nil { + updates["checked"] = *req.Checked + } + if req.Note != nil { + updates["note"] = *req.Note + } + + return s.Repository.DB().WithContext(c.Context()).Clauses(clause.OnConflict{ + Columns: []clause.Column{{Name: "task_id"}, {Name: "employee_id"}}, + DoUpdates: clause.Assignments(updates), + }).Create(&entity.DailyChecklistActivityTaskAssignment{ + TaskId: req.TaskID, + EmployeeId: req.EmployeeID, + Checked: req.Checked != nil && *req.Checked, + Note: req.Note, + }).Error +} + func parsePhaseIDs(raw string) ([]uint, error) { parts := strings.Split(raw, ",") result := make([]uint, 0, len(parts)) diff --git a/internal/modules/daily-checklists/validations/daily-checklist.validation.go b/internal/modules/daily-checklists/validations/daily-checklist.validation.go index ba81fd0d..61e8a455 100644 --- a/internal/modules/daily-checklists/validations/daily-checklist.validation.go +++ b/internal/modules/daily-checklists/validations/daily-checklist.validation.go @@ -24,3 +24,10 @@ type AssignPhases struct { type AssignTask struct { EmployeeIDs string `json:"employee_ids" validate:"required"` } + +type UpdateAssignment struct { + TaskID uint `json:"task_id" validate:"required"` + EmployeeID uint `json:"employee_id" validate:"required"` + Checked *bool `json:"checked,omitempty"` + Note *string `json:"note,omitempty"` +}