@@ -43,22 +43,9 @@ func NewReferrerRepo(data *Data, wfRepo biz.WorkflowRepo, logger log.Logger) biz
43
43
}
44
44
}
45
45
46
- type storedReferrerMap map [string ]* ent. Referrer
46
+ type storedReferrerMap map [string ]uuid. UUID
47
47
48
48
func (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
-
62
49
// find the workflow
63
50
wf , err := r .workflowRepo .FindByID (ctx , workflowID )
64
51
if err != nil {
@@ -69,50 +56,54 @@ func (r *ReferrerRepo) Save(ctx context.Context, referrers []*biz.Referrer, work
69
56
70
57
storedMap := make (storedReferrerMap )
71
58
72
- for _ , r := range referrers {
59
+ for _ , ref := range referrers {
73
60
// 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 ).
77
64
AddWorkflowIDs (workflowID ).
78
65
OnConflictColumns (
79
66
referrer .FieldDigest , referrer .FieldKind ,
80
- ).UpdateNewValues ().Exec (ctx )
67
+ ).UpdateNewValues ().IDX (ctx )
81
68
if err != nil {
82
69
return fmt .Errorf ("failed to create referrer: %w" , err )
83
70
}
84
71
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 )
86
73
if err != nil {
87
74
return fmt .Errorf ("failed to load referrer: %w" , err )
75
+ } else if storedRef == nil {
76
+ return fmt .Errorf ("failed to load referrer: %w" , err )
88
77
}
89
78
90
79
// Store it in the map
91
- storedMap [r .MapID ()] = storedRef
80
+ storedMap [ref .MapID ()] = storedRef . ID
92
81
}
93
82
94
83
// 2 - define the relationship between referrers
95
- for _ , r := range referrers {
84
+ for _ , parentRef := range referrers {
96
85
// This is the current item stored in DB
97
- storedReferrer := storedMap [r .MapID ()]
86
+ storedReferrer := storedMap [parentRef .MapID ()]
98
87
// 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 {
100
90
// amd find it in the DB
101
91
storedReference , ok := storedMap [ref .MapID ()]
102
92
if ! ok {
103
93
return fmt .Errorf ("referrer %v not found" , ref )
104
94
}
105
95
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 )
111
97
}
112
- }
113
98
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
+ }
116
107
}
117
108
118
109
return nil
0 commit comments