- Holiday service with German federal holidays, Easter calculation, DB loading - Deadline calculator adapted from youpc.org (duration calc + non-working day adjustment) - Deadline CRUD service (tenant-scoped: list, create, update, complete, delete) - Deadline rule service (list, filter by proceeding type, hierarchical rule trees) - HTTP handlers for all endpoints with tenant resolution via X-Tenant-ID header - Router wired with all new endpoints under /api/ - Tests for holiday and calculator services (8 passing)
59 lines
1.5 KiB
Go
59 lines
1.5 KiB
Go
package handlers
|
|
|
|
import (
|
|
"net/http"
|
|
"strconv"
|
|
|
|
"mgit.msbls.de/m/KanzlAI-mGMT/internal/services"
|
|
)
|
|
|
|
// DeadlineRuleHandlers holds handlers for deadline rule endpoints
|
|
type DeadlineRuleHandlers struct {
|
|
rules *services.DeadlineRuleService
|
|
}
|
|
|
|
// NewDeadlineRuleHandlers creates deadline rule handlers
|
|
func NewDeadlineRuleHandlers(rs *services.DeadlineRuleService) *DeadlineRuleHandlers {
|
|
return &DeadlineRuleHandlers{rules: rs}
|
|
}
|
|
|
|
// List handles GET /api/deadline-rules
|
|
// Query params: proceeding_type_id (optional int filter)
|
|
func (h *DeadlineRuleHandlers) List(w http.ResponseWriter, r *http.Request) {
|
|
var proceedingTypeID *int
|
|
if v := r.URL.Query().Get("proceeding_type_id"); v != "" {
|
|
id, err := strconv.Atoi(v)
|
|
if err != nil {
|
|
writeError(w, http.StatusBadRequest, "invalid proceeding_type_id")
|
|
return
|
|
}
|
|
proceedingTypeID = &id
|
|
}
|
|
|
|
rules, err := h.rules.List(proceedingTypeID)
|
|
if err != nil {
|
|
writeError(w, http.StatusInternalServerError, "failed to list deadline rules")
|
|
return
|
|
}
|
|
|
|
writeJSON(w, http.StatusOK, rules)
|
|
}
|
|
|
|
// GetRuleTree handles GET /api/deadline-rules/{type}
|
|
// {type} is the proceeding type code (e.g., "INF", "REV")
|
|
func (h *DeadlineRuleHandlers) GetRuleTree(w http.ResponseWriter, r *http.Request) {
|
|
typeCode := r.PathValue("type")
|
|
if typeCode == "" {
|
|
writeError(w, http.StatusBadRequest, "proceeding type code required")
|
|
return
|
|
}
|
|
|
|
tree, err := h.rules.GetRuleTree(typeCode)
|
|
if err != nil {
|
|
writeError(w, http.StatusNotFound, "proceeding type not found")
|
|
return
|
|
}
|
|
|
|
writeJSON(w, http.StatusOK, tree)
|
|
}
|