@@ -43,22 +43,9 @@ func NewReferrerRepo(data *Data, wfRepo biz.WorkflowRepo, logger log.Logger) biz
4343 }
4444}
4545
46- type storedReferrerMap map [string ]* ent. Referrer
46+ type storedReferrerMap map [string ]uuid. UUID
4747
4848func (r * ReferrerRepo ) Save (ctx context.Context , referrers []* biz.Referrer , workflowID uuid.UUID ) (err error ) {
49- // Start transaction
50- tx , err := r .data .DB .Tx (ctx )
51- if err != nil {
52- return fmt .Errorf ("failed to create transaction: %w" , err )
53- }
54-
55- defer func () {
56- // Unblock the row if there was an error
57- if err != nil {
58- _ = tx .Rollback ()
59- }
60- }()
61-
6249 // find the workflow
6350 wf , err := r .workflowRepo .FindByID (ctx , workflowID )
6451 if err != nil {
@@ -69,50 +56,54 @@ func (r *ReferrerRepo) Save(ctx context.Context, referrers []*biz.Referrer, work
6956
7057 storedMap := make (storedReferrerMap )
7158
72- for _ , r := range referrers {
59+ for _ , ref := range referrers {
7360 // Check if it exists already, if not create it
74- err := tx .Referrer .Create ().
75- SetDigest (r .Digest ).SetKind (r .Kind ).SetDownloadable (r .Downloadable ).
76- SetMetadata (r .Metadata ).SetAnnotations (r .Annotations ).
61+ storedID := r . data . DB .Referrer .Create ().
62+ SetDigest (ref .Digest ).SetKind (ref .Kind ).SetDownloadable (ref .Downloadable ).
63+ SetMetadata (ref .Metadata ).SetAnnotations (ref .Annotations ).
7764 AddWorkflowIDs (workflowID ).
7865 OnConflictColumns (
7966 referrer .FieldDigest , referrer .FieldKind ,
80- ).UpdateNewValues ().Exec (ctx )
67+ ).UpdateNewValues ().IDX (ctx )
8168 if err != nil {
8269 return fmt .Errorf ("failed to create referrer: %w" , err )
8370 }
8471
85- storedRef , err := tx . Referrer .Query ().Where (referrer .Digest ( r . Digest ), referrer . Kind ( r . Kind )).Only (ctx )
72+ storedRef , err := r . data . DB . Referrer .Query ().Select (referrer .FieldID ). Where ( referrer . ID ( storedID )).First (ctx )
8673 if err != nil {
8774 return fmt .Errorf ("failed to load referrer: %w" , err )
75+ } else if storedRef == nil {
76+ return fmt .Errorf ("failed to load referrer: %w" , err )
8877 }
8978
9079 // Store it in the map
91- storedMap [r .MapID ()] = storedRef
80+ storedMap [ref .MapID ()] = storedRef . ID
9281 }
9382
9483 // 2 - define the relationship between referrers
95- for _ , r := range referrers {
84+ for _ , parentRef := range referrers {
9685 // This is the current item stored in DB
97- storedReferrer := storedMap [r .MapID ()]
86+ storedReferrer := storedMap [parentRef .MapID ()]
9887 // Iterate on the items it refer to (references)
99- for _ , ref := range r .References {
88+ var references []uuid.UUID
89+ for _ , ref := range parentRef .References {
10090 // amd find it in the DB
10191 storedReference , ok := storedMap [ref .MapID ()]
10292 if ! ok {
10393 return fmt .Errorf ("referrer %v not found" , ref )
10494 }
10595
106- // Create the relationship
107- _ , err := storedReferrer .Update ().AddReferenceIDs (storedReference .ID ).Save (ctx )
108- if err != nil {
109- return fmt .Errorf ("failed to create referrer relationship: %w" , err )
110- }
96+ references = append (references , storedReference )
11197 }
112- }
11398
114- if err := tx .Commit (); err != nil {
115- return fmt .Errorf ("failed to commit transaction: %w" , err )
99+ if len (references ) == 0 {
100+ continue
101+ }
102+
103+ // Create the relationship
104+ if err := r .data .DB .Referrer .UpdateOneID (storedReferrer ).AddReferenceIDs (references ... ).Exec (ctx ); err != nil {
105+ return fmt .Errorf ("failed to create referrer relationship: %w" , err )
106+ }
116107 }
117108
118109 return nil
0 commit comments