package posts import ( "context" "strings" "time" "lmika.dev/lmika/weiro/models" "lmika.dev/lmika/weiro/providers/db" ) type CreatePostParams struct { GUID string `form:"guid" json:"guid"` Title string `form:"title" json:"title"` Body string `form:"body" json:"body"` Action string `form:"action" json:"action"` } func (s *Service) UpdatePost(ctx context.Context, params CreatePostParams) (*models.Post, error) { now := time.Now() site, ok := models.GetSite(ctx) if !ok { return nil, models.SiteRequiredError } post, err := s.fetchOrCreatePost(ctx, site, params) if err != nil { return nil, err } post.Title = params.Title post.Body = params.Body post.UpdatedAt = now post.Slug = post.BestSlug() oldState := post.State switch strings.ToLower(params.Action) { case "publish": post.State = models.StatePublished post.PublishedAt = now case "save draft": post.State = models.StateDraft post.PublishedAt = time.Time{} default: // Leave unchanged } if err := s.db.SavePost(ctx, post); err != nil { return nil, err } if oldState != post.State || post.State == models.StatePublished { s.publisher.Queue(site) } return post, nil } func (s *Service) fetchOrCreatePost(ctx context.Context, site models.Site, params CreatePostParams) (*models.Post, error) { post, err := s.db.SelectPostByGUID(ctx, params.GUID) if err == nil { if post.SiteID != site.ID { return nil, models.NotFoundError } return post, nil } else if !db.ErrorIsNoRows(err) { return nil, err } post = &models.Post{ SiteID: site.ID, GUID: params.GUID, Title: params.Title, Body: params.Body, State: models.StateDraft, CreatedAt: time.Now(), } return post, nil }