From d8c994d95804517bf40972122c2b9db61aefbb5a Mon Sep 17 00:00:00 2001 From: hanif salafi Date: Sun, 12 May 2024 17:09:54 +0700 Subject: [PATCH] feat: fixing user role and user refreshToken --- .../entity/user_role_accesses.entity.go | 2 +- .../controller/ppid_datas.controller.go | 4 ++- .../ppid_datas/service/ppid_datas.service.go | 16 +++++----- .../user_role_accesses.repository.go | 5 ++++ .../request/user_role_accesses.request.go | 4 +-- .../response/user_role_accesses.response.go | 2 +- .../repository/user_roles.repository.go | 13 +++++---- .../user_roles/request/user_roles.request.go | 12 ++++---- .../user_roles/service/user_roles.service.go | 29 ++++++++++++++++++- app/module/users/request/users.request.go | 5 ++-- app/module/users/service/users.service.go | 7 ++++- config/config/keycloak.config.go | 17 +++++++++++ docs/swagger/docs.go | 22 +++++++------- docs/swagger/swagger.json | 22 +++++++------- docs/swagger/swagger.yaml | 13 +++++---- 15 files changed, 119 insertions(+), 54 deletions(-) diff --git a/app/database/entity/user_role_accesses.entity.go b/app/database/entity/user_role_accesses.entity.go index 26bc357..29b516f 100644 --- a/app/database/entity/user_role_accesses.entity.go +++ b/app/database/entity/user_role_accesses.entity.go @@ -4,7 +4,7 @@ import "time" type UserRoleAccesses struct { ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` - UserRoleId int `json:"user_role_id" gorm:"type:int4"` + UserRoleId uint `json:"user_role_id" gorm:"type:int4"` MenuId int `json:"menu_id" gorm:"type:int4"` IsViewEnabled bool `json:"is_view_enabled" gorm:"type:bool"` IsInsertEnabled bool `json:"is_insert_enabled" gorm:"type:bool"` diff --git a/app/module/ppid_datas/controller/ppid_datas.controller.go b/app/module/ppid_datas/controller/ppid_datas.controller.go index 9983478..51647a3 100644 --- a/app/module/ppid_datas/controller/ppid_datas.controller.go +++ b/app/module/ppid_datas/controller/ppid_datas.controller.go @@ -2,6 +2,7 @@ package controller import ( "github.com/gofiber/fiber/v2" + "github.com/rs/zerolog" "go-humas-be/app/module/ppid_datas/request" "go-humas-be/app/module/ppid_datas/service" "go-humas-be/utils/paginator" @@ -14,6 +15,7 @@ import ( type ppidDatasController struct { ppidDatasService service.PpidDatasService + log zerolog.Logger } type PpidDatasController interface { @@ -66,7 +68,7 @@ func (_i *ppidDatasController) All(c *fiber.Ctx) error { req := reqContext.ToParamRequest() req.Pagination = paginate - ppidDatasData, paging, err := _i.ppidDatasService.All(req, authToken) + ppidDatasData, paging, err := _i.ppidDatasService.All(req, &authToken) if err != nil { return err } diff --git a/app/module/ppid_datas/service/ppid_datas.service.go b/app/module/ppid_datas/service/ppid_datas.service.go index 2976aa2..c48e404 100644 --- a/app/module/ppid_datas/service/ppid_datas.service.go +++ b/app/module/ppid_datas/service/ppid_datas.service.go @@ -33,7 +33,7 @@ type ppidDatasService struct { // PpidDatasService define interface of IPpidDatasService type PpidDatasService interface { - All(req request.PpidDatasQueryRequest, authToken string) (ppidDatas []*response.PpidDatasResponse, paging paginator.Pagination, err error) + All(req request.PpidDatasQueryRequest, authToken *string) (ppidDatas []*response.PpidDatasResponse, paging paginator.Pagination, err error) Show(id string) (ppidDatas *response.PpidDatasResponse, err error) Save(req request.PpidDatasCreateRequest, authToken string) (ppidDatas *entity.PpidDatas, err error) Update(id uint, req request.PpidDatasUpdateRequest) (err error) @@ -64,13 +64,15 @@ func NewPpidDatasService( } // All implement interface of PpidDatasService -func (_i *ppidDatasService) All(req request.PpidDatasQueryRequest, authToken string) (ppidDatass []*response.PpidDatasResponse, paging paginator.Pagination, err error) { - - user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken) - req.UserId = &user.ID - req.UserRoleId = &user.UserRoleId - req.UserLevelId = &user.UserLevelId +func (_i *ppidDatasService) All(req request.PpidDatasQueryRequest, authToken *string) (ppidDatass []*response.PpidDatasResponse, paging paginator.Pagination, err error) { + var user *entity.Users + if authToken != nil && *authToken != "" { + user = utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, *authToken) + req.UserId = &user.ID + req.UserRoleId = &user.UserRoleId + req.UserLevelId = &user.UserLevelId + } results, paging, err := _i.Repo.GetAll(req) if err != nil { return diff --git a/app/module/user_role_accesses/repository/user_role_accesses.repository.go b/app/module/user_role_accesses/repository/user_role_accesses.repository.go index e2a22fd..4c8a038 100644 --- a/app/module/user_role_accesses/repository/user_role_accesses.repository.go +++ b/app/module/user_role_accesses/repository/user_role_accesses.repository.go @@ -16,6 +16,7 @@ type UserRoleAccessesRepository interface { GetAll(req request.UserRoleAccessesQueryRequest) (userRoleAccessess []*entity.UserRoleAccesses, paging paginator.Pagination, err error) FindOne(id uint) (userRoleAccesses *entity.UserRoleAccesses, err error) Create(userRoleAccesses *entity.UserRoleAccesses) (err error) + CreateAll(userRoleAccesses *[]entity.UserRoleAccesses) (err error) Update(id uint, userRoleAccesses *entity.UserRoleAccesses) (err error) Delete(id uint) (err error) } @@ -66,6 +67,10 @@ func (_i *userRoleAccessesRepository) Create(userRoleAccesses *entity.UserRoleAc return _i.DB.DB.Create(userRoleAccesses).Error } +func (_i *userRoleAccessesRepository) CreateAll(userRoleAccesses *[]entity.UserRoleAccesses) (err error) { + return _i.DB.DB.Create(userRoleAccesses).Error +} + func (_i *userRoleAccessesRepository) Update(id uint, userRoleAccesses *entity.UserRoleAccesses) (err error) { return _i.DB.DB.Model(&entity.UserRoleAccesses{}). Where(&entity.UserRoleAccesses{ID: id}). diff --git a/app/module/user_role_accesses/request/user_role_accesses.request.go b/app/module/user_role_accesses/request/user_role_accesses.request.go index f4d7ac5..4489a2d 100644 --- a/app/module/user_role_accesses/request/user_role_accesses.request.go +++ b/app/module/user_role_accesses/request/user_role_accesses.request.go @@ -19,7 +19,6 @@ type UserRoleAccessesQueryRequest struct { } type UserRoleAccessesCreateRequest struct { - UserRoleId int `json:"userRoleId" validate:"required"` MenuId int `json:"menuId" validate:"required"` IsViewEnabled bool `json:"isViewEnabled" validate:"required"` IsInsertEnabled bool `json:"isInsertEnabled" validate:"required"` @@ -31,7 +30,6 @@ type UserRoleAccessesCreateRequest struct { func (req UserRoleAccessesCreateRequest) ToEntity() *entity.UserRoleAccesses { return &entity.UserRoleAccesses{ - UserRoleId: req.UserRoleId, MenuId: req.MenuId, IsViewEnabled: req.IsViewEnabled, IsInsertEnabled: req.IsInsertEnabled, @@ -44,7 +42,7 @@ func (req UserRoleAccessesCreateRequest) ToEntity() *entity.UserRoleAccesses { type UserRoleAccessesUpdateRequest struct { ID uint `json:"id" validate:"required"` - UserRoleId int `json:"user_role_id" validate:"required"` + UserRoleId uint `json:"user_role_id" validate:"required"` MenuId int `json:"menu_id" validate:"required"` IsViewEnabled bool `json:"is_view_enabled" validate:"required"` IsInsertEnabled bool `json:"is_insert_enabled" validate:"required"` diff --git a/app/module/user_role_accesses/response/user_role_accesses.response.go b/app/module/user_role_accesses/response/user_role_accesses.response.go index 8dc53a3..c9d0f70 100644 --- a/app/module/user_role_accesses/response/user_role_accesses.response.go +++ b/app/module/user_role_accesses/response/user_role_accesses.response.go @@ -4,7 +4,7 @@ import "time" type UserRoleAccessesResponse struct { ID uint `json:"id"` - UserRoleId int `json:"user_role_id"` + UserRoleId uint `json:"user_role_id"` MenuId int `json:"menu_id"` IsViewEnabled bool `json:"is_view_enabled"` IsInsertEnabled bool `json:"is_insert_enabled"` diff --git a/app/module/user_roles/repository/user_roles.repository.go b/app/module/user_roles/repository/user_roles.repository.go index 8b5308a..a11e31c 100644 --- a/app/module/user_roles/repository/user_roles.repository.go +++ b/app/module/user_roles/repository/user_roles.repository.go @@ -17,9 +17,9 @@ type userRolesRepository struct { // UserRolesRepository define interface of IUserRolesRepository type UserRolesRepository interface { - GetAll(req request.UserRolesQueryRequest) (userRoless []*entity.UserRoles, paging paginator.Pagination, err error) + GetAll(req request.UserRolesQueryRequest) (userRoles []*entity.UserRoles, paging paginator.Pagination, err error) FindOne(id uint) (userRoles *entity.UserRoles, err error) - Create(userRoles *entity.UserRoles) (err error) + Create(userRoles *entity.UserRoles) (userRolesReturn *entity.UserRoles, err error) Update(id uint, userRoles *entity.UserRoles) (err error) Delete(id uint) (err error) } @@ -32,7 +32,7 @@ func NewUserRolesRepository(db *database.Database, log zerolog.Logger) UserRoles } // implement interface of IUserRolesRepository -func (_i *userRolesRepository) GetAll(req request.UserRolesQueryRequest) (userRoless []*entity.UserRoles, paging paginator.Pagination, err error) { +func (_i *userRolesRepository) GetAll(req request.UserRolesQueryRequest) (userRoles []*entity.UserRoles, paging paginator.Pagination, err error) { _i.Log.Info().Interface("data", req).Msg("") var count int64 @@ -66,7 +66,7 @@ func (_i *userRolesRepository) GetAll(req request.UserRolesQueryRequest) (userRo req.Pagination.Count = count req.Pagination = paginator.Paging(req.Pagination) - err = query.Offset(req.Pagination.Offset).Limit(req.Pagination.Limit).Find(&userRoless).Error + err = query.Offset(req.Pagination.Offset).Limit(req.Pagination.Limit).Find(&userRoles).Error if err != nil { return } @@ -84,8 +84,9 @@ func (_i *userRolesRepository) FindOne(id uint) (userRoles *entity.UserRoles, er return userRoles, nil } -func (_i *userRolesRepository) Create(userRoles *entity.UserRoles) (err error) { - return _i.DB.DB.Create(userRoles).Error +func (_i *userRolesRepository) Create(userRoles *entity.UserRoles) (userRolesReturn *entity.UserRoles, err error) { + result := _i.DB.DB.Create(userRoles) + return userRoles, result.Error } func (_i *userRolesRepository) Update(id uint, userRoles *entity.UserRoles) (err error) { diff --git a/app/module/user_roles/request/user_roles.request.go b/app/module/user_roles/request/user_roles.request.go index acafa22..4ffc798 100644 --- a/app/module/user_roles/request/user_roles.request.go +++ b/app/module/user_roles/request/user_roles.request.go @@ -2,6 +2,7 @@ package request import ( "go-humas-be/app/database/entity" + userRoleAccessReq "go-humas-be/app/module/user_role_accesses/request" "go-humas-be/utils/paginator" "strconv" "time" @@ -21,11 +22,12 @@ type UserRolesQueryRequest struct { } type UserRolesCreateRequest struct { - Name string `json:"name" validate:"required"` - Description string `json:"description" validate:"required"` - Code string `json:"code" validate:"required"` - UserLevelId uint `json:"userLevelId" validate:"required"` - StatusId int `json:"statusId" validate:"required"` + Name string `json:"name" validate:"required"` + Description string `json:"description" validate:"required"` + Code string `json:"code" validate:"required"` + UserLevelId uint `json:"userLevelId" validate:"required"` + UserRoleAccess []userRoleAccessReq.UserRoleAccessesCreateRequest `json:"userRoleAccess" validate:"required"` + StatusId int `json:"statusId" validate:"required"` } func (req UserRolesCreateRequest) ToEntity() *entity.UserRoles { diff --git a/app/module/user_roles/service/user_roles.service.go b/app/module/user_roles/service/user_roles.service.go index 7830168..31a1ff6 100644 --- a/app/module/user_roles/service/user_roles.service.go +++ b/app/module/user_roles/service/user_roles.service.go @@ -2,7 +2,9 @@ package service import ( "github.com/rs/zerolog" + "go-humas-be/app/database/entity" userLevelsRepository "go-humas-be/app/module/user_levels/repository" + userRoleAccessRepository "go-humas-be/app/module/user_role_accesses/repository" userRoleLevelDetailsRepository "go-humas-be/app/module/user_role_level_details/repository" "go-humas-be/app/module/user_roles/mapper" "go-humas-be/app/module/user_roles/repository" @@ -19,6 +21,7 @@ type userRolesService struct { UsersRepo usersRepository.UsersRepository UserLevelsRepo userLevelsRepository.UserLevelsRepository UserRoleLevelDetailsRepo userRoleLevelDetailsRepository.UserRoleLevelDetailsRepository + UserRoleAccessRepo userRoleAccessRepository.UserRoleAccessesRepository Log zerolog.Logger } @@ -37,6 +40,7 @@ func NewUserRolesService( usersRepo usersRepository.UsersRepository, userLevelsRepo userLevelsRepository.UserLevelsRepository, userRoleLevelDetailsRepo userRoleLevelDetailsRepository.UserRoleLevelDetailsRepository, + userRoleAccessRepo userRoleAccessRepository.UserRoleAccessesRepository, log zerolog.Logger, ) UserRolesService { @@ -45,6 +49,7 @@ func NewUserRolesService( UsersRepo: usersRepo, UserLevelsRepo: userLevelsRepo, UserRoleLevelDetailsRepo: userRoleLevelDetailsRepo, + UserRoleAccessRepo: userRoleAccessRepo, Log: log, } } @@ -80,7 +85,29 @@ func (_i *userRolesService) Save(req request.UserRolesCreateRequest, authToken s createdBy := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken) newReq.CreatedById = &createdBy.ID - return _i.Repo.Create(newReq) + userRolesReturn, err := _i.Repo.Create(newReq) + if err == nil { + var userRoleAccessList []entity.UserRoleAccesses + for _, item := range req.UserRoleAccess { + userRoleAccess := entity.UserRoleAccesses{ + UserRoleId: userRolesReturn.ID, + MenuId: item.MenuId, + IsViewEnabled: item.IsViewEnabled, + IsInsertEnabled: item.IsInsertEnabled, + IsUpdateEnabled: item.IsUpdateEnabled, + IsDeleteEnabled: item.IsDeleteEnabled, + IsApprovalEnabled: item.IsApprovalEnabled, + IsAdminEnabled: item.IsAdminEnabled, + } + userRoleAccessList = append(userRoleAccessList, userRoleAccess) + } + err := _i.UserRoleAccessRepo.CreateAll(&userRoleAccessList) + if err != nil { + return err + } + } + + return err } func (_i *userRolesService) Update(id uint, req request.UserRolesUpdateRequest) (err error) { diff --git a/app/module/users/request/users.request.go b/app/module/users/request/users.request.go index 33b5178..30054ca 100644 --- a/app/module/users/request/users.request.go +++ b/app/module/users/request/users.request.go @@ -95,8 +95,9 @@ func (req UsersUpdateRequest) ToEntity() *entity.Users { } type UserLogin struct { - Username string `json:"username" validate:"required,lowercase"` - Password string `json:"password" validate:"required"` + Username *string `json:"username"` + Password *string `json:"password"` + RefreshToken *string `json:"refreshToken"` } type UsersQueryRequestContext struct { diff --git a/app/module/users/service/users.service.go b/app/module/users/service/users.service.go index 696b7aa..1355301 100644 --- a/app/module/users/service/users.service.go +++ b/app/module/users/service/users.service.go @@ -82,7 +82,12 @@ func (_i *usersService) Save(req request.UsersCreateRequest, authToken string) ( func (_i *usersService) Login(req request.UserLogin) (res *gocloak.JWT, err error) { _i.Log.Info().Interface("data", req).Msg("") - loginResponse, err := _i.Keycloak.Login(req.Username, req.Password) + var loginResponse *gocloak.JWT + if req.RefreshToken == nil { + loginResponse, err = _i.Keycloak.Login(*req.Username, *req.Password) + } else { + loginResponse, err = _i.Keycloak.RefreshToken(*req.RefreshToken) + } if err != nil { return nil, err } diff --git a/config/config/keycloak.config.go b/config/config/keycloak.config.go index fed9f9d..f02d442 100644 --- a/config/config/keycloak.config.go +++ b/config/config/keycloak.config.go @@ -37,6 +37,23 @@ func (_keycloak *KeycloakConfig) Login(username string, password string) (*goclo return loginResponse, nil } +func (_keycloak *KeycloakConfig) RefreshToken(refreshToken string) (*gocloak.JWT, error) { + ctx := context.Background() + client := gocloak.NewClient(_keycloak.Cfg.Keycloak.Endpoint) + loginResponse, err := client.RefreshToken( + ctx, + refreshToken, + _keycloak.Cfg.Keycloak.ClientId, + _keycloak.Cfg.Keycloak.ClientSecret, + _keycloak.Cfg.Keycloak.Realm, + ) + if err != nil { + return nil, errors.New("Invalid User Credentials") + } + + return loginResponse, nil +} + func (_keycloak *KeycloakConfig) CreateUser(fullname string, email string, username string, password string) (string, error) { ctx := context.Background() client := gocloak.NewClient(_keycloak.Cfg.Keycloak.Endpoint) diff --git a/docs/swagger/docs.go b/docs/swagger/docs.go index c8d47ce..71f21b7 100644 --- a/docs/swagger/docs.go +++ b/docs/swagger/docs.go @@ -7154,14 +7154,13 @@ const docTemplate = `{ }, "request.UserLogin": { "type": "object", - "required": [ - "password", - "username" - ], "properties": { "password": { "type": "string" }, + "refreshToken": { + "type": "string" + }, "username": { "type": "string" } @@ -7176,8 +7175,7 @@ const docTemplate = `{ "isInsertEnabled", "isUpdateEnabled", "isViewEnabled", - "menuId", - "userRoleId" + "menuId" ], "properties": { "isAdminEnabled": { @@ -7200,9 +7198,6 @@ const docTemplate = `{ }, "menuId": { "type": "integer" - }, - "userRoleId": { - "type": "integer" } } }, @@ -7256,7 +7251,8 @@ const docTemplate = `{ "description", "name", "statusId", - "userLevelId" + "userLevelId", + "userRoleAccess" ], "properties": { "code": { @@ -7273,6 +7269,12 @@ const docTemplate = `{ }, "userLevelId": { "type": "integer" + }, + "userRoleAccess": { + "type": "array", + "items": { + "$ref": "#/definitions/request.UserRoleAccessesCreateRequest" + } } } }, diff --git a/docs/swagger/swagger.json b/docs/swagger/swagger.json index 5d18308..2b16456 100644 --- a/docs/swagger/swagger.json +++ b/docs/swagger/swagger.json @@ -7143,14 +7143,13 @@ }, "request.UserLogin": { "type": "object", - "required": [ - "password", - "username" - ], "properties": { "password": { "type": "string" }, + "refreshToken": { + "type": "string" + }, "username": { "type": "string" } @@ -7165,8 +7164,7 @@ "isInsertEnabled", "isUpdateEnabled", "isViewEnabled", - "menuId", - "userRoleId" + "menuId" ], "properties": { "isAdminEnabled": { @@ -7189,9 +7187,6 @@ }, "menuId": { "type": "integer" - }, - "userRoleId": { - "type": "integer" } } }, @@ -7245,7 +7240,8 @@ "description", "name", "statusId", - "userLevelId" + "userLevelId", + "userRoleAccess" ], "properties": { "code": { @@ -7262,6 +7258,12 @@ }, "userLevelId": { "type": "integer" + }, + "userRoleAccess": { + "type": "array", + "items": { + "$ref": "#/definitions/request.UserRoleAccessesCreateRequest" + } } } }, diff --git a/docs/swagger/swagger.yaml b/docs/swagger/swagger.yaml index 6bdc1c6..d8f9f0e 100644 --- a/docs/swagger/swagger.yaml +++ b/docs/swagger/swagger.yaml @@ -362,11 +362,10 @@ definitions: properties: password: type: string + refreshToken: + type: string username: type: string - required: - - password - - username type: object request.UserRoleAccessesCreateRequest: properties: @@ -384,8 +383,6 @@ definitions: type: boolean menuId: type: integer - userRoleId: - type: integer required: - isAdminEnabled - isApprovalEnabled @@ -394,7 +391,6 @@ definitions: - isUpdateEnabled - isViewEnabled - menuId - - userRoleId type: object request.UserRoleAccessesUpdateRequest: properties: @@ -439,12 +435,17 @@ definitions: type: integer userLevelId: type: integer + userRoleAccess: + items: + $ref: '#/definitions/request.UserRoleAccessesCreateRequest' + type: array required: - code - description - name - statusId - userLevelId + - userRoleAccess type: object request.UserRolesUpdateRequest: properties: