Added a database

This commit is contained in:
Leon Mika 2026-02-19 22:29:44 +11:00
parent ebaec3d296
commit 8136655336
35 changed files with 925 additions and 134 deletions

View file

@ -0,0 +1,51 @@
package importer
import (
"context"
"os"
"emperror.dev/errors"
"lmika.dev/lmika/weiro/models"
"lmika.dev/lmika/weiro/providers/db"
"lmika.dev/lmika/weiro/providers/sitereader"
)
type Service struct {
db *db.Provider
}
func New(db *db.Provider) *Service {
return &Service{
db: db,
}
}
func (s *Service) Import(ctx context.Context, sitePath string) (models.Site, error) {
user, ok := models.GetUser(ctx)
if !ok {
return models.Site{}, models.UserRequiredError
}
sr := sitereader.New(os.DirFS(sitePath))
readSite, err := sr.ReadSite()
if err != nil {
return models.Site{}, errors.Wrap(err, "failed to read site")
}
site := readSite.Site
site.OwnerID = user.ID
if err := s.db.SaveSite(ctx, &site); err != nil {
return models.Site{}, errors.Wrap(err, "failed to save site")
}
for _, post := range readSite.Posts {
post.SiteID = site.ID
if err := s.db.SavePost(ctx, post); err != nil {
return models.Site{}, errors.Wrap(err, "failed to save post")
}
}
return site, nil
}

View file

@ -0,0 +1,80 @@
package publisher
import (
"context"
"log"
"lmika.dev/lmika/weiro/layouts/simplecss"
"lmika.dev/lmika/weiro/models"
"lmika.dev/lmika/weiro/models/pubmodel"
"lmika.dev/lmika/weiro/providers/db"
"lmika.dev/lmika/weiro/providers/sitebuilder"
)
type Publisher struct {
db *db.Provider
}
func New(db *db.Provider) *Publisher {
return &Publisher{
db: db,
}
}
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)
if err != nil {
return err
}
// Fetch all content of site
posts, err := p.db.SelectPostsOfSite(ctx, siteID)
if err != nil {
return err
}
for _, target := range targets {
pubSite := pubmodel.Site{
Site: site,
Posts: posts,
BaseURL: target.BaseURL,
}
if err := p.publishSite(ctx, pubSite, target); err != nil {
return err
}
}
return nil
}
func (p *Publisher) publishSite(ctx context.Context, pubSite pubmodel.Site, target models.SitePublishTarget) error {
sb, err := sitebuilder.New(pubSite, sitebuilder.Options{
BasePosts: "/posts",
TemplatesFS: simplecss.FS,
})
if err != nil {
return err
}
switch target.TargetType {
case models.PublishTargetTypeLocalFS:
log.Printf("Building site at %s", target.TargetRef)
return sb.BuildSite(target.TargetRef)
}
return nil
}