feat: enhance aisle service with logging and audit trail integration

This commit is contained in:
Habib Fatkhul Rohman 2025-12-03 15:10:51 +07:00
parent cf51d7f0c9
commit e6c025f675
3 changed files with 103 additions and 67 deletions

View File

@ -3,7 +3,9 @@ package dto
import ( import (
"errors" "errors"
"github.com/Caknoooo/go-gin-clean-starter/database/entities"
pkgdto "github.com/Caknoooo/go-gin-clean-starter/pkg/dto" pkgdto "github.com/Caknoooo/go-gin-clean-starter/pkg/dto"
"github.com/google/uuid"
) )
const ( const (
@ -75,3 +77,48 @@ type AisleResponse struct {
WeightUom pkgdto.IdNameResponse `json:"weight_uom_id"` WeightUom pkgdto.IdNameResponse `json:"weight_uom_id"`
Client pkgdto.IdNameResponse `json:"client_id"` Client pkgdto.IdNameResponse `json:"client_id"`
} }
func ToAisleResponse(e entities.MAisleEntity) AisleResponse {
zona := pkgdto.IdNameResponse{}
if e.Zona.ID != uuid.Nil {
zona.ID = e.Zona.ID.String()
zona.Name = e.Zona.Name
}
dimUom := pkgdto.IdNameResponse{}
if e.DimUom.ID != uuid.Nil {
dimUom.ID = e.DimUom.ID.String()
dimUom.Name = e.DimUom.Name
}
weightUom := pkgdto.IdNameResponse{}
if e.WeightUom.ID != uuid.Nil {
weightUom.ID = e.WeightUom.ID.String()
weightUom.Name = e.WeightUom.Name
}
client := pkgdto.IdNameResponse{}
if e.Client.ID != uuid.Nil {
client.ID = e.Client.ID.String()
client.Name = e.Client.Name
}
return AisleResponse{
ID: e.ID.String(),
Code: e.Code,
Name: e.Name,
IsleX: e.IsleX,
BinY: e.BinY,
LevelZ: e.LevelZ,
DimLength: e.DimLength,
DimWidth: e.DimWidth,
DimHeight: e.DimHeight,
Weight: e.Weight,
QrCodeAisle: e.QrCodeAisle,
IsActive: e.IsActive,
Zone: zona,
DimUom: dimUom,
WeightUom: weightUom,
Client: client,
}
}

View File

@ -7,8 +7,10 @@ import (
"github.com/Caknoooo/go-gin-clean-starter/modules/aisle/dto" "github.com/Caknoooo/go-gin-clean-starter/modules/aisle/dto"
"github.com/Caknoooo/go-gin-clean-starter/modules/aisle/query" "github.com/Caknoooo/go-gin-clean-starter/modules/aisle/query"
"github.com/Caknoooo/go-gin-clean-starter/modules/aisle/repository" "github.com/Caknoooo/go-gin-clean-starter/modules/aisle/repository"
pkgdto "github.com/Caknoooo/go-gin-clean-starter/pkg/dto" "github.com/Caknoooo/go-gin-clean-starter/pkg/constants"
"github.com/Caknoooo/go-gin-clean-starter/pkg/utils"
"github.com/google/uuid" "github.com/google/uuid"
"github.com/sirupsen/logrus"
"gorm.io/gorm" "gorm.io/gorm"
) )
@ -23,51 +25,7 @@ type AisleService interface {
type aisleService struct { type aisleService struct {
db *gorm.DB db *gorm.DB
aisleRepo repository.AisleRepository aisleRepo repository.AisleRepository
} log *logrus.Logger
func toAisleResponse(e entities.MAisleEntity) dto.AisleResponse {
zona := pkgdto.IdNameResponse{}
if e.Zona.ID != uuid.Nil {
zona.ID = e.Zona.ID.String()
zona.Name = e.Zona.Name
}
dimUom := pkgdto.IdNameResponse{}
if e.DimUom.ID != uuid.Nil {
dimUom.ID = e.DimUom.ID.String()
dimUom.Name = e.DimUom.Name
}
weightUom := pkgdto.IdNameResponse{}
if e.WeightUom.ID != uuid.Nil {
weightUom.ID = e.WeightUom.ID.String()
weightUom.Name = e.WeightUom.Name
}
client := pkgdto.IdNameResponse{}
if e.Client.ID != uuid.Nil {
client.ID = e.Client.ID.String()
client.Name = e.Client.Name
}
return dto.AisleResponse{
ID: e.ID.String(),
Code: e.Code,
Name: e.Name,
IsleX: e.IsleX,
BinY: e.BinY,
LevelZ: e.LevelZ,
DimLength: e.DimLength,
DimWidth: e.DimWidth,
DimHeight: e.DimHeight,
Weight: e.Weight,
QrCodeAisle: e.QrCodeAisle,
IsActive: e.IsActive,
Zone: zona,
DimUom: dimUom,
WeightUom: weightUom,
Client: client,
}
} }
func (s *aisleService) Create(ctx context.Context, req dto.AisleCreateRequest) (dto.AisleResponse, error) { func (s *aisleService) Create(ctx context.Context, req dto.AisleCreateRequest) (dto.AisleResponse, error) {
@ -98,21 +56,22 @@ func (s *aisleService) Create(ctx context.Context, req dto.AisleCreateRequest) (
return dto.AisleResponse{}, err return dto.AisleResponse{}, err
} }
aisle := entities.MAisleEntity{ aisle := entities.MAisleEntity{
Code: req.Code, Code: req.Code,
Name: req.Name, Name: req.Name,
IsleX: req.IsleX, IsleX: req.IsleX,
BinY: req.BinY, BinY: req.BinY,
LevelZ: req.LevelZ, LevelZ: req.LevelZ,
DimLength: req.DimLength, DimLength: req.DimLength,
DimWidth: req.DimWidth, DimWidth: req.DimWidth,
DimHeight: req.DimHeight, DimHeight: req.DimHeight,
Weight: req.Weight, Weight: req.Weight,
QrCodeAisle: req.QrCodeAisle, QrCodeAisle: req.QrCodeAisle,
IsActive: req.IsActive, IsActive: req.IsActive,
ZoneID: zoneUUID, ZoneID: zoneUUID,
DimUomID: dimUomUUID, DimUomID: dimUomUUID,
WeightUomID: weightUomUUID, WeightUomID: weightUomUUID,
ClientID: clientUUID, ClientID: clientUUID,
FullAuditTrail: utils.FillAuditTrail(ctx, constants.CREATE),
} }
created, err := s.aisleRepo.Create(ctx, tx, aisle) created, err := s.aisleRepo.Create(ctx, tx, aisle)
if err != nil { if err != nil {
@ -124,7 +83,13 @@ func (s *aisleService) Create(ctx context.Context, req dto.AisleCreateRequest) (
if err != nil { if err != nil {
return dto.AisleResponse{}, err return dto.AisleResponse{}, err
} }
return toAisleResponse(result), nil s.log.WithFields(logrus.Fields{
"user_id": utils.GetUserID(ctx),
"action": "create",
"entity": "aisle",
"entity_id": created.ID.String(),
}).Info("Aisle created")
return dto.ToAisleResponse(result), nil
} }
func (s *aisleService) GetById(ctx context.Context, aisleId string) (dto.AisleResponse, error) { func (s *aisleService) GetById(ctx context.Context, aisleId string) (dto.AisleResponse, error) {
@ -132,7 +97,7 @@ func (s *aisleService) GetById(ctx context.Context, aisleId string) (dto.AisleRe
if err != nil { if err != nil {
return dto.AisleResponse{}, err return dto.AisleResponse{}, err
} }
return toAisleResponse(aisle), nil return dto.ToAisleResponse(aisle), nil
} }
func (s *aisleService) GetAll(ctx context.Context, filter query.AisleFilter) ([]dto.AisleResponse, int64, error) { func (s *aisleService) GetAll(ctx context.Context, filter query.AisleFilter) ([]dto.AisleResponse, int64, error) {
@ -142,7 +107,7 @@ func (s *aisleService) GetAll(ctx context.Context, filter query.AisleFilter) ([]
} }
var responses []dto.AisleResponse var responses []dto.AisleResponse
for _, e := range aisles { for _, e := range aisles {
responses = append(responses, toAisleResponse(e)) responses = append(responses, dto.ToAisleResponse(e))
} }
if responses == nil { if responses == nil {
responses = make([]dto.AisleResponse, 0) responses = make([]dto.AisleResponse, 0)
@ -193,6 +158,7 @@ func (s *aisleService) Update(ctx context.Context, req dto.AisleUpdateRequest, a
aisle.QrCodeAisle = req.QrCodeAisle aisle.QrCodeAisle = req.QrCodeAisle
} }
aisle.IsActive = req.IsActive aisle.IsActive = req.IsActive
aisle.FullAuditTrail = utils.FillAuditTrail(ctx, constants.UPDATE)
updated, err := s.aisleRepo.Update(ctx, tx, aisle) updated, err := s.aisleRepo.Update(ctx, tx, aisle)
if err != nil { if err != nil {
tx.Rollback() tx.Rollback()
@ -203,7 +169,13 @@ func (s *aisleService) Update(ctx context.Context, req dto.AisleUpdateRequest, a
if err != nil { if err != nil {
return dto.AisleResponse{}, err return dto.AisleResponse{}, err
} }
return toAisleResponse(result), nil s.log.WithFields(logrus.Fields{
"user_id": utils.GetUserID(ctx),
"action": "update",
"entity": "aisle",
"entity_id": aisleId,
}).Info("Aisle updated")
return dto.ToAisleResponse(result), nil
} }
func (s *aisleService) Delete(ctx context.Context, aisleId string) error { func (s *aisleService) Delete(ctx context.Context, aisleId string) error {
@ -213,17 +185,34 @@ func (s *aisleService) Delete(ctx context.Context, aisleId string) error {
tx.Rollback() tx.Rollback()
} }
}() }()
aisle, err := s.aisleRepo.GetById(ctx, tx, aisleId)
if err != nil {
tx.Rollback()
return err
}
aisle.FullAuditTrail = utils.FillAuditTrail(ctx, constants.DELETE)
if _, err := s.aisleRepo.Update(ctx, tx, aisle); err != nil {
tx.Rollback()
return err
}
if err := s.aisleRepo.Delete(ctx, tx, aisleId); err != nil { if err := s.aisleRepo.Delete(ctx, tx, aisleId); err != nil {
tx.Rollback() tx.Rollback()
return err return err
} }
tx.Commit() tx.Commit()
s.log.WithFields(logrus.Fields{
"user_id": utils.GetUserID(ctx),
"action": "delete",
"entity": "aisle",
"entity_id": aisleId,
}).Info("Aisle deleted")
return nil return nil
} }
func NewAisleService(aisleRepo repository.AisleRepository, db *gorm.DB) AisleService { func NewAisleService(aisleRepo repository.AisleRepository, db *gorm.DB, log *logrus.Logger) AisleService {
return &aisleService{ return &aisleService{
aisleRepo: aisleRepo, aisleRepo: aisleRepo,
db: db, db: db,
log: log,
} }
} }

View File

@ -186,7 +186,7 @@ func RegisterDependencies(injector *do.Injector) {
mvendorServ := mvendorService.NewVendorService(mvendorRepository, sequenceServ, db, log) mvendorServ := mvendorService.NewVendorService(mvendorRepository, sequenceServ, db, log)
warehouseServ := warehouseService.NewWarehouseService(warehouseRepository, db, log) warehouseServ := warehouseService.NewWarehouseService(warehouseRepository, db, log)
zonaServ := zonaService.NewZonaService(zonaRepository, db, log) zonaServ := zonaService.NewZonaService(zonaRepository, db, log)
aisleServ := aisleService.NewAisleService(aisleRepository, db) aisleServ := aisleService.NewAisleService(aisleRepository, db, log)
inventoryReceiptServ := inventoryReceiptService.NewInventoryReceiptService(db, inventoryReceiptRepository, inventoryReceiptLineRepository, productRepository, uomRepository, inventoryStorageRepository, sequenceServ) inventoryReceiptServ := inventoryReceiptService.NewInventoryReceiptService(db, inventoryReceiptRepository, inventoryReceiptLineRepository, productRepository, uomRepository, inventoryStorageRepository, sequenceServ)
assignmentServ := assignmentService.NewAssignmentService(db, assignmentRepository, assignmentUserRepository) assignmentServ := assignmentService.NewAssignmentService(db, assignmentRepository, assignmentUserRepository)
inventoryRequestServ := inventoryRequestService.NewInventoryRequestService(db, inventoryRequestRepository, inventoryRequestLineRepository, sequenceServ) inventoryRequestServ := inventoryRequestService.NewInventoryRequestService(db, inventoryRequestRepository, inventoryRequestLineRepository, sequenceServ)