+256
api/tangled/cbor_gen.go
+256
api/tangled/cbor_gen.go
···
602
602
603
603
return nil
604
604
}
605
+
func (t *Repo) MarshalCBOR(w io.Writer) error {
606
+
if t == nil {
607
+
_, err := w.Write(cbg.CborNull)
608
+
return err
609
+
}
610
+
611
+
cw := cbg.NewCborWriter(w)
612
+
fieldCount := 5
613
+
614
+
if t.AddedAt == nil {
615
+
fieldCount--
616
+
}
617
+
618
+
if _, err := cw.Write(cbg.CborEncodeMajorType(cbg.MajMap, uint64(fieldCount))); err != nil {
619
+
return err
620
+
}
621
+
622
+
// t.Knot (string) (string)
623
+
if len("knot") > 1000000 {
624
+
return xerrors.Errorf("Value in field \"knot\" was too long")
625
+
}
626
+
627
+
if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("knot"))); err != nil {
628
+
return err
629
+
}
630
+
if _, err := cw.WriteString(string("knot")); err != nil {
631
+
return err
632
+
}
633
+
634
+
if len(t.Knot) > 1000000 {
635
+
return xerrors.Errorf("Value in field t.Knot was too long")
636
+
}
637
+
638
+
if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.Knot))); err != nil {
639
+
return err
640
+
}
641
+
if _, err := cw.WriteString(string(t.Knot)); err != nil {
642
+
return err
643
+
}
644
+
645
+
// t.Name (string) (string)
646
+
if len("name") > 1000000 {
647
+
return xerrors.Errorf("Value in field \"name\" was too long")
648
+
}
649
+
650
+
if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("name"))); err != nil {
651
+
return err
652
+
}
653
+
if _, err := cw.WriteString(string("name")); err != nil {
654
+
return err
655
+
}
656
+
657
+
if len(t.Name) > 1000000 {
658
+
return xerrors.Errorf("Value in field t.Name was too long")
659
+
}
660
+
661
+
if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.Name))); err != nil {
662
+
return err
663
+
}
664
+
if _, err := cw.WriteString(string(t.Name)); err != nil {
665
+
return err
666
+
}
667
+
668
+
// t.LexiconTypeID (string) (string)
669
+
if len("$type") > 1000000 {
670
+
return xerrors.Errorf("Value in field \"$type\" was too long")
671
+
}
672
+
673
+
if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("$type"))); err != nil {
674
+
return err
675
+
}
676
+
if _, err := cw.WriteString(string("$type")); err != nil {
677
+
return err
678
+
}
679
+
680
+
if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("sh.tangled.repo"))); err != nil {
681
+
return err
682
+
}
683
+
if _, err := cw.WriteString(string("sh.tangled.repo")); err != nil {
684
+
return err
685
+
}
686
+
687
+
// t.Owner (string) (string)
688
+
if len("owner") > 1000000 {
689
+
return xerrors.Errorf("Value in field \"owner\" was too long")
690
+
}
691
+
692
+
if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("owner"))); err != nil {
693
+
return err
694
+
}
695
+
if _, err := cw.WriteString(string("owner")); err != nil {
696
+
return err
697
+
}
698
+
699
+
if len(t.Owner) > 1000000 {
700
+
return xerrors.Errorf("Value in field t.Owner was too long")
701
+
}
702
+
703
+
if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.Owner))); err != nil {
704
+
return err
705
+
}
706
+
if _, err := cw.WriteString(string(t.Owner)); err != nil {
707
+
return err
708
+
}
709
+
710
+
// t.AddedAt (string) (string)
711
+
if t.AddedAt != nil {
712
+
713
+
if len("addedAt") > 1000000 {
714
+
return xerrors.Errorf("Value in field \"addedAt\" was too long")
715
+
}
716
+
717
+
if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("addedAt"))); err != nil {
718
+
return err
719
+
}
720
+
if _, err := cw.WriteString(string("addedAt")); err != nil {
721
+
return err
722
+
}
723
+
724
+
if t.AddedAt == nil {
725
+
if _, err := cw.Write(cbg.CborNull); err != nil {
726
+
return err
727
+
}
728
+
} else {
729
+
if len(*t.AddedAt) > 1000000 {
730
+
return xerrors.Errorf("Value in field t.AddedAt was too long")
731
+
}
732
+
733
+
if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(*t.AddedAt))); err != nil {
734
+
return err
735
+
}
736
+
if _, err := cw.WriteString(string(*t.AddedAt)); err != nil {
737
+
return err
738
+
}
739
+
}
740
+
}
741
+
return nil
742
+
}
743
+
744
+
func (t *Repo) UnmarshalCBOR(r io.Reader) (err error) {
745
+
*t = Repo{}
746
+
747
+
cr := cbg.NewCborReader(r)
748
+
749
+
maj, extra, err := cr.ReadHeader()
750
+
if err != nil {
751
+
return err
752
+
}
753
+
defer func() {
754
+
if err == io.EOF {
755
+
err = io.ErrUnexpectedEOF
756
+
}
757
+
}()
758
+
759
+
if maj != cbg.MajMap {
760
+
return fmt.Errorf("cbor input should be of type map")
761
+
}
762
+
763
+
if extra > cbg.MaxLength {
764
+
return fmt.Errorf("Repo: map struct too large (%d)", extra)
765
+
}
766
+
767
+
n := extra
768
+
769
+
nameBuf := make([]byte, 7)
770
+
for i := uint64(0); i < n; i++ {
771
+
nameLen, ok, err := cbg.ReadFullStringIntoBuf(cr, nameBuf, 1000000)
772
+
if err != nil {
773
+
return err
774
+
}
775
+
776
+
if !ok {
777
+
// Field doesn't exist on this type, so ignore it
778
+
if err := cbg.ScanForLinks(cr, func(cid.Cid) {}); err != nil {
779
+
return err
780
+
}
781
+
continue
782
+
}
783
+
784
+
switch string(nameBuf[:nameLen]) {
785
+
// t.Knot (string) (string)
786
+
case "knot":
787
+
788
+
{
789
+
sval, err := cbg.ReadStringWithMax(cr, 1000000)
790
+
if err != nil {
791
+
return err
792
+
}
793
+
794
+
t.Knot = string(sval)
795
+
}
796
+
// t.Name (string) (string)
797
+
case "name":
798
+
799
+
{
800
+
sval, err := cbg.ReadStringWithMax(cr, 1000000)
801
+
if err != nil {
802
+
return err
803
+
}
804
+
805
+
t.Name = string(sval)
806
+
}
807
+
// t.LexiconTypeID (string) (string)
808
+
case "$type":
809
+
810
+
{
811
+
sval, err := cbg.ReadStringWithMax(cr, 1000000)
812
+
if err != nil {
813
+
return err
814
+
}
815
+
816
+
t.LexiconTypeID = string(sval)
817
+
}
818
+
// t.Owner (string) (string)
819
+
case "owner":
820
+
821
+
{
822
+
sval, err := cbg.ReadStringWithMax(cr, 1000000)
823
+
if err != nil {
824
+
return err
825
+
}
826
+
827
+
t.Owner = string(sval)
828
+
}
829
+
// t.AddedAt (string) (string)
830
+
case "addedAt":
831
+
832
+
{
833
+
b, err := cr.ReadByte()
834
+
if err != nil {
835
+
return err
836
+
}
837
+
if b != cbg.CborNull[0] {
838
+
if err := cr.UnreadByte(); err != nil {
839
+
return err
840
+
}
841
+
842
+
sval, err := cbg.ReadStringWithMax(cr, 1000000)
843
+
if err != nil {
844
+
return err
845
+
}
846
+
847
+
t.AddedAt = (*string)(&sval)
848
+
}
849
+
}
850
+
851
+
default:
852
+
// Field doesn't exist on this type, so ignore it
853
+
if err := cbg.ScanForLinks(r, func(cid.Cid) {}); err != nil {
854
+
return err
855
+
}
856
+
}
857
+
}
858
+
859
+
return nil
860
+
}
+27
api/tangled/tangledrepo.go
+27
api/tangled/tangledrepo.go
···
1
+
// Code generated by cmd/lexgen (see Makefile's lexgen); DO NOT EDIT.
2
+
3
+
package tangled
4
+
5
+
// schema: sh.tangled.repo
6
+
7
+
import (
8
+
"github.com/bluesky-social/indigo/lex/util"
9
+
)
10
+
11
+
const (
12
+
RepoNSID = "sh.tangled.repo"
13
+
)
14
+
15
+
func init() {
16
+
util.RegisterType("sh.tangled.repo", &Repo{})
17
+
} //
18
+
// RECORDTYPE: Repo
19
+
type Repo struct {
20
+
LexiconTypeID string `json:"$type,const=sh.tangled.repo" cborgen:"$type,const=sh.tangled.repo"`
21
+
AddedAt *string `json:"addedAt,omitempty" cborgen:"addedAt,omitempty"`
22
+
// knot: knot where the repo was created
23
+
Knot string `json:"knot" cborgen:"knot"`
24
+
// name: name of the repo
25
+
Name string `json:"name" cborgen:"name"`
26
+
Owner string `json:"owner" cborgen:"owner"`
27
+
}
+2
-1
appview/db/db.go
+2
-1
appview/db/db.go
···
46
46
did text not null,
47
47
name text not null,
48
48
knot text not null,
49
+
rkey text not null,
49
50
created text not null default (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
50
-
unique(did, name, knot)
51
+
unique(did, name, knot, rkey)
51
52
);
52
53
create table if not exists collaborators (
53
54
id integer primary key autoincrement,
+4
-3
appview/db/repos.go
+4
-3
appview/db/repos.go
···
10
10
Name string
11
11
Knot string
12
12
Created *time.Time
13
+
Rkey string
13
14
}
14
15
15
16
func (d *DB) GetAllReposByDid(did string) ([]Repo, error) {
···
52
53
}
53
54
54
55
func (d *DB) AddRepo(repo *Repo) error {
55
-
_, err := d.db.Exec(`insert into repos (did, name, knot) values (?, ?, ?)`, repo.Did, repo.Name, repo.Knot)
56
+
_, err := d.db.Exec(`insert into repos (did, name, knot, rkey) values (?, ?, ?, ?)`, repo.Did, repo.Name, repo.Knot, repo.Rkey)
56
57
return err
57
58
}
58
59
59
-
func (d *DB) RemoveRepo(did, name, knot string) error {
60
-
_, err := d.db.Exec(`delete from repos where did = ? and name = ? and knot = ?`, did, name, knot)
60
+
func (d *DB) RemoveRepo(did, name, rkey string) error {
61
+
_, err := d.db.Exec(`delete from repos where did = ? and name = ? and rkey = ?`, did, name, rkey)
61
62
return err
62
63
}
63
64
+26
-1
appview/state/state.go
+26
-1
appview/state/state.go
···
535
535
// continue
536
536
}
537
537
538
-
// add to local db
538
+
rkey := s.TID()
539
539
repo := &db.Repo{
540
540
Did: user.Did,
541
541
Name: repoName,
542
542
Knot: domain,
543
+
Rkey: rkey,
543
544
}
545
+
546
+
xrpcClient, _ := s.auth.AuthorizedClient(r)
547
+
548
+
addedAt := time.Now().Format(time.RFC3339)
549
+
atresp, err := comatproto.RepoPutRecord(r.Context(), xrpcClient, &comatproto.RepoPutRecord_Input{
550
+
Collection: tangled.RepoNSID,
551
+
Repo: user.Did,
552
+
Rkey: rkey,
553
+
Record: &lexutil.LexiconTypeDecoder{
554
+
Val: &tangled.Repo{
555
+
Knot: repo.Knot,
556
+
Name: repoName,
557
+
AddedAt: &addedAt,
558
+
Owner: user.Did,
559
+
}},
560
+
})
561
+
if err != nil {
562
+
log.Printf("failed to create record: %s", err)
563
+
s.pages.Notice(w, "repo", "Failed to announce repository creation.")
564
+
return
565
+
}
566
+
log.Println("created repo record: ", atresp.Uri)
567
+
544
568
err = s.db.AddRepo(repo)
545
569
if err != nil {
570
+
log.Println(err)
546
571
s.pages.Notice(w, "repo", "Failed to save repository information.")
547
572
return
548
573
}
+1
cmd/gen.go
+1
cmd/gen.go
+38
lexicons/repo.json
+38
lexicons/repo.json
···
1
+
{
2
+
"lexicon": 1,
3
+
"id": "sh.tangled.repo",
4
+
"needsCbor": true,
5
+
"needsType": true,
6
+
"defs": {
7
+
"main": {
8
+
"type": "record",
9
+
"key": "tid",
10
+
"record": {
11
+
"type": "object",
12
+
"required": [
13
+
"name",
14
+
"knot",
15
+
"owner"
16
+
],
17
+
"properties": {
18
+
"name": {
19
+
"type": "string",
20
+
"description": "name of the repo"
21
+
},
22
+
"owner": {
23
+
"type": "string",
24
+
"format": "did"
25
+
},
26
+
"knot": {
27
+
"type": "string",
28
+
"description": "knot where the repo was created"
29
+
},
30
+
"addedAt": {
31
+
"type": "string",
32
+
"format": "datetime"
33
+
}
34
+
}
35
+
}
36
+
}
37
+
}
38
+
}