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 }