Files
2026-06-22 14:31:01 +05:00

55 lines
1.3 KiB
Go

package service
import (
"context"
"secunda-test/internal/domain"
)
type TeamService struct {
teams TeamRepository
users UserRepository
email EmailSender
}
func NewTeamService(teams TeamRepository, users UserRepository, email EmailSender) *TeamService {
return &TeamService{teams: teams, users: users, email: email}
}
func (s *TeamService) Create(ctx context.Context, userID int64, name string) (domain.Team, error) {
if name == "" {
return domain.Team{}, ErrBadRequest
}
t, err := s.teams.Create(ctx, name, userID)
if err != nil {
return domain.Team{}, err
}
if err := s.teams.AddMember(ctx, t.ID, userID, domain.RoleOwner); err != nil {
return domain.Team{}, err
}
t.Role = domain.RoleOwner
return t, nil
}
func (s *TeamService) List(ctx context.Context, userID int64) ([]domain.Team, error) {
return s.teams.ListByUser(ctx, userID)
}
func (s *TeamService) Invite(ctx context.Context, actorID, teamID int64, email string) error {
role, ok, err := s.teams.MemberRole(ctx, teamID, actorID)
if err != nil {
return err
}
if !ok || (role != domain.RoleOwner && role != domain.RoleAdmin) {
return ErrForbidden
}
u, err := s.users.FindByEmail(ctx, email)
if err != nil {
return ErrNotFound
}
if err := s.teams.AddMember(ctx, teamID, u.ID, domain.RoleMember); err != nil {
return err
}
return s.email.SendInvite(ctx, email, "")
}