Multiple implementations of the same back-end application. The aim is to provide quick, side-by-side comparisons of different technologies (languages, frameworks, libraries) while preserving consistent business logic across all implementations.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

67 lines
2.1 KiB

package commands
import (
"context"
"fmt"
"autostore/internal/application/interfaces"
"autostore/internal/domain/specifications"
)
type HandleExpiredItemsCommand struct {
itemRepo interfaces.IItemRepository
orderService interfaces.IOrderService
timeProvider interfaces.ITimeProvider
expirationSpec *specifications.ItemExpirationSpec
logger interfaces.ILogger
}
func NewHandleExpiredItemsCommand(
itemRepo interfaces.IItemRepository,
orderService interfaces.IOrderService,
timeProvider interfaces.ITimeProvider,
expirationSpec *specifications.ItemExpirationSpec,
logger interfaces.ILogger,
) *HandleExpiredItemsCommand {
return &HandleExpiredItemsCommand{
itemRepo: itemRepo,
orderService: orderService,
timeProvider: timeProvider,
expirationSpec: expirationSpec,
logger: logger,
}
}
func (c *HandleExpiredItemsCommand) Execute(ctx context.Context) error {
c.logger.Info(ctx, "Starting expired items processing")
currentTime := c.timeProvider.Now()
expirationSpec := c.expirationSpec.GetSpec(currentTime)
expiredItems, err := c.itemRepo.FindWhere(ctx, expirationSpec)
if err != nil {
c.logger.Error(ctx, "Failed to find expired items", "error", err)
return fmt.Errorf("failed to find expired items: %w", err)
}
c.logger.Info(ctx, "Found expired items", "count", len(expiredItems))
for _, item := range expiredItems {
c.logger.Info(ctx, "Processing expired item", "item_id", item.GetID().String(), "item_name", item.GetName())
if err := c.orderService.OrderItem(ctx, item); err != nil {
c.logger.Error(ctx, "Failed to order replacement item", "item_id", item.GetID().String(), "error", err)
continue
}
if err := c.itemRepo.Delete(ctx, item.GetID()); err != nil {
c.logger.Error(ctx, "Failed to delete expired item", "item_id", item.GetID().String(), "error", err)
return fmt.Errorf("failed to delete expired item %s: %w", item.GetID().String(), err)
}
c.logger.Info(ctx, "Successfully processed expired item", "item_id", item.GetID().String())
}
c.logger.Info(ctx, "Completed expired items processing", "processed_count", len(expiredItems))
return nil
}