1package web
2
3import (
4 "html/template"
5 "net/http"
6
7 "github.com/charmbracelet/log/v2"
8 "github.com/charmbracelet/soft-serve/pkg/backend"
9 "github.com/charmbracelet/soft-serve/pkg/config"
10 "github.com/charmbracelet/soft-serve/pkg/proto"
11)
12
13type AboutData struct {
14 BaseData
15 Repo proto.Repository
16 ReadmeHTML template.HTML
17}
18
19func about(w http.ResponseWriter, r *http.Request) {
20 ctx := r.Context()
21 logger := log.FromContext(ctx)
22 cfg := config.FromContext(ctx)
23 be := backend.FromContext(ctx)
24
25 if be == nil {
26 logger.Debug("backend not found in context")
27 renderInternalServerError(w, r)
28 return
29 }
30
31 readmeRaw, readmeHTML, err := getServerReadme(ctx, be)
32 if err != nil {
33 logger.Debug("failed to get server README", "err", err)
34 renderInternalServerError(w, r)
35 return
36 }
37
38 // Generate description from README or fallback
39 description := extractPlainTextFromMarkdown(readmeRaw, 200)
40 if description == "" {
41 description = "About " + cfg.Name
42 }
43
44 data := AboutData{
45 BaseData: BaseData{
46 ServerName: cfg.Name,
47 ActiveTab: "about",
48 Title: "About | " + cfg.Name,
49 Description: description,
50 },
51 ReadmeHTML: readmeHTML,
52 }
53
54 renderHTML(w, "about.html", data)
55}