···11import { db } from '$lib/server/db';
22import type { Handle, ServerInit } from '@sveltejs/kit';
33-import { migrate } from 'drizzle-orm/better-sqlite3/migrator';
33+import { migrate } from 'drizzle-orm/node-postgres/migrator';
44import { env } from '$env/dynamic/private';
55-import { keyValueStore } from '$lib/server/db/schema';
66-import { and, eq, lt } from 'drizzle-orm';
77-import { STATE_STORE } from '$lib/server/cache';
88-import { logger } from '$lib/server/logger';
55+96import { HOUR } from '@atproto/common';
107import { getSessionManager, SessionRestorationError } from '$lib/server/session';
1181212-const clearExpiredStates = async () => {
1313- try {
1414- logger.info('Running cleanup of the state store');
1515- const oneHourAgo = new Date(Date.now() - HOUR);
1616- const result = await db
1717- .delete(keyValueStore)
1818- .where(
1919- and(
2020- eq(keyValueStore.storeName, STATE_STORE),
2121- lt(keyValueStore.createdAt, oneHourAgo))
2222- );
2323-2424- if (result.changes > 0) {
2525- logger.info(`Cleaned up ${result.changes} expired key(s) from keyValueStore`);
2626- }
2727- } catch (err) {
2828- logger.error(`${(err as Error).message}`);
2929- }
3030-};
31932103311export const init: ServerInit = async () => {
3412 // Run Drizzle migrations on server startup
3535- migrate(db, { migrationsFolder: env.MIGRATIONS_FOLDER ?? 'drizzle' });
1313+ await migrate(db, { migrationsFolder: env.MIGRATIONS_FOLDER ?? 'drizzle' });
36143737- await clearExpiredStates();
38153916 // Start a background job to clean up state every hour, which is recommended in the oauth docs
4017 setInterval(async () => {
4141- await clearExpiredStates();
4218 //TODO prob should do one for the session store as well for expired sessions
4319 }, HOUR); // Run every hour
4420};
+3-4
src/lib/server/db/index.ts
···11-import { drizzle } from 'drizzle-orm/better-sqlite3';
22-import Database from 'better-sqlite3';
11+import { drizzle } from 'drizzle-orm/node-postgres';
32import * as schema from './schema';
43import { env } from '$env/dynamic/private';
54import { logger } from '$lib/server/logger';
6576if (!env.DATABASE_URL) throw new Error('DATABASE_URL is not set');
8799-const client = new Database(env.DATABASE_URL);
108logger.info('Connected to database');
1111-export const db = drizzle(client, { schema });
99+logger.info(`Database url: ${env.DATABASE_URL}`);
1010+export const db = drizzle(env.DATABASE_URL!,{ schema });
+21-15
src/lib/server/db/schema.ts
···11-import { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core';
11+import { integer, pgTable, varchar } from 'drizzle-orm/pg-core';
2233-export const keyValueStore = sqliteTable('key_value_store', {
44- key: text('key').primaryKey(),
55- value: text('value'),
66- storeName: text('storeName'),
77- createdAt: integer({ mode: 'timestamp' }) // Date
33+export const usersTable = pgTable('test', {
44+ id: integer().primaryKey().generatedAlwaysAsIdentity(),
55+ name: varchar().notNull(),
86});
971081111-export const sessionStore = sqliteTable('session_store', {
1212- id: text('id').primaryKey(),
1313- //Not leaving unique since it could be multiple logins from the same user across browsers
1414- did: text('did').notNull(),
1515- handle: text('handle').notNull(),
1616- createdAt: integer({ mode: 'timestamp' }).notNull(), // Date
1717- expiresAt: integer({ mode: 'timestamp' }).notNull() // Date
1818-1919-});99+// export const keyValueStore = sqliteTable('key_value_store', {
1010+// key: p text('key').primaryKey(),
1111+// value: text('value'),
1212+// storeName: text('storeName'),
1313+// createdAt: integer({ mode: 'timestamp' }) // Date
1414+// });
1515+//
1616+//
1717+// export const sessionStore = sqliteTable('session_store', {
1818+// id: text('id').primaryKey(),
1919+// //Not leaving unique since it could be multiple logins from the same user across browsers
2020+// did: text('did').notNull(),
2121+// handle: text('handle').notNull(),
2222+// createdAt: integer({ mode: 'timestamp' }).notNull(), // Date
2323+// expiresAt: integer({ mode: 'timestamp' }).notNull() // Date
2424+//
2525+// });