projects.go (2527B)
1 package handlers 2 3 import ( 4 "html/template" 5 "net/http" 6 "strings" 7 8 "git.prime8.dev/moncheeta/prime8dev/internal/config" 9 "git.prime8.dev/moncheeta/prime8dev/internal/content" 10 "git.prime8.dev/moncheeta/prime8dev/internal/utils" 11 "git.prime8.dev/moncheeta/prime8dev/internal/web" 12 "github.com/go-chi/chi/v5" 13 ) 14 15 func (h *Handler) ProjectsPageHandler(w http.ResponseWriter, r *http.Request) { 16 id := strings.TrimSpace(chi.URLParam(r, "id")) 17 about := config.GetAbout() 18 projects, err := content.LoadProjects(h.gitService) 19 if err != nil { 20 http.Error(w, "Failed to load projects", http.StatusInternalServerError) 21 return 22 } 23 24 data := web.BaseData("Projects", "projects", about) 25 data.Projects = projects 26 27 if id == "" { 28 if len(projects) > 0 { 29 applyProjectDetailData(&data, &projects[0]) 30 } 31 32 if utils.IsHTMXRequest(r) { 33 h.renderTemplate(w, r, "projects", data, fragmentCacheMaxAgeSeconds) 34 return 35 } 36 37 h.renderTemplate(w, r, "layout", data, fullPageCacheMaxAgeSeconds) 38 return 39 } 40 41 project, err := content.GetProjectByID(h.gitService, id) 42 if err != nil { 43 http.Error(w, "Failed to load project", http.StatusInternalServerError) 44 return 45 } 46 if project == nil { 47 http.NotFound(w, r) 48 return 49 } 50 51 data.SelectedProjectID = id 52 applyProjectDetailData(&data, project) 53 54 h.renderTemplate(w, r, "layout", data, fullPageCacheMaxAgeSeconds) 55 } 56 57 func applyProjectDetailData(data *web.Data, project *config.Project) { 58 if data == nil || project == nil { 59 return 60 } 61 62 data.Project = project 63 data.ProjectLinkLabel = projectLinkLabel(project.URL) 64 data.ProjectReadme = template.HTML(project.HTML) 65 } 66 67 func (h *Handler) ProjectDetailHandler(w http.ResponseWriter, r *http.Request) { 68 id := chi.URLParam(r, "id") 69 project, err := content.GetProjectByID(h.gitService, id) 70 if err != nil { 71 http.Error(w, "Failed to load project", http.StatusInternalServerError) 72 return 73 } 74 if project == nil { 75 http.Error(w, "Project not found", http.StatusNotFound) 76 return 77 } 78 79 data := web.Data{ 80 Project: project, 81 ProjectLinkLabel: projectLinkLabel(project.URL), 82 ProjectReadme: template.HTML(project.HTML), 83 } 84 85 h.renderTemplate(w, r, "project_detail", data, fragmentCacheMaxAgeSeconds) 86 } 87 88 func projectLinkLabel(raw string) string { 89 if strings.HasPrefix(raw, config.GitWebBase()+"/") || strings.Contains(raw, "git.prime8.dev") { 90 return "Source" 91 } else if strings.Contains(raw, "gitlab.com") { 92 return "GitLab" 93 } else if strings.Contains(raw, "github.com") { 94 return "GitHub" 95 } else { 96 return "Outside" 97 } 98 }