···
252
+
func GetBacklinks(e Execer, target syntax.ATURI) ([]models.RichReferenceLink, error) {
253
+
rows, err := e.Query(
254
+
`select from_at from reference_links
259
+
return nil, fmt.Errorf("query backlinks: %w", err)
264
+
backlinks []models.RichReferenceLink
265
+
backlinksMap = make(map[string][]syntax.ATURI)
268
+
var from syntax.ATURI
269
+
if err := rows.Scan(&from); err != nil {
270
+
return nil, fmt.Errorf("scan row: %w", err)
272
+
nsid := from.Collection().String()
273
+
backlinksMap[nsid] = append(backlinksMap[nsid], from)
275
+
if err := rows.Err(); err != nil {
276
+
return nil, fmt.Errorf("iterate rows: %w", err)
279
+
var ls []models.RichReferenceLink
280
+
ls, err = getIssueBacklinks(e, backlinksMap[tangled.RepoIssueNSID])
282
+
return nil, fmt.Errorf("get issue backlinks: %w", err)
284
+
backlinks = append(backlinks, ls...)
285
+
ls, err = getIssueCommentBacklinks(e, backlinksMap[tangled.RepoIssueCommentNSID])
287
+
return nil, fmt.Errorf("get issue_comment backlinks: %w", err)
289
+
backlinks = append(backlinks, ls...)
290
+
ls, err = getPullBacklinks(e, backlinksMap[tangled.RepoPullNSID])
292
+
return nil, fmt.Errorf("get pull backlinks: %w", err)
294
+
backlinks = append(backlinks, ls...)
295
+
ls, err = getPullCommentBacklinks(e, backlinksMap[tangled.RepoPullCommentNSID])
297
+
return nil, fmt.Errorf("get pull_comment backlinks: %w", err)
299
+
backlinks = append(backlinks, ls...)
301
+
return backlinks, nil
304
+
func getIssueBacklinks(e Execer, aturis []syntax.ATURI) ([]models.RichReferenceLink, error) {
305
+
if len(aturis) == 0 {
308
+
vals := make([]string, len(aturis))
309
+
args := make([]any, 0, len(aturis)*2)
310
+
for i, aturi := range aturis {
312
+
did := aturi.Authority().String()
313
+
rkey := aturi.RecordKey().String()
314
+
args = append(args, did, rkey)
316
+
rows, err := e.Query(
318
+
`select r.did, r.name, i.issue_id, i.title, i.open
321
+
on r.at_uri = i.repo_at
322
+
where (i.did, i.rkey) in (%s)`,
323
+
strings.Join(vals, ","),
331
+
var refLinks []models.RichReferenceLink
333
+
var l models.RichReferenceLink
334
+
l.Kind = models.RefKindIssue
335
+
if err := rows.Scan(&l.Handle, &l.Repo, &l.SubjectId, &l.Title, &l.State); err != nil {
338
+
refLinks = append(refLinks, l)
340
+
if err := rows.Err(); err != nil {
341
+
return nil, fmt.Errorf("iterate rows: %w", err)
343
+
return refLinks, nil
346
+
func getIssueCommentBacklinks(e Execer, aturis []syntax.ATURI) ([]models.RichReferenceLink, error) {
347
+
if len(aturis) == 0 {
350
+
filter := FilterIn("c.at_uri", aturis)
351
+
rows, err := e.Query(
353
+
`select r.did, r.name, i.issue_id, c.id, i.title, i.open
354
+
from issue_comments c
356
+
on i.at_uri = c.issue_at
358
+
on r.at_uri = i.repo_at
360
+
filter.Condition(),
368
+
var refLinks []models.RichReferenceLink
370
+
var l models.RichReferenceLink
371
+
l.Kind = models.RefKindIssue
372
+
l.CommentId = new(int)
373
+
if err := rows.Scan(&l.Handle, &l.Repo, &l.SubjectId, l.CommentId, &l.Title, &l.State); err != nil {
376
+
refLinks = append(refLinks, l)
378
+
if err := rows.Err(); err != nil {
379
+
return nil, fmt.Errorf("iterate rows: %w", err)
381
+
return refLinks, nil
384
+
func getPullBacklinks(e Execer, aturis []syntax.ATURI) ([]models.RichReferenceLink, error) {
385
+
if len(aturis) == 0 {
388
+
vals := make([]string, len(aturis))
389
+
args := make([]any, 0, len(aturis)*2)
390
+
for i, aturi := range aturis {
392
+
did := aturi.Authority().String()
393
+
rkey := aturi.RecordKey().String()
394
+
args = append(args, did, rkey)
396
+
rows, err := e.Query(
398
+
`select r.did, r.name, p.pull_id, p.title, p.state
401
+
on r.at_uri = p.repo_at
402
+
where (p.owner_did, p.rkey) in (%s)`,
403
+
strings.Join(vals, ","),
411
+
var refLinks []models.RichReferenceLink
413
+
var l models.RichReferenceLink
414
+
l.Kind = models.RefKindPull
415
+
if err := rows.Scan(&l.Handle, &l.Repo, &l.SubjectId, &l.Title, &l.State); err != nil {
418
+
refLinks = append(refLinks, l)
420
+
if err := rows.Err(); err != nil {
421
+
return nil, fmt.Errorf("iterate rows: %w", err)
423
+
return refLinks, nil
426
+
func getPullCommentBacklinks(e Execer, aturis []syntax.ATURI) ([]models.RichReferenceLink, error) {
427
+
if len(aturis) == 0 {
430
+
filter := FilterIn("c.comment_at", aturis)
431
+
rows, err := e.Query(
433
+
`select r.did, r.name, p.pull_id, c.id, p.title, p.state
436
+
on r.at_uri = p.repo_at
437
+
join pull_comments c
438
+
on r.at_uri = c.repo_at and p.pull_id = c.pull_id
440
+
filter.Condition(),
448
+
var refLinks []models.RichReferenceLink
450
+
var l models.RichReferenceLink
451
+
l.Kind = models.RefKindPull
452
+
l.CommentId = new(int)
453
+
if err := rows.Scan(&l.Handle, &l.Repo, &l.SubjectId, l.CommentId, &l.Title, &l.State); err != nil {
456
+
refLinks = append(refLinks, l)
458
+
if err := rows.Err(); err != nil {
459
+
return nil, fmt.Errorf("iterate rows: %w", err)
461
+
return refLinks, nil