photum/backend/internal/availability/handler.go
NANDO9322 434548c158 feat(staffing): implementa sistema de disponibilidade e escalonamento
- Adiciona tabela `disponibilidade_profissionais` no schema
- Adiciona coluna `posicao` para mapa de profissionais no evento
- Implementa Service e Handler para gerenciar Disponibilidade (Set/Get)
- Implementa lógica de Escalonamento: listar disponíveis e atribuir posição
- Atualiza rotas da API e serviço do frontend

feat(frontend): implementa modal de detalhes e updates otimistas na equipe

- Adiciona componente ProfessionalDetailsModal para exibir dados completos do profissional
- Implementa update otimista em DataContext para adição/removação instantânea da equipe
- Corrige bug crítico de sintaxe e estrutura na Dashboard.tsx
- Adiciona badges de status (Pendente/Confirmado/Rejeitado) na listagem de equipe
- Corrige erro de referência de variável (professionalId) no fluxo de atribuição
2025-12-23 17:29:40 -03:00

83 lines
2.3 KiB
Go

package availability
import (
"net/http"
"time"
"github.com/gin-gonic/gin"
)
type Handler struct {
service *Service
}
func NewHandler(service *Service) *Handler {
return &Handler{service: service}
}
// SetAvailability godoc
// @Summary Set availability for a date
// @Tags availability
// @Accept json
// @Produce json
// @Param request body SetAvailabilityInput true "Availability Input"
// @Success 200 {object} map[string]string
// @Router /availability [post]
func (h *Handler) SetAvailability(c *gin.Context) {
var req SetAvailabilityInput
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
userID := c.GetString("userID") // From middleware
if userID == "" {
c.JSON(http.StatusUnauthorized, gin.H{"error": "unauthorized"})
return
}
if err := h.service.SetAvailability(c.Request.Context(), userID, req); err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"message": "availability updated"})
}
// ListAvailability godoc
// @Summary List my availability for a month with ?start=YYYY-MM-DD&end=YYYY-MM-DD
// @Tags availability
// @Produce json
// @Param start query string true "Start Date"
// @Param end query string true "End Date"
// @Success 200 {array} map[string]interface{}
// @Router /availability [get]
func (h *Handler) ListAvailability(c *gin.Context) {
userId := c.GetString("userID")
start := c.Query("start")
end := c.Query("end")
if start == "" || end == "" {
// Default to current month
now := time.Now()
start = time.Date(now.Year(), now.Month(), 1, 0, 0, 0, 0, time.UTC).Format("2006-01-02")
end = time.Date(now.Year(), now.Month()+1, 0, 0, 0, 0, 0, time.UTC).Format("2006-01-02")
}
availabilities, err := h.service.ListMyAvailability(c.Request.Context(), userId, start, end)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
// Map to simplify response
var response []map[string]interface{}
for _, a := range availabilities {
response = append(response, map[string]interface{}{
"date": a.Data.Time.Format("2006-01-02"),
"status": a.Status,
})
}
c.JSON(http.StatusOK, response)
}