Merge pull request #3 from atridadl/dev
1.0.3 - Credibly streamline client-centric networks 🚧 Moved caching to use redicache-ts 🚧 Updated misc. deps
This commit is contained in:
commit
78994be88f
8 changed files with 140 additions and 104 deletions
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "sprintpadawan",
|
"name": "sprintpadawan",
|
||||||
"version": "1.0.2",
|
"version": "1.0.3",
|
||||||
"description": "Plan. Sprint. Repeat.",
|
"description": "Plan. Sprint. Repeat.",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
@ -25,8 +25,7 @@
|
||||||
"ably": "^1.2.39",
|
"ably": "^1.2.39",
|
||||||
"autoprefixer": "^10.4.14",
|
"autoprefixer": "^10.4.14",
|
||||||
"daisyui": "^2.51.6",
|
"daisyui": "^2.51.6",
|
||||||
"fms-ts": "^0.1.6",
|
"fms-ts": "^0.1.7",
|
||||||
"ioredis": "^5.3.2",
|
|
||||||
"json2csv": "6.0.0-alpha.2",
|
"json2csv": "6.0.0-alpha.2",
|
||||||
"next": "^13.4.3",
|
"next": "^13.4.3",
|
||||||
"next-auth": "^4.22.1",
|
"next-auth": "^4.22.1",
|
||||||
|
@ -35,13 +34,14 @@
|
||||||
"react": "18.2.0",
|
"react": "18.2.0",
|
||||||
"react-dom": "18.2.0",
|
"react-dom": "18.2.0",
|
||||||
"react-icons": "^4.8.0",
|
"react-icons": "^4.8.0",
|
||||||
|
"redicache-ts": "^0.1.1",
|
||||||
"superjson": "1.12.3",
|
"superjson": "1.12.3",
|
||||||
"tailwindcss": "^3.3.2",
|
"tailwindcss": "^3.3.2",
|
||||||
"zod": "^3.21.4"
|
"zod": "^3.21.4"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/eslint": "^8.37.0",
|
"@types/eslint": "^8.37.0",
|
||||||
"@types/node": "^20.2.1",
|
"@types/node": "^20.2.3",
|
||||||
"@types/react": "^18.2.6",
|
"@types/react": "^18.2.6",
|
||||||
"@types/react-dom": "^18.2.4",
|
"@types/react-dom": "^18.2.4",
|
||||||
"@typescript-eslint/eslint-plugin": "^5.59.6",
|
"@typescript-eslint/eslint-plugin": "^5.59.6",
|
||||||
|
|
58
pnpm-lock.yaml
generated
58
pnpm-lock.yaml
generated
|
@ -44,11 +44,8 @@ dependencies:
|
||||||
specifier: ^2.51.6
|
specifier: ^2.51.6
|
||||||
version: 2.51.6(autoprefixer@10.4.14)(postcss@8.4.23)
|
version: 2.51.6(autoprefixer@10.4.14)(postcss@8.4.23)
|
||||||
fms-ts:
|
fms-ts:
|
||||||
specifier: ^0.1.6
|
specifier: ^0.1.7
|
||||||
version: 0.1.6
|
version: 0.1.7
|
||||||
ioredis:
|
|
||||||
specifier: ^5.3.2
|
|
||||||
version: 5.3.2
|
|
||||||
json2csv:
|
json2csv:
|
||||||
specifier: 6.0.0-alpha.2
|
specifier: 6.0.0-alpha.2
|
||||||
version: 6.0.0-alpha.2
|
version: 6.0.0-alpha.2
|
||||||
|
@ -73,6 +70,9 @@ dependencies:
|
||||||
react-icons:
|
react-icons:
|
||||||
specifier: ^4.8.0
|
specifier: ^4.8.0
|
||||||
version: 4.8.0(react@18.2.0)
|
version: 4.8.0(react@18.2.0)
|
||||||
|
redicache-ts:
|
||||||
|
specifier: ^0.1.1
|
||||||
|
version: 0.1.1
|
||||||
superjson:
|
superjson:
|
||||||
specifier: 1.12.3
|
specifier: 1.12.3
|
||||||
version: 1.12.3
|
version: 1.12.3
|
||||||
|
@ -88,8 +88,8 @@ devDependencies:
|
||||||
specifier: ^8.37.0
|
specifier: ^8.37.0
|
||||||
version: 8.37.0
|
version: 8.37.0
|
||||||
'@types/node':
|
'@types/node':
|
||||||
specifier: ^20.2.1
|
specifier: ^20.2.3
|
||||||
version: 20.2.1
|
version: 20.2.3
|
||||||
'@types/react':
|
'@types/react':
|
||||||
specifier: ^18.2.6
|
specifier: ^18.2.6
|
||||||
version: 18.2.6
|
version: 18.2.6
|
||||||
|
@ -1747,7 +1747,7 @@ packages:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/http-cache-semantics': 4.0.1
|
'@types/http-cache-semantics': 4.0.1
|
||||||
'@types/keyv': 3.1.4
|
'@types/keyv': 3.1.4
|
||||||
'@types/node': 20.2.1
|
'@types/node': 20.2.3
|
||||||
'@types/responselike': 1.0.0
|
'@types/responselike': 1.0.0
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
@ -1775,7 +1775,7 @@ packages:
|
||||||
resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==}
|
resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/minimatch': 5.1.2
|
'@types/minimatch': 5.1.2
|
||||||
'@types/node': 20.2.1
|
'@types/node': 20.2.3
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@types/http-cache-semantics@4.0.1:
|
/@types/http-cache-semantics@4.0.1:
|
||||||
|
@ -1788,7 +1788,7 @@ packages:
|
||||||
/@types/json2csv@5.0.3:
|
/@types/json2csv@5.0.3:
|
||||||
resolution: {integrity: sha512-ZJEv6SzhPhgpBpxZU4n/TZekbZqI4EcyXXRwms1lAITG2kIAtj85PfNYafUOY1zy8bWs5ujaub0GU4copaA0sw==}
|
resolution: {integrity: sha512-ZJEv6SzhPhgpBpxZU4n/TZekbZqI4EcyXXRwms1lAITG2kIAtj85PfNYafUOY1zy8bWs5ujaub0GU4copaA0sw==}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 20.2.1
|
'@types/node': 20.2.3
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@types/json5@0.0.29:
|
/@types/json5@0.0.29:
|
||||||
|
@ -1798,7 +1798,7 @@ packages:
|
||||||
/@types/keyv@3.1.4:
|
/@types/keyv@3.1.4:
|
||||||
resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==}
|
resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 20.2.1
|
'@types/node': 20.2.3
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@types/minimatch@5.1.2:
|
/@types/minimatch@5.1.2:
|
||||||
|
@ -1824,8 +1824,8 @@ packages:
|
||||||
- supports-color
|
- supports-color
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@types/node@20.2.1:
|
/@types/node@20.2.3:
|
||||||
resolution: {integrity: sha512-DqJociPbZP1lbZ5SQPk4oag6W7AyaGMO6gSfRwq3PWl4PXTwJpRQJhDq4W0kzrg3w6tJ1SwlvGZ5uKFHY13LIg==}
|
resolution: {integrity: sha512-pg9d0yC4rVNWQzX8U7xb4olIOFuuVL9za3bzMT2pu2SU0SNEi66i2qrvhE2qt0HvkhuCaWJu7pLNOt/Pj8BIrw==}
|
||||||
|
|
||||||
/@types/prop-types@15.7.5:
|
/@types/prop-types@15.7.5:
|
||||||
resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==}
|
resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==}
|
||||||
|
@ -1846,13 +1846,13 @@ packages:
|
||||||
/@types/resolve@1.17.1:
|
/@types/resolve@1.17.1:
|
||||||
resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==}
|
resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 20.2.1
|
'@types/node': 20.2.3
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@types/responselike@1.0.0:
|
/@types/responselike@1.0.0:
|
||||||
resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==}
|
resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 20.2.1
|
'@types/node': 20.2.3
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@types/scheduler@0.16.3:
|
/@types/scheduler@0.16.3:
|
||||||
|
@ -3369,8 +3369,8 @@ packages:
|
||||||
resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==}
|
resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/fms-ts@0.1.6:
|
/fms-ts@0.1.7:
|
||||||
resolution: {integrity: sha512-udJ0KwyFEIF27DQDl0PUptyTYrWczBr8P9g/b4j+Zri4cxQZcKCqcLfHUeDaD8usoThpk4WO0jVjftcjs9fYRw==}
|
resolution: {integrity: sha512-OLmulPKywj1ETsAGeNTaxOmrFdffLFr97Gc/Bfmwu80mS1ToyvTDGNcMa16rCScBabd7M+UlCDSgpafjrTyCJw==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/for-each@0.3.3:
|
/for-each@0.3.3:
|
||||||
|
@ -3941,7 +3941,7 @@ packages:
|
||||||
resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==}
|
resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==}
|
||||||
engines: {node: '>= 10.13.0'}
|
engines: {node: '>= 10.13.0'}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 20.2.1
|
'@types/node': 20.2.3
|
||||||
merge-stream: 2.0.0
|
merge-stream: 2.0.0
|
||||||
supports-color: 7.2.0
|
supports-color: 7.2.0
|
||||||
dev: false
|
dev: false
|
||||||
|
@ -3950,7 +3950,7 @@ packages:
|
||||||
resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==}
|
resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==}
|
||||||
engines: {node: '>= 10.13.0'}
|
engines: {node: '>= 10.13.0'}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 20.2.1
|
'@types/node': 20.2.3
|
||||||
merge-stream: 2.0.0
|
merge-stream: 2.0.0
|
||||||
supports-color: 8.1.1
|
supports-color: 8.1.1
|
||||||
dev: false
|
dev: false
|
||||||
|
@ -4302,8 +4302,8 @@ packages:
|
||||||
next: 13.4.3(@babel/core@7.21.8)(react-dom@18.2.0)(react@18.2.0)
|
next: 13.4.3(@babel/core@7.21.8)(react-dom@18.2.0)(react@18.2.0)
|
||||||
oauth: 0.9.15
|
oauth: 0.9.15
|
||||||
openid-client: 5.4.2
|
openid-client: 5.4.2
|
||||||
preact: 10.14.1
|
preact: 10.15.0
|
||||||
preact-render-to-string: 5.2.6(preact@10.14.1)
|
preact-render-to-string: 5.2.6(preact@10.15.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)
|
||||||
uuid: 8.3.2
|
uuid: 8.3.2
|
||||||
|
@ -4747,17 +4747,17 @@ packages:
|
||||||
source-map-js: 1.0.2
|
source-map-js: 1.0.2
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/preact-render-to-string@5.2.6(preact@10.14.1):
|
/preact-render-to-string@5.2.6(preact@10.15.0):
|
||||||
resolution: {integrity: sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw==}
|
resolution: {integrity: sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
preact: '>=10'
|
preact: '>=10'
|
||||||
dependencies:
|
dependencies:
|
||||||
preact: 10.14.1
|
preact: 10.15.0
|
||||||
pretty-format: 3.8.0
|
pretty-format: 3.8.0
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/preact@10.14.1:
|
/preact@10.15.0:
|
||||||
resolution: {integrity: sha512-4XDSnUisk3YFBb3p9WeKeH1mKoxdFUsaXcvxs9wlpYR1wax/TWJVqhwmIWbByX0h7jMEJH6Zc5J6jqc58FKaNQ==}
|
resolution: {integrity: sha512-nZSa8M2R2m1n7nJSBlzDpxRJaIsejrTO1vlFbdpFvyC8qM1iU+On2y0otfoUm6SRB5o0lF0CKDFxg6grEFU0iQ==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/prelude-ls@1.2.1:
|
/prelude-ls@1.2.1:
|
||||||
|
@ -4865,6 +4865,14 @@ packages:
|
||||||
picomatch: 2.3.1
|
picomatch: 2.3.1
|
||||||
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:
|
/redis-errors@1.2.0:
|
||||||
resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==}
|
resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==}
|
||||||
engines: {node: '>=4'}
|
engines: {node: '>=4'}
|
||||||
|
|
|
@ -7,7 +7,15 @@ import {
|
||||||
protectedProcedure,
|
protectedProcedure,
|
||||||
} from "~/server/api/trpc";
|
} from "~/server/api/trpc";
|
||||||
|
|
||||||
import { writeToCache, fetchFromCache, deleteFromCache } from "~/server/redis";
|
import {
|
||||||
|
cacheClient,
|
||||||
|
writeToCache,
|
||||||
|
fetchFromCache,
|
||||||
|
deleteFromCache,
|
||||||
|
} from "redicache-ts";
|
||||||
|
import { env } from "~/env.mjs";
|
||||||
|
|
||||||
|
const client = cacheClient(env.REDIS_URL);
|
||||||
|
|
||||||
export const roomRouter = createTRPCRouter({
|
export const roomRouter = createTRPCRouter({
|
||||||
// Create
|
// Create
|
||||||
|
@ -29,8 +37,12 @@ export const roomRouter = createTRPCRouter({
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
if (room) {
|
if (room) {
|
||||||
await deleteFromCache(`kv_roomcount_admin`);
|
await deleteFromCache(client, env.APP_ENV, `kv_roomcount_admin`);
|
||||||
await deleteFromCache(`kv_roomlist_${ctx.session.user.id}`);
|
await deleteFromCache(
|
||||||
|
client,
|
||||||
|
env.APP_ENV,
|
||||||
|
`kv_roomlist_${ctx.session.user.id}`
|
||||||
|
);
|
||||||
|
|
||||||
await publishToChannel(
|
await publishToChannel(
|
||||||
`${ctx.session.user.id}`,
|
`${ctx.session.user.id}`,
|
||||||
|
@ -92,7 +104,7 @@ export const roomRouter = createTRPCRouter({
|
||||||
createdAt: Date;
|
createdAt: Date;
|
||||||
roomName: string;
|
roomName: string;
|
||||||
}[]
|
}[]
|
||||||
>(`kv_roomlist_${ctx.session.user.id}`);
|
>(client, env.APP_ENV, `kv_roomlist_${ctx.session.user.id}`);
|
||||||
|
|
||||||
if (cachedResult) {
|
if (cachedResult) {
|
||||||
return cachedResult;
|
return cachedResult;
|
||||||
|
@ -109,6 +121,8 @@ export const roomRouter = createTRPCRouter({
|
||||||
});
|
});
|
||||||
|
|
||||||
await writeToCache(
|
await writeToCache(
|
||||||
|
client,
|
||||||
|
env.APP_ENV,
|
||||||
`kv_roomlist_${ctx.session.user.id}`,
|
`kv_roomlist_${ctx.session.user.id}`,
|
||||||
JSON.stringify(roomList),
|
JSON.stringify(roomList),
|
||||||
69
|
69
|
||||||
|
@ -119,14 +133,24 @@ export const roomRouter = createTRPCRouter({
|
||||||
}),
|
}),
|
||||||
|
|
||||||
countAll: protectedProcedure.query(async ({ ctx }) => {
|
countAll: protectedProcedure.query(async ({ ctx }) => {
|
||||||
const cachedResult = await fetchFromCache<number>(`kv_roomcount_admin`);
|
const cachedResult = await fetchFromCache<number>(
|
||||||
|
client,
|
||||||
|
env.APP_ENV,
|
||||||
|
`kv_roomcount_admin`
|
||||||
|
);
|
||||||
|
|
||||||
if (cachedResult) {
|
if (cachedResult) {
|
||||||
return cachedResult;
|
return cachedResult;
|
||||||
} else {
|
} else {
|
||||||
const roomsCount = await ctx.prisma.room.count();
|
const roomsCount = await ctx.prisma.room.count();
|
||||||
|
|
||||||
await writeToCache(`kv_roomcount_admin`, roomsCount, 69);
|
await writeToCache(
|
||||||
|
client,
|
||||||
|
env.APP_ENV,
|
||||||
|
`kv_roomcount_admin`,
|
||||||
|
roomsCount,
|
||||||
|
69
|
||||||
|
);
|
||||||
|
|
||||||
return roomsCount;
|
return roomsCount;
|
||||||
}
|
}
|
||||||
|
@ -242,9 +266,13 @@ export const roomRouter = createTRPCRouter({
|
||||||
});
|
});
|
||||||
|
|
||||||
if (deletedRoom) {
|
if (deletedRoom) {
|
||||||
await deleteFromCache(`kv_roomcount_admin`);
|
await deleteFromCache(client, env.APP_ENV, `kv_roomcount_admin`);
|
||||||
await deleteFromCache(`kv_votecount_admin`);
|
await deleteFromCache(client, env.APP_ENV, `kv_votecount_admin`);
|
||||||
await deleteFromCache(`kv_roomlist_${ctx.session.user.id}`);
|
await deleteFromCache(
|
||||||
|
client,
|
||||||
|
env.APP_ENV,
|
||||||
|
`kv_roomlist_${ctx.session.user.id}`
|
||||||
|
);
|
||||||
|
|
||||||
await publishToChannel(
|
await publishToChannel(
|
||||||
`${ctx.session.user.id}`,
|
`${ctx.session.user.id}`,
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
import { z } from "zod";
|
import { z } from "zod";
|
||||||
import { createTRPCRouter, protectedProcedure } from "~/server/api/trpc";
|
import { createTRPCRouter, protectedProcedure } from "~/server/api/trpc";
|
||||||
import { deleteFromCache } from "~/server/redis";
|
import { cacheClient, deleteFromCache } from "redicache-ts";
|
||||||
|
import { env } from "~/env.mjs";
|
||||||
|
|
||||||
|
const client = cacheClient(env.REDIS_URL);
|
||||||
|
|
||||||
export const sessionRouter = createTRPCRouter({
|
export const sessionRouter = createTRPCRouter({
|
||||||
deleteAll: protectedProcedure
|
deleteAll: protectedProcedure
|
||||||
|
@ -17,7 +20,7 @@ export const sessionRouter = createTRPCRouter({
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!!sessions) {
|
if (!!sessions) {
|
||||||
await deleteFromCache(`kv_userlist_admin`);
|
await deleteFromCache(client, env.APP_ENV, `kv_userlist_admin`);
|
||||||
}
|
}
|
||||||
|
|
||||||
return !!sessions;
|
return !!sessions;
|
||||||
|
|
|
@ -3,19 +3,37 @@ import { z } from "zod";
|
||||||
import { env } from "~/env.mjs";
|
import { env } from "~/env.mjs";
|
||||||
import { createTRPCRouter, protectedProcedure } from "~/server/api/trpc";
|
import { createTRPCRouter, protectedProcedure } from "~/server/api/trpc";
|
||||||
import { sendMail } from "fms-ts";
|
import { sendMail } from "fms-ts";
|
||||||
import { fetchFromCache, writeToCache, deleteFromCache } from "~/server/redis";
|
|
||||||
import type { Role } from "~/utils/types";
|
import type { Role } from "~/utils/types";
|
||||||
|
|
||||||
|
import {
|
||||||
|
cacheClient,
|
||||||
|
writeToCache,
|
||||||
|
fetchFromCache,
|
||||||
|
deleteFromCache,
|
||||||
|
} from "redicache-ts";
|
||||||
|
|
||||||
|
const client = cacheClient(env.REDIS_URL);
|
||||||
|
|
||||||
export const userRouter = createTRPCRouter({
|
export const userRouter = createTRPCRouter({
|
||||||
countAll: protectedProcedure.query(async ({ ctx }) => {
|
countAll: protectedProcedure.query(async ({ ctx }) => {
|
||||||
const cachedResult = await fetchFromCache<number>(`kv_usercount_admin`);
|
const cachedResult = await fetchFromCache<number>(
|
||||||
|
client,
|
||||||
|
env.APP_ENV,
|
||||||
|
`kv_usercount_admin`
|
||||||
|
);
|
||||||
|
|
||||||
if (cachedResult) {
|
if (cachedResult) {
|
||||||
return cachedResult;
|
return cachedResult;
|
||||||
} else {
|
} else {
|
||||||
const usersCount = await ctx.prisma.user.count();
|
const usersCount = await ctx.prisma.user.count();
|
||||||
|
|
||||||
await writeToCache(`kv_usercount_admin`, usersCount, 69);
|
await writeToCache(
|
||||||
|
client,
|
||||||
|
env.APP_ENV,
|
||||||
|
`kv_usercount_admin`,
|
||||||
|
usersCount,
|
||||||
|
69
|
||||||
|
);
|
||||||
|
|
||||||
return usersCount;
|
return usersCount;
|
||||||
}
|
}
|
||||||
|
@ -50,7 +68,7 @@ export const userRouter = createTRPCRouter({
|
||||||
name: string | null;
|
name: string | null;
|
||||||
email: string | null;
|
email: string | null;
|
||||||
}[]
|
}[]
|
||||||
>(`kv_userlist_admin`);
|
>(client, env.APP_ENV, `kv_userlist_admin`);
|
||||||
|
|
||||||
if (cachedResult) {
|
if (cachedResult) {
|
||||||
return cachedResult.map((user) => {
|
return cachedResult.map((user) => {
|
||||||
|
@ -75,7 +93,13 @@ export const userRouter = createTRPCRouter({
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
await writeToCache(`kv_userlist_admin`, JSON.stringify(users), 69);
|
await writeToCache(
|
||||||
|
client,
|
||||||
|
env.APP_ENV,
|
||||||
|
`kv_userlist_admin`,
|
||||||
|
JSON.stringify(users),
|
||||||
|
69
|
||||||
|
);
|
||||||
|
|
||||||
return users;
|
return users;
|
||||||
}
|
}
|
||||||
|
@ -121,8 +145,8 @@ export const userRouter = createTRPCRouter({
|
||||||
body,
|
body,
|
||||||
user.email
|
user.email
|
||||||
);
|
);
|
||||||
await deleteFromCache(`kv_usercount_admin`);
|
await deleteFromCache(client, env.APP_ENV, `kv_usercount_admin`);
|
||||||
await deleteFromCache(`kv_userlist_admin`);
|
await deleteFromCache(client, env.APP_ENV, `kv_userlist_admin`);
|
||||||
}
|
}
|
||||||
|
|
||||||
return !!user;
|
return !!user;
|
||||||
|
@ -162,7 +186,7 @@ export const userRouter = createTRPCRouter({
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
await deleteFromCache(`kv_userlist_admin`);
|
await deleteFromCache(client, env.APP_ENV, `kv_userlist_admin`);
|
||||||
|
|
||||||
return !!user;
|
return !!user;
|
||||||
}),
|
}),
|
||||||
|
|
|
@ -2,18 +2,36 @@ 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 { deleteFromCache, fetchFromCache, writeToCache } from "~/server/redis";
|
import {
|
||||||
|
cacheClient,
|
||||||
|
writeToCache,
|
||||||
|
fetchFromCache,
|
||||||
|
deleteFromCache,
|
||||||
|
} from "redicache-ts";
|
||||||
|
import { env } from "~/env.mjs";
|
||||||
|
|
||||||
|
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>(`kv_votecount_admin`);
|
const cachedResult = await fetchFromCache<number>(
|
||||||
|
client,
|
||||||
|
env.APP_ENV,
|
||||||
|
`kv_votecount_admin`
|
||||||
|
);
|
||||||
|
|
||||||
if (cachedResult) {
|
if (cachedResult) {
|
||||||
return cachedResult;
|
return cachedResult;
|
||||||
} else {
|
} else {
|
||||||
const votesCount = await ctx.prisma.vote.count();
|
const votesCount = await ctx.prisma.vote.count();
|
||||||
|
|
||||||
await writeToCache(`kv_votecount_admin`, votesCount, 69);
|
await writeToCache(
|
||||||
|
client,
|
||||||
|
env.APP_ENV,
|
||||||
|
`kv_votecount_admin`,
|
||||||
|
votesCount,
|
||||||
|
69
|
||||||
|
);
|
||||||
|
|
||||||
return votesCount;
|
return votesCount;
|
||||||
}
|
}
|
||||||
|
@ -52,7 +70,7 @@ export const voteRouter = createTRPCRouter({
|
||||||
});
|
});
|
||||||
|
|
||||||
if (vote) {
|
if (vote) {
|
||||||
await deleteFromCache(`kv_votecount_admin`);
|
await deleteFromCache(client, env.APP_ENV, `kv_votecount_admin`);
|
||||||
|
|
||||||
await publishToChannel(`${vote.roomId}`, "VOTE_UPDATE", "UPDATE");
|
await publishToChannel(`${vote.roomId}`, "VOTE_UPDATE", "UPDATE");
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,9 @@ import { env } from "~/env.mjs";
|
||||||
import { prisma } from "~/server/db";
|
import { prisma } from "~/server/db";
|
||||||
import type { Role } from "~/utils/types";
|
import type { Role } from "~/utils/types";
|
||||||
import { sendMail } from "fms-ts";
|
import { sendMail } from "fms-ts";
|
||||||
import { deleteFromCache } from "./redis";
|
import { cacheClient, deleteFromCache } from "redicache-ts";
|
||||||
|
|
||||||
|
const client = cacheClient(env.REDIS_URL);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Module augmentation for `next-auth` types. Allows us to add custom properties to the `session`
|
* Module augmentation for `next-auth` types. Allows us to add custom properties to the `session`
|
||||||
|
@ -66,15 +68,15 @@ export const authOptions: NextAuthOptions = {
|
||||||
body,
|
body,
|
||||||
user.email
|
user.email
|
||||||
);
|
);
|
||||||
await deleteFromCache(`kv_userlist_admin`);
|
await deleteFromCache(client, env.APP_ENV, `kv_userlist_admin`);
|
||||||
await deleteFromCache(`kv_usercount_admin`);
|
await deleteFromCache(client, env.APP_ENV, `kv_usercount_admin`);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
async signIn({}) {
|
async signIn({}) {
|
||||||
await deleteFromCache(`kv_userlist_admin`);
|
await deleteFromCache(client, env.APP_ENV, `kv_userlist_admin`);
|
||||||
},
|
},
|
||||||
async signOut({}) {
|
async signOut({}) {
|
||||||
await deleteFromCache(`kv_userlist_admin`);
|
await deleteFromCache(client, env.APP_ENV, `kv_userlist_admin`);
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
adapter: PrismaAdapter(prisma),
|
adapter: PrismaAdapter(prisma),
|
||||||
|
|
|
@ -1,47 +0,0 @@
|
||||||
import { Redis } from "ioredis";
|
|
||||||
import { env } from "~/env.mjs";
|
|
||||||
|
|
||||||
export const redis = new Redis(env.REDIS_URL);
|
|
||||||
|
|
||||||
export const writeToCache = async (
|
|
||||||
key: string,
|
|
||||||
value: string | number | Buffer,
|
|
||||||
timeout?: number
|
|
||||||
): Promise<boolean> => {
|
|
||||||
try {
|
|
||||||
if (!!timeout) {
|
|
||||||
await redis.set(`${env.APP_ENV}_${key}`, value, "EX", timeout);
|
|
||||||
} else {
|
|
||||||
await redis.set(`${env.APP_ENV}_${key}`, value);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
} catch {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export const fetchFromCache = async <T>(key: string): Promise<T | null> => {
|
|
||||||
try {
|
|
||||||
// This is bad please don't ever do this.
|
|
||||||
const cachedValue: Awaited<T> | null = JSON.parse(
|
|
||||||
(await redis.get(`${env.APP_ENV}_${key}`)) || ""
|
|
||||||
) as Awaited<T> | null;
|
|
||||||
if (!cachedValue && cachedValue !== 0) {
|
|
||||||
throw new Error("Cache Miss");
|
|
||||||
}
|
|
||||||
console.log(`CACHE HIT FOR KEY ${key}: `, cachedValue);
|
|
||||||
return cachedValue;
|
|
||||||
} catch {
|
|
||||||
console.log(`CACHE MISS FOR KEY ${key}!`);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export const deleteFromCache = async (key: string) => {
|
|
||||||
try {
|
|
||||||
await redis.del(`${env.APP_ENV}_${key}`);
|
|
||||||
return true;
|
|
||||||
} catch {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
};
|
|
Loading…
Add table
Reference in a new issue