Files

71 lines
1.7 KiB
Go
Raw Permalink Normal View History

package handlers
import (
"log/slog"
"net/http"
"strconv"
"github.com/CubeCraft-Creations/Extrudex/backend/internal/dtos"
"github.com/CubeCraft-Creations/Extrudex/backend/internal/repositories"
)
// UsageLogHandler handles HTTP requests for usage log operations.
type UsageLogHandler struct {
repo *repositories.UsageLogRepository
}
// NewUsageLogHandler creates a UsageLogHandler with the given repository.
func NewUsageLogHandler(repo *repositories.UsageLogRepository) *UsageLogHandler {
return &UsageLogHandler{repo: repo}
}
// List handles GET /api/usage-logs — returns paginated, filtered usage logs.
func (h *UsageLogHandler) List(w http.ResponseWriter, r *http.Request) {
limit, offset := parsePagination(r)
filter := repositories.UsageLogFilter{
Limit: limit,
Offset: offset,
}
if sidStr := r.URL.Query().Get("spool_id"); sidStr != "" {
sid, err := strconv.Atoi(sidStr)
if err != nil {
writeJSON(w, http.StatusBadRequest, dtos.ErrorResponse{
Error: "invalid spool_id",
Code: http.StatusBadRequest,
})
return
}
filter.SpoolID = &sid
}
if jidStr := r.URL.Query().Get("job_id"); jidStr != "" {
jid, err := strconv.Atoi(jidStr)
if err != nil {
writeJSON(w, http.StatusBadRequest, dtos.ErrorResponse{
Error: "invalid job_id",
Code: http.StatusBadRequest,
})
return
}
filter.JobID = &jid
}
logs, total, err := h.repo.GetAll(r.Context(), filter)
if err != nil {
slog.Error("failed to list usage logs", "error", err)
writeJSON(w, http.StatusInternalServerError, dtos.ErrorResponse{
Error: "internal server error",
Code: http.StatusInternalServerError,
})
return
}
writeJSON(w, http.StatusOK, dtos.ListResponse{
Data: logs,
Total: total,
Limit: limit,
Offset: offset,
})
}