feat: Add guide page

feat/db
Francesco Minnocci 2 years ago
parent 9553dbe252
commit 9c10e1b8fc
Signed by: BachoSeven
GPG Key ID: 2BE4AB7FDAD828A4

@ -22,6 +22,7 @@ COPY --from=frontend-builder /_frontend/out ./_frontend/out
COPY --from=backend-builder /backend/phc-website-server ./phc-website-server COPY --from=backend-builder /backend/phc-website-server ./phc-website-server
COPY ./_views ./_views COPY ./_views ./_views
COPY ./_content/news ./_content/news COPY ./_content/news ./_content/news
COPY ./_content/guide ./_content/guide
COPY ./_public ./_public COPY ./_public ./_public
COPY ./.env ./.env COPY ./.env ./.env
EXPOSE 8000 EXPOSE 8000

@ -0,0 +1,19 @@
---
id: guida-git
title: "Guida a Git"
tags: git
publish_date: 2022/08/27 22:00
description: |
Vedremo come creare una repository Git per tracciare i cambiamenti di una serie di file nel tempo, e molto altro.
---
## A cosa serve
## Creiamo una repository git
Nonostante per grossi progetti sia comodo usare server Git come github.com, che essendo popolare attirerà l'attenzione di più potenziali __contributors__, per progetti personali o
di piccola scala va benissimo utilizzare un server **self-hostato**: in questo caso noi useremo il server del PHC.
Per prima cosa, visitiamo git.phc.dm.unipi.it ed accediamo con le credenziali di
## Comandi di base

@ -0,0 +1,31 @@
---
id: guida-terminale
title: "Guida al Terminale"
tags: shell, zsh, vim, ssh
publish_date: 2022/08/27 22:00
description: |
Questo articolo introduce all'uso dei comandi di base di un terminale su sistemi Unix come Linux e MacOS; parleremo inoltre di Vim, Zsh e SSH.
---
## 1. Shell & Terminale: differenze?
- introduzione storica + bash
### Le Basi
- keybinding utili: ctrl+a/e, ctrl+c, ctrl+d
- copiare/incollare testo
- comandi di base: navigazione(cd, ls), modifica(cp, mv, rm, mkdir)
- chiedere aiuto: man, info
### Zsh: una shell moderna e potente
https://wiki.archlinux.org/title/Zsh
## 2. Vim: l'Editor intramontabile
Parentesi storica, neovim, VimTutor e comandi di base(come si esce?)
## 3. E la TTY?
Come utilizzarla, quando è utile, limitazioni(no scrollback)
## SSH: la magia della remote shell

@ -0,0 +1,18 @@
{{template "base" .}}
{{define "title"}}{{ .Article.Title }} • Guide • PHC{{end}}
{{define "body"}}
<section class="news-content">
<h1>{{ .Article.Title }}</h1>
<div class="date">
{{ .Article.PublishDate.Format "2006/01/02" }}
</div>
<div class="tags">
{{ range .Article.Tags }}
<span class="tag">{{ . }}</span>
{{ end }}
</div>
{{ .ContentHTML }}
</section>
{{end}}

@ -0,0 +1,33 @@
{{template "base" .}}
{{define "title"}}Guide &bull; PHC{{end}}
{{define "body"}}
<section>
<h1>
<i class="fa-solid fa-person-chalkboard"></i>
Articoli
</h1>
<div class="card-list">
{{ range .Articles }}
<div class="card">
<div class="title">
<a href="/guide/{{ .Id }}">
{{ .Title }}
</a>
</div>
<div class="date">{{ .PublishDate.Format "2006/01/02" }}</div>
<div class="description">
<p>{{ .Description }}</p>
</div>
<div class="tags">
{{ range .Tags }}
<span class="tag">{{ . }}</span>
{{ end }}
</div>
</div>
{{ end }}
</div>
</section>
{{end}}

@ -23,6 +23,7 @@ func main() {
"./_views/partials/*.html", "./_views/partials/*.html",
), ),
NewsArticlesRegistry: articles.NewRegistry("./_content/news"), NewsArticlesRegistry: articles.NewRegistry("./_content/news"),
GuideArticlesRegistry: articles.NewRegistry("./_content/guide"),
ListaUtenti: &website.JsonFileListUtenti{ ListaUtenti: &website.JsonFileListUtenti{
Path: "./utenti-poisson-2022.local.json", Path: "./utenti-poisson-2022.local.json",
}, },

@ -20,11 +20,13 @@ type Service interface {
HandleStoriaPage(w io.Writer, ctx Context) error HandleStoriaPage(w io.Writer, ctx Context) error
HandleQueryAppunti(w io.Writer, query string, ctx Context) error HandleQueryAppunti(w io.Writer, query string, ctx Context) error
HandleNewsPage(w io.Writer, ctx Context) error HandleNewsPage(w io.Writer, ctx Context) error
HandleGuidePage(w io.Writer, ctx Context) error
HandleLogin(username, password string) (*model.Session, error) HandleLogin(username, password string) (*model.Session, error)
HandleUser(token string) *model.User HandleUser(token string) *model.User
HandleRequiredUser(ctx Context) (*model.User, error) HandleRequiredUser(ctx Context) (*model.User, error)
HandleProfilePage(w io.Writer, ctx Context) error HandleProfilePage(w io.Writer, ctx Context) error
HandleArticlePage(w io.Writer, articleID string, ctx Context) error HandleNewsArticlePage(w io.Writer, articleID string, ctx Context) error
HandleGuideArticlePage(w io.Writer, articleID string, ctx Context) error
} }
// //
@ -43,6 +45,7 @@ type DefaultHandler struct {
AuthService auth.Service AuthService auth.Service
Renderer *templates.TemplateRenderer Renderer *templates.TemplateRenderer
NewsArticlesRegistry *articles.Registry NewsArticlesRegistry *articles.Registry
GuideArticlesRegistry *articles.Registry
ListaUtenti website.ListaUtentiService ListaUtenti website.ListaUtentiService
Storia website.StoriaService Storia website.StoriaService
} }
@ -102,6 +105,18 @@ func (h *DefaultHandler) HandleNewsPage(w io.Writer, ctx Context) error {
}) })
} }
func (h *DefaultHandler) HandleGuidePage(w io.Writer, ctx Context) error {
articles, err := h.GuideArticlesRegistry.GetArticles()
if err != nil {
return err
}
return h.Renderer.Render(w, "guide.html", util.Map{
"User": ctx.getUser(),
"Articles": articles,
})
}
func (h *DefaultHandler) HandleLogin(username, password string) (*model.Session, error) { func (h *DefaultHandler) HandleLogin(username, password string) (*model.Session, error) {
session, err := h.AuthService.Login(username, password) session, err := h.AuthService.Login(username, password)
if err != nil { if err != nil {
@ -138,7 +153,7 @@ func (h *DefaultHandler) HandleProfilePage(w io.Writer, ctx Context) error {
}) })
} }
func (h *DefaultHandler) HandleArticlePage(w io.Writer, articleID string, ctx Context) error { func (h *DefaultHandler) HandleNewsArticlePage(w io.Writer, articleID string, ctx Context) error {
article, err := h.NewsArticlesRegistry.GetArticle(articleID) article, err := h.NewsArticlesRegistry.GetArticle(articleID)
if err != nil { if err != nil {
return err return err
@ -155,3 +170,21 @@ func (h *DefaultHandler) HandleArticlePage(w io.Writer, articleID string, ctx Co
"ContentHTML": template.HTML(html), "ContentHTML": template.HTML(html),
}) })
} }
func (h *DefaultHandler) HandleGuideArticlePage(w io.Writer, articleID string, ctx Context) error {
article, err := h.GuideArticlesRegistry.GetArticle(articleID)
if err != nil {
return err
}
html, err := article.Render()
if err != nil {
return err
}
return h.Renderer.Render(w, "guide-base.html", util.Map{
"User": ctx.getUser(),
"Article": article,
"ContentHTML": template.HTML(html),
})
}

@ -100,6 +100,11 @@ func routes(h handler.Service, r fiber.Router) {
return h.HandleNewsPage(c, CreateContext(c)) return h.HandleNewsPage(c, CreateContext(c))
}) })
r.Get("/guide", func(c *fiber.Ctx) error {
c.Type("html")
return h.HandleGuidePage(c, CreateContext(c))
})
r.Post("/login", func(c *fiber.Ctx) error { r.Post("/login", func(c *fiber.Ctx) error {
var loginForm struct { var loginForm struct {
Provider string `form:"provider"` Provider string `form:"provider"`
@ -147,7 +152,14 @@ func routes(h handler.Service, r fiber.Router) {
articleID := c.Params("article") articleID := c.Params("article")
c.Type("html") c.Type("html")
return h.HandleArticlePage(c, articleID, CreateContext(c)) return h.HandleNewsArticlePage(c, articleID, CreateContext(c))
})
r.Get("/guide/:article", func(c *fiber.Ctx) error {
articleID := c.Params("article")
c.Type("html")
return h.HandleGuideArticlePage(c, articleID, CreateContext(c))
}) })
routesApi(h, r.Group("/api")) routesApi(h, r.Group("/api"))

Loading…
Cancel
Save