package routes import ( "backend/database" "database/sql" "encoding/json" "errors" "github.com/go-chi/chi/v5" "net/http" ) func RegisterCharactersRoutes(r chi.Router) { r.Route("/", func(s chi.Router) { s.Get("/", getCharacters) s.Post("/", createCharacter) }) r.Route("/{id:[0-9]+}", func(s chi.Router) { s.Get("/", getCharacter) s.Put("/", updateCharacter) s.Delete("/", deleteCharacter) }) r.Get("/characters/{id:[0-9]+}/novels", getCharacterNovels) } func getCharacters(w http.ResponseWriter, r *http.Request) { characters, err := database.FetchCharacters() Response(w, err, characters) } func createCharacter(w http.ResponseWriter, r *http.Request) { Response(w, nil, "todo") } func getCharacter(w http.ResponseWriter, r *http.Request) { id := IURLParam(r, "id") char, err := database.FetchCharacter(id) Response(w, err, char) } func updateCharacter(w http.ResponseWriter, r *http.Request) { user, err := GetCurrentUser(r) if err != nil { NoAccess.Ferror(w) return } hasPerm := hasPermission(user, "characters") if !hasPerm { NoAccess.Ferror(w) return } body, err := ReadBody(r) if err != nil { Error(w, err) return } character := new(database.Character) err = json.Unmarshal(body, character) if err != nil { Error(w, err) return } character, err = database.UpdateCharacter(character) Response(w, err, character) } func deleteCharacter(w http.ResponseWriter, r *http.Request) { id := IURLParam(r, "id") user, err := GetCurrentUser(r) if err != nil { NoAccess.Ferror(w) return } hasPerm := hasPermission(user, "characters") if !hasPerm { NoAccess.Ferror(w) return } err = database.DeleteCharacter(id) if errors.Is(err, sql.ErrNoRows) { NotFound.Ferror(w) return } Response(w, err, "ok") } func getCharacterNovels(w http.ResponseWriter, r *http.Request) { id := IURLParam(r, "id") novels, err := database.FetchCharacterNovels(id) Response(w, err, novels) }