| 18 | ] as const |
| 19 | |
| 20 | export async function getUserInfoFromApiKey<T extends UserColumn>({ |
| 21 | apiKey, |
| 22 | fields, |
| 23 | }: GetUserInfoFromApiKeyInput<T>): GetUserInfoFromApiKeyOutput<T> { |
| 24 | // Build a typed selection object for user columns |
| 25 | const userSelection = Object.fromEntries( |
| 26 | fields.map((field) => [field, schema.user[field]]), |
| 27 | ) as { [K in T]: (typeof schema.user)[K] } |
| 28 | |
| 29 | const rows = await db |
| 30 | .select({ user: userSelection }) // <-- important: nest under 'user' |
| 31 | .from(schema.user) |
| 32 | .leftJoin(schema.session, eq(schema.user.id, schema.session.userId)) |
| 33 | .where(eq(schema.session.sessionToken, apiKey)) |
| 34 | .limit(1) |
| 35 | |
| 36 | // Drizzle returns { user: ..., session: ... }, we return only the user part |
| 37 | return rows[0]?.user |
| 38 | } |