feat: ora funge tutto benissimo per qualche motivo
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
package articles
|
||||
|
||||
import (
|
||||
"html/template"
|
||||
"phc/website/services/server/dev"
|
||||
"phc/website/services/server/router"
|
||||
"phc/website/sl"
|
||||
)
|
||||
|
||||
func Configure(l *sl.ServiceLocator) error {
|
||||
router.UseRouteTemplatedPage(l, "/articles",
|
||||
"pages/articles/index.html",
|
||||
func(w dev.ResponseWriter, r dev.Request) error {
|
||||
tmpl := template.New("")
|
||||
|
||||
tmpl, err := tmpl.Parse(string(r.Page()))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
ctx := map[string]any{
|
||||
"Example": "Bla bla",
|
||||
}
|
||||
|
||||
if err := tmpl.Execute(w, ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
},
|
||||
)
|
||||
|
||||
router.UseRouteTemplatedPage(l, "/articles/:slug",
|
||||
"pages/articles/article.html",
|
||||
func(w dev.ResponseWriter, r dev.Request) error {
|
||||
tmpl := template.New("")
|
||||
|
||||
tmpl, err := tmpl.Parse(string(r.Page()))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
ctx := map[string]any{
|
||||
"Title": r.Param("slug"),
|
||||
"Example": "Bla bla " + r.Param("slug"),
|
||||
}
|
||||
|
||||
if err := tmpl.Execute(w, ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
},
|
||||
)
|
||||
|
||||
return nil
|
||||
}
|
||||
+137
-29
@@ -1,49 +1,157 @@
|
||||
package dev
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
"path"
|
||||
"phc/website/services/server/routes"
|
||||
"phc/website/sl"
|
||||
|
||||
"github.com/alecthomas/repr"
|
||||
"github.com/gofiber/fiber/v2"
|
||||
)
|
||||
|
||||
var Slot = sl.NewSlot[*Dev]()
|
||||
// slot represents a private "write only" service
|
||||
var slot = sl.NewSlot[*devService]()
|
||||
|
||||
type Dev struct {
|
||||
HtmlRouteBindings map[string]string
|
||||
// InjectInto a [*sl.ServiceLocator] an instance of the dev service
|
||||
func InjectInto(l *sl.ServiceLocator) {
|
||||
sl.InjectLazy(l, slot, Configure)
|
||||
}
|
||||
|
||||
func New(l *sl.ServiceLocator) (*Dev, error) {
|
||||
dev := &Dev{
|
||||
map[string]string{},
|
||||
}
|
||||
|
||||
router, err := sl.Use(l, routes.Api)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
router.Get("/dev/routes", func(c *fiber.Ctx) error {
|
||||
return c.JSON(dev.HtmlRouteBindings)
|
||||
})
|
||||
|
||||
return dev, nil
|
||||
}
|
||||
|
||||
// UseVitePage this hook will link the provided "mountPoint" to the "frontendHtml" page
|
||||
func UseVitePage(l *sl.ServiceLocator, mountPoint, frontendHtml string) func(c *fiber.Ctx) error {
|
||||
log.Printf(`registering vite route %q for %q`, frontendHtml, mountPoint)
|
||||
|
||||
dev, err := sl.Use(l, Slot)
|
||||
func UseRoutesMetadata(l *sl.ServiceLocator) map[string]any {
|
||||
dev, err := sl.Use(l, slot)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
dev.HtmlRouteBindings[mountPoint] = frontendHtml
|
||||
|
||||
return func(c *fiber.Ctx) error {
|
||||
return c.SendFile(path.Join("./out/frontend/", frontendHtml))
|
||||
return map[string]any{
|
||||
"static": dev.staticRoutes,
|
||||
"dynamic": dev.dynamicRoutes,
|
||||
}
|
||||
}
|
||||
|
||||
type Request interface {
|
||||
Page() []byte
|
||||
Param(key string) string
|
||||
Query(key string) string
|
||||
}
|
||||
|
||||
type ResponseWriter interface {
|
||||
io.Writer
|
||||
}
|
||||
|
||||
// devServerRequest is used when handling request from the dev server where params and queries are parsed by express
|
||||
type devServerRequest struct {
|
||||
page []byte
|
||||
params map[string]string
|
||||
query map[string]string
|
||||
}
|
||||
|
||||
func (r devServerRequest) Page() []byte {
|
||||
return r.page
|
||||
}
|
||||
|
||||
func (r devServerRequest) Param(key string) string {
|
||||
return r.params[key]
|
||||
}
|
||||
|
||||
func (r devServerRequest) Query(key string) string {
|
||||
return r.query[key]
|
||||
}
|
||||
|
||||
// Handler is a custom routes handler
|
||||
type Handler func(ResponseWriter, Request) error
|
||||
|
||||
type devService struct {
|
||||
staticRoutes map[string]string
|
||||
dynamicRoutes map[string]string
|
||||
|
||||
dynamicRoutesHandlers map[string]Handler
|
||||
}
|
||||
|
||||
func Configure(l *sl.ServiceLocator) (*devService, error) {
|
||||
d := &devService{
|
||||
map[string]string{},
|
||||
map[string]string{},
|
||||
map[string]Handler{},
|
||||
}
|
||||
|
||||
api, err := sl.Use(l, routes.Api)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
api.Get("/development/routes", func(c *fiber.Ctx) error {
|
||||
return c.JSON(map[string]any{
|
||||
"static": d.staticRoutes,
|
||||
"dynamic": d.dynamicRoutes,
|
||||
})
|
||||
})
|
||||
|
||||
api.Post("/development/render", func(c *fiber.Ctx) error {
|
||||
var data struct {
|
||||
Route string `json:"route"`
|
||||
Page string `json:"page"`
|
||||
Request struct {
|
||||
ParamsMap map[string]string `json:"params"`
|
||||
QueryMap map[string]string `json:"query"`
|
||||
} `json:"request"`
|
||||
}
|
||||
|
||||
if err := c.BodyParser(&data); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
repr.Print(data)
|
||||
|
||||
handler, ok := d.dynamicRoutesHandlers[data.Route]
|
||||
if !ok {
|
||||
return fmt.Errorf(`no handler for "%s"`, data.Route)
|
||||
}
|
||||
|
||||
var buf bytes.Buffer
|
||||
if err := handler(&buf, devServerRequest{
|
||||
[]byte(data.Page),
|
||||
data.Request.ParamsMap,
|
||||
data.Request.QueryMap,
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return c.JSON(buf.String())
|
||||
})
|
||||
|
||||
return d, nil
|
||||
}
|
||||
|
||||
// RegisterRoute will register the provided "mountPoint" to the "frontendHtml" page
|
||||
func RegisterRoute(l *sl.ServiceLocator, mountPoint, frontendFile string) {
|
||||
log.Printf(`registering vite route %q for %q`, frontendFile, mountPoint)
|
||||
|
||||
dev, err := sl.Use(l, slot)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
dev.staticRoutes[mountPoint] = frontendFile
|
||||
log.Print(dev)
|
||||
}
|
||||
|
||||
func RegisterDynamicRoute(l *sl.ServiceLocator, mountPoint, frontendFile string, handler Handler) {
|
||||
log.Printf(`registering vite route %q for %q`, frontendFile, mountPoint)
|
||||
|
||||
dev, err := sl.Use(l, slot)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
dev.dynamicRoutes[mountPoint] = frontendFile
|
||||
dev.dynamicRoutesHandlers[mountPoint] = handler
|
||||
}
|
||||
|
||||
func GetArtifactPath(frontendFile string) string {
|
||||
return path.Join("./out/frontend/", frontendFile)
|
||||
}
|
||||
|
||||
+6
-8
@@ -1,8 +1,8 @@
|
||||
package lista_utenti
|
||||
package listaUtenti
|
||||
|
||||
import (
|
||||
"phc/website/services/database"
|
||||
"phc/website/services/server/dev"
|
||||
"phc/website/services/server/router"
|
||||
"phc/website/services/server/routes"
|
||||
"phc/website/sl"
|
||||
|
||||
@@ -10,21 +10,19 @@ import (
|
||||
)
|
||||
|
||||
func Configure(l *sl.ServiceLocator) error {
|
||||
router.UseRoutePage(l, "/utenti", "pages/lista-utenti/index.html")
|
||||
|
||||
db, err := sl.Use(l, database.Slot)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
r, err := sl.Use(l, routes.Root)
|
||||
api, err := sl.Use(l, routes.Api)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
r.Get("/utenti",
|
||||
dev.UseVitePage(l, "/utenti", "pages/lista-utenti/index.html"),
|
||||
)
|
||||
|
||||
r.Get("/api/lista-utenti", func(c *fiber.Ctx) error {
|
||||
api.Get("/lista-utenti", func(c *fiber.Ctx) error {
|
||||
users, err := db.ReadUsers()
|
||||
if err != nil {
|
||||
return err
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package lista_utenti_test
|
||||
package listaUtenti_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
@@ -0,0 +1,72 @@
|
||||
package router
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"log"
|
||||
"os"
|
||||
"phc/website/services/server/dev"
|
||||
"phc/website/services/server/routes"
|
||||
"phc/website/sl"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
)
|
||||
|
||||
// assert type of [ServerRequest] is [dev.Request]
|
||||
var _ dev.Request = ServerRequest{}
|
||||
|
||||
// ServerRequest is used when the request is directly for the Go server
|
||||
type ServerRequest struct {
|
||||
page []byte
|
||||
fiberContext *fiber.Ctx
|
||||
}
|
||||
|
||||
func (r ServerRequest) Page() []byte {
|
||||
return r.page
|
||||
}
|
||||
|
||||
func (ctx ServerRequest) Param(key string) string {
|
||||
return ctx.fiberContext.Params(key)
|
||||
}
|
||||
|
||||
func (ctx ServerRequest) Query(key string) string {
|
||||
return ctx.fiberContext.Query(key)
|
||||
}
|
||||
|
||||
func UseRoutePage(l *sl.ServiceLocator, route, frontendFile string) {
|
||||
root, err := sl.Use(l, routes.Root)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
dev.RegisterRoute(l, route, frontendFile)
|
||||
|
||||
root.Get(route, func(c *fiber.Ctx) error {
|
||||
return c.SendFile(dev.GetArtifactPath(frontendFile))
|
||||
})
|
||||
}
|
||||
|
||||
func UseRouteTemplatedPage(l *sl.ServiceLocator, route, frontendFile string, handler dev.Handler) {
|
||||
r, err := sl.Use(l, routes.Root)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
dev.RegisterDynamicRoute(l, route, frontendFile, handler)
|
||||
|
||||
r.Get(route, func(c *fiber.Ctx) error {
|
||||
rawPage, err := os.ReadFile(dev.GetArtifactPath(frontendFile))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var buf bytes.Buffer
|
||||
if err := handler(&buf, ServerRequest{
|
||||
rawPage,
|
||||
c,
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return c.Type(".html").Send(buf.Bytes())
|
||||
})
|
||||
}
|
||||
@@ -7,5 +7,4 @@ import (
|
||||
)
|
||||
|
||||
var Root = sl.NewSlot[fiber.Router]()
|
||||
|
||||
var Api = sl.NewSlot[fiber.Router]()
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
package server
|
||||
|
||||
import (
|
||||
"phc/website/services/server/articles"
|
||||
"phc/website/services/server/dev"
|
||||
lista_utenti "phc/website/services/server/lista-utenti"
|
||||
"phc/website/services/server/listaUtenti"
|
||||
"phc/website/services/server/routes"
|
||||
"phc/website/sl"
|
||||
|
||||
@@ -13,17 +14,17 @@ type Server struct{ Router *fiber.App }
|
||||
|
||||
func Configure(l *sl.ServiceLocator) (*Server, error) {
|
||||
r := fiber.New(fiber.Config{})
|
||||
r.Static("/assets", "./out/frontend/assets")
|
||||
|
||||
sl.InjectValue(l, routes.Root, r.Group("/"))
|
||||
dev.InjectInto(l)
|
||||
|
||||
sl.InjectValue(l, routes.Root, fiber.Router(r))
|
||||
sl.InjectValue(l, routes.Api, r.Group("/api"))
|
||||
|
||||
devServerInterop, err := dev.New(l)
|
||||
if err != nil {
|
||||
if err := listaUtenti.Configure(l); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
sl.InjectValue(l, dev.Slot, devServerInterop)
|
||||
|
||||
if err := lista_utenti.Configure(l); err != nil {
|
||||
if err := articles.Configure(l); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user