@@ -103,8 +103,7 @@ public virtual async Task<TResource> GetAsync(TId id, CancellationToken cancella
103103
104104 _hookExecutor . BeforeReadSingle < TResource , TId > ( id , ResourcePipeline . GetSingle ) ;
105105
106- TResource primaryResource = await TryGetPrimaryResourceByIdAsync ( id , TopFieldSelection . PreserveExisting , cancellationToken ) ;
107- AssertPrimaryResourceExists ( primaryResource ) ;
106+ TResource primaryResource = await GetPrimaryResourceByIdAsync ( id , TopFieldSelection . PreserveExisting , cancellationToken ) ;
108107
109108 _hookExecutor . AfterReadSingle ( primaryResource , ResourcePipeline . GetSingle ) ;
110109 _hookExecutor . OnReturnSingle ( primaryResource , ResourcePipeline . GetSingle ) ;
@@ -225,10 +224,7 @@ public virtual async Task<TResource> CreateAsync(TResource resource, Cancellatio
225224 throw ;
226225 }
227226
228- TResource resourceFromDatabase =
229- await TryGetPrimaryResourceByIdAsync ( resourceForDatabase . Id , TopFieldSelection . WithAllAttributes , cancellationToken ) ;
230-
231- AssertPrimaryResourceExists ( resourceFromDatabase ) ;
227+ TResource resourceFromDatabase = await GetPrimaryResourceByIdAsync ( resourceForDatabase . Id , TopFieldSelection . WithAllAttributes , cancellationToken ) ;
232228
233229 await _resourceDefinitionAccessor . OnAfterCreateResourceAsync ( resourceFromDatabase , cancellationToken ) ;
234230
@@ -247,13 +243,14 @@ public virtual async Task<TResource> CreateAsync(TResource resource, Cancellatio
247243 return resourceFromDatabase ;
248244 }
249245
250- private async Task AssertResourcesToAssignInRelationshipsExistAsync ( TResource resource , CancellationToken cancellationToken )
246+ protected async Task AssertResourcesToAssignInRelationshipsExistAsync ( TResource primaryResource , CancellationToken cancellationToken )
251247 {
252248 var missingResources = new List < MissingResourceInRelationship > ( ) ;
253249
254- foreach ( ( QueryLayer queryLayer , RelationshipAttribute relationship ) in _queryLayerComposer . ComposeForGetTargetedSecondaryResourceIds ( resource ) )
250+ foreach ( ( QueryLayer queryLayer , RelationshipAttribute relationship ) in _queryLayerComposer . ComposeForGetTargetedSecondaryResourceIds (
251+ primaryResource ) )
255252 {
256- object rightValue = relationship . GetValue ( resource ) ;
253+ object rightValue = relationship . GetValue ( primaryResource ) ;
257254 ICollection < IIdentifiable > rightResourceIds = _collectionConverter . ExtractResources ( rightValue ) ;
258255
259256 IAsyncEnumerable < MissingResourceInRelationship > missingResourcesInRelationship =
@@ -287,7 +284,7 @@ private async IAsyncEnumerable<MissingResourceInRelationship> GetMissingRightRes
287284 }
288285
289286 /// <inheritdoc />
290- public async Task AddToToManyRelationshipAsync ( TId primaryId , string relationshipName , ISet < IIdentifiable > secondaryResourceIds ,
287+ public virtual async Task AddToToManyRelationshipAsync ( TId primaryId , string relationshipName , ISet < IIdentifiable > secondaryResourceIds ,
291288 CancellationToken cancellationToken )
292289 {
293290 _traceWriter . LogMethodStart ( new
@@ -316,10 +313,8 @@ public async Task AddToToManyRelationshipAsync(TId primaryId, string relationshi
316313 }
317314 catch ( DataStoreUpdateException )
318315 {
319- TResource primaryResource = await TryGetPrimaryResourceByIdAsync ( primaryId , TopFieldSelection . OnlyIdAttribute , cancellationToken ) ;
320- AssertPrimaryResourceExists ( primaryResource ) ;
321-
322- await AssertResourcesExistAsync ( secondaryResourceIds , cancellationToken ) ;
316+ _ = await GetPrimaryResourceByIdAsync ( primaryId , TopFieldSelection . OnlyIdAttribute , cancellationToken ) ;
317+ await AssertRightResourcesExistAsync ( secondaryResourceIds , cancellationToken ) ;
323318 throw ;
324319 }
325320 }
@@ -340,16 +335,22 @@ private async Task RemoveExistingIdsFromSecondarySetAsync(TId primaryId, ISet<II
340335 secondaryResourceIds . ExceptWith ( existingRightResourceIds ) ;
341336 }
342337
343- private async Task AssertResourcesExistAsync ( ICollection < IIdentifiable > secondaryResourceIds , CancellationToken cancellationToken )
338+ protected async Task AssertRightResourcesExistAsync ( object rightResourceIds , CancellationToken cancellationToken )
344339 {
345- QueryLayer queryLayer = _queryLayerComposer . ComposeForGetRelationshipRightIds ( _request . Relationship , secondaryResourceIds ) ;
340+ ICollection < IIdentifiable > secondaryResourceIds = _collectionConverter . ExtractResources ( rightResourceIds ) ;
346341
347- List < MissingResourceInRelationship > missingResources =
348- await GetMissingRightResourcesAsync ( queryLayer , _request . Relationship , secondaryResourceIds , cancellationToken ) . ToListAsync ( cancellationToken ) ;
349-
350- if ( missingResources . Any ( ) )
342+ if ( secondaryResourceIds . Any ( ) )
351343 {
352- throw new ResourcesInRelationshipsNotFoundException ( missingResources ) ;
344+ QueryLayer queryLayer = _queryLayerComposer . ComposeForGetRelationshipRightIds ( _request . Relationship , secondaryResourceIds ) ;
345+
346+ List < MissingResourceInRelationship > missingResources =
347+ await GetMissingRightResourcesAsync ( queryLayer , _request . Relationship , secondaryResourceIds , cancellationToken )
348+ . ToListAsync ( cancellationToken ) ;
349+
350+ if ( missingResources . Any ( ) )
351+ {
352+ throw new ResourcesInRelationshipsNotFoundException ( missingResources ) ;
353+ }
353354 }
354355 }
355356
@@ -385,8 +386,7 @@ public virtual async Task<TResource> UpdateAsync(TId id, TResource resource, Can
385386 throw ;
386387 }
387388
388- TResource afterResourceFromDatabase = await TryGetPrimaryResourceByIdAsync ( id , TopFieldSelection . WithAllAttributes , cancellationToken ) ;
389- AssertPrimaryResourceExists ( afterResourceFromDatabase ) ;
389+ TResource afterResourceFromDatabase = await GetPrimaryResourceByIdAsync ( id , TopFieldSelection . WithAllAttributes , cancellationToken ) ;
390390
391391 await _resourceDefinitionAccessor . OnAfterUpdateResourceAsync ( afterResourceFromDatabase , cancellationToken ) ;
392392
@@ -429,7 +429,7 @@ public virtual async Task SetRelationshipAsync(TId primaryId, string relationshi
429429 }
430430 catch ( DataStoreUpdateException )
431431 {
432- await AssertResourcesExistAsync ( _collectionConverter . ExtractResources ( secondaryResourceIds ) , cancellationToken ) ;
432+ await AssertRightResourcesExistAsync ( secondaryResourceIds , cancellationToken ) ;
433433 throw ;
434434 }
435435
@@ -454,8 +454,7 @@ public virtual async Task DeleteAsync(TId id, CancellationToken cancellationToke
454454 }
455455 catch ( DataStoreUpdateException )
456456 {
457- TResource primaryResource = await TryGetPrimaryResourceByIdAsync ( id , TopFieldSelection . OnlyIdAttribute , cancellationToken ) ;
458- AssertPrimaryResourceExists ( primaryResource ) ;
457+ _ = await GetPrimaryResourceByIdAsync ( id , TopFieldSelection . OnlyIdAttribute , cancellationToken ) ;
459458 throw ;
460459 }
461460
@@ -465,7 +464,7 @@ public virtual async Task DeleteAsync(TId id, CancellationToken cancellationToke
465464 }
466465
467466 /// <inheritdoc />
468- public async Task RemoveFromToManyRelationshipAsync ( TId primaryId , string relationshipName , ISet < IIdentifiable > secondaryResourceIds ,
467+ public virtual async Task RemoveFromToManyRelationshipAsync ( TId primaryId , string relationshipName , ISet < IIdentifiable > secondaryResourceIds ,
469468 CancellationToken cancellationToken )
470469 {
471470 _traceWriter . LogMethodStart ( new
@@ -481,14 +480,22 @@ public async Task RemoveFromToManyRelationshipAsync(TId primaryId, string relati
481480 AssertHasRelationship ( _request . Relationship , relationshipName ) ;
482481
483482 TResource resourceFromDatabase = await GetPrimaryResourceForUpdateAsync ( primaryId , cancellationToken ) ;
484- await AssertResourcesExistAsync ( secondaryResourceIds , cancellationToken ) ;
483+ await AssertRightResourcesExistAsync ( secondaryResourceIds , cancellationToken ) ;
485484
486485 if ( secondaryResourceIds . Any ( ) )
487486 {
488487 await _repositoryAccessor . RemoveFromToManyRelationshipAsync ( resourceFromDatabase , secondaryResourceIds , cancellationToken ) ;
489488 }
490489 }
491490
491+ protected async Task < TResource > GetPrimaryResourceByIdAsync ( TId id , TopFieldSelection fieldSelection , CancellationToken cancellationToken )
492+ {
493+ TResource primaryResource = await TryGetPrimaryResourceByIdAsync ( id , fieldSelection , cancellationToken ) ;
494+ AssertPrimaryResourceExists ( primaryResource ) ;
495+
496+ return primaryResource ;
497+ }
498+
492499 private async Task < TResource > TryGetPrimaryResourceByIdAsync ( TId id , TopFieldSelection fieldSelection , CancellationToken cancellationToken )
493500 {
494501 QueryLayer primaryLayer = _queryLayerComposer . ComposeForGetById ( id , _request . PrimaryResource , fieldSelection ) ;
@@ -497,7 +504,7 @@ private async Task<TResource> TryGetPrimaryResourceByIdAsync(TId id, TopFieldSel
497504 return primaryResources . SingleOrDefault ( ) ;
498505 }
499506
500- private async Task < TResource > GetPrimaryResourceForUpdateAsync ( TId id , CancellationToken cancellationToken )
507+ protected async Task < TResource > GetPrimaryResourceForUpdateAsync ( TId id , CancellationToken cancellationToken )
501508 {
502509 QueryLayer queryLayer = _queryLayerComposer . ComposeForUpdate ( id , _request . PrimaryResource ) ;
503510 var resource = await _repositoryAccessor . GetForUpdateAsync < TResource > ( queryLayer , cancellationToken ) ;
0 commit comments