All checks were successful
gitea-deepak/gogmagog/pipeline/head This commit looks good
97 lines
2.0 KiB
Go
97 lines
2.0 KiB
Go
package routes
|
|
|
|
import (
|
|
"encoding/json"
|
|
"gitea.deepak.science/deepak/gogmagog/models"
|
|
"github.com/go-chi/chi"
|
|
"io"
|
|
"net/http"
|
|
)
|
|
|
|
func newAuthRouter(m *models.Model) http.Handler {
|
|
router := chi.NewRouter()
|
|
router.Post("/register", postUserFunc(m))
|
|
router.Post("/tokens", createTokenFunc(m))
|
|
return router
|
|
}
|
|
|
|
type createUserResponse struct {
|
|
Username string `json:"username"`
|
|
}
|
|
|
|
func postUserFunc(m *models.Model) http.HandlerFunc {
|
|
return func(w http.ResponseWriter, r *http.Request) {
|
|
|
|
r.Body = http.MaxBytesReader(w, r.Body, 1024)
|
|
dec := json.NewDecoder(r.Body)
|
|
dec.DisallowUnknownFields()
|
|
var req models.CreateUserRequest
|
|
err := dec.Decode(&req)
|
|
if err != nil {
|
|
badRequestError(w, err)
|
|
return
|
|
}
|
|
err = dec.Decode(&struct{}{})
|
|
if err != io.EOF {
|
|
badRequestError(w, err)
|
|
return
|
|
}
|
|
|
|
_, err = m.CreateUser(&req)
|
|
if err != nil {
|
|
serverError(w, err)
|
|
return
|
|
}
|
|
|
|
response := &createUserResponse{
|
|
Username: req.Username,
|
|
}
|
|
w.WriteHeader(http.StatusCreated)
|
|
w.Header().Add("Content-Type", "application/json")
|
|
if err := json.NewEncoder(w).Encode(response); err != nil {
|
|
serverError(w, err)
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
type loginCreds struct {
|
|
Username string `json:"username"`
|
|
Password string `json:"password"`
|
|
}
|
|
|
|
func createTokenFunc(m *models.Model) http.HandlerFunc {
|
|
return func(w http.ResponseWriter, r *http.Request) {
|
|
|
|
r.Body = http.MaxBytesReader(w, r.Body, 1024)
|
|
dec := json.NewDecoder(r.Body)
|
|
dec.DisallowUnknownFields()
|
|
var creds loginCreds
|
|
err := dec.Decode(&creds)
|
|
if err != nil {
|
|
badRequestError(w, err)
|
|
return
|
|
}
|
|
err = dec.Decode(&struct{}{})
|
|
if err != io.EOF {
|
|
badRequestError(w, err)
|
|
return
|
|
}
|
|
|
|
user, err := m.VerifyUserByUsernamePassword(creds.Username, creds.Password)
|
|
if err != nil {
|
|
if models.IsInvalidLoginError(err) {
|
|
unauthorizedHandler(w, r)
|
|
return
|
|
}
|
|
serverError(w, err)
|
|
return
|
|
|
|
}
|
|
w.Header().Add("Content-Type", "application/json")
|
|
if err := json.NewEncoder(w).Encode(user); err != nil {
|
|
serverError(w, err)
|
|
}
|
|
}
|
|
}
|