feat: fixing user role and user refreshToken

This commit is contained in:
hanif salafi 2024-05-12 17:09:54 +07:00
parent 940773ae35
commit d8c994d958
15 changed files with 119 additions and 54 deletions

View File

@ -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"`

View File

@ -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
}

View File

@ -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) {
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)
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

View File

@ -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}).

View File

@ -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"`

View File

@ -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"`

View File

@ -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) {

View File

@ -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"
@ -25,6 +26,7 @@ type UserRolesCreateRequest struct {
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"`
}

View File

@ -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) {

View File

@ -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 {

View File

@ -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
}

View File

@ -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)

View File

@ -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"
}
}
}
},

View File

@ -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"
}
}
}
},

View File

@ -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: