Compare commits
4 commits
feature/rs
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
76ed54f119 | ||
|
|
891d904d9c | ||
|
|
1b24386001 | ||
|
|
55b388d497 |
|
|
@ -25,6 +25,7 @@ FROM alpine:latest
|
||||||
|
|
||||||
RUN apk --no-cache add ca-certificates
|
RUN apk --no-cache add ca-certificates
|
||||||
RUN mkdir -p /data
|
RUN mkdir -p /data
|
||||||
|
RUN mkdir -p /scratch
|
||||||
|
|
||||||
WORKDIR /root/
|
WORKDIR /root/
|
||||||
|
|
||||||
|
|
@ -34,6 +35,7 @@ COPY --from=builder /app/static ./static
|
||||||
COPY --from=builder /app/views ./views
|
COPY --from=builder /app/views ./views
|
||||||
|
|
||||||
ENV DATA_DIR=/data
|
ENV DATA_DIR=/data
|
||||||
|
ENV SCRATCH_DIR=/scratch
|
||||||
|
|
||||||
EXPOSE 3000
|
EXPOSE 3000
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -116,7 +116,7 @@ Starting weiro without any arguments will start the server.
|
||||||
app.Post("/login", lh.DoLogin)
|
app.Post("/login", lh.DoLogin)
|
||||||
app.Post("/logout", lh.Logout)
|
app.Post("/logout", lh.Logout)
|
||||||
|
|
||||||
siteGroup := app.Group("/sites/:siteID", middleware.RequireUser(svcs.Auth), middleware.RequiresSite(svcs.Sites))
|
siteGroup := app.Group("/sites/:siteID", middleware.LogErrors(), middleware.RequireUser(svcs.Auth), middleware.RequiresSite(svcs.Sites))
|
||||||
|
|
||||||
siteGroup.Get("/posts", ph.Index)
|
siteGroup.Get("/posts", ph.Index)
|
||||||
siteGroup.Get("/posts/new", ph.New)
|
siteGroup.Get("/posts/new", ph.New)
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ import (
|
||||||
|
|
||||||
type Config struct {
|
type Config struct {
|
||||||
DataDir string `env:"DATA_DIR"`
|
DataDir string `env:"DATA_DIR"`
|
||||||
ScratchDir string `env:"SCRATCH_DIR"`
|
ScratchDir string `env:"SCRATCH_DIR,default=/tmp"`
|
||||||
SiteDomain string `env:"SITE_DOMAIN"`
|
SiteDomain string `env:"SITE_DOMAIN"`
|
||||||
LoginLocked bool `env:"LOGIN_LOCKED,default=false"`
|
LoginLocked bool `env:"LOGIN_LOCKED,default=false"`
|
||||||
Env string `env:"ENV,default=prod"`
|
Env string `env:"ENV,default=prod"`
|
||||||
|
|
|
||||||
17
handlers/middleware/errlog.go
Normal file
17
handlers/middleware/errlog.go
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
package middleware
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
|
||||||
|
"github.com/gofiber/fiber/v3"
|
||||||
|
)
|
||||||
|
|
||||||
|
func LogErrors() func(c fiber.Ctx) error {
|
||||||
|
return func(c fiber.Ctx) error {
|
||||||
|
if err := c.Next(); err != nil {
|
||||||
|
log.Printf("error: %v\n", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -148,7 +148,7 @@ func (b *Builder) renderFeeds(ctx buildContext, postIter iter.Seq[models.Maybe[*
|
||||||
Content: string(renderedPost.HTML),
|
Content: string(renderedPost.HTML),
|
||||||
// TO FIX: Created should be first published
|
// TO FIX: Created should be first published
|
||||||
Created: post.PublishedAt,
|
Created: post.PublishedAt,
|
||||||
Updated: post.PublishedAt,
|
Updated: post.UpdatedAt,
|
||||||
})
|
})
|
||||||
|
|
||||||
items++
|
items++
|
||||||
|
|
|
||||||
|
|
@ -26,12 +26,46 @@ func (p *Provider) AdoptFile(site models.Site, up models.Upload, filename string
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := os.Rename(filename, fullPath); err != nil {
|
if err := os.Rename(filename, fullPath); err == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Can't rename, possibly because of a cross-link device issue. So copy instead
|
||||||
|
if err := moveFile(filename, fullPath); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func moveFile(src, dst string) error {
|
||||||
|
if err := copyFile(src, dst); err != nil {
|
||||||
|
_ = os.Remove(dst)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_ = os.Remove(src)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func copyFile(src, dst string) error {
|
||||||
|
in, err := os.Open(src)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer in.Close()
|
||||||
|
|
||||||
|
out, err := os.Create(dst)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer out.Close()
|
||||||
|
|
||||||
|
if _, err = io.Copy(out, in); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
func (p *Provider) OpenUpload(site models.Site, up models.Upload) (io.ReadCloser, error) {
|
func (p *Provider) OpenUpload(site models.Site, up models.Upload) (io.ReadCloser, error) {
|
||||||
fullPath := p.uploadFileName(site, up)
|
fullPath := p.uploadFileName(site, up)
|
||||||
return os.Open(fullPath)
|
return os.Open(fullPath)
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,8 @@ type CreatePostParams struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Service) UpdatePost(ctx context.Context, params CreatePostParams) (*models.Post, error) {
|
func (s *Service) UpdatePost(ctx context.Context, params CreatePostParams) (*models.Post, error) {
|
||||||
|
now := time.Now()
|
||||||
|
|
||||||
site, ok := models.GetSite(ctx)
|
site, ok := models.GetSite(ctx)
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, models.SiteRequiredError
|
return nil, models.SiteRequiredError
|
||||||
|
|
@ -29,14 +31,14 @@ func (s *Service) UpdatePost(ctx context.Context, params CreatePostParams) (*mod
|
||||||
|
|
||||||
post.Title = params.Title
|
post.Title = params.Title
|
||||||
post.Body = params.Body
|
post.Body = params.Body
|
||||||
post.UpdatedAt = time.Now()
|
post.UpdatedAt = now
|
||||||
post.Slug = post.BestSlug()
|
post.Slug = post.BestSlug()
|
||||||
oldState := post.State
|
oldState := post.State
|
||||||
|
|
||||||
switch strings.ToLower(params.Action) {
|
switch strings.ToLower(params.Action) {
|
||||||
case "publish":
|
case "publish":
|
||||||
post.State = models.StatePublished
|
post.State = models.StatePublished
|
||||||
post.PublishedAt = time.Now()
|
post.PublishedAt = now
|
||||||
case "save draft":
|
case "save draft":
|
||||||
post.State = models.StateDraft
|
post.State = models.StateDraft
|
||||||
post.PublishedAt = time.Time{}
|
post.PublishedAt = time.Time{}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue