Files
api-antrian-operasi/internal/domain/access/handler.go
2026-02-25 09:10:25 +07:00

107 lines
2.6 KiB
Go

package access
import (
"antrian-operasi/internal/shared"
"github.com/gin-gonic/gin"
)
type AccessHandler struct {
repo IAccessRepository
}
func NewAccessHandler(repo IAccessRepository) AccessHandler {
return AccessHandler{repo}
}
// SyncKeycloakRole godoc
// @Summary Sync Keycloak Role
// @Tags Access Role
// @Param body body SyncKeycloakRoleRequest true "Sync Keycloak Role"
// @Success 200 {object} shared.BaseResponse
// @Failure 500 {object} shared.BaseErrorResponse
// @Router /access/sync-keycloak-role [post]
func (h AccessHandler) SyncKeycloakRole(c *gin.Context) {
var req SyncKeycloakRoleRequest
//bind json body
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(400, shared.BaseErrorResponse{
Success: false,
Code: 400,
Message: "error bind json",
Errors: shared.ValidationError(err),
})
return
}
//check user role exist
users, err := h.repo.FindUserByKeycloakId(c, req.KeycloakId)
if err != nil {
errMessage := []string{err.Error()}
c.JSON(500, shared.BaseErrorResponse{
Success: false,
Code: 500,
Message: "error finding user by keycloak id",
Errors: errMessage,
})
return
}
//if not exist, create user & permission
if len(users) == 0 {
err = h.repo.CreateUserPermission(c, req)
} else { //if exist, update role permission
userId := users[0].ID
err = h.repo.UpdateUserPermission(c, userId, req)
}
if err != nil {
errMessage := []string{err.Error()}
c.JSON(500, shared.BaseErrorResponse{
Success: false,
Code: 500,
Message: "update / insert permission error",
Errors: errMessage,
})
return
}
c.JSON(200, shared.BaseResponse[SyncKeycloakRoleRequest]{
Success: true,
Code: 200,
Message: "success sync role",
Data: req,
})
}
// GetPageByKeycloakId godoc
// @Summary Get Pages By Keycloak Id
// @Tags Access Role
// @Param keycloak_id query string true "Keycloak ID"
// @Success 200 {object} shared.BaseResponse
// @Failure 500 {object} shared.BaseErrorResponse
// @Router /access/eligible-menu [get]
func (h AccessHandler) GetPageByKeycloakId(c *gin.Context) {
keycloakId := c.Query("keycloak_id")
pageResult, err := h.repo.GetAvailablePageByKeycloakId(c, keycloakId)
if err != nil {
errMessage := []string{err.Error()}
c.JSON(500, shared.BaseErrorResponse{
Success: false,
Code: 500,
Message: "error fetch page by keycloak id",
Errors: errMessage,
})
return
}
c.JSON(200, shared.BaseResponse[[]AvailableMenuResponse]{
Success: true,
Code: 200,
Message: "success fetch eligible page",
Data: MapMenuModelToResponse(pageResult),
})
}