129 lines
3.8 KiB
Go
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
|
|
}
|