initial commit from original sev version
This commit is contained in:
@@ -0,0 +1,128 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user