FILE / Unmei/Backend
v1/characters_routes.go
Исходный файл и его история в репозитории.
89 lines
1.9 KiB
Go
Executable File
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)
|
|
}
|