feat: prisma integration and initial queries for graphql
This commit is contained in:
		
							parent
							
								
									71ab64343f
								
							
						
					
					
						commit
						b02b730ac5
					
				
							
								
								
									
										162
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										162
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							|  | @ -11,6 +11,8 @@ | |||
|       "dependencies": { | ||||
|         "@graphql-yoga/node": "^2.1.0", | ||||
|         "@pothos/core": "^3.5.1", | ||||
|         "@pothos/plugin-prisma": "^3.4.0", | ||||
|         "@pothos/plugin-relay": "^3.10.0", | ||||
|         "@prisma/client": "^3.11.1", | ||||
|         "@tailwindcss/forms": "^0.4.0", | ||||
|         "@tailwindcss/typography": "^0.5.1", | ||||
|  | @ -2504,6 +2506,32 @@ | |||
|         "graphql": ">=15.1.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@pothos/plugin-prisma": { | ||||
|       "version": "3.4.0", | ||||
|       "resolved": "https://registry.npmjs.org/@pothos/plugin-prisma/-/plugin-prisma-3.4.0.tgz", | ||||
|       "integrity": "sha512-J0uiTNX9cDXzJ64N6Gd7EVUW90bxSr/NrijY41zc5VZqHv/l1JlWmwKJK5qF5CBULlqNIba/KDLZHvszMNAA8A==", | ||||
|       "dependencies": { | ||||
|         "@prisma/generator-helper": "^3.12.0" | ||||
|       }, | ||||
|       "bin": { | ||||
|         "prisma-pothos-types": "bin/generator.js" | ||||
|       }, | ||||
|       "peerDependencies": { | ||||
|         "@pothos/core": "*", | ||||
|         "@prisma/client": "*", | ||||
|         "graphql": ">=15.1.0", | ||||
|         "typescript": ">4.5.2" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@pothos/plugin-relay": { | ||||
|       "version": "3.10.0", | ||||
|       "resolved": "https://registry.npmjs.org/@pothos/plugin-relay/-/plugin-relay-3.10.0.tgz", | ||||
|       "integrity": "sha512-ZNkSYPhDKanMrd8aFD4nEUeMHoeD6wyejBsO1Ik/q8IRHRRPQzLsc/ignxGEl5j+hdu/SsTuhMNszV9Ef0JOJw==", | ||||
|       "peerDependencies": { | ||||
|         "@pothos/core": "*", | ||||
|         "graphql": ">=15.1.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@prisma/client": { | ||||
|       "version": "3.11.1", | ||||
|       "resolved": "https://registry.npmjs.org/@prisma/client/-/client-3.11.1.tgz", | ||||
|  | @ -2524,6 +2552,40 @@ | |||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@prisma/debug": { | ||||
|       "version": "3.12.0", | ||||
|       "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-3.12.0.tgz", | ||||
|       "integrity": "sha512-MFNsK8jzao3VX+cEP6+txABa3w8bU4gD0QpqTbGS3v3TW1c7TtHvhsmI7xTx9Cll7biuJdaRd3YwG2Fa/CHVmA==", | ||||
|       "dependencies": { | ||||
|         "@types/debug": "4.1.7", | ||||
|         "ms": "2.1.3", | ||||
|         "strip-ansi": "6.0.1" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@prisma/debug/node_modules/ansi-regex": { | ||||
|       "version": "5.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", | ||||
|       "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", | ||||
|       "engines": { | ||||
|         "node": ">=8" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@prisma/debug/node_modules/ms": { | ||||
|       "version": "2.1.3", | ||||
|       "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", | ||||
|       "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" | ||||
|     }, | ||||
|     "node_modules/@prisma/debug/node_modules/strip-ansi": { | ||||
|       "version": "6.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", | ||||
|       "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", | ||||
|       "dependencies": { | ||||
|         "ansi-regex": "^5.0.1" | ||||
|       }, | ||||
|       "engines": { | ||||
|         "node": ">=8" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@prisma/engines": { | ||||
|       "version": "3.11.1-1.1a2506facaf1a4727b7c26850735e88ec779dee9", | ||||
|       "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-3.11.1-1.1a2506facaf1a4727b7c26850735e88ec779dee9.tgz", | ||||
|  | @ -2535,6 +2597,17 @@ | |||
|       "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-3.11.1-1.1a2506facaf1a4727b7c26850735e88ec779dee9.tgz", | ||||
|       "integrity": "sha512-HkcsDniA4iNb/gi0iuyOJNAM7nD/LwQ0uJm15v360O5dee3TM4lWdSQiTYBMK6FF68ACUItmzSur7oYuUZ2zkQ==" | ||||
|     }, | ||||
|     "node_modules/@prisma/generator-helper": { | ||||
|       "version": "3.12.0", | ||||
|       "resolved": "https://registry.npmjs.org/@prisma/generator-helper/-/generator-helper-3.12.0.tgz", | ||||
|       "integrity": "sha512-wfEcSVUX0HH0A/CIrsecV1CLH3McNCLH2A76UL7QpSX1XLoIDo6SxgMwAfXufNGDhPET6NAoWm8mSmDXJopgrw==", | ||||
|       "dependencies": { | ||||
|         "@prisma/debug": "3.12.0", | ||||
|         "@types/cross-spawn": "6.0.2", | ||||
|         "chalk": "4.1.2", | ||||
|         "cross-spawn": "7.0.3" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@repeaterjs/repeater": { | ||||
|       "version": "3.0.4", | ||||
|       "resolved": "https://registry.npmjs.org/@repeaterjs/repeater/-/repeater-3.0.4.tgz", | ||||
|  | @ -3000,6 +3073,14 @@ | |||
|         "@types/responselike": "*" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@types/cross-spawn": { | ||||
|       "version": "6.0.2", | ||||
|       "resolved": "https://registry.npmjs.org/@types/cross-spawn/-/cross-spawn-6.0.2.tgz", | ||||
|       "integrity": "sha512-KuwNhp3eza+Rhu8IFI5HUXRP0LIhqH5cAjubUvGXXthh4YYBuP2ntwEX+Cz8GJoZUHlKo247wPWOfA9LYEq4cw==", | ||||
|       "dependencies": { | ||||
|         "@types/node": "*" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@types/debug": { | ||||
|       "version": "4.1.7", | ||||
|       "resolved": "https://registry.npmjs.org/@types%2fdebug/-/debug-4.1.7.tgz", | ||||
|  | @ -4719,7 +4800,6 @@ | |||
|       "version": "7.0.3", | ||||
|       "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", | ||||
|       "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", | ||||
|       "dev": true, | ||||
|       "license": "MIT", | ||||
|       "dependencies": { | ||||
|         "path-key": "^3.1.0", | ||||
|  | @ -7154,7 +7234,6 @@ | |||
|       "version": "2.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", | ||||
|       "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", | ||||
|       "dev": true, | ||||
|       "license": "ISC" | ||||
|     }, | ||||
|     "node_modules/isomorphic-fetch": { | ||||
|  | @ -36108,7 +36187,6 @@ | |||
|       "version": "3.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", | ||||
|       "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", | ||||
|       "dev": true, | ||||
|       "license": "MIT", | ||||
|       "engines": { | ||||
|         "node": ">=8" | ||||
|  | @ -37752,7 +37830,6 @@ | |||
|       "version": "2.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", | ||||
|       "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", | ||||
|       "dev": true, | ||||
|       "license": "MIT", | ||||
|       "dependencies": { | ||||
|         "shebang-regex": "^3.0.0" | ||||
|  | @ -37765,7 +37842,6 @@ | |||
|       "version": "3.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", | ||||
|       "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", | ||||
|       "dev": true, | ||||
|       "license": "MIT", | ||||
|       "engines": { | ||||
|         "node": ">=8" | ||||
|  | @ -39136,7 +39212,6 @@ | |||
|       "version": "2.0.2", | ||||
|       "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", | ||||
|       "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", | ||||
|       "dev": true, | ||||
|       "license": "ISC", | ||||
|       "dependencies": { | ||||
|         "isexe": "^2.0.0" | ||||
|  | @ -41173,6 +41248,20 @@ | |||
|       "integrity": "sha512-xop9VL3JmcF7/wUw79HpY3ulUfmbs57yFHEnxDy6pgZbLbnuaDBjgUrBRfSGSdHyu2jexd72USpgv4y/lD4xow==", | ||||
|       "requires": {} | ||||
|     }, | ||||
|     "@pothos/plugin-prisma": { | ||||
|       "version": "3.4.0", | ||||
|       "resolved": "https://registry.npmjs.org/@pothos/plugin-prisma/-/plugin-prisma-3.4.0.tgz", | ||||
|       "integrity": "sha512-J0uiTNX9cDXzJ64N6Gd7EVUW90bxSr/NrijY41zc5VZqHv/l1JlWmwKJK5qF5CBULlqNIba/KDLZHvszMNAA8A==", | ||||
|       "requires": { | ||||
|         "@prisma/generator-helper": "^3.12.0" | ||||
|       } | ||||
|     }, | ||||
|     "@pothos/plugin-relay": { | ||||
|       "version": "3.10.0", | ||||
|       "resolved": "https://registry.npmjs.org/@pothos/plugin-relay/-/plugin-relay-3.10.0.tgz", | ||||
|       "integrity": "sha512-ZNkSYPhDKanMrd8aFD4nEUeMHoeD6wyejBsO1Ik/q8IRHRRPQzLsc/ignxGEl5j+hdu/SsTuhMNszV9Ef0JOJw==", | ||||
|       "requires": {} | ||||
|     }, | ||||
|     "@prisma/client": { | ||||
|       "version": "3.11.1", | ||||
|       "resolved": "https://registry.npmjs.org/@prisma/client/-/client-3.11.1.tgz", | ||||
|  | @ -41181,6 +41270,36 @@ | |||
|         "@prisma/engines-version": "3.11.1-1.1a2506facaf1a4727b7c26850735e88ec779dee9" | ||||
|       } | ||||
|     }, | ||||
|     "@prisma/debug": { | ||||
|       "version": "3.12.0", | ||||
|       "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-3.12.0.tgz", | ||||
|       "integrity": "sha512-MFNsK8jzao3VX+cEP6+txABa3w8bU4gD0QpqTbGS3v3TW1c7TtHvhsmI7xTx9Cll7biuJdaRd3YwG2Fa/CHVmA==", | ||||
|       "requires": { | ||||
|         "@types/debug": "4.1.7", | ||||
|         "ms": "2.1.3", | ||||
|         "strip-ansi": "6.0.1" | ||||
|       }, | ||||
|       "dependencies": { | ||||
|         "ansi-regex": { | ||||
|           "version": "5.0.1", | ||||
|           "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", | ||||
|           "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" | ||||
|         }, | ||||
|         "ms": { | ||||
|           "version": "2.1.3", | ||||
|           "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", | ||||
|           "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" | ||||
|         }, | ||||
|         "strip-ansi": { | ||||
|           "version": "6.0.1", | ||||
|           "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", | ||||
|           "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", | ||||
|           "requires": { | ||||
|             "ansi-regex": "^5.0.1" | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "@prisma/engines": { | ||||
|       "version": "3.11.1-1.1a2506facaf1a4727b7c26850735e88ec779dee9", | ||||
|       "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-3.11.1-1.1a2506facaf1a4727b7c26850735e88ec779dee9.tgz", | ||||
|  | @ -41191,6 +41310,17 @@ | |||
|       "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-3.11.1-1.1a2506facaf1a4727b7c26850735e88ec779dee9.tgz", | ||||
|       "integrity": "sha512-HkcsDniA4iNb/gi0iuyOJNAM7nD/LwQ0uJm15v360O5dee3TM4lWdSQiTYBMK6FF68ACUItmzSur7oYuUZ2zkQ==" | ||||
|     }, | ||||
|     "@prisma/generator-helper": { | ||||
|       "version": "3.12.0", | ||||
|       "resolved": "https://registry.npmjs.org/@prisma/generator-helper/-/generator-helper-3.12.0.tgz", | ||||
|       "integrity": "sha512-wfEcSVUX0HH0A/CIrsecV1CLH3McNCLH2A76UL7QpSX1XLoIDo6SxgMwAfXufNGDhPET6NAoWm8mSmDXJopgrw==", | ||||
|       "requires": { | ||||
|         "@prisma/debug": "3.12.0", | ||||
|         "@types/cross-spawn": "6.0.2", | ||||
|         "chalk": "4.1.2", | ||||
|         "cross-spawn": "7.0.3" | ||||
|       } | ||||
|     }, | ||||
|     "@repeaterjs/repeater": { | ||||
|       "version": "3.0.4", | ||||
|       "resolved": "https://registry.npmjs.org/@repeaterjs/repeater/-/repeater-3.0.4.tgz", | ||||
|  | @ -41453,6 +41583,14 @@ | |||
|         "@types/responselike": "*" | ||||
|       } | ||||
|     }, | ||||
|     "@types/cross-spawn": { | ||||
|       "version": "6.0.2", | ||||
|       "resolved": "https://registry.npmjs.org/@types/cross-spawn/-/cross-spawn-6.0.2.tgz", | ||||
|       "integrity": "sha512-KuwNhp3eza+Rhu8IFI5HUXRP0LIhqH5cAjubUvGXXthh4YYBuP2ntwEX+Cz8GJoZUHlKo247wPWOfA9LYEq4cw==", | ||||
|       "requires": { | ||||
|         "@types/node": "*" | ||||
|       } | ||||
|     }, | ||||
|     "@types/debug": { | ||||
|       "version": "4.1.7", | ||||
|       "resolved": "https://registry.npmjs.org/@types%2fdebug/-/debug-4.1.7.tgz", | ||||
|  | @ -42758,7 +42896,6 @@ | |||
|       "version": "7.0.3", | ||||
|       "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", | ||||
|       "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "path-key": "^3.1.0", | ||||
|         "shebang-command": "^2.0.0", | ||||
|  | @ -44475,8 +44612,7 @@ | |||
|     "isexe": { | ||||
|       "version": "2.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", | ||||
|       "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", | ||||
|       "dev": true | ||||
|       "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" | ||||
|     }, | ||||
|     "isomorphic-fetch": { | ||||
|       "version": "3.0.0", | ||||
|  | @ -66349,8 +66485,7 @@ | |||
|     "path-key": { | ||||
|       "version": "3.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", | ||||
|       "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", | ||||
|       "dev": true | ||||
|       "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" | ||||
|     }, | ||||
|     "path-parse": { | ||||
|       "version": "1.0.7", | ||||
|  | @ -67417,7 +67552,6 @@ | |||
|       "version": "2.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", | ||||
|       "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "shebang-regex": "^3.0.0" | ||||
|       } | ||||
|  | @ -67425,8 +67559,7 @@ | |||
|     "shebang-regex": { | ||||
|       "version": "3.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", | ||||
|       "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", | ||||
|       "dev": true | ||||
|       "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" | ||||
|     }, | ||||
|     "signal-exit": { | ||||
|       "version": "3.0.7", | ||||
|  | @ -68401,7 +68534,6 @@ | |||
|       "version": "2.0.2", | ||||
|       "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", | ||||
|       "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "isexe": "^2.0.0" | ||||
|       } | ||||
|  |  | |||
|  | @ -29,6 +29,8 @@ | |||
|   "dependencies": { | ||||
|     "@graphql-yoga/node": "^2.1.0", | ||||
|     "@pothos/core": "^3.5.1", | ||||
|     "@pothos/plugin-prisma": "^3.4.0", | ||||
|     "@pothos/plugin-relay": "^3.10.0", | ||||
|     "@prisma/client": "^3.11.1", | ||||
|     "@tailwindcss/forms": "^0.4.0", | ||||
|     "@tailwindcss/typography": "^0.5.1", | ||||
|  |  | |||
|  | @ -2,12 +2,16 @@ generator client { | |||
|   provider = "prisma-client-js" | ||||
| } | ||||
| 
 | ||||
| generator pothos { | ||||
|   provider = "prisma-pothos-types" | ||||
| } | ||||
| 
 | ||||
| datasource db { | ||||
|   provider = "postgresql" | ||||
|   url      = env("DIGITALOCEAN_POSTGRES") | ||||
| } | ||||
| 
 | ||||
| model dashboards { | ||||
| model Dashboard { | ||||
|   id          String   @id | ||||
|   title       String | ||||
|   description String | ||||
|  | @ -15,15 +19,19 @@ model dashboards { | |||
|   timestamp   DateTime @db.Timestamp(6) | ||||
|   creator     String | ||||
|   extra       Json | ||||
| 
 | ||||
|   @@map("dashboards") | ||||
| } | ||||
| 
 | ||||
| model frontpage { | ||||
| model Frontpage { | ||||
|   id               Int  @id @default(autoincrement()) | ||||
|   frontpage_full   Json | ||||
|   frontpage_sliced Json | ||||
| 
 | ||||
|   @@map("frontpage") | ||||
| } | ||||
| 
 | ||||
| model history { | ||||
| model History { | ||||
|   id                String | ||||
|   title             String | ||||
|   url               String | ||||
|  | @ -37,9 +45,10 @@ model history { | |||
|   pk                Int      @id @default(autoincrement()) | ||||
| 
 | ||||
|   @@index([id]) | ||||
|   @@map("history") | ||||
| } | ||||
| 
 | ||||
| model questions { | ||||
| model Question { | ||||
|   id                String   @id | ||||
|   title             String | ||||
|   url               String | ||||
|  | @ -50,4 +59,6 @@ model questions { | |||
|   stars             Int | ||||
|   qualityindicators Json | ||||
|   extra             Json | ||||
| 
 | ||||
|   @@map("questions") | ||||
| } | ||||
|  |  | |||
							
								
								
									
										3
									
								
								src/backend/database/prisma.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								src/backend/database/prisma.ts
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,3 @@ | |||
| import { PrismaClient } from "@prisma/client"; | ||||
| 
 | ||||
| export const prisma = new PrismaClient({}); | ||||
|  | @ -1,3 +1,5 @@ | |||
| // see https://pothos-graphql.dev/docs/guide/generating-client-types#export-schema-in-a-js-file,
 | ||||
| // but we use ts-node instead of @boost/module
 | ||||
| require("ts-node").register({}); | ||||
| 
 | ||||
| module.exports = require("./schema.ts"); | ||||
|  |  | |||
|  | @ -1,25 +1,104 @@ | |||
| import SchemaBuilder from "@pothos/core"; | ||||
| import PrismaPlugin from "@pothos/plugin-prisma"; | ||||
| import RelayPlugin from "@pothos/plugin-relay"; | ||||
| import { Question } from "@prisma/client"; | ||||
| 
 | ||||
| import { prisma } from "../backend/database/prisma"; | ||||
| import { getFrontpage } from "../backend/frontpage"; | ||||
| import { Question } from "../backend/platforms"; | ||||
| 
 | ||||
| const builder = new SchemaBuilder({}); | ||||
| import type PrismaTypes from "@pothos/plugin-prisma/generated"; | ||||
| const builder = new SchemaBuilder<{ | ||||
|   PrismaTypes: PrismaTypes; | ||||
|   Scalars: { | ||||
|     Date: { | ||||
|       Input: Date; | ||||
|       Output: Date; | ||||
|     }; | ||||
|   }; | ||||
| }>({ | ||||
|   plugins: [PrismaPlugin, RelayPlugin], | ||||
|   prisma: { | ||||
|     client: prisma, | ||||
|   }, | ||||
|   relayOptions: { | ||||
|     clientMutationId: "omit", | ||||
|     cursorType: "String", | ||||
|     // these are required for some reason, though it's not documented and probably a bug
 | ||||
|     brandLoadedObjects: undefined, | ||||
|     encodeGlobalID: undefined, | ||||
|     decodeGlobalID: undefined, | ||||
|   }, | ||||
| }); | ||||
| 
 | ||||
| const QuestionObj = builder.objectRef<Question>("Question").implement({ | ||||
|   description: "Forecast question.", | ||||
| builder.scalarType("Date", { | ||||
|   description: "Date serialized as the Unix timestamp.", | ||||
|   serialize: (d) => d.getTime() / 1000, | ||||
|   parseValue: (d) => { | ||||
|     return new Date(d as string); // not sure if this is correct, need to check
 | ||||
|   }, | ||||
| }); | ||||
| 
 | ||||
| const QuestionObj = builder.prismaObject("Question", { | ||||
|   findUnique: (question) => ({ id: question.id }), | ||||
|   fields: (t) => ({ | ||||
|     id: t.exposeString("id", {}), | ||||
|     title: t.exposeString("title", {}), | ||||
|     id: t.exposeID("id"), | ||||
|     title: t.exposeString("title"), | ||||
|     timestamp: t.field({ | ||||
|       type: "Date", | ||||
|       resolve: (parent) => parent.timestamp, | ||||
|     }), | ||||
|   }), | ||||
| }); | ||||
| 
 | ||||
| builder.queryType({ | ||||
|   fields: (t) => ({ | ||||
|     firstQuestion: t.prismaField({ | ||||
|       type: "Question", | ||||
|       resolve: async (query, root, args, ctx, info) => | ||||
|         prisma.question.findUnique({ | ||||
|           ...query, | ||||
|           rejectOnNotFound: true, | ||||
|           where: { id: "foretold-e1ca8cc6-33a4-4e38-9ef3-553a050ba0a9" }, | ||||
|         }), | ||||
|     }), | ||||
|   }), | ||||
| }); | ||||
| 
 | ||||
| builder.queryField("frontpage", (t) => | ||||
|   t.field({ | ||||
|     type: [QuestionObj], | ||||
|     resolve: async (parent) => { | ||||
|       return await getFrontpage(); | ||||
|     resolve: async () => { | ||||
|       const legacyQuestions = await getFrontpage(); | ||||
|       const ids = legacyQuestions.map((q) => q.id); | ||||
|       const questions = await prisma.question.findMany({ | ||||
|         where: { | ||||
|           id: { | ||||
|             in: ids, | ||||
|           }, | ||||
|         }, | ||||
|       }); | ||||
|       const id2q: { [k: string]: Question } = {}; | ||||
|       for (const q of questions) { | ||||
|         id2q[q.id] = q; | ||||
|       } | ||||
| 
 | ||||
|       return ids.map((id) => id2q[id] || null).filter((q) => q !== null); | ||||
|     }, | ||||
|   }) | ||||
| ); | ||||
| 
 | ||||
| builder.queryField("questions", (t) => | ||||
|   t.prismaConnection( | ||||
|     { | ||||
|       type: "Question", | ||||
|       cursor: "id", | ||||
|       maxSize: 1000, | ||||
|       resolve: (query, parent, args, context, info) => | ||||
|         prisma.question.findMany({ ...query }), | ||||
|     }, | ||||
|     {}, | ||||
|     {} | ||||
|   ) | ||||
| ); | ||||
| 
 | ||||
| export const schema = builder.toSchema({}); | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	Block a user