Skip to content

Commit ca69cbe

Browse files
authored
fix(ai): avoid constant oauth token ordering (#503)
* fix(dashboard): align goals with funnels layout * fix(dashboard): show public website link immediately * feat(insights): improve slack digest markdown * chore(insights): tighten investigation copy guidance * fix(insights): address slack digest review feedback * fix(ai): avoid constant oauth token ordering
1 parent 400b9a0 commit ca69cbe

3 files changed

Lines changed: 44 additions & 6 deletions

File tree

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { account, member } from "@databuddy/db/schema";
2+
import { sql } from "drizzle-orm";
3+
4+
const ROLE_PRIORITY = sql`CASE ${member.role} WHEN 'owner' THEN 0 WHEN 'admin' THEN 1 ELSE 2 END`;
5+
6+
export function getOAuthTokenOrderBy(preferUserId?: string) {
7+
return preferUserId
8+
? [
9+
sql`CASE WHEN ${account.userId} = ${preferUserId} THEN 0 ELSE 1 END`,
10+
ROLE_PRIORITY,
11+
]
12+
: [ROLE_PRIORITY];
13+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { describe, expect, test } from "bun:test";
2+
import { PgDialect } from "drizzle-orm/pg-core";
3+
4+
import { getOAuthTokenOrderBy } from "./oauth-token-ordering";
5+
6+
const dialect = new PgDialect();
7+
8+
function renderOrderBy(preferUserId?: string): string[] {
9+
return getOAuthTokenOrderBy(preferUserId).map(
10+
(expression) => dialect.sqlToQuery(expression).sql
11+
);
12+
}
13+
14+
describe("getOAuthTokenOrderBy", () => {
15+
test("does not order by a constant when no preferred user is provided", () => {
16+
expect(renderOrderBy()).toEqual([
17+
`CASE "member"."role" WHEN 'owner' THEN 0 WHEN 'admin' THEN 1 ELSE 2 END`,
18+
]);
19+
});
20+
21+
test("prefers the requested user before role priority when present", () => {
22+
expect(renderOrderBy("user_123")).toEqual([
23+
`CASE WHEN "account"."user_id" = $1 THEN 0 ELSE 1 END`,
24+
`CASE "member"."role" WHEN 'owner' THEN 0 WHEN 'admin' THEN 1 ELSE 2 END`,
25+
]);
26+
});
27+
});

packages/ai/src/ai/tools/utils/oauth-token.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { auth } from "@databuddy/auth";
2-
import { and, db, eq, sql } from "@databuddy/db";
2+
import { and, db, eq } from "@databuddy/db";
33
import { account, member } from "@databuddy/db/schema";
4+
import { getOAuthTokenOrderBy } from "./oauth-token-ordering";
45

5-
const ROLE_PRIORITY = sql`CASE ${member.role} WHEN 'owner' THEN 0 WHEN 'admin' THEN 1 ELSE 2 END`;
66
const TOKEN_TTL_MS = 45 * 60 * 1000;
77
const NEGATIVE_TTL_MS = 5 * 60 * 1000;
88
const EXPIRY_SKEW_MS = 60 * 1000;
@@ -68,9 +68,7 @@ async function resolveOAuthToken(
6868
preferUserId?: string,
6969
requiredScope?: string
7070
): Promise<ResolvedToken | null> {
71-
const preference = preferUserId
72-
? sql`CASE WHEN ${account.userId} = ${preferUserId} THEN 0 ELSE 1 END`
73-
: sql`0`;
71+
const orderBy = getOAuthTokenOrderBy(preferUserId);
7472

7573
const candidates: TokenCandidate[] = await db
7674
.select({
@@ -89,7 +87,7 @@ async function resolveOAuthToken(
8987
eq(account.providerId, providerId)
9088
)
9189
)
92-
.orderBy(preference, ROLE_PRIORITY)
90+
.orderBy(...orderBy)
9391
.limit(MAX_CANDIDATES);
9492

9593
for (const candidate of candidates) {

0 commit comments

Comments
 (0)