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);
    },
  },
});

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?
Was this page helpful?