FILE / Unmei/Backend

v1/characters_routes.go

Исходный файл и его история в репозитории.
FILE 104b1404b0ff906862052f6728ff3b3384e48c8c
Files
Backend/v1/characters_routes.go
T
2021-05-02 16:04:45 +03:00

89 lines
1.9 KiB
Go
Executable File

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)
}