Skip to content

Add revised date to replace manually updated published#916

Merged
gunnarvelle merged 16 commits into
masterfrom
first-and-latest-published
Apr 23, 2026
Merged

Add revised date to replace manually updated published#916
gunnarvelle merged 16 commits into
masterfrom
first-and-latest-published

Conversation

@gunnarvelle
Copy link
Copy Markdown
Member

@gunnarvelle gunnarvelle commented Apr 16, 2026

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

@gunnarvelle gunnarvelle force-pushed the first-and-latest-published branch 4 times, most recently from 280e6dd to 8cae5be Compare April 16, 2026 11:24
@gunnarvelle gunnarvelle marked this pull request as ready for review April 17, 2026 11:45
@gunnarvelle gunnarvelle requested review from a team and Copilot April 17, 2026 11:45
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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, and isRepublished, 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 revised and backfill/update published/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.

Comment thread draft-api/src/main/scala/no/ndla/draftapi/DraftUtil.scala Outdated
Comment thread draft-api/src/test/scala/no/ndla/draftapi/service/StateTransitionRulesTest.scala Outdated
@gunnarvelle gunnarvelle force-pushed the first-and-latest-published branch from 3d5c69c to dd06974 Compare April 17, 2026 12:43
Comment thread draft-api/src/main/scala/no/ndla/draftapi/model/api/NewArticleDTO.scala Outdated
Comment thread draft-api/src/main/scala/no/ndla/draftapi/service/ConverterService.scala Outdated
Comment thread draft-api/src/main/scala/no/ndla/draftapi/service/ConverterService.scala Outdated
@gunnarvelle gunnarvelle force-pushed the first-and-latest-published branch from 39c175f to 182e310 Compare April 21, 2026 07:03
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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;

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Endringa gjorde at lokal kjøring av migreringa gikk fra 240 sekund til 95 sekund.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Men samtidig er det fleire artikler som har fått satt firstPublished med denne koden. Må sjekke om eg ser kvifor.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Comment thread draft-api/src/main/scala/no/ndla/draftapi/service/ConverterService.scala Outdated
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
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Skal det egentlig være true her?

Suggested change
val Failure(result1: ValidationException) = service.toArticleApiArticle(draft, false): @unchecked
val Failure(result1: ValidationException) = service.toArticleApiArticle(draft, true): @unchecked

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tenkte erroren under antyda publisering og ikkje validering. Har uansett ingen praktisk betydning.

@gunnarvelle gunnarvelle force-pushed the first-and-latest-published branch from 419b37b to e1f4c40 Compare April 21, 2026 13:21
@gunnarvelle gunnarvelle force-pushed the first-and-latest-published branch from e1f4c40 to f5af745 Compare April 21, 2026 13:37
@gunnarvelle gunnarvelle requested a review from amatho April 22, 2026 11:59
@gunnarvelle
Copy link
Copy Markdown
Member Author

Det er forresten ikkje gitt at revised er det beste navnet på nytt felt. Kom gjerne med forslag.

@gunnarvelle gunnarvelle requested a review from a team April 23, 2026 06:28
@amatho
Copy link
Copy Markdown
Contributor

amatho commented Apr 23, 2026

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 😄

@gunnarvelle gunnarvelle merged commit fb3749c into master Apr 23, 2026
25 checks passed
@gunnarvelle gunnarvelle deleted the first-and-latest-published branch April 23, 2026 08:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants