trepa/internal/accounts/service/account.go
qpismont 9d544c7e8a
All checks were successful
ci/woodpecker/push/lint Pipeline was successful
ci/woodpecker/push/tests Pipeline was successful
ci/woodpecker/push/build Pipeline was successful
Update CI configuration to use Go 1.24.1-alpine for build, lint, and test steps. Fix test database setup path in account tests and improve error handling in JWT verification.
2025-03-24 20:55:54 +00:00

62 lines
1.3 KiB
Go

package service
import (
"gitea.qpismont.fr/qpismont/trepa/internal/accounts/domain"
"gitea.qpismont.fr/qpismont/trepa/internal/core"
)
type Service struct {
repository domain.AccountRepository
}
func NewService(repository domain.AccountRepository) domain.AccountService {
return &Service{repository: repository}
}
func (s *Service) GetAccount(id int) (*domain.Account, *core.HTTPError) {
account, err := s.repository.FetchOneById(id)
if err != nil {
return nil, core.NewInternalServerError(err)
}
if account == nil {
return nil, domain.ErrAccountNotFound
}
return account, nil
}
func (s *Service) Login(login domain.AccountLogin) (*domain.AccountWithToken, *core.HTTPError) {
account, err := s.repository.FetchOneByUsername(login.Username)
if err != nil {
return nil, core.NewInternalServerError(err)
}
if account == nil {
return nil, domain.ErrAccountNotFound
}
ok, err := core.ComparePassword(login.Password, account.Password)
if err != nil {
return nil, domain.ErrBadPassword
}
if !ok {
return nil, domain.ErrBadPassword
}
claims := core.JWTClaims{
AccountId: account.Id,
RoleId: account.RoleId,
}
token, err := core.SignJWT(claims)
if err != nil {
return nil, core.NewInternalServerError(err)
}
return &domain.AccountWithToken{
Account: account,
Token: token,
}, nil
}