1package db
2
3import (
4 "fmt"
5 "strings"
6 "time"
7
8 "github.com/bluesky-social/indigo/atproto/syntax"
9)
10
11type Pipeline struct {
12 Id int
13 Rkey string
14 Knot string
15 RepoOwner syntax.DID
16 RepoName string
17 TriggerId int
18 Sha string
19
20 // populate when querying for revers mappings
21 Trigger *Trigger
22}
23
24type Trigger struct {
25 Id int
26 Kind string
27
28 // push trigger fields
29 PushRef *string
30 PushNewSha *string
31 PushOldSha *string
32
33 // pull request trigger fields
34 PRSourceBranch *string
35 PRTargetBranch *string
36 PRSourceSha *string
37 PRAction *string
38}
39
40type PipelineStatus struct {
41 ID int
42 Spindle string
43 Rkey string
44 PipelineKnot string
45 PipelineRkey string
46 Created time.Time
47 Workflow string
48 Status string
49 Error *string
50 ExitCode int
51}
52
53func GetPipelines(e Execer, filters ...filter) ([]Pipeline, error) {
54 var pipelines []Pipeline
55
56 var conditions []string
57 var args []any
58 for _, filter := range filters {
59 conditions = append(conditions, filter.Condition())
60 args = append(args, filter.arg)
61 }
62
63 whereClause := ""
64 if conditions != nil {
65 whereClause = " where " + strings.Join(conditions, " and ")
66 }
67
68 query := fmt.Sprintf(`select id, rkey, knot, repo_owner, repo_name, sha from pipelines %s`, whereClause)
69
70 rows, err := e.Query(query, args...)
71
72 if err != nil {
73 return nil, err
74 }
75 defer rows.Close()
76
77 for rows.Next() {
78 var pipeline Pipeline
79 err = rows.Scan(
80 &pipeline.Id,
81 &pipeline.Rkey,
82 &pipeline.Knot,
83 &pipeline.RepoOwner,
84 &pipeline.RepoName,
85 &pipeline.Sha,
86 )
87 if err != nil {
88 return nil, err
89 }
90
91 pipelines = append(pipelines, pipeline)
92 }
93
94 if err = rows.Err(); err != nil {
95 return nil, err
96 }
97
98 return pipelines, nil
99}
100
101func AddPipeline(e Execer, pipeline Pipeline) error {
102 args := []any{
103 pipeline.Rkey,
104 pipeline.Knot,
105 pipeline.RepoOwner,
106 pipeline.RepoName,
107 pipeline.TriggerId,
108 pipeline.Sha,
109 }
110
111 placeholders := make([]string, len(args))
112 for i := range placeholders {
113 placeholders[i] = "?"
114 }
115
116 query := fmt.Sprintf(`
117 insert or ignore into pipelines (
118 rkey,
119 knot,
120 repo_owner,
121 repo_name,
122 trigger_id,
123 sha
124 ) values (%s)
125 `, strings.Join(placeholders, ","))
126
127 _, err := e.Exec(query, args...)
128
129 return err
130}
131
132func AddTrigger(e Execer, trigger Trigger) (int64, error) {
133 args := []any{
134 trigger.Kind,
135 trigger.PushRef,
136 trigger.PushNewSha,
137 trigger.PushOldSha,
138 trigger.PRSourceBranch,
139 trigger.PRTargetBranch,
140 trigger.PRSourceSha,
141 trigger.PRAction,
142 }
143
144 placeholders := make([]string, len(args))
145 for i := range placeholders {
146 placeholders[i] = "?"
147 }
148
149 query := fmt.Sprintf(`insert or ignore into triggers (
150 kind,
151 push_ref,
152 push_new_sha,
153 push_old_sha,
154 pr_source_branch,
155 pr_target_branch,
156 pr_source_sha,
157 pr_action
158 ) values (%s)`, strings.Join(placeholders, ","))
159
160 res, err := e.Exec(query, args...)
161 if err != nil {
162 return 0, err
163 }
164
165 return res.LastInsertId()
166}
167
168func AddPipelineStatus(e Execer, status PipelineStatus) error {
169 args := []any{
170 status.Spindle,
171 status.Rkey,
172 status.PipelineKnot,
173 status.PipelineRkey,
174 status.Workflow,
175 status.Status,
176 status.Error,
177 status.ExitCode,
178 }
179
180 placeholders := make([]string, len(args))
181 for i := range placeholders {
182 placeholders[i] = "?"
183 }
184
185 query := fmt.Sprintf(`
186 insert or ignore into pipeline_statuses (
187 spindle,
188 rkey,
189 pipeline_knot,
190 pipeline_rkey,
191 workflow,
192 status,
193 error,
194 exit_code
195 ) values (%s)
196 `, strings.Join(placeholders, ","))
197
198 _, err := e.Exec(query, args...)
199 return err
200}