Files
smart-search-back/internal/service/invite.go
vallyenfail d959dcca96 add service
2026-01-17 17:39:33 +03:00

58 lines
1.3 KiB
Go

package service
import (
"context"
"math/rand"
"time"
"smart-search-back/internal/model"
"smart-search-back/internal/repository"
"smart-search-back/pkg/errors"
)
type inviteService struct {
inviteRepo repository.InviteRepository
userRepo repository.UserRepository
}
func NewInviteService(inviteRepo repository.InviteRepository, userRepo repository.UserRepository) InviteService {
return &inviteService{
inviteRepo: inviteRepo,
userRepo: userRepo,
}
}
func (s *inviteService) Generate(ctx context.Context, userID, maxUses, ttlDays int) (*model.InviteCode, error) {
canIssue, err := s.userRepo.CheckInviteLimit(ctx, userID)
if err != nil {
return nil, err
}
if !canIssue {
return nil, errors.NewBusinessError(errors.InviteLimitReached, "User reached maximum invite codes limit")
}
code := rand.Int63n(90000000) + 10000000
invite := &model.InviteCode{
UserID: userID,
Code: code,
CanBeUsedCount: maxUses,
ExpiresAt: time.Now().Add(time.Duration(ttlDays) * 24 * time.Hour),
}
if err := s.inviteRepo.Create(ctx, invite); err != nil {
return nil, err
}
if err := s.userRepo.IncrementInvitesIssued(ctx, userID); err != nil {
return nil, err
}
return invite, nil
}
func (s *inviteService) GetInfo(ctx context.Context, code int64) (*model.InviteCode, error) {
return s.inviteRepo.FindByCode(ctx, code)
}