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  }