Added publishing of uploads to built site

This commit is contained in:
Leon Mika 2026-03-03 22:36:24 +11:00
parent 48f39133d7
commit d0cebe6564
13 changed files with 145 additions and 20 deletions

View file

@ -2,6 +2,7 @@ package publisher
import (
"context"
"io"
"log"
"os"
@ -16,15 +17,18 @@ import (
"lmika.dev/lmika/weiro/providers/db"
"lmika.dev/lmika/weiro/providers/sitebuilder"
"lmika.dev/lmika/weiro/providers/siteexporter"
"lmika.dev/lmika/weiro/providers/uploadfiles"
)
type Publisher struct {
db *db.Provider
up *uploadfiles.Provider
}
func New(db *db.Provider) *Publisher {
func New(db *db.Provider, up *uploadfiles.Provider) *Publisher {
return &Publisher{
db: db,
up: up,
}
}
@ -40,6 +44,12 @@ func (p *Publisher) Publish(ctx context.Context, site models.Site) error {
return err
}
// Fetch all uploads of site
uploads, err := p.db.SelectUploadsOfSite(ctx, site.ID)
if err != nil {
return err
}
for _, target := range targets {
if !target.Enabled {
continue
@ -49,6 +59,10 @@ func (p *Publisher) Publish(ctx context.Context, site models.Site) error {
Site: site,
Posts: posts,
BaseURL: target.BaseURL,
Uploads: uploads,
OpenUpload: func(u models.Upload) (io.ReadCloser, error) {
return p.up.OpenUpload(site, u)
},
}
if err := p.publishSite(ctx, pubSite, target); err != nil {

View file

@ -32,7 +32,7 @@ func New(cfg config.Config) (*Services, error) {
ufp := uploadfiles.New(filepath.Join(cfg.DataDir, "uploads"))
authSvc := auth.New(dbp)
publisherSvc := publisher.New(dbp)
publisherSvc := publisher.New(dbp, ufp)
publisherQueue := publisher.NewQueue(publisherSvc)
postService := posts.New(dbp, publisherQueue)
siteService := sites.New(dbp)

View file

@ -3,14 +3,22 @@ package uploads
import (
"context"
"fmt"
"html/template"
"io"
"log"
"strings"
"lmika.dev/lmika/weiro/models"
)
var (
uploadCopyTemplate = template.Must(template.New("upload-copy").Parse(`<img src="/uploads/{{.Slug}}" alt="{{.Alt}}">`))
)
type UploadWithURL struct {
Upload models.Upload
URL string
Upload models.Upload
CopyTemplate string
URL string
}
func (s *Service) FetchUpload(ctx context.Context, uploadID int64) (res UploadWithURL, _ error) {
@ -25,11 +33,22 @@ func (s *Service) FetchUpload(ctx context.Context, uploadID int64) (res UploadWi
}
return UploadWithURL{
Upload: upload,
URL: fmt.Sprintf("/sites/%v/uploads/%v/raw", site.ID, upload.ID),
Upload: upload,
CopyTemplate: s.renderCopyTemplate(upload),
URL: fmt.Sprintf("/sites/%v/uploads/%v/raw", site.ID, upload.ID),
}, nil
}
func (s *Service) renderCopyTemplate(upload models.Upload) string {
var sb strings.Builder
if err := uploadCopyTemplate.Execute(&sb, upload); err != nil {
log.Printf("error rendering upload copy template: %v", err)
return ""
}
return sb.String()
}
func (s *Service) ListUploads(ctx context.Context) (res []UploadWithURL, _ error) {
site, _, err := s.fetchSiteAndUser(ctx)
if err != nil {
@ -44,8 +63,9 @@ func (s *Service) ListUploads(ctx context.Context) (res []UploadWithURL, _ error
res = make([]UploadWithURL, len(uploads))
for i, upload := range uploads {
res[i] = UploadWithURL{
Upload: upload,
URL: fmt.Sprintf("/sites/%v/uploads/%v/raw", site.ID, upload.ID),
Upload: upload,
CopyTemplate: s.renderCopyTemplate(upload),
URL: fmt.Sprintf("/sites/%v/uploads/%v/raw", site.ID, upload.ID),
}
}