Browse Source

bug-fixes

master
Silberengel 4 weeks ago
parent
commit
78d80a0c41
  1. 31
      internal/generator/html.go
  2. 26
      internal/server/handlers.go
  3. 8
      templates/base.html

31
internal/generator/html.go

@ -97,6 +97,9 @@ func NewHTMLGenerator(templateDir string, linkBaseURL, siteName, siteURL, defaul
} }
return string(b), nil return string(b), nil
}, },
"hasPrefix": func(s, prefix string) bool {
return len(s) >= len(prefix) && s[:len(prefix)] == prefix
},
}) })
// Load all templates // Load all templates
@ -179,7 +182,7 @@ func (g *HTMLGenerator) GenerateWikiPage(wiki *nostr.WikiEvent, wikiPages []Wiki
SiteURL: g.siteURL, SiteURL: g.siteURL,
CurrentYear: time.Now().Year(), CurrentYear: time.Now().Year(),
WikiPages: wikiPages, WikiPages: wikiPages,
FeedItems: feedItems, FeedItems: []FeedItemInfo{}, // Empty - feed only on landing page
Content: template.HTML(htmlContent), Content: template.HTML(htmlContent),
Summary: wiki.Summary, Summary: wiki.Summary,
} }
@ -221,7 +224,7 @@ func (g *HTMLGenerator) GenerateBlogPage(blogIndex *nostr.IndexEvent, blogItems
CurrentYear: time.Now().Year(), CurrentYear: time.Now().Year(),
BlogItems: formattedBlogItems, BlogItems: formattedBlogItems,
BlogSummary: blogIndex.Summary, BlogSummary: blogIndex.Summary,
FeedItems: feedItems, FeedItems: []FeedItemInfo{}, // Empty - feed only on landing page
Content: template.HTML(""), Content: template.HTML(""),
} }
@ -252,6 +255,9 @@ func (g *HTMLGenerator) GenerateBlogPage(blogIndex *nostr.IndexEvent, blogItems
} }
return string(b), nil return string(b), nil
}, },
"hasPrefix": func(s, prefix string) bool {
return len(s) >= len(prefix) && s[:len(prefix)] == prefix
},
}) })
files := []string{ files := []string{
@ -297,7 +303,7 @@ func (g *HTMLGenerator) GenerateWikiIndexPage(wikiIndex *nostr.IndexEvent, wikiP
SiteURL: g.siteURL, SiteURL: g.siteURL,
CurrentYear: time.Now().Year(), CurrentYear: time.Now().Year(),
WikiPages: wikiPages, WikiPages: wikiPages,
FeedItems: feedItems, FeedItems: []FeedItemInfo{}, // Empty - feed only on landing page
Summary: summary, Summary: summary,
} }
@ -327,7 +333,7 @@ func (g *HTMLGenerator) GenerateEBooksPage(ebooks []EBookInfo, feedItems []FeedI
SiteURL: g.siteURL, SiteURL: g.siteURL,
CurrentYear: time.Now().Year(), CurrentYear: time.Now().Year(),
WikiPages: []WikiPageInfo{}, WikiPages: []WikiPageInfo{},
FeedItems: feedItems, FeedItems: []FeedItemInfo{}, // Empty - feed only on landing page
EBooks: formattedEBooks, EBooks: formattedEBooks,
Content: template.HTML(""), // Content comes from template Content: template.HTML(""), // Content comes from template
} }
@ -373,7 +379,7 @@ func (g *HTMLGenerator) GenerateContactPage(success bool, errorMsg string, event
SiteURL: g.siteURL, SiteURL: g.siteURL,
CurrentYear: time.Now().Year(), CurrentYear: time.Now().Year(),
WikiPages: []WikiPageInfo{}, // Will be populated if needed WikiPages: []WikiPageInfo{}, // Will be populated if needed
FeedItems: feedItems, FeedItems: []FeedItemInfo{}, // Empty - feed only on landing page
}, },
Success: success, Success: success,
Error: errorMsg, Error: errorMsg,
@ -395,6 +401,9 @@ func (g *HTMLGenerator) GenerateContactPage(success bool, errorMsg string, event
} }
return string(b), nil return string(b), nil
}, },
"hasPrefix": func(s, prefix string) bool {
return len(s) >= len(prefix) && s[:len(prefix)] == prefix
},
}) })
// Parse base.html, components.html, and contact.html together // Parse base.html, components.html, and contact.html together
@ -421,7 +430,7 @@ func (g *HTMLGenerator) GenerateContactPage(success bool, errorMsg string, event
"CurrentYear": data.CurrentYear, "CurrentYear": data.CurrentYear,
"WikiPages": data.WikiPages, "WikiPages": data.WikiPages,
"BlogItems": data.BlogItems, "BlogItems": data.BlogItems,
"FeedItems": data.FeedItems, "FeedItems": []FeedItemInfo{}, // Empty - feed only on landing page
"Success": data.Success, "Success": data.Success,
"Error": data.Error, "Error": data.Error,
"EventID": data.EventID, "EventID": data.EventID,
@ -463,9 +472,10 @@ func (g *HTMLGenerator) GenerateErrorPage(statusCode int, feedItems []FeedItemIn
} }
canonicalURL := g.siteURL canonicalURL := g.siteURL
if statusCode == 404 { switch statusCode {
case 404:
canonicalURL = g.siteURL + "/404" canonicalURL = g.siteURL + "/404"
} else if statusCode == 500 { case 500:
canonicalURL = g.siteURL + "/500" canonicalURL = g.siteURL + "/500"
} }
@ -479,7 +489,7 @@ func (g *HTMLGenerator) GenerateErrorPage(statusCode int, feedItems []FeedItemIn
SiteURL: g.siteURL, SiteURL: g.siteURL,
CurrentYear: time.Now().Year(), CurrentYear: time.Now().Year(),
WikiPages: []WikiPageInfo{}, WikiPages: []WikiPageInfo{},
FeedItems: feedItems, FeedItems: []FeedItemInfo{}, // Empty - feed only on landing page
Content: template.HTML(""), // Content will come from the template Content: template.HTML(""), // Content will come from the template
} }
@ -499,6 +509,9 @@ func (g *HTMLGenerator) renderTemplate(templateName string, data PageData) (stri
} }
return string(b), nil return string(b), nil
}, },
"hasPrefix": func(s, prefix string) bool {
return len(s) >= len(prefix) && s[:len(prefix)] == prefix
},
}) })
// Parse base.html, components.html, and the specific template together // Parse base.html, components.html, and the specific template together

26
internal/server/handlers.go

@ -12,6 +12,7 @@ import (
gonostr "github.com/nbd-wtf/go-nostr" gonostr "github.com/nbd-wtf/go-nostr"
"gitcitadel-online/internal/cache" "gitcitadel-online/internal/cache"
"gitcitadel-online/internal/generator"
"gitcitadel-online/internal/nostr" "gitcitadel-online/internal/nostr"
) )
@ -119,11 +120,8 @@ func (s *Server) handleContact(w http.ResponseWriter, r *http.Request) {
} }
} }
// Get feed items from cache // Render the contact form (feed items not needed - only on landing page)
feedItems := s.convertFeedItemsToInfo(s.feedCache.Get()) html, err := s.htmlGenerator.GenerateContactPage(false, "", "", nil, repoAnnouncement, []generator.FeedItemInfo{})
// Render the contact form
html, err := s.htmlGenerator.GenerateContactPage(false, "", "", nil, repoAnnouncement, feedItems)
if err != nil { if err != nil {
http.Error(w, "Failed to generate contact page", http.StatusInternalServerError) http.Error(w, "Failed to generate contact page", http.StatusInternalServerError)
return return
@ -140,8 +138,7 @@ func (s *Server) handleContact(w http.ResponseWriter, r *http.Request) {
// Parse form data // Parse form data
if err := r.ParseForm(); err != nil { if err := r.ParseForm(); err != nil {
feedItems := s.convertFeedItemsToInfo(s.feedCache.Get()) html, _ := s.htmlGenerator.GenerateContactPage(false, "Failed to parse form data", "", nil, nil, []generator.FeedItemInfo{})
html, _ := s.htmlGenerator.GenerateContactPage(false, "Failed to parse form data", "", nil, nil, feedItems)
w.Header().Set("Content-Type", "text/html; charset=utf-8") w.Header().Set("Content-Type", "text/html; charset=utf-8")
w.Write([]byte(html)) w.Write([]byte(html))
return return
@ -153,13 +150,12 @@ func (s *Server) handleContact(w http.ResponseWriter, r *http.Request) {
// Validate required fields // Validate required fields
if subject == "" || content == "" { if subject == "" || content == "" {
feedItems := s.convertFeedItemsToInfo(s.feedCache.Get())
formData := map[string]string{ formData := map[string]string{
"subject": subject, "subject": subject,
"content": content, "content": content,
"labels": labelsStr, "labels": labelsStr,
} }
html, _ := s.htmlGenerator.GenerateContactPage(false, "Subject and message are required", "", formData, nil, feedItems) html, _ := s.htmlGenerator.GenerateContactPage(false, "Subject and message are required", "", formData, nil, []generator.FeedItemInfo{})
w.Header().Set("Content-Type", "text/html; charset=utf-8") w.Header().Set("Content-Type", "text/html; charset=utf-8")
w.Write([]byte(html)) w.Write([]byte(html))
return return
@ -184,13 +180,12 @@ func (s *Server) handleContact(w http.ResponseWriter, r *http.Request) {
repoAnnouncement, err := s.issueService.FetchRepoAnnouncement(ctx, s.repoAnnouncement) repoAnnouncement, err := s.issueService.FetchRepoAnnouncement(ctx, s.repoAnnouncement)
if err != nil { if err != nil {
log.Printf("Failed to fetch repo announcement: %v", err) log.Printf("Failed to fetch repo announcement: %v", err)
feedItems := s.convertFeedItemsToInfo(s.feedCache.Get())
formData := map[string]string{ formData := map[string]string{
"subject": subject, "subject": subject,
"content": content, "content": content,
"labels": labelsStr, "labels": labelsStr,
} }
html, _ := s.htmlGenerator.GenerateContactPage(false, "Failed to connect to repository. Please try again later.", "", formData, nil, feedItems) html, _ := s.htmlGenerator.GenerateContactPage(false, "Failed to connect to repository. Please try again later.", "", formData, nil, []generator.FeedItemInfo{})
w.Header().Set("Content-Type", "text/html; charset=utf-8") w.Header().Set("Content-Type", "text/html; charset=utf-8")
w.Write([]byte(html)) w.Write([]byte(html))
return return
@ -207,21 +202,19 @@ func (s *Server) handleContact(w http.ResponseWriter, r *http.Request) {
eventID, err := s.issueService.PublishIssue(ctx, repoAnnouncement, issueReq, "") eventID, err := s.issueService.PublishIssue(ctx, repoAnnouncement, issueReq, "")
if err != nil { if err != nil {
log.Printf("Failed to publish issue: %v", err) log.Printf("Failed to publish issue: %v", err)
feedItems := s.convertFeedItemsToInfo(s.feedCache.Get())
formData := map[string]string{ formData := map[string]string{
"subject": subject, "subject": subject,
"content": content, "content": content,
"labels": labelsStr, "labels": labelsStr,
} }
html, _ := s.htmlGenerator.GenerateContactPage(false, "Failed to submit your message. Please try again later.", "", formData, nil, feedItems) html, _ := s.htmlGenerator.GenerateContactPage(false, "Failed to submit your message. Please try again later.", "", formData, nil, []generator.FeedItemInfo{})
w.Header().Set("Content-Type", "text/html; charset=utf-8") w.Header().Set("Content-Type", "text/html; charset=utf-8")
w.Write([]byte(html)) w.Write([]byte(html))
return return
} }
// Success - render success page // Success - render success page
feedItems := s.convertFeedItemsToInfo(s.feedCache.Get()) html, err := s.htmlGenerator.GenerateContactPage(true, "", eventID, nil, repoAnnouncement, []generator.FeedItemInfo{})
html, err := s.htmlGenerator.GenerateContactPage(true, "", eventID, nil, repoAnnouncement, feedItems)
if err != nil { if err != nil {
http.Error(w, "Failed to generate success page", http.StatusInternalServerError) http.Error(w, "Failed to generate success page", http.StatusInternalServerError)
return return
@ -315,8 +308,7 @@ func (s *Server) handleRobots(w http.ResponseWriter, r *http.Request) {
// handle404 handles 404 errors // handle404 handles 404 errors
func (s *Server) handle404(w http.ResponseWriter, _ *http.Request) { func (s *Server) handle404(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusNotFound) w.WriteHeader(http.StatusNotFound)
feedItems := s.convertFeedItemsToInfo(s.feedCache.Get()) html, err := s.htmlGenerator.GenerateErrorPage(404, []generator.FeedItemInfo{})
html, err := s.htmlGenerator.GenerateErrorPage(404, feedItems)
if err != nil { if err != nil {
w.Write([]byte("404 - Page Not Found")) w.Write([]byte("404 - Page Not Found"))
return return

8
templates/base.html

@ -64,8 +64,8 @@
</nav> </nav>
</header> </header>
<div class="layout-container{{if .WikiPages}} wiki-layout{{end}}"> <div class="layout-container{{if and .WikiPages (or (eq .CanonicalURL (printf "%s/wiki" .SiteURL)) (hasPrefix .CanonicalURL (printf "%s/wiki/" .SiteURL)))}} wiki-layout{{end}}">
{{if .WikiPages}} {{if and .WikiPages (or (eq .CanonicalURL (printf "%s/wiki" .SiteURL)) (hasPrefix .CanonicalURL (printf "%s/wiki/" .SiteURL)))}}
<aside class="wiki-sidebar" aria-label="About The Project navigation"> <aside class="wiki-sidebar" aria-label="About The Project navigation">
<nav class="wiki-nav"> <nav class="wiki-nav">
<h2>About The Project</h2> <h2>About The Project</h2>
@ -83,13 +83,15 @@
{{block "content" .}}{{end}} {{block "content" .}}{{end}}
</main> </main>
{{if or (eq .CanonicalURL .SiteURL) (eq .CanonicalURL (printf "%s/" .SiteURL))}}
<aside class="feed-sidebar" aria-label="Recent notes"> <aside class="feed-sidebar" aria-label="Recent notes">
{{template "feed" .}} {{template "feed" .}}
</aside> </aside>
{{end}}
</div> </div>
<footer> <footer>
<p>&copy; {{.CurrentYear}} {{.SiteName}}. All rights reserved.</p> <p>&copy; 2026 GitCitadel All Rights Reserved | <a href="/contact">Contact</a></p>
</footer> </footer>
<script> <script>

Loading…
Cancel
Save