1package web
 2
 3import (
 4	"fmt"
 5	"html/template"
 6	"net/http"
 7
 8	"github.com/charmbracelet/log/v2"
 9	"github.com/charmbracelet/soft-serve/pkg/backend"
10	"github.com/charmbracelet/soft-serve/pkg/config"
11	"github.com/charmbracelet/soft-serve/pkg/proto"
12	"github.com/charmbracelet/soft-serve/pkg/ui/common"
13)
14
15// OverviewData contains data for rendering repository overview page.
16type OverviewData struct {
17	RepoBaseData
18	IsEmpty    bool
19	SSHURL     string
20	HTTPURL    string
21	ReadmeHTML template.HTML
22}
23
24// repoOverview handles repository overview page.
25func repoOverview(w http.ResponseWriter, r *http.Request) {
26	ctx := r.Context()
27	logger := log.FromContext(ctx)
28	repo := proto.RepositoryFromContext(ctx)
29	cfg := config.FromContext(ctx)
30
31	gr, err := openRepository(repo)
32	if err != nil {
33		logger.Debug("failed to open repository", "repo", repo.Name(), "err", err)
34		renderInternalServerError(w, r)
35		return
36	}
37
38	defaultBranch := getDefaultBranch(gr)
39	isEmpty := defaultBranch == ""
40
41	sshURL := common.RepoURL(cfg.SSH.PublicURL, repo.Name())
42	httpURL := fmt.Sprintf("%s/%s.git", cfg.HTTP.PublicURL, repo.Name())
43
44	var readmeHTML template.HTML
45	if !isEmpty {
46		head, _ := gr.HEAD()
47		readmeContent, _, err := backend.Readme(repo, head)
48		if err == nil && readmeContent != "" {
49			readmeHTML, _ = renderMarkdown([]byte(readmeContent))
50		}
51	}
52
53	data := OverviewData{
54		RepoBaseData: RepoBaseData{
55			BaseData: BaseData{
56				ServerName: cfg.Name,
57				ActiveTab:  "overview",
58			},
59			Repo:          repo,
60			DefaultBranch: defaultBranch,
61		},
62		IsEmpty:    isEmpty,
63		SSHURL:     sshURL,
64		HTTPURL:    httpURL,
65		ReadmeHTML: readmeHTML,
66	}
67
68	renderHTML(w, "overview.html", data)
69}