66 "time"
77
88 "github.com/gin-gonic/gin"
9+ "github.com/google/uuid"
910 "github.com/lib/pq"
1011 db "github.com/nc-minh/tinybank/db/sqlc"
1112 "github.com/nc-minh/tinybank/utils"
@@ -79,8 +80,12 @@ type loginUserRequest struct {
7980}
8081
8182type loginUserResponse struct {
82- AccessToken string `json:"access_token"`
83- User userResponse `json:"user"`
83+ SessionID uuid.UUID `json:"session_id"`
84+ AccessToken string `json:"access_token"`
85+ AccessTokenExpiresAt time.Time `json:"access_token_expires_at"`
86+ RefreshToken string `json:"refresh_token"`
87+ RefreshTokenExpiresAt time.Time `json:"refresh_token_expires_at"`
88+ User userResponse `json:"user"`
8489}
8590
8691func (server * Server ) loginUser (ctx * gin.Context ) {
@@ -107,15 +112,42 @@ func (server *Server) loginUser(ctx *gin.Context) {
107112 return
108113 }
109114
110- accessToken , err := server .tokenMaker .CreateToken (user .Username , server .config .AccessTokenDuration )
115+ accessToken , accessPayload , err := server .tokenMaker .CreateToken (user .Username , server .config .AccessTokenDuration )
116+ if err != nil {
117+ ctx .JSON (http .StatusInternalServerError , errorResponse (err ))
118+ return
119+ }
120+
121+ refreshToken , refreshPayload , err := server .tokenMaker .CreateToken (
122+ user .Username ,
123+ server .config .RefreshTokenDuration ,
124+ )
125+ if err != nil {
126+ ctx .JSON (http .StatusInternalServerError , errorResponse (err ))
127+ return
128+ }
129+
130+ session , err := server .store .CreateSession (ctx , db.CreateSessionParams {
131+ ID : refreshPayload .ID ,
132+ Username : user .Username ,
133+ RefreshToken : refreshToken ,
134+ UserAgent : ctx .Request .UserAgent (),
135+ ClientIp : ctx .ClientIP (),
136+ IsBlocked : false ,
137+ ExpiresAt : refreshPayload .ExpiredAt ,
138+ })
111139 if err != nil {
112140 ctx .JSON (http .StatusInternalServerError , errorResponse (err ))
113141 return
114142 }
115143
116144 resp := loginUserResponse {
117- AccessToken : accessToken ,
118- User : newUserResponse (user ),
145+ SessionID : session .ID ,
146+ AccessToken : accessToken ,
147+ AccessTokenExpiresAt : accessPayload .ExpiredAt ,
148+ RefreshToken : refreshToken ,
149+ RefreshTokenExpiresAt : refreshPayload .ExpiredAt ,
150+ User : newUserResponse (user ),
119151 }
120152
121153 ctx .JSON (http .StatusOK , resp )
0 commit comments