153 lines
4.4 KiB
Go
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)
|
|
}
|