127 lines
3.3 KiB
Go
127 lines
3.3 KiB
Go
package handlers
|
|
|
|
import (
|
|
"context"
|
|
"github.com/goccy/go-json"
|
|
dto "madsky.ru/go-finance/internal/issue"
|
|
"madsky.ru/go-finance/internal/repository/issue"
|
|
"madsky.ru/go-finance/internal/server/request"
|
|
"madsky.ru/go-finance/internal/server/response"
|
|
"net/http"
|
|
)
|
|
|
|
func RegisterIssueRoutes(mux *http.ServeMux, ctx context.Context, repository issue.Repository) {
|
|
mux.HandleFunc("GET /api/issues/", FindIssues(ctx, repository))
|
|
mux.HandleFunc("GET /api/issues/{id}", FindIssuesByID(ctx, repository))
|
|
mux.HandleFunc("POST /api/issues", CreateIssues(ctx, repository))
|
|
mux.HandleFunc("POST /api/issues/positions", UpdatePositions(ctx, repository))
|
|
mux.HandleFunc("DELETE /api/issues/{id}", DeleteIssues(ctx, repository))
|
|
}
|
|
|
|
func FindIssues(ctx context.Context, repository issue.Repository) http.HandlerFunc {
|
|
return func(w http.ResponseWriter, r *http.Request) {
|
|
i, err := repository.Find(ctx)
|
|
if err != nil {
|
|
response.Error(w, err, http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
response.WriteJSON(w, nil, http.StatusOK, &i)
|
|
}
|
|
}
|
|
|
|
func FindIssuesByID(ctx context.Context, repository issue.Repository) http.HandlerFunc {
|
|
return func(w http.ResponseWriter, r *http.Request) {
|
|
w.Header().Set("Content-Type", "application/json")
|
|
|
|
id, err := request.Param(r, "id")
|
|
if err != nil {
|
|
response.Error(w, err, http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
i, err := repository.FindOne(ctx, id)
|
|
if err != nil {
|
|
response.Error(w, err, http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
response.WriteJSON(w, nil, http.StatusOK, &i)
|
|
}
|
|
}
|
|
|
|
func CreateIssues(ctx context.Context, repository issue.Repository) http.HandlerFunc {
|
|
return func(w http.ResponseWriter, r *http.Request) {
|
|
dec := json.NewDecoder(r.Body)
|
|
dec.DisallowUnknownFields()
|
|
|
|
var issueDto dto.CreateIssueDTO
|
|
|
|
err := dec.Decode(&issueDto)
|
|
if err != nil {
|
|
response.Error(w, err, http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
id, err := repository.Create(ctx, &issueDto)
|
|
if err != nil {
|
|
response.Error(w, err, http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
i, err := repository.FindOne(ctx, *id)
|
|
if err != nil {
|
|
response.Error(w, err, http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
response.WriteJSON(w, nil, http.StatusOK, &i)
|
|
}
|
|
}
|
|
|
|
func UpdatePositions(ctx context.Context, repository issue.Repository) http.HandlerFunc {
|
|
return func(w http.ResponseWriter, r *http.Request) {
|
|
dec := json.NewDecoder(r.Body)
|
|
dec.DisallowUnknownFields()
|
|
|
|
var positionDto dto.PositionDTO
|
|
|
|
err := dec.Decode(&positionDto)
|
|
if err != nil {
|
|
response.Error(w, err, http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
i := make([]*uint32, 0)
|
|
|
|
for position, issueId := range positionDto.Positions {
|
|
id, err := repository.UpdatePositions(ctx, position, positionDto.StatusId, issueId)
|
|
if err != nil {
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
i = append(i, id)
|
|
}
|
|
|
|
response.WriteJSON(w, nil, http.StatusOK, &i)
|
|
}
|
|
}
|
|
|
|
func DeleteIssues(ctx context.Context, repository issue.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)
|
|
}
|
|
}
|