2025-05-12 20:05:59 +03:00

90 lines
2.3 KiB
Go

package handlers
import (
"context"
"github.com/goccy/go-json"
"madsky.ru/go-finance/internal/repository/status"
"madsky.ru/go-finance/internal/server/request"
"madsky.ru/go-finance/internal/server/response"
dto "madsky.ru/go-finance/internal/status"
"net/http"
)
func RegisterStatusRoutes(mux *http.ServeMux, ctx context.Context, repository status.Repository) {
mux.HandleFunc("GET /api/statuses/", FindStatuses(ctx, repository))
mux.HandleFunc("GET /api/statuses/{id}", FindStatusById(ctx, repository))
mux.HandleFunc("POST /api/statuses", CreateStatus(ctx, repository))
mux.HandleFunc("DELETE /api/statuses/{id}", DeleteStatus(ctx, repository))
}
func FindStatuses(ctx context.Context, repository status.Repository) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
s, err := repository.Find(ctx)
if err != nil {
response.Error(w, err, http.StatusBadRequest)
return
}
response.WriteJSON(w, nil, http.StatusOK, &s)
}
}
func FindStatusById(ctx context.Context, repository status.Repository) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
id, err := request.Param(r, "id")
if err != nil {
response.Error(w, err, http.StatusBadRequest)
return
}
s, err := repository.FindOne(ctx, id)
if err != nil {
response.Error(w, err, http.StatusNotFound)
return
}
response.WriteJSON(w, nil, http.StatusOK, &s)
}
}
func CreateStatus(ctx context.Context, repository status.Repository) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
dec := json.NewDecoder(r.Body)
dec.DisallowUnknownFields()
var statusDto dto.CreateStatusDTO
err := dec.Decode(&statusDto)
if err != nil {
response.Error(w, err, http.StatusNotAcceptable)
return
}
s, err := repository.Create(ctx, &statusDto)
if err != nil {
response.Error(w, err, http.StatusBadRequest)
return
}
response.WriteJSON(w, nil, http.StatusOK, &s)
}
}
func DeleteStatus(ctx context.Context, repository status.Repository) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
id, err := request.Param(r, "id")
if err != nil {
response.Error(w, err, http.StatusBadRequest)
return
}
count, err := repository.Remove(ctx, id)
if err != nil {
response.Error(w, err, http.StatusBadRequest)
return
}
response.WriteJSON(w, nil, http.StatusOK, count)
}
}