diff --git a/drizzle.config.ts b/drizzle.config.ts index ee7d05a..89db975 100644 --- a/drizzle.config.ts +++ b/drizzle.config.ts @@ -4,14 +4,26 @@ import { env } from "@/env"; export default { schema: "./src/server/db/schema.ts", - driver: "mysql2", dbCredentials: { - user: env.DATABASE_USER, - host: env.DATABASE_HOST, - port: +env.DATABASE_PORT, - password: env.DATABASE_PASSWORD, - database: env.DATABASE_NAME, + connectionString: env.DATABASE_URL, }, + driver: "pg", tablesFilter: ["kujo205-blog_*"], out: "./src/server/db", } satisfies Config; + +/* +* import "dotenv/config"; +import type { Config } from "drizzle-kit"; + +if (!process.env.DATABASE_URL) { + throw new Error("DATABASE_URL is missing"); +} + +export default { + schema: "./src/schema.ts", + out: "./drizzle", + connectionString: process.env.DATABASE_URL, +} satisfies Config; +* +* */ diff --git a/next.config.mjs b/next.config.mjs index bb33acb..5551df7 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -9,9 +9,8 @@ import createMDX from '@next/mdx' /** @type {import('next').NextConfig} */ const nextConfig = { - // Configure `pageExtensions`` to include MDX files pageExtensions: ['js', 'jsx', 'md', 'mdx', 'ts', 'tsx'], - // Optionally, add any other Next.js config below + output:"standalone" } const withMDX = createMDX({ diff --git a/package.json b/package.json index 3e374d1..409a564 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "type": "module", "scripts": { "build": "next build", - "db:push": "drizzle-kit push:mysql", + "db:migrate": "tsx src/scripts/migrate.ts", "db:studio": "drizzle-kit studio", "db:generate-migration": "drizzle-kit generate:mysql", "dev": "next dev", @@ -47,6 +47,7 @@ "next-auth": "^4.24.5", "next-mdx-remote": "^4.4.1", "next-themes": "^0.3.0", + "postgres": "^3.4.4", "prismjs": "^1.29.0", "react": "18.2.0", "react-dom": "18.2.0", @@ -78,12 +79,13 @@ "drizzle-kit": "^0.20.9", "eslint": "^8.54.0", "eslint-config-next": "^14.0.4", - "mysql2": "^3.6.1", "postcss": "^8.4.31", "prettier": "^3.1.0", "prettier-plugin-tailwindcss": "^0.5.7", "tailwindcss": "^3.3.5", "ts-node": "^10.9.2", + "tsconfig-paths": "^4.2.0", + "tsx": "^4.7.2", "typescript": "^5.1.6" }, "ct3aMetadata": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b63292c..af5c4fb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -88,7 +88,7 @@ dependencies: version: 16.4.1 drizzle-orm: specifier: ^0.29.3 - version: 0.29.3(@planetscale/database@1.13.0)(@types/react@18.2.48)(mysql2@3.7.0)(react@18.2.0) + version: 0.29.3(@planetscale/database@1.13.0)(@types/react@18.2.48)(postgres@3.4.4)(react@18.2.0) embla-carousel-react: specifier: 8.0.0-rc21 version: 8.0.0-rc21(react@18.2.0) @@ -107,6 +107,9 @@ dependencies: next-themes: specifier: ^0.3.0 version: 0.3.0(react-dom@18.2.0)(react@18.2.0) + postgres: + specifier: ^3.4.4 + version: 3.4.4 prismjs: specifier: ^1.29.0 version: 1.29.0 @@ -196,9 +199,6 @@ devDependencies: eslint-config-next: specifier: ^14.0.4 version: 14.0.4(eslint@8.56.0)(typescript@5.3.3) - mysql2: - specifier: ^3.6.1 - version: 3.7.0 postcss: specifier: ^8.4.31 version: 8.4.33 @@ -214,6 +214,12 @@ devDependencies: ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@18.19.7)(typescript@5.3.3) + tsconfig-paths: + specifier: ^4.2.0 + version: 4.2.0 + tsx: + specifier: ^4.7.2 + version: 4.7.2 typescript: specifier: ^5.1.6 version: 5.3.3 @@ -4005,10 +4011,6 @@ packages: engines: {node: '>=0.4.0'} dev: false - /denque@2.1.0: - resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} - engines: {node: '>=0.10'} - /dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} @@ -4099,7 +4101,7 @@ packages: - supports-color dev: true - /drizzle-orm@0.29.3(@planetscale/database@1.13.0)(@types/react@18.2.48)(mysql2@3.7.0)(react@18.2.0): + /drizzle-orm@0.29.3(@planetscale/database@1.13.0)(@types/react@18.2.48)(postgres@3.4.4)(react@18.2.0): resolution: {integrity: sha512-uSE027csliGSGYD0pqtM+SAQATMREb3eSM/U8s6r+Y0RFwTKwftnwwSkqx3oS65UBgqDOM0gMTl5UGNpt6lW0A==} peerDependencies: '@aws-sdk/client-rds-data': '>=3' @@ -4172,7 +4174,7 @@ packages: dependencies: '@planetscale/database': 1.13.0 '@types/react': 18.2.48 - mysql2: 3.7.0 + postgres: 3.4.4 react: 18.2.0 dev: false @@ -4963,11 +4965,6 @@ packages: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} dev: true - /generate-function@2.3.1: - resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} - dependencies: - is-property: 1.0.2 - /get-intrinsic@1.2.2: resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} dependencies: @@ -5287,12 +5284,6 @@ packages: resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} dev: true - /iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - dependencies: - safer-buffer: 2.1.2 - /ignore@5.3.0: resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} engines: {node: '>= 4'} @@ -5482,9 +5473,6 @@ packages: resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} dev: true - /is-property@1.0.2: - resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==} - /is-reference@3.0.2: resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} dependencies: @@ -5637,6 +5625,12 @@ packages: minimist: 1.2.8 dev: true + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + /jsx-ast-utils@3.3.5: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} @@ -5716,9 +5710,6 @@ packages: resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} dev: true - /long@5.2.3: - resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} - /longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} dev: false @@ -5739,14 +5730,6 @@ packages: dependencies: yallist: 4.0.0 - /lru-cache@7.18.3: - resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} - engines: {node: '>=12'} - - /lru-cache@8.0.5: - resolution: {integrity: sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==} - engines: {node: '>=16.14'} - /lru-queue@0.1.0: resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} dependencies: @@ -6763,19 +6746,6 @@ packages: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} dev: true - /mysql2@3.7.0: - resolution: {integrity: sha512-c45jA3Jc1X8yJKzrWu1GpplBKGwv/wIV6ITZTlCSY7npF2YfJR+6nMP5e+NTQhUeJPSyOQAbGDCGEHbAl8HN9w==} - engines: {node: '>= 8.0'} - dependencies: - denque: 2.1.0 - generate-function: 2.3.1 - iconv-lite: 0.6.3 - long: 5.2.3 - lru-cache: 8.0.5 - named-placeholders: 1.1.3 - seq-queue: 0.0.5 - sqlstring: 2.3.3 - /mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} dependencies: @@ -6783,12 +6753,6 @@ packages: object-assign: 4.1.1 thenify-all: 1.6.0 - /named-placeholders@1.1.3: - resolution: {integrity: sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==} - engines: {node: '>=12.0.0'} - dependencies: - lru-cache: 7.18.3 - /nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -7219,6 +7183,11 @@ packages: picocolors: 1.0.0 source-map-js: 1.0.2 + /postgres@3.4.4: + resolution: {integrity: sha512-IbyN+9KslkqcXa8AO9fxpk97PA4pzewvpi2B3Dwy9u4zpV32QicaEdgmF3eSQUzdRk7ttDHQejNgAEr4XoeH4A==} + engines: {node: '>=12'} + dev: false + /preact-render-to-string@5.2.3(preact@10.11.3): resolution: {integrity: sha512-aPDxUn5o3GhWdtJtW0svRC2SS/l8D9MAgo2+AWml+BhDImb27ALf04Q2d+AHqUUOc6RdSXFIBVa2gxzgMKgtZA==} peerDependencies: @@ -7666,9 +7635,6 @@ packages: is-regex: 1.1.4 dev: true - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - /sandwich-stream@2.0.2: resolution: {integrity: sha512-jLYV0DORrzY3xaz/S9ydJL6Iz7essZeAfnAavsJ+zsJGZ1MOnsS52yRjU3uF3pJa/lla7+wisp//fxOwOH8SKQ==} engines: {node: '>= 0.10'} @@ -7702,9 +7668,6 @@ packages: lru-cache: 6.0.0 dev: true - /seq-queue@0.0.5: - resolution: {integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==} - /serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} dependencies: @@ -7799,10 +7762,6 @@ packages: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} dev: false - /sqlstring@2.3.3: - resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==} - engines: {node: '>= 0.6'} - /streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} @@ -8155,6 +8114,15 @@ packages: strip-bom: 3.0.0 dev: true + /tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} + dependencies: + json5: 2.2.3 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: true + /tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: false @@ -8163,6 +8131,17 @@ packages: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} dev: false + /tsx@4.7.2: + resolution: {integrity: sha512-BCNd4kz6fz12fyrgCTEdZHGJ9fWTGeUzXmQysh0RVocDY3h4frk05ZNCXSy4kIenF7y/QnrdiVpTsyNRn6vlAw==} + engines: {node: '>=18.0.0'} + hasBin: true + dependencies: + esbuild: 0.19.11 + get-tsconfig: 4.7.2 + optionalDependencies: + fsevents: 2.3.3 + dev: true + /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} diff --git a/src/app/posts/create/page.tsx b/src/app/posts/create/page.tsx index cd70dfe..eb398ce 100644 --- a/src/app/posts/create/page.tsx +++ b/src/app/posts/create/page.tsx @@ -14,7 +14,7 @@ export default async function Page({ const data = await api.post.getPostValuesFromSession.query(); // @ts-expect-error: types suck const defaultFormValues = data[0].postFormValues as TPostSchema; - const content = defaultFormValues.content || ""; + const content = defaultFormValues?.content || ""; return (
diff --git a/src/components/mdPreview/components/index.tsx b/src/components/mdPreview/components/index.tsx index 51116a7..3a5191e 100644 --- a/src/components/mdPreview/components/index.tsx +++ b/src/components/mdPreview/components/index.tsx @@ -1,10 +1,14 @@ import type { MDXRemoteProps } from "next-mdx-remote/rsc"; import { Pre } from "./Pre"; +import { withPaperClipAnchor } from "./withPaperClipAnchor"; type TComponents = MDXRemoteProps["components"]; const index: TComponents = { pre: Pre, + h1: (props) => { + return

; + }, }; export default index; diff --git a/src/components/mdPreview/components/withPaperClipAnchor.tsx b/src/components/mdPreview/components/withPaperClipAnchor.tsx new file mode 100644 index 0000000..d4630ed --- /dev/null +++ b/src/components/mdPreview/components/withPaperClipAnchor.tsx @@ -0,0 +1,16 @@ +"use client"; + +import { PaperclipIcon } from "lucide-react"; + +export function withPaperClipAnchor

( + Component: React.ComponentType

, +) { + return function WithPaperClipAnchor(props: P) { + return ( +

+ + +
+ ); + }; +} diff --git a/src/env.js b/src/env.js index 1fe9590..5267c4d 100644 --- a/src/env.js +++ b/src/env.js @@ -7,11 +7,7 @@ export const env = createEnv({ * isn't built with invalid env vars. */ server: { - DATABASE_NAME: z.string(), - DATABASE_USER: z.string(), - DATABASE_HOST: z.string(), - DATABASE_PORT: z.string(), - DATABASE_PASSWORD: z.string().optional(), + DATABASE_URL: z.string(), NODE_ENV: z .enum(["development", "test", "production"]) .default("development"), @@ -50,11 +46,7 @@ export const env = createEnv({ * middlewares) or client-side so we need to destruct manually. */ runtimeEnv: { - DATABASE_PASSWORD: process.env.DATABASE_PASSWORD, - DATABASE_PORT: process.env.DATABASE_PORT, - DATABASE_NAME: process.env.DATABASE_NAME, - DATABASE_HOST: process.env.DATABASE_HOST, - DATABASE_USER: process.env.DATABASE_USER, + DATABASE_URL: process.env.DATABASE_URL, NODE_ENV: process.env.NODE_ENV, NEXTAUTH_SECRET: process.env.NEXTAUTH_SECRET, NEXTAUTH_URL: process.env.NEXTAUTH_URL, diff --git a/src/lib/textIntoKebabNotation.ts b/src/lib/textIntoKebabNotation.ts new file mode 100644 index 0000000..266d40c --- /dev/null +++ b/src/lib/textIntoKebabNotation.ts @@ -0,0 +1,3 @@ +export function textIntoKebabNotation(text: string): string { + return text.replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase(); +} diff --git a/src/scripts/migrate.ts b/src/scripts/migrate.ts index feb83c7..84824ca 100644 --- a/src/scripts/migrate.ts +++ b/src/scripts/migrate.ts @@ -1,8 +1,17 @@ import "dotenv/config"; -import { migrate } from "drizzle-orm/mysql2/migrator"; +import { migrate } from "drizzle-orm/postgres-js/migrator"; import { db } from "@/server/db"; -import { connection } from "@/server/db"; -// This will run migrations on the database, skipping the ones already applied -await migrate(db, { migrationsFolder: "./drizzle" }); -// Don't forget to close the connection, otherwise the script will hang -await connection.end(); +import * as process from "node:process"; + +async function dbMigrate() { + try { + console.log("Migrating database..."); + await migrate(db, { migrationsFolder: "src/server/db" }); + console.log("Database migrated successfully!"); + process.exit(0); + } catch (error) { + console.error("Error migrating database:", error); + } +} + +dbMigrate(); diff --git a/src/server/db/0000_reflective_mandroid.sql b/src/server/db/0000_reflective_mandroid.sql deleted file mode 100644 index 6e81711..0000000 --- a/src/server/db/0000_reflective_mandroid.sql +++ /dev/null @@ -1,77 +0,0 @@ -CREATE TABLE `kujo205-blog_account` ( - `userId` varchar(255) NOT NULL, - `type` varchar(255) NOT NULL, - `provider` varchar(255) NOT NULL, - `providerAccountId` varchar(255) NOT NULL, - `refresh_token` varchar(255), - `access_token` varchar(255), - `expires_at` int, - `token_type` varchar(255), - `scope` varchar(255), - `id_token` varchar(2048), - `session_state` varchar(255), - CONSTRAINT `kujo205-blog_account_provider_providerAccountId_pk` PRIMARY KEY(`provider`,`providerAccountId`) -); ---> statement-breakpoint -CREATE TABLE `kujo205-blog_blogPost` ( - `id` bigint AUTO_INCREMENT NOT NULL, - `title` varchar(256), - `content` text, - `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - `updatedAt` timestamp ON UPDATE CURRENT_TIMESTAMP, - `likes` int DEFAULT 0, - `watched` int DEFAULT 0, - CONSTRAINT `kujo205-blog_blogPost_id` PRIMARY KEY(`id`) -); ---> statement-breakpoint -CREATE TABLE `kujo205-blog_blogPostTag` ( - `id` bigint AUTO_INCREMENT NOT NULL, - `blogPostId` bigint NOT NULL, - `tagId` bigint NOT NULL, - CONSTRAINT `kujo205-blog_blogPostTag_id` PRIMARY KEY(`id`) -); ---> statement-breakpoint -CREATE TABLE `kujo205-blog_comment` ( - `id` bigint AUTO_INCREMENT NOT NULL, - `replyTo` bigint, - `content` varchar(5000), - CONSTRAINT `kujo205-blog_comment_id` PRIMARY KEY(`id`) -); ---> statement-breakpoint -CREATE TABLE `kujo205-blog_message` ( - `id` bigint AUTO_INCREMENT NOT NULL, - `email` varchar(255) NOT NULL, - `name` varchar(255) NOT NULL, - `message` text NOT NULL, - CONSTRAINT `kujo205-blog_message_id` PRIMARY KEY(`id`) -); ---> statement-breakpoint -CREATE TABLE `kujo205-blog_postTag` ( - `id` bigint AUTO_INCREMENT NOT NULL, - `name` varchar(255), - CONSTRAINT `kujo205-blog_postTag_id` PRIMARY KEY(`id`) -); ---> statement-breakpoint -CREATE TABLE `kujo205-blog_session` ( - `sessionToken` varchar(255) NOT NULL, - `userId` varchar(255) NOT NULL, - `expires` timestamp NOT NULL, - CONSTRAINT `kujo205-blog_session_sessionToken` PRIMARY KEY(`sessionToken`) -); ---> statement-breakpoint -CREATE TABLE `kujo205-blog_user` ( - `id` varchar(255) NOT NULL, - `name` varchar(255), - `email` varchar(255) NOT NULL, - `emailVerified` timestamp(3) DEFAULT (now()), - `image` varchar(255), - `role` enum('ADMIN','COMMENTATOR') DEFAULT 'COMMENTATOR', - CONSTRAINT `kujo205-blog_user_id` PRIMARY KEY(`id`) -); ---> statement-breakpoint -CREATE TABLE `kujo205-blog_verificationToken` ( - `identifier` varchar(255) NOT NULL, - `token` varchar(255) NOT NULL, - `expires` timestamp NOT NULL, - CONSTRAINT `kujo205-blog_verificationToken_identifier_token_pk` PRIMARY KEY(`identifier`,`token`) -); diff --git a/src/server/db/0000_tense_komodo.sql b/src/server/db/0000_tense_komodo.sql new file mode 100644 index 0000000..44939c8 --- /dev/null +++ b/src/server/db/0000_tense_komodo.sql @@ -0,0 +1,71 @@ +CREATE TABLE IF NOT EXISTS "kujo205_blog_account" ( + "userId" varchar(255) NOT NULL, + "type" varchar(255) NOT NULL, + "provider" varchar(255) NOT NULL, + "providerAccountId" varchar(255) NOT NULL, + "refresh_token" varchar(255), + "access_token" varchar(255), + "expires_at" integer, + "token_type" varchar(255), + "scope" varchar(255), + "id_token" varchar(2048), + "session_state" varchar(255), + CONSTRAINT "kujo205_blog_account_provider_providerAccountId_pk" PRIMARY KEY("provider","providerAccountId") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "kujo205_blog_postTag" ( + "id" serial PRIMARY KEY NOT NULL, + "name" varchar(255) +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "kujo205_blog_blogPost" ( + "id" serial PRIMARY KEY NOT NULL, + "title" varchar(256), + "content" text, + "created_at" timestamp DEFAULT now(), + "updated_at" timestamp DEFAULT now(), + "likes" integer DEFAULT 0, + "watched" integer DEFAULT 0 +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "kujo205_blog_comment" ( + "id" serial PRIMARY KEY NOT NULL, + "replyTo" varchar(255), + "content" text +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "kujo205_blog_message" ( + "id" serial PRIMARY KEY NOT NULL, + "email" varchar(255) NOT NULL, + "name" varchar(255) NOT NULL, + "message" text NOT NULL +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "kujo205_blog_session" ( + "sessionToken" varchar(255) PRIMARY KEY NOT NULL, + "userId" varchar(255) NOT NULL, + "expires" timestamp NOT NULL, + "postFormValues" jsonb +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "kujo205_blog_tagsToBlogPosts" ( + "id" serial PRIMARY KEY NOT NULL, + "blogPostId" varchar(255) NOT NULL, + "tagId" varchar(255) NOT NULL +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "kujo205_blog_user" ( + "id" varchar(255) PRIMARY KEY NOT NULL, + "name" varchar(255), + "email" varchar(255) NOT NULL, + "emailVerified" timestamp DEFAULT now(), + "image" varchar(255), + "role" varchar(20) DEFAULT 'COMMENTATOR' +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "kujo205_blog_verificationToken" ( + "identifier" varchar(255) NOT NULL, + "token" varchar(255) NOT NULL, + "expires" timestamp NOT NULL, + CONSTRAINT "kujo205_blog_verificationToken_identifier_token_pk" PRIMARY KEY("identifier","token") +); diff --git a/src/server/db/0001_needy_black_knight.sql b/src/server/db/0001_needy_black_knight.sql deleted file mode 100644 index bbda1b3..0000000 --- a/src/server/db/0001_needy_black_knight.sql +++ /dev/null @@ -1,9 +0,0 @@ -CREATE TABLE `kujo205-blog_tagsToBlogPosts` ( - `id` bigint AUTO_INCREMENT NOT NULL, - `blogPostId` bigint NOT NULL, - `tagId` bigint NOT NULL, - CONSTRAINT `kujo205-blog_tagsToBlogPosts_id` PRIMARY KEY(`id`) -); ---> statement-breakpoint -DROP TABLE `kujo205-blog_blogPostTag`;--> statement-breakpoint -ALTER TABLE `kujo205-blog_session` ADD `postFormValues` json; \ No newline at end of file diff --git a/src/server/db/index.ts b/src/server/db/index.ts index 8ccb460..b59764d 100644 --- a/src/server/db/index.ts +++ b/src/server/db/index.ts @@ -1,14 +1,10 @@ -import { drizzle } from "drizzle-orm/mysql2"; -import mysql from "mysql2"; - +import { drizzle } from "drizzle-orm/postgres-js"; +import postgres from "postgres"; +import * as schema from "./schema"; import { env } from "@/env"; -export const connection = mysql.createConnection({ - host: env.DATABASE_HOST, - user: env.DATABASE_USER, - database: env.DATABASE_NAME, - port: +env.DATABASE_PORT, - password: env.DATABASE_PASSWORD, +export const connection = postgres(env.DATABASE_URL, { + prepare: false, }); -export const db = drizzle(connection); +export const db = drizzle(connection, { schema }); diff --git a/src/server/db/meta/0000_snapshot.json b/src/server/db/meta/0000_snapshot.json index 55343d2..e9a8b39 100644 --- a/src/server/db/meta/0000_snapshot.json +++ b/src/server/db/meta/0000_snapshot.json @@ -1,95 +1,85 @@ { - "version": "5", - "dialect": "mysql", - "id": "06f12a76-4924-45a9-9552-46defdad8164", + "id": "35eb1128-b3e2-46c0-aaf8-ec520925424f", "prevId": "00000000-0000-0000-0000-000000000000", + "version": "5", + "dialect": "pg", "tables": { - "kujo205-blog_account": { - "name": "kujo205-blog_account", + "kujo205_blog_account": { + "name": "kujo205_blog_account", + "schema": "", "columns": { "userId": { "name": "userId", "type": "varchar(255)", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "type": { "name": "type", "type": "varchar(255)", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "provider": { "name": "provider", "type": "varchar(255)", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "providerAccountId": { "name": "providerAccountId", "type": "varchar(255)", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "refresh_token": { "name": "refresh_token", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "access_token": { "name": "access_token", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "expires_at": { "name": "expires_at", - "type": "int", + "type": "integer", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "token_type": { "name": "token_type", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "scope": { "name": "scope", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "id_token": { "name": "id_token", "type": "varchar(2048)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "session_state": { "name": "session_state", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false } }, "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": { - "kujo205-blog_account_provider_providerAccountId_pk": { - "name": "kujo205-blog_account_provider_providerAccountId_pk", + "kujo205_blog_account_provider_providerAccountId_pk": { + "name": "kujo205_blog_account_provider_providerAccountId_pk", "columns": [ "provider", "providerAccountId" @@ -98,350 +88,284 @@ }, "uniqueConstraints": {} }, - "kujo205-blog_blogPost": { - "name": "kujo205-blog_blogPost", + "kujo205_blog_postTag": { + "name": "kujo205_blog_postTag", + "schema": "", "columns": { "id": { "name": "id", - "type": "bigint", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", "primaryKey": false, - "notNull": true, - "autoincrement": true + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "kujo205_blog_blogPost": { + "name": "kujo205_blog_blogPost", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true }, "title": { "name": "title", "type": "varchar(256)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "content": { "name": "content", "type": "text", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "created_at": { "name": "created_at", "type": "timestamp", "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "CURRENT_TIMESTAMP" + "notNull": false, + "default": "now()" }, - "updatedAt": { - "name": "updatedAt", + "updated_at": { + "name": "updated_at", "type": "timestamp", "primaryKey": false, "notNull": false, - "autoincrement": false, - "onUpdate": true + "default": "now()" }, "likes": { "name": "likes", - "type": "int", + "type": "integer", "primaryKey": false, "notNull": false, - "autoincrement": false, "default": 0 }, "watched": { "name": "watched", - "type": "int", + "type": "integer", "primaryKey": false, "notNull": false, - "autoincrement": false, "default": 0 } }, "indexes": {}, "foreignKeys": {}, - "compositePrimaryKeys": { - "kujo205-blog_blogPost_id": { - "name": "kujo205-blog_blogPost_id", - "columns": [ - "id" - ] - } - }, + "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "kujo205-blog_blogPostTag": { - "name": "kujo205-blog_blogPostTag", + "kujo205_blog_comment": { + "name": "kujo205_blog_comment", + "schema": "", "columns": { "id": { "name": "id", - "type": "bigint", - "primaryKey": false, - "notNull": true, - "autoincrement": true - }, - "blogPostId": { - "name": "blogPostId", - "type": "bigint", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "tagId": { - "name": "tagId", - "type": "bigint", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": { - "kujo205-blog_blogPostTag_id": { - "name": "kujo205-blog_blogPostTag_id", - "columns": [ - "id" - ] - } - }, - "uniqueConstraints": {} - }, - "kujo205-blog_comment": { - "name": "kujo205-blog_comment", - "columns": { - "id": { - "name": "id", - "type": "bigint", - "primaryKey": false, - "notNull": true, - "autoincrement": true + "type": "serial", + "primaryKey": true, + "notNull": true }, "replyTo": { "name": "replyTo", - "type": "bigint", + "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "content": { "name": "content", - "type": "varchar(5000)", + "type": "text", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false } }, "indexes": {}, "foreignKeys": {}, - "compositePrimaryKeys": { - "kujo205-blog_comment_id": { - "name": "kujo205-blog_comment_id", - "columns": [ - "id" - ] - } - }, + "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "kujo205-blog_message": { - "name": "kujo205-blog_message", + "kujo205_blog_message": { + "name": "kujo205_blog_message", + "schema": "", "columns": { "id": { "name": "id", - "type": "bigint", - "primaryKey": false, - "notNull": true, - "autoincrement": true + "type": "serial", + "primaryKey": true, + "notNull": true }, "email": { "name": "email", "type": "varchar(255)", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "name": { "name": "name", "type": "varchar(255)", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "message": { "name": "message", "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true } }, "indexes": {}, "foreignKeys": {}, - "compositePrimaryKeys": { - "kujo205-blog_message_id": { - "name": "kujo205-blog_message_id", - "columns": [ - "id" - ] - } - }, + "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "kujo205-blog_postTag": { - "name": "kujo205-blog_postTag", - "columns": { - "id": { - "name": "id", - "type": "bigint", - "primaryKey": false, - "notNull": true, - "autoincrement": true - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": { - "kujo205-blog_postTag_id": { - "name": "kujo205-blog_postTag_id", - "columns": [ - "id" - ] - } - }, - "uniqueConstraints": {} - }, - "kujo205-blog_session": { - "name": "kujo205-blog_session", + "kujo205_blog_session": { + "name": "kujo205_blog_session", + "schema": "", "columns": { "sessionToken": { "name": "sessionToken", "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false + "primaryKey": true, + "notNull": true }, "userId": { "name": "userId", "type": "varchar(255)", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "expires": { "name": "expires", "type": "timestamp", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true + }, + "postFormValues": { + "name": "postFormValues", + "type": "jsonb", + "primaryKey": false, + "notNull": false } }, "indexes": {}, "foreignKeys": {}, - "compositePrimaryKeys": { - "kujo205-blog_session_sessionToken": { - "name": "kujo205-blog_session_sessionToken", - "columns": [ - "sessionToken" - ] + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "kujo205_blog_tagsToBlogPosts": { + "name": "kujo205_blog_tagsToBlogPosts", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "blogPostId": { + "name": "blogPostId", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "tagId": { + "name": "tagId", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true } }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "kujo205-blog_user": { - "name": "kujo205-blog_user", + "kujo205_blog_user": { + "name": "kujo205_blog_user", + "schema": "", "columns": { "id": { "name": "id", "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false + "primaryKey": true, + "notNull": true }, "name": { "name": "name", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "email": { "name": "email", "type": "varchar(255)", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "emailVerified": { "name": "emailVerified", - "type": "timestamp(3)", + "type": "timestamp", "primaryKey": false, "notNull": false, - "autoincrement": false, - "default": "(now())" + "default": "now()" }, "image": { "name": "image", "type": "varchar(255)", "primaryKey": false, - "notNull": false, - "autoincrement": false + "notNull": false }, "role": { "name": "role", - "type": "enum('ADMIN','COMMENTATOR')", + "type": "varchar(20)", "primaryKey": false, "notNull": false, - "autoincrement": false, "default": "'COMMENTATOR'" } }, "indexes": {}, "foreignKeys": {}, - "compositePrimaryKeys": { - "kujo205-blog_user_id": { - "name": "kujo205-blog_user_id", - "columns": [ - "id" - ] - } - }, + "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "kujo205-blog_verificationToken": { - "name": "kujo205-blog_verificationToken", + "kujo205_blog_verificationToken": { + "name": "kujo205_blog_verificationToken", + "schema": "", "columns": { "identifier": { "name": "identifier", "type": "varchar(255)", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "token": { "name": "token", "type": "varchar(255)", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true }, "expires": { "name": "expires", "type": "timestamp", "primaryKey": false, - "notNull": true, - "autoincrement": false + "notNull": true } }, "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": { - "kujo205-blog_verificationToken_identifier_token_pk": { - "name": "kujo205-blog_verificationToken_identifier_token_pk", + "kujo205_blog_verificationToken_identifier_token_pk": { + "name": "kujo205_blog_verificationToken_identifier_token_pk", "columns": [ "identifier", "token" @@ -451,10 +375,11 @@ "uniqueConstraints": {} } }, + "enums": {}, "schemas": {}, "_meta": { + "columns": {}, "schemas": {}, - "tables": {}, - "columns": {} + "tables": {} } } \ No newline at end of file diff --git a/src/server/db/meta/0001_snapshot.json b/src/server/db/meta/0001_snapshot.json deleted file mode 100644 index acb1640..0000000 --- a/src/server/db/meta/0001_snapshot.json +++ /dev/null @@ -1,467 +0,0 @@ -{ - "version": "5", - "dialect": "mysql", - "id": "bfd98c5e-7bc2-4d37-af49-f7ad142b1a9b", - "prevId": "06f12a76-4924-45a9-9552-46defdad8164", - "tables": { - "kujo205-blog_account": { - "name": "kujo205-blog_account", - "columns": { - "userId": { - "name": "userId", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "type": { - "name": "type", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "provider": { - "name": "provider", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "providerAccountId": { - "name": "providerAccountId", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "refresh_token": { - "name": "refresh_token", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "access_token": { - "name": "access_token", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "expires_at": { - "name": "expires_at", - "type": "int", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "token_type": { - "name": "token_type", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "scope": { - "name": "scope", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "id_token": { - "name": "id_token", - "type": "varchar(2048)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "session_state": { - "name": "session_state", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": { - "kujo205-blog_account_provider_providerAccountId_pk": { - "name": "kujo205-blog_account_provider_providerAccountId_pk", - "columns": [ - "provider", - "providerAccountId" - ] - } - }, - "uniqueConstraints": {} - }, - "kujo205-blog_postTag": { - "name": "kujo205-blog_postTag", - "columns": { - "id": { - "name": "id", - "type": "bigint", - "primaryKey": false, - "notNull": true, - "autoincrement": true - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": { - "kujo205-blog_postTag_id": { - "name": "kujo205-blog_postTag_id", - "columns": [ - "id" - ] - } - }, - "uniqueConstraints": {} - }, - "kujo205-blog_blogPost": { - "name": "kujo205-blog_blogPost", - "columns": { - "id": { - "name": "id", - "type": "bigint", - "primaryKey": false, - "notNull": true, - "autoincrement": true - }, - "title": { - "name": "title", - "type": "varchar(256)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "content": { - "name": "content", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "CURRENT_TIMESTAMP" - }, - "updatedAt": { - "name": "updatedAt", - "type": "timestamp", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "onUpdate": true - }, - "likes": { - "name": "likes", - "type": "int", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 0 - }, - "watched": { - "name": "watched", - "type": "int", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 0 - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": { - "kujo205-blog_blogPost_id": { - "name": "kujo205-blog_blogPost_id", - "columns": [ - "id" - ] - } - }, - "uniqueConstraints": {} - }, - "kujo205-blog_comment": { - "name": "kujo205-blog_comment", - "columns": { - "id": { - "name": "id", - "type": "bigint", - "primaryKey": false, - "notNull": true, - "autoincrement": true - }, - "replyTo": { - "name": "replyTo", - "type": "bigint", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "content": { - "name": "content", - "type": "varchar(5000)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": { - "kujo205-blog_comment_id": { - "name": "kujo205-blog_comment_id", - "columns": [ - "id" - ] - } - }, - "uniqueConstraints": {} - }, - "kujo205-blog_message": { - "name": "kujo205-blog_message", - "columns": { - "id": { - "name": "id", - "type": "bigint", - "primaryKey": false, - "notNull": true, - "autoincrement": true - }, - "email": { - "name": "email", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "message": { - "name": "message", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": { - "kujo205-blog_message_id": { - "name": "kujo205-blog_message_id", - "columns": [ - "id" - ] - } - }, - "uniqueConstraints": {} - }, - "kujo205-blog_session": { - "name": "kujo205-blog_session", - "columns": { - "sessionToken": { - "name": "sessionToken", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "userId": { - "name": "userId", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "expires": { - "name": "expires", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "postFormValues": { - "name": "postFormValues", - "type": "json", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": { - "kujo205-blog_session_sessionToken": { - "name": "kujo205-blog_session_sessionToken", - "columns": [ - "sessionToken" - ] - } - }, - "uniqueConstraints": {} - }, - "kujo205-blog_tagsToBlogPosts": { - "name": "kujo205-blog_tagsToBlogPosts", - "columns": { - "id": { - "name": "id", - "type": "bigint", - "primaryKey": false, - "notNull": true, - "autoincrement": true - }, - "blogPostId": { - "name": "blogPostId", - "type": "bigint", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "tagId": { - "name": "tagId", - "type": "bigint", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": { - "kujo205-blog_tagsToBlogPosts_id": { - "name": "kujo205-blog_tagsToBlogPosts_id", - "columns": [ - "id" - ] - } - }, - "uniqueConstraints": {} - }, - "kujo205-blog_user": { - "name": "kujo205-blog_user", - "columns": { - "id": { - "name": "id", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "email": { - "name": "email", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "emailVerified": { - "name": "emailVerified", - "type": "timestamp(3)", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": "(now())" - }, - "image": { - "name": "image", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "role": { - "name": "role", - "type": "enum('ADMIN','COMMENTATOR')", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": "'COMMENTATOR'" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": { - "kujo205-blog_user_id": { - "name": "kujo205-blog_user_id", - "columns": [ - "id" - ] - } - }, - "uniqueConstraints": {} - }, - "kujo205-blog_verificationToken": { - "name": "kujo205-blog_verificationToken", - "columns": { - "identifier": { - "name": "identifier", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "token": { - "name": "token", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "expires": { - "name": "expires", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": { - "kujo205-blog_verificationToken_identifier_token_pk": { - "name": "kujo205-blog_verificationToken_identifier_token_pk", - "columns": [ - "identifier", - "token" - ] - } - }, - "uniqueConstraints": {} - } - }, - "schemas": {}, - "_meta": { - "schemas": {}, - "tables": {}, - "columns": {} - } -} \ No newline at end of file diff --git a/src/server/db/meta/_journal.json b/src/server/db/meta/_journal.json index 5dc5c5e..a17e05b 100644 --- a/src/server/db/meta/_journal.json +++ b/src/server/db/meta/_journal.json @@ -5,15 +5,8 @@ { "idx": 0, "version": "5", - "when": 1706654245656, - "tag": "0000_reflective_mandroid", - "breakpoints": true - }, - { - "idx": 1, - "version": "5", - "when": 1713342274204, - "tag": "0001_needy_black_knight", + "when": 1713975585504, + "tag": "0000_tense_komodo", "breakpoints": true } ] diff --git a/src/server/db/schema.ts b/src/server/db/schema.ts index c97f1fe..5f5b302 100644 --- a/src/server/db/schema.ts +++ b/src/server/db/schema.ts @@ -1,29 +1,24 @@ -import { relations, sql } from "drizzle-orm"; +import { relations } from "drizzle-orm"; import { - bigint, - int, - mysqlTableCreator, - primaryKey, + integer, text, timestamp, varchar, - mysqlEnum, - json, -} from "drizzle-orm/mysql-core"; -import { type AdapterAccount } from "next-auth/adapters"; + jsonb, + pgTableCreator, + serial, + primaryKey, +} from "drizzle-orm/pg-core"; -export const mysqlTable = mysqlTableCreator((name) => `kujo205-blog_${name}`); +export const pgTable = pgTableCreator((name) => `kujo205_blog_${name}`); -export const users = mysqlTable("user", { +export const users = pgTable("user", { id: varchar("id", { length: 255 }).notNull().primaryKey(), name: varchar("name", { length: 255 }), email: varchar("email", { length: 255 }).notNull(), - emailVerified: timestamp("emailVerified", { - mode: "date", - fsp: 3, - }).defaultNow(), + emailVerified: timestamp("emailVerified").defaultNow(), image: varchar("image", { length: 255 }), - role: mysqlEnum("role", ["ADMIN", "COMMENTATOR"]).default("COMMENTATOR"), + role: varchar("role", { length: 20 }).default("COMMENTATOR"), }); export const usersRelations = relations(users, ({ many }) => ({ @@ -33,37 +28,35 @@ export const usersRelations = relations(users, ({ many }) => ({ verificationTokens: many(verificationTokens), })); -export const blogPosts = mysqlTable("blogPost", { - id: bigint("id", { mode: "number" }).primaryKey().autoincrement(), +export const blogPosts = pgTable("blogPost", { + id: serial("id").primaryKey(), title: varchar("title", { length: 256 }), content: text("content"), - createdAt: timestamp("created_at") - .default(sql`CURRENT_TIMESTAMP`) - .notNull(), - updatedAt: timestamp("updatedAt").onUpdateNow(), - likes: int("likes").default(0), - watched: int("watched").default(0), + createdAt: timestamp("created_at").defaultNow(), + updatedAt: timestamp("updated_at").defaultNow().defaultNow(), + likes: integer("likes").default(0), + watched: integer("watched").default(0), }); -export const blogPostsRelations = relations(blogPosts, ({ one, many }) => ({ +export const blogPostsRelations = relations(blogPosts, ({ many }) => ({ user: many(users), comments: many(comments), tags: many(blogPostTags), })); -export const blogPostTags = mysqlTable("postTag", { - id: bigint("id", { mode: "number" }).primaryKey().autoincrement(), +export const blogPostTags = pgTable("postTag", { + id: serial("id").primaryKey(), name: varchar("name", { length: 255 }), }); -export const blogPoTagsRelations = relations(blogPostTags, ({ many }) => ({ +export const blogPostTagsRelations = relations(blogPostTags, ({ many }) => ({ blogPost: many(blogPosts), })); -export const tagsToBlogPosts = mysqlTable("tagsToBlogPosts", { - id: bigint("id", { mode: "number" }).primaryKey().autoincrement(), - blogPostId: bigint("blogPostId", { mode: "number" }).notNull(), - tagId: bigint("tagId", { mode: "number" }).notNull(), +export const tagsToBlogPosts = pgTable("tagsToBlogPosts", { + id: serial("id").primaryKey(), + blogPostId: varchar("blogPostId", { length: 255 }).notNull(), + tagId: varchar("tagId", { length: 255 }).notNull(), }); export const tagsToBlogPostsRelations = relations( @@ -74,10 +67,10 @@ export const tagsToBlogPostsRelations = relations( }), ); -export const comments = mysqlTable("comment", { - id: bigint("id", { mode: "number" }).primaryKey().autoincrement(), - replyTo: bigint("replyTo", { mode: "number" }), - content: varchar("content", { length: 5000 }), +export const comments = pgTable("comment", { + id: serial("id").primaryKey(), + replyTo: varchar("replyTo", { length: 255 }), + content: text("content"), }); export const commentsRelations = relations(comments, ({ one, many }) => ({ @@ -85,18 +78,16 @@ export const commentsRelations = relations(comments, ({ one, many }) => ({ replyTo: one(comments), })); -export const accounts = mysqlTable( +export const accounts = pgTable( "account", { userId: varchar("userId", { length: 255 }).notNull(), - type: varchar("type", { length: 255 }) - .$type() - .notNull(), + type: varchar("type", { length: 255 }).notNull(), provider: varchar("provider", { length: 255 }).notNull(), providerAccountId: varchar("providerAccountId", { length: 255 }).notNull(), refresh_token: varchar("refresh_token", { length: 255 }), access_token: varchar("access_token", { length: 255 }), - expires_at: int("expires_at"), + expires_at: integer("expires_at"), token_type: varchar("token_type", { length: 255 }), scope: varchar("scope", { length: 255 }), id_token: varchar("id_token", { length: 2048 }), @@ -113,31 +104,31 @@ export const accountsRelations = relations(accounts, ({ one }) => ({ user: one(users), })); -export const sessions = mysqlTable("session", { +export const sessions = pgTable("session", { sessionToken: varchar("sessionToken", { length: 255 }).notNull().primaryKey(), userId: varchar("userId", { length: 255 }).notNull(), - expires: timestamp("expires", { mode: "date" }).notNull(), - postFormValues: json("postFormValues"), + expires: timestamp("expires").notNull(), + postFormValues: jsonb("postFormValues"), }); export const sessionsRelations = relations(sessions, ({ one }) => ({ user: one(users), })); -export const verificationTokens = mysqlTable( +export const verificationTokens = pgTable( "verificationToken", { identifier: varchar("identifier", { length: 255 }).notNull(), token: varchar("token", { length: 255 }).notNull(), - expires: timestamp("expires", { mode: "date" }).notNull(), + expires: timestamp("expires").notNull(), }, (vt) => ({ compoundKey: primaryKey({ columns: [vt.identifier, vt.token] }), }), ); -export const messages = mysqlTable("message", { - id: bigint("id", { mode: "number" }).primaryKey().autoincrement(), +export const messages = pgTable("message", { + id: serial("id").primaryKey(), email: varchar("email", { length: 255 }).notNull(), name: varchar("name", { length: 255 }).notNull(), message: text("message").notNull(), diff --git a/src/server/drizzleAdapter.ts b/src/server/drizzleAdapter.ts index 7425014..a5cd4da 100644 --- a/src/server/drizzleAdapter.ts +++ b/src/server/drizzleAdapter.ts @@ -1,3 +1,5 @@ +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-nocheck import { and, eq } from "drizzle-orm"; import { type MySqlDatabase } from "drizzle-orm/mysql2"; import * as schema from "@/server/db/schema"; @@ -191,7 +193,7 @@ function drizzleAdapter(client: InstanceType): Adapter { }; } -// @ts-ignore +// @ts-expect-error: typings are wrong const Adapter = drizzleAdapter(db); export default Adapter; diff --git a/tsconfig.json b/tsconfig.json index c5eef6e..207c49d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,4 +1,7 @@ { + "ts-node": { + "esm": true + }, "compilerOptions": { /* Base Options: */ "esModuleInterop": true,