(ctx context.Context, referrers []*biz.Referrer, workflowID uuid.UUID)
| 56 | type storedReferrerMap map[string]uuid.UUID |
| 57 | |
| 58 | func (r *ReferrerRepo) Save(ctx context.Context, referrers []*biz.Referrer, workflowID uuid.UUID) (err error) { |
| 59 | ctx, span := otelx.Start(ctx, referrerRepoTracer, "ReferrerRepo.Save") |
| 60 | defer span.End() |
| 61 | |
| 62 | // find the workflow |
| 63 | wf, err := r.workflowRepo.FindByID(ctx, workflowID) |
| 64 | if err != nil { |
| 65 | return fmt.Errorf("failed to find workflow: %w", err) |
| 66 | } else if wf == nil { |
| 67 | return biz.NewErrNotFound("workflow") |
| 68 | } |
| 69 | |
| 70 | storedMap := make(storedReferrerMap) |
| 71 | |
| 72 | for _, ref := range referrers { |
| 73 | // Check if it exists already, if not create it |
| 74 | storedID, err := r.data.DB.Referrer.Create(). |
| 75 | SetDigest(ref.Digest).SetKind(ref.Kind).SetDownloadable(ref.Downloadable). |
| 76 | SetMetadata(ref.Metadata).SetAnnotations(ref.Annotations). |
| 77 | AddWorkflowIDs(workflowID). |
| 78 | OnConflictColumns( |
| 79 | referrer.FieldDigest, referrer.FieldKind, |
| 80 | ).UpdateNewValues().ID(ctx) |
| 81 | if err != nil { |
| 82 | return fmt.Errorf("failed to create referrer: %w", err) |
| 83 | } |
| 84 | |
| 85 | storedRef, err := r.data.DB.Referrer.Query().Select(referrer.FieldID).Where(referrer.ID(storedID)).First(ctx) |
| 86 | if err != nil { |
| 87 | return fmt.Errorf("failed to load referrer: %w", err) |
| 88 | } else if storedRef == nil { |
| 89 | return fmt.Errorf("failed to load referrer: %w", err) |
| 90 | } |
| 91 | |
| 92 | // Store it in the map |
| 93 | storedMap[ref.MapID()] = storedRef.ID |
| 94 | } |
| 95 | |
| 96 | // 2 - define the relationship between referrers |
| 97 | for _, parentRef := range referrers { |
| 98 | // This is the current item stored in DB |
| 99 | storedReferrer := storedMap[parentRef.MapID()] |
| 100 | // Iterate on the items it refer to (references) |
| 101 | var references []uuid.UUID |
| 102 | for _, ref := range parentRef.References { |
| 103 | // amd find it in the DB |
| 104 | storedReference, ok := storedMap[ref.MapID()] |
| 105 | if !ok { |
| 106 | return fmt.Errorf("referrer %v not found", ref) |
| 107 | } |
| 108 | |
| 109 | references = append(references, storedReference) |
| 110 | } |
| 111 | |
| 112 | if len(references) == 0 { |
| 113 | continue |
| 114 | } |
| 115 |
nothing calls this directly
no test coverage detected