From 9fbba7ea55f2a8eedb193b402f56a17edd6ac51e Mon Sep 17 00:00:00 2001
From: adrifcastr <adrifcastr@gmail.com>
Date: Thu, 22 Jun 2023 10:47:14 +0200
Subject: [PATCH] localstorage migration

---
 src/state/bookmark/store.ts        |  7 +++
 src/state/watched/migrations/v3.ts | 87 ++++++++++++++++++++++++++++++
 src/state/watched/store.ts         |  7 +++
 3 files changed, 101 insertions(+)
 create mode 100644 src/state/watched/migrations/v3.ts

diff --git a/src/state/bookmark/store.ts b/src/state/bookmark/store.ts
index 1b7a2053..51de0ed0 100644
--- a/src/state/bookmark/store.ts
+++ b/src/state/bookmark/store.ts
@@ -2,6 +2,7 @@ import { createVersionedStore } from "@/utils/storage";
 
 import { BookmarkStoreData } from "./types";
 import { OldBookmarks, migrateV1Bookmarks } from "../watched/migrations/v2";
+import { migrateV2Bookmarks } from "../watched/migrations/v3";
 
 export const BookmarkStore = createVersionedStore<BookmarkStoreData>()
   .setKey("mw-bookmarks")
@@ -13,6 +14,12 @@ export const BookmarkStore = createVersionedStore<BookmarkStoreData>()
   })
   .addVersion({
     version: 1,
+    migrate(old: OldBookmarks) {
+      return migrateV2Bookmarks(old);
+    },
+  })
+  .addVersion({
+    version: 2,
     create() {
       return {
         bookmarks: [],
diff --git a/src/state/watched/migrations/v3.ts b/src/state/watched/migrations/v3.ts
new file mode 100644
index 00000000..971dacf1
--- /dev/null
+++ b/src/state/watched/migrations/v3.ts
@@ -0,0 +1,87 @@
+import { getLegacyMetaFromId } from "@/backend/metadata/getmeta";
+import { getMovieFromExternalId } from "@/backend/metadata/tmdb";
+import { MWMediaType } from "@/backend/metadata/types/mw";
+
+import { WatchedStoreData } from "../types";
+
+async function migrateId(
+  id: number,
+  type: MWMediaType
+): Promise<string | undefined> {
+  console.log("migrating id", id, type);
+  const meta = await getLegacyMetaFromId(type, id.toString());
+  console.log("migrating id", meta);
+
+  if (!meta) return undefined;
+  const { tmdbId, imdbId } = meta;
+  if (!tmdbId && !imdbId) return undefined;
+
+  // movies always have an imdb id on tmdb
+  if (imdbId && type === MWMediaType.MOVIE) {
+    const movieId = await getMovieFromExternalId(imdbId);
+    if (movieId) return movieId;
+  }
+
+  if (tmdbId) {
+    return tmdbId;
+  }
+}
+
+export async function migrateV2Bookmarks(old: any) {
+  const oldData = old;
+  if (!oldData) return;
+
+  const updatedBookmarks = oldData.bookmarks.map(
+    async (item: { id: number; type: MWMediaType }) => ({
+      ...item,
+      mediaId: await migrateId(item.id, item.type),
+    })
+  );
+
+  return {
+    bookmarks: (await Promise.all(updatedBookmarks)).filter(
+      (item) => item.mediaId
+    ),
+  };
+}
+
+export async function migrateV3Videos(old: any) {
+  console.log("migrating watched");
+  const oldData = old;
+  if (!oldData) return;
+  console.log(oldData);
+
+  const updatedItems = await Promise.all(
+    oldData.items.map(async (item: any) => {
+      const migratedId = await migrateId(
+        item.item.meta.id,
+        item.item.meta.type
+      );
+
+      const migratedItem = {
+        ...item,
+        item: {
+          ...item.item,
+          meta: {
+            ...item.item.meta,
+            id: migratedId,
+          },
+        },
+      };
+
+      return {
+        ...item,
+        item: migratedId ? migratedItem : item.item,
+      };
+    })
+  );
+
+  const newData: WatchedStoreData = {
+    items: updatedItems.map((item) => item.item), // Extract the "item" object
+  };
+
+  return {
+    ...oldData,
+    items: newData.items,
+  };
+}
diff --git a/src/state/watched/store.ts b/src/state/watched/store.ts
index 95adef28..b59c37dc 100644
--- a/src/state/watched/store.ts
+++ b/src/state/watched/store.ts
@@ -1,6 +1,7 @@
 import { createVersionedStore } from "@/utils/storage";
 
 import { OldData, migrateV2Videos } from "./migrations/v2";
+import { migrateV3Videos } from "./migrations/v3";
 import { WatchedStoreData } from "./types";
 
 export const VideoProgressStore = createVersionedStore<WatchedStoreData>()
@@ -21,6 +22,12 @@ export const VideoProgressStore = createVersionedStore<WatchedStoreData>()
   })
   .addVersion({
     version: 2,
+    migrate(old: OldData) {
+      return migrateV3Videos(old);
+    },
+  })
+  .addVersion({
+    version: 3,
     create() {
       return {
         items: [],