kepler-chat/src/lib/backend/convex/chat.ts
Thomas G. Lopes 7c216dc18b working chat
2025-06-16 18:50:51 +01:00

82 lines
1.8 KiB
TypeScript

import { v } from 'convex/values';
import { Provider } from '../../types';
import { internal } from './_generated/api';
import { mutation, query } from './_generated/server';
import { providerValidator } from './schema';
export const all = query({
args: {
user_id: v.string(),
},
handler: async (ctx, args) => {
const allKeys = await ctx.db
.query('user_keys')
.withIndex('by_user', (q) => q.eq('user_id', args.user_id))
.collect();
return Object.values(Provider).reduce(
(acc, key) => {
acc[key] = allKeys.find((item) => item.provider === key)?.key;
return acc;
},
{} as Record<Provider, string | undefined>
);
},
});
export const get = query({
args: {
user_id: v.string(),
provider: providerValidator,
session_token: v.string(),
},
handler: async (ctx, args) => {
const session = await ctx.runQuery(internal.betterAuth.getSession, {
sessionToken: args.session_token,
});
if (!session) {
throw new Error('Unauthorized');
}
const key = await ctx.db
.query('user_keys')
.withIndex('by_provider_user', (q) =>
q.eq('provider', args.provider).eq('user_id', args.user_id)
)
.first();
return key?.key;
},
});
export const set = mutation({
args: {
provider: providerValidator,
user_id: v.string(),
key: v.string(),
session_token: v.string(),
},
handler: async (ctx, args) => {
const session = await ctx.runQuery(internal.betterAuth.getSession, {
sessionToken: args.session_token,
});
if (!session) {
throw new Error('Unauthorized');
}
const existing = await ctx.db
.query('user_keys')
.withIndex('by_provider_user', (q) =>
q.eq('provider', args.provider).eq('user_id', args.user_id)
)
.first();
if (existing) {
await ctx.db.replace(existing._id, args);
} else {
await ctx.db.insert('user_keys', args);
}
},
});