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, "") }