···3232 // like comment counts, parent repo etc.3333 Comments []IssueComment3434 Labels models.LabelState3535- Repo *Repo3535+ Repo *models.Repo3636}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 err659659}660660661661-type IssueCount struct {662662- Open int663663- Closed int664664-}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 select669664 count(case when open = 1 then 1 end) as open_count,···668673 repoAt,669674 )670675671671- var count IssueCount676676+ var count models.IssueCount672677 if err := row.Scan(&count.Open, &count.Closed); err != nil {673673- return IssueCount{0, 0}, err678678+ return models.IssueCount{0, 0}, err674679 }675680676681 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 *Repo1818- Source *Repo1818+ Repo *models.Repo1919+ Source *models.Repo1920}20212122type ProfileTimeline struct {···163162164163 for _, repo := range repos {165164 // TODO: get this in the original query; requires COALESCE because nullable166166- var sourceRepo *Repo165165+ var sourceRepo *models.Repo167166 if repo.Source != "" {168167 sourceRepo, err = GetRepoByAtUri(e, repo.Source)169168 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)···8079 PullSource *PullSource81808281 // optionally, populate this when querying for reverse mappings8383- Repo *Repo8282+ Repo *models.Repo8483}85848685func (p Pull) AsRecord() tangled.RepoPull {···110109 RepoAt *syntax.ATURI111110112111 // optionally populate this for reverse mappings113113- Repo *Repo112112+ Repo *models.Repo114113}115114116115func (p PullSource) AsRecord() tangled.RepoPull_Source {···724723 return nil, err725724 }726725727727- var pullSourceRepo *Repo726726+ var pullSourceRepo *models.Repo728727 if pull.PullSource != nil {729728 if pull.PullSource.RepoAt != nil {730729 pullSourceRepo, err = GetRepoByAtUri(e, pull.PullSource.RepoAt.String())···777776778777 for rows.Next() {779778 var pull Pull780780- var repo Repo779779+ var repo models.Repo781780 var pullCreatedAt, repoCreatedAt string782781 err := rows.Scan(783782 &pull.OwnerDid,···932931 return err933932}934933935935-type PullCount struct {936936- Open int937937- Merged int938938- Closed int939939- Deleted int940940-}941941-942942-func GetPullCount(e Execer, repoAt syntax.ATURI) (PullCount, error) {934934+func GetPullCount(e Execer, repoAt syntax.ATURI) (models.PullCount, error) {943935 row := e.QueryRow(`944936 select945937 count(case when state = ? then 1 end) as open_count,···948954 repoAt,949955 )950956951951- var count PullCount957957+ var count models.PullCount952958 if err := row.Scan(&count.Open, &count.Merged, &count.Closed, &count.Deleted); err != nil {953953- return PullCount{0, 0, 0, 0}, err959959+ return models.PullCount{Open: 0, Merged: 0, Closed: 0, Deleted: 0}, err954960 }955961956962 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 string1919- Name string2020- Knot string2121- Rkey string2222- Created time.Time2323- Description string2424- Spindle string2525- Labels []string2626-2727- // optionally, populate this when querying for reverse mappings2828- RepoStats *RepoStats2929-3030- // optional3131- Source string3232-}3333-3434-func (r *Repo) AsRecord() tangled.Repo {3535- var source, spindle, description *string3636-3737- if r.Source != "" {3838- source = &r.Source3939- }4040-4141- if r.Spindle != "" {4242- spindle = &r.Spindle4343- }4444-4545- if r.Description != "" {4646- description = &r.Description4747- }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 p6767-}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 []string7320 var args []any···58111 }5911260113 for rows.Next() {6161- var repo Repo114114+ var repo models.Repo62115 var createdAt string63116 var description, source, spindle sql.NullString64117···89142 repo.Spindle = spindle.String90143 }911449292- repo.RepoStats = &RepoStats{}145145+ repo.RepoStats = &models.RepoStats{}93146 repoMap[repo.RepoAt()] = &repo94147 }95148···267320 return nil, fmt.Errorf("failed to execute pulls-count query: %w ", err)268321 }269322270270- var repos []Repo323323+ var repos []models.Repo271324 for _, r := range repoMap {272325 repos = append(repos, *r)273326 }274327275275- slices.SortFunc(repos, func(a, b Repo) int {328328+ slices.SortFunc(repos, func(a, b models.Repo) int {276329 if a.Created.After(b.Created) {277330 return -1278331 }···283336}284337285338// helper to get exactly one repo286286-func GetRepo(e Execer, filters ...filter) (*Repo, error) {339339+func GetRepo(e Execer, filters ...filter) (*models.Repo, error) {287340 repos, err := GetRepos(e, 0, filters...)288341 if err != nil {289342 return nil, err···324377 return count, nil325378}326379327327-func GetRepoByAtUri(e Execer, atUri string) (*Repo, error) {328328- var repo Repo380380+func GetRepoByAtUri(e Execer, atUri string) (*models.Repo, error) {381381+ var repo models.Repo329382 var nullableDescription sql.NullString330383331384 row := e.QueryRow(`select did, name, knot, created, rkey, description from repos where at_uri = ?`, atUri)···346399 return &repo, nil347400}348401349349-func AddRepo(e Execer, repo *Repo) error {402402+func AddRepo(e Execer, repo *models.Repo) error {350403 _, err := e.Exec(351404 `insert into repos352405 (did, name, knot, rkey, at_uri, description, source)···370423 return nullableSource.String, nil371424}372425373373-func GetForksByDid(e Execer, did string) ([]Repo, error) {374374- var repos []Repo426426+func GetForksByDid(e Execer, did string) ([]models.Repo, error) {427427+ var repos []models.Repo375428376429 rows, err := e.Query(377430 `select distinct r.did, r.name, r.knot, r.rkey, r.description, r.created, r.source···389442 defer rows.Close()390443391444 for rows.Next() {392392- var repo Repo445445+ var repo models.Repo393446 var createdAt string394447 var nullableDescription sql.NullString395448 var nullableSource sql.NullString···424477 return repos, nil425478}426479427427-func GetForkByDid(e Execer, did string, name string) (*Repo, error) {428428- var repo Repo480480+func GetForkByDid(e Execer, did string, name string) (*models.Repo, error) {481481+ var repo models.Repo429482 var createdAt string430483 var nullableDescription sql.NullString431484 var nullableSource sql.NullString···472525 return err473526}474527475475-type RepoStats struct {476476- Language string477477- StarCount int478478- IssueCount IssueCount479479- PullCount PullCount480480-}481481-482482-type RepoLabel struct {483483- Id int64484484- RepoAt syntax.ATURI485485- LabelAt syntax.ATURI486486-}487487-488488-func SubscribeLabel(e Execer, rl *RepoLabel) error {528528+func SubscribeLabel(e Execer, rl *models.RepoLabel) error {489529 query := `insert or ignore into repo_labels (repo_at, label_at) values (?, ?)`490530491531 _, err := e.Exec(query, rl.RepoAt.String(), rl.LabelAt.String())···497563 return err498564}499565500500-func GetRepoLabels(e Execer, filters ...filter) ([]RepoLabel, error) {566566+func GetRepoLabels(e Execer, filters ...filter) ([]models.RepoLabel, error) {501567 var conditions []string502568 var args []any503569 for _, filter := range filters {···518584 }519585 defer rows.Close()520586521521- var labels []RepoLabel587587+ var labels []models.RepoLabel522588 for rows.Next() {523523- var label RepoLabel589589+ var label models.RepoLabel524590525591 err := rows.Scan(&label.Id, &label.RepoAt, &label.LabelAt)526592 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 {···1918 Rkey string20192120 // optionally, populate this when querying for reverse mappings2222- Repo *Repo2121+ Repo *models.Repo2322}24232524func (star *Star) ResolveRepo(e Execer) error {···285284286285 for rows.Next() {287286 var star Star288288- var repo Repo287287+ var repo models.Repo289288 var starCreatedAt, repoCreatedAt string290289291290 if err := rows.Scan(···323322}324323325324// GetTopStarredReposLastWeek returns the top 8 most starred repositories from the last week326326-func GetTopStarredReposLastWeek(e Execer) ([]Repo, error) {325325+func GetTopStarredReposLastWeek(e Execer) ([]models.Repo, error) {327326 // first, get the top repo URIs by star count from the last week328327 query := `329328 with recent_starred_repos as (···367366 }368367369368 if len(repoUris) == 0 {370370- return []Repo{}, nil369369+ return []models.Repo{}, nil371370 }372371373372 // get full repo data···377376 }378377379378 // sort repos by the original trending order380380- repoMap := make(map[string]Repo)379379+ repoMap := make(map[string]models.Repo)381380 for _, repo := range repos {382381 repoMap[repo.RepoAt().String()] = repo383382 }384383385385- orderedRepos := make([]Repo, 0, len(repoUris))384384+ orderedRepos := make([]models.Repo, 0, len(repoUris))386385 for _, uri := range repoUris {387386 if repo, exists := repoMap[uri]; exists {388387 orderedRepos = append(orderedRepos, repo)
+8-8
appview/db/timeline.go
···99)10101111type TimelineEvent struct {1212- *Repo1212+ *models.Repo1313 *models.Follow1414 *Star15151616 EventAt time.Time17171818 // optional: populate only if Repo is a fork1919- Source *Repo1919+ Source *models.Repo20202121 // optional: populate only if event is Follow2222 *Profile···6464 return events, nil6565}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, nil7070 }···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 bool8282 if starStatuses != nil {8383 isStarred = starStatuses[repo.RepoAt().String()]···105105 }106106 }107107108108- var origRepos []Repo108108+ var origRepos []models.Repo109109 if args != nil {110110 origRepos, err = GetRepos(e, 0, FilterIn("at_uri", args))111111 }···113113 return nil, err114114 }115115116116- uriToRepo := make(map[string]Repo)116116+ uriToRepo := make(map[string]models.Repo)117117 for _, r := range origRepos {118118 uriToRepo[r.RepoAt().String()] = r119119 }···125125126126 var events []TimelineEvent127127 for _, r := range repos {128128- var source *Repo128128+ var source *models.Repo129129 if r.Source != "" {130130 if origRepo, ok := uriToRepo[r.Source]; ok {131131 source = &origRepo···162162 }163163 stars = stars[:n]164164165165- var repos []Repo165165+ var repos []models.Repo166166 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"···120119 }121120122121 // organize repos by did123123- repoMap := make(map[string][]db.Repo)122122+ repoMap := make(map[string][]models.Repo)124123 for _, r := range repos {125124 repoMap[r.Did] = append(repoMap[r.Did], r)126125 }
···1616 "github.com/go-chi/chi/v5"1717 "tangled.org/core/appview/config"1818 "tangled.org/core/appview/db"1919+ "tangled.org/core/appview/models"1920 "tangled.org/core/appview/oauth"2021 "tangled.org/core/appview/pages"2122 "tangled.org/core/appview/pages/repoinfo"···2524)26252726type ResolvedRepo struct {2828- db.Repo2727+ models.Repo2928 OwnerId identity.Identity3029 CurrentDir string3130 Ref string···4544}46454746func (rr *RepoResolver) Resolve(r *http.Request) (*ResolvedRepo, error) {4848- repo, ok := r.Context().Value("repo").(*db.Repo)4747+ repo, ok := r.Context().Value("repo").(*models.Repo)4948 if !ok {5049 log.Println("malformed middleware: `repo` not exist in context")5150 return nil, fmt.Errorf("malformed middleware")···163162 log.Println("failed to get repo source for ", repoAt, err)164163 }165164166166- var sourceRepo *db.Repo165165+ var sourceRepo *models.Repo167166 if source != "" {168167 sourceRepo, err = db.GetRepoByAtUri(f.rr.execer, source)169168 if err != nil {···192191 Knot: knot,193192 Spindle: f.Spindle,194193 Roles: f.RolesInRepo(user),195195- Stats: db.RepoStats{194194+ Stats: models.RepoStats{196195 StarCount: starCount,197196 IssueCount: issueCount,198197 PullCount: pullCount,
+2-1
appview/spindles/spindles.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"···116115 }117116118117 // organize repos by did119119- repoMap := make(map[string][]db.Repo)118118+ repoMap := make(map[string][]models.Repo)120119 for _, r := range repos {121120 repoMap[r.Did] = append(repoMap[r.Did], r)122121 }
+4-4
appview/state/git_http.go
···8899 "github.com/bluesky-social/indigo/atproto/identity"1010 "github.com/go-chi/chi/v5"1111- "tangled.org/core/appview/db"1111+ "tangled.org/core/appview/models"1212)13131414func (s *State) InfoRefs(w http.ResponseWriter, r *http.Request) {1515 user := r.Context().Value("resolvedId").(identity.Identity)1616- repo := r.Context().Value("repo").(*db.Repo)1616+ repo := r.Context().Value("repo").(*models.Repo)17171818 scheme := "https"1919 if s.config.Core.Dev {···3131 http.Error(w, "failed to resolve user", http.StatusInternalServerError)3232 return3333 }3434- repo := r.Context().Value("repo").(*db.Repo)3434+ repo := r.Context().Value("repo").(*models.Repo)35353636 scheme := "https"3737 if s.config.Core.Dev {···4848 http.Error(w, "failed to resolve user", http.StatusInternalServerError)4949 return5050 }5151- repo := r.Context().Value("repo").(*db.Repo)5151+ repo := r.Context().Value("repo").(*models.Repo)52525353 scheme := "https"5454 if s.config.Core.Dev {
+2-2
appview/state/profile.go
···131131 }132132133133 // filter out ones that are pinned134134- pinnedRepos := []db.Repo{}134134+ pinnedRepos := []models.Repo{}135135 for i, r := range repos {136136 // if this is a pinned repo, add it137137 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 it155155 if slices.Contains(profile.Profile.PinnedRepos[:], r.RepoAt()) {