test
This commit is contained in:
parent
34acabe16d
commit
acce4be46e
10 changed files with 121 additions and 220 deletions
15
package.json
15
package.json
|
@ -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
154
pnpm-lock.yaml
generated
|
@ -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:
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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}`,
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}),
|
}),
|
||||||
|
|
|
@ -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");
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
7
src/server/redis.ts
Normal 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,
|
||||||
|
});
|
Loading…
Add table
Reference in a new issue