61 lines
1.5 KiB
Go
61 lines
1.5 KiB
Go
package user
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"go.uber.org/zap"
|
|
|
|
"codeberg.org/mapleopentech/monorepo/cloud/maplepress-backend/internal/domain/user"
|
|
)
|
|
|
|
// DeleteUserUseCase handles user deletion operations
|
|
// Used as compensating transaction in SAGA pattern
|
|
type DeleteUserUseCase struct {
|
|
repo user.Repository
|
|
logger *zap.Logger
|
|
}
|
|
|
|
// ProvideDeleteUserUseCase creates a new DeleteUserUseCase for dependency injection
|
|
func ProvideDeleteUserUseCase(
|
|
repo user.Repository,
|
|
logger *zap.Logger,
|
|
) *DeleteUserUseCase {
|
|
return &DeleteUserUseCase{
|
|
repo: repo,
|
|
logger: logger.Named("delete-user-usecase"),
|
|
}
|
|
}
|
|
|
|
// Execute deletes a user by ID within a tenant
|
|
// This is used as a compensating transaction
|
|
//
|
|
// IMPORTANT: This operation must be idempotent!
|
|
func (uc *DeleteUserUseCase) Execute(ctx context.Context, tenantID, userID string) error {
|
|
uc.logger.Info("deleting user",
|
|
zap.String("tenant_id", tenantID),
|
|
zap.String("user_id", userID))
|
|
|
|
// Validate inputs
|
|
if tenantID == "" {
|
|
return fmt.Errorf("tenant ID cannot be empty")
|
|
}
|
|
if userID == "" {
|
|
return fmt.Errorf("user ID cannot be empty")
|
|
}
|
|
|
|
// Execute deletion using repository
|
|
if err := uc.repo.Delete(ctx, tenantID, userID); err != nil {
|
|
uc.logger.Error("failed to delete user",
|
|
zap.String("tenant_id", tenantID),
|
|
zap.String("user_id", userID),
|
|
zap.Error(err))
|
|
return fmt.Errorf("failed to delete user: %w", err)
|
|
}
|
|
|
|
uc.logger.Info("user deleted successfully",
|
|
zap.String("tenant_id", tenantID),
|
|
zap.String("user_id", userID))
|
|
|
|
return nil
|
|
}
|