Files
abuse-registration-api-golang/internal/handlers/registrations.go
T

129 lines
3.8 KiB
Go

package handlers
import (
"net/http"
"strconv"
"strings"
"time"
"abuse_registration_poc/internal/models"
)
func (h *Handler) DemoRegistrations(writer http.ResponseWriter, request *http.Request) {
WriteJSON(writer, http.StatusOK, h.store.List(filterFromQuery(request)))
}
func (h *Handler) ListRegistrations(writer http.ResponseWriter, request *http.Request) {
WriteJSON(writer, http.StatusOK, h.store.List(filterFromQuery(request)))
}
func (h *Handler) GetRegistration(writer http.ResponseWriter, request *http.Request, id string) {
registration, ok := h.store.Get(id)
if !ok {
WriteJSON(writer, http.StatusNotFound, map[string]string{"message": "Registration not found."})
return
}
WriteJSON(writer, http.StatusOK, registration)
}
func (h *Handler) CreateRegistration(writer http.ResponseWriter, request *http.Request) {
var input models.Registration
if err := DecodeJSON(request, &input); err != nil {
WriteJSON(writer, http.StatusBadRequest, map[string]string{"message": "Could not parse request data."})
return
}
created, err := h.store.Create(input)
if err != nil {
WriteJSON(writer, http.StatusBadRequest, map[string]string{"message": err.Error()})
return
}
WriteJSON(writer, http.StatusCreated, created)
}
func (h *Handler) UpdateRegistration(writer http.ResponseWriter, request *http.Request, id string) {
var input models.Registration
if err := DecodeJSON(request, &input); err != nil {
WriteJSON(writer, http.StatusBadRequest, map[string]string{"message": "Could not parse request data."})
return
}
updated, ok, err := h.store.Replace(id, input)
if err != nil {
WriteJSON(writer, http.StatusBadRequest, map[string]string{"message": err.Error()})
return
}
if !ok {
WriteJSON(writer, http.StatusNotFound, map[string]string{"message": "Registration not found."})
return
}
WriteJSON(writer, http.StatusOK, updated)
}
func (h *Handler) DeleteRegistration(writer http.ResponseWriter, request *http.Request, id string) {
if !h.store.Delete(id) {
WriteJSON(writer, http.StatusNotFound, map[string]string{"message": "Registration not found."})
return
}
WriteJSON(writer, http.StatusOK, map[string]any{"message": "Registration deleted successfully.", "id": id})
}
func (h *Handler) ResetRegistrations(writer http.ResponseWriter, request *http.Request) {
h.store.Reset()
rows, _, nextReset := h.store.Snapshot()
WriteJSON(writer, http.StatusOK, map[string]any{
"message": "Dataset reset to base sample data.",
"dataset_count": len(rows),
"next_reset": nextReset.Format(time.RFC3339),
})
}
func (h *Handler) Categories(writer http.ResponseWriter, request *http.Request) {
WriteJSON(writer, http.StatusOK, models.AbuseCategories)
}
func (h *Handler) Locations(writer http.ResponseWriter, request *http.Request) {
WriteJSON(writer, http.StatusOK, models.FaroeLocations)
}
func filterFromQuery(request *http.Request) models.RegistrationFilter {
query := request.URL.Query()
filter := models.RegistrationFilter{
Location: query.Get("location"),
AbuseType: query.Get("abuse_type"),
Gender: query.Get("gender"),
Status: query.Get("status"),
Search: query.Get("search"),
Limit: queryInt(query.Get("limit"), 0),
Offset: queryInt(query.Get("offset"), 0),
}
if from, ok := queryTime(query.Get("from")); ok {
filter.From = from
filter.HasFrom = true
}
if to, ok := queryTime(query.Get("to")); ok {
filter.To = to
filter.HasTo = true
}
return filter
}
func queryInt(value string, fallback int) int {
value = strings.TrimSpace(value)
if value == "" {
return fallback
}
parsed, err := strconv.Atoi(value)
if err != nil || parsed < 0 {
return fallback
}
return parsed
}
func queryTime(value string) (time.Time, bool) {
parsed, err := models.ParseInputTime(value)
if err != nil {
return time.Time{}, false
}
return parsed, true
}