monorepo/cloud/maplepress-backend/internal/usecase/user/delete.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
}