···3232 // like comment counts, parent repo etc.
3333 Comments []IssueComment
3434 Labels models.LabelState
3535- Repo *Repo
3535+ Repo *models.Repo
3636}
37373838func (i *Issue) AtUri() syntax.ATURI {
···376376 return nil, fmt.Errorf("failed to build repo mappings: %w", err)
377377 }
378378379379- repoMap := make(map[string]*Repo)
379379+ repoMap := make(map[string]*models.Repo)
380380 for i := range repos {
381381 repoMap[string(repos[i].RepoAt())] = &repos[i]
382382 }
···658658 return err
659659}
660660661661-type IssueCount struct {
662662- Open int
663663- Closed int
664664-}
665665-666666-func GetIssueCount(e Execer, repoAt syntax.ATURI) (IssueCount, error) {
661661+func GetIssueCount(e Execer, repoAt syntax.ATURI) (models.IssueCount, error) {
667662 row := e.QueryRow(`
668663 select
669664 count(case when open = 1 then 1 end) as open_count,
···673668 repoAt,
674669 )
675670676676- var count IssueCount
671671+ var count models.IssueCount
677672 if err := row.Scan(&count.Open, &count.Closed); err != nil {
678678- return IssueCount{0, 0}, err
673673+ return models.IssueCount{0, 0}, err
679674 }
680675681676 return count, nil
+4-3
appview/db/profile.go
···11111212 "github.com/bluesky-social/indigo/atproto/syntax"
1313 "tangled.org/core/api/tangled"
1414+ "tangled.org/core/appview/models"
1415)
15161617type RepoEvent struct {
1717- Repo *Repo
1818- Source *Repo
1818+ Repo *models.Repo
1919+ Source *models.Repo
1920}
20212122type ProfileTimeline struct {
···162163163164 for _, repo := range repos {
164165 // TODO: get this in the original query; requires COALESCE because nullable
165165- var sourceRepo *Repo
166166+ var sourceRepo *models.Repo
166167 if repo.Source != "" {
167168 sourceRepo, err = GetRepoByAtUri(e, repo.Source)
168169 if err != nil {
+8-14
appview/db/pulls.go
···11111212 "github.com/bluesky-social/indigo/atproto/syntax"
1313 "tangled.org/core/api/tangled"
1414+ "tangled.org/core/appview/models"
1415 "tangled.org/core/patchutil"
1516 "tangled.org/core/types"
1617)
···7980 PullSource *PullSource
80818182 // optionally, populate this when querying for reverse mappings
8282- Repo *Repo
8383+ Repo *models.Repo
8384}
84858586func (p Pull) AsRecord() tangled.RepoPull {
···109110 RepoAt *syntax.ATURI
110111111112 // optionally populate this for reverse mappings
112112- Repo *Repo
113113+ Repo *models.Repo
113114}
114115115116func (p PullSource) AsRecord() tangled.RepoPull_Source {
···723724 return nil, err
724725 }
725726726726- var pullSourceRepo *Repo
727727+ var pullSourceRepo *models.Repo
727728 if pull.PullSource != nil {
728729 if pull.PullSource.RepoAt != nil {
729730 pullSourceRepo, err = GetRepoByAtUri(e, pull.PullSource.RepoAt.String())
···776777777778 for rows.Next() {
778779 var pull Pull
779779- var repo Repo
780780+ var repo models.Repo
780781 var pullCreatedAt, repoCreatedAt string
781782 err := rows.Scan(
782783 &pull.OwnerDid,
···931932 return err
932933}
933934934934-type PullCount struct {
935935- Open int
936936- Merged int
937937- Closed int
938938- Deleted int
939939-}
940940-941941-func GetPullCount(e Execer, repoAt syntax.ATURI) (PullCount, error) {
935935+func GetPullCount(e Execer, repoAt syntax.ATURI) (models.PullCount, error) {
942936 row := e.QueryRow(`
943937 select
944938 count(case when state = ? then 1 end) as open_count,
···954948 repoAt,
955949 )
956950957957- var count PullCount
951951+ var count models.PullCount
958952 if err := row.Scan(&count.Open, &count.Merged, &count.Closed, &count.Deleted); err != nil {
959959- return PullCount{0, 0, 0, 0}, err
953953+ return models.PullCount{Open: 0, Merged: 0, Closed: 0, Deleted: 0}, err
960954 }
961955962956 return count, nil
+20-86
appview/db/repos.go
···1010 "time"
11111212 "github.com/bluesky-social/indigo/atproto/syntax"
1313- securejoin "github.com/cyphar/filepath-securejoin"
1414- "tangled.org/core/api/tangled"
1313+ "tangled.org/core/appview/models"
1514)
16151717-type Repo struct {
1818- Did string
1919- Name string
2020- Knot string
2121- Rkey string
2222- Created time.Time
2323- Description string
2424- Spindle string
2525- Labels []string
2626-2727- // optionally, populate this when querying for reverse mappings
2828- RepoStats *RepoStats
2929-3030- // optional
3131- Source string
3232-}
3333-3434-func (r *Repo) AsRecord() tangled.Repo {
3535- var source, spindle, description *string
3636-3737- if r.Source != "" {
3838- source = &r.Source
3939- }
4040-4141- if r.Spindle != "" {
4242- spindle = &r.Spindle
4343- }
4444-4545- if r.Description != "" {
4646- description = &r.Description
4747- }
4848-4949- return tangled.Repo{
5050- Knot: r.Knot,
5151- Name: r.Name,
5252- Description: description,
5353- CreatedAt: r.Created.Format(time.RFC3339),
5454- Source: source,
5555- Spindle: spindle,
5656- Labels: r.Labels,
5757- }
5858-}
5959-6060-func (r Repo) RepoAt() syntax.ATURI {
6161- return syntax.ATURI(fmt.Sprintf("at://%s/%s/%s", r.Did, tangled.RepoNSID, r.Rkey))
6262-}
6363-6464-func (r Repo) DidSlashRepo() string {
6565- p, _ := securejoin.SecureJoin(r.Did, r.Name)
6666- return p
6767-}
6868-6969-func GetRepos(e Execer, limit int, filters ...filter) ([]Repo, error) {
7070- repoMap := make(map[syntax.ATURI]*Repo)
1616+func GetRepos(e Execer, limit int, filters ...filter) ([]models.Repo, error) {
1717+ repoMap := make(map[syntax.ATURI]*models.Repo)
71187219 var conditions []string
7320 var args []any
···11158 }
1125911360 for rows.Next() {
114114- var repo Repo
6161+ var repo models.Repo
11562 var createdAt string
11663 var description, source, spindle sql.NullString
11764···14289 repo.Spindle = spindle.String
14390 }
14491145145- repo.RepoStats = &RepoStats{}
9292+ repo.RepoStats = &models.RepoStats{}
14693 repoMap[repo.RepoAt()] = &repo
14794 }
14895···320267 return nil, fmt.Errorf("failed to execute pulls-count query: %w ", err)
321268 }
322269323323- var repos []Repo
270270+ var repos []models.Repo
324271 for _, r := range repoMap {
325272 repos = append(repos, *r)
326273 }
327274328328- slices.SortFunc(repos, func(a, b Repo) int {
275275+ slices.SortFunc(repos, func(a, b models.Repo) int {
329276 if a.Created.After(b.Created) {
330277 return -1
331278 }
···336283}
337284338285// helper to get exactly one repo
339339-func GetRepo(e Execer, filters ...filter) (*Repo, error) {
286286+func GetRepo(e Execer, filters ...filter) (*models.Repo, error) {
340287 repos, err := GetRepos(e, 0, filters...)
341288 if err != nil {
342289 return nil, err
···377324 return count, nil
378325}
379326380380-func GetRepoByAtUri(e Execer, atUri string) (*Repo, error) {
381381- var repo Repo
327327+func GetRepoByAtUri(e Execer, atUri string) (*models.Repo, error) {
328328+ var repo models.Repo
382329 var nullableDescription sql.NullString
383330384331 row := e.QueryRow(`select did, name, knot, created, rkey, description from repos where at_uri = ?`, atUri)
···399346 return &repo, nil
400347}
401348402402-func AddRepo(e Execer, repo *Repo) error {
349349+func AddRepo(e Execer, repo *models.Repo) error {
403350 _, err := e.Exec(
404351 `insert into repos
405352 (did, name, knot, rkey, at_uri, description, source)
···423370 return nullableSource.String, nil
424371}
425372426426-func GetForksByDid(e Execer, did string) ([]Repo, error) {
427427- var repos []Repo
373373+func GetForksByDid(e Execer, did string) ([]models.Repo, error) {
374374+ var repos []models.Repo
428375429376 rows, err := e.Query(
430377 `select distinct r.did, r.name, r.knot, r.rkey, r.description, r.created, r.source
···442389 defer rows.Close()
443390444391 for rows.Next() {
445445- var repo Repo
392392+ var repo models.Repo
446393 var createdAt string
447394 var nullableDescription sql.NullString
448395 var nullableSource sql.NullString
···477424 return repos, nil
478425}
479426480480-func GetForkByDid(e Execer, did string, name string) (*Repo, error) {
481481- var repo Repo
427427+func GetForkByDid(e Execer, did string, name string) (*models.Repo, error) {
428428+ var repo models.Repo
482429 var createdAt string
483430 var nullableDescription sql.NullString
484431 var nullableSource sql.NullString
···525472 return err
526473}
527474528528-type RepoStats struct {
529529- Language string
530530- StarCount int
531531- IssueCount IssueCount
532532- PullCount PullCount
533533-}
534534-535535-type RepoLabel struct {
536536- Id int64
537537- RepoAt syntax.ATURI
538538- LabelAt syntax.ATURI
539539-}
540540-541541-func SubscribeLabel(e Execer, rl *RepoLabel) error {
475475+func SubscribeLabel(e Execer, rl *models.RepoLabel) error {
542476 query := `insert or ignore into repo_labels (repo_at, label_at) values (?, ?)`
543477544478 _, err := e.Exec(query, rl.RepoAt.String(), rl.LabelAt.String())
···563497 return err
564498}
565499566566-func GetRepoLabels(e Execer, filters ...filter) ([]RepoLabel, error) {
500500+func GetRepoLabels(e Execer, filters ...filter) ([]models.RepoLabel, error) {
567501 var conditions []string
568502 var args []any
569503 for _, filter := range filters {
···584518 }
585519 defer rows.Close()
586520587587- var labels []RepoLabel
521521+ var labels []models.RepoLabel
588522 for rows.Next() {
589589- var label RepoLabel
523523+ var label models.RepoLabel
590524591525 err := rows.Scan(&label.Id, &label.RepoAt, &label.LabelAt)
592526 if err != nil {
+7-6
appview/db/star.go
···99 "time"
10101111 "github.com/bluesky-social/indigo/atproto/syntax"
1212+ "tangled.org/core/appview/models"
1213)
13141415type Star struct {
···1819 Rkey string
19202021 // optionally, populate this when querying for reverse mappings
2121- Repo *Repo
2222+ Repo *models.Repo
2223}
23242425func (star *Star) ResolveRepo(e Execer) error {
···284285285286 for rows.Next() {
286287 var star Star
287287- var repo Repo
288288+ var repo models.Repo
288289 var starCreatedAt, repoCreatedAt string
289290290291 if err := rows.Scan(
···322323}
323324324325// GetTopStarredReposLastWeek returns the top 8 most starred repositories from the last week
325325-func GetTopStarredReposLastWeek(e Execer) ([]Repo, error) {
326326+func GetTopStarredReposLastWeek(e Execer) ([]models.Repo, error) {
326327 // first, get the top repo URIs by star count from the last week
327328 query := `
328329 with recent_starred_repos as (
···366367 }
367368368369 if len(repoUris) == 0 {
369369- return []Repo{}, nil
370370+ return []models.Repo{}, nil
370371 }
371372372373 // get full repo data
···376377 }
377378378379 // sort repos by the original trending order
379379- repoMap := make(map[string]Repo)
380380+ repoMap := make(map[string]models.Repo)
380381 for _, repo := range repos {
381382 repoMap[repo.RepoAt().String()] = repo
382383 }
383384384384- orderedRepos := make([]Repo, 0, len(repoUris))
385385+ orderedRepos := make([]models.Repo, 0, len(repoUris))
385386 for _, uri := range repoUris {
386387 if repo, exists := repoMap[uri]; exists {
387388 orderedRepos = append(orderedRepos, repo)
+8-8
appview/db/timeline.go
···99)
10101111type TimelineEvent struct {
1212- *Repo
1212+ *models.Repo
1313 *models.Follow
1414 *Star
15151616 EventAt time.Time
17171818 // optional: populate only if Repo is a fork
1919- Source *Repo
1919+ Source *models.Repo
20202121 // optional: populate only if event is Follow
2222 *Profile
···6464 return events, nil
6565}
66666767-func fetchStarStatuses(e Execer, loggedInUserDid string, repos []Repo) (map[string]bool, error) {
6767+func fetchStarStatuses(e Execer, loggedInUserDid string, repos []models.Repo) (map[string]bool, error) {
6868 if loggedInUserDid == "" {
6969 return nil, nil
7070 }
···7777 return GetStarStatuses(e, loggedInUserDid, repoAts)
7878}
79798080-func getRepoStarInfo(repo *Repo, starStatuses map[string]bool) (bool, int64) {
8080+func getRepoStarInfo(repo *models.Repo, starStatuses map[string]bool) (bool, int64) {
8181 var isStarred bool
8282 if starStatuses != nil {
8383 isStarred = starStatuses[repo.RepoAt().String()]
···105105 }
106106 }
107107108108- var origRepos []Repo
108108+ var origRepos []models.Repo
109109 if args != nil {
110110 origRepos, err = GetRepos(e, 0, FilterIn("at_uri", args))
111111 }
···113113 return nil, err
114114 }
115115116116- uriToRepo := make(map[string]Repo)
116116+ uriToRepo := make(map[string]models.Repo)
117117 for _, r := range origRepos {
118118 uriToRepo[r.RepoAt().String()] = r
119119 }
···125125126126 var events []TimelineEvent
127127 for _, r := range repos {
128128- var source *Repo
128128+ var source *models.Repo
129129 if r.Source != "" {
130130 if origRepo, ok := uriToRepo[r.Source]; ok {
131131 source = &origRepo
···162162 }
163163 stars = stars[:n]
164164165165- var repos []Repo
165165+ var repos []models.Repo
166166 for _, s := range stars {
167167 repos = append(repos, *s.Repo)
168168 }
+2-1
appview/knots/knots.go
···1313 "tangled.org/core/appview/config"
1414 "tangled.org/core/appview/db"
1515 "tangled.org/core/appview/middleware"
1616+ "tangled.org/core/appview/models"
1617 "tangled.org/core/appview/oauth"
1718 "tangled.org/core/appview/pages"
1819 "tangled.org/core/appview/serververify"
···119120 }
120121121122 // organize repos by did
122122- repoMap := make(map[string][]db.Repo)
123123+ repoMap := make(map[string][]models.Repo)
123124 for _, r := range repos {
124125 repoMap[r.Did] = append(repoMap[r.Did], r)
125126 }
···131131 }
132132133133 // filter out ones that are pinned
134134- pinnedRepos := []db.Repo{}
134134+ pinnedRepos := []models.Repo{}
135135 for i, r := range repos {
136136 // if this is a pinned repo, add it
137137 if slices.Contains(profile.Profile.PinnedRepos[:], r.RepoAt()) {
···149149 l.Error("failed to fetch collaborating repos", "err", err)
150150 }
151151152152- pinnedCollaboratingRepos := []db.Repo{}
152152+ pinnedCollaboratingRepos := []models.Repo{}
153153 for _, r := range collaboratingRepos {
154154 // if this is a pinned repo, add it
155155 if slices.Contains(profile.Profile.PinnedRepos[:], r.RepoAt()) {