import { query, mutation } from "./_generated/server"; import { v } from "convex/values"; export const listByChat = query({ args: { token: v.string(), chatId: v.id("chats") }, handler: async (ctx, args) => { const session = await ctx.db .query("sessions") .withIndex("by_token", (q) => q.eq("token", args.token)) .first(); if (!session) throw new Error("Неавторизиран"); const chat = await ctx.db.get(args.chatId); if (!chat) throw new Error("Разговорот не е пронајден"); if (!chat.participantIds.includes(session.userId)) { throw new Error("Немате пристап до овој разговор"); } return await ctx.db .query("messages") .withIndex("by_chat", (q) => q.eq("chatId", args.chatId)) .order("desc") .collect(); }, }); export const send = mutation({ args: { token: v.string(), chatId: v.id("chats"), content: v.string(), imageId: v.optional(v.string()), }, handler: async (ctx, args) => { const session = await ctx.db .query("sessions") .withIndex("by_token", (q) => q.eq("token", args.token)) .first(); if (!session) throw new Error("Неавторизиран"); const chat = await ctx.db.get(args.chatId); if (!chat) throw new Error("Разговорот не е пронајден"); if (!chat.participantIds.includes(session.userId)) { throw new Error("Немате пристап до овој разговор"); } const now = Date.now(); const messageId = await ctx.db.insert("messages", { chatId: args.chatId, senderId: session.userId, content: args.content, ...(args.imageId ? { imageId: args.imageId } : {}), createdAt: now, }); await ctx.db.patch(args.chatId, { lastMessageAt: now }); return messageId; }, });