Files
apocapoc-api/internal/application/queries/login_user.go
T
david 4c8f3022f0
CI/CD Pipeline / Test (push) Has been cancelled
CI/CD Pipeline / Lint (push) Has been cancelled
CI/CD Pipeline / Build and Push Docker Image (push) Has been cancelled
Refactor password hashing to follow DIP and improve CI/CD
- Create PasswordHasher interface in domain layer
- Implement BcryptHasher in infrastructure layer
- Update RegisterUserHandler and LoginUserHandler to use interface
- Remove bcrypt dependency from application layer
- Update main.go and integration tests with dependency injection
- Enhance CI/CD workflow with test and lint jobs
- Add code coverage check (minimum 50%)
- Add go vet and gofmt validation
- Configure build job to depend on test and lint passing
- Update GitHub Actions to latest versions (v4→v5)

This achieves 100% SOLID compliance (DIP) and ensures Clean Architecture
by removing external library dependencies from application/domain layers.
2025-11-26 21:39:52 +01:00

54 lines
1.2 KiB
Go

package queries
import (
"context"
"apocapoc-api/internal/domain/repositories"
"apocapoc-api/internal/domain/services"
"apocapoc-api/internal/shared/errors"
)
type LoginUserQuery struct {
Email string
Password string
}
type LoginUserResult struct {
UserID string
Email string
Timezone string
}
type LoginUserHandler struct {
userRepo repositories.UserRepository
passwordHasher services.PasswordHasher
}
func NewLoginUserHandler(userRepo repositories.UserRepository, passwordHasher services.PasswordHasher) *LoginUserHandler {
return &LoginUserHandler{
userRepo: userRepo,
passwordHasher: passwordHasher,
}
}
func (h *LoginUserHandler) Handle(ctx context.Context, query LoginUserQuery) (*LoginUserResult, error) {
if query.Email == "" || query.Password == "" {
return nil, errors.ErrInvalidInput
}
user, err := h.userRepo.FindByEmail(ctx, query.Email)
if err != nil {
return nil, errors.ErrNotFound
}
if err := h.passwordHasher.Compare(user.PasswordHash, query.Password); err != nil {
return nil, errors.ErrNotFound
}
return &LoginUserResult{
UserID: user.ID,
Email: user.Email,
Timezone: user.Timezone,
}, nil
}