Файли
2026-11-07 01:35:12 +00:00

54 рядки
1.2 KiB
Go

package service
import (
"context"
"git.entityseven.com/rilaxik/pllist/internal/domain"
)
type accessRepository interface {
Get(ctx context.Context, id int64) (domain.List, error)
Role(ctx context.Context, listID, userID int64) (domain.Role, bool, error)
}
type AccessService struct {
lists accessRepository
}
func NewAccessService(lists accessRepository) *AccessService {
return &AccessService{lists: lists}
}
func (s *AccessService) Authorize(
ctx context.Context, userID, listID int64, action domain.Action,
) (domain.Access, error) {
list, err := s.lists.Get(ctx, listID)
if err != nil {
return domain.Access{}, err
}
role := domain.RoleOwner
if list.OwnerID != userID {
role, err = s.role(ctx, listID, userID)
if err != nil {
return domain.Access{}, err
}
}
if !domain.Allowed(role, action) {
return domain.Access{}, domain.ErrForbidden
}
return domain.Access{List: list, Role: role}, nil
}
func (s *AccessService) role(ctx context.Context, listID, userID int64) (domain.Role, error) {
role, ok, err := s.lists.Role(ctx, listID, userID)
if err != nil {
return "", err
}
if !ok {
return "", domain.ErrNotFound
}
return role, nil
}