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 }