Files

153 lines
4.4 KiB
Go

package handlers
import "errors"
import "fmt"
import "net/http"
import "codit/internal/db"
import "codit/internal/models"
func (api *API) ListBoardFieldValues(w http.ResponseWriter, r *http.Request, params map[string]string) {
var values []models.BoardFieldValue
var err error
if !api.requireBoardRole(w, r, params["boardId"], models.RoleViewer) {
return
}
values, err = api.store(r).ListBoardFieldValues(params["boardId"], params["field"])
if err != nil {
WriteJSONWithErrorReason(w, r, http.StatusInternalServerError, err.Error())
return
}
if values == nil {
values = []models.BoardFieldValue{}
}
WriteJSON(w, http.StatusOK, values)
}
type boardFieldValueRequest struct {
Value string `json:"value"`
Label string `json:"label"`
Color string `json:"color"`
StartDate string `json:"start_date"`
EndDate string `json:"end_date"`
}
func (api *API) CreateBoardFieldValue(w http.ResponseWriter, r *http.Request, params map[string]string) {
var req boardFieldValueRequest
var fv models.BoardFieldValue
var created models.BoardFieldValue
var err error
if !api.requireBoardRole(w, r, params["boardId"], models.RoleAdmin) {
return
}
err = DecodeJSON(r, &req)
if err != nil || req.Value == "" || req.Label == "" {
WriteJSONWithErrorReason(w, r, http.StatusBadRequest, "value and label are required")
return
}
fv = models.BoardFieldValue{
Field: params["field"],
Value: req.Value,
Label: req.Label,
Color: req.Color,
StartDate: req.StartDate,
EndDate: req.EndDate,
}
created, err = api.store(r).CreateBoardFieldValue(r.Context(), params["boardId"], fv)
if err != nil {
if errors.Is(err, db.ErrBoardNotFound) {
WriteJSONWithErrorReason(w, r, http.StatusNotFound, "board not found")
return
}
WriteJSONWithErrorReason(w, r, http.StatusInternalServerError, err.Error())
return
}
WriteJSON(w, http.StatusCreated, created)
}
func (api *API) UpdateBoardFieldValue(w http.ResponseWriter, r *http.Request, params map[string]string) {
var req boardFieldValueRequest
var fv models.BoardFieldValue
var updated models.BoardFieldValue
var err error
if !api.requireBoardRole(w, r, params["boardId"], models.RoleAdmin) {
return
}
err = DecodeJSON(r, &req)
if err != nil || req.Label == "" {
WriteJSONWithErrorReason(w, r, http.StatusBadRequest, "label is required")
return
}
fv = models.BoardFieldValue{
Label: req.Label,
Color: req.Color,
StartDate: req.StartDate,
EndDate: req.EndDate,
}
updated, err = api.store(r).UpdateBoardFieldValue(params["boardId"], params["valueId"], fv)
if err != nil {
if errors.Is(err, db.ErrFieldValueNotFound) {
WriteJSONWithErrorReason(w, r, http.StatusNotFound, "field value not found")
return
}
WriteJSONWithErrorReason(w, r, http.StatusInternalServerError, err.Error())
return
}
WriteJSON(w, http.StatusOK, updated)
}
func (api *API) ReorderBoardFieldValues(w http.ResponseWriter, r *http.Request, params map[string]string) {
var req struct {
IDs []string `json:"ids"`
}
var values []models.BoardFieldValue
var err error
if !api.requireBoardRole(w, r, params["boardId"], models.RoleAdmin) {
return
}
err = DecodeJSON(r, &req)
if err != nil || len(req.IDs) == 0 {
WriteJSONWithErrorReason(w, r, http.StatusBadRequest, "ids are required")
return
}
values, err = api.store(r).ReorderBoardFieldValues(r.Context(), params["boardId"], params["field"], req.IDs)
if err != nil {
if errors.Is(err, db.ErrBoardNotFound) {
WriteJSONWithErrorReason(w, r, http.StatusNotFound, "board not found")
return
}
WriteJSONWithErrorReason(w, r, http.StatusInternalServerError, err.Error())
return
}
if values == nil {
values = []models.BoardFieldValue{}
}
WriteJSON(w, http.StatusOK, values)
}
func (api *API) DeleteBoardFieldValue(w http.ResponseWriter, r *http.Request, params map[string]string) {
var err error
if !api.requireBoardRole(w, r, params["boardId"], models.RoleAdmin) {
return
}
err = api.store(r).DeleteBoardFieldValue(r.Context(), params["boardId"], params["valueId"])
if err != nil {
if errors.Is(err, db.ErrFieldValueNotFound) {
WriteJSONWithErrorReason(w, r, http.StatusNotFound, "field value not found")
return
}
if errors.Is(err, db.ErrFieldValueInUse) {
WriteJSONWithErrorReason(w, r, http.StatusConflict, fmt.Sprintf("%s", err.Error()))
return
}
WriteJSONWithErrorReason(w, r, http.StatusInternalServerError, err.Error())
return
}
w.WriteHeader(http.StatusNoContent)
}