added validation; DB is global now

This commit is contained in:
$(pass /github/name)
2024-07-11 20:59:52 +02:00
parent e4475e2400
commit 03a2b3bdc5
22 changed files with 287 additions and 218 deletions

View File

@@ -10,19 +10,15 @@ import (
"time"
)
type BankAccountService interface {
type BankAccountServiceInterface interface {
RegisterBankAccount(bankAccount *models.BankAccount) (int64, error)
}
type bankAccountService struct {
repo repositories.BankAccountRepository
type BankAccountService struct {
Repo repositories.BankAccountRepositoryInterface
}
func NewBankAccountService(repo repositories.BankAccountRepository) BankAccountService {
return &bankAccountService{repo}
}
func (service *bankAccountService) RegisterBankAccount(bankAccount *models.BankAccount) (int64, error) {
func (service *BankAccountService) RegisterBankAccount(bankAccount *models.BankAccount) (int64, error) {
bankAccount.MandateDateSigned = time.Now()
ref, err := generateSEPAMandateReference(strconv.FormatInt(bankAccount.UserID, 10))
if err != nil {
@@ -30,7 +26,7 @@ func (service *bankAccountService) RegisterBankAccount(bankAccount *models.BankA
}
bankAccount.MandateReference = ref
return service.repo.CreateBankAccount(bankAccount)
return service.Repo.CreateBankAccount(bankAccount)
}
func generateUniqueID(length int) (string, error) {

View File

@@ -1,25 +1,22 @@
package services
import (
"time"
"GoMembership/internal/models"
"GoMembership/internal/repositories"
"time"
)
type ConsentService interface {
type ConsentServiceInterface interface {
RegisterConsent(consent *models.Consent) (int64, error)
}
type consentService struct {
repo repositories.ConsentRepository
type ConsentService struct {
Repo repositories.ConsentRepositoryInterface
}
func NewConsentService(repo repositories.ConsentRepository) ConsentService {
return &consentService{repo}
}
func (service *consentService) RegisterConsent(consent *models.Consent) (int64, error) {
func (service *ConsentService) RegisterConsent(consent *models.Consent) (int64, error) {
consent.CreatedAt = time.Now()
consent.UpdatedAt = time.Now()
return service.repo.CreateConsent(consent)
return service.Repo.CreateConsent(consent)
}

View File

@@ -129,7 +129,7 @@ func (s *EmailService) NotifyAdminOfNewUser(user *models.User) error {
City: user.City,
DateOfBirth: user.DateOfBirth.Format("20060102"),
Email: user.Email,
Phone: *user.Phone,
Phone: user.Phone,
IBAN: user.BankAccount.IBAN,
}

View File

@@ -3,35 +3,50 @@ package services
import (
"GoMembership/internal/models"
"GoMembership/internal/repositories"
"GoMembership/pkg/errors"
"slices"
"time"
)
type MembershipService interface {
type MembershipServiceInterface interface {
RegisterMembership(membership *models.Membership) (int64, error)
FindMembershipByUserID(userID int64) (*models.Membership, error)
RegisterSubscription(subscription *models.SubscriptionModel) (int64, error)
GetMembershipModelNames() ([]string, error)
GetModelByName(modelname *string) (*models.SubscriptionModel, error)
}
type membershipService struct {
repo repositories.MembershipRepository
subscriptionRepo repositories.SubscriptionModelsRepository
type MembershipService struct {
Repo repositories.MembershipRepositoryInterface
SubscriptionRepo repositories.SubscriptionModelsRepositoryInterface
}
func NewMembershipService(repo repositories.MembershipRepository, subscriptionRepo repositories.SubscriptionModelsRepository) MembershipService {
return &membershipService{repo, subscriptionRepo}
}
func (service *membershipService) RegisterMembership(membership *models.Membership) (int64, error) {
func (service *MembershipService) RegisterMembership(membership *models.Membership) (int64, error) {
membership.StartDate = time.Now()
return service.repo.CreateMembership(membership)
return service.Repo.CreateMembership(membership)
}
func (service *membershipService) FindMembershipByUserID(userID int64) (*models.Membership, error) {
return service.repo.FindMembershipByUserID(userID)
func (service *MembershipService) FindMembershipByUserID(userID int64) (*models.Membership, error) {
return service.Repo.FindMembershipByUserID(userID)
}
// Membership_Subscriptions
func (service *membershipService) RegisterSubscription(subscription *models.SubscriptionModel) (int64, error) {
return service.subscriptionRepo.CreateSubscriptionModel(subscription)
func (service *MembershipService) RegisterSubscription(subscription *models.SubscriptionModel) (int64, error) {
return service.SubscriptionRepo.CreateSubscriptionModel(subscription)
}
func (service *MembershipService) GetMembershipModelNames() ([]string, error) {
return service.SubscriptionRepo.GetMembershipModelNames()
}
func (service *MembershipService) GetModelByName(modelname *string) (*models.SubscriptionModel, error) {
sModelNames, err := service.SubscriptionRepo.GetMembershipModelNames()
if err != nil {
return nil, err
}
if !slices.Contains(sModelNames, *modelname) {
return nil, errors.ErrNotFound
}
return service.SubscriptionRepo.GetModelByName(modelname)
}

View File

@@ -6,47 +6,44 @@ import (
"GoMembership/internal/repositories"
"GoMembership/internal/utils"
"GoMembership/pkg/logger"
"github.com/go-playground/validator/v10"
// "crypto/rand"
// "encoding/base64"
// "golang.org/x/crypto/bcrypt"
"time"
)
type UserService interface {
type UserServiceInterface interface {
RegisterUser(user *models.User) (int64, string, error)
// AuthenticateUser(email, password string) (*models.User, error)A
VerifyUser(token *string) (*models.User, error)
}
type userService struct {
repo repositories.UserRepository
type UserService struct {
Repo repositories.UserRepositoryInterface
}
func NewUserService(repo repositories.UserRepository) UserService {
return &userService{repo}
}
func (service *userService) RegisterUser(user *models.User) (int64, string, error) {
func (service *UserService) RegisterUser(user *models.User) (int64, string, error) {
/* salt := make([]byte, 16)
if _, err := rand.Read(salt); err != nil {
return -1, err
}
user.Salt = base64.StdEncoding.EncodeToString(salt)
hashedPassword, err := HashPassword(user.Password, user.Salt)
if err != nil {
return -1, err
}
user.Password = string(hashedPassword) */
// TODO: Validate Data
user.Status = constants.UnverifiedStatus
user.CreatedAt = time.Now()
user.UpdatedAt = time.Now()
id, err := service.repo.CreateUser(user)
*/
err := validateRegistrationData(user)
if err != nil {
return -1, "", err
}
user.Status = constants.UnverifiedStatus
user.CreatedAt = time.Now()
user.UpdatedAt = time.Now()
id, err := service.Repo.CreateUser(user)
if err != nil {
return -1, "", err
}
user.ID = id
token, err := utils.GenerateVerificationToken()
@@ -55,21 +52,33 @@ func (service *userService) RegisterUser(user *models.User) (int64, string, erro
}
logger.Info.Printf("TOKEN: %v", token)
_, err = service.repo.SetVerificationToken(user, &token)
_, err = service.Repo.SetVerificationToken(user, &token)
if err != nil {
return -1, "", err
}
return id, token, nil
}
func (service *userService) VerifyUser(token *string) (*models.User, error) {
user, err := service.repo.VerifyUserOfToken(token)
func (service *UserService) VerifyUser(token *string) (*models.User, error) {
user, err := service.Repo.VerifyUserOfToken(token)
if err != nil {
return nil, err
}
return user, nil
}
func validateRegistrationData(user *models.User) error {
validate := validator.New()
validate.RegisterValidation("age", utils.AgeValidator)
validate.RegisterValidation("bic", utils.BICValidator)
validate.RegisterValidation("iban", utils.IBANValidator)
validate.RegisterValidation("subscriptionModel", utils.SubscriptionModelValidator)
return validate.Struct(user)
}
/* func HashPassword(password string, salt string) (string, error) {
saltedPassword := password + salt
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(saltedPassword), bcrypt.DefaultCost)
@@ -80,7 +89,7 @@ func (service *userService) VerifyUser(token *string) (*models.User, error) {
return base64.StdEncoding.EncodeToString(hashedPassword), nil
} */
/* func (s *userService) AuthenticateUser(email, password string) (*models.User, error) {
/* func (s *UserService) AuthenticateUser(email, password string) (*models.User, error) {
user, err := s.repo.FindUserByEmail(email)
if err != nil {
return nil, errors.ErrUserNotFound