@@ -165,7 +165,15 @@ func (r *AssetRepository) GetByID(ctx context.Context, id string) (asset.Asset,
165
165
}
166
166
167
167
func (r * AssetRepository ) GetByURN (ctx context.Context , urn string ) (asset.Asset , error ) {
168
- return r .GetByURNWithTx (ctx , nil , urn )
168
+ ast , err := r .getWithPredicateWithTx (ctx , nil , sq.Eq {"a.urn" : urn })
169
+ if errors .Is (err , sql .ErrNoRows ) {
170
+ return asset.Asset {}, asset.NotFoundError {URN : urn }
171
+ }
172
+ if err != nil {
173
+ return asset.Asset {}, fmt .Errorf ("error getting asset with URN = %q: %w" , urn , err )
174
+ }
175
+
176
+ return ast , nil
169
177
}
170
178
171
179
func (r * AssetRepository ) GetByURNWithTx (ctx context.Context , tx * sqlx.Tx , urn string ) (asset.Asset , error ) {
@@ -174,7 +182,7 @@ func (r *AssetRepository) GetByURNWithTx(ctx context.Context, tx *sqlx.Tx, urn s
174
182
return asset.Asset {}, asset.NotFoundError {URN : urn }
175
183
}
176
184
if err != nil {
177
- return asset.Asset {}, fmt .Errorf ("error getting asset with URN = %q: %w" , urn , err )
185
+ return asset.Asset {}, fmt .Errorf ("error getting asset with Tx for URN = %q: %w" , urn , err )
178
186
}
179
187
180
188
return ast , nil
@@ -322,13 +330,11 @@ func (r *AssetRepository) getByVersion(
322
330
return ast .toVersionedAsset (latest )
323
331
}
324
332
325
- // UpsertPatch creates a new asset if it does not exist yet.
333
+ // Upsert creates a new asset if it does not exist yet.
326
334
// It updates if asset does exist.
327
- // Checking existence is done using "urn", "type", and "service" fields
328
- // And will revalidate again with additional: "data" and "name" fields.
329
- func (r * AssetRepository ) UpsertPatch (ctx context.Context , ast * asset.Asset , patchData map [string ]interface {}) (asset.Asset , error ) {
330
- var upsertedAsset asset.Asset
331
- err := r .client .RunWithinTx (ctx , func (tx * sqlx.Tx ) error {
335
+ // Checking existence is done using "urn", "type", "name", "data", and "service" fields.
336
+ func (r * AssetRepository ) Upsert (ctx context.Context , ast * asset.Asset ) (assetID string , err error ) {
337
+ err = r .client .RunWithinTx (ctx , func (tx * sqlx.Tx ) (err error ) {
332
338
fetchedAsset , err := r .GetByURNWithTx (ctx , tx , ast .URN )
333
339
if errors .As (err , new (asset.NotFoundError )) {
334
340
err = nil
@@ -339,46 +345,43 @@ func (r *AssetRepository) UpsertPatch(ctx context.Context, ast *asset.Asset, pat
339
345
340
346
if fetchedAsset .ID == "" {
341
347
// insert flow
342
- upsertedAsset , err = r .insert (ctx , tx , ast )
348
+ assetID , err = r .insert (ctx , tx , ast )
343
349
if err != nil {
344
350
return fmt .Errorf ("error inserting asset to DB: %w" , err )
345
351
}
352
+
346
353
return nil
347
354
}
348
355
349
- // update flow
350
- if err := copier .CopyWithOption (& ast , & fetchedAsset , copier.Option {DeepCopy : true }); err != nil {
351
- return err
352
- }
353
- ast .Patch (patchData )
354
- if err := r .validateAsset (* ast ); err != nil {
355
- return err
356
- }
357
356
changelog , err := fetchedAsset .Diff (ast )
358
357
if err != nil {
359
358
return fmt .Errorf ("error diffing two assets: %w" , err )
360
359
}
361
360
362
- upsertedAsset , err = r .update (ctx , tx , ast , & fetchedAsset , changelog )
363
- if err != nil {
361
+ if err := r .update (ctx , tx , ast , & fetchedAsset , changelog ); err != nil {
364
362
return fmt .Errorf ("error updating asset to DB: %w" , err )
365
363
}
364
+ assetID = fetchedAsset .ID
366
365
367
366
return nil
368
367
})
369
368
if err != nil {
370
- return asset. Asset {} , err
369
+ return "" , err
371
370
}
372
371
373
- return upsertedAsset , nil
372
+ return assetID , nil
374
373
}
375
374
376
- // Upsert creates a new asset if it does not exist yet.
375
+ // UpsertPatch creates a new asset if it does not exist yet.
377
376
// It updates if asset does exist.
378
- // Checking existence is done using "urn", "type", "name", "data", and "service" fields.
379
- func (r * AssetRepository ) Upsert (ctx context.Context , ast * asset.Asset ) (asset.Asset , error ) {
380
- var upsertedAsset asset.Asset
381
- err := r .client .RunWithinTx (ctx , func (tx * sqlx.Tx ) error {
377
+ // Checking existence is done using "urn", "type", and "service" fields
378
+ // And will revalidate again with additional: "data" and "name" fields.
379
+ func (r * AssetRepository ) UpsertPatch ( //nolint:gocognit
380
+ ctx context.Context ,
381
+ ast * asset.Asset ,
382
+ patchData map [string ]interface {},
383
+ ) (assetID string , err error ) {
384
+ err = r .client .RunWithinTx (ctx , func (tx * sqlx.Tx ) (err error ) {
382
385
fetchedAsset , err := r .GetByURNWithTx (ctx , tx , ast .URN )
383
386
if errors .As (err , new (asset.NotFoundError )) {
384
387
err = nil
@@ -389,31 +392,41 @@ func (r *AssetRepository) Upsert(ctx context.Context, ast *asset.Asset) (asset.A
389
392
390
393
if fetchedAsset .ID == "" {
391
394
// insert flow
392
- upsertedAsset , err = r .insert (ctx , tx , ast )
395
+ if err := r .validateAsset (* ast ); err != nil {
396
+ return err
397
+ }
398
+ assetID , err = r .insert (ctx , tx , ast )
393
399
if err != nil {
394
400
return fmt .Errorf ("error inserting asset to DB: %w" , err )
395
401
}
396
-
397
402
return nil
398
403
}
399
404
405
+ // update flow
406
+ if err := copier .CopyWithOption (& ast , & fetchedAsset , copier.Option {DeepCopy : true }); err != nil {
407
+ return err
408
+ }
409
+ ast .Patch (patchData )
410
+ if err := r .validateAsset (* ast ); err != nil {
411
+ return err
412
+ }
400
413
changelog , err := fetchedAsset .Diff (ast )
401
414
if err != nil {
402
415
return fmt .Errorf ("error diffing two assets: %w" , err )
403
416
}
404
417
405
- upsertedAsset , err = r .update (ctx , tx , ast , & fetchedAsset , changelog )
406
- if err != nil {
418
+ if err := r .update (ctx , tx , ast , & fetchedAsset , changelog ); err != nil {
407
419
return fmt .Errorf ("error updating asset to DB: %w" , err )
408
420
}
421
+ assetID = fetchedAsset .ID
409
422
410
423
return nil
411
424
})
412
425
if err != nil {
413
- return asset. Asset {} , err
426
+ return "" , err
414
427
}
415
428
416
- return upsertedAsset , nil
429
+ return assetID , nil
417
430
}
418
431
419
432
func (* AssetRepository ) validateAsset (ast asset.Asset ) error {
@@ -631,7 +644,7 @@ func (r *AssetRepository) deleteWithPredicate(ctx context.Context, pred sq.Eq) (
631
644
return affectedRows , nil
632
645
}
633
646
634
- func (r * AssetRepository ) insert (ctx context.Context , tx * sqlx.Tx , ast * asset.Asset ) (asset. Asset , error ) {
647
+ func (r * AssetRepository ) insert (ctx context.Context , tx * sqlx.Tx , ast * asset.Asset ) (string , error ) {
635
648
currentTime := time .Now ()
636
649
if ast .RefreshedAt != nil {
637
650
currentTime = * ast .RefreshedAt
@@ -647,44 +660,35 @@ func (r *AssetRepository) insert(ctx context.Context, tx *sqlx.Tx, ast *asset.As
647
660
PlaceholderFormat (sq .Dollar ).
648
661
ToSql ()
649
662
if err != nil {
650
- return asset. Asset {} , fmt .Errorf ("build insert query: %w" , err )
663
+ return "" , fmt .Errorf ("build insert query: %w" , err )
651
664
}
652
665
653
666
ast .Version = asset .BaseVersion
654
667
655
668
var id string
656
669
err = tx .QueryRowContext (ctx , query , args ... ).Scan (& id )
657
670
if err != nil {
658
- return asset. Asset {} , fmt .Errorf ("run insert query: %w" , err )
671
+ return "" , fmt .Errorf ("run insert query: %w" , err )
659
672
}
660
673
ast .ID = id
661
674
662
675
users , err := r .createOrFetchUsers (ctx , tx , ast .Owners )
663
676
if err != nil {
664
- return asset. Asset {} , fmt .Errorf ("create and fetch owners: %w" , err )
677
+ return "" , fmt .Errorf ("create and fetch owners: %w" , err )
665
678
}
666
679
667
680
err = r .insertOwners (ctx , tx , ast .ID , users )
668
681
if err != nil {
669
- return asset.Asset {}, fmt .Errorf ("run insert owners query: %w" , err )
670
- }
671
-
672
- if err := r .insertAssetVersion (ctx , tx , ast , diff.Changelog {}); err != nil {
673
- return asset.Asset {}, err
682
+ return "" , fmt .Errorf ("run insert owners query: %w" , err )
674
683
}
675
684
676
- insertedAsset , err := r .GetByURNWithTx (ctx , tx , ast .URN )
677
- if err != nil {
678
- return asset.Asset {}, err
679
- }
680
-
681
- return insertedAsset , nil
685
+ return id , r .insertAssetVersion (ctx , tx , ast , diff.Changelog {})
682
686
}
683
687
684
- func (r * AssetRepository ) update (ctx context.Context , tx * sqlx.Tx , newAsset , oldAsset * asset.Asset , clog diff.Changelog ) (asset. Asset , error ) {
688
+ func (r * AssetRepository ) update (ctx context.Context , tx * sqlx.Tx , newAsset , oldAsset * asset.Asset , clog diff.Changelog ) error {
685
689
assetID := oldAsset .ID
686
690
if ! isValidUUID (assetID ) {
687
- return asset.Asset {}, asset. InvalidError {AssetID : assetID }
691
+ return asset.InvalidError {AssetID : assetID }
688
692
}
689
693
690
694
currentTime := time .Now ()
@@ -696,50 +700,45 @@ func (r *AssetRepository) update(ctx context.Context, tx *sqlx.Tx, newAsset, old
696
700
697
701
if len (clog ) == 0 {
698
702
if newAsset .RefreshedAt == nil || newAsset .RefreshedAt == oldAsset .RefreshedAt {
699
- return * newAsset , nil
703
+ return nil
700
704
}
701
705
702
- return * newAsset , r .updateAssetRefreshedAt (ctx , tx , assetID , currentTime )
706
+ return r .updateAssetRefreshedAt (ctx , tx , assetID , currentTime )
703
707
}
704
708
705
709
// update assets
706
710
newVersion , err := asset .IncreaseMinorVersion (oldAsset .Version )
707
711
if err != nil {
708
- return asset. Asset {}, err
712
+ return err
709
713
}
710
714
newAsset .Version = newVersion
711
- newAsset .ID = oldAsset . ID
715
+ newAsset .ID = assetID
712
716
newAsset .UpdatedAt = currentTime
713
717
newAsset .RefreshedAt = & currentTime
714
718
715
719
if err := r .updateAsset (ctx , tx , assetID , newAsset ); err != nil {
716
- return asset. Asset {}, err
720
+ return err
717
721
}
718
722
719
723
// insert versions
720
724
if err := r .insertAssetVersion (ctx , tx , newAsset , clog ); err != nil {
721
- return asset. Asset {}, err
725
+ return err
722
726
}
723
727
724
728
// managing owners
725
729
newAssetOwners , err := r .createOrFetchUsers (ctx , tx , newAsset .Owners )
726
730
if err != nil {
727
- return asset. Asset {}, fmt .Errorf ("error creating and fetching owners: %w" , err )
731
+ return fmt .Errorf ("error creating and fetching owners: %w" , err )
728
732
}
729
733
toInserts , toRemoves := r .compareOwners (oldAsset .Owners , newAssetOwners )
730
734
if err := r .insertOwners (ctx , tx , assetID , toInserts ); err != nil {
731
- return asset. Asset {}, fmt .Errorf ("error inserting asset's new owners: %w" , err )
735
+ return fmt .Errorf ("error inserting asset's new owners: %w" , err )
732
736
}
733
737
if err := r .removeOwners (ctx , tx , assetID , toRemoves ); err != nil {
734
- return asset. Asset {}, fmt .Errorf ("error removing asset's old owners: %w" , err )
738
+ return fmt .Errorf ("error removing asset's old owners: %w" , err )
735
739
}
736
740
737
- updatedAsset , err := r .GetByURNWithTx (ctx , tx , newAsset .URN )
738
- if err != nil {
739
- return asset.Asset {}, err
740
- }
741
-
742
- return updatedAsset , nil
741
+ return nil
743
742
}
744
743
745
744
func (r * AssetRepository ) updateAsset (ctx context.Context , tx * sqlx.Tx , assetID string , newAsset * asset.Asset ) error {
0 commit comments