package v1 import ( "database/sql" "encoding/json" "net/http" "strconv" "github.com/gorilla/mux" ) func RegisterCharactersRoutes(r *mux.Router) { r.HandleFunc("/characters", resolveCharacters).Methods("GET", "OPTIONS", "POST") r.HandleFunc("/characters/{id:[0-9]+}", resolveCharacter).Methods("GET", "OPTIONS", "PUT", "DELETE") r.HandleFunc("/characters/{id:[0-9]+}/novels", resolveCharacterNovels).Methods("GET", "OPTIONS") } func resolveCharacters(w http.ResponseWriter, r *http.Request) { if r.Method == http.MethodGet { characters, err := FetchCharacters() Response(w, err, characters) } else if r.Method == http.MethodPost { Response(w, nil, "todo") } } func resolveCharacter(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) id, _ := strconv.Atoi(vars["id"]) if r.Method == http.MethodGet { char, err := FetchCharacter(id) Response(w, err, char) } else if r.Method == http.MethodPut { user, err := FetchCurrentUser(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(Character) err = json.Unmarshal(body, character) if err != nil { Error(w, err) return } character, err = UpdateCharacter(character) Response(w, err, character) } else if r.Method == http.MethodDelete { user, err := FetchCurrentUser(r) if err != nil { NoAccess.Ferror(w) return } hasPerm := hasPermission(user, "characters") if !hasPerm { NoAccess.Ferror(w) return } err = DeleteCharacter(id) if err == sql.ErrNoRows { NotFound.Ferror(w) return } Response(w, err, "ok") } } func resolveCharacterNovels(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) id, _ := strconv.Atoi(vars["id"]) novels, err := FetchCharacterNovels(id) Response(w, err, novels) }