This commit is contained in:
Atridad Lahiji 2023-06-18 23:45:04 -06:00
parent 017c15d1ef
commit 6115027dcc
No known key found for this signature in database
10 changed files with 121 additions and 220 deletions

View file

@ -6,11 +6,10 @@
"scripts": { "scripts": {
"build": "next build", "build": "next build",
"serv": "NEXTAUTH_URL=http://localhost:3000 && next dev", "serv": "NEXTAUTH_URL=http://localhost:3000 && next dev",
"dev": "railway run pnpm serv", "dev": "pnpm serv",
"postinstall": "prisma generate", "postinstall": "prisma generate",
"lint": "next lint", "lint": "next lint",
"start": "next start", "start": "next start"
"connect": "railway link"
}, },
"dependencies": { "dependencies": {
"@ably-labs/react-hooks": "^2.1.1", "@ably-labs/react-hooks": "^2.1.1",
@ -18,10 +17,11 @@
"@prisma/client": "4.15.0", "@prisma/client": "4.15.0",
"@react-email/components": "^0.0.7", "@react-email/components": "^0.0.7",
"@tanstack/react-query": "^4.29.14", "@tanstack/react-query": "^4.29.14",
"@trpc/client": "10.30.0", "@trpc/client": "10.31.0",
"@trpc/next": "10.30.0", "@trpc/next": "10.31.0",
"@trpc/react-query": "10.30.0", "@trpc/react-query": "10.31.0",
"@trpc/server": "10.30.0", "@trpc/server": "10.31.0",
"@upstash/redis": "^1.21.0",
"ably": "^1.2.40", "ably": "^1.2.40",
"autoprefixer": "^10.4.14", "autoprefixer": "^10.4.14",
"json2csv": "6.0.0-alpha.2", "json2csv": "6.0.0-alpha.2",
@ -33,7 +33,6 @@
"react-dom": "18.2.0", "react-dom": "18.2.0",
"react-email": "^1.9.4", "react-email": "^1.9.4",
"react-icons": "^4.9.0", "react-icons": "^4.9.0",
"redicache-ts": "^0.1.1",
"resend": "^0.15.3", "resend": "^0.15.3",
"sharp": "^0.32.1", "sharp": "^0.32.1",
"superjson": "1.12.3", "superjson": "1.12.3",

154
pnpm-lock.yaml generated
View file

@ -21,17 +21,20 @@ dependencies:
specifier: ^4.29.14 specifier: ^4.29.14
version: 4.29.14(react-dom@18.2.0)(react@18.2.0) version: 4.29.14(react-dom@18.2.0)(react@18.2.0)
'@trpc/client': '@trpc/client':
specifier: 10.30.0 specifier: 10.31.0
version: 10.30.0(@trpc/server@10.30.0) version: 10.31.0(@trpc/server@10.31.0)
'@trpc/next': '@trpc/next':
specifier: 10.30.0 specifier: 10.31.0
version: 10.30.0(@tanstack/react-query@4.29.14)(@trpc/client@10.30.0)(@trpc/react-query@10.30.0)(@trpc/server@10.30.0)(next@13.4.6)(react-dom@18.2.0)(react@18.2.0) version: 10.31.0(@tanstack/react-query@4.29.14)(@trpc/client@10.31.0)(@trpc/react-query@10.31.0)(@trpc/server@10.31.0)(next@13.4.6)(react-dom@18.2.0)(react@18.2.0)
'@trpc/react-query': '@trpc/react-query':
specifier: 10.30.0 specifier: 10.31.0
version: 10.30.0(@tanstack/react-query@4.29.14)(@trpc/client@10.30.0)(@trpc/server@10.30.0)(react-dom@18.2.0)(react@18.2.0) version: 10.31.0(@tanstack/react-query@4.29.14)(@trpc/client@10.31.0)(@trpc/server@10.31.0)(react-dom@18.2.0)(react@18.2.0)
'@trpc/server': '@trpc/server':
specifier: 10.30.0 specifier: 10.31.0
version: 10.30.0 version: 10.31.0
'@upstash/redis':
specifier: ^1.21.0
version: 1.21.0
ably: ably:
specifier: ^1.2.40 specifier: ^1.2.40
version: 1.2.40 version: 1.2.40
@ -65,9 +68,6 @@ dependencies:
react-icons: react-icons:
specifier: ^4.9.0 specifier: ^4.9.0
version: 4.9.0(react@18.2.0) version: 4.9.0(react@18.2.0)
redicache-ts:
specifier: ^0.1.1
version: 0.1.1
resend: resend:
specifier: ^0.15.3 specifier: ^0.15.3
version: 0.15.3 version: 0.15.3
@ -466,10 +466,6 @@ packages:
resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==}
dev: true dev: true
/@ioredis/commands@1.2.0:
resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==}
dev: false
/@jridgewell/gen-mapping@0.3.3: /@jridgewell/gen-mapping@0.3.3:
resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==}
engines: {node: '>=6.0.0'} engines: {node: '>=6.0.0'}
@ -1027,53 +1023,53 @@ packages:
use-sync-external-store: 1.2.0(react@18.2.0) use-sync-external-store: 1.2.0(react@18.2.0)
dev: false dev: false
/@trpc/client@10.30.0(@trpc/server@10.30.0): /@trpc/client@10.31.0(@trpc/server@10.31.0):
resolution: {integrity: sha512-utz0qRI4eU3QcHvBwcSONEnt5pWR3Dyk4VFJnySHysBT6GQRRpJifWX5+RxDhFK93LxcAmiirFbYXjZ40gbobw==} resolution: {integrity: sha512-VCqbJEvFJb8C4hQFw7AD+dkQTjgEdV/QAzO4D+/cX5e93u5NpfNXI+PKS0QFXwG/zqgwQwVV6OkYc/D/MFwA6g==}
peerDependencies: peerDependencies:
'@trpc/server': 10.30.0 '@trpc/server': 10.31.0
dependencies: dependencies:
'@trpc/server': 10.30.0 '@trpc/server': 10.31.0
dev: false dev: false
/@trpc/next@10.30.0(@tanstack/react-query@4.29.14)(@trpc/client@10.30.0)(@trpc/react-query@10.30.0)(@trpc/server@10.30.0)(next@13.4.6)(react-dom@18.2.0)(react@18.2.0): /@trpc/next@10.31.0(@tanstack/react-query@4.29.14)(@trpc/client@10.31.0)(@trpc/react-query@10.31.0)(@trpc/server@10.31.0)(next@13.4.6)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-DhvEadQe5E6yFXkAS394OvCe7MKAnuK45Ni86Hg7B6Sq5nCX5aFm7YeNdJKxfuxaXzXuvK0XD2YGJFsf9+0j0Q==} resolution: {integrity: sha512-BZtZr7UKAs0tUTreCsYhy+/HjFNFl5KBwBS+Li6pCv9GwqCDqpoivesQz7LltO4Y4lOLXLm9tXQXtS1gfmF9yg==}
peerDependencies: peerDependencies:
'@tanstack/react-query': ^4.18.0 '@tanstack/react-query': ^4.18.0
'@trpc/client': 10.30.0 '@trpc/client': 10.31.0
'@trpc/react-query': 10.30.0 '@trpc/react-query': 10.31.0
'@trpc/server': 10.30.0 '@trpc/server': 10.31.0
next: '*' next: '*'
react: '>=16.8.0' react: '>=16.8.0'
react-dom: '>=16.8.0' react-dom: '>=16.8.0'
dependencies: dependencies:
'@tanstack/react-query': 4.29.14(react-dom@18.2.0)(react@18.2.0) '@tanstack/react-query': 4.29.14(react-dom@18.2.0)(react@18.2.0)
'@trpc/client': 10.30.0(@trpc/server@10.30.0) '@trpc/client': 10.31.0(@trpc/server@10.31.0)
'@trpc/react-query': 10.30.0(@tanstack/react-query@4.29.14)(@trpc/client@10.30.0)(@trpc/server@10.30.0)(react-dom@18.2.0)(react@18.2.0) '@trpc/react-query': 10.31.0(@tanstack/react-query@4.29.14)(@trpc/client@10.31.0)(@trpc/server@10.31.0)(react-dom@18.2.0)(react@18.2.0)
'@trpc/server': 10.30.0 '@trpc/server': 10.31.0
next: 13.4.6(react-dom@18.2.0)(react@18.2.0) next: 13.4.6(react-dom@18.2.0)(react@18.2.0)
react: 18.2.0 react: 18.2.0
react-dom: 18.2.0(react@18.2.0) react-dom: 18.2.0(react@18.2.0)
react-ssr-prepass: 1.5.0(react@18.2.0) react-ssr-prepass: 1.5.0(react@18.2.0)
dev: false dev: false
/@trpc/react-query@10.30.0(@tanstack/react-query@4.29.14)(@trpc/client@10.30.0)(@trpc/server@10.30.0)(react-dom@18.2.0)(react@18.2.0): /@trpc/react-query@10.31.0(@tanstack/react-query@4.29.14)(@trpc/client@10.31.0)(@trpc/server@10.31.0)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-bJnCEsuBv/xqnT76Ur8PI3VYjfCE1MYJ6LafT9nL25Pvfq480r0MFEIF0nQ7AWDZ8hZEDE8UZuicGG1ITpyxkQ==} resolution: {integrity: sha512-+M8sIsbf6e4H5XYvHlzDqhaf+ybfUigA/9OL3wXRp2vXhCedEiIERCnwNuHWFDRASl9vjOcM33AuJ4sbOOINEA==}
peerDependencies: peerDependencies:
'@tanstack/react-query': ^4.18.0 '@tanstack/react-query': ^4.18.0
'@trpc/client': 10.30.0 '@trpc/client': 10.31.0
'@trpc/server': 10.30.0 '@trpc/server': 10.31.0
react: '>=16.8.0' react: '>=16.8.0'
react-dom: '>=16.8.0' react-dom: '>=16.8.0'
dependencies: dependencies:
'@tanstack/react-query': 4.29.14(react-dom@18.2.0)(react@18.2.0) '@tanstack/react-query': 4.29.14(react-dom@18.2.0)(react@18.2.0)
'@trpc/client': 10.30.0(@trpc/server@10.30.0) '@trpc/client': 10.31.0(@trpc/server@10.31.0)
'@trpc/server': 10.30.0 '@trpc/server': 10.31.0
react: 18.2.0 react: 18.2.0
react-dom: 18.2.0(react@18.2.0) react-dom: 18.2.0(react@18.2.0)
dev: false dev: false
/@trpc/server@10.30.0: /@trpc/server@10.31.0:
resolution: {integrity: sha512-pRsrHCuar3fbyOdJvO4b80OMP1Tx/wOSy5Ozy6cFDFWVUmfAyIX3En5Hoysy4cmMUuCsQsfTEYQwo+OcpjzBkg==} resolution: {integrity: sha512-9EnRTSDE9nF11LZsvSOqNKqkRYzHqFX4ch5AJ6VIu8uta2vxVTN4FxxsNRSOluTzVYZDeaCISbwmOJ5iihCCIg==}
dev: false dev: false
/@types/cacheable-request@6.0.3: /@types/cacheable-request@6.0.3:
@ -1293,6 +1289,14 @@ packages:
eslint-visitor-keys: 3.4.1 eslint-visitor-keys: 3.4.1
dev: true dev: true
/@upstash/redis@1.21.0:
resolution: {integrity: sha512-c6M+cl0LOgGK/7Gp6ooMkIZ1IDAJs8zFR+REPkoSkAq38o7CWFX5FYwYEqGZ6wJpUGBuEOr/7hTmippXGgL25A==}
dependencies:
isomorphic-fetch: 3.0.0
transitivePeerDependencies:
- encoding
dev: false
/abbrev@1.1.1: /abbrev@1.1.1:
resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==}
dev: false dev: false
@ -1726,11 +1730,6 @@ packages:
engines: {node: '>=0.8'} engines: {node: '>=0.8'}
dev: false dev: false
/cluster-key-slot@1.1.2:
resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==}
engines: {node: '>=0.10.0'}
dev: false
/color-convert@1.9.3: /color-convert@1.9.3:
resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
dependencies: dependencies:
@ -1899,6 +1898,7 @@ packages:
optional: true optional: true
dependencies: dependencies:
ms: 2.1.2 ms: 2.1.2
dev: true
/decompress-response@6.0.0: /decompress-response@6.0.0:
resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==}
@ -1972,11 +1972,6 @@ packages:
engines: {node: '>=0.4.0'} engines: {node: '>=0.4.0'}
dev: false dev: false
/denque@2.1.0:
resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==}
engines: {node: '>=0.10'}
dev: false
/deprecation@2.3.1: /deprecation@2.3.1:
resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==}
dev: false dev: false
@ -2267,7 +2262,7 @@ packages:
eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.59.11)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.43.0) eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.59.11)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.43.0)
eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.59.11)(eslint-import-resolver-typescript@3.5.5)(eslint@8.43.0) eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.59.11)(eslint-import-resolver-typescript@3.5.5)(eslint@8.43.0)
get-tsconfig: 4.6.0 get-tsconfig: 4.6.0
globby: 13.1.4 globby: 13.2.0
is-core-module: 2.12.1 is-core-module: 2.12.1
is-glob: 4.0.3 is-glob: 4.0.3
synckit: 0.8.5 synckit: 0.8.5
@ -2858,8 +2853,8 @@ packages:
merge2: 1.4.1 merge2: 1.4.1
slash: 3.0.0 slash: 3.0.0
/globby@13.1.4: /globby@13.2.0:
resolution: {integrity: sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==} resolution: {integrity: sha512-jWsQfayf13NvqKUIL3Ta+CIqMnvlaIDFveWE/dpOZ9+3AMEJozsxDvKA02zync9UuvOM8rOXzsD5GqKP4OnWPQ==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
dependencies: dependencies:
dir-glob: 3.0.1 dir-glob: 3.0.1
@ -3070,23 +3065,6 @@ packages:
engines: {node: '>= 0.10'} engines: {node: '>= 0.10'}
dev: false dev: false
/ioredis@5.3.2:
resolution: {integrity: sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==}
engines: {node: '>=12.22.0'}
dependencies:
'@ioredis/commands': 1.2.0
cluster-key-slot: 1.1.2
debug: 4.3.4
denque: 2.1.0
lodash.defaults: 4.2.0
lodash.isarguments: 3.1.0
redis-errors: 1.2.0
redis-parser: 3.0.0
standard-as-callback: 2.1.0
transitivePeerDependencies:
- supports-color
dev: false
/is-array-buffer@3.0.2: /is-array-buffer@3.0.2:
resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==}
dependencies: dependencies:
@ -3293,6 +3271,15 @@ packages:
/isexe@2.0.0: /isexe@2.0.0:
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
/isomorphic-fetch@3.0.0:
resolution: {integrity: sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==}
dependencies:
node-fetch: 2.6.11
whatwg-fetch: 3.6.2
transitivePeerDependencies:
- encoding
dev: false
/jiti@1.18.2: /jiti@1.18.2:
resolution: {integrity: sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==} resolution: {integrity: sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==}
hasBin: true hasBin: true
@ -3450,18 +3437,10 @@ packages:
p-locate: 5.0.0 p-locate: 5.0.0
dev: true dev: true
/lodash.defaults@4.2.0:
resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==}
dev: false
/lodash.get@4.4.2: /lodash.get@4.4.2:
resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==}
dev: false dev: false
/lodash.isarguments@3.1.0:
resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==}
dev: false
/lodash.merge@4.6.2: /lodash.merge@4.6.2:
resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
dev: true dev: true
@ -3571,6 +3550,7 @@ packages:
/ms@2.1.2: /ms@2.1.2:
resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
dev: true
/ms@2.1.3: /ms@2.1.3:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
@ -4395,26 +4375,6 @@ packages:
resolve: 1.22.2 resolve: 1.22.2
dev: false dev: false
/redicache-ts@0.1.1:
resolution: {integrity: sha512-z6edrqsRlayBhI91eA8/N+AGJeFAdU+tvnmP3LzAyQ5pqXEM9Ww1+bHTKd0pWRRcZMWKLaaAHx9SOWj/IEfpuw==}
dependencies:
ioredis: 5.3.2
transitivePeerDependencies:
- supports-color
dev: false
/redis-errors@1.2.0:
resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==}
engines: {node: '>=4'}
dev: false
/redis-parser@3.0.0:
resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==}
engines: {node: '>=4'}
dependencies:
redis-errors: 1.2.0
dev: false
/regenerator-runtime@0.13.11: /regenerator-runtime@0.13.11:
resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==}
@ -4666,10 +4626,6 @@ packages:
resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
dev: false dev: false
/standard-as-callback@2.1.0:
resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==}
dev: false
/streamsearch@1.1.0: /streamsearch@1.1.0:
resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==}
engines: {node: '>=10.0.0'} engines: {node: '>=10.0.0'}
@ -5148,6 +5104,10 @@ packages:
resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
dev: false dev: false
/whatwg-fetch@3.6.2:
resolution: {integrity: sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==}
dev: false
/whatwg-url@5.0.0: /whatwg-url@5.0.0:
resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
dependencies: dependencies:

View file

@ -12,8 +12,9 @@ generator client {
} }
datasource db { datasource db {
provider = "postgresql" provider = "mysql"
url = env("DATABASE_URL") url = env("DATABASE_URL")
relationMode = "prisma"
} }
model Account { model Account {

View file

@ -6,8 +6,8 @@ import { z } from "zod";
*/ */
const server = z.object({ const server = z.object({
DATABASE_URL: z.string().url(), DATABASE_URL: z.string().url(),
REDIS_URL: z.string().url(), UPSTASH_REDIS_REST_URL: z.string().url(),
REDIS_TTL: z.string(), UPSTASH_REDIS_REST_TOKEN: z.string(),
NODE_ENV: z.enum(["development", "test", "production"]), NODE_ENV: z.enum(["development", "test", "production"]),
NEXTAUTH_SECRET: NEXTAUTH_SECRET:
process.env.NODE_ENV === "production" process.env.NODE_ENV === "production"
@ -65,8 +65,8 @@ const client = z.object({
*/ */
const processEnv = { const processEnv = {
DATABASE_URL: process.env.DATABASE_URL, DATABASE_URL: process.env.DATABASE_URL,
REDIS_URL: process.env.REDIS_URL, UPSTASH_REDIS_REST_URL: process.env.UPSTASH_REDIS_REST_URL,
REDIS_TTL: process.env.REDIS_TTL, UPSTASH_REDIS_REST_TOKEN: process.env.UPSTASH_REDIS_REST_TOKEN,
NODE_ENV: process.env.NODE_ENV, NODE_ENV: process.env.NODE_ENV,
NEXTAUTH_SECRET: process.env.NEXTAUTH_SECRET, NEXTAUTH_SECRET: process.env.NEXTAUTH_SECRET,
NEXTAUTH_URL: process.env.NEXTAUTH_URL, NEXTAUTH_URL: process.env.NEXTAUTH_URL,

View file

@ -7,15 +7,8 @@ import {
protectedProcedure, protectedProcedure,
} from "~/server/api/trpc"; } from "~/server/api/trpc";
import {
cacheClient,
writeToCache,
fetchFromCache,
deleteFromCache,
} from "redicache-ts";
import { env } from "~/env.mjs"; import { env } from "~/env.mjs";
import { redis } from "~/server/redis";
const client = cacheClient(env.REDIS_URL);
export const roomRouter = createTRPCRouter({ export const roomRouter = createTRPCRouter({
// Create // Create
@ -37,12 +30,8 @@ export const roomRouter = createTRPCRouter({
}, },
}); });
if (room) { if (room) {
await deleteFromCache(client, env.APP_ENV, `kv_roomcount_admin`); await redis.del(`${env.APP_ENV}_kv_roomcount_admin`);
await deleteFromCache( await redis.del(`${env.APP_ENV}_kv_roomlist_${ctx.session.user.id}`);
client,
env.APP_ENV,
`kv_roomlist_${ctx.session.user.id}`
);
await publishToChannel( await publishToChannel(
`${ctx.session.user.id}`, `${ctx.session.user.id}`,
@ -81,13 +70,13 @@ export const roomRouter = createTRPCRouter({
// Get All // Get All
getAll: protectedProcedure.query(async ({ ctx }) => { getAll: protectedProcedure.query(async ({ ctx }) => {
const cachedResult = await fetchFromCache< const cachedResult = await redis.get<
{ {
id: string; id: string;
createdAt: Date; createdAt: Date;
roomName: string; roomName: string;
}[] }[]
>(client, env.APP_ENV, `kv_roomlist_${ctx.session.user.id}`); >(`${env.APP_ENV}_kv_roomlist_${ctx.session.user.id}`);
if (cachedResult) { if (cachedResult) {
return cachedResult; return cachedResult;
@ -103,12 +92,9 @@ export const roomRouter = createTRPCRouter({
}, },
}); });
await writeToCache( await redis.set(
client, `${env.APP_ENV}_kv_roomlist_${ctx.session.user.id}`,
env.APP_ENV, roomList
`kv_roomlist_${ctx.session.user.id}`,
JSON.stringify(roomList),
Number(env.REDIS_TTL)
); );
return roomList; return roomList;
@ -116,10 +102,8 @@ export const roomRouter = createTRPCRouter({
}), }),
countAll: protectedProcedure.query(async ({ ctx }) => { countAll: protectedProcedure.query(async ({ ctx }) => {
const cachedResult = await fetchFromCache<number>( const cachedResult = await redis.get<number>(
client, `${env.APP_ENV}_kv_roomcount_admin`
env.APP_ENV,
`kv_roomcount_admin`
); );
if (cachedResult) { if (cachedResult) {
@ -127,13 +111,7 @@ export const roomRouter = createTRPCRouter({
} else { } else {
const roomsCount = await ctx.prisma.room.count(); const roomsCount = await ctx.prisma.room.count();
await writeToCache( await redis.set(`${env.APP_ENV}_kv_roomcount_admin`, roomsCount);
client,
env.APP_ENV,
`kv_roomcount_admin`,
roomsCount,
Number(env.REDIS_TTL)
);
return roomsCount; return roomsCount;
} }
@ -199,7 +177,7 @@ export const roomRouter = createTRPCRouter({
}, },
}); });
await deleteFromCache(client, env.APP_ENV, `kv_votes_${input.roomId}`); await redis.del(`${env.APP_ENV}_kv_votes_${input.roomId}`);
} }
const newRoom = await ctx.prisma.room.update({ const newRoom = await ctx.prisma.room.update({
@ -251,13 +229,9 @@ export const roomRouter = createTRPCRouter({
}); });
if (deletedRoom) { if (deletedRoom) {
await deleteFromCache(client, env.APP_ENV, `kv_roomcount_admin`); await redis.del(`${env.APP_ENV}_kv_roomcount_admin`);
await deleteFromCache(client, env.APP_ENV, `kv_votecount_admin`); await redis.del(`${env.APP_ENV}_kv_votecount_admin`);
await deleteFromCache( await redis.del(`${env.APP_ENV}_kv_roomlist_${ctx.session.user.id}`);
client,
env.APP_ENV,
`kv_roomlist_${ctx.session.user.id}`
);
await publishToChannel( await publishToChannel(
`${ctx.session.user.id}`, `${ctx.session.user.id}`,

View file

@ -1,9 +1,7 @@
import { z } from "zod"; import { z } from "zod";
import { createTRPCRouter, protectedProcedure } from "~/server/api/trpc"; import { createTRPCRouter, protectedProcedure } from "~/server/api/trpc";
import { cacheClient, deleteFromCache } from "redicache-ts";
import { env } from "~/env.mjs"; import { env } from "~/env.mjs";
import { redis } from "~/server/redis";
const client = cacheClient(env.REDIS_URL);
export const sessionRouter = createTRPCRouter({ export const sessionRouter = createTRPCRouter({
deleteAll: protectedProcedure deleteAll: protectedProcedure
@ -20,7 +18,7 @@ export const sessionRouter = createTRPCRouter({
}); });
if (!!sessions) { if (!!sessions) {
await deleteFromCache(client, env.APP_ENV, `kv_userlist_admin`); await redis.del(`${env.APP_ENV}_kv_userlist_admin`);
} }
return !!sessions; return !!sessions;

View file

@ -6,22 +6,14 @@ import type { Role } from "~/utils/types";
import { Resend } from "resend"; import { Resend } from "resend";
import { Goodbye } from "~/components/templates/Goodbye"; import { Goodbye } from "~/components/templates/Goodbye";
import { import { redis } from "~/server/redis";
cacheClient,
writeToCache,
fetchFromCache,
deleteFromCache,
} from "redicache-ts";
const client = cacheClient(env.REDIS_URL);
const resend = new Resend(process.env.RESEND_API_KEY); const resend = new Resend(process.env.RESEND_API_KEY);
export const userRouter = createTRPCRouter({ export const userRouter = createTRPCRouter({
countAll: protectedProcedure.query(async ({ ctx }) => { countAll: protectedProcedure.query(async ({ ctx }) => {
const cachedResult = await fetchFromCache<number>( const cachedResult = await redis.get<number>(
client, `${env.APP_ENV}_kv_usercount_admin`
env.APP_ENV,
`kv_usercount_admin`
); );
if (cachedResult) { if (cachedResult) {
@ -29,13 +21,7 @@ export const userRouter = createTRPCRouter({
} else { } else {
const usersCount = await ctx.prisma.user.count(); const usersCount = await ctx.prisma.user.count();
await writeToCache( await redis.set(`${env.APP_ENV}_kv_usercount_admin`, usersCount);
client,
env.APP_ENV,
`kv_usercount_admin`,
usersCount,
Number(env.REDIS_TTL)
);
return usersCount; return usersCount;
} }
@ -60,7 +46,7 @@ export const userRouter = createTRPCRouter({
}); });
}), }),
getAll: protectedProcedure.query(async ({ ctx }) => { getAll: protectedProcedure.query(async ({ ctx }) => {
const cachedResult = await fetchFromCache< const cachedResult = await redis.get<
{ {
accounts: { accounts: {
provider: string; provider: string;
@ -74,7 +60,7 @@ export const userRouter = createTRPCRouter({
name: string | null; name: string | null;
email: string | null; email: string | null;
}[] }[]
>(client, env.APP_ENV, `kv_userlist_admin`); >(`${env.APP_ENV}_kv_userlist_admin`);
if (cachedResult) { if (cachedResult) {
return cachedResult.map((user) => { return cachedResult.map((user) => {
@ -104,13 +90,7 @@ export const userRouter = createTRPCRouter({
}, },
}); });
await writeToCache( await redis.set(`${env.APP_ENV}_kv_userlist_admin`, users);
client,
env.APP_ENV,
`kv_userlist_admin`,
JSON.stringify(users),
Number(env.REDIS_TTL)
);
return users; return users;
} }
@ -147,8 +127,9 @@ export const userRouter = createTRPCRouter({
//@ts-ignore: IDK why this doesn't work... //@ts-ignore: IDK why this doesn't work...
react: Goodbye({ name: user.name }), react: Goodbye({ name: user.name }),
}); });
await deleteFromCache(client, env.APP_ENV, `kv_usercount_admin`);
await deleteFromCache(client, env.APP_ENV, `kv_userlist_admin`); await redis.del(`${env.APP_ENV}_kv_usercount_admin`);
await redis.del(`${env.APP_ENV}_kv_userlist_admin`);
} }
return !!user; return !!user;
@ -188,7 +169,7 @@ export const userRouter = createTRPCRouter({
}, },
}); });
await deleteFromCache(client, env.APP_ENV, `kv_userlist_admin`); await redis.del(`${env.APP_ENV}_kv_userlist_admin`);
return !!user; return !!user;
}), }),

View file

@ -2,23 +2,14 @@ import { z } from "zod";
import { publishToChannel } from "~/server/ably"; import { publishToChannel } from "~/server/ably";
import { createTRPCRouter, protectedProcedure } from "~/server/api/trpc"; import { createTRPCRouter, protectedProcedure } from "~/server/api/trpc";
import {
cacheClient,
writeToCache,
fetchFromCache,
deleteFromCache,
} from "redicache-ts";
import { env } from "~/env.mjs"; import { env } from "~/env.mjs";
import type { Room } from "@prisma/client"; import type { Room } from "@prisma/client";
import { redis } from "~/server/redis";
const client = cacheClient(env.REDIS_URL);
export const voteRouter = createTRPCRouter({ export const voteRouter = createTRPCRouter({
countAll: protectedProcedure.query(async ({ ctx }) => { countAll: protectedProcedure.query(async ({ ctx }) => {
const cachedResult = await fetchFromCache<number>( const cachedResult = await redis.get<number>(
client, `${env.APP_ENV}_kv_votecount_admin`
env.APP_ENV,
`kv_votecount_admin`
); );
if (cachedResult) { if (cachedResult) {
@ -26,13 +17,7 @@ export const voteRouter = createTRPCRouter({
} else { } else {
const votesCount = await ctx.prisma.vote.count(); const votesCount = await ctx.prisma.vote.count();
await writeToCache( await redis.set(`${env.APP_ENV}_kv_votecount_admin`, votesCount);
client,
env.APP_ENV,
`kv_votecount_admin`,
votesCount,
Number(env.REDIS_TTL)
);
return votesCount; return votesCount;
} }
@ -40,7 +25,7 @@ export const voteRouter = createTRPCRouter({
getAllByRoomId: protectedProcedure getAllByRoomId: protectedProcedure
.input(z.object({ roomId: z.string() })) .input(z.object({ roomId: z.string() }))
.query(async ({ ctx, input }) => { .query(async ({ ctx, input }) => {
const cachedResult = await fetchFromCache< const cachedResult = await redis.get<
{ {
value: string; value: string;
room: Room; room: Room;
@ -52,7 +37,7 @@ export const voteRouter = createTRPCRouter({
}; };
roomId: string; roomId: string;
}[] }[]
>(client, env.APP_ENV, `kv_votes_${input.roomId}`); >(`${env.APP_ENV}_kv_votes_${input.roomId}`);
if (cachedResult) { if (cachedResult) {
return cachedResult; return cachedResult;
@ -76,12 +61,9 @@ export const voteRouter = createTRPCRouter({
}, },
}); });
await writeToCache( await redis.set(
client, `${env.APP_ENV}_kv_votes_${input.roomId}`,
env.APP_ENV, votesByRoomId
`kv_votes_${input.roomId}`,
JSON.stringify(votesByRoomId),
Number(Number(env.REDIS_TTL))
); );
return votesByRoomId; return votesByRoomId;
@ -121,8 +103,8 @@ export const voteRouter = createTRPCRouter({
}); });
if (vote) { if (vote) {
await deleteFromCache(client, env.APP_ENV, `kv_votecount_admin`); await redis.del(`${env.APP_ENV}_kv_votecount_admin`);
await deleteFromCache(client, env.APP_ENV, `kv_votes_${input.roomId}`); await redis.del(`${env.APP_ENV}_kv_votes_${input.roomId}`);
await publishToChannel(`${vote.roomId}`, "VOTE_UPDATE", "UPDATE"); await publishToChannel(`${vote.roomId}`, "VOTE_UPDATE", "UPDATE");
} }

View file

@ -12,9 +12,8 @@ import { prisma } from "~/server/db";
import type { Role } from "~/utils/types"; import type { Role } from "~/utils/types";
import { Resend } from "resend"; import { Resend } from "resend";
import { Welcome } from "../components/templates/Welcome"; import { Welcome } from "../components/templates/Welcome";
import { cacheClient, deleteFromCache } from "redicache-ts"; import { redis } from "./redis";
const client = cacheClient(env.REDIS_URL);
const resend = new Resend(process.env.RESEND_API_KEY); const resend = new Resend(process.env.RESEND_API_KEY);
/** /**
@ -62,15 +61,15 @@ export const authOptions: NextAuthOptions = {
react: Welcome({ name: user.name }), react: Welcome({ name: user.name }),
}); });
await deleteFromCache(client, env.APP_ENV, `kv_userlist_admin`); await redis.del(`${env.APP_ENV}_kv_userlist_admin`);
await deleteFromCache(client, env.APP_ENV, `kv_usercount_admin`); await redis.del(`${env.APP_ENV}_kv_usercount_admin`);
} }
}, },
async signIn({}) { async signIn({}) {
await deleteFromCache(client, env.APP_ENV, `kv_userlist_admin`); await redis.del(`${env.APP_ENV}_kv_userlist_admin`);
}, },
async signOut() { async signOut() {
await deleteFromCache(client, env.APP_ENV, `kv_userlist_admin`); await redis.del(`${env.APP_ENV}_kv_userlist_admin`);
}, },
}, },
// @ts-ignore This adapter should work... // @ts-ignore This adapter should work...

7
src/server/redis.ts Normal file
View file

@ -0,0 +1,7 @@
import { Redis } from "@upstash/redis";
import { env } from "~/env.mjs";
export const redis = new Redis({
url: env.UPSTASH_REDIS_REST_URL,
token: env.UPSTASH_REDIS_REST_TOKEN,
});