forked from mirrors/pronouns.cc
67 lines
1.6 KiB
Go
67 lines
1.6 KiB
Go
package mod
|
|
|
|
import (
|
|
"net/http"
|
|
"strconv"
|
|
|
|
"codeberg.org/u1f320/pronouns.cc/backend/db"
|
|
"codeberg.org/u1f320/pronouns.cc/backend/log"
|
|
"codeberg.org/u1f320/pronouns.cc/backend/server"
|
|
"emperror.dev/errors"
|
|
"github.com/go-chi/chi/v5"
|
|
"github.com/go-chi/render"
|
|
)
|
|
|
|
type warning struct {
|
|
db.Warning
|
|
Read bool `json:"read"`
|
|
}
|
|
|
|
func dbWarningsToResponse(ws []db.Warning) []warning {
|
|
out := make([]warning, len(ws))
|
|
for i := range ws {
|
|
out[i] = warning{ws[i], ws[i].ReadAt != nil}
|
|
}
|
|
return out
|
|
}
|
|
|
|
func (s *Server) getWarnings(w http.ResponseWriter, r *http.Request) (err error) {
|
|
ctx := r.Context()
|
|
claims, _ := server.ClaimsFromContext(ctx)
|
|
showAll := r.FormValue("all") == "true"
|
|
|
|
warnings, err := s.DB.Warnings(ctx, claims.UserID, !showAll)
|
|
if err != nil {
|
|
log.Errorf("getting warnings: %v", err)
|
|
return errors.Wrap(err, "getting warnings from database")
|
|
}
|
|
|
|
render.JSON(w, r, dbWarningsToResponse(warnings))
|
|
return nil
|
|
}
|
|
|
|
func (s *Server) ackWarning(w http.ResponseWriter, r *http.Request) (err error) {
|
|
ctx := r.Context()
|
|
claims, _ := server.ClaimsFromContext(ctx)
|
|
|
|
if !claims.APIToken {
|
|
return server.APIError{Code: server.ErrMissingPermissions, Details: "This endpoint cannot be used by API tokens"}
|
|
}
|
|
|
|
id, err := strconv.ParseInt(chi.URLParam(r, "id"), 10, 64)
|
|
if err != nil {
|
|
return server.APIError{Code: server.ErrBadRequest}
|
|
}
|
|
|
|
ok, err := s.DB.AckWarning(ctx, claims.UserID, id)
|
|
if err != nil {
|
|
log.Errorf("acknowledging warning: %v", err)
|
|
return errors.Wrap(err, "acknowledging warning")
|
|
}
|
|
if !ok {
|
|
return server.APIError{Code: server.ErrNotFound}
|
|
}
|
|
|
|
render.NoContent(w, r)
|
|
return nil
|
|
}
|