appview: repo lexicon
Anirudh Oppiliappan 1 week ago 7 files (+354, -5)
MODIFIED
api/tangled/cbor_gen.go
MODIFIED
api/tangled/cbor_gen.go
@@ -602,3 +602,259 @@ }return nil}+func (t *Repo) MarshalCBOR(w io.Writer) error {+ if t == nil {+ _, err := w.Write(cbg.CborNull)+ return err+ }++ cw := cbg.NewCborWriter(w)+ fieldCount := 5++ if t.AddedAt == nil {+ fieldCount--+ }++ if _, err := cw.Write(cbg.CborEncodeMajorType(cbg.MajMap, uint64(fieldCount))); err != nil {+ return err+ }++ // t.Knot (string) (string)+ if len("knot") > 1000000 {+ return xerrors.Errorf("Value in field \"knot\" was too long")+ }++ if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("knot"))); err != nil {+ return err+ }+ if _, err := cw.WriteString(string("knot")); err != nil {+ return err+ }++ if len(t.Knot) > 1000000 {+ return xerrors.Errorf("Value in field t.Knot was too long")+ }++ if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.Knot))); err != nil {+ return err+ }+ if _, err := cw.WriteString(string(t.Knot)); err != nil {+ return err+ }++ // t.Name (string) (string)+ if len("name") > 1000000 {+ return xerrors.Errorf("Value in field \"name\" was too long")+ }++ if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("name"))); err != nil {+ return err+ }+ if _, err := cw.WriteString(string("name")); err != nil {+ return err+ }++ if len(t.Name) > 1000000 {+ return xerrors.Errorf("Value in field t.Name was too long")+ }++ if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.Name))); err != nil {+ return err+ }+ if _, err := cw.WriteString(string(t.Name)); err != nil {+ return err+ }++ // t.LexiconTypeID (string) (string)+ if len("$type") > 1000000 {+ return xerrors.Errorf("Value in field \"$type\" was too long")+ }++ if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("$type"))); err != nil {+ return err+ }+ if _, err := cw.WriteString(string("$type")); err != nil {+ return err+ }++ if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("sh.tangled.repo"))); err != nil {+ return err+ }+ if _, err := cw.WriteString(string("sh.tangled.repo")); err != nil {+ return err+ }++ // t.Owner (string) (string)+ if len("owner") > 1000000 {+ return xerrors.Errorf("Value in field \"owner\" was too long")+ }++ if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("owner"))); err != nil {+ return err+ }+ if _, err := cw.WriteString(string("owner")); err != nil {+ return err+ }++ if len(t.Owner) > 1000000 {+ return xerrors.Errorf("Value in field t.Owner was too long")+ }++ if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.Owner))); err != nil {+ return err+ }+ if _, err := cw.WriteString(string(t.Owner)); err != nil {+ return err+ }++ // t.AddedAt (string) (string)+ if t.AddedAt != nil {++ if len("addedAt") > 1000000 {+ return xerrors.Errorf("Value in field \"addedAt\" was too long")+ }++ if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("addedAt"))); err != nil {+ return err+ }+ if _, err := cw.WriteString(string("addedAt")); err != nil {+ return err+ }++ if t.AddedAt == nil {+ if _, err := cw.Write(cbg.CborNull); err != nil {+ return err+ }+ } else {+ if len(*t.AddedAt) > 1000000 {+ return xerrors.Errorf("Value in field t.AddedAt was too long")+ }++ if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(*t.AddedAt))); err != nil {+ return err+ }+ if _, err := cw.WriteString(string(*t.AddedAt)); err != nil {+ return err+ }+ }+ }+ return nil+}++func (t *Repo) UnmarshalCBOR(r io.Reader) (err error) {+ *t = Repo{}++ cr := cbg.NewCborReader(r)++ maj, extra, err := cr.ReadHeader()+ if err != nil {+ return err+ }+ defer func() {+ if err == io.EOF {+ err = io.ErrUnexpectedEOF+ }+ }()++ if maj != cbg.MajMap {+ return fmt.Errorf("cbor input should be of type map")+ }++ if extra > cbg.MaxLength {+ return fmt.Errorf("Repo: map struct too large (%d)", extra)+ }++ n := extra++ nameBuf := make([]byte, 7)+ for i := uint64(0); i < n; i++ {+ nameLen, ok, err := cbg.ReadFullStringIntoBuf(cr, nameBuf, 1000000)+ if err != nil {+ return err+ }++ if !ok {+ // Field doesn't exist on this type, so ignore it+ if err := cbg.ScanForLinks(cr, func(cid.Cid) {}); err != nil {+ return err+ }+ continue+ }++ switch string(nameBuf[:nameLen]) {+ // t.Knot (string) (string)+ case "knot":++ {+ sval, err := cbg.ReadStringWithMax(cr, 1000000)+ if err != nil {+ return err+ }++ t.Knot = string(sval)+ }+ // t.Name (string) (string)+ case "name":++ {+ sval, err := cbg.ReadStringWithMax(cr, 1000000)+ if err != nil {+ return err+ }++ t.Name = string(sval)+ }+ // t.LexiconTypeID (string) (string)+ case "$type":++ {+ sval, err := cbg.ReadStringWithMax(cr, 1000000)+ if err != nil {+ return err+ }++ t.LexiconTypeID = string(sval)+ }+ // t.Owner (string) (string)+ case "owner":++ {+ sval, err := cbg.ReadStringWithMax(cr, 1000000)+ if err != nil {+ return err+ }++ t.Owner = string(sval)+ }+ // t.AddedAt (string) (string)+ case "addedAt":++ {+ b, err := cr.ReadByte()+ if err != nil {+ return err+ }+ if b != cbg.CborNull[0] {+ if err := cr.UnreadByte(); err != nil {+ return err+ }++ sval, err := cbg.ReadStringWithMax(cr, 1000000)+ if err != nil {+ return err+ }++ t.AddedAt = (*string)(&sval)+ }+ }++ default:+ // Field doesn't exist on this type, so ignore it+ if err := cbg.ScanForLinks(r, func(cid.Cid) {}); err != nil {+ return err+ }+ }+ }++ return nil+}
@@ -0,0 +1,27 @@+// Code generated by cmd/lexgen (see Makefile's lexgen); DO NOT EDIT.++package tangled++// schema: sh.tangled.repo++import (+ "github.com/bluesky-social/indigo/lex/util"+)++const (+ RepoNSID = "sh.tangled.repo"+)++func init() {+ util.RegisterType("sh.tangled.repo", &Repo{})+} //+// RECORDTYPE: Repo+type Repo struct {+ LexiconTypeID string `json:"$type,const=sh.tangled.repo" cborgen:"$type,const=sh.tangled.repo"`+ AddedAt *string `json:"addedAt,omitempty" cborgen:"addedAt,omitempty"`+ // knot: knot where the repo was created+ Knot string `json:"knot" cborgen:"knot"`+ // name: name of the repo+ Name string `json:"name" cborgen:"name"`+ Owner string `json:"owner" cborgen:"owner"`+}
MODIFIED
appview/db/db.go
MODIFIED
appview/db/db.go
@@ -46,8 +46,9 @@ id integer primary key autoincrement,did text not null,name text not null,knot text not null,+ rkey text not null,created text not null default (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),- unique(did, name, knot)+ unique(did, name, knot, rkey));create table if not exists collaborators (id integer primary key autoincrement,
MODIFIED
appview/db/repos.go
MODIFIED
appview/db/repos.go
@@ -10,6 +10,7 @@ Did stringName stringKnot stringCreated *time.Time+ Rkey string}func (d *DB) GetAllReposByDid(did string) ([]Repo, error) {@@ -52,12 +53,12 @@ return &repo, nil}func (d *DB) AddRepo(repo *Repo) error {- _, err := d.db.Exec(`insert into repos (did, name, knot) values (?, ?, ?)`, repo.Did, repo.Name, repo.Knot)+ _, err := d.db.Exec(`insert into repos (did, name, knot, rkey) values (?, ?, ?, ?)`, repo.Did, repo.Name, repo.Knot, repo.Rkey)return err}-func (d *DB) RemoveRepo(did, name, knot string) error {- _, err := d.db.Exec(`delete from repos where did = ? and name = ? and knot = ?`, did, name, knot)+func (d *DB) RemoveRepo(did, name, rkey string) error {+ _, err := d.db.Exec(`delete from repos where did = ? and name = ? and rkey = ?`, did, name, rkey)return err}
MODIFIED
appview/state/state.go
MODIFIED
appview/state/state.go
@@ -535,14 +535,39 @@ case http.StatusNoContent:// continue}- // add to local db+ rkey := s.TID()repo := &db.Repo{Did: user.Did,Name: repoName,Knot: domain,+ Rkey: rkey,}++ xrpcClient, _ := s.auth.AuthorizedClient(r)++ addedAt := time.Now().Format(time.RFC3339)+ atresp, err := comatproto.RepoPutRecord(r.Context(), xrpcClient, &comatproto.RepoPutRecord_Input{+ Collection: tangled.RepoNSID,+ Repo: user.Did,+ Rkey: rkey,+ Record: &lexutil.LexiconTypeDecoder{+ Val: &tangled.Repo{+ Knot: repo.Knot,+ Name: repoName,+ AddedAt: &addedAt,+ Owner: user.Did,+ }},+ })+ if err != nil {+ log.Printf("failed to create record: %s", err)+ s.pages.Notice(w, "repo", "Failed to announce repository creation.")+ return+ }+ log.Println("created repo record: ", atresp.Uri)+err = s.db.AddRepo(repo)if err != nil {+ log.Println(err)s.pages.Notice(w, "repo", "Failed to save repository information.")return}
MODIFIED
cmd/gen.go
MODIFIED
cmd/gen.go
@@ -17,6 +17,7 @@ "tangled",shtangled.PublicKey{},shtangled.KnotMember{},shtangled.GraphFollow{},+ shtangled.Repo{},); err != nil {panic(err)}
ADDED
lexicons/repo.json
ADDED
lexicons/repo.json
@@ -0,0 +1,38 @@+{+ "lexicon": 1,+ "id": "sh.tangled.repo",+ "needsCbor": true,+ "needsType": true,+ "defs": {+ "main": {+ "type": "record",+ "key": "tid",+ "record": {+ "type": "object",+ "required": [+ "name",+ "knot",+ "owner"+ ],+ "properties": {+ "name": {+ "type": "string",+ "description": "name of the repo"+ },+ "owner": {+ "type": "string",+ "format": "did"+ },+ "knot": {+ "type": "string",+ "description": "knot where the repo was created"+ },+ "addedAt": {+ "type": "string",+ "format": "datetime"+ }+ }+ }+ }+ }+}