diff options
Diffstat (limited to 'apps/web/src/services/storage/migrations/v2-to-v3.ts')
| -rw-r--r-- | apps/web/src/services/storage/migrations/v2-to-v3.ts | 74 |
1 files changed, 10 insertions, 64 deletions
diff --git a/apps/web/src/services/storage/migrations/v2-to-v3.ts b/apps/web/src/services/storage/migrations/v2-to-v3.ts index eb6db26d..100dc572 100644 --- a/apps/web/src/services/storage/migrations/v2-to-v3.ts +++ b/apps/web/src/services/storage/migrations/v2-to-v3.ts @@ -1,9 +1,6 @@ -import { getProjectDurationFromScenes } from "@/lib/scenes"; import { IndexedDBAdapter } from "@/services/storage/indexeddb-adapter"; -import type { TScene } from "@/types/timeline"; import { StorageMigration } from "./base"; - -type ProjectRecord = Record<string, unknown>; +import { getProjectId, transformProjectV2ToV3 } from "./transformers/v2-to-v3"; export class V2toV3Migration extends StorageMigration { from = 2; @@ -18,75 +15,24 @@ export class V2toV3Migration extends StorageMigration { const projects = await projectsAdapter.getAll(); for (const project of projects) { - if (!isRecord(project)) { + if (typeof project !== "object" || project === null) { continue; } - const projectId = getProjectId({ project }); - if (!projectId) { + const result = transformProjectV2ToV3({ + project: project as Record<string, unknown>, + }); + + if (result.skipped) { continue; } - if (isV3Project({ project })) { + const projectId = getProjectId({ project: result.project }); + if (!projectId) { continue; } - const scenes = getScenes({ project }); - const duration = getProjectDurationFromScenes({ scenes }); - - const metadataValue = project.metadata; - const metadata = isRecord(metadataValue) - ? { ...metadataValue, duration } - : { duration }; - - const migratedProject = { - ...project, - metadata, - version: 3, - }; - - await projectsAdapter.set(projectId, migratedProject); + await projectsAdapter.set(projectId, result.project); } } } - -function getProjectId({ project }: { project: ProjectRecord }): string | null { - const idValue = project.id; - if (typeof idValue === "string" && idValue.length > 0) { - return idValue; - } - - const metadataValue = project.metadata; - if (!isRecord(metadataValue)) { - return null; - } - - const metadataId = metadataValue.id; - if (typeof metadataId === "string" && metadataId.length > 0) { - return metadataId; - } - - return null; -} - -function getScenes({ project }: { project: ProjectRecord }): TScene[] { - const scenesValue = project.scenes; - if (!Array.isArray(scenesValue)) { - return []; - } - - return scenesValue.filter(isRecord) as unknown as TScene[]; -} - -function isV3Project({ project }: { project: ProjectRecord }): boolean { - const versionValue = project.version; - if (typeof versionValue === "number" && versionValue >= 3) { - return true; - } - - return isRecord(project.metadata) && typeof project.metadata.duration === "number"; -} - -function isRecord(value: unknown): value is ProjectRecord { - return typeof value === "object" && value !== null; -} |
