github.com/tuingking/flamingo@v0.0.0-20220403134817-2796ae0e84ca/handler/rest/account.go (about) 1 package rest 2 3 import ( 4 "encoding/json" 5 "net/http" 6 7 "github.com/pkg/errors" 8 "github.com/tuingking/flamingo/internal/account" 9 "github.com/tuingking/flamingo/internal/auth" 10 ) 11 12 // CreateAccount 13 // @Summary Create user account 14 // @Description Create user account 15 // @Tags Account 16 // @Accept json 17 // @Produce json 18 // @Param request body account.CreateAccountRequest true "payload to create account" 19 // @Success 200 {object} Response{data=account.Account} "Success Response" 20 // @Failure 400 "Bad Request" 21 // @Failure 500 "InternalServerError" 22 // @Router /accounts [post] 23 func (h *RestHandler) RegisterNewAccount(w http.ResponseWriter, r *http.Request) { 24 var ( 25 req account.CreateAccountRequest 26 res = Response{ 27 Data: account.Account{}, 28 } 29 ) 30 defer res.Render(w, r) 31 32 err := json.NewDecoder(r.Body).Decode(&req) 33 if err != nil { 34 res.SetError(errors.Wrap(err, "Unable to unmarshal request body"), http.StatusBadRequest) 35 return 36 } 37 38 acc, err := h.account.CreateAccount(r.Context(), req) 39 if err != nil { 40 res.SetError(errors.Wrap(err, "failed to create user account"), http.StatusInternalServerError) 41 return 42 } 43 44 res.Data = acc 45 } 46 47 // Issue Access Token 48 // @Summary Issue Access Token 49 // @Description Issue Access Token 50 // @Tags Account 51 // @Accept json 52 // @Produce json 53 // @Param request body account.SignInRequest true "payload to get access token" 54 // @Success 200 {object} Response{data=auth.JwtToken} "Success Response" 55 // @Failure 400 "Bad Request" 56 // @Failure 500 "InternalServerError" 57 // @Router /auth/token [post] 58 func (h *RestHandler) IssueAccessToken(w http.ResponseWriter, r *http.Request) { 59 var ( 60 req account.SignInRequest 61 res = Response{ 62 Data: auth.JwtToken{}, 63 } 64 ) 65 defer res.Render(w, r) 66 67 err := json.NewDecoder(r.Body).Decode(&req) 68 if err != nil { 69 res.SetError(errors.Wrap(err, "Unable to unmarshal request body"), http.StatusBadRequest) 70 return 71 } 72 73 acc, err := h.account.Authenticate(r.Context(), req.Username, req.Password) 74 if err != nil { 75 res.SetError(errors.Wrap(err, "invalid username or password"), http.StatusBadRequest) 76 return 77 } 78 79 jwtToken, err := h.auth.IssueJwtToken(r.Context(), acc) 80 if err != nil { 81 res.SetError(errors.Wrap(err, "failed create access token"), http.StatusInternalServerError) 82 return 83 } 84 85 res.Data = jwtToken 86 }