Skip to content

Feat: ütemezett publikálás #77

Description

@Xentinus

Jelenség

Nincs időzített megjelentetés. Ma minden admin mentés azonnal élő (lásd #51), tehát ha egy projekt vagy bejegyzés adott napon kell hogy megjelenjen, azt kézzel, akkor kell kimenteni.

Javaslat

Előfeltétel: #51 (draft/publish állapot). Erre épül, önmagában nincs értelme.

  1. PublishedAt (DateTimeOffset?) a tartalom-entitásokon — a Feat: draft/publish állapot és előnézet a tartalmakra #51-ben már szerepel, itt annyi a különbség, hogy a jövőbe is állítható.
  2. Az olvasó oldal szűrése: Published && (PublishedAt == null || PublishedAt <= now). Ez a WorksController, SkillsController, ExperiencesController, SluggedContentController, valamint a SitemapController.LoadEntriesAsync, a PublicRouteIndex és a PageMetaIndex szűrőit érinti — mindenhol ugyanannak a feltételnek kell szerepelnie, tehát egy közös extension metódusba (IQueryable<T>.Visible(now)) érdemes kitenni.
  3. Cache-invalidálás időpontra. Ez a nem triviális rész: a ContentCache ma írásra invalidál, tehát egy jövőbeli időpont önmagában nem dobja a works:list, routes, meta és sitemap kulcsokat — a bejegyzés a megjelenés időpontja után is rejtve maradna a TTL végéig (alap 1 nap). Megoldás egy PublishScheduleService (BackgroundService), ami a legközelebbi esedékes időpontra ütemez, és annak elérkezésekor lefuttatja ugyanazt az invalidálást, amit az admin írás.
  4. TimeProvider használata (a projektben már bevett: AnalyticsController, ActivityStatsController), hogy tesztelhető legyen.
  5. Admin UI: dátum-idő választó a szerkesztőben, és a listában "ütemezett" állapotjelölés a Draft / Published mellett.
  6. Időzóna: a tárolás UTC, a megjelenítés helyi idő. A szerkesztőben egyértelműen ki kell írni, melyik időzóna szerint értendő a beállított időpont — ez az a részlet, ami nélkül a funkció rendszeresen fél napot téved.

Érintett fájlok

  • PortfolioCMS.Core/Models/Work.cs, Experience.cs, SkillGroup.cs (és a Feat: blog/jegyzet szekció #62 utáni Post.cs)
  • PortfolioCMS.Core/Controllers/ — az olvasó controllerek
  • PortfolioCMS.Core/Services/PublicRouteIndex.cs, PageMetaIndex.cs, új PublishScheduleService.cs
  • PortfolioCMS.Server/Controllers/SitemapController.cs
  • portfoliocms.admin.client/src/components/admin/EditorModal.vue, AdminListPanel.vue
  • PortfolioCMS.Tests/ — új PublishScheduleTests.cs

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions