fix projectflock approval with dto

This commit is contained in:
ragilap
2025-12-11 11:27:50 +07:00
parent 3ada837b8b
commit f60564d673
3 changed files with 117 additions and 81 deletions
+57 -58
View File
@@ -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).
@@ -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,
},
}) })
} }
@@ -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: