Started working on the frontend

- Added the new post frontend
- Hooked up publishing of posts to the site publisher
- Added an site exporter as a publishing target
This commit is contained in:
Leon Mika 2026-02-21 10:22:10 +11:00
parent a59008b3e8
commit e77cac2fd5
40 changed files with 1427 additions and 84 deletions

View file

@ -0,0 +1,26 @@
package importexport
import (
"time"
"lmika.dev/lmika/weiro/models"
)
type ReadSiteModels struct {
Site models.Site
Posts []*models.Post
}
type Site struct {
Title string `yaml:"title"`
Tagline string `yaml:"tagline"`
BaseURL string `yaml:"base_url"`
}
type Post struct {
ID string `yaml:"id"`
Title string `yaml:"title"`
Date time.Time `yaml:"date"`
Tags []string `yaml:"tags"`
Slug string `yaml:"slug"`
}

View file

@ -0,0 +1,41 @@
package middleware
import (
"strconv"
"github.com/gofiber/fiber/v3"
"lmika.dev/lmika/weiro/models"
"lmika.dev/lmika/weiro/providers/db"
)
func RequiresSite(db *db.Provider) func(c fiber.Ctx) error {
return func(c fiber.Ctx) error {
siteIDStr := c.Params("siteID")
if siteIDStr == "" {
return fiber.ErrBadRequest
}
siteID, err := strconv.ParseInt(siteIDStr, 10, 64)
if err != nil {
return fiber.ErrBadRequest
}
user, ok := models.GetUser(c.Context())
if !ok {
return fiber.ErrUnauthorized
}
site, err := db.SelectSiteByID(c.Context(), siteID)
if err != nil {
return fiber.ErrNotFound
}
if site.OwnerID != user.ID {
return fiber.ErrForbidden
}
c.Locals("site", site)
c.SetContext(models.WithSite(c.Context(), site))
return c.Next()
}
}

View file

@ -0,0 +1,24 @@
package middleware
import (
"log"
"github.com/gofiber/fiber/v3"
"lmika.dev/lmika/weiro/models"
)
func AuthUser() func(c fiber.Ctx) error {
return func(c fiber.Ctx) error {
// TEMP - Actually do the auth here
user := models.User{
ID: 1,
Username: "testuser",
}
c.Locals("user", user)
c.SetContext(models.WithUser(c.Context(), user))
log.Printf("User %s authenticated", user.Username)
return c.Next()
}
}

37
handlers/posts.go Normal file
View file

@ -0,0 +1,37 @@
package handlers
import (
"fmt"
"github.com/gofiber/fiber/v3"
"lmika.dev/lmika/weiro/models"
"lmika.dev/lmika/weiro/services/posts"
)
type PostsHandler struct {
PostService *posts.Service
}
func (ph PostsHandler) Index(c fiber.Ctx) error {
return c.Render("posts/index", fiber.Map{})
}
func (ph PostsHandler) New(c fiber.Ctx) error {
return c.Render("posts/new", fiber.Map{
"guid": models.NewNanoID(),
})
}
func (ph PostsHandler) Update(c fiber.Ctx) error {
var req posts.CreatePostParams
if err := c.Bind().Body(&req); err != nil {
return err
}
post, err := ph.PostService.PublishPost(c.Context(), req)
if err != nil {
return err
}
return c.Redirect().To(fmt.Sprintf("/sites/%v/posts", post.SiteID))
}