forked from tangled.org/core
Monorepo for Tangled — https://tangled.org

appview: repo lexicon

Changed files
+354 -5
api
appview
cmd
lexicons
+256
api/tangled/cbor_gen.go
···
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
+
}
+27
api/tangled/tangledrepo.go
···
+
// 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"`
+
}
+2 -1
appview/db/db.go
···
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,
+4 -3
appview/db/repos.go
···
Name string
Knot string
Created *time.Time
+
Rkey string
}
func (d *DB) GetAllReposByDid(did string) ([]Repo, error) {
···
}
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
}
+26 -1
appview/state/state.go
···
// 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
}
+1
cmd/gen.go
···
shtangled.PublicKey{},
shtangled.KnotMember{},
shtangled.GraphFollow{},
+
shtangled.Repo{},
); err != nil {
panic(err)
}
+38
lexicons/repo.json
···
+
{
+
"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"
+
}
+
}
+
}
+
}
+
}
+
}