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	Repo          proto.Repository
18	DefaultBranch string
19	IsEmpty       bool
20	SSHURL        string
21	HTTPURL       string
22	ActiveTab     string
23	ReadmeHTML    template.HTML
24	ServerName    string
25}
26
27// repoOverview handles repository overview page.
28func repoOverview(w http.ResponseWriter, r *http.Request) {
29	ctx := r.Context()
30	logger := log.FromContext(ctx)
31	repo := proto.RepositoryFromContext(ctx)
32	cfg := config.FromContext(ctx)
33
34	gr, err := openRepository(repo)
35	if err != nil {
36		logger.Debug("failed to open repository", "repo", repo.Name(), "err", err)
37		renderInternalServerError(w, r)
38		return
39	}
40
41	defaultBranch := getDefaultBranch(gr)
42	isEmpty := defaultBranch == ""
43
44	sshURL := common.RepoURL(cfg.SSH.PublicURL, repo.Name())
45	httpURL := fmt.Sprintf("%s/%s.git", cfg.HTTP.PublicURL, repo.Name())
46
47	var readmeHTML template.HTML
48	if !isEmpty {
49		head, _ := gr.HEAD()
50		readmeContent, _, err := backend.Readme(repo, head)
51		if err == nil && readmeContent != "" {
52			readmeHTML, _ = renderMarkdown([]byte(readmeContent))
53		}
54	}
55
56	data := OverviewData{
57		Repo:          repo,
58		DefaultBranch: defaultBranch,
59		IsEmpty:       isEmpty,
60		SSHURL:        sshURL,
61		HTTPURL:       httpURL,
62		ActiveTab:     "overview",
63		ReadmeHTML:    readmeHTML,
64		ServerName:    cfg.Name,
65	}
66
67	renderHTML(w, "overview.html", data)
68}