Conversation
…ument JSON Migrate learning step persistence from the separate `learningsteps` table into the `learningpaths.document` JSONB payload, and update read/write flows, indexing, and tests to operate on embedded steps. - Add Flyway migration `V60__MoveLearningStepsToLearningPathDocument` to: - read existing path + step rows - enrich step documents with `id`, `revision`, `learningPathId`, `externalId` - embed sorted steps into each learning path document - delete migrated rows from `learningsteps` - Add migration `V61__AddStepIdIndex.sql` with a GIN index over embedded step IDs to keep step lookup performant. - Refactor `LearningPathRepository` to use `learningpaths.document` as the source of truth for steps: - fetch steps from embedded JSON - update step operations by rewriting the path document - assign path IDs + step IDs from existing sequences on insert - support imported step IDs while advancing sequence safely - add raw/non-filtered read helpers where deleted steps must be preserved. - Update `UpdateService` to: - operate on embedded steps for create/update/delete/seqNo/status actions - enforce step-level optimistic locking via revision checks - increment step revisions when mutating embedded steps - preserve deleted steps in persistence while exposing active-only views - index/search using active steps only. - Update `ConverterService` and search converters: - treat `learningsteps` as a required sequence - keep API conversion behavior compatible - filter to active steps for search indexing payloads. - Adjust internal endpoints and insert flow to return `Try`-based results for unified Tapir error handling. - Update model contract in `common`: - `LearningPath.learningsteps` is now `Seq[LearningStep]` (not `Option`) - JSON encoder/decoder now include `learningsteps` - add `withOnlyActiveSteps` helper on `LearningPath`. - Refresh integration/unit/e2e tests and test data across modules to match embedded-step persistence and new revision semantics. wip
82aa663 to
b375bc9
Compare
|
Det må være cache for eg ser ikkje at stien hentes på nytt fra backend ved henting av sida på nytt og heller ikkje med disableSSR=true. |
Hmm, testa om det oppfører seg annerledes i test? |
|
Oppførte seg visst likt der. |
b375bc9 to
6b50cc7
Compare
| oldLp.mapObject(_.remove("learningsteps").add("learningsteps", Json.fromValues(updatedSteps))).noSpaces | ||
| } | ||
|
|
||
| private def deleteSteps(learningPathId: Long)(using session: DBSession): Unit = { |
There was a problem hiding this comment.
Dette gjør at migreringa ikkje kan kjøres om igjen dersom den skulle feile. Kanskje heller ha en egen migrering i etterkant som berre dropper tabellen?
There was a problem hiding this comment.
Vil ikke en feil rulle tilbake migreringa?
There was a problem hiding this comment.
Ja det kan vi godt gjøre 😄
There was a problem hiding this comment.
Vil ikke en feil rulle tilbake migreringa?
Om det er en feil som kastes så, men om det er en logisk feil e.l som vi ikke har tenkt på så vil det jo potensielt commites.
6b50cc7 to
a02369a
Compare
gunnarvelle
left a comment
There was a problem hiding this comment.
Har testa dette både fra min ndla og ed i lokalt cluster, så funksjonelt fant eg ingen problemer. @amatho er ofte nøyere enn meg på kode, så fint om du også approver.
learningpath-api/src/main/scala/no/ndla/learningpathapi/repository/LearningPathRepository.scala
Outdated
Show resolved
Hide resolved
| oldLp.mapObject(_.remove("learningsteps").add("learningsteps", Json.fromValues(updatedSteps))).noSpaces | ||
| } | ||
|
|
||
| private def deleteSteps(learningPathId: Long)(using session: DBSession): Unit = { |
There was a problem hiding this comment.
Vil ikke en feil rulle tilbake migreringa?
learningpath-api/src/main/scala/no/ndla/learningpathapi/repository/LearningPathRepository.scala
Show resolved
Hide resolved
learningpath-api/src/main/scala/no/ndla/learningpathapi/repository/LearningPathRepository.scala
Outdated
Show resolved
Hide resolved
learningpath-api/src/main/scala/no/ndla/learningpathapi/repository/LearningPathRepository.scala
Outdated
Show resolved
Hide resolved
...cala/no/ndla/learningpathapi/db/migration/V60__MoveLearningStepsToLearningPathDocument.scala
Outdated
Show resolved
Hide resolved
learningpath-api/src/main/scala/no/ndla/learningpathapi/service/UpdateService.scala
Show resolved
Hide resolved
learningpath-api/src/main/scala/no/ndla/learningpathapi/service/UpdateService.scala
Outdated
Show resolved
Hide resolved
| val stepWithStatus = | ||
| if (isChangedStep) curr.copy(status = newStatus, lastUpdated = now) | ||
| else curr | ||
| val updatedStep = incrementStepRevision(stepWithStatus.copy(seqNo = seqNo, lastUpdated = now)) |
There was a problem hiding this comment.
Skal revision inkrementeres for alle steps, selv om de ikke er oppdatert status?
There was a problem hiding this comment.
For å være ærlig så er jeg ikke helt sikker på hvordan denne burde fungere jeg.
Denne kan jo potensielt endre på sequence number og. Hva tenker du?
There was a problem hiding this comment.
Hmm blir kanskje noe som det her hvis vi bare vil endre revision for steps som får endring i enten status eller seqNo?
val updatedStep =
if (isChangedStep || stepWithStatus.seqNo != seqNo)
incrementStepRevision(stepWithStatus.copy(seqNo = seqNo, lastUpdated = now))
else stepWithStatusThere was a problem hiding this comment.
Joda mer om det er det vi faktisk har lyst til.
Jeg tenker egentlig at enten så må alle revisjoner oppdateres (ellers vil jo låsingen ikke låse så bra om noen oppdaterer et annet steg?).
Evt så må vi kanskje droppe hele learningstep revisjonen og ta i bruk learningpath for hele greia alltid?
There was a problem hiding this comment.
Åja tenkte ikke så nøye på at det med låsing er en greie, da er jeg enig med at det er best å bare øke revision på alle
learningpath-api/src/main/scala/no/ndla/learningpathapi/service/UpdateService.scala
Outdated
Show resolved
Hide resolved
f8f4ffa to
b3a0393
Compare
…ngpath table this should make running the migration more robust, as it will not fail if the learningstep rows have already been deleted by a previous failed migration attempt.
7ba587c to
5d87a79
Compare
Denne ble større enn jeg så for meg, så hadde satt pris på om dere også testet denne litt! Hadde ikke blitt overrasket om det ikke var noe jeg ikke har tenkt på.
This is part 1 of 3 in a stack made with GitButler: