diff --git a/appview/pages/pages.go b/appview/pages/pages.go index b92b1f8d..5df08347 100644 --- a/appview/pages/pages.go +++ b/appview/pages/pages.go @@ -127,14 +127,36 @@ func (p *Pages) ProfilePage(w io.Writer, params ProfilePageParams) error { return p.execute("user/profile", w, params) } +type RepoInfo struct { + Name string + OwnerDid string + OwnerHandle string +} + +func (r RepoInfo) OwnerWithAt() string { + if r.OwnerHandle != "" { + return fmt.Sprintf("@%s", r.OwnerHandle) + } else { + return r.OwnerDid + } +} + type RepoIndexParams struct { LoggedInUser *auth.User - Name string - UserDid string - UserHandle string + RepoInfo RepoInfo types.RepoIndexResponse } func (p *Pages) RepoIndexPage(w io.Writer, params RepoIndexParams) error { return p.execute("repo/index", w, params) } + +type RepoLogParams struct { + LoggedInUser *auth.User + RepoInfo RepoInfo + types.RepoLogResponse +} + +func (p *Pages) RepoLog(w io.Writer, params RepoLogParams) error { + return p.execute("repo/log", w, params) +} diff --git a/appview/pages/templates/repo/index.html b/appview/pages/templates/repo/index.html index 03d0e087..4dcdebeb 100644 --- a/appview/pages/templates/repo/index.html +++ b/appview/pages/templates/repo/index.html @@ -1,21 +1,15 @@ -{{define "title"}} {{ or .UserHandle .UserDid }} / {{ .Name }} {{end}} +{{define "title"}} {{ .RepoInfo.OwnerWithAt }} / {{ .RepoInfo.Name }} {{end}} {{define "content"}} -{{- $id := "" -}} -{{- if .UserHandle -}} - {{- $id = printf "@%s" .UserHandle -}} -{{- else -}} - {{- $id = .UserDid -}} -{{- end -}}

-{{ $id }} / {{ .Name }} +{{ .RepoInfo.OwnerWithAt }} / {{ .RepoInfo.Name }}

{{ range .Commits }}
-
{{ slice .Hash.String 0 8 }}
+
{{ slice .Hash.String 0 8 }}
{{ .Message }}
@@ -33,7 +27,7 @@
clone
-git clone https://tangled.sh/{{ $id }}/{{ .Name }}
+git clone https://tangled.sh/{{ .RepoInfo.OwnerWithAt }}/{{ .RepoInfo.Name }}
         
diff --git a/appview/pages/templates/repo/log.html b/appview/pages/templates/repo/log.html index 02f3a798..e1d46ef1 100644 --- a/appview/pages/templates/repo/log.html +++ b/appview/pages/templates/repo/log.html @@ -1,15 +1,15 @@ - -{{ template "layouts/head" . }} +{{define "title"}} log | {{ .RepoInfo.OwnerWithAt }} / {{ .RepoInfo.Name }} {{end}} - {{ template "layouts/repo-header" . }} - - {{ template "layouts/nav" . }} +{{define "content"}} + +

+log | {{ .RepoInfo.OwnerWithAt }} / {{ .RepoInfo.Name }} +

- {{ $repo := .name }}
- {{ range .commits }} + {{ range .Commits }}
-
{{ slice .Hash.String 0 8 }}
+
{{ slice .Hash.String 0 8 }}
{{ .Message }}
@@ -19,5 +19,4 @@ {{ end }}
- - +{{end}} diff --git a/appview/state/repo.go b/appview/state/repo.go index 2ee07558..c48b9990 100644 --- a/appview/state/repo.go +++ b/appview/state/repo.go @@ -14,20 +14,9 @@ import ( ) func (s *State) RepoIndex(w http.ResponseWriter, r *http.Request) { - ctx := r.Context() - repoName := chi.URLParam(r, "repo") - - knot, ok := ctx.Value("knot").(string) - if !ok { - log.Println("malformed middleware") - w.WriteHeader(http.StatusInternalServerError) - return - } - - id, ok := ctx.Value("resolvedId").(identity.Identity) - if !ok { - log.Println("malformed middleware") - w.WriteHeader(http.StatusInternalServerError) + repoName, knot, id, err := repoKnotAndId(r) + if err != nil { + log.Println("failed to get repo and knot", err) return } @@ -38,7 +27,6 @@ func (s *State) RepoIndex(w http.ResponseWriter, r *http.Request) { } defer resp.Body.Close() - // Read the response body body, err := io.ReadAll(resp.Body) if err != nil { log.Fatalf("Error reading response body: %v", err) @@ -54,14 +42,70 @@ func (s *State) RepoIndex(w http.ResponseWriter, r *http.Request) { log.Println(resp.Status, result) - user := s.auth.GetUser(r) s.pages.RepoIndexPage(w, pages.RepoIndexParams{ - LoggedInUser: user, - UserDid: id.DID.String(), - UserHandle: id.Handle.String(), - Name: repoName, + LoggedInUser: s.auth.GetUser(r), + RepoInfo: pages.RepoInfo{ + OwnerDid: id.DID.String(), + OwnerHandle: id.Handle.String(), + Name: repoName, + }, RepoIndexResponse: result, }) return } + +func (s *State) RepoLog(w http.ResponseWriter, r *http.Request) { + repoName, knot, id, err := repoKnotAndId(r) + if err != nil { + log.Println("failed to get repo and knot", err) + return + } + + ref := chi.URLParam(r, "ref") + resp, err := http.Get(fmt.Sprintf("http://%s/%s/%s/log/%s", knot, id.DID.String(), repoName, ref)) + if err != nil { + log.Println("failed to reach knotserver", err) + return + } + + body, err := io.ReadAll(resp.Body) + if err != nil { + log.Fatalf("Error reading response body: %v", err) + return + } + + var result types.RepoLogResponse + err = json.Unmarshal(body, &result) + if err != nil { + log.Println("failed to parse json response", err) + return + } + + s.pages.RepoLog(w, pages.RepoLogParams{ + LoggedInUser: s.auth.GetUser(r), + RepoInfo: pages.RepoInfo{ + OwnerDid: id.DID.String(), + OwnerHandle: id.Handle.String(), + Name: repoName, + }, + RepoLogResponse: result, + }) + return +} + +func repoKnotAndId(r *http.Request) (string, string, identity.Identity, error) { + repoName := chi.URLParam(r, "repo") + knot, ok := r.Context().Value("knot").(string) + if !ok { + log.Println("malformed middleware") + return "", "", identity.Identity{}, fmt.Errorf("malformed middleware") + } + id, ok := r.Context().Value("resolvedId").(identity.Identity) + if !ok { + log.Println("malformed middleware") + return "", "", identity.Identity{}, fmt.Errorf("malformed middleware") + } + + return repoName, knot, id, nil +} diff --git a/appview/state/signer.go b/appview/state/signer.go index ed106c41..b4036f7b 100644 --- a/appview/state/signer.go +++ b/appview/state/signer.go @@ -113,17 +113,3 @@ func (s *SignedClient) AddMember(did string) (*http.Response, error) { return s.client.Do(req) } - -func (s *SignedClient) RepoIndex(did, repo string) (*http.Response, error) { - const ( - Method = "GET" - ) - endpoint := fmt.Sprint("/%s/%s", did, repo) - - req, err := s.newRequest(Method, endpoint, nil) - if err != nil { - return nil, err - } - - return s.client.Do(req) -} diff --git a/appview/state/state.go b/appview/state/state.go index 59f622e7..0ec9eeec 100644 --- a/appview/state/state.go +++ b/appview/state/state.go @@ -601,9 +601,12 @@ func (s *State) UserRouter() http.Handler { r.Get("/", s.ProfilePage) r.With(ResolveRepoKnot(s)).Route("/{repo}", func(r chi.Router) { r.Get("/", s.RepoIndex) + r.Get("/log/{ref}", s.RepoLog) + // These routes get proxied to the knot r.Get("/info/refs", s.InfoRefs) r.Post("/git-upload-pack", s.UploadPack) + }) }) diff --git a/knotserver/routes.go b/knotserver/routes.go index 98469f88..db039538 100644 --- a/knotserver/routes.go +++ b/knotserver/routes.go @@ -266,16 +266,17 @@ func (h *Handle) Log(w http.ResponseWriter, r *http.Request) { commits = commits[start:end] } - data := make(map[string]interface{}) - data["commits"] = commits - data["ref"] = ref - data["desc"] = getDescription(path) - data["log"] = true - data["total"] = total - data["page"] = page - data["per_page"] = pageSize + resp := types.RepoLogResponse{ + Commits: commits, + Ref: ref, + Description: getDescription(path), + Log: true, + Total: total, + Page: page, + PerPage: pageSize, + } - writeJSON(w, data) + writeJSON(w, resp) return } diff --git a/types/repo.go b/types/repo.go index 97267524..78d6293f 100644 --- a/types/repo.go +++ b/types/repo.go @@ -13,3 +13,13 @@ type RepoIndexResponse struct { Commits []*object.Commit `json:"commits,omitempty"` Description string `json:"description,omitempty"` } + +type RepoLogResponse struct { + Commits []*object.Commit `json:"commits,omitempty"` + Ref string `json:"ref,omitempty"` + Description string `json:"description,omitempty"` + Log bool `json:"log,omitempty"` + Total int `json:"total,omitempty"` + Page int `json:"page,omitempty"` + PerPage int `json:"per_page,omitempty"` +}