Trash ID Update Collections

This commit is contained in:
Zimeng Xiong
2025-11-21 19:31:59 -08:00
parent 4e8beae0ee
commit 0878b5e87f
16 changed files with 169 additions and 101 deletions
BIN
View File
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,2 @@
-- AlterTable
ALTER TABLE "Drawing" ADD COLUMN "preview" TEXT;
@@ -1,3 +1,3 @@
# Please do not edit this file manually
# It should be added in your version-control system (e.g., Git)
# It should be added in your version-control system (i.e. Git)
provider = "sqlite"
+1
View File
@@ -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])
+5 -5
View File
@@ -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
@@ -131,6 +131,7 @@ exports.Prisma.DrawingScalarFieldEnum = {
name: 'name',
elements: 'elements',
appState: 'appState',
preview: 'preview',
version: 'version',
collectionId: 'collectionId',
createdAt: 'createdAt',
+93 -58
View File
@@ -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> | 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<XOR<CollectionUpdateToOneWithWhereWithoutDrawingsInput, CollectionUpdateWithoutDrawingsInput>, 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
+5 -5
View File
@@ -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
+1 -1
View File
@@ -1,5 +1,5 @@
{
"name": "prisma-client-83e2d97f7605e3fc4b9dd655248fc3537e09c5d5de3bea41e3f804da1ddcbc6e",
"name": "prisma-client-3ebeea41bd8603a2c294a840f7d22c864ae7fc82298676ca177ef806525c6187",
"main": "index.js",
"types": "index.d.ts",
"browser": "index-browser.js",
@@ -24,6 +24,7 @@ model Drawing {
name String
elements String // Stored as JSON string
appState String // Stored as JSON string
preview String? // SVG string for thumbnail
version Int @default(1)
collectionId String?
collection Collection? @relation(fields: [collectionId], references: [id])
+1
View File
@@ -131,6 +131,7 @@ exports.Prisma.DrawingScalarFieldEnum = {
name: 'name',
elements: 'elements',
appState: 'appState',
preview: 'preview',
version: 'version',
collectionId: 'collectionId',
createdAt: 'createdAt',
+31 -4
View File
@@ -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}`);
});
+3 -13
View File
@@ -292,24 +292,14 @@ export const Sidebar: React.FC<SidebarProps> = ({
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"
)}
+8 -12
View File
@@ -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 (
<Layout
collections={collections}
collections={visibleCollections}
selectedCollectionId={selectedCollectionId}
onSelectCollection={setSelectedCollectionId}
onCreateCollection={handleCreateCollection}
+15 -1
View File
@@ -1,7 +1,7 @@
import React, { useCallback, useEffect, useState, useRef } from 'react';
import { useParams, useNavigate } from 'react-router-dom';
import { ArrowLeft } from 'lucide-react';
import { Excalidraw, convertToExcalidrawElements } from '@excalidraw/excalidraw';
import { Excalidraw, convertToExcalidrawElements, exportToSvg } from '@excalidraw/excalidraw';
import '@excalidraw/excalidraw/index.css';
import debounce from 'lodash/debounce';
import { Toaster, toast } from 'sonner';
@@ -38,9 +38,23 @@ export const Editor: React.FC = () => {
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);