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