package handlers import ( "encoding/json" "net/http" "github.com/google/uuid" "mgit.msbls.de/m/KanzlAI-mGMT/internal/auth" "mgit.msbls.de/m/KanzlAI-mGMT/internal/services" ) type CaseAssignmentHandler struct { svc *services.CaseAssignmentService } func NewCaseAssignmentHandler(svc *services.CaseAssignmentService) *CaseAssignmentHandler { return &CaseAssignmentHandler{svc: svc} } // List handles GET /api/cases/{id}/assignments func (h *CaseAssignmentHandler) List(w http.ResponseWriter, r *http.Request) { tenantID, ok := auth.TenantFromContext(r.Context()) if !ok { writeError(w, http.StatusForbidden, "missing tenant") return } caseID, err := uuid.Parse(r.PathValue("id")) if err != nil { writeError(w, http.StatusBadRequest, "invalid case ID") return } assignments, err := h.svc.ListByCase(r.Context(), tenantID, caseID) if err != nil { writeError(w, http.StatusInternalServerError, err.Error()) return } writeJSON(w, http.StatusOK, map[string]any{ "assignments": assignments, "total": len(assignments), }) } // Assign handles POST /api/cases/{id}/assignments func (h *CaseAssignmentHandler) Assign(w http.ResponseWriter, r *http.Request) { tenantID, ok := auth.TenantFromContext(r.Context()) if !ok { writeError(w, http.StatusForbidden, "missing tenant") return } caseID, err := uuid.Parse(r.PathValue("id")) if err != nil { writeError(w, http.StatusBadRequest, "invalid case ID") return } var req struct { UserID string `json:"user_id"` Role string `json:"role"` } if err := json.NewDecoder(r.Body).Decode(&req); err != nil { writeError(w, http.StatusBadRequest, "invalid request body") return } userID, err := uuid.Parse(req.UserID) if err != nil { writeError(w, http.StatusBadRequest, "invalid user_id") return } if req.Role == "" { req.Role = "team" } if req.Role != "lead" && req.Role != "team" && req.Role != "viewer" { writeError(w, http.StatusBadRequest, "role must be lead, team, or viewer") return } assignment, err := h.svc.Assign(r.Context(), tenantID, caseID, userID, req.Role) if err != nil { writeError(w, http.StatusBadRequest, err.Error()) return } writeJSON(w, http.StatusCreated, assignment) } // Unassign handles DELETE /api/cases/{id}/assignments/{uid} func (h *CaseAssignmentHandler) Unassign(w http.ResponseWriter, r *http.Request) { tenantID, ok := auth.TenantFromContext(r.Context()) if !ok { writeError(w, http.StatusForbidden, "missing tenant") return } caseID, err := uuid.Parse(r.PathValue("id")) if err != nil { writeError(w, http.StatusBadRequest, "invalid case ID") return } userID, err := uuid.Parse(r.PathValue("uid")) if err != nil { writeError(w, http.StatusBadRequest, "invalid user ID") return } if err := h.svc.Unassign(r.Context(), tenantID, caseID, userID); err != nil { writeError(w, http.StatusNotFound, err.Error()) return } writeJSON(w, http.StatusOK, map[string]string{"status": "removed"}) }