···11 "tangled.org/core/appview/pages"
12 "tangled.org/core/appview/pagination"
13 "tangled.org/core/consts"
014)
1516func (s *State) GoodFirstIssues(w http.ResponseWriter, r *http.Request) {
···2021 goodFirstIssueLabel := s.config.Label.GoodFirstIssue
2223- gfiLabelDef, err := db.GetLabelDefinition(s.db, db.FilterEq("at_uri", goodFirstIssueLabel))
24 if err != nil {
25 log.Println("failed to get gfi label def", err)
26 s.pages.Error500(w)
27 return
28 }
2930- repoLabels, err := db.GetRepoLabels(s.db, db.FilterEq("label_at", goodFirstIssueLabel))
31 if err != nil {
32 log.Println("failed to get repo labels", err)
33 s.pages.Error503(w)
···55 pagination.Page{
56 Limit: 500,
57 },
58- db.FilterIn("repo_at", repoUris),
59- db.FilterEq("open", 1),
60 )
61 if err != nil {
62 log.Println("failed to get issues", err)
···132 }
133134 if len(uriList) > 0 {
135- allLabelDefs, err = db.GetLabelDefinitions(s.db, db.FilterIn("at_uri", uriList))
136 if err != nil {
137 log.Println("failed to fetch labels", err)
138 }
···11 "tangled.org/core/appview/pages"
12 "tangled.org/core/appview/pagination"
13 "tangled.org/core/consts"
14+ "tangled.org/core/orm"
15)
1617func (s *State) GoodFirstIssues(w http.ResponseWriter, r *http.Request) {
···2122 goodFirstIssueLabel := s.config.Label.GoodFirstIssue
2324+ gfiLabelDef, err := db.GetLabelDefinition(s.db, orm.FilterEq("at_uri", goodFirstIssueLabel))
25 if err != nil {
26 log.Println("failed to get gfi label def", err)
27 s.pages.Error500(w)
28 return
29 }
3031+ repoLabels, err := db.GetRepoLabels(s.db, orm.FilterEq("label_at", goodFirstIssueLabel))
32 if err != nil {
33 log.Println("failed to get repo labels", err)
34 s.pages.Error503(w)
···56 pagination.Page{
57 Limit: 500,
58 },
59+ orm.FilterIn("repo_at", repoUris),
60+ orm.FilterEq("open", 1),
61 )
62 if err != nil {
63 log.Println("failed to get issues", err)
···133 }
134135 if len(uriList) > 0 {
136+ allLabelDefs, err = db.GetLabelDefinitions(s.db, orm.FilterIn("at_uri", uriList))
137 if err != nil {
138 log.Println("failed to fetch labels", err)
139 }
+17
appview/state/git_http.go
···2526}
270000000000000000028func (s *State) UploadPack(w http.ResponseWriter, r *http.Request) {
29 user, ok := r.Context().Value("resolvedId").(identity.Identity)
30 if !ok {
···2526}
2728+func (s *State) UploadArchive(w http.ResponseWriter, r *http.Request) {
29+ user, ok := r.Context().Value("resolvedId").(identity.Identity)
30+ if !ok {
31+ http.Error(w, "failed to resolve user", http.StatusInternalServerError)
32+ return
33+ }
34+ repo := r.Context().Value("repo").(*models.Repo)
35+36+ scheme := "https"
37+ if s.config.Core.Dev {
38+ scheme = "http"
39+ }
40+41+ targetURL := fmt.Sprintf("%s://%s/%s/%s/git-upload-archive?%s", scheme, repo.Knot, user.DID, repo.Name, r.URL.RawQuery)
42+ s.proxyRequest(w, r, targetURL)
43+}
44+45func (s *State) UploadPack(w http.ResponseWriter, r *http.Request) {
46 user, ok := r.Context().Value("resolvedId").(identity.Identity)
47 if !ok {
···1+package db
2+3+import (
4+ "context"
5+ "database/sql"
6+ "log/slog"
7+ "strings"
8+9+ _ "github.com/mattn/go-sqlite3"
10+ "tangled.org/core/log"
11+)
12+13+type DB struct {
14+ db *sql.DB
15+ logger *slog.Logger
16+}
17+18+func Setup(ctx context.Context, dbPath string) (*DB, error) {
19+ // https://github.com/mattn/go-sqlite3#connection-string
20+ opts := []string{
21+ "_foreign_keys=1",
22+ "_journal_mode=WAL",
23+ "_synchronous=NORMAL",
24+ "_auto_vacuum=incremental",
25+ }
26+27+ logger := log.FromContext(ctx)
28+ logger = log.SubLogger(logger, "db")
29+30+ db, err := sql.Open("sqlite3", dbPath+"?"+strings.Join(opts, "&"))
31+ if err != nil {
32+ return nil, err
33+ }
34+35+ conn, err := db.Conn(ctx)
36+ if err != nil {
37+ return nil, err
38+ }
39+ defer conn.Close()
40+41+ _, err = conn.ExecContext(ctx, `
42+ create table if not exists known_dids (
43+ did text primary key
44+ );
45+46+ create table if not exists public_keys (
47+ id integer primary key autoincrement,
48+ did text not null,
49+ key text not null,
50+ created text not null default (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
51+ unique(did, key),
52+ foreign key (did) references known_dids(did) on delete cascade
53+ );
54+55+ create table if not exists _jetstream (
56+ id integer primary key autoincrement,
57+ last_time_us integer not null
58+ );
59+60+ create table if not exists events (
61+ rkey text not null,
62+ nsid text not null,
63+ event text not null, -- json
64+ created integer not null default (strftime('%s', 'now')),
65+ primary key (rkey, nsid)
66+ );
67+68+ create table if not exists migrations (
69+ id integer primary key autoincrement,
70+ name text unique
71+ );
72+ `)
73+ if err != nil {
74+ return nil, err
75+ }
76+77+ return &DB{
78+ db: db,
79+ logger: logger,
80+ }, nil
81+}
-64
knotserver/db/init.go
···1-package db
2-3-import (
4- "database/sql"
5- "strings"
6-7- _ "github.com/mattn/go-sqlite3"
8-)
9-10-type DB struct {
11- db *sql.DB
12-}
13-14-func Setup(dbPath string) (*DB, error) {
15- // https://github.com/mattn/go-sqlite3#connection-string
16- opts := []string{
17- "_foreign_keys=1",
18- "_journal_mode=WAL",
19- "_synchronous=NORMAL",
20- "_auto_vacuum=incremental",
21- }
22-23- db, err := sql.Open("sqlite3", dbPath+"?"+strings.Join(opts, "&"))
24- if err != nil {
25- return nil, err
26- }
27-28- // NOTE: If any other migration is added here, you MUST
29- // copy the pattern in appview: use a single sql.Conn
30- // for every migration.
31-32- _, err = db.Exec(`
33- create table if not exists known_dids (
34- did text primary key
35- );
36-37- create table if not exists public_keys (
38- id integer primary key autoincrement,
39- did text not null,
40- key text not null,
41- created text not null default (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
42- unique(did, key),
43- foreign key (did) references known_dids(did) on delete cascade
44- );
45-46- create table if not exists _jetstream (
47- id integer primary key autoincrement,
48- last_time_us integer not null
49- );
50-51- create table if not exists events (
52- rkey text not null,
53- nsid text not null,
54- event text not null, -- json
55- created integer not null default (strftime('%s', 'now')),
56- primary key (rkey, nsid)
57- );
58- `)
59- if err != nil {
60- return nil, err
61- }
62-63- return &DB{db: db}, nil
64-}