summaryrefslogtreecommitdiff
path: root/apps/web/src/services/storage/migrations/transformers/v26-to-v27.ts
diff options
context:
space:
mode:
authorMaze Winther <mazewinther@gmail.com>2026-04-22 02:41:18 +0200
committerMaze Winther <mazewinther@gmail.com>2026-04-22 02:41:18 +0200
commitf5f31b43df9ef46f1afdd63ba759b2f9bd80e7a3 (patch)
tree779132620064669a21c5fd9a787ba28187c0384e /apps/web/src/services/storage/migrations/transformers/v26-to-v27.ts
parenta709af0059dae4702b52197f34af85a817c59a6a (diff)
downloadopencut-f5f31b43df9ef46f1afdd63ba759b2f9bd80e7a3.tar.gz
refactor: migration run() and pure v1-to-v2 transform
Diffstat (limited to 'apps/web/src/services/storage/migrations/transformers/v26-to-v27.ts')
-rw-r--r--apps/web/src/services/storage/migrations/transformers/v26-to-v27.ts45
1 files changed, 44 insertions, 1 deletions
diff --git a/apps/web/src/services/storage/migrations/transformers/v26-to-v27.ts b/apps/web/src/services/storage/migrations/transformers/v26-to-v27.ts
index 820b0087..3b118ee7 100644
--- a/apps/web/src/services/storage/migrations/transformers/v26-to-v27.ts
+++ b/apps/web/src/services/storage/migrations/transformers/v26-to-v27.ts
@@ -1,7 +1,50 @@
-import { parseCustomMaskPath } from "@/masks/custom-path";
import type { MigrationResult, ProjectRecord } from "./types";
import { getProjectId, isRecord } from "./utils";
+interface CustomMaskPathPoint {
+ id: string;
+ x: number;
+ y: number;
+ inX: number;
+ inY: number;
+ outX: number;
+ outY: number;
+}
+
+function isCustomMaskPathPoint(value: unknown): value is CustomMaskPathPoint {
+ if (!value || typeof value !== "object") {
+ return false;
+ }
+
+ const candidate = value as Record<string, unknown>;
+ return (
+ typeof candidate.id === "string" &&
+ typeof candidate.x === "number" &&
+ typeof candidate.y === "number" &&
+ typeof candidate.inX === "number" &&
+ typeof candidate.inY === "number" &&
+ typeof candidate.outX === "number" &&
+ typeof candidate.outY === "number"
+ );
+}
+
+function parseCustomMaskPath({
+ path,
+}: {
+ path: string;
+}): CustomMaskPathPoint[] {
+ if (!path) {
+ return [];
+ }
+
+ try {
+ const parsed = JSON.parse(path);
+ return Array.isArray(parsed) ? parsed.filter(isCustomMaskPathPoint) : [];
+ } catch {
+ return [];
+ }
+}
+
export function transformProjectV26ToV27({
project,
}: {