+22
-1
appview/db/repos.go
+22
-1
appview/db/repos.go
···
31
31
}
32
32
33
33
func (r *Repo) AsRecord() tangled.Repo {
34
-
return tangled.Repo{}
34
+
var source, spindle, description *string
35
+
36
+
if r.Source != "" {
37
+
source = &r.Source
38
+
}
39
+
40
+
if r.Spindle != "" {
41
+
spindle = &r.Spindle
42
+
}
43
+
44
+
if r.Description != "" {
45
+
description = &r.Description
46
+
}
47
+
48
+
return tangled.Repo{
49
+
Knot: r.Knot,
50
+
Name: r.Name,
51
+
Description: description,
52
+
CreatedAt: r.Created.Format(time.RFC3339),
53
+
Source: source,
54
+
Spindle: spindle,
55
+
}
35
56
}
36
57
37
58
func (r Repo) RepoAt() syntax.ATURI {
+29
-41
appview/repo/repo.go
+29
-41
appview/repo/repo.go
···
295
295
return
296
296
}
297
297
298
+
newRepo := f.Repo
299
+
newRepo.Description = newDescription
300
+
record := newRepo.AsRecord()
301
+
298
302
// this is a bit of a pain because the golang atproto impl does not allow nil SwapRecord field
299
303
//
300
304
// SwapRecord is optional and should happen automagically, but given that it does not, we have to perform two requests
301
-
ex, err := client.RepoGetRecord(r.Context(), "", tangled.RepoNSID, user.Did, rkey)
305
+
ex, err := client.RepoGetRecord(r.Context(), "", tangled.RepoNSID, newRepo.Did, newRepo.Rkey)
302
306
if err != nil {
303
307
// failed to get record
304
308
rp.pages.Notice(w, "repo-notice", "Failed to update description, no record found on PDS.")
···
306
310
}
307
311
_, err = client.RepoPutRecord(r.Context(), &comatproto.RepoPutRecord_Input{
308
312
Collection: tangled.RepoNSID,
309
-
Repo: user.Did,
310
-
Rkey: rkey,
313
+
Repo: newRepo.Did,
314
+
Rkey: newRepo.Rkey,
311
315
SwapRecord: ex.Cid,
312
316
Record: &lexutil.LexiconTypeDecoder{
313
-
Val: &tangled.Repo{
314
-
Knot: f.Knot,
315
-
Name: f.Name,
316
-
CreatedAt: f.Created.Format(time.RFC3339),
317
-
Description: &newDescription,
318
-
Spindle: &f.Spindle,
319
-
},
317
+
Val: &record,
320
318
},
321
319
})
322
320
···
870
868
return
871
869
}
872
870
873
-
repoAt := f.RepoAt()
874
-
rkey := repoAt.RecordKey().String()
875
-
if rkey == "" {
876
-
fail("Failed to resolve repo. Try again later", err)
877
-
return
878
-
}
879
-
880
871
newSpindle := r.FormValue("spindle")
881
872
removingSpindle := newSpindle == "[[none]]" // see pages/templates/repo/settings/pipelines.html for more info on why we use this value
882
873
client, err := rp.oauth.AuthorizedClient(r)
···
899
890
}
900
891
}
901
892
893
+
newRepo := f.Repo
894
+
newRepo.Spindle = newSpindle
895
+
record := newRepo.AsRecord()
896
+
902
897
spindlePtr := &newSpindle
903
898
if removingSpindle {
904
899
spindlePtr = nil
900
+
newRepo.Spindle = ""
905
901
}
906
902
907
903
// optimistic update
908
-
err = db.UpdateSpindle(rp.db, string(repoAt), spindlePtr)
904
+
err = db.UpdateSpindle(rp.db, newRepo.RepoAt().String(), spindlePtr)
909
905
if err != nil {
910
906
fail("Failed to update spindle. Try again later.", err)
911
907
return
912
908
}
913
909
914
-
ex, err := client.RepoGetRecord(r.Context(), "", tangled.RepoNSID, user.Did, rkey)
910
+
ex, err := client.RepoGetRecord(r.Context(), "", tangled.RepoNSID, newRepo.Did, newRepo.Rkey)
915
911
if err != nil {
916
912
fail("Failed to update spindle, no record found on PDS.", err)
917
913
return
918
914
}
919
915
_, err = client.RepoPutRecord(r.Context(), &comatproto.RepoPutRecord_Input{
920
916
Collection: tangled.RepoNSID,
921
-
Repo: user.Did,
922
-
Rkey: rkey,
917
+
Repo: newRepo.Did,
918
+
Rkey: newRepo.Rkey,
923
919
SwapRecord: ex.Cid,
924
920
Record: &lexutil.LexiconTypeDecoder{
925
-
Val: &tangled.Repo{
926
-
Knot: f.Knot,
927
-
Name: f.Name,
928
-
CreatedAt: f.Created.Format(time.RFC3339),
929
-
Description: &f.Description,
930
-
Spindle: spindlePtr,
931
-
},
921
+
Val: &record,
932
922
},
933
923
})
934
924
···
1049
1039
return
1050
1040
}
1051
1041
1052
-
err = db.AddCollaborator(rp.db, db.Collaborator{
1042
+
err = db.AddCollaborator(tx, db.Collaborator{
1053
1043
Did: syntax.DID(currentUser.Did),
1054
1044
Rkey: rkey,
1055
1045
SubjectDid: collaboratorIdent.DID,
···
1586
1576
// create an atproto record for this fork
1587
1577
rkey := tid.TID()
1588
1578
repo := &db.Repo{
1589
-
Did: user.Did,
1590
-
Name: forkName,
1591
-
Knot: targetKnot,
1592
-
Rkey: rkey,
1593
-
Source: sourceAt,
1579
+
Did: user.Did,
1580
+
Name: forkName,
1581
+
Knot: targetKnot,
1582
+
Rkey: rkey,
1583
+
Source: sourceAt,
1584
+
Description: existingRepo.Description,
1585
+
Created: time.Now(),
1594
1586
}
1587
+
record := repo.AsRecord()
1595
1588
1596
1589
xrpcClient, err := rp.oauth.AuthorizedClient(r)
1597
1590
if err != nil {
···
1600
1593
return
1601
1594
}
1602
1595
1603
-
createdAt := time.Now().Format(time.RFC3339)
1604
1596
atresp, err := xrpcClient.RepoPutRecord(r.Context(), &comatproto.RepoPutRecord_Input{
1605
1597
Collection: tangled.RepoNSID,
1606
1598
Repo: user.Did,
1607
1599
Rkey: rkey,
1608
1600
Record: &lexutil.LexiconTypeDecoder{
1609
-
Val: &tangled.Repo{
1610
-
Knot: repo.Knot,
1611
-
Name: repo.Name,
1612
-
CreatedAt: createdAt,
1613
-
Source: &sourceAt,
1614
-
}},
1601
+
Val: &record,
1602
+
},
1615
1603
})
1616
1604
if err != nil {
1617
1605
l.Error("failed to write to PDS", "err", err)
+4
-6
appview/state/state.go
+4
-6
appview/state/state.go
···
430
430
Knot: domain,
431
431
Rkey: rkey,
432
432
Description: description,
433
+
Created: time.Now(),
433
434
}
435
+
record := repo.AsRecord()
434
436
435
437
xrpcClient, err := s.oauth.AuthorizedClient(r)
436
438
if err != nil {
···
439
441
return
440
442
}
441
443
442
-
createdAt := time.Now().Format(time.RFC3339)
443
444
atresp, err := xrpcClient.RepoPutRecord(r.Context(), &comatproto.RepoPutRecord_Input{
444
445
Collection: tangled.RepoNSID,
445
446
Repo: user.Did,
446
447
Rkey: rkey,
447
448
Record: &lexutil.LexiconTypeDecoder{
448
-
Val: &tangled.Repo{
449
-
Knot: repo.Knot,
450
-
Name: repoName,
451
-
CreatedAt: createdAt,
452
-
}},
449
+
Val: &record,
450
+
},
453
451
})
454
452
if err != nil {
455
453
l.Info("PDS write failed", "err", err)