55 lines
1.3 KiB
Go
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, "")
|
|
}
|