diff --git a/backend/dev.db b/backend/dev.db deleted file mode 100644 index ea34ea1..0000000 Binary files a/backend/dev.db and /dev/null differ diff --git a/backend/prisma/dev.db b/backend/prisma/dev.db index e69de29..4fc93a6 100644 Binary files a/backend/prisma/dev.db and b/backend/prisma/dev.db differ diff --git a/backend/prisma/migrations/20251122032308_add_preview/migration.sql b/backend/prisma/migrations/20251122032308_add_preview/migration.sql new file mode 100644 index 0000000..90ee242 --- /dev/null +++ b/backend/prisma/migrations/20251122032308_add_preview/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Drawing" ADD COLUMN "preview" TEXT; diff --git a/backend/prisma/migrations/migration_lock.toml b/backend/prisma/migrations/migration_lock.toml index 2a5a444..e5e5c47 100644 --- a/backend/prisma/migrations/migration_lock.toml +++ b/backend/prisma/migrations/migration_lock.toml @@ -1,3 +1,3 @@ # Please do not edit this file manually -# It should be added in your version-control system (e.g., Git) -provider = "sqlite" +# It should be added in your version-control system (i.e. Git) +provider = "sqlite" \ No newline at end of file diff --git a/backend/prisma/schema.prisma b/backend/prisma/schema.prisma index 5ba7370..59bccb0 100644 --- a/backend/prisma/schema.prisma +++ b/backend/prisma/schema.prisma @@ -24,6 +24,7 @@ model Drawing { name String elements String // Stored as JSON string appState String // Stored as JSON string + preview String? // SVG string for thumbnail version Int @default(1) collectionId String? collection Collection? @relation(fields: [collectionId], references: [id]) diff --git a/backend/src/generated/client/edge.js b/backend/src/generated/client/edge.js index e2231c9..71a296e 100644 --- a/backend/src/generated/client/edge.js +++ b/backend/src/generated/client/edge.js @@ -99,6 +99,7 @@ exports.Prisma.DrawingScalarFieldEnum = { name: 'name', elements: 'elements', appState: 'appState', + preview: 'preview', version: 'version', collectionId: 'collectionId', createdAt: 'createdAt', @@ -149,7 +150,7 @@ const config = { "isCustomOutput": true }, "relativeEnvPaths": { - "rootEnvPath": "../../../.env", + "rootEnvPath": null, "schemaEnvPath": "../../../.env" }, "relativePath": "../../../prisma", @@ -159,7 +160,6 @@ const config = { "db" ], "activeProvider": "sqlite", - "postinstall": false, "inlineDatasources": { "db": { "url": { @@ -168,13 +168,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 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": "481a5f143c00eb5cbae4281008c7bf10c3e13066bfd88f97f47bd22f56672c24", + "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", "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\":\"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\":\"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 diff --git a/backend/src/generated/client/index-browser.js b/backend/src/generated/client/index-browser.js index 144ab05..83e61fc 100644 --- a/backend/src/generated/client/index-browser.js +++ b/backend/src/generated/client/index-browser.js @@ -131,6 +131,7 @@ exports.Prisma.DrawingScalarFieldEnum = { name: 'name', elements: 'elements', appState: 'appState', + preview: 'preview', version: 'version', collectionId: 'collectionId', createdAt: 'createdAt', diff --git a/backend/src/generated/client/index.d.ts b/backend/src/generated/client/index.d.ts index 6733910..b446dc8 100644 --- a/backend/src/generated/client/index.d.ts +++ b/backend/src/generated/client/index.d.ts @@ -1918,6 +1918,7 @@ export namespace Prisma { name: string | null elements: string | null appState: string | null + preview: string | null version: number | null collectionId: string | null createdAt: Date | null @@ -1929,6 +1930,7 @@ export namespace Prisma { name: string | null elements: string | null appState: string | null + preview: string | null version: number | null collectionId: string | null createdAt: Date | null @@ -1940,6 +1942,7 @@ export namespace Prisma { name: number elements: number appState: number + preview: number version: number collectionId: number createdAt: number @@ -1961,6 +1964,7 @@ export namespace Prisma { name?: true elements?: true appState?: true + preview?: true version?: true collectionId?: true createdAt?: true @@ -1972,6 +1976,7 @@ export namespace Prisma { name?: true elements?: true appState?: true + preview?: true version?: true collectionId?: true createdAt?: true @@ -1983,6 +1988,7 @@ export namespace Prisma { name?: true elements?: true appState?: true + preview?: true version?: true collectionId?: true createdAt?: true @@ -2081,6 +2087,7 @@ export namespace Prisma { name: string elements: string appState: string + preview: string | null version: number collectionId: string | null createdAt: Date @@ -2111,6 +2118,7 @@ export namespace Prisma { name?: boolean elements?: boolean appState?: boolean + preview?: boolean version?: boolean collectionId?: boolean createdAt?: boolean @@ -2123,6 +2131,7 @@ export namespace Prisma { name?: boolean elements?: boolean appState?: boolean + preview?: boolean version?: boolean collectionId?: boolean createdAt?: boolean @@ -2135,6 +2144,7 @@ export namespace Prisma { name?: boolean elements?: boolean appState?: boolean + preview?: boolean version?: boolean collectionId?: boolean createdAt?: boolean @@ -2158,6 +2168,7 @@ export namespace Prisma { name: string elements: string appState: string + preview: string | null version: number collectionId: string | null createdAt: Date @@ -2560,6 +2571,7 @@ export namespace Prisma { readonly name: FieldRef<"Drawing", 'String'> readonly elements: FieldRef<"Drawing", 'String'> readonly appState: FieldRef<"Drawing", 'String'> + readonly preview: FieldRef<"Drawing", 'String'> readonly version: FieldRef<"Drawing", 'Int'> readonly collectionId: FieldRef<"Drawing", 'String'> readonly createdAt: FieldRef<"Drawing", 'DateTime'> @@ -2935,6 +2947,7 @@ export namespace Prisma { name: 'name', elements: 'elements', appState: 'appState', + preview: 'preview', version: 'version', collectionId: 'collectionId', createdAt: 'createdAt', @@ -3054,6 +3067,7 @@ export namespace Prisma { name?: StringFilter<"Drawing"> | string elements?: StringFilter<"Drawing"> | string appState?: StringFilter<"Drawing"> | string + preview?: StringNullableFilter<"Drawing"> | string | null version?: IntFilter<"Drawing"> | number collectionId?: StringNullableFilter<"Drawing"> | string | null createdAt?: DateTimeFilter<"Drawing"> | Date | string @@ -3066,6 +3080,7 @@ export namespace Prisma { name?: SortOrder elements?: SortOrder appState?: SortOrder + preview?: SortOrderInput | SortOrder version?: SortOrder collectionId?: SortOrderInput | SortOrder createdAt?: SortOrder @@ -3081,6 +3096,7 @@ export namespace Prisma { name?: StringFilter<"Drawing"> | string elements?: StringFilter<"Drawing"> | string appState?: StringFilter<"Drawing"> | string + preview?: StringNullableFilter<"Drawing"> | string | null version?: IntFilter<"Drawing"> | number collectionId?: StringNullableFilter<"Drawing"> | string | null createdAt?: DateTimeFilter<"Drawing"> | Date | string @@ -3093,6 +3109,7 @@ export namespace Prisma { name?: SortOrder elements?: SortOrder appState?: SortOrder + preview?: SortOrderInput | SortOrder version?: SortOrder collectionId?: SortOrderInput | SortOrder createdAt?: SortOrder @@ -3112,6 +3129,7 @@ export namespace Prisma { name?: StringWithAggregatesFilter<"Drawing"> | string elements?: StringWithAggregatesFilter<"Drawing"> | string appState?: StringWithAggregatesFilter<"Drawing"> | string + preview?: StringNullableWithAggregatesFilter<"Drawing"> | string | null version?: IntWithAggregatesFilter<"Drawing"> | number collectionId?: StringNullableWithAggregatesFilter<"Drawing"> | string | null createdAt?: DateTimeWithAggregatesFilter<"Drawing"> | Date | string @@ -3176,6 +3194,7 @@ export namespace Prisma { name: string elements: string appState: string + preview?: string | null version?: number createdAt?: Date | string updatedAt?: Date | string @@ -3187,6 +3206,7 @@ export namespace Prisma { name: string elements: string appState: string + preview?: string | null version?: number collectionId?: string | null createdAt?: Date | string @@ -3198,6 +3218,7 @@ export namespace Prisma { name?: StringFieldUpdateOperationsInput | string elements?: StringFieldUpdateOperationsInput | string appState?: StringFieldUpdateOperationsInput | string + preview?: NullableStringFieldUpdateOperationsInput | string | null version?: IntFieldUpdateOperationsInput | number createdAt?: DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string @@ -3209,6 +3230,7 @@ export namespace Prisma { name?: StringFieldUpdateOperationsInput | string elements?: StringFieldUpdateOperationsInput | string appState?: StringFieldUpdateOperationsInput | string + preview?: NullableStringFieldUpdateOperationsInput | string | null version?: IntFieldUpdateOperationsInput | number collectionId?: NullableStringFieldUpdateOperationsInput | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string @@ -3220,6 +3242,7 @@ export namespace Prisma { name: string elements: string appState: string + preview?: string | null version?: number collectionId?: string | null createdAt?: Date | string @@ -3231,6 +3254,7 @@ export namespace Prisma { name?: StringFieldUpdateOperationsInput | string elements?: StringFieldUpdateOperationsInput | string appState?: StringFieldUpdateOperationsInput | string + preview?: NullableStringFieldUpdateOperationsInput | string | null version?: IntFieldUpdateOperationsInput | number createdAt?: DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string @@ -3241,6 +3265,7 @@ export namespace Prisma { name?: StringFieldUpdateOperationsInput | string elements?: StringFieldUpdateOperationsInput | string appState?: StringFieldUpdateOperationsInput | string + preview?: NullableStringFieldUpdateOperationsInput | string | null version?: IntFieldUpdateOperationsInput | number collectionId?: NullableStringFieldUpdateOperationsInput | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string @@ -3334,17 +3359,6 @@ export namespace Prisma { _max?: NestedDateTimeFilter<$PrismaModel> } - export type IntFilter<$PrismaModel = never> = { - equals?: number | IntFieldRefInput<$PrismaModel> - in?: number[] - notIn?: number[] - lt?: number | IntFieldRefInput<$PrismaModel> - lte?: number | IntFieldRefInput<$PrismaModel> - gt?: number | IntFieldRefInput<$PrismaModel> - gte?: number | IntFieldRefInput<$PrismaModel> - not?: NestedIntFilter<$PrismaModel> | number - } - export type StringNullableFilter<$PrismaModel = never> = { equals?: string | StringFieldRefInput<$PrismaModel> | null in?: string[] | null @@ -3359,6 +3373,17 @@ export namespace Prisma { not?: NestedStringNullableFilter<$PrismaModel> | string | null } + export type IntFilter<$PrismaModel = never> = { + equals?: number | IntFieldRefInput<$PrismaModel> + in?: number[] + notIn?: number[] + lt?: number | IntFieldRefInput<$PrismaModel> + lte?: number | IntFieldRefInput<$PrismaModel> + gt?: number | IntFieldRefInput<$PrismaModel> + gte?: number | IntFieldRefInput<$PrismaModel> + not?: NestedIntFilter<$PrismaModel> | number + } + export type CollectionNullableRelationFilter = { is?: CollectionWhereInput | null isNot?: CollectionWhereInput | null @@ -3374,6 +3399,7 @@ export namespace Prisma { name?: SortOrder elements?: SortOrder appState?: SortOrder + preview?: SortOrder version?: SortOrder collectionId?: SortOrder createdAt?: SortOrder @@ -3389,6 +3415,7 @@ export namespace Prisma { name?: SortOrder elements?: SortOrder appState?: SortOrder + preview?: SortOrder version?: SortOrder collectionId?: SortOrder createdAt?: SortOrder @@ -3400,6 +3427,7 @@ export namespace Prisma { name?: SortOrder elements?: SortOrder appState?: SortOrder + preview?: SortOrder version?: SortOrder collectionId?: SortOrder createdAt?: SortOrder @@ -3410,22 +3438,6 @@ export namespace Prisma { version?: SortOrder } - export type IntWithAggregatesFilter<$PrismaModel = never> = { - equals?: number | IntFieldRefInput<$PrismaModel> - in?: number[] - notIn?: number[] - lt?: number | IntFieldRefInput<$PrismaModel> - lte?: number | IntFieldRefInput<$PrismaModel> - gt?: number | IntFieldRefInput<$PrismaModel> - gte?: number | IntFieldRefInput<$PrismaModel> - not?: NestedIntWithAggregatesFilter<$PrismaModel> | number - _count?: NestedIntFilter<$PrismaModel> - _avg?: NestedFloatFilter<$PrismaModel> - _sum?: NestedIntFilter<$PrismaModel> - _min?: NestedIntFilter<$PrismaModel> - _max?: NestedIntFilter<$PrismaModel> - } - export type StringNullableWithAggregatesFilter<$PrismaModel = never> = { equals?: string | StringFieldRefInput<$PrismaModel> | null in?: string[] | null @@ -3443,6 +3455,22 @@ export namespace Prisma { _max?: NestedStringNullableFilter<$PrismaModel> } + export type IntWithAggregatesFilter<$PrismaModel = never> = { + equals?: number | IntFieldRefInput<$PrismaModel> + in?: number[] + notIn?: number[] + lt?: number | IntFieldRefInput<$PrismaModel> + lte?: number | IntFieldRefInput<$PrismaModel> + gt?: number | IntFieldRefInput<$PrismaModel> + gte?: number | IntFieldRefInput<$PrismaModel> + not?: NestedIntWithAggregatesFilter<$PrismaModel> | number + _count?: NestedIntFilter<$PrismaModel> + _avg?: NestedFloatFilter<$PrismaModel> + _sum?: NestedIntFilter<$PrismaModel> + _min?: NestedIntFilter<$PrismaModel> + _max?: NestedIntFilter<$PrismaModel> + } + export type DrawingCreateNestedManyWithoutCollectionInput = { create?: XOR | DrawingCreateWithoutCollectionInput[] | DrawingUncheckedCreateWithoutCollectionInput[] connectOrCreate?: DrawingCreateOrConnectWithoutCollectionInput | DrawingCreateOrConnectWithoutCollectionInput[] @@ -3499,6 +3527,10 @@ export namespace Prisma { connect?: CollectionWhereUniqueInput } + export type NullableStringFieldUpdateOperationsInput = { + set?: string | null + } + export type IntFieldUpdateOperationsInput = { set?: number increment?: number @@ -3517,10 +3549,6 @@ export namespace Prisma { update?: XOR, CollectionUncheckedUpdateWithoutDrawingsInput> } - export type NullableStringFieldUpdateOperationsInput = { - set?: string | null - } - export type NestedStringFilter<$PrismaModel = never> = { equals?: string | StringFieldRefInput<$PrismaModel> in?: string[] @@ -3602,33 +3630,6 @@ export namespace Prisma { not?: NestedStringNullableFilter<$PrismaModel> | string | null } - export type NestedIntWithAggregatesFilter<$PrismaModel = never> = { - equals?: number | IntFieldRefInput<$PrismaModel> - in?: number[] - notIn?: number[] - lt?: number | IntFieldRefInput<$PrismaModel> - lte?: number | IntFieldRefInput<$PrismaModel> - gt?: number | IntFieldRefInput<$PrismaModel> - gte?: number | IntFieldRefInput<$PrismaModel> - not?: NestedIntWithAggregatesFilter<$PrismaModel> | number - _count?: NestedIntFilter<$PrismaModel> - _avg?: NestedFloatFilter<$PrismaModel> - _sum?: NestedIntFilter<$PrismaModel> - _min?: NestedIntFilter<$PrismaModel> - _max?: NestedIntFilter<$PrismaModel> - } - - export type NestedFloatFilter<$PrismaModel = never> = { - equals?: number | FloatFieldRefInput<$PrismaModel> - in?: number[] - notIn?: number[] - lt?: number | FloatFieldRefInput<$PrismaModel> - lte?: number | FloatFieldRefInput<$PrismaModel> - gt?: number | FloatFieldRefInput<$PrismaModel> - gte?: number | FloatFieldRefInput<$PrismaModel> - not?: NestedFloatFilter<$PrismaModel> | number - } - export type NestedStringNullableWithAggregatesFilter<$PrismaModel = never> = { equals?: string | StringFieldRefInput<$PrismaModel> | null in?: string[] | null @@ -3657,11 +3658,39 @@ export namespace Prisma { not?: NestedIntNullableFilter<$PrismaModel> | number | null } + export type NestedIntWithAggregatesFilter<$PrismaModel = never> = { + equals?: number | IntFieldRefInput<$PrismaModel> + in?: number[] + notIn?: number[] + lt?: number | IntFieldRefInput<$PrismaModel> + lte?: number | IntFieldRefInput<$PrismaModel> + gt?: number | IntFieldRefInput<$PrismaModel> + gte?: number | IntFieldRefInput<$PrismaModel> + not?: NestedIntWithAggregatesFilter<$PrismaModel> | number + _count?: NestedIntFilter<$PrismaModel> + _avg?: NestedFloatFilter<$PrismaModel> + _sum?: NestedIntFilter<$PrismaModel> + _min?: NestedIntFilter<$PrismaModel> + _max?: NestedIntFilter<$PrismaModel> + } + + export type NestedFloatFilter<$PrismaModel = never> = { + equals?: number | FloatFieldRefInput<$PrismaModel> + in?: number[] + notIn?: number[] + lt?: number | FloatFieldRefInput<$PrismaModel> + lte?: number | FloatFieldRefInput<$PrismaModel> + gt?: number | FloatFieldRefInput<$PrismaModel> + gte?: number | FloatFieldRefInput<$PrismaModel> + not?: NestedFloatFilter<$PrismaModel> | number + } + export type DrawingCreateWithoutCollectionInput = { id?: string name: string elements: string appState: string + preview?: string | null version?: number createdAt?: Date | string updatedAt?: Date | string @@ -3672,6 +3701,7 @@ export namespace Prisma { name: string elements: string appState: string + preview?: string | null version?: number createdAt?: Date | string updatedAt?: Date | string @@ -3710,6 +3740,7 @@ export namespace Prisma { name?: StringFilter<"Drawing"> | string elements?: StringFilter<"Drawing"> | string appState?: StringFilter<"Drawing"> | string + preview?: StringNullableFilter<"Drawing"> | string | null version?: IntFilter<"Drawing"> | number collectionId?: StringNullableFilter<"Drawing"> | string | null createdAt?: DateTimeFilter<"Drawing"> | Date | string @@ -3765,6 +3796,7 @@ export namespace Prisma { name: string elements: string appState: string + preview?: string | null version?: number createdAt?: Date | string updatedAt?: Date | string @@ -3775,6 +3807,7 @@ export namespace Prisma { name?: StringFieldUpdateOperationsInput | string elements?: StringFieldUpdateOperationsInput | string appState?: StringFieldUpdateOperationsInput | string + preview?: NullableStringFieldUpdateOperationsInput | string | null version?: IntFieldUpdateOperationsInput | number createdAt?: DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string @@ -3785,6 +3818,7 @@ export namespace Prisma { name?: StringFieldUpdateOperationsInput | string elements?: StringFieldUpdateOperationsInput | string appState?: StringFieldUpdateOperationsInput | string + preview?: NullableStringFieldUpdateOperationsInput | string | null version?: IntFieldUpdateOperationsInput | number createdAt?: DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string @@ -3795,6 +3829,7 @@ export namespace Prisma { name?: StringFieldUpdateOperationsInput | string elements?: StringFieldUpdateOperationsInput | string appState?: StringFieldUpdateOperationsInput | string + preview?: NullableStringFieldUpdateOperationsInput | string | null version?: IntFieldUpdateOperationsInput | number createdAt?: DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string diff --git a/backend/src/generated/client/index.js b/backend/src/generated/client/index.js index a73eeca..b9fb90f 100644 --- a/backend/src/generated/client/index.js +++ b/backend/src/generated/client/index.js @@ -100,6 +100,7 @@ exports.Prisma.DrawingScalarFieldEnum = { name: 'name', elements: 'elements', appState: 'appState', + preview: 'preview', version: 'version', collectionId: 'collectionId', createdAt: 'createdAt', @@ -150,7 +151,7 @@ const config = { "isCustomOutput": true }, "relativeEnvPaths": { - "rootEnvPath": "../../../.env", + "rootEnvPath": null, "schemaEnvPath": "../../../.env" }, "relativePath": "../../../prisma", @@ -160,7 +161,6 @@ const config = { "db" ], "activeProvider": "sqlite", - "postinstall": false, "inlineDatasources": { "db": { "url": { @@ -169,8 +169,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 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": "481a5f143c00eb5cbae4281008c7bf10c3e13066bfd88f97f47bd22f56672c24", + "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", "copyEngine": true } @@ -191,7 +191,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\":\"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\":\"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 diff --git a/backend/src/generated/client/package.json b/backend/src/generated/client/package.json index 09e11ab..8252243 100644 --- a/backend/src/generated/client/package.json +++ b/backend/src/generated/client/package.json @@ -1,5 +1,5 @@ { - "name": "prisma-client-83e2d97f7605e3fc4b9dd655248fc3537e09c5d5de3bea41e3f804da1ddcbc6e", + "name": "prisma-client-3ebeea41bd8603a2c294a840f7d22c864ae7fc82298676ca177ef806525c6187", "main": "index.js", "types": "index.d.ts", "browser": "index-browser.js", diff --git a/backend/src/generated/client/schema.prisma b/backend/src/generated/client/schema.prisma index 5ba7370..59bccb0 100644 --- a/backend/src/generated/client/schema.prisma +++ b/backend/src/generated/client/schema.prisma @@ -24,6 +24,7 @@ model Drawing { name String elements String // Stored as JSON string appState String // Stored as JSON string + preview String? // SVG string for thumbnail version Int @default(1) collectionId String? collection Collection? @relation(fields: [collectionId], references: [id]) diff --git a/backend/src/generated/client/wasm.js b/backend/src/generated/client/wasm.js index 144ab05..83e61fc 100644 --- a/backend/src/generated/client/wasm.js +++ b/backend/src/generated/client/wasm.js @@ -131,6 +131,7 @@ exports.Prisma.DrawingScalarFieldEnum = { name: 'name', elements: 'elements', appState: 'appState', + preview: 'preview', version: 'version', collectionId: 'collectionId', createdAt: 'createdAt', diff --git a/backend/src/index.ts b/backend/src/index.ts index 9ca8840..90022b9 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -8,7 +8,8 @@ import { PrismaClient } from "./generated/client"; dotenv.config(); // Ensure DATABASE_URL is absolute to avoid relative path issues with generated client -const dbPath = path.resolve(__dirname, "../dev.db"); +// Point to the same DB file as Prisma CLI (relative to schema.prisma, usually in prisma/ folder) +const dbPath = path.resolve(__dirname, "../prisma/dev.db"); process.env.DATABASE_URL = `file:${dbPath}`; console.log("Resolved DATABASE_URL:", process.env.DATABASE_URL); @@ -35,6 +36,12 @@ app.get("/drawings", async (req, res) => { where.collectionId = null; } else if (collectionId) { where.collectionId = String(collectionId); + } else { + // Default: Exclude trash, but include unorganized (null) + where.OR = [ + { collectionId: { not: "trash" } }, + { collectionId: null }, + ]; } const drawings = await prisma.drawing.findMany({ @@ -79,7 +86,7 @@ app.get("/drawings/:id", async (req, res) => { // POST /drawings app.post("/drawings", async (req, res) => { try { - const { name, elements, appState, collectionId } = req.body; + const { name, elements, appState, collectionId, preview } = req.body; const newDrawing = await prisma.drawing.create({ data: { @@ -87,6 +94,7 @@ app.post("/drawings", async (req, res) => { elements: JSON.stringify(elements || []), appState: JSON.stringify(appState || {}), collectionId: collectionId || null, + preview: preview || null, }, }); @@ -104,7 +112,7 @@ app.post("/drawings", async (req, res) => { app.put("/drawings/:id", async (req, res) => { try { const { id } = req.params; - const { name, elements, appState, collectionId } = req.body; + const { name, elements, appState, collectionId, preview } = req.body; const data: any = { version: { increment: 1 }, @@ -114,6 +122,7 @@ app.put("/drawings/:id", async (req, res) => { if (elements !== undefined) data.elements = JSON.stringify(elements); if (appState !== undefined) data.appState = JSON.stringify(appState); if (collectionId !== undefined) data.collectionId = collectionId; + if (preview !== undefined) data.preview = preview; const updatedDrawing = await prisma.drawing.update({ where: { id }, @@ -236,6 +245,24 @@ app.delete("/collections/:id", async (req, res) => { } }); -app.listen(PORT, () => { +// Ensure Trash collection exists +const ensureTrashCollection = async () => { + try { + const trash = await prisma.collection.findUnique({ + where: { id: "trash" }, + }); + if (!trash) { + await prisma.collection.create({ + data: { id: "trash", name: "Trash" }, + }); + console.log("Created Trash collection"); + } + } catch (error) { + console.error("Failed to ensure Trash collection:", error); + } +}; + +app.listen(PORT, async () => { + await ensureTrashCollection(); console.log(`Server running on port ${PORT}`); }); diff --git a/frontend/src/components/Sidebar.tsx b/frontend/src/components/Sidebar.tsx index b2ed213..55f257f 100644 --- a/frontend/src/components/Sidebar.tsx +++ b/frontend/src/components/Sidebar.tsx @@ -292,24 +292,14 @@ export const Sidebar: React.FC = ({ onDrop={(e) => { e.preventDefault(); setIsTrashDragOver(false); - const trashId = collections.find(c => c.name === 'Trash')?.id; - if (trashId) { - onDrop?.(e, trashId); - } else { - onDrop?.(e, 'TRASH'); - } + onDrop?.(e, 'trash'); }} onClick={() => { - const trashCollection = collections.find(c => c.name === 'Trash'); - if (trashCollection) { - navigate(`/collections?id=${trashCollection.id}`); - } else { - onCreateCollection('Trash'); - } + navigate('/collections?id=trash'); }} className={clsx( "w-full flex items-center gap-3 px-3 py-2 text-sm font-bold rounded-xl transition-all duration-200 border-2 border-black dark:border-neutral-700 shadow-[2px_2px_0px_0px_rgba(0,0,0,1)] dark:shadow-[2px_2px_0px_0px_rgba(255,255,255,0.2)] mb-4", - collections.find(c => c.name === 'Trash')?.id === selectedCollectionId || isTrashDragOver + selectedCollectionId === 'trash' || isTrashDragOver ? "bg-rose-50 dark:bg-rose-900/30 text-rose-900 dark:text-rose-300 -translate-y-0.5" : "bg-white dark:bg-neutral-900 text-slate-900 dark:text-neutral-200 hover:bg-rose-50 dark:hover:bg-rose-900/30 hover:text-rose-900 dark:hover:text-rose-300 hover:shadow-[4px_4px_0px_0px_rgba(0,0,0,1)] dark:hover:shadow-[4px_4px_0px_0px_rgba(255,255,255,0.2)] hover:-translate-y-0.5" )} diff --git a/frontend/src/pages/Dashboard.tsx b/frontend/src/pages/Dashboard.tsx index 294ec6b..46083ef 100644 --- a/frontend/src/pages/Dashboard.tsx +++ b/frontend/src/pages/Dashboard.tsx @@ -267,15 +267,7 @@ export const Dashboard: React.FC = () => { }; // Trash Helpers - const trashCollection = collections.find(c => c.name === 'Trash'); - const isTrashView = selectedCollectionId === trashCollection?.id && trashCollection !== undefined; - - const getOrCreateTrashId = async () => { - if (trashCollection) return trashCollection.id; - const newCol = await api.createCollection('Trash'); - setCollections(prev => [...prev, newCol]); - return newCol.id; - }; + const isTrashView = selectedCollectionId === 'trash'; const handleCreateDrawing = async () => { if (isTrashView) return; @@ -300,7 +292,7 @@ export const Dashboard: React.FC = () => { setDrawingToDelete(id); } else { // Move to Trash -> No Confirm - const trashId = await getOrCreateTrashId(); + const trashId = 'trash'; // Optimistic Remove from current view setDrawings(prev => prev.filter(d => d.id !== id)); @@ -373,7 +365,7 @@ export const Dashboard: React.FC = () => { }; const executeBulkMoveToTrash = async () => { - const trashId = await getOrCreateTrashId(); + const trashId = 'trash'; const ids = Array.from(selectedIds); setDrawings(prev => prev.filter(d => !selectedIds.has(d.id))); @@ -489,6 +481,7 @@ export const Dashboard: React.FC = () => { const viewTitle = React.useMemo(() => { if (selectedCollectionId === undefined) return "All Drawings"; if (selectedCollectionId === null) return "Unorganized"; + if (selectedCollectionId === 'trash') return "Trash"; const collection = collections.find(c => c.id === selectedCollectionId); return collection ? collection.name : "Collection"; }, [selectedCollectionId, collections]); @@ -589,9 +582,12 @@ export const Dashboard: React.FC = () => { setDrawings(prev => prev.map(d => d.id === id ? { ...d, preview } : d)); }; + // Filter out trash from the collections list passed to sidebar + const visibleCollections = React.useMemo(() => collections.filter(c => c.id !== 'trash'), [collections]); + return ( { viewBackgroundColor: appState.viewBackgroundColor, gridSize: appState.gridSize, }; + + // Generate preview + const files = excalidrawAPI.current?.getFiles() || null; + const svg = await exportToSvg({ + elements, + appState: { + ...appState, + exportBackground: true, + viewBackgroundColor: appState.viewBackgroundColor || '#ffffff', + }, + files, + }); + const preview = svg.outerHTML; await api.updateDrawing(id, { elements, appState: persistableAppState, + preview, }); } catch (err) { console.error('Failed to save drawing', err);