Add revised date to replace manually updated published#916
Conversation
280e6dd to
8cae5be
Compare
There was a problem hiding this comment.
Pull request overview
Adds support for a dedicated revision date (revised) and a first-publication timestamp (firstPublished) so published can be set automatically on publish/republish, and introduces an isRepublished flag/filter in editorial draft search.
Changes:
- Extend domain/API/search models with
revised,firstPublished, andisRepublished, and update indexing/mappings accordingly. - Add editorial search support for
isRepublished(DTO, controller params, ES query filter) and tests for the filter. - Add DB migrations to populate
revisedand backfill/updatepublished/firstPublished.
Reviewed changes
Copilot reviewed 45 out of 45 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| search-api/src/test/scala/no/ndla/searchapi/service/search/MultiDraftSearchServiceTest.scala | Adds isRepublished filter test. |
| search-api/src/test/scala/no/ndla/searchapi/service/search/MultiDraftSearchServiceAtomicTest.scala | Updates published handling to Option. |
| search-api/src/test/scala/no/ndla/searchapi/model/search/SearchableDraftTest.scala | Adapts test data to new fields. |
| search-api/src/test/scala/no/ndla/searchapi/model/search/SearchableArticleTest.scala | Adds revised to searchable article tests. |
| search-api/src/test/scala/no/ndla/searchapi/TestData.scala | Updates test fixtures for new date fields. |
| search-api/src/main/scala/no/ndla/searchapi/service/search/SearchConverterService.scala | Populates revised and isRepublished in search docs/DTOs. |
| search-api/src/main/scala/no/ndla/searchapi/service/search/MultiDraftSearchService.scala | Adds ES filter for isRepublished. |
| search-api/src/main/scala/no/ndla/searchapi/service/search/DraftIndexService.scala | Adds ES mapping for revised and isRepublished. |
| search-api/src/main/scala/no/ndla/searchapi/service/search/ArticleIndexService.scala | Adds ES mapping for revised. |
| search-api/src/main/scala/no/ndla/searchapi/model/search/settings/MultiDraftSearchSettings.scala | Adds isRepublished setting. |
| search-api/src/main/scala/no/ndla/searchapi/model/search/SearchableDraft.scala | Makes published optional; adds revised/isRepublished. |
| search-api/src/main/scala/no/ndla/searchapi/model/search/SearchableArticle.scala | Adds revised field. |
| search-api/src/main/scala/no/ndla/searchapi/controller/parameters/DraftSearchParamsDTO.scala | Exposes isRepublished query param. |
| search-api/src/main/scala/no/ndla/searchapi/controller/SearchController.scala | Wires is-republished into settings. |
| integration-tests/src/test/scala/no/ndla/integrationtests/searchapi/draftapi/DraftApiClientTest.scala | Updates published/revised expectations in integration test. |
| integration-tests/src/test/scala/no/ndla/integrationtests/draftapi/articleapi/ArticleApiClientTest.scala | Stabilizes time usage and updates new fields. |
| draft-api/src/test/scala/no/ndla/draftapi/service/WriteServiceTest.scala | Updates tests to use revised and optional published. |
| draft-api/src/test/scala/no/ndla/draftapi/service/StateTransitionRulesTest.scala | Updates publish/transition expectations for new dates. |
| draft-api/src/test/scala/no/ndla/draftapi/service/ConverterServiceTest.scala | Updates converter tests for new date fields. |
| draft-api/src/test/scala/no/ndla/draftapi/model/search/SearchableArticleSerializerTest.scala | Adds isRepublished serialization coverage. |
| draft-api/src/test/scala/no/ndla/draftapi/TestData.scala | Updates draft-api test fixtures for new fields. |
| draft-api/src/main/scala/no/ndla/draftapi/service/search/SearchConverterService.scala | Computes isRepublished for draft search indexing. |
| draft-api/src/main/scala/no/ndla/draftapi/service/search/ArticleIndexService.scala | Adds ES mapping for isRepublished. |
| draft-api/src/main/scala/no/ndla/draftapi/service/WriteService.scala | Adjusts copy/create logic for revised/published behavior. |
| draft-api/src/main/scala/no/ndla/draftapi/service/StateTransitionRules.scala | Sets published/firstPublished automatically on publish. |
| draft-api/src/main/scala/no/ndla/draftapi/service/ConverterService.scala | Adds conversion support for revised/published/firstPublished. |
| draft-api/src/main/scala/no/ndla/draftapi/repository/DraftRepository.scala | Adds deterministic ordering to query results. |
| draft-api/src/main/scala/no/ndla/draftapi/model/search/SearchableArticle.scala | Adds isRepublished to searchable draft-article. |
| draft-api/src/main/scala/no/ndla/draftapi/model/api/UpdatedArticleDTO.scala | Adds revised to update DTO. |
| draft-api/src/main/scala/no/ndla/draftapi/model/api/PartialPublishArticle.scala | Renames partial field from published to revised. |
| draft-api/src/main/scala/no/ndla/draftapi/model/api/NewArticleDTO.scala | Deprecates published; adds revised. |
| draft-api/src/main/scala/no/ndla/draftapi/model/api/ArticleDTO.scala | Makes published optional; adds revised. |
| draft-api/src/main/scala/no/ndla/draftapi/integration/ArticleApiClient.scala | Renames helper to withRevised. |
| draft-api/src/main/scala/no/ndla/draftapi/DraftUtil.scala | Updates partial-publish field comparison. |
| draft-api/src/main/resources/no/ndla/draftapi/db/migration/V88__AddRevisedDate.sql | Backfills revised, updates published, sets firstPublished. |
| common/src/test/scala/no/ndla/common/model/api/search/MultiSearchSummaryDTOTest.scala | Updates summary DTO tests for revised. |
| common/src/main/scala/no/ndla/common/model/domain/draft/Draft.scala | Adds revised/firstPublished; makes published optional. |
| common/src/main/scala/no/ndla/common/model/domain/article/PartialPublishArticleDTO.scala | Switches partial publish field to revised. |
| common/src/main/scala/no/ndla/common/model/domain/article/Article.scala | Adds revised to domain article. |
| common/src/main/scala/no/ndla/common/model/api/search/MultiSearchSummaryDTO.scala | Adds revised to search summary DTO. |
| article-api/src/test/scala/no/ndla/articleapi/service/ConverterServiceTest.scala | Updates tests to use revised in partial publish. |
| article-api/src/test/scala/no/ndla/articleapi/TestData.scala | Updates test fixtures for revised. |
| article-api/src/main/scala/no/ndla/articleapi/service/ConverterService.scala | Applies revised updates instead of published. |
| article-api/src/main/scala/no/ndla/articleapi/model/api/ArticleV2DTO.scala | Adds revised to V2 DTO. |
| article-api/src/main/resources/no/ndla/articleapi/db/migration/V70__AddRevisedDate.sql | Backfills revised and updates published. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
3d5c69c to
dd06974
Compare
39c175f to
182e310
Compare
There was a problem hiding this comment.
Tok 80 sek å kjøre denne på min maskin, så jeg spurte Claudern om å skrive den raskere, og da tok det 40 sek å kjøre. Legger den her hvis du har lyst til å bruke den 😄
Men jeg ser at artikler hvor siste revisjon ikke er status PUBLISHED får publish feltet satt til revised datoen. Ønsker vi det?
UPDATE articledata
SET document = document
|| jsonb_build_object('revised', document -> 'published')
|| jsonb_build_object('published',
CASE
WHEN document -> 'status' ->> 'current' = 'PUBLISHED'
THEN document -> 'updated'
WHEN NOT (document -> 'status' -> 'other' @> '[
"PUBLISHED"
]'::jsonb)
THEN 'null'::jsonb
ELSE document -> 'published'
END)
WHERE document IS NOT NULL;
WITH first_published AS (SELECT DISTINCT ON (article_id) article_id,
document -> 'published' AS published
FROM articledata
WHERE document IS NOT NULL
AND document ->> 'published' IS NOT NULL
ORDER BY article_id, revision ASC)
UPDATE articledata ad
SET document = jsonb_set(
ad.document,
'{firstPublished}',
COALESCE(fp.published, 'null'::jsonb),
true)
FROM articledata src
LEFT JOIN first_published fp ON fp.article_id = src.article_id
WHERE ad.id = src.id
AND ad.document IS NOT NULL;There was a problem hiding this comment.
Endringa gjorde at lokal kjøring av migreringa gikk fra 240 sekund til 95 sekund.
There was a problem hiding this comment.
Men samtidig er det fleire artikler som har fått satt firstPublished med denne koden. Må sjekke om eg ser kvifor.
There was a problem hiding this comment.
Ser at forrige kommentaren var feil. Det var færre artikler som hadde firstPublished satt.
Forskjellen ligger i at gammel kode eksplisitt setter firstPublished til published før firstPublished regnes ut på bakgrunn av første publisering. Det gir ca 7000 rader ekstra med firstPublished satt. Tenker kanskje at det er greit at færre artikler har firstPublished satt.
| test("that toArticleApiArticle fails if copyright is not present") { | ||
| val draft = TestData.sampleDomainArticle.copy(copyright = None) | ||
| val Failure(result1: ValidationException) = service.toArticleApiArticle(draft): @unchecked | ||
| val Failure(result1: ValidationException) = service.toArticleApiArticle(draft, false): @unchecked |
There was a problem hiding this comment.
Skal det egentlig være true her?
| val Failure(result1: ValidationException) = service.toArticleApiArticle(draft, false): @unchecked | |
| val Failure(result1: ValidationException) = service.toArticleApiArticle(draft, true): @unchecked |
There was a problem hiding this comment.
Tenkte erroren under antyda publisering og ikkje validering. Har uansett ingen praktisk betydning.
419b37b to
e1f4c40
Compare
e1f4c40 to
f5af745
Compare
|
Det er forresten ikkje gitt at revised er det beste navnet på nytt felt. Kom gjerne med forslag. |
Tror ikke jeg har noe bedre forslag 😄 |
Legger til datofelt for faglig oppdatert slik at published kan settes automatisk ved publisering.
Nytt felt firstPublished som kun settes ved aller første publisering.
Nytt filter i editorial-søket som lar deg filtrere på isRepublished