feat(*): add data injection
This commit is contained in:
4
frontend/src/lib/convex/_generated/api.d.ts
vendored
4
frontend/src/lib/convex/_generated/api.d.ts
vendored
@@ -11,6 +11,8 @@
|
||||
import type * as chats from "../chats.js";
|
||||
import type * as devicePairings from "../devicePairings.js";
|
||||
import type * as http from "../http.js";
|
||||
import type * as inject from "../inject.js";
|
||||
import type * as injectConnections from "../injectConnections.js";
|
||||
import type * as messages from "../messages.js";
|
||||
import type * as pairingRequests from "../pairingRequests.js";
|
||||
import type * as pendingGenerations from "../pendingGenerations.js";
|
||||
@@ -30,6 +32,8 @@ declare const fullApi: ApiFromModules<{
|
||||
chats: typeof chats;
|
||||
devicePairings: typeof devicePairings;
|
||||
http: typeof http;
|
||||
inject: typeof inject;
|
||||
injectConnections: typeof injectConnections;
|
||||
messages: typeof messages;
|
||||
pairingRequests: typeof pairingRequests;
|
||||
pendingGenerations: typeof pendingGenerations;
|
||||
|
||||
109
frontend/src/lib/convex/inject.ts
Normal file
109
frontend/src/lib/convex/inject.ts
Normal file
@@ -0,0 +1,109 @@
|
||||
import { v } from 'convex/values';
|
||||
import { mutation, query } from './_generated/server';
|
||||
|
||||
export const createDatabase = mutation({
|
||||
args: { userId: v.id('users'), name: v.string() },
|
||||
returns: v.id('injectDatabases'),
|
||||
handler: async (ctx, args) => {
|
||||
const existing = await ctx.db
|
||||
.query('injectDatabases')
|
||||
.withIndex('by_user_id_and_name', (q) => q.eq('userId', args.userId).eq('name', args.name))
|
||||
.unique();
|
||||
|
||||
if (existing) {
|
||||
return existing._id;
|
||||
}
|
||||
|
||||
return await ctx.db.insert('injectDatabases', {
|
||||
userId: args.userId,
|
||||
name: args.name,
|
||||
createdAt: Date.now()
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
export const getDatabase = query({
|
||||
args: { userId: v.id('users'), name: v.string() },
|
||||
returns: v.union(
|
||||
v.object({
|
||||
_id: v.id('injectDatabases'),
|
||||
_creationTime: v.number(),
|
||||
userId: v.id('users'),
|
||||
name: v.string(),
|
||||
content: v.optional(v.string()),
|
||||
createdAt: v.number()
|
||||
}),
|
||||
v.null()
|
||||
),
|
||||
handler: async (ctx, args) => {
|
||||
return await ctx.db
|
||||
.query('injectDatabases')
|
||||
.withIndex('by_user_id_and_name', (q) => q.eq('userId', args.userId).eq('name', args.name))
|
||||
.unique();
|
||||
}
|
||||
});
|
||||
|
||||
export const getDatabaseById = query({
|
||||
args: { injectDatabaseId: v.id('injectDatabases') },
|
||||
returns: v.union(
|
||||
v.object({
|
||||
_id: v.id('injectDatabases'),
|
||||
_creationTime: v.number(),
|
||||
userId: v.id('users'),
|
||||
name: v.string(),
|
||||
content: v.optional(v.string()),
|
||||
createdAt: v.number()
|
||||
}),
|
||||
v.null()
|
||||
),
|
||||
handler: async (ctx, args) => {
|
||||
return await ctx.db.get(args.injectDatabaseId);
|
||||
}
|
||||
});
|
||||
|
||||
export const listDatabases = query({
|
||||
args: { userId: v.id('users') },
|
||||
returns: v.array(
|
||||
v.object({
|
||||
_id: v.id('injectDatabases'),
|
||||
_creationTime: v.number(),
|
||||
userId: v.id('users'),
|
||||
name: v.string(),
|
||||
content: v.optional(v.string()),
|
||||
createdAt: v.number()
|
||||
})
|
||||
),
|
||||
handler: async (ctx, args) => {
|
||||
return await ctx.db
|
||||
.query('injectDatabases')
|
||||
.withIndex('by_user_id', (q) => q.eq('userId', args.userId))
|
||||
.collect();
|
||||
}
|
||||
});
|
||||
|
||||
export const setContent = mutation({
|
||||
args: { injectDatabaseId: v.id('injectDatabases'), content: v.string() },
|
||||
returns: v.null(),
|
||||
handler: async (ctx, args) => {
|
||||
await ctx.db.patch(args.injectDatabaseId, { content: args.content });
|
||||
return null;
|
||||
}
|
||||
});
|
||||
|
||||
export const deleteDatabase = mutation({
|
||||
args: { injectDatabaseId: v.id('injectDatabases') },
|
||||
returns: v.null(),
|
||||
handler: async (ctx, args) => {
|
||||
const connections = await ctx.db
|
||||
.query('injectConnections')
|
||||
.withIndex('by_inject_database_id', (q) => q.eq('injectDatabaseId', args.injectDatabaseId))
|
||||
.collect();
|
||||
|
||||
for (const conn of connections) {
|
||||
await ctx.db.delete(conn._id);
|
||||
}
|
||||
|
||||
await ctx.db.delete(args.injectDatabaseId);
|
||||
return null;
|
||||
}
|
||||
});
|
||||
102
frontend/src/lib/convex/injectConnections.ts
Normal file
102
frontend/src/lib/convex/injectConnections.ts
Normal file
@@ -0,0 +1,102 @@
|
||||
import { v } from 'convex/values';
|
||||
import { mutation, query } from './_generated/server';
|
||||
|
||||
export const connect = mutation({
|
||||
args: {
|
||||
userId: v.id('users'),
|
||||
injectDatabaseId: v.id('injectDatabases'),
|
||||
isGlobal: v.optional(v.boolean())
|
||||
},
|
||||
returns: v.id('injectConnections'),
|
||||
handler: async (ctx, args) => {
|
||||
const existing = await ctx.db
|
||||
.query('injectConnections')
|
||||
.withIndex('by_user_id_and_inject_database_id', (q) =>
|
||||
q.eq('userId', args.userId).eq('injectDatabaseId', args.injectDatabaseId)
|
||||
)
|
||||
.unique();
|
||||
|
||||
if (existing) {
|
||||
return existing._id;
|
||||
}
|
||||
|
||||
return await ctx.db.insert('injectConnections', {
|
||||
userId: args.userId,
|
||||
injectDatabaseId: args.injectDatabaseId,
|
||||
isGlobal: args.isGlobal ?? true,
|
||||
createdAt: Date.now()
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
export const disconnect = mutation({
|
||||
args: {
|
||||
userId: v.id('users'),
|
||||
injectDatabaseId: v.id('injectDatabases')
|
||||
},
|
||||
returns: v.boolean(),
|
||||
handler: async (ctx, args) => {
|
||||
const existing = await ctx.db
|
||||
.query('injectConnections')
|
||||
.withIndex('by_user_id_and_inject_database_id', (q) =>
|
||||
q.eq('userId', args.userId).eq('injectDatabaseId', args.injectDatabaseId)
|
||||
)
|
||||
.unique();
|
||||
|
||||
if (!existing) {
|
||||
return false;
|
||||
}
|
||||
|
||||
await ctx.db.delete(existing._id);
|
||||
return true;
|
||||
}
|
||||
});
|
||||
|
||||
export const getActiveForUser = query({
|
||||
args: { userId: v.id('users') },
|
||||
returns: v.array(
|
||||
v.object({
|
||||
_id: v.id('injectConnections'),
|
||||
_creationTime: v.number(),
|
||||
userId: v.id('users'),
|
||||
injectDatabaseId: v.id('injectDatabases'),
|
||||
isGlobal: v.boolean(),
|
||||
createdAt: v.number()
|
||||
})
|
||||
),
|
||||
handler: async (ctx, args) => {
|
||||
return await ctx.db
|
||||
.query('injectConnections')
|
||||
.withIndex('by_user_id', (q) => q.eq('userId', args.userId))
|
||||
.collect();
|
||||
}
|
||||
});
|
||||
|
||||
export const getByInjectDatabaseId = query({
|
||||
args: { injectDatabaseId: v.id('injectDatabases') },
|
||||
returns: v.array(
|
||||
v.object({
|
||||
_id: v.id('injectConnections'),
|
||||
_creationTime: v.number(),
|
||||
userId: v.id('users'),
|
||||
injectDatabaseId: v.id('injectDatabases'),
|
||||
isGlobal: v.boolean(),
|
||||
createdAt: v.number()
|
||||
})
|
||||
),
|
||||
handler: async (ctx, args) => {
|
||||
return await ctx.db
|
||||
.query('injectConnections')
|
||||
.withIndex('by_inject_database_id', (q) => q.eq('injectDatabaseId', args.injectDatabaseId))
|
||||
.collect();
|
||||
}
|
||||
});
|
||||
|
||||
export const deleteConnection = mutation({
|
||||
args: { connectionId: v.id('injectConnections') },
|
||||
returns: v.null(),
|
||||
handler: async (ctx, args) => {
|
||||
await ctx.db.delete(args.connectionId);
|
||||
return null;
|
||||
}
|
||||
});
|
||||
@@ -16,6 +16,12 @@ export default defineSchema({
|
||||
ragDatabaseId: v.id('ragDatabases'),
|
||||
activeSince: v.number()
|
||||
})
|
||||
),
|
||||
injectCollectionMode: v.optional(
|
||||
v.object({
|
||||
injectDatabaseId: v.id('injectDatabases'),
|
||||
activeSince: v.number()
|
||||
})
|
||||
)
|
||||
}).index('by_telegram_id', ['telegramId']),
|
||||
|
||||
@@ -122,5 +128,24 @@ export default defineSchema({
|
||||
})
|
||||
.index('by_user_id', ['userId'])
|
||||
.index('by_user_id_and_rag_database_id', ['userId', 'ragDatabaseId'])
|
||||
.index('by_rag_database_id', ['ragDatabaseId'])
|
||||
.index('by_rag_database_id', ['ragDatabaseId']),
|
||||
|
||||
injectDatabases: defineTable({
|
||||
userId: v.id('users'),
|
||||
name: v.string(),
|
||||
content: v.optional(v.string()),
|
||||
createdAt: v.number()
|
||||
})
|
||||
.index('by_user_id', ['userId'])
|
||||
.index('by_user_id_and_name', ['userId', 'name']),
|
||||
|
||||
injectConnections: defineTable({
|
||||
userId: v.id('users'),
|
||||
injectDatabaseId: v.id('injectDatabases'),
|
||||
isGlobal: v.boolean(),
|
||||
createdAt: v.number()
|
||||
})
|
||||
.index('by_user_id', ['userId'])
|
||||
.index('by_user_id_and_inject_database_id', ['userId', 'injectDatabaseId'])
|
||||
.index('by_inject_database_id', ['injectDatabaseId'])
|
||||
});
|
||||
|
||||
@@ -22,6 +22,12 @@ export const getById = query({
|
||||
ragDatabaseId: v.id('ragDatabases'),
|
||||
activeSince: v.number()
|
||||
})
|
||||
),
|
||||
injectCollectionMode: v.optional(
|
||||
v.object({
|
||||
injectDatabaseId: v.id('injectDatabases'),
|
||||
activeSince: v.number()
|
||||
})
|
||||
)
|
||||
}),
|
||||
v.null()
|
||||
@@ -50,6 +56,12 @@ export const getByTelegramId = query({
|
||||
ragDatabaseId: v.id('ragDatabases'),
|
||||
activeSince: v.number()
|
||||
})
|
||||
),
|
||||
injectCollectionMode: v.optional(
|
||||
v.object({
|
||||
injectDatabaseId: v.id('injectDatabases'),
|
||||
activeSince: v.number()
|
||||
})
|
||||
)
|
||||
}),
|
||||
v.null()
|
||||
@@ -177,3 +189,41 @@ export const getRagCollectionMode = query({
|
||||
return user?.ragCollectionMode ?? null;
|
||||
}
|
||||
});
|
||||
|
||||
export const startInjectCollectionMode = mutation({
|
||||
args: { userId: v.id('users'), injectDatabaseId: v.id('injectDatabases') },
|
||||
returns: v.null(),
|
||||
handler: async (ctx, args) => {
|
||||
await ctx.db.patch(args.userId, {
|
||||
injectCollectionMode: {
|
||||
injectDatabaseId: args.injectDatabaseId,
|
||||
activeSince: Date.now()
|
||||
}
|
||||
});
|
||||
return null;
|
||||
}
|
||||
});
|
||||
|
||||
export const stopInjectCollectionMode = mutation({
|
||||
args: { userId: v.id('users') },
|
||||
returns: v.null(),
|
||||
handler: async (ctx, args) => {
|
||||
await ctx.db.patch(args.userId, { injectCollectionMode: undefined });
|
||||
return null;
|
||||
}
|
||||
});
|
||||
|
||||
export const getInjectCollectionMode = query({
|
||||
args: { userId: v.id('users') },
|
||||
returns: v.union(
|
||||
v.object({
|
||||
injectDatabaseId: v.id('injectDatabases'),
|
||||
activeSince: v.number()
|
||||
}),
|
||||
v.null()
|
||||
),
|
||||
handler: async (ctx, args) => {
|
||||
const user = await ctx.db.get(args.userId);
|
||||
return user?.injectCollectionMode ?? null;
|
||||
}
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user