remove normalization, fix import issues

This commit is contained in:
Zimeng Xiong
2025-11-21 23:10:51 -08:00
parent aae0059a6f
commit be45a0c913
13 changed files with 99 additions and 19 deletions
@@ -0,0 +1,21 @@
-- RedefineTables
PRAGMA defer_foreign_keys=ON;
PRAGMA foreign_keys=OFF;
CREATE TABLE "new_Drawing" (
"id" TEXT NOT NULL PRIMARY KEY,
"name" TEXT NOT NULL,
"elements" TEXT NOT NULL,
"appState" TEXT NOT NULL,
"files" TEXT NOT NULL DEFAULT '{}',
"preview" TEXT,
"version" INTEGER NOT NULL DEFAULT 1,
"collectionId" TEXT,
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" DATETIME NOT NULL,
CONSTRAINT "Drawing_collectionId_fkey" FOREIGN KEY ("collectionId") REFERENCES "Collection" ("id") ON DELETE SET NULL ON UPDATE CASCADE
);
INSERT INTO "new_Drawing" ("appState", "collectionId", "createdAt", "elements", "id", "name", "preview", "updatedAt", "version") SELECT "appState", "collectionId", "createdAt", "elements", "id", "name", "preview", "updatedAt", "version" FROM "Drawing";
DROP TABLE "Drawing";
ALTER TABLE "new_Drawing" RENAME TO "Drawing";
PRAGMA foreign_keys=ON;
PRAGMA defer_foreign_keys=OFF;
+1
View File
@@ -24,6 +24,7 @@ model Drawing {
name String
elements String // Stored as JSON string
appState String // Stored as JSON string
files String @default("{}") // Stored as JSON string
preview String? // SVG string for thumbnail
version Int @default(1)
collectionId String?
+4 -3
View File
@@ -99,6 +99,7 @@ exports.Prisma.DrawingScalarFieldEnum = {
name: 'name',
elements: 'elements',
appState: 'appState',
files: 'files',
preview: 'preview',
version: 'version',
collectionId: 'collectionId',
@@ -168,13 +169,13 @@ const config = {
}
}
},
"inlineSchema": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\ngenerator client {\n provider = \"prisma-client-js\"\n output = \"../src/generated/client\"\n}\n\ndatasource db {\n provider = \"sqlite\"\n url = env(\"DATABASE_URL\")\n}\n\nmodel Collection {\n id String @id @default(uuid())\n name String\n drawings Drawing[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Drawing {\n id String @id @default(uuid())\n name String\n elements String // Stored as JSON string\n appState String // Stored as JSON string\n preview String? // SVG string for thumbnail\n version Int @default(1)\n collectionId String?\n collection Collection? @relation(fields: [collectionId], references: [id])\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n",
"inlineSchemaHash": "67e1a3789d22e31866fa8b498914744bb15a8743c766f6c9cb36263d6b7740a9",
"inlineSchema": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\ngenerator client {\n provider = \"prisma-client-js\"\n output = \"../src/generated/client\"\n}\n\ndatasource db {\n provider = \"sqlite\"\n url = env(\"DATABASE_URL\")\n}\n\nmodel Collection {\n id String @id @default(uuid())\n name String\n drawings Drawing[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Drawing {\n id String @id @default(uuid())\n name String\n elements String // Stored as JSON string\n appState String // Stored as JSON string\n files String @default(\"{}\") // Stored as JSON string\n preview String? // SVG string for thumbnail\n version Int @default(1)\n collectionId String?\n collection Collection? @relation(fields: [collectionId], references: [id])\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n",
"inlineSchemaHash": "e43b17bb99e7f864b5a0f2c54951015f0a3d998329d0577afda58e7c0dee4919",
"copyEngine": true
}
config.dirname = '/'
config.runtimeDataModel = JSON.parse("{\"models\":{\"Collection\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"uuid(4)\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"drawings\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Drawing\",\"relationName\":\"CollectionToDrawing\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Drawing\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"uuid(4)\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"elements\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"appState\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"preview\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"version\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":1,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"collectionId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"collection\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Collection\",\"relationName\":\"CollectionToDrawing\",\"relationFromFields\":[\"collectionId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false}},\"enums\":{},\"types\":{}}")
config.runtimeDataModel = JSON.parse("{\"models\":{\"Collection\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"uuid(4)\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"drawings\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Drawing\",\"relationName\":\"CollectionToDrawing\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Drawing\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"uuid(4)\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"elements\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"appState\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"files\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":\"{}\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"preview\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"version\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":1,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"collectionId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"collection\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Collection\",\"relationName\":\"CollectionToDrawing\",\"relationFromFields\":[\"collectionId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false}},\"enums\":{},\"types\":{}}")
defineDmmfProperty(exports.Prisma, config.runtimeDataModel)
config.engineWasm = undefined
@@ -131,6 +131,7 @@ exports.Prisma.DrawingScalarFieldEnum = {
name: 'name',
elements: 'elements',
appState: 'appState',
files: 'files',
preview: 'preview',
version: 'version',
collectionId: 'collectionId',
+35
View File
@@ -1918,6 +1918,7 @@ export namespace Prisma {
name: string | null
elements: string | null
appState: string | null
files: string | null
preview: string | null
version: number | null
collectionId: string | null
@@ -1930,6 +1931,7 @@ export namespace Prisma {
name: string | null
elements: string | null
appState: string | null
files: string | null
preview: string | null
version: number | null
collectionId: string | null
@@ -1942,6 +1944,7 @@ export namespace Prisma {
name: number
elements: number
appState: number
files: number
preview: number
version: number
collectionId: number
@@ -1964,6 +1967,7 @@ export namespace Prisma {
name?: true
elements?: true
appState?: true
files?: true
preview?: true
version?: true
collectionId?: true
@@ -1976,6 +1980,7 @@ export namespace Prisma {
name?: true
elements?: true
appState?: true
files?: true
preview?: true
version?: true
collectionId?: true
@@ -1988,6 +1993,7 @@ export namespace Prisma {
name?: true
elements?: true
appState?: true
files?: true
preview?: true
version?: true
collectionId?: true
@@ -2087,6 +2093,7 @@ export namespace Prisma {
name: string
elements: string
appState: string
files: string
preview: string | null
version: number
collectionId: string | null
@@ -2118,6 +2125,7 @@ export namespace Prisma {
name?: boolean
elements?: boolean
appState?: boolean
files?: boolean
preview?: boolean
version?: boolean
collectionId?: boolean
@@ -2131,6 +2139,7 @@ export namespace Prisma {
name?: boolean
elements?: boolean
appState?: boolean
files?: boolean
preview?: boolean
version?: boolean
collectionId?: boolean
@@ -2144,6 +2153,7 @@ export namespace Prisma {
name?: boolean
elements?: boolean
appState?: boolean
files?: boolean
preview?: boolean
version?: boolean
collectionId?: boolean
@@ -2168,6 +2178,7 @@ export namespace Prisma {
name: string
elements: string
appState: string
files: string
preview: string | null
version: number
collectionId: string | null
@@ -2571,6 +2582,7 @@ export namespace Prisma {
readonly name: FieldRef<"Drawing", 'String'>
readonly elements: FieldRef<"Drawing", 'String'>
readonly appState: FieldRef<"Drawing", 'String'>
readonly files: FieldRef<"Drawing", 'String'>
readonly preview: FieldRef<"Drawing", 'String'>
readonly version: FieldRef<"Drawing", 'Int'>
readonly collectionId: FieldRef<"Drawing", 'String'>
@@ -2947,6 +2959,7 @@ export namespace Prisma {
name: 'name',
elements: 'elements',
appState: 'appState',
files: 'files',
preview: 'preview',
version: 'version',
collectionId: 'collectionId',
@@ -3067,6 +3080,7 @@ export namespace Prisma {
name?: StringFilter<"Drawing"> | string
elements?: StringFilter<"Drawing"> | string
appState?: StringFilter<"Drawing"> | string
files?: StringFilter<"Drawing"> | string
preview?: StringNullableFilter<"Drawing"> | string | null
version?: IntFilter<"Drawing"> | number
collectionId?: StringNullableFilter<"Drawing"> | string | null
@@ -3080,6 +3094,7 @@ export namespace Prisma {
name?: SortOrder
elements?: SortOrder
appState?: SortOrder
files?: SortOrder
preview?: SortOrderInput | SortOrder
version?: SortOrder
collectionId?: SortOrderInput | SortOrder
@@ -3096,6 +3111,7 @@ export namespace Prisma {
name?: StringFilter<"Drawing"> | string
elements?: StringFilter<"Drawing"> | string
appState?: StringFilter<"Drawing"> | string
files?: StringFilter<"Drawing"> | string
preview?: StringNullableFilter<"Drawing"> | string | null
version?: IntFilter<"Drawing"> | number
collectionId?: StringNullableFilter<"Drawing"> | string | null
@@ -3109,6 +3125,7 @@ export namespace Prisma {
name?: SortOrder
elements?: SortOrder
appState?: SortOrder
files?: SortOrder
preview?: SortOrderInput | SortOrder
version?: SortOrder
collectionId?: SortOrderInput | SortOrder
@@ -3129,6 +3146,7 @@ export namespace Prisma {
name?: StringWithAggregatesFilter<"Drawing"> | string
elements?: StringWithAggregatesFilter<"Drawing"> | string
appState?: StringWithAggregatesFilter<"Drawing"> | string
files?: StringWithAggregatesFilter<"Drawing"> | string
preview?: StringNullableWithAggregatesFilter<"Drawing"> | string | null
version?: IntWithAggregatesFilter<"Drawing"> | number
collectionId?: StringNullableWithAggregatesFilter<"Drawing"> | string | null
@@ -3194,6 +3212,7 @@ export namespace Prisma {
name: string
elements: string
appState: string
files?: string
preview?: string | null
version?: number
createdAt?: Date | string
@@ -3206,6 +3225,7 @@ export namespace Prisma {
name: string
elements: string
appState: string
files?: string
preview?: string | null
version?: number
collectionId?: string | null
@@ -3218,6 +3238,7 @@ export namespace Prisma {
name?: StringFieldUpdateOperationsInput | string
elements?: StringFieldUpdateOperationsInput | string
appState?: StringFieldUpdateOperationsInput | string
files?: StringFieldUpdateOperationsInput | string
preview?: NullableStringFieldUpdateOperationsInput | string | null
version?: IntFieldUpdateOperationsInput | number
createdAt?: DateTimeFieldUpdateOperationsInput | Date | string
@@ -3230,6 +3251,7 @@ export namespace Prisma {
name?: StringFieldUpdateOperationsInput | string
elements?: StringFieldUpdateOperationsInput | string
appState?: StringFieldUpdateOperationsInput | string
files?: StringFieldUpdateOperationsInput | string
preview?: NullableStringFieldUpdateOperationsInput | string | null
version?: IntFieldUpdateOperationsInput | number
collectionId?: NullableStringFieldUpdateOperationsInput | string | null
@@ -3242,6 +3264,7 @@ export namespace Prisma {
name: string
elements: string
appState: string
files?: string
preview?: string | null
version?: number
collectionId?: string | null
@@ -3254,6 +3277,7 @@ export namespace Prisma {
name?: StringFieldUpdateOperationsInput | string
elements?: StringFieldUpdateOperationsInput | string
appState?: StringFieldUpdateOperationsInput | string
files?: StringFieldUpdateOperationsInput | string
preview?: NullableStringFieldUpdateOperationsInput | string | null
version?: IntFieldUpdateOperationsInput | number
createdAt?: DateTimeFieldUpdateOperationsInput | Date | string
@@ -3265,6 +3289,7 @@ export namespace Prisma {
name?: StringFieldUpdateOperationsInput | string
elements?: StringFieldUpdateOperationsInput | string
appState?: StringFieldUpdateOperationsInput | string
files?: StringFieldUpdateOperationsInput | string
preview?: NullableStringFieldUpdateOperationsInput | string | null
version?: IntFieldUpdateOperationsInput | number
collectionId?: NullableStringFieldUpdateOperationsInput | string | null
@@ -3399,6 +3424,7 @@ export namespace Prisma {
name?: SortOrder
elements?: SortOrder
appState?: SortOrder
files?: SortOrder
preview?: SortOrder
version?: SortOrder
collectionId?: SortOrder
@@ -3415,6 +3441,7 @@ export namespace Prisma {
name?: SortOrder
elements?: SortOrder
appState?: SortOrder
files?: SortOrder
preview?: SortOrder
version?: SortOrder
collectionId?: SortOrder
@@ -3427,6 +3454,7 @@ export namespace Prisma {
name?: SortOrder
elements?: SortOrder
appState?: SortOrder
files?: SortOrder
preview?: SortOrder
version?: SortOrder
collectionId?: SortOrder
@@ -3690,6 +3718,7 @@ export namespace Prisma {
name: string
elements: string
appState: string
files?: string
preview?: string | null
version?: number
createdAt?: Date | string
@@ -3701,6 +3730,7 @@ export namespace Prisma {
name: string
elements: string
appState: string
files?: string
preview?: string | null
version?: number
createdAt?: Date | string
@@ -3740,6 +3770,7 @@ export namespace Prisma {
name?: StringFilter<"Drawing"> | string
elements?: StringFilter<"Drawing"> | string
appState?: StringFilter<"Drawing"> | string
files?: StringFilter<"Drawing"> | string
preview?: StringNullableFilter<"Drawing"> | string | null
version?: IntFilter<"Drawing"> | number
collectionId?: StringNullableFilter<"Drawing"> | string | null
@@ -3796,6 +3827,7 @@ export namespace Prisma {
name: string
elements: string
appState: string
files?: string
preview?: string | null
version?: number
createdAt?: Date | string
@@ -3807,6 +3839,7 @@ export namespace Prisma {
name?: StringFieldUpdateOperationsInput | string
elements?: StringFieldUpdateOperationsInput | string
appState?: StringFieldUpdateOperationsInput | string
files?: StringFieldUpdateOperationsInput | string
preview?: NullableStringFieldUpdateOperationsInput | string | null
version?: IntFieldUpdateOperationsInput | number
createdAt?: DateTimeFieldUpdateOperationsInput | Date | string
@@ -3818,6 +3851,7 @@ export namespace Prisma {
name?: StringFieldUpdateOperationsInput | string
elements?: StringFieldUpdateOperationsInput | string
appState?: StringFieldUpdateOperationsInput | string
files?: StringFieldUpdateOperationsInput | string
preview?: NullableStringFieldUpdateOperationsInput | string | null
version?: IntFieldUpdateOperationsInput | number
createdAt?: DateTimeFieldUpdateOperationsInput | Date | string
@@ -3829,6 +3863,7 @@ export namespace Prisma {
name?: StringFieldUpdateOperationsInput | string
elements?: StringFieldUpdateOperationsInput | string
appState?: StringFieldUpdateOperationsInput | string
files?: StringFieldUpdateOperationsInput | string
preview?: NullableStringFieldUpdateOperationsInput | string | null
version?: IntFieldUpdateOperationsInput | number
createdAt?: DateTimeFieldUpdateOperationsInput | Date | string
+4 -3
View File
@@ -100,6 +100,7 @@ exports.Prisma.DrawingScalarFieldEnum = {
name: 'name',
elements: 'elements',
appState: 'appState',
files: 'files',
preview: 'preview',
version: 'version',
collectionId: 'collectionId',
@@ -169,8 +170,8 @@ const config = {
}
}
},
"inlineSchema": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\ngenerator client {\n provider = \"prisma-client-js\"\n output = \"../src/generated/client\"\n}\n\ndatasource db {\n provider = \"sqlite\"\n url = env(\"DATABASE_URL\")\n}\n\nmodel Collection {\n id String @id @default(uuid())\n name String\n drawings Drawing[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Drawing {\n id String @id @default(uuid())\n name String\n elements String // Stored as JSON string\n appState String // Stored as JSON string\n preview String? // SVG string for thumbnail\n version Int @default(1)\n collectionId String?\n collection Collection? @relation(fields: [collectionId], references: [id])\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n",
"inlineSchemaHash": "67e1a3789d22e31866fa8b498914744bb15a8743c766f6c9cb36263d6b7740a9",
"inlineSchema": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\ngenerator client {\n provider = \"prisma-client-js\"\n output = \"../src/generated/client\"\n}\n\ndatasource db {\n provider = \"sqlite\"\n url = env(\"DATABASE_URL\")\n}\n\nmodel Collection {\n id String @id @default(uuid())\n name String\n drawings Drawing[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Drawing {\n id String @id @default(uuid())\n name String\n elements String // Stored as JSON string\n appState String // Stored as JSON string\n files String @default(\"{}\") // Stored as JSON string\n preview String? // SVG string for thumbnail\n version Int @default(1)\n collectionId String?\n collection Collection? @relation(fields: [collectionId], references: [id])\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n",
"inlineSchemaHash": "e43b17bb99e7f864b5a0f2c54951015f0a3d998329d0577afda58e7c0dee4919",
"copyEngine": true
}
@@ -191,7 +192,7 @@ if (!fs.existsSync(path.join(__dirname, 'schema.prisma'))) {
config.isBundled = true
}
config.runtimeDataModel = JSON.parse("{\"models\":{\"Collection\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"uuid(4)\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"drawings\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Drawing\",\"relationName\":\"CollectionToDrawing\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Drawing\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"uuid(4)\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"elements\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"appState\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"preview\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"version\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":1,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"collectionId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"collection\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Collection\",\"relationName\":\"CollectionToDrawing\",\"relationFromFields\":[\"collectionId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false}},\"enums\":{},\"types\":{}}")
config.runtimeDataModel = JSON.parse("{\"models\":{\"Collection\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"uuid(4)\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"drawings\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Drawing\",\"relationName\":\"CollectionToDrawing\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Drawing\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"uuid(4)\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"elements\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"appState\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"files\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":\"{}\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"preview\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"version\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":1,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"collectionId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"collection\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Collection\",\"relationName\":\"CollectionToDrawing\",\"relationFromFields\":[\"collectionId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false}},\"enums\":{},\"types\":{}}")
defineDmmfProperty(exports.Prisma, config.runtimeDataModel)
config.engineWasm = undefined
+1 -1
View File
@@ -1,5 +1,5 @@
{
"name": "prisma-client-3ebeea41bd8603a2c294a840f7d22c864ae7fc82298676ca177ef806525c6187",
"name": "prisma-client-0eff54f2002515791cbb1f1a5b1632637c7e46544d107e5ff89b7092d9540808",
"main": "index.js",
"types": "index.d.ts",
"browser": "index-browser.js",
@@ -24,6 +24,7 @@ model Drawing {
name String
elements String // Stored as JSON string
appState String // Stored as JSON string
files String @default("{}") // Stored as JSON string
preview String? // SVG string for thumbnail
version Int @default(1)
collectionId String?
+1
View File
@@ -131,6 +131,7 @@ exports.Prisma.DrawingScalarFieldEnum = {
name: 'name',
elements: 'elements',
appState: 'appState',
files: 'files',
preview: 'preview',
version: 'version',
collectionId: 'collectionId',
+11 -2
View File
@@ -135,6 +135,7 @@ app.get("/drawings", async (req, res) => {
...d,
elements: JSON.parse(d.elements),
appState: JSON.parse(d.appState),
files: JSON.parse(d.files || "{}"),
}));
res.json(parsedDrawings);
@@ -172,6 +173,7 @@ app.get("/drawings/:id", async (req, res) => {
...drawing,
elements: JSON.parse(drawing.elements),
appState: JSON.parse(drawing.appState),
files: JSON.parse(drawing.files || "{}"),
});
} catch (error) {
res.status(500).json({ error: "Failed to fetch drawing" });
@@ -181,7 +183,7 @@ app.get("/drawings/:id", async (req, res) => {
// POST /drawings
app.post("/drawings", async (req, res) => {
try {
const { name, elements, appState, collectionId, preview } = req.body;
const { name, elements, appState, collectionId, preview, files } = req.body;
const newDrawing = await prisma.drawing.create({
data: {
@@ -190,6 +192,7 @@ app.post("/drawings", async (req, res) => {
appState: JSON.stringify(appState || {}),
collectionId: collectionId || null,
preview: preview || null,
files: JSON.stringify(files || {}),
},
});
@@ -197,6 +200,7 @@ app.post("/drawings", async (req, res) => {
...newDrawing,
elements: JSON.parse(newDrawing.elements),
appState: JSON.parse(newDrawing.appState),
files: JSON.parse(newDrawing.files || "{}"),
});
} catch (error) {
res.status(500).json({ error: "Failed to create drawing" });
@@ -207,7 +211,7 @@ app.post("/drawings", async (req, res) => {
app.put("/drawings/:id", async (req, res) => {
try {
const { id } = req.params;
const { name, elements, appState, collectionId, preview } = req.body;
const { name, elements, appState, collectionId, preview, files } = req.body;
console.log("[API] Updating drawing", {
id,
@@ -215,6 +219,7 @@ app.put("/drawings/:id", async (req, res) => {
elementCount:
elements && Array.isArray(elements) ? elements.length : undefined,
hasAppState: appState !== undefined,
hasFiles: files !== undefined,
hasPreview: preview !== undefined,
});
@@ -225,6 +230,7 @@ app.put("/drawings/:id", async (req, res) => {
if (name !== undefined) data.name = name;
if (elements !== undefined) data.elements = JSON.stringify(elements);
if (appState !== undefined) data.appState = JSON.stringify(appState);
if (files !== undefined) data.files = JSON.stringify(files);
if (collectionId !== undefined) data.collectionId = collectionId;
if (preview !== undefined) data.preview = preview;
@@ -249,6 +255,7 @@ app.put("/drawings/:id", async (req, res) => {
...updatedDrawing,
elements: JSON.parse(updatedDrawing.elements),
appState: JSON.parse(updatedDrawing.appState),
files: JSON.parse(updatedDrawing.files || "{}"),
});
} catch (error) {
res.status(500).json({ error: "Failed to update drawing" });
@@ -281,6 +288,7 @@ app.post("/drawings/:id/duplicate", async (req, res) => {
name: `${original.name} (Copy)`,
elements: original.elements,
appState: original.appState,
files: original.files,
collectionId: original.collectionId,
version: 1,
},
@@ -290,6 +298,7 @@ app.post("/drawings/:id/duplicate", async (req, res) => {
...newDrawing,
elements: JSON.parse(newDrawing.elements),
appState: JSON.parse(newDrawing.appState),
files: JSON.parse(newDrawing.files || "{}"),
});
} catch (error) {
res.status(500).json({ error: "Failed to duplicate drawing" });
+14 -7
View File
@@ -1,7 +1,7 @@
import React, { useCallback, useEffect, useState, useRef } from 'react';
import { useParams, useNavigate } from 'react-router-dom';
import { ArrowLeft } from 'lucide-react';
import { Excalidraw, convertToExcalidrawElements, exportToSvg } from '@excalidraw/excalidraw';
import { Excalidraw, exportToSvg } from '@excalidraw/excalidraw';
import '@excalidraw/excalidraw/index.css';
import debounce from 'lodash/debounce';
import throttle from 'lodash/throttle';
@@ -235,6 +235,7 @@ export const Editor: React.FC = () => {
gridSize: null,
collaborators: new Map(),
},
files: {},
scrollToContent: true,
}), []);
@@ -269,6 +270,7 @@ export const Editor: React.FC = () => {
await api.updateDrawing(id, {
elements: persistableElements,
appState: persistableAppState,
files: latestFilesRef.current || {},
});
console.log("[Editor] Save complete", { drawingId: id });
@@ -362,7 +364,7 @@ export const Editor: React.FC = () => {
hasHydratedInitialScene.current = false;
elementVersionMap.current.clear();
latestElementsRef.current = [];
latestFilesRef.current = null;
latestFilesRef.current = {};
excalidrawAPI.current = null;
setIsReady(false);
setIsSceneLoading(true);
@@ -378,9 +380,11 @@ export const Editor: React.FC = () => {
const data = await api.getDrawing(id);
setDrawingName(data.name);
const elements = convertToExcalidrawElements(data.elements || []);
// Use elements directly without converting - they're already normalized during import
const elements = data.elements || [];
const files = data.files || {};
latestElementsRef.current = elements;
latestFilesRef.current = null;
latestFilesRef.current = files;
elements.forEach((el: any) => {
recordElementVersion(el);
@@ -397,11 +401,14 @@ export const Editor: React.FC = () => {
setInitialData({
elements,
appState: hydratedAppState,
files,
scrollToContent: true,
});
} catch (err) {
console.error('Failed to load drawing', err);
toast.error("Failed to load drawing");
latestElementsRef.current = [];
latestFilesRef.current = {};
setInitialData(buildEmptyScene());
} finally {
setIsSceneLoading(false);
@@ -422,7 +429,7 @@ export const Editor: React.FC = () => {
if (excalidrawAPI.current && saveDataRef.current && savePreviewRef.current) {
const elements = excalidrawAPI.current.getSceneElementsIncludingDeleted();
const appState = excalidrawAPI.current.getAppState();
const files = excalidrawAPI.current.getFiles() || null;
const files = excalidrawAPI.current.getFiles() || {};
latestElementsRef.current = elements;
latestFilesRef.current = files;
// Call save immediately, bypassing debounce
@@ -494,11 +501,11 @@ export const Editor: React.FC = () => {
debouncedSave(allElements, appState);
// Trigger Slow Preview Gen
const files = excalidrawAPI.current?.getFiles() || null;
const files = excalidrawAPI.current?.getFiles() || {};
latestFilesRef.current = files;
console.log("[Editor] Queueing preview save", {
drawingId: id,
fileCount: files ? Object.keys(files).length : 0,
fileCount: Object.keys(files).length,
});
debouncedSavePreview(allElements, appState, files);
}, [debouncedSave, debouncedSavePreview, broadcastChanges]);
+1
View File
@@ -3,6 +3,7 @@ export interface Drawing {
name: string;
elements: any[];
appState: any;
files: Record<string, any> | null;
collectionId: string | null;
updatedAt: number;
createdAt: number;
+4 -3
View File
@@ -29,7 +29,8 @@ export const importDrawings = async (
throw new Error(`Invalid file structure: ${file.name}`);
}
// Generate Preview
// Use raw elements directly from the file - no normalization needed
// Generate Preview with raw elements
const svg = await exportToSvg({
elements: data.elements,
appState: {
@@ -37,11 +38,11 @@ export const importDrawings = async (
exportBackground: true,
viewBackgroundColor: data.appState.viewBackgroundColor || "#ffffff",
},
files: data.files || null,
files: data.files || {},
exportPadding: 10,
});
// Prepare payload
// Prepare payload with raw elements
const payload = {
name: file.name.replace(/\.(json|excalidraw)$/, ""),
elements: data.elements,