Added a database
This commit is contained in:
parent
ebaec3d296
commit
8136655336
35 changed files with 925 additions and 134 deletions
51
services/importer/service.go
Normal file
51
services/importer/service.go
Normal 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
|
||||
}
|
||||
80
services/publisher/service.go
Normal file
80
services/publisher/service.go
Normal 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
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue