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

@ -1,4 +1,4 @@
package importer
package _import
import (
"context"
@ -42,6 +42,9 @@ func (s *Service) Import(ctx context.Context, sitePath string) (models.Site, err
for _, post := range readSite.Posts {
post.SiteID = site.ID
if post.GUID == "" {
post.GUID = models.NewNanoID()
}
if err := s.db.SavePost(ctx, post); err != nil {
return models.Site{}, errors.Wrap(err, "failed to save post")
}

78
services/posts/service.go Normal file
View file

@ -0,0 +1,78 @@
package posts
import (
"context"
"time"
"lmika.dev/lmika/weiro/models"
"lmika.dev/lmika/weiro/providers/db"
"lmika.dev/lmika/weiro/services/publisher"
)
type Service struct {
db *db.Provider
publisher *publisher.Publisher
}
func New(db *db.Provider, publisher *publisher.Publisher) *Service {
return &Service{
db: db,
publisher: publisher,
}
}
type CreatePostParams struct {
GUID string `form:"guid" json:"guid"`
Title string `form:"title" json:"title"`
Body string `form:"body" json:"body"`
}
func (s *Service) PublishPost(ctx context.Context, params CreatePostParams) (*models.Post, error) {
site, ok := models.GetSite(ctx)
if !ok {
return nil, models.SiteRequiredError
}
post, err := s.fetchOrCreatePost(ctx, site, params)
if err != nil {
return nil, err
}
post.Title = params.Title
post.Body = params.Body
post.PublishedAt = time.Now()
post.Slug = post.BestSlug()
if err := s.db.SavePost(ctx, post); err != nil {
return nil, err
}
// TODO: do on separate thread
if err := s.publisher.Publish(ctx, site); err != nil {
return nil, err
}
return post, nil
}
func (s *Service) fetchOrCreatePost(ctx context.Context, site models.Site, params CreatePostParams) (*models.Post, error) {
post, err := s.db.SelectPostByGUID(ctx, params.GUID)
if err == nil {
if post.SiteID != site.ID {
return nil, models.NotFoundError
}
return post, nil
} else if !db.ErrorIsNoRows(err) {
return nil, err
}
post = &models.Post{
SiteID: site.ID,
GUID: params.GUID,
Title: params.Title,
Body: params.Body,
CreatedAt: time.Now(),
}
return post, nil
}

View file

@ -15,6 +15,7 @@ import (
"lmika.dev/lmika/weiro/models/pubmodel"
"lmika.dev/lmika/weiro/providers/db"
"lmika.dev/lmika/weiro/providers/sitebuilder"
"lmika.dev/lmika/weiro/providers/siteexporter"
)
type Publisher struct {
@ -27,27 +28,14 @@ func New(db *db.Provider) *Publisher {
}
}
func (p *Publisher) Publish(ctx context.Context, siteID int64) error {
// Fetch site, ensure user is owner
site, err := p.db.SelectSiteByID(ctx, siteID)
if err != nil {
return err
}
user, ok := models.GetUser(ctx)
if !ok {
return models.UserRequiredError
} else if user.ID != site.OwnerID {
return models.PermissionError
}
targets, err := p.db.SelectPublishTargetsOfSite(ctx, siteID)
func (p *Publisher) Publish(ctx context.Context, site models.Site) error {
targets, err := p.db.SelectPublishTargetsOfSite(ctx, site.ID)
if err != nil {
return err
}
// Fetch all content of site
posts, err := p.db.SelectPostsOfSite(ctx, siteID)
posts, err := p.db.SelectPostsOfSite(ctx, site.ID)
if err != nil {
return err
}
@ -77,6 +65,17 @@ func (p *Publisher) publishSite(ctx context.Context, pubSite pubmodel.Site, targ
}
switch target.TargetType {
case "export":
exporter := siteexporter.New(pubSite.Site, target.BaseURL, target.TargetRef)
if err := exporter.WriteSiteYAML(); err != nil {
return err
}
for _, p := range pubSite.Posts {
if err := exporter.WritePost(p); err != nil {
return err
}
}
return nil
case "localfs":
log.Printf("Building site at %s", target.TargetRef)
return sb.BuildSite(target.TargetRef)