74 рядки
2.1 KiB
Go
74 рядки
2.1 KiB
Go
package service
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"strings"
|
|
"unicode/utf8"
|
|
|
|
"git.entityseven.com/rilaxik/pllist/internal/domain"
|
|
)
|
|
|
|
const maxListTitleLength = 120
|
|
|
|
type ListRepository interface {
|
|
Create(ctx context.Context, ownerID int64, title string) (domain.List, error)
|
|
Get(ctx context.Context, id int64) (domain.List, error)
|
|
ListForUser(ctx context.Context, userID int64) ([]domain.List, error)
|
|
Rename(ctx context.Context, id int64, title string) error
|
|
Delete(ctx context.Context, id int64) error
|
|
Role(ctx context.Context, listID, userID int64) (domain.Role, bool, error)
|
|
}
|
|
|
|
type ListService struct {
|
|
lists ListRepository
|
|
access *AccessService
|
|
}
|
|
|
|
func NewListService(lists ListRepository, access *AccessService) *ListService {
|
|
return &ListService{lists: lists, access: access}
|
|
}
|
|
|
|
func (s *ListService) Create(ctx context.Context, userID int64, title string) (domain.List, error) {
|
|
title, err := validateListTitle(title)
|
|
if err != nil {
|
|
return domain.List{}, err
|
|
}
|
|
return s.lists.Create(ctx, userID, title)
|
|
}
|
|
|
|
func (s *ListService) Rename(ctx context.Context, userID, listID int64, title string) (domain.List, error) {
|
|
title, err := validateListTitle(title)
|
|
if err != nil {
|
|
return domain.List{}, err
|
|
}
|
|
if _, err := s.access.Authorize(ctx, userID, listID, domain.ActionEditListMeta); err != nil {
|
|
return domain.List{}, err
|
|
}
|
|
if err := s.lists.Rename(ctx, listID, title); err != nil {
|
|
return domain.List{}, err
|
|
}
|
|
return s.lists.Get(ctx, listID)
|
|
}
|
|
|
|
func (s *ListService) Delete(ctx context.Context, userID, listID int64) error {
|
|
if _, err := s.access.Authorize(ctx, userID, listID, domain.ActionDeleteList); err != nil {
|
|
return err
|
|
}
|
|
return s.lists.Delete(ctx, listID)
|
|
}
|
|
|
|
func (s *ListService) List(ctx context.Context, userID int64) ([]domain.List, error) {
|
|
return s.lists.ListForUser(ctx, userID)
|
|
}
|
|
|
|
func validateListTitle(title string) (string, error) {
|
|
title = strings.TrimSpace(title)
|
|
if title == "" || utf8.RuneCountInString(title) > maxListTitleLength {
|
|
return "", domain.NewValidationError(
|
|
fmt.Sprintf("List title must be 1-%d characters.", maxListTitleLength),
|
|
)
|
|
}
|
|
return title, nil
|
|
}
|