Setting additionalFields w/ secondary storage

I'm creating a default API key when someone signs up, like so:
import KeyvSqlite from "@keyv/sqlite";
import Keyv from "keyv";
import { betterAuth } from "better-auth";
import { drizzleAdapter } from "better-auth/adapters/drizzle";
import { apiKey } from "better-auth/plugins";
import { eq } from "drizzle-orm";
import { env } from "@repo/env/server";
import {
account,
apikey,
db,
session,
user as usersTable,
verification,
} from "~/server/db";

const keyvSqlite = new KeyvSqlite(env.SESSION_DB_FILE_PATH);
const keyv = new Keyv({ store: keyvSqlite, namespace: "sessions-cache" });

export const auth = betterAuth({
database: drizzleAdapter(db, {
provider: "pg",
schema: {
user: usersTable,
verification,
account,
session,
apikey,
},
}),
emailAndPassword: {
enabled: true,
},
plugins: [apiKey()],
user: {
additionalFields: {
apiKey: {
type: "string",
nullable: true,
input: false,
},
},
},
databaseHooks: {
user: {
create: {
after: async (user) => {
const key = await auth.api.createApiKey({
body: {
userId: user.id,
},
});
await db
.update(usersTable)
.set({ apiKey: key.key })
.where(eq(usersTable.id, key.userId));
},
},
},
},
secondaryStorage: {
get: async (key) => {
const value = await keyv.get(key);
return value ? value : null;
},
set: async (key, value, ttl) => {
if (ttl) {
await keyv.set(key, value, ttl);
} else {
await keyv.set(key, value);
}
},
delete: async (key) => {
await keyv.delete(key);
},
},
});
import KeyvSqlite from "@keyv/sqlite";
import Keyv from "keyv";
import { betterAuth } from "better-auth";
import { drizzleAdapter } from "better-auth/adapters/drizzle";
import { apiKey } from "better-auth/plugins";
import { eq } from "drizzle-orm";
import { env } from "@repo/env/server";
import {
account,
apikey,
db,
session,
user as usersTable,
verification,
} from "~/server/db";

const keyvSqlite = new KeyvSqlite(env.SESSION_DB_FILE_PATH);
const keyv = new Keyv({ store: keyvSqlite, namespace: "sessions-cache" });

export const auth = betterAuth({
database: drizzleAdapter(db, {
provider: "pg",
schema: {
user: usersTable,
verification,
account,
session,
apikey,
},
}),
emailAndPassword: {
enabled: true,
},
plugins: [apiKey()],
user: {
additionalFields: {
apiKey: {
type: "string",
nullable: true,
input: false,
},
},
},
databaseHooks: {
user: {
create: {
after: async (user) => {
const key = await auth.api.createApiKey({
body: {
userId: user.id,
},
});
await db
.update(usersTable)
.set({ apiKey: key.key })
.where(eq(usersTable.id, key.userId));
},
},
},
},
secondaryStorage: {
get: async (key) => {
const value = await keyv.get(key);
return value ? value : null;
},
set: async (key, value, ttl) => {
if (ttl) {
await keyv.set(key, value, ttl);
} else {
await keyv.set(key, value);
}
},
delete: async (key) => {
await keyv.delete(key);
},
},
});
However, the default API key doesn't get persisted to the secondary storage (which makes sense since I'm only setting it on the DB). How can I solve this?
0 Replies
No replies yetBe the first to reply to this messageJoin

Did you find this page helpful?