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 name String
elements String // Stored as JSON string elements String // Stored as JSON string
appState String // Stored as JSON string appState String // Stored as JSON string
files String @default("{}") // Stored as JSON string
preview String? // SVG string for thumbnail preview String? // SVG string for thumbnail
version Int @default(1) version Int @default(1)
collectionId String? collectionId String?
+4 -3
View File
@@ -99,6 +99,7 @@ exports.Prisma.DrawingScalarFieldEnum = {
name: 'name', name: 'name',
elements: 'elements', elements: 'elements',
appState: 'appState', appState: 'appState',
files: 'files',
preview: 'preview', preview: 'preview',
version: 'version', version: 'version',
collectionId: 'collectionId', 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", "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": "67e1a3789d22e31866fa8b498914744bb15a8743c766f6c9cb36263d6b7740a9", "inlineSchemaHash": "e43b17bb99e7f864b5a0f2c54951015f0a3d998329d0577afda58e7c0dee4919",
"copyEngine": true "copyEngine": true
} }
config.dirname = '/' 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) defineDmmfProperty(exports.Prisma, config.runtimeDataModel)
config.engineWasm = undefined config.engineWasm = undefined
@@ -131,6 +131,7 @@ exports.Prisma.DrawingScalarFieldEnum = {
name: 'name', name: 'name',
elements: 'elements', elements: 'elements',
appState: 'appState', appState: 'appState',
files: 'files',
preview: 'preview', preview: 'preview',
version: 'version', version: 'version',
collectionId: 'collectionId', collectionId: 'collectionId',
+35
View File
@@ -1918,6 +1918,7 @@ export namespace Prisma {
name: string | null name: string | null
elements: string | null elements: string | null
appState: string | null appState: string | null
files: string | null
preview: string | null preview: string | null
version: number | null version: number | null
collectionId: string | null collectionId: string | null
@@ -1930,6 +1931,7 @@ export namespace Prisma {
name: string | null name: string | null
elements: string | null elements: string | null
appState: string | null appState: string | null
files: string | null
preview: string | null preview: string | null
version: number | null version: number | null
collectionId: string | null collectionId: string | null
@@ -1942,6 +1944,7 @@ export namespace Prisma {
name: number name: number
elements: number elements: number
appState: number appState: number
files: number
preview: number preview: number
version: number version: number
collectionId: number collectionId: number
@@ -1964,6 +1967,7 @@ export namespace Prisma {
name?: true name?: true
elements?: true elements?: true
appState?: true appState?: true
files?: true
preview?: true preview?: true
version?: true version?: true
collectionId?: true collectionId?: true
@@ -1976,6 +1980,7 @@ export namespace Prisma {
name?: true name?: true
elements?: true elements?: true
appState?: true appState?: true
files?: true
preview?: true preview?: true
version?: true version?: true
collectionId?: true collectionId?: true
@@ -1988,6 +1993,7 @@ export namespace Prisma {
name?: true name?: true
elements?: true elements?: true
appState?: true appState?: true
files?: true
preview?: true preview?: true
version?: true version?: true
collectionId?: true collectionId?: true
@@ -2087,6 +2093,7 @@ export namespace Prisma {
name: string name: string
elements: string elements: string
appState: string appState: string
files: string
preview: string | null preview: string | null
version: number version: number
collectionId: string | null collectionId: string | null
@@ -2118,6 +2125,7 @@ export namespace Prisma {
name?: boolean name?: boolean
elements?: boolean elements?: boolean
appState?: boolean appState?: boolean
files?: boolean
preview?: boolean preview?: boolean
version?: boolean version?: boolean
collectionId?: boolean collectionId?: boolean
@@ -2131,6 +2139,7 @@ export namespace Prisma {
name?: boolean name?: boolean
elements?: boolean elements?: boolean
appState?: boolean appState?: boolean
files?: boolean
preview?: boolean preview?: boolean
version?: boolean version?: boolean
collectionId?: boolean collectionId?: boolean
@@ -2144,6 +2153,7 @@ export namespace Prisma {
name?: boolean name?: boolean
elements?: boolean elements?: boolean
appState?: boolean appState?: boolean
files?: boolean
preview?: boolean preview?: boolean
version?: boolean version?: boolean
collectionId?: boolean collectionId?: boolean
@@ -2168,6 +2178,7 @@ export namespace Prisma {
name: string name: string
elements: string elements: string
appState: string appState: string
files: string
preview: string | null preview: string | null
version: number version: number
collectionId: string | null collectionId: string | null
@@ -2571,6 +2582,7 @@ export namespace Prisma {
readonly name: FieldRef<"Drawing", 'String'> readonly name: FieldRef<"Drawing", 'String'>
readonly elements: FieldRef<"Drawing", 'String'> readonly elements: FieldRef<"Drawing", 'String'>
readonly appState: FieldRef<"Drawing", 'String'> readonly appState: FieldRef<"Drawing", 'String'>
readonly files: FieldRef<"Drawing", 'String'>
readonly preview: FieldRef<"Drawing", 'String'> readonly preview: FieldRef<"Drawing", 'String'>
readonly version: FieldRef<"Drawing", 'Int'> readonly version: FieldRef<"Drawing", 'Int'>
readonly collectionId: FieldRef<"Drawing", 'String'> readonly collectionId: FieldRef<"Drawing", 'String'>
@@ -2947,6 +2959,7 @@ export namespace Prisma {
name: 'name', name: 'name',
elements: 'elements', elements: 'elements',
appState: 'appState', appState: 'appState',
files: 'files',
preview: 'preview', preview: 'preview',
version: 'version', version: 'version',
collectionId: 'collectionId', collectionId: 'collectionId',
@@ -3067,6 +3080,7 @@ export namespace Prisma {
name?: StringFilter<"Drawing"> | string name?: StringFilter<"Drawing"> | string
elements?: StringFilter<"Drawing"> | string elements?: StringFilter<"Drawing"> | string
appState?: StringFilter<"Drawing"> | string appState?: StringFilter<"Drawing"> | string
files?: StringFilter<"Drawing"> | string
preview?: StringNullableFilter<"Drawing"> | string | null preview?: StringNullableFilter<"Drawing"> | string | null
version?: IntFilter<"Drawing"> | number version?: IntFilter<"Drawing"> | number
collectionId?: StringNullableFilter<"Drawing"> | string | null collectionId?: StringNullableFilter<"Drawing"> | string | null
@@ -3080,6 +3094,7 @@ export namespace Prisma {
name?: SortOrder name?: SortOrder
elements?: SortOrder elements?: SortOrder
appState?: SortOrder appState?: SortOrder
files?: SortOrder
preview?: SortOrderInput | SortOrder preview?: SortOrderInput | SortOrder
version?: SortOrder version?: SortOrder
collectionId?: SortOrderInput | SortOrder collectionId?: SortOrderInput | SortOrder
@@ -3096,6 +3111,7 @@ export namespace Prisma {
name?: StringFilter<"Drawing"> | string name?: StringFilter<"Drawing"> | string
elements?: StringFilter<"Drawing"> | string elements?: StringFilter<"Drawing"> | string
appState?: StringFilter<"Drawing"> | string appState?: StringFilter<"Drawing"> | string
files?: StringFilter<"Drawing"> | string
preview?: StringNullableFilter<"Drawing"> | string | null preview?: StringNullableFilter<"Drawing"> | string | null
version?: IntFilter<"Drawing"> | number version?: IntFilter<"Drawing"> | number
collectionId?: StringNullableFilter<"Drawing"> | string | null collectionId?: StringNullableFilter<"Drawing"> | string | null
@@ -3109,6 +3125,7 @@ export namespace Prisma {
name?: SortOrder name?: SortOrder
elements?: SortOrder elements?: SortOrder
appState?: SortOrder appState?: SortOrder
files?: SortOrder
preview?: SortOrderInput | SortOrder preview?: SortOrderInput | SortOrder
version?: SortOrder version?: SortOrder
collectionId?: SortOrderInput | SortOrder collectionId?: SortOrderInput | SortOrder
@@ -3129,6 +3146,7 @@ export namespace Prisma {
name?: StringWithAggregatesFilter<"Drawing"> | string name?: StringWithAggregatesFilter<"Drawing"> | string
elements?: StringWithAggregatesFilter<"Drawing"> | string elements?: StringWithAggregatesFilter<"Drawing"> | string
appState?: StringWithAggregatesFilter<"Drawing"> | string appState?: StringWithAggregatesFilter<"Drawing"> | string
files?: StringWithAggregatesFilter<"Drawing"> | string
preview?: StringNullableWithAggregatesFilter<"Drawing"> | string | null preview?: StringNullableWithAggregatesFilter<"Drawing"> | string | null
version?: IntWithAggregatesFilter<"Drawing"> | number version?: IntWithAggregatesFilter<"Drawing"> | number
collectionId?: StringNullableWithAggregatesFilter<"Drawing"> | string | null collectionId?: StringNullableWithAggregatesFilter<"Drawing"> | string | null
@@ -3194,6 +3212,7 @@ export namespace Prisma {
name: string name: string
elements: string elements: string
appState: string appState: string
files?: string
preview?: string | null preview?: string | null
version?: number version?: number
createdAt?: Date | string createdAt?: Date | string
@@ -3206,6 +3225,7 @@ export namespace Prisma {
name: string name: string
elements: string elements: string
appState: string appState: string
files?: string
preview?: string | null preview?: string | null
version?: number version?: number
collectionId?: string | null collectionId?: string | null
@@ -3218,6 +3238,7 @@ export namespace Prisma {
name?: StringFieldUpdateOperationsInput | string name?: StringFieldUpdateOperationsInput | string
elements?: StringFieldUpdateOperationsInput | string elements?: StringFieldUpdateOperationsInput | string
appState?: StringFieldUpdateOperationsInput | string appState?: StringFieldUpdateOperationsInput | string
files?: StringFieldUpdateOperationsInput | string
preview?: NullableStringFieldUpdateOperationsInput | string | null preview?: NullableStringFieldUpdateOperationsInput | string | null
version?: IntFieldUpdateOperationsInput | number version?: IntFieldUpdateOperationsInput | number
createdAt?: DateTimeFieldUpdateOperationsInput | Date | string createdAt?: DateTimeFieldUpdateOperationsInput | Date | string
@@ -3230,6 +3251,7 @@ export namespace Prisma {
name?: StringFieldUpdateOperationsInput | string name?: StringFieldUpdateOperationsInput | string
elements?: StringFieldUpdateOperationsInput | string elements?: StringFieldUpdateOperationsInput | string
appState?: StringFieldUpdateOperationsInput | string appState?: StringFieldUpdateOperationsInput | string
files?: StringFieldUpdateOperationsInput | string
preview?: NullableStringFieldUpdateOperationsInput | string | null preview?: NullableStringFieldUpdateOperationsInput | string | null
version?: IntFieldUpdateOperationsInput | number version?: IntFieldUpdateOperationsInput | number
collectionId?: NullableStringFieldUpdateOperationsInput | string | null collectionId?: NullableStringFieldUpdateOperationsInput | string | null
@@ -3242,6 +3264,7 @@ export namespace Prisma {
name: string name: string
elements: string elements: string
appState: string appState: string
files?: string
preview?: string | null preview?: string | null
version?: number version?: number
collectionId?: string | null collectionId?: string | null
@@ -3254,6 +3277,7 @@ export namespace Prisma {
name?: StringFieldUpdateOperationsInput | string name?: StringFieldUpdateOperationsInput | string
elements?: StringFieldUpdateOperationsInput | string elements?: StringFieldUpdateOperationsInput | string
appState?: StringFieldUpdateOperationsInput | string appState?: StringFieldUpdateOperationsInput | string
files?: StringFieldUpdateOperationsInput | string
preview?: NullableStringFieldUpdateOperationsInput | string | null preview?: NullableStringFieldUpdateOperationsInput | string | null
version?: IntFieldUpdateOperationsInput | number version?: IntFieldUpdateOperationsInput | number
createdAt?: DateTimeFieldUpdateOperationsInput | Date | string createdAt?: DateTimeFieldUpdateOperationsInput | Date | string
@@ -3265,6 +3289,7 @@ export namespace Prisma {
name?: StringFieldUpdateOperationsInput | string name?: StringFieldUpdateOperationsInput | string
elements?: StringFieldUpdateOperationsInput | string elements?: StringFieldUpdateOperationsInput | string
appState?: StringFieldUpdateOperationsInput | string appState?: StringFieldUpdateOperationsInput | string
files?: StringFieldUpdateOperationsInput | string
preview?: NullableStringFieldUpdateOperationsInput | string | null preview?: NullableStringFieldUpdateOperationsInput | string | null
version?: IntFieldUpdateOperationsInput | number version?: IntFieldUpdateOperationsInput | number
collectionId?: NullableStringFieldUpdateOperationsInput | string | null collectionId?: NullableStringFieldUpdateOperationsInput | string | null
@@ -3399,6 +3424,7 @@ export namespace Prisma {
name?: SortOrder name?: SortOrder
elements?: SortOrder elements?: SortOrder
appState?: SortOrder appState?: SortOrder
files?: SortOrder
preview?: SortOrder preview?: SortOrder
version?: SortOrder version?: SortOrder
collectionId?: SortOrder collectionId?: SortOrder
@@ -3415,6 +3441,7 @@ export namespace Prisma {
name?: SortOrder name?: SortOrder
elements?: SortOrder elements?: SortOrder
appState?: SortOrder appState?: SortOrder
files?: SortOrder
preview?: SortOrder preview?: SortOrder
version?: SortOrder version?: SortOrder
collectionId?: SortOrder collectionId?: SortOrder
@@ -3427,6 +3454,7 @@ export namespace Prisma {
name?: SortOrder name?: SortOrder
elements?: SortOrder elements?: SortOrder
appState?: SortOrder appState?: SortOrder
files?: SortOrder
preview?: SortOrder preview?: SortOrder
version?: SortOrder version?: SortOrder
collectionId?: SortOrder collectionId?: SortOrder
@@ -3690,6 +3718,7 @@ export namespace Prisma {
name: string name: string
elements: string elements: string
appState: string appState: string
files?: string
preview?: string | null preview?: string | null
version?: number version?: number
createdAt?: Date | string createdAt?: Date | string
@@ -3701,6 +3730,7 @@ export namespace Prisma {
name: string name: string
elements: string elements: string
appState: string appState: string
files?: string
preview?: string | null preview?: string | null
version?: number version?: number
createdAt?: Date | string createdAt?: Date | string
@@ -3740,6 +3770,7 @@ export namespace Prisma {
name?: StringFilter<"Drawing"> | string name?: StringFilter<"Drawing"> | string
elements?: StringFilter<"Drawing"> | string elements?: StringFilter<"Drawing"> | string
appState?: StringFilter<"Drawing"> | string appState?: StringFilter<"Drawing"> | string
files?: StringFilter<"Drawing"> | string
preview?: StringNullableFilter<"Drawing"> | string | null preview?: StringNullableFilter<"Drawing"> | string | null
version?: IntFilter<"Drawing"> | number version?: IntFilter<"Drawing"> | number
collectionId?: StringNullableFilter<"Drawing"> | string | null collectionId?: StringNullableFilter<"Drawing"> | string | null
@@ -3796,6 +3827,7 @@ export namespace Prisma {
name: string name: string
elements: string elements: string
appState: string appState: string
files?: string
preview?: string | null preview?: string | null
version?: number version?: number
createdAt?: Date | string createdAt?: Date | string
@@ -3807,6 +3839,7 @@ export namespace Prisma {
name?: StringFieldUpdateOperationsInput | string name?: StringFieldUpdateOperationsInput | string
elements?: StringFieldUpdateOperationsInput | string elements?: StringFieldUpdateOperationsInput | string
appState?: StringFieldUpdateOperationsInput | string appState?: StringFieldUpdateOperationsInput | string
files?: StringFieldUpdateOperationsInput | string
preview?: NullableStringFieldUpdateOperationsInput | string | null preview?: NullableStringFieldUpdateOperationsInput | string | null
version?: IntFieldUpdateOperationsInput | number version?: IntFieldUpdateOperationsInput | number
createdAt?: DateTimeFieldUpdateOperationsInput | Date | string createdAt?: DateTimeFieldUpdateOperationsInput | Date | string
@@ -3818,6 +3851,7 @@ export namespace Prisma {
name?: StringFieldUpdateOperationsInput | string name?: StringFieldUpdateOperationsInput | string
elements?: StringFieldUpdateOperationsInput | string elements?: StringFieldUpdateOperationsInput | string
appState?: StringFieldUpdateOperationsInput | string appState?: StringFieldUpdateOperationsInput | string
files?: StringFieldUpdateOperationsInput | string
preview?: NullableStringFieldUpdateOperationsInput | string | null preview?: NullableStringFieldUpdateOperationsInput | string | null
version?: IntFieldUpdateOperationsInput | number version?: IntFieldUpdateOperationsInput | number
createdAt?: DateTimeFieldUpdateOperationsInput | Date | string createdAt?: DateTimeFieldUpdateOperationsInput | Date | string
@@ -3829,6 +3863,7 @@ export namespace Prisma {
name?: StringFieldUpdateOperationsInput | string name?: StringFieldUpdateOperationsInput | string
elements?: StringFieldUpdateOperationsInput | string elements?: StringFieldUpdateOperationsInput | string
appState?: StringFieldUpdateOperationsInput | string appState?: StringFieldUpdateOperationsInput | string
files?: StringFieldUpdateOperationsInput | string
preview?: NullableStringFieldUpdateOperationsInput | string | null preview?: NullableStringFieldUpdateOperationsInput | string | null
version?: IntFieldUpdateOperationsInput | number version?: IntFieldUpdateOperationsInput | number
createdAt?: DateTimeFieldUpdateOperationsInput | Date | string createdAt?: DateTimeFieldUpdateOperationsInput | Date | string
+4 -3
View File
@@ -100,6 +100,7 @@ exports.Prisma.DrawingScalarFieldEnum = {
name: 'name', name: 'name',
elements: 'elements', elements: 'elements',
appState: 'appState', appState: 'appState',
files: 'files',
preview: 'preview', preview: 'preview',
version: 'version', version: 'version',
collectionId: 'collectionId', 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", "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": "67e1a3789d22e31866fa8b498914744bb15a8743c766f6c9cb36263d6b7740a9", "inlineSchemaHash": "e43b17bb99e7f864b5a0f2c54951015f0a3d998329d0577afda58e7c0dee4919",
"copyEngine": true "copyEngine": true
} }
@@ -191,7 +192,7 @@ if (!fs.existsSync(path.join(__dirname, 'schema.prisma'))) {
config.isBundled = true 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) defineDmmfProperty(exports.Prisma, config.runtimeDataModel)
config.engineWasm = undefined config.engineWasm = undefined
+1 -1
View File
@@ -1,5 +1,5 @@
{ {
"name": "prisma-client-3ebeea41bd8603a2c294a840f7d22c864ae7fc82298676ca177ef806525c6187", "name": "prisma-client-0eff54f2002515791cbb1f1a5b1632637c7e46544d107e5ff89b7092d9540808",
"main": "index.js", "main": "index.js",
"types": "index.d.ts", "types": "index.d.ts",
"browser": "index-browser.js", "browser": "index-browser.js",
@@ -24,6 +24,7 @@ model Drawing {
name String name String
elements String // Stored as JSON string elements String // Stored as JSON string
appState String // Stored as JSON string appState String // Stored as JSON string
files String @default("{}") // Stored as JSON string
preview String? // SVG string for thumbnail preview String? // SVG string for thumbnail
version Int @default(1) version Int @default(1)
collectionId String? collectionId String?
+1
View File
@@ -131,6 +131,7 @@ exports.Prisma.DrawingScalarFieldEnum = {
name: 'name', name: 'name',
elements: 'elements', elements: 'elements',
appState: 'appState', appState: 'appState',
files: 'files',
preview: 'preview', preview: 'preview',
version: 'version', version: 'version',
collectionId: 'collectionId', collectionId: 'collectionId',
+11 -2
View File
@@ -135,6 +135,7 @@ app.get("/drawings", async (req, res) => {
...d, ...d,
elements: JSON.parse(d.elements), elements: JSON.parse(d.elements),
appState: JSON.parse(d.appState), appState: JSON.parse(d.appState),
files: JSON.parse(d.files || "{}"),
})); }));
res.json(parsedDrawings); res.json(parsedDrawings);
@@ -172,6 +173,7 @@ app.get("/drawings/:id", async (req, res) => {
...drawing, ...drawing,
elements: JSON.parse(drawing.elements), elements: JSON.parse(drawing.elements),
appState: JSON.parse(drawing.appState), appState: JSON.parse(drawing.appState),
files: JSON.parse(drawing.files || "{}"),
}); });
} catch (error) { } catch (error) {
res.status(500).json({ error: "Failed to fetch drawing" }); res.status(500).json({ error: "Failed to fetch drawing" });
@@ -181,7 +183,7 @@ app.get("/drawings/:id", async (req, res) => {
// POST /drawings // POST /drawings
app.post("/drawings", async (req, res) => { app.post("/drawings", async (req, res) => {
try { try {
const { name, elements, appState, collectionId, preview } = req.body; const { name, elements, appState, collectionId, preview, files } = req.body;
const newDrawing = await prisma.drawing.create({ const newDrawing = await prisma.drawing.create({
data: { data: {
@@ -190,6 +192,7 @@ app.post("/drawings", async (req, res) => {
appState: JSON.stringify(appState || {}), appState: JSON.stringify(appState || {}),
collectionId: collectionId || null, collectionId: collectionId || null,
preview: preview || null, preview: preview || null,
files: JSON.stringify(files || {}),
}, },
}); });
@@ -197,6 +200,7 @@ app.post("/drawings", async (req, res) => {
...newDrawing, ...newDrawing,
elements: JSON.parse(newDrawing.elements), elements: JSON.parse(newDrawing.elements),
appState: JSON.parse(newDrawing.appState), appState: JSON.parse(newDrawing.appState),
files: JSON.parse(newDrawing.files || "{}"),
}); });
} catch (error) { } catch (error) {
res.status(500).json({ error: "Failed to create drawing" }); 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) => { app.put("/drawings/:id", async (req, res) => {
try { try {
const { id } = req.params; 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", { console.log("[API] Updating drawing", {
id, id,
@@ -215,6 +219,7 @@ app.put("/drawings/:id", async (req, res) => {
elementCount: elementCount:
elements && Array.isArray(elements) ? elements.length : undefined, elements && Array.isArray(elements) ? elements.length : undefined,
hasAppState: appState !== undefined, hasAppState: appState !== undefined,
hasFiles: files !== undefined,
hasPreview: preview !== undefined, hasPreview: preview !== undefined,
}); });
@@ -225,6 +230,7 @@ app.put("/drawings/:id", async (req, res) => {
if (name !== undefined) data.name = name; if (name !== undefined) data.name = name;
if (elements !== undefined) data.elements = JSON.stringify(elements); if (elements !== undefined) data.elements = JSON.stringify(elements);
if (appState !== undefined) data.appState = JSON.stringify(appState); if (appState !== undefined) data.appState = JSON.stringify(appState);
if (files !== undefined) data.files = JSON.stringify(files);
if (collectionId !== undefined) data.collectionId = collectionId; if (collectionId !== undefined) data.collectionId = collectionId;
if (preview !== undefined) data.preview = preview; if (preview !== undefined) data.preview = preview;
@@ -249,6 +255,7 @@ app.put("/drawings/:id", async (req, res) => {
...updatedDrawing, ...updatedDrawing,
elements: JSON.parse(updatedDrawing.elements), elements: JSON.parse(updatedDrawing.elements),
appState: JSON.parse(updatedDrawing.appState), appState: JSON.parse(updatedDrawing.appState),
files: JSON.parse(updatedDrawing.files || "{}"),
}); });
} catch (error) { } catch (error) {
res.status(500).json({ error: "Failed to update drawing" }); 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)`, name: `${original.name} (Copy)`,
elements: original.elements, elements: original.elements,
appState: original.appState, appState: original.appState,
files: original.files,
collectionId: original.collectionId, collectionId: original.collectionId,
version: 1, version: 1,
}, },
@@ -290,6 +298,7 @@ app.post("/drawings/:id/duplicate", async (req, res) => {
...newDrawing, ...newDrawing,
elements: JSON.parse(newDrawing.elements), elements: JSON.parse(newDrawing.elements),
appState: JSON.parse(newDrawing.appState), appState: JSON.parse(newDrawing.appState),
files: JSON.parse(newDrawing.files || "{}"),
}); });
} catch (error) { } catch (error) {
res.status(500).json({ error: "Failed to duplicate drawing" }); 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 React, { useCallback, useEffect, useState, useRef } from 'react';
import { useParams, useNavigate } from 'react-router-dom'; import { useParams, useNavigate } from 'react-router-dom';
import { ArrowLeft } from 'lucide-react'; import { ArrowLeft } from 'lucide-react';
import { Excalidraw, convertToExcalidrawElements, exportToSvg } from '@excalidraw/excalidraw'; import { Excalidraw, exportToSvg } from '@excalidraw/excalidraw';
import '@excalidraw/excalidraw/index.css'; import '@excalidraw/excalidraw/index.css';
import debounce from 'lodash/debounce'; import debounce from 'lodash/debounce';
import throttle from 'lodash/throttle'; import throttle from 'lodash/throttle';
@@ -235,6 +235,7 @@ export const Editor: React.FC = () => {
gridSize: null, gridSize: null,
collaborators: new Map(), collaborators: new Map(),
}, },
files: {},
scrollToContent: true, scrollToContent: true,
}), []); }), []);
@@ -269,6 +270,7 @@ export const Editor: React.FC = () => {
await api.updateDrawing(id, { await api.updateDrawing(id, {
elements: persistableElements, elements: persistableElements,
appState: persistableAppState, appState: persistableAppState,
files: latestFilesRef.current || {},
}); });
console.log("[Editor] Save complete", { drawingId: id }); console.log("[Editor] Save complete", { drawingId: id });
@@ -362,7 +364,7 @@ export const Editor: React.FC = () => {
hasHydratedInitialScene.current = false; hasHydratedInitialScene.current = false;
elementVersionMap.current.clear(); elementVersionMap.current.clear();
latestElementsRef.current = []; latestElementsRef.current = [];
latestFilesRef.current = null; latestFilesRef.current = {};
excalidrawAPI.current = null; excalidrawAPI.current = null;
setIsReady(false); setIsReady(false);
setIsSceneLoading(true); setIsSceneLoading(true);
@@ -378,9 +380,11 @@ export const Editor: React.FC = () => {
const data = await api.getDrawing(id); const data = await api.getDrawing(id);
setDrawingName(data.name); 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; latestElementsRef.current = elements;
latestFilesRef.current = null; latestFilesRef.current = files;
elements.forEach((el: any) => { elements.forEach((el: any) => {
recordElementVersion(el); recordElementVersion(el);
@@ -397,11 +401,14 @@ export const Editor: React.FC = () => {
setInitialData({ setInitialData({
elements, elements,
appState: hydratedAppState, appState: hydratedAppState,
files,
scrollToContent: true, scrollToContent: true,
}); });
} catch (err) { } catch (err) {
console.error('Failed to load drawing', err); console.error('Failed to load drawing', err);
toast.error("Failed to load drawing"); toast.error("Failed to load drawing");
latestElementsRef.current = [];
latestFilesRef.current = {};
setInitialData(buildEmptyScene()); setInitialData(buildEmptyScene());
} finally { } finally {
setIsSceneLoading(false); setIsSceneLoading(false);
@@ -422,7 +429,7 @@ export const Editor: React.FC = () => {
if (excalidrawAPI.current && saveDataRef.current && savePreviewRef.current) { if (excalidrawAPI.current && saveDataRef.current && savePreviewRef.current) {
const elements = excalidrawAPI.current.getSceneElementsIncludingDeleted(); const elements = excalidrawAPI.current.getSceneElementsIncludingDeleted();
const appState = excalidrawAPI.current.getAppState(); const appState = excalidrawAPI.current.getAppState();
const files = excalidrawAPI.current.getFiles() || null; const files = excalidrawAPI.current.getFiles() || {};
latestElementsRef.current = elements; latestElementsRef.current = elements;
latestFilesRef.current = files; latestFilesRef.current = files;
// Call save immediately, bypassing debounce // Call save immediately, bypassing debounce
@@ -494,11 +501,11 @@ export const Editor: React.FC = () => {
debouncedSave(allElements, appState); debouncedSave(allElements, appState);
// Trigger Slow Preview Gen // Trigger Slow Preview Gen
const files = excalidrawAPI.current?.getFiles() || null; const files = excalidrawAPI.current?.getFiles() || {};
latestFilesRef.current = files; latestFilesRef.current = files;
console.log("[Editor] Queueing preview save", { console.log("[Editor] Queueing preview save", {
drawingId: id, drawingId: id,
fileCount: files ? Object.keys(files).length : 0, fileCount: Object.keys(files).length,
}); });
debouncedSavePreview(allElements, appState, files); debouncedSavePreview(allElements, appState, files);
}, [debouncedSave, debouncedSavePreview, broadcastChanges]); }, [debouncedSave, debouncedSavePreview, broadcastChanges]);
+1
View File
@@ -3,6 +3,7 @@ export interface Drawing {
name: string; name: string;
elements: any[]; elements: any[];
appState: any; appState: any;
files: Record<string, any> | null;
collectionId: string | null; collectionId: string | null;
updatedAt: number; updatedAt: number;
createdAt: number; createdAt: number;
+4 -3
View File
@@ -29,7 +29,8 @@ export const importDrawings = async (
throw new Error(`Invalid file structure: ${file.name}`); 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({ const svg = await exportToSvg({
elements: data.elements, elements: data.elements,
appState: { appState: {
@@ -37,11 +38,11 @@ export const importDrawings = async (
exportBackground: true, exportBackground: true,
viewBackgroundColor: data.appState.viewBackgroundColor || "#ffffff", viewBackgroundColor: data.appState.viewBackgroundColor || "#ffffff",
}, },
files: data.files || null, files: data.files || {},
exportPadding: 10, exportPadding: 10,
}); });
// Prepare payload // Prepare payload with raw elements
const payload = { const payload = {
name: file.name.replace(/\.(json|excalidraw)$/, ""), name: file.name.replace(/\.(json|excalidraw)$/, ""),
elements: data.elements, elements: data.elements,