dock config to postgres, auto-add /email on google oauth, improved email empty state

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-26 17:42:27 +00:00
co-authored by Claude Opus 4.6
parent 466dc3adda
commit 7f04ecd644
7 changed files with 214 additions and 93 deletions
+21 -4
View File
@@ -1,5 +1,4 @@
export {
initAuthStore,
getUsers,
getUserById,
getUserByEmail,
@@ -7,8 +6,8 @@ export {
createUser,
updateUser,
deleteUser,
getPasskeysByEmail,
getPasskeysByEmailAndOrigin,
getPasskeysByUserId,
getPasskeysByUserIdAndOrigin,
getPasskeyByCredentialId,
createPasskey,
updatePasskey,
@@ -17,4 +16,22 @@ export {
blacklistToken,
isTokenBlacklisted,
cleanupExpiredTokens,
} from './store';
} from './queries/auth';
export { readServerSettings, writeServerSettings } from './queries/server-config';
export { getUserSettings, setUserSettings, getUserState, patchUserState, getDockPaths, setDockPaths } from './queries/user-data';
export {
getServerIntegrations,
getServerIntegration,
upsertServerIntegration,
deleteServerIntegration,
getUserIntegrations,
getUserIntegration,
upsertUserIntegration,
deleteUserIntegration,
} from './queries/integrations';
export { db } from './db';
export * as schema from './schema';
@@ -0,0 +1,57 @@
import { eq } from 'drizzle-orm';
import { db } from '../db';
import { dockConfigs, userSettings, userState } from '../schema';
// ── User Settings ──
export async function getUserSettings(userId: number): Promise<Record<string, unknown>> {
const [row] = await db.select().from(userSettings).where(eq(userSettings.userId, userId));
return (row?.settings as Record<string, unknown>) ?? {};
}
export async function setUserSettings(userId: number, settings: Record<string, unknown>): Promise<void> {
await db
.insert(userSettings)
.values({ userId, settings, updatedAt: new Date() })
.onConflictDoUpdate({
target: userSettings.userId,
set: { settings, updatedAt: new Date() },
});
}
// ── User State ──
export async function getUserState(userId: number): Promise<Record<string, unknown>> {
const [row] = await db.select().from(userState).where(eq(userState.userId, userId));
return (row?.state as Record<string, unknown>) ?? {};
}
export async function patchUserState(userId: number, patch: Record<string, unknown>): Promise<Record<string, unknown>> {
const current = await getUserState(userId);
const merged = { ...current, ...patch };
await db
.insert(userState)
.values({ userId, state: merged, updatedAt: new Date() })
.onConflictDoUpdate({
target: userState.userId,
set: { state: merged, updatedAt: new Date() },
});
return merged;
}
// ── Dock Config ──
export async function getDockPaths(userId: number): Promise<string[] | null> {
const [row] = await db.select().from(dockConfigs).where(eq(dockConfigs.userId, userId));
return (row?.paths as string[]) ?? null;
}
export async function setDockPaths(userId: number, paths: string[]): Promise<void> {
await db
.insert(dockConfigs)
.values({ userId, paths, updatedAt: new Date() })
.onConflictDoUpdate({
target: dockConfigs.userId,
set: { paths, updatedAt: new Date() },
});
}