package projects import ( "net/http" "strconv" "github.com/gin-gonic/gin" ) type Handler struct { service *Service } func NewHandler(service *Service) *Handler { return &Handler{service: service} } func (h *Handler) Register(router gin.IRouter) { router.POST("/projects", h.createProject) router.GET("/projects", h.listProjects) router.GET("/projects/:id/dashboard", h.dashboard) } func (h *Handler) createProject(c *gin.Context) { var input struct { Name string `json:"name"` Description string `json:"description"` } if err := c.ShouldBindJSON(&input); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "invalid request"}) return } project, err := h.service.CreateProject(1, input.Name, input.Description) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } c.JSON(http.StatusCreated, project) } func (h *Handler) listProjects(c *gin.Context) { projects, err := h.service.ListProjects(1) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "failed to list projects"}) return } c.JSON(http.StatusOK, projects) } func (h *Handler) dashboard(c *gin.Context) { projectID, err := strconv.ParseUint(c.Param("id"), 10, 64) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "invalid project id"}) return } dashboard, err := h.service.Dashboard(uint(projectID)) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "failed to load dashboard"}) return } c.JSON(http.StatusOK, dashboard) }