Initial commit: Open sourcing all of the Maple Open Technologies code.

This commit is contained in:
Bartlomiej Mika 2025-12-02 14:33:08 -05:00
commit 755d54a99d
2010 changed files with 448675 additions and 0 deletions

View file

@ -0,0 +1,91 @@
package user
import (
"context"
"go.uber.org/zap"
userusecase "codeberg.org/mapleopentech/monorepo/cloud/maplepress-backend/internal/usecase/user"
"codeberg.org/mapleopentech/monorepo/cloud/maplepress-backend/pkg/logger"
)
// CreateUserService handles user creation operations
type CreateUserService interface {
CreateUser(ctx context.Context, tenantID string, input *userusecase.CreateUserInput) (*userusecase.CreateUserOutput, error)
}
type createUserService struct {
// Focused usecases
validateEmailUC *userusecase.ValidateUserEmailUniqueUseCase
createEntityUC *userusecase.CreateUserEntityUseCase
saveUserToRepoUC *userusecase.SaveUserToRepoUseCase
logger *zap.Logger
}
// NewCreateUserService creates a new CreateUserService
func NewCreateUserService(
validateEmailUC *userusecase.ValidateUserEmailUniqueUseCase,
createEntityUC *userusecase.CreateUserEntityUseCase,
saveUserToRepoUC *userusecase.SaveUserToRepoUseCase,
logger *zap.Logger,
) CreateUserService {
return &createUserService{
validateEmailUC: validateEmailUC,
createEntityUC: createEntityUC,
saveUserToRepoUC: saveUserToRepoUC,
logger: logger.Named("create-user-service"),
}
}
// CreateUser orchestrates the user creation workflow
func (s *createUserService) CreateUser(ctx context.Context, tenantID string, input *userusecase.CreateUserInput) (*userusecase.CreateUserOutput, error) {
// CWE-532: Use redacted email for logging
s.logger.Info("creating user",
zap.String("tenant_id", tenantID),
logger.EmailHash(input.Email),
logger.SafeEmail("email_redacted", input.Email))
// Step 1: Validate email uniqueness (fail fast)
if err := s.validateEmailUC.Execute(ctx, tenantID, input.Email); err != nil {
// CWE-532: Use redacted email for logging
s.logger.Error("email validation failed",
logger.EmailHash(input.Email),
logger.SafeEmail("email_redacted", input.Email),
zap.Error(err))
return nil, err
}
// Step 2: Create and validate user entity
user, err := s.createEntityUC.Execute(tenantID, input)
if err != nil {
// CWE-532: Use redacted email for logging
s.logger.Error("entity creation failed",
logger.EmailHash(input.Email),
logger.SafeEmail("email_redacted", input.Email),
zap.Error(err))
return nil, err
}
// Step 3: Save user to repository
if err := s.saveUserToRepoUC.Execute(ctx, tenantID, user); err != nil {
s.logger.Error("failed to save user",
zap.String("user_id", user.ID),
zap.Error(err))
return nil, err
}
// CWE-532: Use redacted email for logging
s.logger.Info("user created successfully",
zap.String("user_id", user.ID),
logger.EmailHash(user.Email),
logger.SafeEmail("email_redacted", user.Email))
// Step 4: Build output
return &userusecase.CreateUserOutput{
ID: user.ID,
Email: user.Email,
Name: user.Name,
CreatedAt: user.CreatedAt,
}, nil
}

View file

@ -0,0 +1,35 @@
package user
import (
"context"
"go.uber.org/zap"
userusecase "codeberg.org/mapleopentech/monorepo/cloud/maplepress-backend/internal/usecase/user"
)
// GetUserService handles getting user information
type GetUserService interface {
GetUser(ctx context.Context, tenantID string, input *userusecase.GetUserInput) (*userusecase.GetUserOutput, error)
}
type getUserService struct {
getUC *userusecase.GetUserUseCase
logger *zap.Logger
}
// NewGetUserService creates a new GetUserService
func NewGetUserService(
getUC *userusecase.GetUserUseCase,
logger *zap.Logger,
) GetUserService {
return &getUserService{
getUC: getUC,
logger: logger.Named("get-user-service"),
}
}
// GetUser retrieves a user by ID
func (s *getUserService) GetUser(ctx context.Context, tenantID string, input *userusecase.GetUserInput) (*userusecase.GetUserOutput, error) {
return s.getUC.Execute(ctx, tenantID, input)
}

View file

@ -0,0 +1,30 @@
package user
import (
"go.uber.org/zap"
userusecase "codeberg.org/mapleopentech/monorepo/cloud/maplepress-backend/internal/usecase/user"
)
// ProvideCreateUserService creates a new CreateUserService for dependency injection
func ProvideCreateUserService(
validateEmailUC *userusecase.ValidateUserEmailUniqueUseCase,
createEntityUC *userusecase.CreateUserEntityUseCase,
saveUserToRepoUC *userusecase.SaveUserToRepoUseCase,
logger *zap.Logger,
) CreateUserService {
return NewCreateUserService(
validateEmailUC,
createEntityUC,
saveUserToRepoUC,
logger,
)
}
// ProvideGetUserService creates a new GetUserService for dependency injection
func ProvideGetUserService(
getUC *userusecase.GetUserUseCase,
logger *zap.Logger,
) GetUserService {
return NewGetUserService(getUC, logger)
}