Файли
2026-11-07 20:55:19 +00:00

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
}