prime8dev

prime8dev
git clone https://git.prime8.dev/prime8dev.git
Log | Files | Refs | README | LICENSE

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 }