diff --git a/package.json b/package.json index d371e40..54e917f 100644 --- a/package.json +++ b/package.json @@ -6,11 +6,10 @@ "scripts": { "build": "next build", "serv": "NEXTAUTH_URL=http://localhost:3000 && next dev", - "dev": "railway run pnpm serv", + "dev": "pnpm serv", "postinstall": "prisma generate", "lint": "next lint", - "start": "next start", - "connect": "railway link" + "start": "next start" }, "dependencies": { "@ably-labs/react-hooks": "^2.1.1", @@ -18,10 +17,11 @@ "@prisma/client": "4.15.0", "@react-email/components": "^0.0.7", "@tanstack/react-query": "^4.29.14", - "@trpc/client": "10.30.0", - "@trpc/next": "10.30.0", - "@trpc/react-query": "10.30.0", - "@trpc/server": "10.30.0", + "@trpc/client": "10.31.0", + "@trpc/next": "10.31.0", + "@trpc/react-query": "10.31.0", + "@trpc/server": "10.31.0", + "@upstash/redis": "^1.21.0", "ably": "^1.2.40", "autoprefixer": "^10.4.14", "json2csv": "6.0.0-alpha.2", @@ -33,7 +33,6 @@ "react-dom": "18.2.0", "react-email": "^1.9.4", "react-icons": "^4.9.0", - "redicache-ts": "^0.1.1", "resend": "^0.15.3", "sharp": "^0.32.1", "superjson": "1.12.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 74dc7f4..3590a19 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,17 +21,20 @@ dependencies: specifier: ^4.29.14 version: 4.29.14(react-dom@18.2.0)(react@18.2.0) '@trpc/client': - specifier: 10.30.0 - version: 10.30.0(@trpc/server@10.30.0) + specifier: 10.31.0 + version: 10.31.0(@trpc/server@10.31.0) '@trpc/next': - specifier: 10.30.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) + specifier: 10.31.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': - specifier: 10.30.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) + specifier: 10.31.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': - specifier: 10.30.0 - version: 10.30.0 + specifier: 10.31.0 + version: 10.31.0 + '@upstash/redis': + specifier: ^1.21.0 + version: 1.21.0 ably: specifier: ^1.2.40 version: 1.2.40 @@ -65,9 +68,6 @@ dependencies: react-icons: specifier: ^4.9.0 version: 4.9.0(react@18.2.0) - redicache-ts: - specifier: ^0.1.1 - version: 0.1.1 resend: specifier: ^0.15.3 version: 0.15.3 @@ -466,10 +466,6 @@ packages: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true - /@ioredis/commands@1.2.0: - resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} - dev: false - /@jridgewell/gen-mapping@0.3.3: resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} engines: {node: '>=6.0.0'} @@ -1027,53 +1023,53 @@ packages: use-sync-external-store: 1.2.0(react@18.2.0) dev: false - /@trpc/client@10.30.0(@trpc/server@10.30.0): - resolution: {integrity: sha512-utz0qRI4eU3QcHvBwcSONEnt5pWR3Dyk4VFJnySHysBT6GQRRpJifWX5+RxDhFK93LxcAmiirFbYXjZ40gbobw==} + /@trpc/client@10.31.0(@trpc/server@10.31.0): + resolution: {integrity: sha512-VCqbJEvFJb8C4hQFw7AD+dkQTjgEdV/QAzO4D+/cX5e93u5NpfNXI+PKS0QFXwG/zqgwQwVV6OkYc/D/MFwA6g==} peerDependencies: - '@trpc/server': 10.30.0 + '@trpc/server': 10.31.0 dependencies: - '@trpc/server': 10.30.0 + '@trpc/server': 10.31.0 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): - resolution: {integrity: sha512-DhvEadQe5E6yFXkAS394OvCe7MKAnuK45Ni86Hg7B6Sq5nCX5aFm7YeNdJKxfuxaXzXuvK0XD2YGJFsf9+0j0Q==} + /@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-BZtZr7UKAs0tUTreCsYhy+/HjFNFl5KBwBS+Li6pCv9GwqCDqpoivesQz7LltO4Y4lOLXLm9tXQXtS1gfmF9yg==} peerDependencies: '@tanstack/react-query': ^4.18.0 - '@trpc/client': 10.30.0 - '@trpc/react-query': 10.30.0 - '@trpc/server': 10.30.0 + '@trpc/client': 10.31.0 + '@trpc/react-query': 10.31.0 + '@trpc/server': 10.31.0 next: '*' react: '>=16.8.0' react-dom: '>=16.8.0' dependencies: '@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/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/server': 10.30.0 + '@trpc/client': 10.31.0(@trpc/server@10.31.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.31.0 next: 13.4.6(react-dom@18.2.0)(react@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) 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): - resolution: {integrity: sha512-bJnCEsuBv/xqnT76Ur8PI3VYjfCE1MYJ6LafT9nL25Pvfq480r0MFEIF0nQ7AWDZ8hZEDE8UZuicGG1ITpyxkQ==} + /@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-+M8sIsbf6e4H5XYvHlzDqhaf+ybfUigA/9OL3wXRp2vXhCedEiIERCnwNuHWFDRASl9vjOcM33AuJ4sbOOINEA==} peerDependencies: '@tanstack/react-query': ^4.18.0 - '@trpc/client': 10.30.0 - '@trpc/server': 10.30.0 + '@trpc/client': 10.31.0 + '@trpc/server': 10.31.0 react: '>=16.8.0' react-dom: '>=16.8.0' dependencies: '@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/server': 10.30.0 + '@trpc/client': 10.31.0(@trpc/server@10.31.0) + '@trpc/server': 10.31.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@trpc/server@10.30.0: - resolution: {integrity: sha512-pRsrHCuar3fbyOdJvO4b80OMP1Tx/wOSy5Ozy6cFDFWVUmfAyIX3En5Hoysy4cmMUuCsQsfTEYQwo+OcpjzBkg==} + /@trpc/server@10.31.0: + resolution: {integrity: sha512-9EnRTSDE9nF11LZsvSOqNKqkRYzHqFX4ch5AJ6VIu8uta2vxVTN4FxxsNRSOluTzVYZDeaCISbwmOJ5iihCCIg==} dev: false /@types/cacheable-request@6.0.3: @@ -1293,6 +1289,14 @@ packages: eslint-visitor-keys: 3.4.1 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: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} dev: false @@ -1726,11 +1730,6 @@ packages: engines: {node: '>=0.8'} 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: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: @@ -1899,6 +1898,7 @@ packages: optional: true dependencies: ms: 2.1.2 + dev: true /decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} @@ -1972,11 +1972,6 @@ packages: engines: {node: '>=0.4.0'} dev: false - /denque@2.1.0: - resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} - engines: {node: '>=0.10'} - dev: false - /deprecation@2.3.1: resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} 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-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 - globby: 13.1.4 + globby: 13.2.0 is-core-module: 2.12.1 is-glob: 4.0.3 synckit: 0.8.5 @@ -2858,8 +2853,8 @@ packages: merge2: 1.4.1 slash: 3.0.0 - /globby@13.1.4: - resolution: {integrity: sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==} + /globby@13.2.0: + resolution: {integrity: sha512-jWsQfayf13NvqKUIL3Ta+CIqMnvlaIDFveWE/dpOZ9+3AMEJozsxDvKA02zync9UuvOM8rOXzsD5GqKP4OnWPQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: dir-glob: 3.0.1 @@ -3070,23 +3065,6 @@ packages: engines: {node: '>= 0.10'} 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: resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} dependencies: @@ -3293,6 +3271,15 @@ packages: /isexe@2.0.0: 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: resolution: {integrity: sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==} hasBin: true @@ -3450,18 +3437,10 @@ packages: p-locate: 5.0.0 dev: true - /lodash.defaults@4.2.0: - resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} - dev: false - /lodash.get@4.4.2: resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} dev: false - /lodash.isarguments@3.1.0: - resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} - dev: false - /lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true @@ -3571,6 +3550,7 @@ packages: /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -4395,26 +4375,6 @@ packages: resolve: 1.22.2 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: resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} @@ -4666,10 +4626,6 @@ packages: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} dev: false - /standard-as-callback@2.1.0: - resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} - dev: false - /streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} @@ -5148,6 +5104,10 @@ packages: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} dev: false + /whatwg-fetch@3.6.2: + resolution: {integrity: sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==} + dev: false + /whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} dependencies: diff --git a/prisma/schema.prisma b/prisma/schema.prisma index c87205d..c100851 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -12,8 +12,9 @@ generator client { } datasource db { - provider = "postgresql" + provider = "mysql" url = env("DATABASE_URL") + relationMode = "prisma" } model Account { diff --git a/src/env.mjs b/src/env.mjs index fef156c..5067a1c 100644 --- a/src/env.mjs +++ b/src/env.mjs @@ -6,8 +6,8 @@ import { z } from "zod"; */ const server = z.object({ DATABASE_URL: z.string().url(), - REDIS_URL: z.string().url(), - REDIS_TTL: z.string(), + UPSTASH_REDIS_REST_URL: z.string().url(), + UPSTASH_REDIS_REST_TOKEN: z.string(), NODE_ENV: z.enum(["development", "test", "production"]), NEXTAUTH_SECRET: process.env.NODE_ENV === "production" @@ -65,8 +65,8 @@ const client = z.object({ */ const processEnv = { DATABASE_URL: process.env.DATABASE_URL, - REDIS_URL: process.env.REDIS_URL, - REDIS_TTL: process.env.REDIS_TTL, + UPSTASH_REDIS_REST_URL: process.env.UPSTASH_REDIS_REST_URL, + UPSTASH_REDIS_REST_TOKEN: process.env.UPSTASH_REDIS_REST_TOKEN, NODE_ENV: process.env.NODE_ENV, NEXTAUTH_SECRET: process.env.NEXTAUTH_SECRET, NEXTAUTH_URL: process.env.NEXTAUTH_URL, diff --git a/src/server/api/routers/room.ts b/src/server/api/routers/room.ts index 87efb7f..553927c 100644 --- a/src/server/api/routers/room.ts +++ b/src/server/api/routers/room.ts @@ -7,15 +7,8 @@ import { protectedProcedure, } from "~/server/api/trpc"; -import { - cacheClient, - writeToCache, - fetchFromCache, - deleteFromCache, -} from "redicache-ts"; import { env } from "~/env.mjs"; - -const client = cacheClient(env.REDIS_URL); +import { redis } from "~/server/redis"; export const roomRouter = createTRPCRouter({ // Create @@ -37,12 +30,8 @@ export const roomRouter = createTRPCRouter({ }, }); if (room) { - await deleteFromCache(client, env.APP_ENV, `kv_roomcount_admin`); - await deleteFromCache( - client, - env.APP_ENV, - `kv_roomlist_${ctx.session.user.id}` - ); + await redis.del(`${env.APP_ENV}_kv_roomcount_admin`); + await redis.del(`${env.APP_ENV}_kv_roomlist_${ctx.session.user.id}`); await publishToChannel( `${ctx.session.user.id}`, @@ -81,13 +70,13 @@ export const roomRouter = createTRPCRouter({ // Get All getAll: protectedProcedure.query(async ({ ctx }) => { - const cachedResult = await fetchFromCache< + const cachedResult = await redis.get< { id: string; createdAt: Date; roomName: string; }[] - >(client, env.APP_ENV, `kv_roomlist_${ctx.session.user.id}`); + >(`${env.APP_ENV}_kv_roomlist_${ctx.session.user.id}`); if (cachedResult) { return cachedResult; @@ -103,12 +92,9 @@ export const roomRouter = createTRPCRouter({ }, }); - await writeToCache( - client, - env.APP_ENV, - `kv_roomlist_${ctx.session.user.id}`, - JSON.stringify(roomList), - Number(env.REDIS_TTL) + await redis.set( + `${env.APP_ENV}_kv_roomlist_${ctx.session.user.id}`, + roomList ); return roomList; @@ -116,10 +102,8 @@ export const roomRouter = createTRPCRouter({ }), countAll: protectedProcedure.query(async ({ ctx }) => { - const cachedResult = await fetchFromCache( - client, - env.APP_ENV, - `kv_roomcount_admin` + const cachedResult = await redis.get( + `${env.APP_ENV}_kv_roomcount_admin` ); if (cachedResult) { @@ -127,13 +111,7 @@ export const roomRouter = createTRPCRouter({ } else { const roomsCount = await ctx.prisma.room.count(); - await writeToCache( - client, - env.APP_ENV, - `kv_roomcount_admin`, - roomsCount, - Number(env.REDIS_TTL) - ); + await redis.set(`${env.APP_ENV}_kv_roomcount_admin`, 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({ @@ -251,13 +229,9 @@ export const roomRouter = createTRPCRouter({ }); if (deletedRoom) { - await deleteFromCache(client, env.APP_ENV, `kv_roomcount_admin`); - await deleteFromCache(client, env.APP_ENV, `kv_votecount_admin`); - await deleteFromCache( - client, - env.APP_ENV, - `kv_roomlist_${ctx.session.user.id}` - ); + await redis.del(`${env.APP_ENV}_kv_roomcount_admin`); + await redis.del(`${env.APP_ENV}_kv_votecount_admin`); + await redis.del(`${env.APP_ENV}_kv_roomlist_${ctx.session.user.id}`); await publishToChannel( `${ctx.session.user.id}`, diff --git a/src/server/api/routers/session.ts b/src/server/api/routers/session.ts index 66f2e8c..5eb9327 100644 --- a/src/server/api/routers/session.ts +++ b/src/server/api/routers/session.ts @@ -1,9 +1,7 @@ import { z } from "zod"; import { createTRPCRouter, protectedProcedure } from "~/server/api/trpc"; -import { cacheClient, deleteFromCache } from "redicache-ts"; import { env } from "~/env.mjs"; - -const client = cacheClient(env.REDIS_URL); +import { redis } from "~/server/redis"; export const sessionRouter = createTRPCRouter({ deleteAll: protectedProcedure @@ -20,7 +18,7 @@ export const sessionRouter = createTRPCRouter({ }); if (!!sessions) { - await deleteFromCache(client, env.APP_ENV, `kv_userlist_admin`); + await redis.del(`${env.APP_ENV}_kv_userlist_admin`); } return !!sessions; diff --git a/src/server/api/routers/user.ts b/src/server/api/routers/user.ts index 2eb1628..f948d73 100644 --- a/src/server/api/routers/user.ts +++ b/src/server/api/routers/user.ts @@ -6,22 +6,14 @@ import type { Role } from "~/utils/types"; import { Resend } from "resend"; import { Goodbye } from "~/components/templates/Goodbye"; -import { - cacheClient, - writeToCache, - fetchFromCache, - deleteFromCache, -} from "redicache-ts"; +import { redis } from "~/server/redis"; -const client = cacheClient(env.REDIS_URL); const resend = new Resend(process.env.RESEND_API_KEY); export const userRouter = createTRPCRouter({ countAll: protectedProcedure.query(async ({ ctx }) => { - const cachedResult = await fetchFromCache( - client, - env.APP_ENV, - `kv_usercount_admin` + const cachedResult = await redis.get( + `${env.APP_ENV}_kv_usercount_admin` ); if (cachedResult) { @@ -29,13 +21,7 @@ export const userRouter = createTRPCRouter({ } else { const usersCount = await ctx.prisma.user.count(); - await writeToCache( - client, - env.APP_ENV, - `kv_usercount_admin`, - usersCount, - Number(env.REDIS_TTL) - ); + await redis.set(`${env.APP_ENV}_kv_usercount_admin`, usersCount); return usersCount; } @@ -60,7 +46,7 @@ export const userRouter = createTRPCRouter({ }); }), getAll: protectedProcedure.query(async ({ ctx }) => { - const cachedResult = await fetchFromCache< + const cachedResult = await redis.get< { accounts: { provider: string; @@ -74,7 +60,7 @@ export const userRouter = createTRPCRouter({ name: string | null; email: string | null; }[] - >(client, env.APP_ENV, `kv_userlist_admin`); + >(`${env.APP_ENV}_kv_userlist_admin`); if (cachedResult) { return cachedResult.map((user) => { @@ -104,13 +90,7 @@ export const userRouter = createTRPCRouter({ }, }); - await writeToCache( - client, - env.APP_ENV, - `kv_userlist_admin`, - JSON.stringify(users), - Number(env.REDIS_TTL) - ); + await redis.set(`${env.APP_ENV}_kv_userlist_admin`, users); return users; } @@ -147,8 +127,9 @@ export const userRouter = createTRPCRouter({ //@ts-ignore: IDK why this doesn't work... 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; @@ -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; }), diff --git a/src/server/api/routers/vote.ts b/src/server/api/routers/vote.ts index 82504a5..a11b938 100644 --- a/src/server/api/routers/vote.ts +++ b/src/server/api/routers/vote.ts @@ -2,23 +2,14 @@ import { z } from "zod"; import { publishToChannel } from "~/server/ably"; import { createTRPCRouter, protectedProcedure } from "~/server/api/trpc"; -import { - cacheClient, - writeToCache, - fetchFromCache, - deleteFromCache, -} from "redicache-ts"; import { env } from "~/env.mjs"; import type { Room } from "@prisma/client"; - -const client = cacheClient(env.REDIS_URL); +import { redis } from "~/server/redis"; export const voteRouter = createTRPCRouter({ countAll: protectedProcedure.query(async ({ ctx }) => { - const cachedResult = await fetchFromCache( - client, - env.APP_ENV, - `kv_votecount_admin` + const cachedResult = await redis.get( + `${env.APP_ENV}_kv_votecount_admin` ); if (cachedResult) { @@ -26,13 +17,7 @@ export const voteRouter = createTRPCRouter({ } else { const votesCount = await ctx.prisma.vote.count(); - await writeToCache( - client, - env.APP_ENV, - `kv_votecount_admin`, - votesCount, - Number(env.REDIS_TTL) - ); + await redis.set(`${env.APP_ENV}_kv_votecount_admin`, votesCount); return votesCount; } @@ -40,7 +25,7 @@ export const voteRouter = createTRPCRouter({ getAllByRoomId: protectedProcedure .input(z.object({ roomId: z.string() })) .query(async ({ ctx, input }) => { - const cachedResult = await fetchFromCache< + const cachedResult = await redis.get< { value: string; room: Room; @@ -52,7 +37,7 @@ export const voteRouter = createTRPCRouter({ }; roomId: string; }[] - >(client, env.APP_ENV, `kv_votes_${input.roomId}`); + >(`${env.APP_ENV}_kv_votes_${input.roomId}`); if (cachedResult) { return cachedResult; @@ -76,12 +61,9 @@ export const voteRouter = createTRPCRouter({ }, }); - await writeToCache( - client, - env.APP_ENV, - `kv_votes_${input.roomId}`, - JSON.stringify(votesByRoomId), - Number(Number(env.REDIS_TTL)) + await redis.set( + `${env.APP_ENV}_kv_votes_${input.roomId}`, + votesByRoomId ); return votesByRoomId; @@ -121,8 +103,8 @@ export const voteRouter = createTRPCRouter({ }); if (vote) { - await deleteFromCache(client, env.APP_ENV, `kv_votecount_admin`); - await deleteFromCache(client, env.APP_ENV, `kv_votes_${input.roomId}`); + await redis.del(`${env.APP_ENV}_kv_votecount_admin`); + await redis.del(`${env.APP_ENV}_kv_votes_${input.roomId}`); await publishToChannel(`${vote.roomId}`, "VOTE_UPDATE", "UPDATE"); } diff --git a/src/server/auth.ts b/src/server/auth.ts index d388c99..2e28f7f 100644 --- a/src/server/auth.ts +++ b/src/server/auth.ts @@ -12,9 +12,8 @@ import { prisma } from "~/server/db"; import type { Role } from "~/utils/types"; import { Resend } from "resend"; 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); /** @@ -62,15 +61,15 @@ export const authOptions: NextAuthOptions = { react: Welcome({ name: user.name }), }); - await deleteFromCache(client, env.APP_ENV, `kv_userlist_admin`); - await deleteFromCache(client, env.APP_ENV, `kv_usercount_admin`); + await redis.del(`${env.APP_ENV}_kv_userlist_admin`); + await redis.del(`${env.APP_ENV}_kv_usercount_admin`); } }, async signIn({}) { - await deleteFromCache(client, env.APP_ENV, `kv_userlist_admin`); + await redis.del(`${env.APP_ENV}_kv_userlist_admin`); }, 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... diff --git a/src/server/redis.ts b/src/server/redis.ts new file mode 100644 index 0000000..e269f3d --- /dev/null +++ b/src/server/redis.ts @@ -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, +});