mirror of
https://gitlab.com/mbugroup/lti-api.git
synced 2026-05-23 23:05:44 +00:00
fix projectflock approval with dto
This commit is contained in:
+57
-58
@@ -4,7 +4,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
// "gitlab.com/mbugroup/lti-api.git/internal/config"
|
"gitlab.com/mbugroup/lti-api.git/internal/config"
|
||||||
entity "gitlab.com/mbugroup/lti-api.git/internal/entities"
|
entity "gitlab.com/mbugroup/lti-api.git/internal/entities"
|
||||||
"gitlab.com/mbugroup/lti-api.git/internal/modules/sso/session"
|
"gitlab.com/mbugroup/lti-api.git/internal/modules/sso/session"
|
||||||
service "gitlab.com/mbugroup/lti-api.git/internal/modules/users/services"
|
service "gitlab.com/mbugroup/lti-api.git/internal/modules/users/services"
|
||||||
@@ -31,65 +31,65 @@ type AuthContext struct {
|
|||||||
// fine-grained authorization using the SSO access token scopes.
|
// fine-grained authorization using the SSO access token scopes.
|
||||||
func Auth(userService service.UserService, requiredScopes ...string) fiber.Handler {
|
func Auth(userService service.UserService, requiredScopes ...string) fiber.Handler {
|
||||||
return func(c *fiber.Ctx) error {
|
return func(c *fiber.Ctx) error {
|
||||||
// token := bearerToken(c)
|
token := bearerToken(c)
|
||||||
// if token == "" {
|
if token == "" {
|
||||||
// token = strings.TrimSpace(c.Cookies(config.SSOAccessCookieName))
|
token = strings.TrimSpace(c.Cookies(config.SSOAccessCookieName))
|
||||||
// }
|
}
|
||||||
// if token == "" {
|
if token == "" {
|
||||||
// return fiber.NewError(fiber.StatusUnauthorized, "Please authenticate")
|
return fiber.NewError(fiber.StatusUnauthorized, "Please authenticate")
|
||||||
// }
|
}
|
||||||
|
|
||||||
// verification, err := sso.VerifyAccessToken(token)
|
verification, err := sso.VerifyAccessToken(token)
|
||||||
// if err != nil {
|
if err != nil {
|
||||||
// utils.Log.WithError(err).Warn("auth: token verification failed")
|
utils.Log.WithError(err).Warn("auth: token verification failed")
|
||||||
// return fiber.NewError(fiber.StatusUnauthorized, "Please authenticate")
|
return fiber.NewError(fiber.StatusUnauthorized, "Please authenticate")
|
||||||
// }
|
}
|
||||||
|
|
||||||
// if verification.UserID == 0 {
|
if verification.UserID == 0 {
|
||||||
// return fiber.NewError(fiber.StatusForbidden, "Service authentication is not permitted for this endpoint")
|
return fiber.NewError(fiber.StatusForbidden, "Service authentication is not permitted for this endpoint")
|
||||||
// }
|
}
|
||||||
|
|
||||||
// if err := ensureNotRevoked(c, token, verification); err != nil {
|
if err := ensureNotRevoked(c, token, verification); err != nil {
|
||||||
// return err
|
return err
|
||||||
// }
|
}
|
||||||
|
|
||||||
// user, err := userService.GetBySSOUserID(c, verification.UserID)
|
user, err := userService.GetBySSOUserID(c, verification.UserID)
|
||||||
// if err != nil || user == nil {
|
if err != nil || user == nil {
|
||||||
// utils.Log.WithError(err).Warn("auth: failed to resolve user from repository")
|
utils.Log.WithError(err).Warn("auth: failed to resolve user from repository")
|
||||||
// return fiber.NewError(fiber.StatusUnauthorized, "Please authenticate")
|
return fiber.NewError(fiber.StatusUnauthorized, "Please authenticate")
|
||||||
// }
|
}
|
||||||
|
|
||||||
// if len(requiredScopes) > 0 {
|
if len(requiredScopes) > 0 {
|
||||||
// if verification.Claims == nil || !hasAllScopes(verification.Claims.Scopes(), requiredScopes) {
|
if verification.Claims == nil || !hasAllScopes(verification.Claims.Scopes(), requiredScopes) {
|
||||||
// return fiber.NewError(fiber.StatusForbidden, "Insufficient scope")
|
return fiber.NewError(fiber.StatusForbidden, "Insufficient scope")
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
|
|
||||||
// var roles []sso.Role
|
var roles []sso.Role
|
||||||
// permissions := make(map[string]struct{})
|
permissions := make(map[string]struct{})
|
||||||
// if verification.UserID != 0 {
|
if verification.UserID != 0 {
|
||||||
// if profile, err := sso.FetchProfile(c.Context(), token, verification); err != nil {
|
if profile, err := sso.FetchProfile(c.Context(), token, verification); err != nil {
|
||||||
// utils.Log.WithError(err).Warn("auth: failed to fetch sso profile")
|
utils.Log.WithError(err).Warn("auth: failed to fetch sso profile")
|
||||||
// } else if profile != nil {
|
} else if profile != nil {
|
||||||
// roles = profile.Roles
|
roles = profile.Roles
|
||||||
// for _, perm := range profile.PermissionNames() {
|
for _, perm := range profile.PermissionNames() {
|
||||||
// if perm != "" {
|
if perm != "" {
|
||||||
// permissions[perm] = struct{}{}
|
permissions[perm] = struct{}{}
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
|
|
||||||
// ctx := &AuthContext{
|
ctx := &AuthContext{
|
||||||
// Token: token,
|
Token: token,
|
||||||
// Verification: verification,
|
Verification: verification,
|
||||||
// User: user,
|
User: user,
|
||||||
// Roles: roles,
|
Roles: roles,
|
||||||
// Permissions: permissions,
|
Permissions: permissions,
|
||||||
// }
|
}
|
||||||
|
|
||||||
// c.Locals(authContextLocalsKey, ctx)
|
c.Locals(authContextLocalsKey, ctx)
|
||||||
// c.Locals(authUserLocalsKey, user)
|
c.Locals(authUserLocalsKey, user)
|
||||||
return c.Next()
|
return c.Next()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -104,12 +104,11 @@ func AuthenticatedUser(c *fiber.Ctx) (*entity.User, bool) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func ActorIDFromContext(c *fiber.Ctx) (uint, error) {
|
func ActorIDFromContext(c *fiber.Ctx) (uint, error) {
|
||||||
// user, ok := AuthenticatedUser(c)
|
user, ok := AuthenticatedUser(c)
|
||||||
// if !ok || user == nil || user.Id == 0 {
|
if !ok || user == nil || user.Id == 0 {
|
||||||
// return 0, fiber.NewError(fiber.StatusUnauthorized, "Please authenticate")
|
return 0, fiber.NewError(fiber.StatusUnauthorized, "Please authenticate")
|
||||||
// }
|
}
|
||||||
// return user.Id, nil
|
return user.Id, nil
|
||||||
return 1, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// AuthDetails returns the full authentication context (token, claims, user).
|
// AuthDetails returns the full authentication context (token, claims, user).
|
||||||
|
|||||||
+11
-2
@@ -101,13 +101,22 @@ func (u *ProjectFlockKandangController) Closing(c *fiber.Ctx) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
detail, availableQtys, productWarehouses, err := u.ProjectFlockKandangService.GetOne(c, result.Id)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
detailDTO := dto.ToProjectFlockKandangDetailDTOWithAvailableQty(*detail, availableQtys, productWarehouses)
|
||||||
|
|
||||||
return c.Status(fiber.StatusOK).
|
return c.Status(fiber.StatusOK).
|
||||||
JSON(response.Success{
|
JSON(response.Success{
|
||||||
Code: fiber.StatusOK,
|
Code: fiber.StatusOK,
|
||||||
Status: "success",
|
Status: "success",
|
||||||
Message: "Status closing kandang diperbarui",
|
Message: "Status closing kandang diperbarui",
|
||||||
// Data: dto.ProjectFlockKandangDetailDTO(*result),
|
Data: fiber.Map{
|
||||||
Data: result,
|
"detail": detailDTO,
|
||||||
|
"approval": detailDTO.Approval,
|
||||||
|
},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+49
-21
@@ -432,16 +432,30 @@ func (s projectFlockKandangService) Closing(c *fiber.Ctx, id uint, req *validati
|
|||||||
}
|
}
|
||||||
if s.ApprovalSvc != nil {
|
if s.ApprovalSvc != nil {
|
||||||
closeAction := entity.ApprovalActionApproved
|
closeAction := entity.ApprovalActionApproved
|
||||||
if _, aerr := s.ApprovalSvc.CreateApproval(
|
// Hindari duplikasi jika approval terakhir sudah Closed + Approved
|
||||||
c.Context(),
|
latestPFK, lerr := s.ApprovalSvc.LatestByTarget(c.Context(), utils.ApprovalWorkflowProjectFlockKandang, id, nil)
|
||||||
utils.ApprovalWorkflowProjectFlockKandang,
|
if lerr != nil {
|
||||||
id,
|
return nil, lerr
|
||||||
utils.ProjectFlockKandangStepClosed,
|
}
|
||||||
&closeAction,
|
shouldCreate := true
|
||||||
actorID,
|
if latestPFK != nil &&
|
||||||
nil,
|
latestPFK.StepNumber == uint16(utils.ProjectFlockKandangStepClosed) &&
|
||||||
); aerr != nil {
|
latestPFK.Action != nil && *latestPFK.Action == closeAction {
|
||||||
return nil, aerr
|
shouldCreate = false
|
||||||
|
}
|
||||||
|
|
||||||
|
if shouldCreate {
|
||||||
|
if _, aerr := s.ApprovalSvc.CreateApproval(
|
||||||
|
c.Context(),
|
||||||
|
utils.ApprovalWorkflowProjectFlockKandang,
|
||||||
|
id,
|
||||||
|
utils.ProjectFlockKandangStepClosed,
|
||||||
|
&closeAction,
|
||||||
|
actorID,
|
||||||
|
nil,
|
||||||
|
); aerr != nil {
|
||||||
|
return nil, aerr
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Jika semua kandang dalam project sudah ditutup, set approval project flock ke SELESAI.
|
// Jika semua kandang dalam project sudah ditutup, set approval project flock ke SELESAI.
|
||||||
@@ -500,17 +514,31 @@ func (s projectFlockKandangService) Closing(c *fiber.Ctx, id uint, req *validati
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if s.ApprovalSvc != nil {
|
if s.ApprovalSvc != nil {
|
||||||
reopenAction := entity.ApprovalActionApproved
|
reopenAction := entity.ApprovalActionUpdated
|
||||||
if _, aerr := s.ApprovalSvc.CreateApproval(
|
// Hindari duplikasi jika approval terakhir sudah Disetujui + Updated
|
||||||
c.Context(),
|
latestPFK, lerr := s.ApprovalSvc.LatestByTarget(c.Context(), utils.ApprovalWorkflowProjectFlockKandang, id, nil)
|
||||||
utils.ApprovalWorkflowProjectFlockKandang,
|
if lerr != nil {
|
||||||
id,
|
return nil, lerr
|
||||||
utils.ProjectFlockKandangStepDisetujui,
|
}
|
||||||
&reopenAction,
|
shouldCreate := true
|
||||||
actorID,
|
if latestPFK != nil &&
|
||||||
nil,
|
latestPFK.StepNumber == uint16(utils.ProjectFlockKandangStepDisetujui) &&
|
||||||
); aerr != nil && !errors.Is(aerr, gorm.ErrDuplicatedKey) {
|
latestPFK.Action != nil && *latestPFK.Action == reopenAction {
|
||||||
return nil, aerr
|
shouldCreate = false
|
||||||
|
}
|
||||||
|
|
||||||
|
if shouldCreate {
|
||||||
|
if _, aerr := s.ApprovalSvc.CreateApproval(
|
||||||
|
c.Context(),
|
||||||
|
utils.ApprovalWorkflowProjectFlockKandang,
|
||||||
|
id,
|
||||||
|
utils.ProjectFlockKandangStepDisetujui,
|
||||||
|
&reopenAction,
|
||||||
|
actorID,
|
||||||
|
nil,
|
||||||
|
); aerr != nil && !errors.Is(aerr, gorm.ErrDuplicatedKey) {
|
||||||
|
return nil, aerr
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
|||||||
Reference in New Issue
Block a user