appview: directly inherit Repo on ResolvedRepo #392

merged
opened by boltless.me targeting master from boltless.me/core: ref/inherit-repo
  • reduce duplicated codes
  • possibly remove/refactor ResolvedRepo in future
  • allow accessing db.Repo after it is resolved
Changed files
+65 -101
appview
db
issues
middleware
repo
reporesolver
state
+19 -19
appview/issues/issues.go
··· 73 return 74 } 75 76 - issue, comments, err := db.GetIssueWithComments(rp.db, f.RepoAt, issueIdInt) 77 if err != nil { 78 log.Println("failed to get issue and comments", err) 79 rp.pages.Notice(w, "issues", "Failed to load issue. Try again later.") ··· 142 return 143 } 144 145 - issue, err := db.GetIssue(rp.db, f.RepoAt, issueIdInt) 146 if err != nil { 147 log.Println("failed to get issue", err) 148 rp.pages.Notice(w, "issue-action", "Failed to close issue. Try again later.") ··· 186 return 187 } 188 189 - err = db.CloseIssue(rp.db, f.RepoAt, issueIdInt) 190 if err != nil { 191 log.Println("failed to close issue", err) 192 rp.pages.Notice(w, "issue-action", "Failed to close issue. Try again later.") ··· 218 return 219 } 220 221 - issue, err := db.GetIssue(rp.db, f.RepoAt, issueIdInt) 222 if err != nil { 223 log.Println("failed to get issue", err) 224 rp.pages.Notice(w, "issue-action", "Failed to close issue. Try again later.") ··· 235 isIssueOwner := user.Did == issue.OwnerDid 236 237 if isCollaborator || isIssueOwner { 238 - err := db.ReopenIssue(rp.db, f.RepoAt, issueIdInt) 239 if err != nil { 240 log.Println("failed to reopen issue", err) 241 rp.pages.Notice(w, "issue-action", "Failed to reopen issue. Try again later.") ··· 279 280 err := db.NewIssueComment(rp.db, &db.Comment{ 281 OwnerDid: user.Did, 282 - RepoAt: f.RepoAt, 283 Issue: issueIdInt, 284 CommentId: commentId, 285 Body: body, ··· 294 createdAt := time.Now().Format(time.RFC3339) 295 commentIdInt64 := int64(commentId) 296 ownerDid := user.Did 297 - issueAt, err := db.GetIssueAt(rp.db, f.RepoAt, issueIdInt) 298 if err != nil { 299 log.Println("failed to get issue at", err) 300 rp.pages.Notice(w, "issue-comment", "Failed to create comment.") 301 return 302 } 303 304 - atUri := f.RepoAt.String() 305 client, err := rp.oauth.AuthorizedClient(r) 306 if err != nil { 307 log.Println("failed to get authorized client", err) ··· 358 return 359 } 360 361 - issue, err := db.GetIssue(rp.db, f.RepoAt, issueIdInt) 362 if err != nil { 363 log.Println("failed to get issue", err) 364 rp.pages.Notice(w, "issues", "Failed to load issue. Try again later.") 365 return 366 } 367 368 - comment, err := db.GetComment(rp.db, f.RepoAt, issueIdInt, commentIdInt) 369 if err != nil { 370 http.Error(w, "bad comment id", http.StatusBadRequest) 371 return ··· 417 return 418 } 419 420 - issue, err := db.GetIssue(rp.db, f.RepoAt, issueIdInt) 421 if err != nil { 422 log.Println("failed to get issue", err) 423 rp.pages.Notice(w, "issues", "Failed to load issue. Try again later.") 424 return 425 } 426 427 - comment, err := db.GetComment(rp.db, f.RepoAt, issueIdInt, commentIdInt) 428 if err != nil { 429 http.Error(w, "bad comment id", http.StatusBadRequest) 430 return ··· 539 return 540 } 541 542 - issue, err := db.GetIssue(rp.db, f.RepoAt, issueIdInt) 543 if err != nil { 544 log.Println("failed to get issue", err) 545 rp.pages.Notice(w, "issues", "Failed to load issue. Try again later.") ··· 554 return 555 } 556 557 - comment, err := db.GetComment(rp.db, f.RepoAt, issueIdInt, commentIdInt) 558 if err != nil { 559 http.Error(w, "bad comment id", http.StatusBadRequest) 560 return ··· 572 573 // optimistic deletion 574 deleted := time.Now() 575 - err = db.DeleteComment(rp.db, f.RepoAt, issueIdInt, commentIdInt) 576 if err != nil { 577 log.Println("failed to delete comment") 578 rp.pages.Notice(w, fmt.Sprintf("comment-%s-status", commentId), "failed to delete comment") ··· 641 return 642 } 643 644 - issues, err := db.GetIssues(rp.db, f.RepoAt, isOpen, page) 645 if err != nil { 646 log.Println("failed to get issues", err) 647 rp.pages.Notice(w, "issues", "Failed to load issues. Try again later.") ··· 704 } 705 706 issue := &db.Issue{ 707 - RepoAt: f.RepoAt, 708 Title: title, 709 Body: body, 710 OwnerDid: user.Did, ··· 722 rp.pages.Notice(w, "issues", "Failed to create issue.") 723 return 724 } 725 - atUri := f.RepoAt.String() 726 resp, err := client.RepoPutRecord(r.Context(), &comatproto.RepoPutRecord_Input{ 727 Collection: tangled.RepoIssueNSID, 728 Repo: user.Did, ··· 743 return 744 } 745 746 - err = db.SetIssueAt(rp.db, f.RepoAt, issue.IssueId, resp.Uri) 747 if err != nil { 748 log.Println("failed to set issue at", err) 749 rp.pages.Notice(w, "issues", "Failed to create issue.")
··· 73 return 74 } 75 76 + issue, comments, err := db.GetIssueWithComments(rp.db, f.RepoAt(), issueIdInt) 77 if err != nil { 78 log.Println("failed to get issue and comments", err) 79 rp.pages.Notice(w, "issues", "Failed to load issue. Try again later.") ··· 142 return 143 } 144 145 + issue, err := db.GetIssue(rp.db, f.RepoAt(), issueIdInt) 146 if err != nil { 147 log.Println("failed to get issue", err) 148 rp.pages.Notice(w, "issue-action", "Failed to close issue. Try again later.") ··· 186 return 187 } 188 189 + err = db.CloseIssue(rp.db, f.RepoAt(), issueIdInt) 190 if err != nil { 191 log.Println("failed to close issue", err) 192 rp.pages.Notice(w, "issue-action", "Failed to close issue. Try again later.") ··· 218 return 219 } 220 221 + issue, err := db.GetIssue(rp.db, f.RepoAt(), issueIdInt) 222 if err != nil { 223 log.Println("failed to get issue", err) 224 rp.pages.Notice(w, "issue-action", "Failed to close issue. Try again later.") ··· 235 isIssueOwner := user.Did == issue.OwnerDid 236 237 if isCollaborator || isIssueOwner { 238 + err := db.ReopenIssue(rp.db, f.RepoAt(), issueIdInt) 239 if err != nil { 240 log.Println("failed to reopen issue", err) 241 rp.pages.Notice(w, "issue-action", "Failed to reopen issue. Try again later.") ··· 279 280 err := db.NewIssueComment(rp.db, &db.Comment{ 281 OwnerDid: user.Did, 282 + RepoAt: f.RepoAt(), 283 Issue: issueIdInt, 284 CommentId: commentId, 285 Body: body, ··· 294 createdAt := time.Now().Format(time.RFC3339) 295 commentIdInt64 := int64(commentId) 296 ownerDid := user.Did 297 + issueAt, err := db.GetIssueAt(rp.db, f.RepoAt(), issueIdInt) 298 if err != nil { 299 log.Println("failed to get issue at", err) 300 rp.pages.Notice(w, "issue-comment", "Failed to create comment.") 301 return 302 } 303 304 + atUri := f.RepoAt().String() 305 client, err := rp.oauth.AuthorizedClient(r) 306 if err != nil { 307 log.Println("failed to get authorized client", err) ··· 358 return 359 } 360 361 + issue, err := db.GetIssue(rp.db, f.RepoAt(), issueIdInt) 362 if err != nil { 363 log.Println("failed to get issue", err) 364 rp.pages.Notice(w, "issues", "Failed to load issue. Try again later.") 365 return 366 } 367 368 + comment, err := db.GetComment(rp.db, f.RepoAt(), issueIdInt, commentIdInt) 369 if err != nil { 370 http.Error(w, "bad comment id", http.StatusBadRequest) 371 return ··· 417 return 418 } 419 420 + issue, err := db.GetIssue(rp.db, f.RepoAt(), issueIdInt) 421 if err != nil { 422 log.Println("failed to get issue", err) 423 rp.pages.Notice(w, "issues", "Failed to load issue. Try again later.") 424 return 425 } 426 427 + comment, err := db.GetComment(rp.db, f.RepoAt(), issueIdInt, commentIdInt) 428 if err != nil { 429 http.Error(w, "bad comment id", http.StatusBadRequest) 430 return ··· 539 return 540 } 541 542 + issue, err := db.GetIssue(rp.db, f.RepoAt(), issueIdInt) 543 if err != nil { 544 log.Println("failed to get issue", err) 545 rp.pages.Notice(w, "issues", "Failed to load issue. Try again later.") ··· 554 return 555 } 556 557 + comment, err := db.GetComment(rp.db, f.RepoAt(), issueIdInt, commentIdInt) 558 if err != nil { 559 http.Error(w, "bad comment id", http.StatusBadRequest) 560 return ··· 572 573 // optimistic deletion 574 deleted := time.Now() 575 + err = db.DeleteComment(rp.db, f.RepoAt(), issueIdInt, commentIdInt) 576 if err != nil { 577 log.Println("failed to delete comment") 578 rp.pages.Notice(w, fmt.Sprintf("comment-%s-status", commentId), "failed to delete comment") ··· 641 return 642 } 643 644 + issues, err := db.GetIssues(rp.db, f.RepoAt(), isOpen, page) 645 if err != nil { 646 log.Println("failed to get issues", err) 647 rp.pages.Notice(w, "issues", "Failed to load issues. Try again later.") ··· 704 } 705 706 issue := &db.Issue{ 707 + RepoAt: f.RepoAt(), 708 Title: title, 709 Body: body, 710 OwnerDid: user.Did, ··· 722 rp.pages.Notice(w, "issues", "Failed to create issue.") 723 return 724 } 725 + atUri := f.RepoAt().String() 726 resp, err := client.RepoPutRecord(r.Context(), &comatproto.RepoPutRecord_Input{ 727 Collection: tangled.RepoIssueNSID, 728 Repo: user.Did, ··· 743 return 744 } 745 746 + err = db.SetIssueAt(rp.db, f.RepoAt(), issue.IssueId, resp.Uri) 747 if err != nil { 748 log.Println("failed to set issue at", err) 749 rp.pages.Notice(w, "issues", "Failed to create issue.")
+3 -8
appview/middleware/middleware.go
··· 8 "slices" 9 "strconv" 10 "strings" 11 - "time" 12 13 "github.com/bluesky-social/indigo/atproto/identity" 14 "github.com/go-chi/chi/v5" ··· 222 return 223 } 224 225 - ctx := context.WithValue(req.Context(), "knot", repo.Knot) 226 - ctx = context.WithValue(ctx, "repoAt", repo.AtUri) 227 - ctx = context.WithValue(ctx, "repoDescription", repo.Description) 228 - ctx = context.WithValue(ctx, "repoSpindle", repo.Spindle) 229 - ctx = context.WithValue(ctx, "repoAddedAt", repo.Created.Format(time.RFC3339)) 230 next.ServeHTTP(w, req.WithContext(ctx)) 231 }) 232 } ··· 251 return 252 } 253 254 - pr, err := db.GetPull(mw.db, f.RepoAt, prIdInt) 255 if err != nil { 256 log.Println("failed to get pull and comments", err) 257 return ··· 292 return 293 } 294 295 - fullName := f.OwnerHandle() + "/" + f.RepoName 296 297 if r.Header.Get("User-Agent") == "Go-http-client/1.1" { 298 if r.URL.Query().Get("go-get") == "1" {
··· 8 "slices" 9 "strconv" 10 "strings" 11 12 "github.com/bluesky-social/indigo/atproto/identity" 13 "github.com/go-chi/chi/v5" ··· 221 return 222 } 223 224 + ctx := context.WithValue(req.Context(), "repo", repo) 225 next.ServeHTTP(w, req.WithContext(ctx)) 226 }) 227 } ··· 246 return 247 } 248 249 + pr, err := db.GetPull(mw.db, f.RepoAt(), prIdInt) 250 if err != nil { 251 log.Println("failed to get pull and comments", err) 252 return ··· 287 return 288 } 289 290 + fullName := f.OwnerHandle() + "/" + f.Name 291 292 if r.Header.Get("User-Agent") == "Go-http-client/1.1" { 293 if r.URL.Query().Get("go-get") == "1" {
+6 -6
appview/repo/artifact.go
··· 76 Artifact: uploadBlobResp.Blob, 77 CreatedAt: createdAt.Format(time.RFC3339), 78 Name: handler.Filename, 79 - Repo: f.RepoAt.String(), 80 Tag: tag.Tag.Hash[:], 81 }, 82 }, ··· 100 artifact := db.Artifact{ 101 Did: user.Did, 102 Rkey: rkey, 103 - RepoAt: f.RepoAt, 104 Tag: tag.Tag.Hash, 105 CreatedAt: createdAt, 106 BlobCid: cid.Cid(uploadBlobResp.Blob.Ref), ··· 155 156 artifacts, err := db.GetArtifact( 157 rp.db, 158 - db.FilterEq("repo_at", f.RepoAt), 159 db.FilterEq("tag", tag.Tag.Hash[:]), 160 db.FilterEq("name", filename), 161 ) ··· 197 198 artifacts, err := db.GetArtifact( 199 rp.db, 200 - db.FilterEq("repo_at", f.RepoAt), 201 db.FilterEq("tag", tag[:]), 202 db.FilterEq("name", filename), 203 ) ··· 239 defer tx.Rollback() 240 241 err = db.DeleteArtifact(tx, 242 - db.FilterEq("repo_at", f.RepoAt), 243 db.FilterEq("tag", artifact.Tag[:]), 244 db.FilterEq("name", filename), 245 ) ··· 270 return nil, err 271 } 272 273 - result, err := us.Tags(f.OwnerDid(), f.RepoName) 274 if err != nil { 275 log.Println("failed to reach knotserver", err) 276 return nil, err
··· 76 Artifact: uploadBlobResp.Blob, 77 CreatedAt: createdAt.Format(time.RFC3339), 78 Name: handler.Filename, 79 + Repo: f.RepoAt().String(), 80 Tag: tag.Tag.Hash[:], 81 }, 82 }, ··· 100 artifact := db.Artifact{ 101 Did: user.Did, 102 Rkey: rkey, 103 + RepoAt: f.RepoAt(), 104 Tag: tag.Tag.Hash, 105 CreatedAt: createdAt, 106 BlobCid: cid.Cid(uploadBlobResp.Blob.Ref), ··· 155 156 artifacts, err := db.GetArtifact( 157 rp.db, 158 + db.FilterEq("repo_at", f.RepoAt()), 159 db.FilterEq("tag", tag.Tag.Hash[:]), 160 db.FilterEq("name", filename), 161 ) ··· 197 198 artifacts, err := db.GetArtifact( 199 rp.db, 200 + db.FilterEq("repo_at", f.RepoAt()), 201 db.FilterEq("tag", tag[:]), 202 db.FilterEq("name", filename), 203 ) ··· 239 defer tx.Rollback() 240 241 err = db.DeleteArtifact(tx, 242 + db.FilterEq("repo_at", f.RepoAt()), 243 db.FilterEq("tag", artifact.Tag[:]), 244 db.FilterEq("name", filename), 245 ) ··· 270 return nil, err 271 } 272 273 + result, err := us.Tags(f.OwnerDid(), f.Name) 274 if err != nil { 275 log.Println("failed to reach knotserver", err) 276 return nil, err
+5 -5
appview/repo/index.go
··· 37 return 38 } 39 40 - result, err := us.Index(f.OwnerDid(), f.RepoName, ref) 41 if err != nil { 42 rp.pages.Error503(w) 43 log.Println("failed to reach knotserver", err) ··· 166 // first attempt to fetch from db 167 langs, err := db.GetRepoLanguages( 168 rp.db, 169 - db.FilterEq("repo_at", f.RepoAt), 170 db.FilterEq("ref", f.Ref), 171 ) 172 173 if err != nil || langs == nil { 174 // non-fatal, fetch langs from ks 175 - ls, err := signedClient.RepoLanguages(f.OwnerDid(), f.RepoName, f.Ref) 176 if err != nil { 177 return nil, err 178 } ··· 182 183 for l, s := range ls.Languages { 184 langs = append(langs, db.RepoLanguage{ 185 - RepoAt: f.RepoAt, 186 Ref: f.Ref, 187 IsDefaultRef: isDefaultRef, 188 Language: l, ··· 279 hiddenRef := fmt.Sprintf("hidden/%s/%s", f.Ref, f.Ref) 280 281 var status types.AncestorCheckResponse 282 - forkSyncableResp, err := signedClient.RepoForkAheadBehind(user.Did, string(f.RepoAt), repoInfo.Name, f.Ref, hiddenRef) 283 if err != nil { 284 log.Printf("failed to check if fork is ahead/behind: %s", err) 285 return nil, err
··· 37 return 38 } 39 40 + result, err := us.Index(f.OwnerDid(), f.Name, ref) 41 if err != nil { 42 rp.pages.Error503(w) 43 log.Println("failed to reach knotserver", err) ··· 166 // first attempt to fetch from db 167 langs, err := db.GetRepoLanguages( 168 rp.db, 169 + db.FilterEq("repo_at", f.RepoAt()), 170 db.FilterEq("ref", f.Ref), 171 ) 172 173 if err != nil || langs == nil { 174 // non-fatal, fetch langs from ks 175 + ls, err := signedClient.RepoLanguages(f.OwnerDid(), f.Name, f.Ref) 176 if err != nil { 177 return nil, err 178 } ··· 182 183 for l, s := range ls.Languages { 184 langs = append(langs, db.RepoLanguage{ 185 + RepoAt: f.RepoAt(), 186 Ref: f.Ref, 187 IsDefaultRef: isDefaultRef, 188 Language: l, ··· 279 hiddenRef := fmt.Sprintf("hidden/%s/%s", f.Ref, f.Ref) 280 281 var status types.AncestorCheckResponse 282 + forkSyncableResp, err := signedClient.RepoForkAheadBehind(user.Did, string(f.RepoAt()), repoInfo.Name, f.Ref, hiddenRef) 283 if err != nil { 284 log.Printf("failed to check if fork is ahead/behind: %s", err) 285 return nil, err
+25 -58
appview/reporesolver/resolver.go
··· 12 "strings" 13 14 "github.com/bluesky-social/indigo/atproto/identity" 15 - "github.com/bluesky-social/indigo/atproto/syntax" 16 securejoin "github.com/cyphar/filepath-securejoin" 17 "github.com/go-chi/chi/v5" 18 "tangled.sh/tangled.sh/core/appview/config" ··· 26 ) 27 28 type ResolvedRepo struct { 29 - Knot string 30 OwnerId identity.Identity 31 - RepoName string 32 - RepoAt syntax.ATURI 33 - Description string 34 - Spindle string 35 - CreatedAt string 36 Ref string 37 CurrentDir string 38 ··· 51 } 52 53 func (rr *RepoResolver) Resolve(r *http.Request) (*ResolvedRepo, error) { 54 - repoName := chi.URLParam(r, "repo") 55 - knot, ok := r.Context().Value("knot").(string) 56 if !ok { 57 - log.Println("malformed middleware") 58 return nil, fmt.Errorf("malformed middleware") 59 } 60 id, ok := r.Context().Value("resolvedId").(identity.Identity) ··· 63 return nil, fmt.Errorf("malformed middleware") 64 } 65 66 - repoAt, ok := r.Context().Value("repoAt").(string) 67 - if !ok { 68 - log.Println("malformed middleware") 69 - return nil, fmt.Errorf("malformed middleware") 70 - } 71 - 72 - parsedRepoAt, err := syntax.ParseATURI(repoAt) 73 - if err != nil { 74 - log.Println("malformed repo at-uri") 75 - return nil, fmt.Errorf("malformed middleware") 76 - } 77 - 78 ref := chi.URLParam(r, "ref") 79 80 if ref == "" { 81 - us, err := knotclient.NewUnsignedClient(knot, rr.config.Core.Dev) 82 if err != nil { 83 return nil, err 84 } 85 86 - defaultBranch, err := us.DefaultBranch(id.DID.String(), repoName) 87 if err != nil { 88 return nil, err 89 } ··· 93 94 currentDir := path.Dir(extractPathAfterRef(r.URL.EscapedPath(), ref)) 95 96 - // pass through values from the middleware 97 - description, ok := r.Context().Value("repoDescription").(string) 98 - addedAt, ok := r.Context().Value("repoAddedAt").(string) 99 - spindle, ok := r.Context().Value("repoSpindle").(string) 100 - 101 return &ResolvedRepo{ 102 - Knot: knot, 103 - OwnerId: id, 104 - RepoName: repoName, 105 - RepoAt: parsedRepoAt, 106 - Description: description, 107 - CreatedAt: addedAt, 108 - Ref: ref, 109 - CurrentDir: currentDir, 110 - Spindle: spindle, 111 112 rr: rr, 113 }, nil ··· 126 127 var p string 128 if handle != "" && !handle.IsInvalidHandle() { 129 - p, _ = securejoin.SecureJoin(fmt.Sprintf("@%s", handle), f.RepoName) 130 } else { 131 - p, _ = securejoin.SecureJoin(f.OwnerDid(), f.RepoName) 132 } 133 134 return p 135 } 136 137 - func (f *ResolvedRepo) DidSlashRepo() string { 138 - p, _ := securejoin.SecureJoin(f.OwnerDid(), f.RepoName) 139 - return p 140 - } 141 - 142 func (f *ResolvedRepo) Collaborators(ctx context.Context) ([]pages.Collaborator, error) { 143 repoCollaborators, err := f.rr.enforcer.E.GetImplicitUsersForResourceByDomain(f.DidSlashRepo(), f.Knot) 144 if err != nil { ··· 186 // this function is a bit weird since it now returns RepoInfo from an entirely different 187 // package. we should refactor this or get rid of RepoInfo entirely. 188 func (f *ResolvedRepo) RepoInfo(user *oauth.User) repoinfo.RepoInfo { 189 isStarred := false 190 if user != nil { 191 - isStarred = db.GetStarStatus(f.rr.execer, user.Did, syntax.ATURI(f.RepoAt)) 192 } 193 194 - starCount, err := db.GetStarCount(f.rr.execer, f.RepoAt) 195 if err != nil { 196 - log.Println("failed to get star count for ", f.RepoAt) 197 } 198 - issueCount, err := db.GetIssueCount(f.rr.execer, f.RepoAt) 199 if err != nil { 200 - log.Println("failed to get issue count for ", f.RepoAt) 201 } 202 - pullCount, err := db.GetPullCount(f.rr.execer, f.RepoAt) 203 if err != nil { 204 - log.Println("failed to get issue count for ", f.RepoAt) 205 } 206 - source, err := db.GetRepoSource(f.rr.execer, f.RepoAt) 207 if errors.Is(err, sql.ErrNoRows) { 208 source = "" 209 } else if err != nil { 210 - log.Println("failed to get repo source for ", f.RepoAt, err) 211 } 212 213 var sourceRepo *db.Repo ··· 232 if err != nil { 233 log.Printf("failed to create unsigned client for %s: %v", knot, err) 234 } else { 235 - result, err := us.Branches(f.OwnerDid(), f.RepoName) 236 if err != nil { 237 - log.Printf("failed to get branches for %s/%s: %v", f.OwnerDid(), f.RepoName, err) 238 } 239 240 if len(result.Branches) == 0 { ··· 245 repoInfo := repoinfo.RepoInfo{ 246 OwnerDid: f.OwnerDid(), 247 OwnerHandle: f.OwnerHandle(), 248 - Name: f.RepoName, 249 - RepoAt: f.RepoAt, 250 Description: f.Description, 251 Ref: f.Ref, 252 IsStarred: isStarred,
··· 12 "strings" 13 14 "github.com/bluesky-social/indigo/atproto/identity" 15 securejoin "github.com/cyphar/filepath-securejoin" 16 "github.com/go-chi/chi/v5" 17 "tangled.sh/tangled.sh/core/appview/config" ··· 25 ) 26 27 type ResolvedRepo struct { 28 + db.Repo 29 OwnerId identity.Identity 30 Ref string 31 CurrentDir string 32 ··· 45 } 46 47 func (rr *RepoResolver) Resolve(r *http.Request) (*ResolvedRepo, error) { 48 + repo, ok := r.Context().Value("repo").(*db.Repo) 49 if !ok { 50 + log.Println("malformed middleware: `repo` not exist in context") 51 return nil, fmt.Errorf("malformed middleware") 52 } 53 id, ok := r.Context().Value("resolvedId").(identity.Identity) ··· 56 return nil, fmt.Errorf("malformed middleware") 57 } 58 59 ref := chi.URLParam(r, "ref") 60 61 if ref == "" { 62 + us, err := knotclient.NewUnsignedClient(repo.Knot, rr.config.Core.Dev) 63 if err != nil { 64 return nil, err 65 } 66 67 + defaultBranch, err := us.DefaultBranch(id.DID.String(), repo.Name) 68 if err != nil { 69 return nil, err 70 } ··· 74 75 currentDir := path.Dir(extractPathAfterRef(r.URL.EscapedPath(), ref)) 76 77 return &ResolvedRepo{ 78 + Repo: *repo, 79 + OwnerId: id, 80 + Ref: ref, 81 + CurrentDir: currentDir, 82 83 rr: rr, 84 }, nil ··· 97 98 var p string 99 if handle != "" && !handle.IsInvalidHandle() { 100 + p, _ = securejoin.SecureJoin(fmt.Sprintf("@%s", handle), f.Name) 101 } else { 102 + p, _ = securejoin.SecureJoin(f.OwnerDid(), f.Name) 103 } 104 105 return p 106 } 107 108 func (f *ResolvedRepo) Collaborators(ctx context.Context) ([]pages.Collaborator, error) { 109 repoCollaborators, err := f.rr.enforcer.E.GetImplicitUsersForResourceByDomain(f.DidSlashRepo(), f.Knot) 110 if err != nil { ··· 152 // this function is a bit weird since it now returns RepoInfo from an entirely different 153 // package. we should refactor this or get rid of RepoInfo entirely. 154 func (f *ResolvedRepo) RepoInfo(user *oauth.User) repoinfo.RepoInfo { 155 + repoAt := f.RepoAt() 156 isStarred := false 157 if user != nil { 158 + isStarred = db.GetStarStatus(f.rr.execer, user.Did, repoAt) 159 } 160 161 + starCount, err := db.GetStarCount(f.rr.execer, repoAt) 162 if err != nil { 163 + log.Println("failed to get star count for ", repoAt) 164 } 165 + issueCount, err := db.GetIssueCount(f.rr.execer, repoAt) 166 if err != nil { 167 + log.Println("failed to get issue count for ", repoAt) 168 } 169 + pullCount, err := db.GetPullCount(f.rr.execer, repoAt) 170 if err != nil { 171 + log.Println("failed to get issue count for ", repoAt) 172 } 173 + source, err := db.GetRepoSource(f.rr.execer, repoAt) 174 if errors.Is(err, sql.ErrNoRows) { 175 source = "" 176 } else if err != nil { 177 + log.Println("failed to get repo source for ", repoAt, err) 178 } 179 180 var sourceRepo *db.Repo ··· 199 if err != nil { 200 log.Printf("failed to create unsigned client for %s: %v", knot, err) 201 } else { 202 + result, err := us.Branches(f.OwnerDid(), f.Name) 203 if err != nil { 204 + log.Printf("failed to get branches for %s/%s: %v", f.OwnerDid(), f.Name, err) 205 } 206 207 if len(result.Branches) == 0 { ··· 212 repoInfo := repoinfo.RepoInfo{ 213 OwnerDid: f.OwnerDid(), 214 OwnerHandle: f.OwnerHandle(), 215 + Name: f.Name, 216 + RepoAt: repoAt, 217 Description: f.Description, 218 Ref: f.Ref, 219 IsStarred: isStarred,
+7 -4
appview/db/repos.go
··· 391 var description, spindle sql.NullString 392 393 row := e.QueryRow(` 394 - select did, name, knot, created, at_uri, description, spindle 395 from repos 396 where did = ? and name = ? 397 `, ··· 400 ) 401 402 var createdAt string 403 - if err := row.Scan(&repo.Did, &repo.Name, &repo.Knot, &createdAt, &repo.AtUri, &description, &spindle); err != nil { 404 return nil, err 405 } 406 createdAtTime, _ := time.Parse(time.RFC3339, createdAt) ··· 421 var repo Repo 422 var nullableDescription sql.NullString 423 424 - row := e.QueryRow(`select did, name, knot, created, at_uri, description from repos where at_uri = ?`, atUri) 425 426 var createdAt string 427 - if err := row.Scan(&repo.Did, &repo.Name, &repo.Knot, &createdAt, &repo.AtUri, &nullableDescription); err != nil { 428 return nil, err 429 } 430 createdAtTime, _ := time.Parse(time.RFC3339, createdAt) ··· 440 } 441 442 func AddRepo(e Execer, repo *Repo) error { 443 _, err := e.Exec( 444 `insert into repos 445 (did, name, knot, rkey, at_uri, description, source)
··· 391 var description, spindle sql.NullString 392 393 row := e.QueryRow(` 394 + select did, name, knot, created, at_uri, description, spindle, rkey 395 from repos 396 where did = ? and name = ? 397 `, ··· 400 ) 401 402 var createdAt string 403 + if err := row.Scan(&repo.Did, &repo.Name, &repo.Knot, &createdAt, &repo.AtUri, &description, &spindle, &repo.Rkey); err != nil { 404 return nil, err 405 } 406 createdAtTime, _ := time.Parse(time.RFC3339, createdAt) ··· 421 var repo Repo 422 var nullableDescription sql.NullString 423 424 + row := e.QueryRow(`select did, name, knot, created, at_uri, rkey, description from repos where at_uri = ?`, atUri) 425 426 var createdAt string 427 + if err := row.Scan(&repo.Did, &repo.Name, &repo.Knot, &createdAt, &repo.AtUri, &repo.Rkey, &nullableDescription); err != nil { 428 return nil, err 429 } 430 createdAtTime, _ := time.Parse(time.RFC3339, createdAt) ··· 440 } 441 442 func AddRepo(e Execer, repo *Repo) error { 443 + if repo.AtUri == "" { 444 + repo.AtUri = repo.RepoAt().String() 445 + } 446 _, err := e.Exec( 447 `insert into repos 448 (did, name, knot, rkey, at_uri, description, source)
-1
appview/state/state.go
··· 395 // continue 396 } 397 398 - repo.AtUri = atresp.Uri 399 err = db.AddRepo(tx, repo) 400 if err != nil { 401 log.Println(err)
··· 395 // continue 396 } 397 398 err = db.AddRepo(tx, repo) 399 if err != nil { 400 log.Println(err)