github.com/kyma-incubator/compass/components/director@v0.0.0-20230623144113-d764f56ff805/internal/domain/document/service.go (about)

     1  package document
     2  
     3  import (
     4  	"context"
     5  
     6  	"github.com/kyma-incubator/compass/components/director/pkg/resource"
     7  
     8  	"github.com/kyma-incubator/compass/components/director/pkg/apperrors"
     9  
    10  	"github.com/kyma-incubator/compass/components/director/internal/timestamp"
    11  
    12  	"github.com/kyma-incubator/compass/components/director/internal/domain/tenant"
    13  	"github.com/kyma-incubator/compass/components/director/internal/model"
    14  	"github.com/pkg/errors"
    15  )
    16  
    17  // DocumentRepository missing godoc
    18  //
    19  //go:generate mockery --name=DocumentRepository --output=automock --outpkg=automock --case=underscore --disable-version-string
    20  type DocumentRepository interface {
    21  	Exists(ctx context.Context, tenant, id string) (bool, error)
    22  	GetByID(ctx context.Context, tenant, id string) (*model.Document, error)
    23  	GetForBundle(ctx context.Context, tenant string, id string, bundleID string) (*model.Document, error)
    24  	ListByBundleIDs(ctx context.Context, tenantID string, bundleIDs []string, pageSize int, cursor string) ([]*model.DocumentPage, error)
    25  	Create(ctx context.Context, tenant string, item *model.Document) error
    26  	CreateGlobal(ctx context.Context, item *model.Document) error
    27  	Delete(ctx context.Context, tenant, id string) error
    28  }
    29  
    30  // FetchRequestRepository missing godoc
    31  //
    32  //go:generate mockery --name=FetchRequestRepository --output=automock --outpkg=automock --case=underscore --disable-version-string
    33  type FetchRequestRepository interface {
    34  	Create(ctx context.Context, tenant string, item *model.FetchRequest) error
    35  	CreateGlobal(ctx context.Context, item *model.FetchRequest) error
    36  	Delete(ctx context.Context, tenant, id string, objectType model.FetchRequestReferenceObjectType) error
    37  	ListByReferenceObjectIDs(ctx context.Context, tenant string, objectType model.FetchRequestReferenceObjectType, objectIDs []string) ([]*model.FetchRequest, error)
    38  }
    39  
    40  // UIDService missing godoc
    41  //
    42  //go:generate mockery --name=UIDService --output=automock --outpkg=automock --case=underscore --disable-version-string
    43  type UIDService interface {
    44  	Generate() string
    45  }
    46  
    47  type service struct {
    48  	repo             DocumentRepository
    49  	fetchRequestRepo FetchRequestRepository
    50  	uidService       UIDService
    51  	timestampGen     timestamp.Generator
    52  }
    53  
    54  // NewService missing godoc
    55  func NewService(repo DocumentRepository, fetchRequestRepo FetchRequestRepository, uidService UIDService) *service {
    56  	return &service{
    57  		repo:             repo,
    58  		fetchRequestRepo: fetchRequestRepo,
    59  		uidService:       uidService,
    60  		timestampGen:     timestamp.DefaultGenerator,
    61  	}
    62  }
    63  
    64  // Get missing godoc
    65  func (s *service) Get(ctx context.Context, id string) (*model.Document, error) {
    66  	tnt, err := tenant.LoadFromContext(ctx)
    67  	if err != nil {
    68  		return nil, errors.Wrapf(err, "while loading tenant from context")
    69  	}
    70  
    71  	document, err := s.repo.GetByID(ctx, tnt, id)
    72  	if err != nil {
    73  		return nil, errors.Wrapf(err, "while getting Document with ID %s", id)
    74  	}
    75  
    76  	return document, nil
    77  }
    78  
    79  // GetForBundle missing godoc
    80  func (s *service) GetForBundle(ctx context.Context, id string, bundleID string) (*model.Document, error) {
    81  	tnt, err := tenant.LoadFromContext(ctx)
    82  	if err != nil {
    83  		return nil, err
    84  	}
    85  
    86  	document, err := s.repo.GetForBundle(ctx, tnt, id, bundleID)
    87  	if err != nil {
    88  		return nil, errors.Wrap(err, "while getting Document")
    89  	}
    90  
    91  	return document, nil
    92  }
    93  
    94  // CreateInBundle missing godoc
    95  func (s *service) CreateInBundle(ctx context.Context, resourceType resource.Type, resourceID string, bundleID string, in model.DocumentInput) (string, error) {
    96  	id := s.uidService.Generate()
    97  	document := in.ToDocumentWithinBundle(id, bundleID, resourceType, resourceID)
    98  
    99  	if err := s.createDocument(ctx, document, resourceType); err != nil {
   100  		return "", errors.Wrap(err, "while creating Document")
   101  	}
   102  
   103  	if in.FetchRequest != nil {
   104  		generatedID := s.uidService.Generate()
   105  		fetchRequestID := &generatedID
   106  		fetchRequestModel := in.FetchRequest.ToFetchRequest(s.timestampGen(), *fetchRequestID, model.DocumentFetchRequestReference, id)
   107  
   108  		if err := s.createFetchRequest(ctx, fetchRequestModel, resourceType); err != nil {
   109  			return "", errors.Wrapf(err, "while creating FetchRequest for Document %s", id)
   110  		}
   111  	}
   112  
   113  	return document.ID, nil
   114  }
   115  
   116  // Delete missing godoc
   117  func (s *service) Delete(ctx context.Context, id string) error {
   118  	tnt, err := tenant.LoadFromContext(ctx)
   119  	if err != nil {
   120  		return err
   121  	}
   122  
   123  	err = s.repo.Delete(ctx, tnt, id)
   124  	if err != nil {
   125  		return errors.Wrapf(err, "while deleting Document with ID %s", id)
   126  	}
   127  
   128  	return nil
   129  }
   130  
   131  // ListByBundleIDs missing godoc
   132  func (s *service) ListByBundleIDs(ctx context.Context, bundleIDs []string, pageSize int, cursor string) ([]*model.DocumentPage, error) {
   133  	tnt, err := tenant.LoadFromContext(ctx)
   134  	if err != nil {
   135  		return nil, err
   136  	}
   137  
   138  	if pageSize < 1 || pageSize > 200 {
   139  		return nil, apperrors.NewInvalidDataError("page size must be between 1 and 200")
   140  	}
   141  
   142  	return s.repo.ListByBundleIDs(ctx, tnt, bundleIDs, pageSize, cursor)
   143  }
   144  
   145  // ListFetchRequests missing godoc
   146  func (s *service) ListFetchRequests(ctx context.Context, documentIDs []string) ([]*model.FetchRequest, error) {
   147  	tenant, err := tenant.LoadFromContext(ctx)
   148  	if err != nil {
   149  		return nil, errors.Wrapf(err, "while loading tenant from context")
   150  	}
   151  
   152  	return s.fetchRequestRepo.ListByReferenceObjectIDs(ctx, tenant, model.DocumentFetchRequestReference, documentIDs)
   153  }
   154  
   155  func (s *service) createDocument(ctx context.Context, document *model.Document, resourceType resource.Type) error {
   156  	if resourceType.IsTenantIgnorable() {
   157  		return s.repo.CreateGlobal(ctx, document)
   158  	}
   159  
   160  	tnt, err := tenant.LoadFromContext(ctx)
   161  	if err != nil {
   162  		return err
   163  	}
   164  
   165  	return s.repo.Create(ctx, tnt, document)
   166  }
   167  
   168  func (s *service) createFetchRequest(ctx context.Context, fetchRequest *model.FetchRequest, resourceType resource.Type) error {
   169  	if resourceType.IsTenantIgnorable() {
   170  		return s.fetchRequestRepo.CreateGlobal(ctx, fetchRequest)
   171  	}
   172  
   173  	tnt, err := tenant.LoadFromContext(ctx)
   174  	if err != nil {
   175  		return err
   176  	}
   177  
   178  	return s.fetchRequestRepo.Create(ctx, tnt, fetchRequest)
   179  }