96 lines
2.0 KiB
TypeScript
96 lines
2.0 KiB
TypeScript
import { v } from 'convex/values';
|
|
import { mutation, query } from './_generated/server';
|
|
|
|
const photoValidator = v.object({
|
|
base64: v.string(),
|
|
mediaType: v.string()
|
|
});
|
|
|
|
export const get = query({
|
|
args: { chatId: v.id('chats'), deviceId: v.string() },
|
|
returns: v.object({
|
|
photos: v.array(
|
|
v.object({
|
|
_id: v.id('photoDrafts'),
|
|
base64: v.string(),
|
|
mediaType: v.string()
|
|
})
|
|
)
|
|
}),
|
|
handler: async (ctx, args) => {
|
|
const drafts = await ctx.db
|
|
.query('photoDrafts')
|
|
.withIndex('by_chat_id_and_device_id', (q) =>
|
|
q.eq('chatId', args.chatId).eq('deviceId', args.deviceId)
|
|
)
|
|
.collect();
|
|
|
|
return {
|
|
photos: drafts.map((d) => ({
|
|
_id: d._id,
|
|
base64: d.base64,
|
|
mediaType: d.mediaType
|
|
}))
|
|
};
|
|
}
|
|
});
|
|
|
|
export const addPhoto = mutation({
|
|
args: {
|
|
chatId: v.id('chats'),
|
|
deviceId: v.string(),
|
|
photo: photoValidator
|
|
},
|
|
returns: v.null(),
|
|
handler: async (ctx, args) => {
|
|
await ctx.db.insert('photoDrafts', {
|
|
chatId: args.chatId,
|
|
deviceId: args.deviceId,
|
|
base64: args.photo.base64,
|
|
mediaType: args.photo.mediaType,
|
|
createdAt: Date.now()
|
|
});
|
|
return null;
|
|
}
|
|
});
|
|
|
|
export const removePhoto = mutation({
|
|
args: {
|
|
chatId: v.id('chats'),
|
|
deviceId: v.string(),
|
|
index: v.number()
|
|
},
|
|
returns: v.null(),
|
|
handler: async (ctx, args) => {
|
|
const drafts = await ctx.db
|
|
.query('photoDrafts')
|
|
.withIndex('by_chat_id_and_device_id', (q) =>
|
|
q.eq('chatId', args.chatId).eq('deviceId', args.deviceId)
|
|
)
|
|
.collect();
|
|
|
|
if (drafts[args.index]) {
|
|
await ctx.db.delete(drafts[args.index]._id);
|
|
}
|
|
return null;
|
|
}
|
|
});
|
|
|
|
export const clear = mutation({
|
|
args: { chatId: v.id('chats'), deviceId: v.string() },
|
|
returns: v.null(),
|
|
handler: async (ctx, args) => {
|
|
const drafts = await ctx.db
|
|
.query('photoDrafts')
|
|
.withIndex('by_chat_id_and_device_id', (q) =>
|
|
q.eq('chatId', args.chatId).eq('deviceId', args.deviceId)
|
|
)
|
|
.collect();
|
|
|
|
for (const draft of drafts) {
|
|
await ctx.db.delete(draft._id);
|
|
}
|
|
return null;
|
|
}
|
|
});
|