Skip to content

Commit

Permalink
feat: refresh usecase and handler
Browse files Browse the repository at this point in the history
  • Loading branch information
rmscoal committed Feb 19, 2024
1 parent 86483f6 commit b2ba83b
Show file tree
Hide file tree
Showing 7 changed files with 520 additions and 3 deletions.
1 change: 1 addition & 0 deletions internal/app/service/doorkeeper_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,5 @@ type IDoorkeeperService interface {
HashAndEncodeStringWithSalt(ctx context.Context, str, slt string) string
ComparePasswords(ctx context.Context, hashAndEncodedPass, passToCheck, salt string) (bool, error)
GenerateTokens(ctx context.Context, subject string, prevJTI *string) (vo.Token, error)
ValidateRefreshToken(ctx context.Context, token string) (vo.Token, error)
}
9 changes: 7 additions & 2 deletions internal/app/usecase/credential_usecase.go
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,11 @@ func (uc *credentialUseCase) Authenticate(ctx context.Context, token string) (do
panic("not implemented") // TODO: Implement
}

func (uc *credentialUseCase) Refresh(ctx context.Context, token string) (domain.User, error) {
panic("not implemented") // TODO: Implement
func (uc *credentialUseCase) Refresh(ctx context.Context, rt string) (vo.Token, error) {
token, err := uc.service.ValidateRefreshToken(ctx, rt)
if err != nil {
return token, NewUnauthorizedError(err)
}

return token, nil
}
2 changes: 1 addition & 1 deletion internal/app/usecase/interfaces.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,5 @@ type ICredentialUseCase interface {
// Authenticates authenticates user from the given jwt.
Authenticate(ctx context.Context, token string) (domain.User, error)
// Refresh validates refresh tokens and generates a new set of tokens.
Refresh(ctx context.Context, token string) (domain.User, error)
Refresh(ctx context.Context, token string) (vo.Token, error)
}
40 changes: 40 additions & 0 deletions internal/delivery/v1/credential_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,19 @@ func (controller *CredentialController) signupHandler(c *gin.Context) {
controller.Created(c, mapper.Credential.UserDomainToSignUpResponse(user))
}

// LoginHandler godoc
//
// @Summary Log in handler
// @Description Handles log in for signed up users
// @Tags Credentials
// @Accept json
// @Produce json
// @Param loginRequest body dto.LoginRequest true "Login request body"
// @Success 200 {object} model.Data{data=vo.Token}
// @Failure 409 {object} model.Error{error=usecase.AppError}
// @Failure 422 {object} model.Error{error=usecase.AppError}
// @Failure 500 {object} model.Error{error=usecase.AppError}
// @Router /credentials/login [post]
func (controller *CredentialController) loginHandler(c *gin.Context) {
var req dto.LoginRequest

Expand All @@ -86,5 +99,32 @@ func (controller *CredentialController) loginHandler(c *gin.Context) {
controller.Ok(c, token)
}

// RefreshAccessHandler godoc
//
// @Summary Refresh access handler
// @Description Handles log in for refresh users
// @Tags Credentials
// @Accept json
// @Produce json
// @Param refreshRequest body dto.RefreshRequest true "refresh request body"
// @Success 200 {object} model.Data{data=vo.Token}
// @Failure 409 {object} model.Error{error=usecase.AppError}
// @Failure 422 {object} model.Error{error=usecase.AppError}
// @Failure 500 {object} model.Error{error=usecase.AppError}
// @Router /credentials/refresh [post]
func (controller *CredentialController) refreshHandler(c *gin.Context) {
var req dto.RefreshRequest

if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil {
controller.ClientError(c, usecase.NewClientError("Body", err))
return
}

token, err := controller.uc.Refresh(c.Request.Context(), req.RefreshToken)
if err != nil {
controller.SummariesUseCaseError(c, err)
return
}

controller.Ok(c, token)
}
233 changes: 233 additions & 0 deletions swagger/docs.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,206 @@ const docTemplate = `{
"host": "{{.Host}}",
"basePath": "{{.BasePath}}",
"paths": {
"/credentials/login": {
"post": {
"description": "Handles log in for signed up users",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Credentials"
],
"summary": "Log in handler",
"parameters": [
{
"description": "Login request body",
"name": "loginRequest",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/dto.LoginRequest"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"allOf": [
{
"$ref": "#/definitions/model.Data"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/vo.Token"
}
}
}
]
}
},
"409": {
"description": "Conflict",
"schema": {
"allOf": [
{
"$ref": "#/definitions/model.Error"
},
{
"type": "object",
"properties": {
"error": {
"$ref": "#/definitions/usecase.AppError"
}
}
}
]
}
},
"422": {
"description": "Unprocessable Entity",
"schema": {
"allOf": [
{
"$ref": "#/definitions/model.Error"
},
{
"type": "object",
"properties": {
"error": {
"$ref": "#/definitions/usecase.AppError"
}
}
}
]
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"allOf": [
{
"$ref": "#/definitions/model.Error"
},
{
"type": "object",
"properties": {
"error": {
"$ref": "#/definitions/usecase.AppError"
}
}
}
]
}
}
}
}
},
"/credentials/refresh": {
"post": {
"description": "Handles log in for refresh users",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Credentials"
],
"summary": "Refresh access handler",
"parameters": [
{
"description": "refresh request body",
"name": "refreshRequest",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/dto.RefreshRequest"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"allOf": [
{
"$ref": "#/definitions/model.Data"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/vo.Token"
}
}
}
]
}
},
"409": {
"description": "Conflict",
"schema": {
"allOf": [
{
"$ref": "#/definitions/model.Error"
},
{
"type": "object",
"properties": {
"error": {
"$ref": "#/definitions/usecase.AppError"
}
}
}
]
}
},
"422": {
"description": "Unprocessable Entity",
"schema": {
"allOf": [
{
"$ref": "#/definitions/model.Error"
},
{
"type": "object",
"properties": {
"error": {
"$ref": "#/definitions/usecase.AppError"
}
}
}
]
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"allOf": [
{
"$ref": "#/definitions/model.Error"
},
{
"type": "object",
"properties": {
"error": {
"$ref": "#/definitions/usecase.AppError"
}
}
}
]
}
}
}
}
},
"/credentials/signup": {
"post": {
"description": "Handles sign up for new users",
Expand Down Expand Up @@ -117,6 +317,28 @@ const docTemplate = `{
}
},
"definitions": {
"dto.LoginRequest": {
"type": "object",
"properties": {
"password": {
"type": "string",
"example": "verystrongpassword"
},
"username": {
"type": "string",
"example": "Username"
}
}
},
"dto.RefreshRequest": {
"type": "object",
"properties": {
"refreshToken": {
"type": "string",
"example": "refreshTokenHere"
}
}
},
"dto.SignUpRequest": {
"type": "object",
"properties": {
Expand Down Expand Up @@ -222,6 +444,17 @@ const docTemplate = `{
"example": "Please report incident to https://your-report.com"
}
}
},
"vo.Token": {
"type": "object",
"properties": {
"accessToken": {
"type": "string"
},
"refreshToken": {
"type": "string"
}
}
}
}
}`
Expand Down
Loading

0 comments on commit b2ba83b

Please sign in to comment.