From 84398de39040f534b2d9ceb623a6b6a1e2d628f5 Mon Sep 17 00:00:00 2001 From: riyadhafraa <49757212-riyadhafraa@users.noreply.replit.com> Date: Tue, 12 May 2026 10:51:31 +0000 Subject: [PATCH] Task #511: Fully remove Chat feature MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Destructive removal per user confirmation ("حذف نهائي ما يرجع"). Removed: - API: routes/conversations.ts, schema/conversations.ts, all chat socket handlers in src/index.ts, /admin/users/:id/dependents/ conversations+messages endpoints, conversation/message dependency counts in users/stats routes. - Web: pages/chat.tsx, /chat route, dock chat filter, MessageSquare icon and messages StatCard on home, all chat-related UI in notifications + admin (dependency badges, delete-dialog rows, UserDependentConversations/Messages sections, count map keys). - Locales: nav.chat, home.stats.messages, full chat.* block, admin.deleteUser conv/msgCount, admin.users.counts.conv/msg, admin.audit.unit.conversation_*/message_*, admin.dependents.user*. - OpenAPI spec: tags, all /conversations/* paths, conv/msg dependent paths, related schemas (ConversationWithDetails, MessageWithSender, UserDependentConversation/MessageItem+Page, etc.), UserProfile and UserDeletionConflict conv/msg fields, HomeStats.unreadMessages. Regenerated client via orval. - Database: dropped message_reads, messages, conversation_participants, conversations (CASCADE); deleted notifications with related_type='conversation' or type='chat'; deleted apps row with slug='chat'; ran drizzle push-force. - Seed: removed chat:access permission + user-role assignment + seeded chat app entry from scripts/src/seed.ts. - Tests: deleted conversations-leave.test.mjs; cleaned chat refs from list-dependency-counts, delete-force-warnings, audit-log-coverage, and admin-inline-dependency-counts (e2e) — replaced chat dependents with note dependents where needed for force-delete coverage. Notes preserved: notes.tsx noConversationsYet/conversationWith refer to NOTE THREADS (not chat) and were intentionally NOT touched. executive-meetings.ts not modified per replit.md restriction. Pre-existing flaky test failures in executive-meetings/group/etc suites remain unrelated to this task. --- artifacts/api-server/src/index.ts | 28 - .../api-server/src/routes/conversations.ts | 981 ---------- artifacts/api-server/src/routes/index.ts | 2 - artifacts/api-server/src/routes/stats.ts | 15 - artifacts/api-server/src/routes/users.ts | 141 +- .../tests/audit-log-coverage.test.mjs | 35 +- .../tests/conversations-leave.test.mjs | 265 --- .../tests/delete-force-warnings.test.mjs | 23 - .../tests/list-dependency-counts.test.mjs | 26 +- artifacts/tx-os/public/opengraph.jpg | Bin 26001 -> 26059 bytes artifacts/tx-os/src/App.tsx | 2 - artifacts/tx-os/src/locales/ar.json | 131 +- artifacts/tx-os/src/locales/en.json | 120 +- artifacts/tx-os/src/pages/admin.tsx | 132 +- artifacts/tx-os/src/pages/chat.tsx | 1716 ----------------- artifacts/tx-os/src/pages/home.tsx | 9 +- artifacts/tx-os/src/pages/notifications.tsx | 5 - .../admin-inline-dependency-counts.spec.mjs | 45 +- .../tests/leave-group-successor.spec.mjs | 245 --- attached_assets/image_1778582606077.png | Bin 0 -> 357765 bytes .../src/generated/api.schemas.ts | 174 -- lib/api-client-react/src/generated/api.ts | 1211 ------------ lib/api-spec/openapi.yaml | 539 ------ lib/api-zod/src/generated/api.ts | 596 ------ lib/db/src/schema/conversations.ts | 47 - lib/db/src/schema/index.ts | 1 - scripts/src/seed.ts | 25 - 27 files changed, 22 insertions(+), 6492 deletions(-) delete mode 100644 artifacts/api-server/src/routes/conversations.ts delete mode 100644 artifacts/api-server/tests/conversations-leave.test.mjs delete mode 100644 artifacts/tx-os/src/pages/chat.tsx delete mode 100644 artifacts/tx-os/tests/leave-group-successor.spec.mjs create mode 100644 attached_assets/image_1778582606077.png delete mode 100644 lib/db/src/schema/conversations.ts diff --git a/artifacts/api-server/src/index.ts b/artifacts/api-server/src/index.ts index a545ff37..79f73421 100644 --- a/artifacts/api-server/src/index.ts +++ b/artifacts/api-server/src/index.ts @@ -3,11 +3,6 @@ import { Server as SocketIOServer } from "socket.io"; import type { IncomingMessage, ServerResponse } from "http"; import app, { sessionMiddleware } from "./app"; import { logger } from "./lib/logger"; -import { db } from "@workspace/db"; -import { - conversationParticipantsTable, -} from "@workspace/db"; -import { eq, and } from "drizzle-orm"; const rawPort = process.env["PORT"]; @@ -58,29 +53,6 @@ io.on("connection", (socket) => { socket.join(`user:${userId}`); - socket.on( - "join_conversation", - async (conversationId: number) => { - const [participant] = await db - .select() - .from(conversationParticipantsTable) - .where( - and( - eq(conversationParticipantsTable.conversationId, conversationId), - eq(conversationParticipantsTable.userId, userId), - ), - ); - - if (participant) { - socket.join(`conversation:${conversationId}`); - } - }, - ); - - socket.on("leave_conversation", (conversationId: number) => { - socket.leave(`conversation:${conversationId}`); - }); - socket.on("disconnect", () => { logger.info({ socketId: socket.id }, "Socket disconnected"); }); diff --git a/artifacts/api-server/src/routes/conversations.ts b/artifacts/api-server/src/routes/conversations.ts deleted file mode 100644 index 03aaf586..00000000 --- a/artifacts/api-server/src/routes/conversations.ts +++ /dev/null @@ -1,981 +0,0 @@ -import { Router, type IRouter } from "express"; -import { eq, and, desc, asc, sql } from "drizzle-orm"; -import { db } from "@workspace/db"; -import { - conversationsTable, - conversationParticipantsTable, - messagesTable, - messageReadsTable, - notificationsTable, - usersTable, -} from "@workspace/db"; -import { requireAuth } from "../middlewares/auth"; -import { - CreateConversationBody, - GetConversationParams, - ListMessagesParams, - SendMessageParams, - SendMessageBody, - MarkConversationReadParams, - UpdateConversationBody, - UpdateConversationParams, - AddConversationParticipantsParams, - AddConversationParticipantsBody, - RemoveConversationParticipantParams, - UpdateConversationStateParams, - UpdateConversationStateBody, - LeaveConversationBody, - LeaveConversationParams, -} from "@workspace/api-zod"; - -const router: IRouter = Router(); - -async function isConversationMember( - conversationId: number, - userId: number, -): Promise { - const [row] = await db - .select({ userId: conversationParticipantsTable.userId }) - .from(conversationParticipantsTable) - .where( - and( - eq(conversationParticipantsTable.conversationId, conversationId), - eq(conversationParticipantsTable.userId, userId), - ), - ); - return !!row; -} - -async function getParticipantState( - conversationId: number, - userId: number, -): Promise<{ isMuted: boolean; isArchived: boolean } | null> { - const [row] = await db - .select({ - isMuted: conversationParticipantsTable.isMuted, - isArchived: conversationParticipantsTable.isArchived, - }) - .from(conversationParticipantsTable) - .where( - and( - eq(conversationParticipantsTable.conversationId, conversationId), - eq(conversationParticipantsTable.userId, userId), - ), - ); - return row ?? null; -} - -async function buildConversationDetails(conversationId: number, currentUserId: number) { - const [conv] = await db - .select() - .from(conversationsTable) - .where(eq(conversationsTable.id, conversationId)); - - if (!conv) return null; - - const participants = await db - .select({ - id: usersTable.id, - username: usersTable.username, - displayNameAr: usersTable.displayNameAr, - displayNameEn: usersTable.displayNameEn, - avatarUrl: usersTable.avatarUrl, - isAdmin: conversationParticipantsTable.isAdmin, - }) - .from(conversationParticipantsTable) - .innerJoin(usersTable, eq(conversationParticipantsTable.userId, usersTable.id)) - .where(eq(conversationParticipantsTable.conversationId, conversationId)); - - const lastMessages = await db - .select() - .from(messagesTable) - .where(eq(messagesTable.conversationId, conversationId)) - .orderBy(desc(messagesTable.createdAt)) - .limit(1); - - let lastMessage = null; - if (lastMessages.length > 0) { - const msg = lastMessages[0]; - const [sender] = await db - .select({ - id: usersTable.id, - username: usersTable.username, - displayNameAr: usersTable.displayNameAr, - displayNameEn: usersTable.displayNameEn, - avatarUrl: usersTable.avatarUrl, - isAdmin: sql`false`, - }) - .from(usersTable) - .where(eq(usersTable.id, msg.senderId)); - - lastMessage = { ...msg, sender }; - } - - const unreadResult = await db - .select({ count: sql`count(*)` }) - .from(messagesTable) - .where( - and( - eq(messagesTable.conversationId, conversationId), - eq(messagesTable.kind, "user"), - sql`${messagesTable.id} NOT IN ( - SELECT message_id FROM message_reads WHERE user_id = ${currentUserId} - )`, - sql`${messagesTable.senderId} != ${currentUserId}`, - ), - ); - - const unreadCount = Number(unreadResult[0]?.count ?? 0); - - const state = await getParticipantState(conversationId, currentUserId); - - return { - ...conv, - participants, - lastMessage, - unreadCount, - isMuted: state?.isMuted ?? false, - isArchived: state?.isArchived ?? false, - }; -} - -router.get("/conversations", requireAuth, async (req, res): Promise => { - const userId = req.session.userId!; - - const userConvs = await db - .select({ conversationId: conversationParticipantsTable.conversationId }) - .from(conversationParticipantsTable) - .where(eq(conversationParticipantsTable.userId, userId)); - - const results = await Promise.all( - userConvs.map((c) => buildConversationDetails(c.conversationId, userId)), - ); - - res.json(results.filter(Boolean)); -}); - -router.post("/conversations", requireAuth, async (req, res): Promise => { - const userId = req.session.userId!; - const parsed = CreateConversationBody.safeParse(req.body); - if (!parsed.success) { - res.status(400).json({ error: parsed.error.message }); - return; - } - - const { participantIds, nameAr, nameEn, isGroup, avatarUrl } = parsed.data; - - const allParticipants = [...new Set([userId, ...participantIds])]; - - const [conv] = await db - .insert(conversationsTable) - .values({ - nameAr: nameAr ?? null, - nameEn: nameEn ?? null, - avatarUrl: avatarUrl ?? null, - isGroup: isGroup ?? false, - createdBy: userId, - }) - .returning(); - - await db.insert(conversationParticipantsTable).values( - allParticipants.map((pid) => ({ - conversationId: conv.id, - userId: pid, - isAdmin: pid === userId, - })), - ); - - const details = await buildConversationDetails(conv.id, userId); - res.status(201).json(details); -}); - -router.get("/conversations/:id", requireAuth, async (req, res): Promise => { - const params = GetConversationParams.safeParse(req.params); - if (!params.success) { - res.status(400).json({ error: params.error.message }); - return; - } - - const userId = req.session.userId!; - - if (!(await isConversationMember(params.data.id, userId))) { - res.status(403).json({ error: "Forbidden" }); - return; - } - - const details = await buildConversationDetails(params.data.id, userId); - - if (!details) { - res.status(404).json({ error: "Conversation not found" }); - return; - } - - res.json(details); -}); - -router.patch("/conversations/:id", requireAuth, async (req, res): Promise => { - const params = UpdateConversationParams.safeParse(req.params); - if (!params.success) { - res.status(400).json({ error: params.error.message }); - return; - } - const parsed = UpdateConversationBody.safeParse(req.body); - if (!parsed.success) { - res.status(400).json({ error: parsed.error.message }); - return; - } - - const userId = req.session.userId!; - - const [participant] = await db - .select({ isAdmin: conversationParticipantsTable.isAdmin }) - .from(conversationParticipantsTable) - .where( - and( - eq(conversationParticipantsTable.conversationId, params.data.id), - eq(conversationParticipantsTable.userId, userId), - ), - ); - - if (!participant) { - res.status(403).json({ error: "Forbidden" }); - return; - } - if (!participant.isAdmin) { - res.status(403).json({ error: "Only group admins can update this conversation" }); - return; - } - - const [conv] = await db - .select({ - isGroup: conversationsTable.isGroup, - nameAr: conversationsTable.nameAr, - nameEn: conversationsTable.nameEn, - }) - .from(conversationsTable) - .where(eq(conversationsTable.id, params.data.id)); - if (!conv) { - res.status(404).json({ error: "Conversation not found" }); - return; - } - if (!conv.isGroup) { - res.status(400).json({ error: "Direct conversations cannot be updated" }); - return; - } - - const updates: Partial = {}; - if (parsed.data.avatarUrl !== undefined) { - updates.avatarUrl = parsed.data.avatarUrl; - } - if (parsed.data.nameAr !== undefined) { - const trimmed = parsed.data.nameAr?.trim(); - updates.nameAr = trimmed ? trimmed : null; - } - if (parsed.data.nameEn !== undefined) { - const trimmed = parsed.data.nameEn?.trim(); - updates.nameEn = trimmed ? trimmed : null; - } - - const finalNameAr = updates.nameAr !== undefined ? updates.nameAr : conv.nameAr; - const finalNameEn = updates.nameEn !== undefined ? updates.nameEn : conv.nameEn; - if ( - (updates.nameAr !== undefined || updates.nameEn !== undefined) && - !finalNameAr && - !finalNameEn - ) { - res.status(400).json({ error: "Group must have an Arabic or English name" }); - return; - } - - const nameChanged = - (updates.nameAr !== undefined && updates.nameAr !== conv.nameAr) || - (updates.nameEn !== undefined && updates.nameEn !== conv.nameEn); - - if (Object.keys(updates).length > 0) { - await db - .update(conversationsTable) - .set(updates) - .where(eq(conversationsTable.id, params.data.id)); - } - - if (nameChanged) { - const actor = await getUserDisplay(userId); - await insertAndEmitSystemMessage(params.data.id, userId, "group_renamed", { - actor, - oldNameAr: conv.nameAr, - oldNameEn: conv.nameEn, - newNameAr: finalNameAr, - newNameEn: finalNameEn, - }); - } - - const details = await buildConversationDetails(params.data.id, userId); - if (!details) { - res.status(404).json({ error: "Conversation not found" }); - return; - } - - await emitConversationUpdate(params.data.id); - - res.json(details); -}); - -async function evictUserFromConversationRoom( - userId: number, - conversationId: number, -): Promise { - const { io } = await import("../index.js"); - const sockets = await io.in(`user:${userId}`).fetchSockets(); - for (const s of sockets) { - s.leave(`conversation:${conversationId}`); - } -} - -type SystemMessageMeta = Record; - -async function getUserDisplay(userId: number): Promise<{ - id: number; - username: string; - displayNameAr: string | null; - displayNameEn: string | null; -} | null> { - const [u] = await db - .select({ - id: usersTable.id, - username: usersTable.username, - displayNameAr: usersTable.displayNameAr, - displayNameEn: usersTable.displayNameEn, - }) - .from(usersTable) - .where(eq(usersTable.id, userId)); - return u ?? null; -} - -async function getUsersDisplay(userIds: number[]): Promise< - Array<{ - id: number; - username: string; - displayNameAr: string | null; - displayNameEn: string | null; - }> -> { - if (userIds.length === 0) return []; - return db - .select({ - id: usersTable.id, - username: usersTable.username, - displayNameAr: usersTable.displayNameAr, - displayNameEn: usersTable.displayNameEn, - }) - .from(usersTable) - .where(sql`${usersTable.id} IN (${sql.join(userIds.map((id) => sql`${id}`), sql`, `)})`); -} - -async function insertAndEmitSystemMessage( - conversationId: number, - actorId: number, - kind: string, - meta: SystemMessageMeta, -): Promise { - const [msg] = await db - .insert(messagesTable) - .values({ - conversationId, - senderId: actorId, - content: "", - kind, - meta, - }) - .returning(); - - const [sender] = await db - .select({ - id: usersTable.id, - username: usersTable.username, - displayNameAr: usersTable.displayNameAr, - displayNameEn: usersTable.displayNameEn, - avatarUrl: usersTable.avatarUrl, - isAdmin: sql`false`, - }) - .from(usersTable) - .where(eq(usersTable.id, actorId)); - - const fullMessage = { ...msg, sender }; - const { io } = await import("../index.js"); - io.to(`conversation:${conversationId}`).emit("new_message", fullMessage); -} - -async function emitConversationUpdate(conversationId: number): Promise { - const { io } = await import("../index.js"); - const members = await db - .select({ userId: conversationParticipantsTable.userId }) - .from(conversationParticipantsTable) - .where(eq(conversationParticipantsTable.conversationId, conversationId)); - - io.to(`conversation:${conversationId}`).emit("conversation_updated", { - conversationId, - }); - for (const m of members) { - io.to(`user:${m.userId}`).emit("conversation_updated", { conversationId }); - } -} - -async function requireGroupAdmin( - conversationId: number, - userId: number, -): Promise<{ ok: true } | { ok: false; status: number; error: string }> { - const [participant] = await db - .select({ isAdmin: conversationParticipantsTable.isAdmin }) - .from(conversationParticipantsTable) - .where( - and( - eq(conversationParticipantsTable.conversationId, conversationId), - eq(conversationParticipantsTable.userId, userId), - ), - ); - if (!participant) return { ok: false, status: 403, error: "Forbidden" }; - if (!participant.isAdmin) { - return { ok: false, status: 403, error: "Only group admins can manage participants" }; - } - const [conv] = await db - .select({ isGroup: conversationsTable.isGroup }) - .from(conversationsTable) - .where(eq(conversationsTable.id, conversationId)); - if (!conv) return { ok: false, status: 404, error: "Conversation not found" }; - if (!conv.isGroup) { - return { ok: false, status: 400, error: "Direct conversations cannot be modified" }; - } - return { ok: true }; -} - -router.post( - "/conversations/:id/participants", - requireAuth, - async (req, res): Promise => { - const params = AddConversationParticipantsParams.safeParse(req.params); - if (!params.success) { - res.status(400).json({ error: params.error.message }); - return; - } - const parsed = AddConversationParticipantsBody.safeParse(req.body); - if (!parsed.success) { - res.status(400).json({ error: parsed.error.message }); - return; - } - const userId = req.session.userId!; - const guard = await requireGroupAdmin(params.data.id, userId); - if (!guard.ok) { - res.status(guard.status).json({ error: guard.error }); - return; - } - - const requestedIds = [...new Set(parsed.data.userIds)].filter((id) => Number.isInteger(id)); - if (requestedIds.length === 0) { - res.status(400).json({ error: "No users to add" }); - return; - } - - const existing = await db - .select({ userId: conversationParticipantsTable.userId }) - .from(conversationParticipantsTable) - .where(eq(conversationParticipantsTable.conversationId, params.data.id)); - const existingIds = new Set(existing.map((e) => e.userId)); - const toAdd = requestedIds.filter((id) => !existingIds.has(id)); - - if (toAdd.length > 0) { - const validUsers = await db - .select({ id: usersTable.id }) - .from(usersTable) - .where(sql`${usersTable.id} IN (${sql.join(toAdd.map((id) => sql`${id}`), sql`, `)})`); - const validIds = validUsers.map((u) => u.id); - if (validIds.length === 0) { - res.status(400).json({ error: "No valid users to add" }); - return; - } - await db - .insert(conversationParticipantsTable) - .values( - validIds.map((pid) => ({ - conversationId: params.data.id, - userId: pid, - isAdmin: false, - })), - ) - .onConflictDoNothing(); - - const [actor, addedUsers] = await Promise.all([ - getUserDisplay(userId), - getUsersDisplay(validIds), - ]); - await insertAndEmitSystemMessage(params.data.id, userId, "members_added", { - actor, - addedUsers, - }); - } - - const details = await buildConversationDetails(params.data.id, userId); - if (!details) { - res.status(404).json({ error: "Conversation not found" }); - return; - } - await emitConversationUpdate(params.data.id); - res.json(details); - }, -); - -router.delete( - "/conversations/:id/participants/:userId", - requireAuth, - async (req, res): Promise => { - const params = RemoveConversationParticipantParams.safeParse(req.params); - if (!params.success) { - res.status(400).json({ error: params.error.message }); - return; - } - const userId = req.session.userId!; - const guard = await requireGroupAdmin(params.data.id, userId); - if (!guard.ok) { - res.status(guard.status).json({ error: guard.error }); - return; - } - - if (params.data.userId === userId) { - res.status(400).json({ error: "Admins cannot remove themselves" }); - return; - } - - const deleted = await db - .delete(conversationParticipantsTable) - .where( - and( - eq(conversationParticipantsTable.conversationId, params.data.id), - eq(conversationParticipantsTable.userId, params.data.userId), - ), - ) - .returning({ userId: conversationParticipantsTable.userId }); - - await evictUserFromConversationRoom(params.data.userId, params.data.id); - - if (deleted.length > 0) { - const [actor, removedUser] = await Promise.all([ - getUserDisplay(userId), - getUserDisplay(params.data.userId), - ]); - await insertAndEmitSystemMessage(params.data.id, userId, "member_removed", { - actor, - removedUser, - }); - } - - const details = await buildConversationDetails(params.data.id, userId); - if (!details) { - res.status(404).json({ error: "Conversation not found" }); - return; - } - await emitConversationUpdate(params.data.id); - res.json(details); - }, -); - -router.patch( - "/conversations/:id/state", - requireAuth, - async (req, res): Promise => { - const params = UpdateConversationStateParams.safeParse(req.params); - if (!params.success) { - res.status(400).json({ error: params.error.message }); - return; - } - const parsed = UpdateConversationStateBody.safeParse(req.body); - if (!parsed.success) { - res.status(400).json({ error: parsed.error.message }); - return; - } - const userId = req.session.userId!; - - if (!(await isConversationMember(params.data.id, userId))) { - res.status(403).json({ error: "Forbidden" }); - return; - } - - const updates: { isMuted?: boolean; isArchived?: boolean } = {}; - if (parsed.data.isMuted !== undefined) updates.isMuted = parsed.data.isMuted; - if (parsed.data.isArchived !== undefined) updates.isArchived = parsed.data.isArchived; - - if (Object.keys(updates).length > 0) { - await db - .update(conversationParticipantsTable) - .set(updates) - .where( - and( - eq(conversationParticipantsTable.conversationId, params.data.id), - eq(conversationParticipantsTable.userId, userId), - ), - ); - } - - const details = await buildConversationDetails(params.data.id, userId); - if (!details) { - res.status(404).json({ error: "Conversation not found" }); - return; - } - res.json(details); - }, -); - -router.post( - "/conversations/:id/leave", - requireAuth, - async (req, res): Promise => { - const params = LeaveConversationParams.safeParse(req.params); - if (!params.success) { - res.status(400).json({ error: params.error.message }); - return; - } - const body = LeaveConversationBody.safeParse(req.body ?? {}); - if (!body.success) { - res.status(400).json({ error: body.error.message }); - return; - } - const requestedSuccessorId = body.data.successorId ?? null; - const userId = req.session.userId!; - - const [conv] = await db - .select({ isGroup: conversationsTable.isGroup }) - .from(conversationsTable) - .where(eq(conversationsTable.id, params.data.id)); - if (!conv) { - res.status(404).json({ error: "Conversation not found" }); - return; - } - if (!conv.isGroup) { - res.status(400).json({ error: "Cannot leave a direct conversation" }); - return; - } - - const participants = await db - .select({ - userId: conversationParticipantsTable.userId, - isAdmin: conversationParticipantsTable.isAdmin, - joinedAt: conversationParticipantsTable.joinedAt, - }) - .from(conversationParticipantsTable) - .where(eq(conversationParticipantsTable.conversationId, params.data.id)) - .orderBy(asc(conversationParticipantsTable.joinedAt)); - - const leaver = participants.find((p) => p.userId === userId); - if (!leaver) { - res.status(403).json({ error: "Forbidden" }); - return; - } - - const remaining = participants.filter((p) => p.userId !== userId); - - // If leaver was the only participant, clean up the conversation entirely. - if (remaining.length === 0) { - await db - .delete(conversationsTable) - .where(eq(conversationsTable.id, params.data.id)); - await evictUserFromConversationRoom(userId, params.data.id); - res.json({ success: true }); - return; - } - - // Determine if we need to promote a successor admin. - const leaverWasOnlyAdmin = - leaver.isAdmin && !remaining.some((p) => p.isAdmin); - let successor: (typeof remaining)[number] | null = null; - if (leaverWasOnlyAdmin) { - if (requestedSuccessorId !== null) { - const chosen = remaining.find( - (p) => p.userId === requestedSuccessorId, - ); - if (!chosen) { - res - .status(400) - .json({ error: "Chosen successor is not a member of this group" }); - return; - } - successor = chosen; - } else { - successor = remaining[0]; - } - } - - if (successor) { - await db - .update(conversationParticipantsTable) - .set({ isAdmin: true }) - .where( - and( - eq(conversationParticipantsTable.conversationId, params.data.id), - eq(conversationParticipantsTable.userId, successor.userId), - ), - ); - } - - // Announce the leave (and promotion) before removing the leaver so the - // system message has a sensible actor and members see it in real time. - const actor = await getUserDisplay(userId); - await insertAndEmitSystemMessage(params.data.id, userId, "member_left", { - actor, - }); - - if (successor) { - const promoted = await getUserDisplay(successor.userId); - await insertAndEmitSystemMessage( - params.data.id, - successor.userId, - "admin_promoted", - { promoted, reason: "previous_admin_left" }, - ); - } - - await db - .delete(conversationParticipantsTable) - .where( - and( - eq(conversationParticipantsTable.conversationId, params.data.id), - eq(conversationParticipantsTable.userId, userId), - ), - ); - - await evictUserFromConversationRoom(userId, params.data.id); - await emitConversationUpdate(params.data.id); - res.json({ success: true }); - }, -); - -router.get("/conversations/:id/messages", requireAuth, async (req, res): Promise => { - const params = ListMessagesParams.safeParse(req.params); - if (!params.success) { - res.status(400).json({ error: params.error.message }); - return; - } - - const userId = req.session.userId!; - - if (!(await isConversationMember(params.data.id, userId))) { - res.status(403).json({ error: "Forbidden" }); - return; - } - - const msgs = await db - .select() - .from(messagesTable) - .where(eq(messagesTable.conversationId, params.data.id)) - .orderBy(desc(messagesTable.createdAt)) - .limit(50); - - const messagesWithSenders = await Promise.all( - msgs.reverse().map(async (msg) => { - const [sender] = await db - .select({ - id: usersTable.id, - username: usersTable.username, - displayNameAr: usersTable.displayNameAr, - displayNameEn: usersTable.displayNameEn, - avatarUrl: usersTable.avatarUrl, - isAdmin: sql`false`, - }) - .from(usersTable) - .where(eq(usersTable.id, msg.senderId)); - - return { ...msg, sender }; - }), - ); - - res.json(messagesWithSenders); -}); - -router.post("/conversations/:id/messages", requireAuth, async (req, res): Promise => { - const params = SendMessageParams.safeParse(req.params); - if (!params.success) { - res.status(400).json({ error: params.error.message }); - return; - } - - const parsed = SendMessageBody.safeParse(req.body); - if (!parsed.success) { - res.status(400).json({ error: parsed.error.message }); - return; - } - - const userId = req.session.userId!; - - if (!(await isConversationMember(params.data.id, userId))) { - res.status(403).json({ error: "Forbidden" }); - return; - } - - const [msg] = await db - .insert(messagesTable) - .values({ - conversationId: params.data.id, - senderId: userId, - content: parsed.data.content, - }) - .returning(); - - // Auto-unarchive for all participants when a new message arrives - await db - .update(conversationParticipantsTable) - .set({ isArchived: false }) - .where( - and( - eq(conversationParticipantsTable.conversationId, params.data.id), - eq(conversationParticipantsTable.isArchived, true), - ), - ); - - const [sender] = await db - .select({ - id: usersTable.id, - username: usersTable.username, - displayNameAr: usersTable.displayNameAr, - displayNameEn: usersTable.displayNameEn, - avatarUrl: usersTable.avatarUrl, - isAdmin: sql`false`, - }) - .from(usersTable) - .where(eq(usersTable.id, userId)); - - const fullMessage = { ...msg, sender }; - - const { io } = await import("../index.js"); - io.to(`conversation:${params.data.id}`).emit("new_message", fullMessage); - - await createMessageNotifications({ - conversationId: params.data.id, - senderId: userId, - sender, - content: parsed.data.content, - }); - - res.status(201).json(fullMessage); -}); - -async function createMessageNotifications(input: { - conversationId: number; - senderId: number; - sender: { - displayNameAr: string | null; - displayNameEn: string | null; - username: string; - }; - content: string; -}): Promise { - const recipients = await db - .select({ userId: conversationParticipantsTable.userId }) - .from(conversationParticipantsTable) - .where( - and( - eq(conversationParticipantsTable.conversationId, input.conversationId), - eq(conversationParticipantsTable.isMuted, false), - sql`${conversationParticipantsTable.userId} != ${input.senderId}`, - ), - ); - - if (recipients.length === 0) return; - - const [conv] = await db - .select({ - isGroup: conversationsTable.isGroup, - nameAr: conversationsTable.nameAr, - nameEn: conversationsTable.nameEn, - }) - .from(conversationsTable) - .where(eq(conversationsTable.id, input.conversationId)); - if (!conv) return; - - const senderNameAr = - input.sender.displayNameAr || input.sender.displayNameEn || input.sender.username; - const senderNameEn = - input.sender.displayNameEn || input.sender.displayNameAr || input.sender.username; - - const preview = input.content.trim().slice(0, 140); - - let titleAr: string; - let titleEn: string; - let bodyAr: string | null; - let bodyEn: string | null; - - if (conv.isGroup) { - const groupNameAr = conv.nameAr || conv.nameEn || senderNameAr; - const groupNameEn = conv.nameEn || conv.nameAr || senderNameEn; - titleAr = groupNameAr; - titleEn = groupNameEn; - bodyAr = preview ? `${senderNameAr}: ${preview}` : senderNameAr; - bodyEn = preview ? `${senderNameEn}: ${preview}` : senderNameEn; - } else { - titleAr = senderNameAr; - titleEn = senderNameEn; - bodyAr = preview || null; - bodyEn = preview || null; - } - - await db.insert(notificationsTable).values( - recipients.map((r) => ({ - userId: r.userId, - titleAr, - titleEn, - bodyAr, - bodyEn, - type: "chat", - relatedId: input.conversationId, - relatedType: "conversation", - })), - ); - - const { io } = await import("../index.js"); - for (const r of recipients) { - io.to(`user:${r.userId}`).emit("notification_created", { - type: "chat", - relatedId: input.conversationId, - relatedType: "conversation", - }); - } -} - -router.post("/conversations/:id/read", requireAuth, async (req, res): Promise => { - const params = MarkConversationReadParams.safeParse(req.params); - if (!params.success) { - res.status(400).json({ error: params.error.message }); - return; - } - - const userId = req.session.userId!; - - if (!(await isConversationMember(params.data.id, userId))) { - res.status(403).json({ error: "Forbidden" }); - return; - } - - const unreadMessages = await db - .select({ id: messagesTable.id }) - .from(messagesTable) - .where( - and( - eq(messagesTable.conversationId, params.data.id), - sql`${messagesTable.id} NOT IN ( - SELECT message_id FROM message_reads WHERE user_id = ${userId} - )`, - ), - ); - - if (unreadMessages.length > 0) { - await db.insert(messageReadsTable).values( - unreadMessages.map((m) => ({ messageId: m.id, userId })), - ).onConflictDoNothing(); - - const { io } = await import("../index.js"); - io.to(`conversation:${params.data.id}`).emit("messages_read", { - conversationId: params.data.id, - userId, - }); - } - - res.json({ success: true }); -}); - -export default router; diff --git a/artifacts/api-server/src/routes/index.ts b/artifacts/api-server/src/routes/index.ts index 43a82980..21762dfe 100644 --- a/artifacts/api-server/src/routes/index.ts +++ b/artifacts/api-server/src/routes/index.ts @@ -4,7 +4,6 @@ import authRouter from "./auth"; import appsRouter from "./apps"; import servicesRouter from "./services"; import serviceOrdersRouter from "./service-orders"; -import conversationsRouter from "./conversations"; import notificationsRouter from "./notifications"; import usersRouter from "./users"; import statsRouter from "./stats"; @@ -23,7 +22,6 @@ router.use(authRouter); router.use(appsRouter); router.use(servicesRouter); router.use(serviceOrdersRouter); -router.use(conversationsRouter); router.use(notificationsRouter); router.use(usersRouter); router.use(statsRouter); diff --git a/artifacts/api-server/src/routes/stats.ts b/artifacts/api-server/src/routes/stats.ts index b5c82949..cded8aa9 100644 --- a/artifacts/api-server/src/routes/stats.ts +++ b/artifacts/api-server/src/routes/stats.ts @@ -10,8 +10,6 @@ import { servicesTable, notificationsTable, usersTable, - messagesTable, - messageReadsTable, appOpensTable, } from "@workspace/db"; import { requireAuth, requireAdmin } from "../middlewares/auth"; @@ -91,23 +89,10 @@ router.get("/stats/home", requireAuth, async (req, res): Promise => { .select({ count: sql`count(*)` }) .from(usersTable); - const [unreadMsgCount] = await db - .select({ count: sql`count(*)` }) - .from(messagesTable) - .where( - and( - sql`${messagesTable.id} NOT IN ( - SELECT message_id FROM message_reads WHERE user_id = ${userId} - )`, - sql`${messagesTable.senderId} != ${userId}`, - ), - ); - res.json({ totalApps: Number(appsCount?.count ?? 0), totalServices: Number(servicesCount?.count ?? 0), unreadNotifications: Number(unreadNotifCount?.count ?? 0), - unreadMessages: Number(unreadMsgCount?.count ?? 0), totalUsers: Number(usersCount?.count ?? 0), }); }); diff --git a/artifacts/api-server/src/routes/users.ts b/artifacts/api-server/src/routes/users.ts index c12063ef..c9537854 100644 --- a/artifacts/api-server/src/routes/users.ts +++ b/artifacts/api-server/src/routes/users.ts @@ -10,8 +10,6 @@ import { notesTable, serviceOrdersTable, servicesTable, - conversationsTable, - messagesTable, auditLogsTable, } from "@workspace/db"; import { requireAuth, requireAdmin, getUserRoles } from "../middlewares/auth"; @@ -74,8 +72,6 @@ export async function getGroupsForUser(userId: number): Promise type DependencyCounts = { noteCount: number; orderCount: number; - conversationCount: number; - messageCount: number; }; function buildUserProfile( @@ -293,27 +289,9 @@ router.get("/users", requireAdmin, async (req, res): Promise => { .from(serviceOrdersTable) .where(inArray(serviceOrdersTable.userId, userIds)) .groupBy(serviceOrdersTable.userId); - const convRows = await db - .select({ - userId: conversationsTable.createdBy, - count: sql`count(*)::int`, - }) - .from(conversationsTable) - .where(inArray(conversationsTable.createdBy, userIds)) - .groupBy(conversationsTable.createdBy); - const msgRows = await db - .select({ - userId: messagesTable.senderId, - count: sql`count(*)::int`, - }) - .from(messagesTable) - .where(inArray(messagesTable.senderId, userIds)) - .groupBy(messagesTable.senderId); const noteMap = new Map(noteRows.map((r) => [r.userId, r.count])); const orderMap = new Map(orderRows.map((r) => [r.userId, r.count])); - const convMap = new Map(convRows.map((r) => [r.userId, r.count])); - const msgMap = new Map(msgRows.map((r) => [r.userId, r.count])); res.json( users.map((u) => @@ -324,8 +302,6 @@ router.get("/users", requireAdmin, async (req, res): Promise => { { noteCount: noteMap.get(u.id) ?? 0, orderCount: orderMap.get(u.id) ?? 0, - conversationCount: convMap.get(u.id) ?? 0, - messageCount: msgMap.get(u.id) ?? 0, }, ), ), @@ -481,87 +457,6 @@ router.get( }, ); -router.get( - "/admin/users/:id/dependents/conversations", - requireAdmin, - async (req, res): Promise => { - const id = Number(req.params.id); - if (!Number.isInteger(id) || id <= 0) { - res.status(400).json({ error: "Invalid id" }); - return; - } - if (!(await ensureUserExists(id))) { - res.status(404).json({ error: "User not found" }); - return; - } - const { limit, offset } = parseUserDependentsPaging(req); - const [{ count: totalCount }] = await db - .select({ count: sql`count(*)::int` }) - .from(conversationsTable) - .where(eq(conversationsTable.createdBy, id)); - const items = await db - .select({ - id: conversationsTable.id, - nameAr: conversationsTable.nameAr, - nameEn: conversationsTable.nameEn, - isGroup: conversationsTable.isGroup, - createdAt: conversationsTable.createdAt, - }) - .from(conversationsTable) - .where(eq(conversationsTable.createdBy, id)) - .orderBy(sql`${conversationsTable.updatedAt} desc`) - .limit(limit) - .offset(offset); - const nextOffset = offset + items.length < totalCount ? offset + items.length : null; - res.json({ items, totalCount, limit, offset, nextOffset }); - }, -); - -router.get( - "/admin/users/:id/dependents/messages", - requireAdmin, - async (req, res): Promise => { - const id = Number(req.params.id); - if (!Number.isInteger(id) || id <= 0) { - res.status(400).json({ error: "Invalid id" }); - return; - } - if (!(await ensureUserExists(id))) { - res.status(404).json({ error: "User not found" }); - return; - } - const { limit, offset } = parseUserDependentsPaging(req); - const [{ count: totalCount }] = await db - .select({ count: sql`count(*)::int` }) - .from(messagesTable) - .where(eq(messagesTable.senderId, id)); - // Join conversation context so the popover can show *where* the user - // talked, not just an opaque list of message IDs. - const items = await db - .select({ - id: messagesTable.id, - content: messagesTable.content, - kind: messagesTable.kind, - createdAt: messagesTable.createdAt, - conversationId: conversationsTable.id, - conversationNameAr: conversationsTable.nameAr, - conversationNameEn: conversationsTable.nameEn, - conversationIsGroup: conversationsTable.isGroup, - }) - .from(messagesTable) - .innerJoin( - conversationsTable, - eq(messagesTable.conversationId, conversationsTable.id), - ) - .where(eq(messagesTable.senderId, id)) - .orderBy(sql`${messagesTable.createdAt} desc`) - .limit(limit) - .offset(offset); - const nextOffset = offset + items.length < totalCount ? offset + items.length : null; - res.json({ items, totalCount, limit, offset, nextOffset }); - }, -); - router.get("/users/:id", requireAdmin, async (req, res): Promise => { const params = GetUserParams.safeParse(req.params); if (!params.success) { @@ -858,51 +753,21 @@ router.delete("/users/:id", requireAdmin, async (req, res): Promise => { .select({ count: sql`count(*)::int` }) .from(serviceOrdersTable) .where(eq(serviceOrdersTable.userId, userId)); - const [convRow] = await db - .select({ count: sql`count(*)::int` }) - .from(conversationsTable) - .where(eq(conversationsTable.createdBy, userId)); - const [msgRow] = await db - .select({ count: sql`count(*)::int` }) - .from(messagesTable) - .where(eq(messagesTable.senderId, userId)); const noteCount = noteRow?.count ?? 0; const orderCount = orderRow?.count ?? 0; - const conversationCount = convRow?.count ?? 0; - const messageCount = msgRow?.count ?? 0; - const hasDeps = - noteCount > 0 || - orderCount > 0 || - conversationCount > 0 || - messageCount > 0; + const hasDeps = noteCount > 0 || orderCount > 0; if (hasDeps && !force) { res.status(409).json({ error: "User has dependent records", noteCount, orderCount, - conversationCount, - messageCount, }); return; } await db.transaction(async (tx) => { - if (force) { - // Hard cleanup of records that don't cascade automatically so the - // user delete can succeed without FK violations. - if (conversationCount > 0) { - await tx - .delete(conversationsTable) - .where(eq(conversationsTable.createdBy, userId)); - } - if (messageCount > 0) { - await tx - .delete(messagesTable) - .where(eq(messagesTable.senderId, userId)); - } - } await tx.delete(usersTable).where(eq(usersTable.id, userId)); }); @@ -917,9 +782,7 @@ router.delete("/users/:id", requireAdmin, async (req, res): Promise => { displayNameAr: existing.displayNameAr, email: existing.email, force, - ...(hasDeps - ? { noteCount, orderCount, conversationCount, messageCount } - : {}), + ...(hasDeps ? { noteCount, orderCount } : {}), }, }); diff --git a/artifacts/api-server/tests/audit-log-coverage.test.mjs b/artifacts/api-server/tests/audit-log-coverage.test.mjs index 3a088b69..198fd53b 100644 --- a/artifacts/api-server/tests/audit-log-coverage.test.mjs +++ b/artifacts/api-server/tests/audit-log-coverage.test.mjs @@ -237,17 +237,6 @@ after(async () => { await pool.query(`DELETE FROM password_reset_tokens WHERE user_id = $1`, [ uid, ]); - // Drop messages and conversations the user created/sent — the 409 - // user-delete test deliberately seeds these and the FK to users - // is RESTRICT, so they must go before the user row can be removed. - await pool.query(`DELETE FROM messages WHERE sender_id = $1`, [uid]); - await pool.query( - `DELETE FROM messages WHERE conversation_id IN (SELECT id FROM conversations WHERE created_by = $1)`, - [uid], - ); - await pool.query(`DELETE FROM conversations WHERE created_by = $1`, [ - uid, - ]); await pool.query(`DELETE FROM user_groups WHERE user_id = $1`, [uid]); await pool.query(`DELETE FROM user_roles WHERE user_id = $1`, [uid]); await pool.query(`DELETE FROM users WHERE id = $1`, [uid]); @@ -305,20 +294,14 @@ test("DELETE /api/users/:id (no-force, no deps) writes one user.delete row with // No-deps path must NOT include the dependency counts. assert.equal(row.metadata.noteCount, undefined); assert.equal(row.metadata.orderCount, undefined); - assert.equal(row.metadata.conversationCount, undefined); - assert.equal(row.metadata.messageCount, undefined); }); test("DELETE /api/users/:id without force on a user with deps returns 409 and writes NO audit row", async () => { const { id } = await insertUser("u_409"); // Give the user a dependency that blocks delete. - const conv = await pool.query( - `INSERT INTO conversations (created_by, is_group) VALUES ($1, true) RETURNING id`, - [id], - ); await pool.query( - `INSERT INTO messages (conversation_id, sender_id, content) VALUES ($1, $2, 'hi')`, - [conv.rows[0].id, id], + `INSERT INTO notes (user_id, title, content) VALUES ($1, 'n', 'x')`, + [id], ); const res = await fetch(`${API_BASE}/api/users/${id}`, { @@ -348,13 +331,9 @@ test("DELETE /api/users/:id?force=true writes one user.delete row with force=tru const { id, username } = await insertUser("u_f"); // Add a dependency so the force branch is taken meaningfully. - const conv = await pool.query( - `INSERT INTO conversations (created_by, is_group) VALUES ($1, true) RETURNING id`, - [id], - ); await pool.query( - `INSERT INTO messages (conversation_id, sender_id, content) VALUES ($1, $2, 'hi')`, - [conv.rows[0].id, id], + `INSERT INTO notes (user_id, title, content) VALUES ($1, 'n', 'x')`, + [id], ); const res = await fetch(`${API_BASE}/api/users/${id}?force=true`, { @@ -374,10 +353,8 @@ test("DELETE /api/users/:id?force=true writes one user.delete row with force=tru assert.equal(row.metadata.username, username); assert.equal(row.metadata.force, true); // Force-with-deps path records the counts. - assert.equal(typeof row.metadata.conversationCount, "number"); - assert.equal(typeof row.metadata.messageCount, "number"); - assert.ok(row.metadata.conversationCount >= 1); - assert.ok(row.metadata.messageCount >= 1); + assert.equal(typeof row.metadata.noteCount, "number"); + assert.ok(row.metadata.noteCount >= 1); }); // ---------- roles ---------- diff --git a/artifacts/api-server/tests/conversations-leave.test.mjs b/artifacts/api-server/tests/conversations-leave.test.mjs deleted file mode 100644 index 9d35a8fe..00000000 --- a/artifacts/api-server/tests/conversations-leave.test.mjs +++ /dev/null @@ -1,265 +0,0 @@ -import { test, before, after } from "node:test"; -import assert from "node:assert/strict"; -import pg from "pg"; - -const API_BASE = process.env.TEST_API_BASE ?? "http://localhost:8080"; -const DATABASE_URL = process.env.DATABASE_URL; -if (!DATABASE_URL) { - throw new Error("DATABASE_URL must be set to run these tests"); -} - -const TEST_PASSWORD = "TestPass123!"; -const TEST_PASSWORD_HASH = - "$2b$10$Bs636ukPMyz01nKrsi.5m.JlDXSN22AVCvn8cgPWWDbo5yJRQX2vu"; - -const pool = new pg.Pool({ connectionString: DATABASE_URL }); - -const createdUserIds = []; -const createdConversationIds = []; - -async function createUser(prefix) { - const username = `${prefix}_${Date.now().toString(36)}_${Math.random() - .toString(36) - .slice(2, 8)}`; - const { rows } = await pool.query( - `INSERT INTO users (username, email, password_hash, display_name_en, preferred_language, is_active) - VALUES ($1, $2, $3, 'Leave Test', 'en', true) RETURNING id`, - [username, `${username}@example.com`, TEST_PASSWORD_HASH], - ); - const id = rows[0].id; - createdUserIds.push(id); - await pool.query( - `INSERT INTO user_roles (user_id, role_id) - SELECT $1, id FROM roles WHERE name = 'user'`, - [id], - ); - return { id, username }; -} - -async function loginAndGetCookie(username, password) { - const res = await fetch(`${API_BASE}/api/auth/login`, { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ username, password }), - }); - assert.equal(res.status, 200, `login expected 200, got ${res.status}`); - const setCookie = res.headers.get("set-cookie"); - assert.ok(setCookie, "expected Set-Cookie header from login"); - const sid = setCookie - .split(",") - .map((c) => c.split(";")[0].trim()) - .find((c) => c.startsWith("connect.sid=")); - assert.ok(sid, "expected connect.sid cookie"); - return sid; -} - -async function createGroup(creatorId, members) { - const { rows } = await pool.query( - `INSERT INTO conversations (name_en, is_group, created_by) - VALUES ('Leave Test Group', true, $1) RETURNING id`, - [creatorId], - ); - const conversationId = rows[0].id; - createdConversationIds.push(conversationId); - - // Insert participants in a deterministic joined_at order so that auto - // promotion picks the expected user. - let offsetMs = 0; - for (const m of members) { - await pool.query( - `INSERT INTO conversation_participants - (conversation_id, user_id, is_admin, joined_at) - VALUES ($1, $2, $3, NOW() - ($4 || ' milliseconds')::interval)`, - [conversationId, m.userId, !!m.isAdmin, 10000 - offsetMs], - ); - offsetMs += 1000; - } - return conversationId; -} - -async function getParticipants(conversationId) { - const { rows } = await pool.query( - `SELECT user_id AS "userId", is_admin AS "isAdmin" - FROM conversation_participants - WHERE conversation_id = $1 - ORDER BY joined_at ASC`, - [conversationId], - ); - return rows; -} - -async function conversationExists(conversationId) { - const { rows } = await pool.query( - `SELECT 1 FROM conversations WHERE id = $1`, - [conversationId], - ); - return rows.length > 0; -} - -async function leave(conversationId, cookie, body) { - const res = await fetch( - `${API_BASE}/api/conversations/${conversationId}/leave`, - { - method: "POST", - headers: { - Cookie: cookie, - "Content-Type": "application/json", - }, - body: JSON.stringify(body ?? {}), - }, - ); - if (process.env.LEAVE_TEST_DEBUG && res.status >= 400) { - const text = await res.clone().text(); - console.error( - `[leave debug] status=${res.status} cookie=${cookie} body=${text}`, - ); - } - return res; -} - -after(async () => { - if (createdConversationIds.length > 0) { - await pool.query( - `DELETE FROM messages WHERE conversation_id = ANY($1::int[])`, - [createdConversationIds], - ); - await pool.query( - `DELETE FROM conversation_participants WHERE conversation_id = ANY($1::int[])`, - [createdConversationIds], - ); - await pool.query( - `DELETE FROM conversations WHERE id = ANY($1::int[])`, - [createdConversationIds], - ); - } - if (createdUserIds.length > 0) { - await pool.query(`DELETE FROM user_roles WHERE user_id = ANY($1::int[])`, [ - createdUserIds, - ]); - await pool.query(`DELETE FROM users WHERE id = ANY($1::int[])`, [ - createdUserIds, - ]); - } - await pool.end(); -}); - -test("solo member leaving a group deletes the conversation", async () => { - const solo = await createUser("leave_solo"); - const conv = await createGroup(solo.id, [{ userId: solo.id, isAdmin: true }]); - const cookie = await loginAndGetCookie(solo.username, TEST_PASSWORD); - - const res = await leave(conv, cookie); - assert.equal(res.status, 200); - const json = await res.json(); - assert.equal(json.success, true); - - assert.equal( - await conversationExists(conv), - false, - "conversation should be deleted when last member leaves", - ); -}); - -test("sole admin leaving auto-promotes the earliest remaining member", async () => { - const admin = await createUser("leave_admin_auto"); - const m1 = await createUser("leave_m1"); - const m2 = await createUser("leave_m2"); - // admin joined first, then m1, then m2 (handled by createGroup ordering) - const conv = await createGroup(admin.id, [ - { userId: admin.id, isAdmin: true }, - { userId: m1.id, isAdmin: false }, - { userId: m2.id, isAdmin: false }, - ]); - const cookie = await loginAndGetCookie(admin.username, TEST_PASSWORD); - - const res = await leave(conv, cookie); - assert.equal(res.status, 200); - - const parts = await getParticipants(conv); - assert.equal(parts.length, 2); - assert.ok( - !parts.find((p) => p.userId === admin.id), - "leaver must be removed", - ); - const promoted = parts.find((p) => p.isAdmin); - assert.ok(promoted, "an admin should have been auto-promoted"); - assert.equal( - promoted.userId, - m1.id, - "earliest joined remaining member should be promoted", - ); -}); - -test("sole admin leaving with a chosen successor promotes that user", async () => { - const admin = await createUser("leave_admin_chosen"); - const m1 = await createUser("leave_chosen_m1"); - const m2 = await createUser("leave_chosen_m2"); - const conv = await createGroup(admin.id, [ - { userId: admin.id, isAdmin: true }, - { userId: m1.id, isAdmin: false }, - { userId: m2.id, isAdmin: false }, - ]); - const cookie = await loginAndGetCookie(admin.username, TEST_PASSWORD); - - const res = await leave(conv, cookie, { successorId: m2.id }); - assert.equal(res.status, 200); - - const parts = await getParticipants(conv); - assert.equal(parts.length, 2); - const promoted = parts.find((p) => p.isAdmin); - assert.ok(promoted, "an admin should be present after handoff"); - assert.equal( - promoted.userId, - m2.id, - "the chosen successor should be the new admin", - ); -}); - -test("sole admin leaving with an invalid successor returns 400 and does not leave", async () => { - const admin = await createUser("leave_admin_bad"); - const m1 = await createUser("leave_bad_m1"); - const outsider = await createUser("leave_bad_outsider"); - const conv = await createGroup(admin.id, [ - { userId: admin.id, isAdmin: true }, - { userId: m1.id, isAdmin: false }, - ]); - const cookie = await loginAndGetCookie(admin.username, TEST_PASSWORD); - - const res = await leave(conv, cookie, { successorId: outsider.id }); - assert.equal(res.status, 400); - - const parts = await getParticipants(conv); - assert.equal(parts.length, 2, "membership should be unchanged"); - const adminRow = parts.find((p) => p.userId === admin.id); - assert.ok(adminRow, "leaver should still be a member"); - assert.equal(adminRow.isAdmin, true, "leaver should still be admin"); - const m1Row = parts.find((p) => p.userId === m1.id); - assert.equal(m1Row.isAdmin, false, "m1 should not have been promoted"); -}); - -test("non-admin leaving a group does not promote anyone", async () => { - const admin = await createUser("leave_keep_admin"); - const m1 = await createUser("leave_nonadmin_leaver"); - const m2 = await createUser("leave_nonadmin_other"); - const conv = await createGroup(admin.id, [ - { userId: admin.id, isAdmin: true }, - { userId: m1.id, isAdmin: false }, - { userId: m2.id, isAdmin: false }, - ]); - const cookie = await loginAndGetCookie(m1.username, TEST_PASSWORD); - - const res = await leave(conv, cookie); - assert.equal(res.status, 200); - - const parts = await getParticipants(conv); - assert.equal(parts.length, 2); - assert.ok( - !parts.find((p) => p.userId === m1.id), - "leaver must be removed", - ); - const admins = parts.filter((p) => p.isAdmin); - assert.equal(admins.length, 1, "exactly the original admin remains admin"); - assert.equal(admins[0].userId, admin.id); - const m2Row = parts.find((p) => p.userId === m2.id); - assert.equal(m2Row.isAdmin, false, "non-admin member should not be promoted"); -}); diff --git a/artifacts/api-server/tests/delete-force-warnings.test.mjs b/artifacts/api-server/tests/delete-force-warnings.test.mjs index ff9b9ab3..ca22d448 100644 --- a/artifacts/api-server/tests/delete-force-warnings.test.mjs +++ b/artifacts/api-server/tests/delete-force-warnings.test.mjs @@ -138,10 +138,6 @@ after(async () => { } for (const uid of [adminId, ...createdUserIds]) { if (uid !== undefined) { - await pool.query(`DELETE FROM messages WHERE sender_id = $1`, [uid]); - await pool.query(`DELETE FROM conversations WHERE created_by = $1`, [ - uid, - ]); await pool.query(`DELETE FROM notes WHERE user_id = $1`, [uid]); await pool.query(`DELETE FROM service_orders WHERE user_id = $1`, [uid]); await pool.query(`DELETE FROM user_groups WHERE user_id = $1`, [uid]); @@ -187,15 +183,6 @@ test("DELETE /api/users/:id with dependents returns 409 with counts", async () = `INSERT INTO notes (user_id, title, content) VALUES ($1, 'Note A', 'x'), ($1, 'Note B', 'y')`, [uid], ); - const conv = await pool.query( - `INSERT INTO conversations (created_by, name_en, is_group) VALUES ($1, 'Test Conv', true) RETURNING id`, - [uid], - ); - const convId = conv.rows[0].id; - await pool.query( - `INSERT INTO messages (conversation_id, sender_id, content) VALUES ($1, $2, 'hello')`, - [convId, uid], - ); const res = await fetch(`${API_BASE}/api/users/${uid}`, { method: "DELETE", @@ -204,8 +191,6 @@ test("DELETE /api/users/:id with dependents returns 409 with counts", async () = assert.equal(res.status, 409); const body = await res.json(); assert.equal(body.noteCount, 2); - assert.equal(body.conversationCount, 1); - assert.equal(body.messageCount, 1); const stillThere = await pool.query(`SELECT id FROM users WHERE id = $1`, [ uid, @@ -225,14 +210,6 @@ test("DELETE /api/users/:id?force=true deletes user and writes audit log", async await pool.query(`INSERT INTO notes (user_id, title) VALUES ($1, 'n')`, [ uid, ]); - const conv = await pool.query( - `INSERT INTO conversations (created_by, name_en, is_group) VALUES ($1, 'Conv', true) RETURNING id`, - [uid], - ); - await pool.query( - `INSERT INTO messages (conversation_id, sender_id, content) VALUES ($1, $2, 'hi')`, - [conv.rows[0].id, uid], - ); const res = await fetch(`${API_BASE}/api/users/${uid}?force=true`, { method: "DELETE", diff --git a/artifacts/api-server/tests/list-dependency-counts.test.mjs b/artifacts/api-server/tests/list-dependency-counts.test.mjs index f96374fe..340da53b 100644 --- a/artifacts/api-server/tests/list-dependency-counts.test.mjs +++ b/artifacts/api-server/tests/list-dependency-counts.test.mjs @@ -23,7 +23,6 @@ let depAppId; let depServiceId; let depGroupId; let depPermissionId; -let depConvId; async function loginAndGetCookie(username, password) { const res = await fetch(`${API_BASE}/api/auth/login`, { @@ -86,7 +85,7 @@ before(async () => { ); depPermissionId = perm.rows[0].id; - // Dependents on the user: a note, an order, a conversation, a message. + // Dependents on the user: a note and an order. await pool.query( `INSERT INTO notes (user_id, content) VALUES ($1, 'note for dep test')`, [depUserId], @@ -96,20 +95,6 @@ before(async () => { VALUES ($1, $2, 'pending', 'dep order')`, [depServiceId, depUserId], ); - const conv = await pool.query( - `INSERT INTO conversations (is_group, name_en, created_by) - VALUES (true, 'dep conv', $1) RETURNING id`, - [depUserId], - ); - depConvId = conv.rows[0].id; - await pool.query( - `INSERT INTO conversation_participants (conversation_id, user_id) VALUES ($1, $2)`, - [depConvId, depUserId], - ); - await pool.query( - `INSERT INTO messages (conversation_id, sender_id, content) VALUES ($1, $2, 'hi')`, - [depConvId, depUserId], - ); // App dependents: group link, permission restriction, an open record. await pool.query( @@ -129,9 +114,6 @@ before(async () => { }); after(async () => { - await pool.query(`DELETE FROM messages WHERE sender_id = $1`, [depUserId]); - await pool.query(`DELETE FROM conversation_participants WHERE user_id = $1`, [depUserId]); - await pool.query(`DELETE FROM conversations WHERE id = $1`, [depConvId]); await pool.query(`DELETE FROM service_orders WHERE user_id = $1`, [depUserId]); await pool.query(`DELETE FROM notes WHERE user_id = $1`, [depUserId]); await pool.query(`DELETE FROM app_opens WHERE app_id = $1`, [depAppId]); @@ -170,7 +152,7 @@ test("GET /api/services exposes orderCount", async () => { assert.equal(target.orderCount, 1, "orderCount should be 1"); }); -test("GET /api/users exposes noteCount/orderCount/conversationCount/messageCount", async () => { +test("GET /api/users exposes noteCount/orderCount", async () => { const res = await fetch(`${API_BASE}/api/users`, { headers: { Cookie: adminCookie }, }); @@ -180,8 +162,6 @@ test("GET /api/users exposes noteCount/orderCount/conversationCount/messageCount assert.ok(target, "expected dep user in users list"); assert.equal(target.noteCount, 1, "noteCount should be 1"); assert.equal(target.orderCount, 1, "orderCount should be 1"); - assert.equal(target.conversationCount, 1, "conversationCount should be 1"); - assert.equal(target.messageCount, 1, "messageCount should be 1"); }); test("Apps list returns zero counts for entities without dependents", async () => { @@ -248,8 +228,6 @@ test("Users list returns zero counts for users without dependents", async () => assert.ok(target, "expected clean user in users list"); assert.equal(target.noteCount, 0); assert.equal(target.orderCount, 0); - assert.equal(target.conversationCount, 0); - assert.equal(target.messageCount, 0); } finally { await pool.query(`DELETE FROM users WHERE id = $1`, [cleanUserId]); } diff --git a/artifacts/tx-os/public/opengraph.jpg b/artifacts/tx-os/public/opengraph.jpg index cdee646912ab1699a041476c2034d196536a7334..c5ec49188965b763a16f625e59e8ad81bb7123cf 100644 GIT binary patch literal 26059 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 literal 26001 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 - diff --git a/artifacts/tx-os/src/locales/ar.json b/artifacts/tx-os/src/locales/ar.json index 3dea7087..8a2ffcab 100644 --- a/artifacts/tx-os/src/locales/ar.json +++ b/artifacts/tx-os/src/locales/ar.json @@ -2,7 +2,6 @@ "nav": { "home": "الرئيسية", "services": "الخدمات", - "chat": "المحادثات", "notifications": "الإشعارات", "admin": "لوحة التحكم", "logout": "تسجيل الخروج" @@ -75,7 +74,6 @@ "stats": { "apps": "التطبيقات", "services": "الخدمات", - "messages": "الرسائل", "alerts": "التنبيهات" }, "clockStyle": { @@ -206,103 +204,6 @@ "deleteFailed": "تعذّر حذف الطلبات", "deletePartial": "تم حذف {{deleted}} من {{total}}، تعذّر حذف الباقي" }, - "chat": { - "title": "المحادثات", - "newMessage": "رسالة جديدة", - "typeMessage": "اكتب رسالتك...", - "send": "إرسال", - "noConversations": "لا توجد محادثات", - "createConversation": "محادثة جديدة", - "groupChat": "مجموعة", - "directMessage": "محادثة خاصة", - "participants": "المشاركون", - "searchUsers": "البحث عن مستخدمين", - "modeDirect": "محادثة خاصة", - "modeGroup": "مجموعة", - "groupNameAr": "اسم المجموعة (عربي)", - "groupNameEn": "اسم المجموعة (إنجليزي)", - "groupNamePlaceholderAr": "مثلاً: فريق المبيعات", - "groupNamePlaceholderEn": "e.g. Sales team", - "searchUsersPlaceholder": "ابحث بالاسم أو اسم المستخدم", - "participantsCount_one": "{{count}} شخص مختار", - "participantsCount_other": "{{count}} أشخاص مختارين", - "participantsCount_zero": "لم يتم اختيار أحد", - "noUsersFound": "لا يوجد مستخدمون مطابقون", - "uploadAvatar": "رفع صورة", - "replaceAvatar": "استبدال الصورة", - "removeAvatar": "إزالة الصورة", - "changeAvatar": "تغيير صورة المجموعة", - "uploadingAvatar": "جارٍ الرفع… {{progress}}٪", - "avatarUploadFailed": "تعذّر رفع الصورة", - "validation": { - "needGroupName": "أدخل اسم المجموعة بالعربية أو الإنجليزية.", - "minTwoMembers": "اختر شخصين على الأقل لإنشاء مجموعة.", - "pickOnePerson": "اختر شخصاً واحداً للمحادثة." - }, - "create": "إنشاء", - "settings": { - "title": "إعدادات المجموعة", - "openSettings": "فتح إعدادات المجموعة", - "groupName": "اسم المجموعة", - "saveName": "حفظ الاسم", - "nameSaved": "تم تحديث اسم المجموعة", - "saveFailed": "تعذّر حفظ التغييرات", - "needGroupName": "أدخل اسم المجموعة بالعربية أو الإنجليزية.", - "members_one": "عضو واحد", - "members_two": "عضوان", - "members_few": "{{count}} أعضاء", - "members_many": "{{count}} عضواً", - "members_other": "{{count}} عضو", - "addMembers": "إضافة أعضاء", - "addSelected": "إضافة", - "membersAdded": "تمت إضافة الأعضاء", - "addFailed": "تعذّرت إضافة الأعضاء", - "removeMember": "إزالة العضو", - "removeFailed": "تعذّرت إزالة العضو", - "admin": "مشرف", - "you": "(أنت)", - "viewOnly": "فقط مشرف المجموعة يستطيع تغيير الاسم أو الأعضاء." - }, - "filterAll": "نشطة", - "filterArchived": "المؤرشفة", - "noArchived": "لا توجد محادثات مؤرشفة", - "actions": { - "title": "خيارات المحادثة", - "openActions": "فتح خيارات المحادثة", - "mute": "كتم الإشعارات", - "unmute": "إلغاء كتم الإشعارات", - "archive": "أرشفة المحادثة", - "unarchive": "إلغاء الأرشفة", - "leave": "مغادرة المجموعة", - "leaveConfirmTitle": "مغادرة هذه المجموعة؟", - "leaveConfirmBody": "ستتم إزالتك من \"{{name}}\" ولن تتلقى رسائلها بعد الآن.", - "successorTitle": "اختر المشرف التالي", - "successorHelp": "أنت المشرف الوحيد. اختر من يتولى الإدارة، أو دعنا نرقّي أقدم عضو في المجموعة.", - "successorAuto": "تلقائي (أقدم عضو)", - "muted": "تم كتم الإشعارات", - "unmuted": "الإشعارات مفعّلة", - "archived": "تمت أرشفة المحادثة", - "unarchived": "أعيدت المحادثة إلى النشطة", - "left": "غادرت المجموعة", - "actionFailed": "تعذّر تنفيذ الإجراء", - "mutedLabel": "مكتومة", - "youAreAdminTitle": "أنت الآن المشرف", - "youAreAdminDescription": "أصبحت مسؤولًا عن \"{{name}}\".", - "newAdminBadge": "مشرف جديد", - "newAdminLabel": "مشرف جديد: {{name}}" - }, - "system": { - "someone": "شخص ما", - "listSeparator": "، ", - "groupRenamed": "غيّر {{actor}} اسم المجموعة إلى \"{{name}}\"", - "membersAdded_one": "أضاف {{actor}} {{names}}", - "membersAdded_other": "أضاف {{actor}} {{names}}", - "memberRemoved": "أزال {{actor}} {{target}}", - "memberLeft": "غادر {{actor}} المجموعة", - "adminPromoted": "{{target}} أصبح مشرفًا للمجموعة", - "adminPromotedAfterLeave": "تمت ترقية {{target}} إلى مشرف بعد مغادرة المشرف السابق" - } - }, "notifSettings": { "title": "أصوات الإشعارات", "mute": "كتم الإشعارات", @@ -381,12 +282,10 @@ "deleteUser": { "title": "حذف المستخدم \"{{name}}\"؟", "warning": "هذا المستخدم لديه بيانات. حذفه سيؤثر على ما يلي:", - "forceHint": "سيؤدي ذلك إلى حذف ملاحظاته وطلباته والمحادثات التي أنشأها والرسائل التي أرسلها بشكل نهائي. لا يمكن التراجع عن هذا الإجراء.", + "forceHint": "سيؤدي ذلك إلى حذف ملاحظاته وطلباته بشكل نهائي. لا يمكن التراجع عن هذا الإجراء.", "emptyBody": "هل أنت متأكد من حذف هذا المستخدم؟", "noteCount": "{{count}} ملاحظة", "orderCount": "{{count}} طلب", - "conversationCount": "{{count}} محادثة أنشأها", - "messageCount": "{{count}} رسالة أرسلها", "confirm": "حذف", "anyway": "حذف رغم ذلك" }, @@ -460,9 +359,7 @@ }, "counts": { "notes": "{{count}} ملاحظة", - "orders": "{{count}} طلب", - "conversations": "{{count}} محادثة", - "messages": "{{count}} رسالة" + "orders": "{{count}} طلب" }, "historyTitle": "سجل الصلاحيات", "historyHint": "الأدوار والمجموعات المسندة لهذا المستخدم. صفِّ بحسب من غيّر أو متى.", @@ -796,18 +693,6 @@ "note_few": "{{count}} ملاحظات", "note_many": "{{count}} ملاحظةً", "note_other": "{{count}} ملاحظة", - "conversation_zero": "بدون محادثات", - "conversation_one": "محادثة واحدة", - "conversation_two": "محادثتان", - "conversation_few": "{{count}} محادثات", - "conversation_many": "{{count}} محادثةً", - "conversation_other": "{{count}} محادثة", - "message_zero": "بدون رسائل", - "message_one": "رسالة واحدة", - "message_two": "رسالتان", - "message_few": "{{count}} رسائل", - "message_many": "{{count}} رسالةً", - "message_other": "{{count}} رسالة", "open_zero": "بدون فتحات", "open_one": "فتحة واحدة", "open_two": "فتحتان", @@ -990,18 +875,6 @@ "title": "الطلبات · {{name}}", "subtitle": "{{count}} طلب" }, - "userConversations": { - "title": "المحادثات · {{name}}", - "subtitle": "{{count}} محادثة", - "kindGroup": "مجموعة", - "kindDirect": "خاصة", - "unnamedGroup": "(مجموعة بدون اسم)", - "unnamedDirect": "محادثة خاصة" - }, - "userMessages": { - "title": "الرسائل · {{name}}", - "subtitle": "{{count}} رسالة" - }, "orderStatus": { "pending": "قيد الانتظار", "received": "مستلم", diff --git a/artifacts/tx-os/src/locales/en.json b/artifacts/tx-os/src/locales/en.json index a11d4b13..b258c074 100644 --- a/artifacts/tx-os/src/locales/en.json +++ b/artifacts/tx-os/src/locales/en.json @@ -2,7 +2,6 @@ "nav": { "home": "Home", "services": "Services", - "chat": "Chat", "notifications": "Notifications", "admin": "Admin Dashboard", "logout": "Logout" @@ -75,7 +74,6 @@ "stats": { "apps": "Apps", "services": "Services", - "messages": "Messages", "alerts": "Alerts" }, "clockStyle": { @@ -206,100 +204,6 @@ "deleteFailed": "Could not delete the orders", "deletePartial": "Deleted {{deleted}} of {{total}}; the rest could not be deleted" }, - "chat": { - "title": "Chat", - "newMessage": "New Message", - "typeMessage": "Type a message...", - "send": "Send", - "noConversations": "No conversations", - "createConversation": "New Conversation", - "groupChat": "Group", - "directMessage": "Direct Message", - "participants": "Participants", - "searchUsers": "Search users", - "modeDirect": "Direct", - "modeGroup": "Group", - "groupNameAr": "Group name (Arabic)", - "groupNameEn": "Group name (English)", - "groupNamePlaceholderAr": "مثلاً: فريق المبيعات", - "groupNamePlaceholderEn": "e.g. Sales team", - "searchUsersPlaceholder": "Search by name or username", - "participantsCount_one": "{{count}} person selected", - "participantsCount_other": "{{count}} people selected", - "participantsCount_zero": "No one selected", - "noUsersFound": "No matching users", - "uploadAvatar": "Upload picture", - "replaceAvatar": "Replace picture", - "removeAvatar": "Remove picture", - "changeAvatar": "Change group picture", - "uploadingAvatar": "Uploading… {{progress}}%", - "avatarUploadFailed": "Could not upload picture", - "validation": { - "needGroupName": "Enter a group name in Arabic or English.", - "minTwoMembers": "Pick at least 2 people for a group.", - "pickOnePerson": "Pick one person to chat with." - }, - "create": "Create", - "settings": { - "title": "Group settings", - "openSettings": "Open group settings", - "groupName": "Group name", - "saveName": "Save name", - "nameSaved": "Group name updated", - "saveFailed": "Could not save changes", - "needGroupName": "Enter a group name in Arabic or English.", - "members_one": "{{count}} member", - "members_other": "{{count}} members", - "addMembers": "Add members", - "addSelected": "Add", - "membersAdded": "Members added", - "addFailed": "Could not add members", - "removeMember": "Remove member", - "removeFailed": "Could not remove member", - "admin": "Admin", - "you": "(you)", - "viewOnly": "Only the group admin can change the name or members." - }, - "filterAll": "Active", - "filterArchived": "Archived", - "noArchived": "No archived chats", - "actions": { - "title": "Chat options", - "openActions": "Open chat options", - "mute": "Mute notifications", - "unmute": "Unmute notifications", - "archive": "Archive chat", - "unarchive": "Unarchive chat", - "leave": "Leave group", - "leaveConfirmTitle": "Leave this group?", - "leaveConfirmBody": "You will be removed from \"{{name}}\" and stop receiving its messages.", - "successorTitle": "Choose the next admin", - "successorHelp": "You're the only admin. Pick who should take over, or let us promote the longest-tenured member.", - "successorAuto": "Auto (longest-tenured member)", - "muted": "Notifications muted", - "unmuted": "Notifications on", - "archived": "Chat archived", - "unarchived": "Chat moved back to active", - "left": "You left the group", - "actionFailed": "Could not complete action", - "mutedLabel": "Muted", - "youAreAdminTitle": "You are now the admin", - "youAreAdminDescription": "You're now in charge of \"{{name}}\".", - "newAdminBadge": "New admin", - "newAdminLabel": "New admin: {{name}}" - }, - "system": { - "someone": "Someone", - "listSeparator": ", ", - "groupRenamed": "{{actor}} renamed the group to \"{{name}}\"", - "membersAdded_one": "{{actor}} added {{names}}", - "membersAdded_other": "{{actor}} added {{names}}", - "memberRemoved": "{{actor}} removed {{target}}", - "memberLeft": "{{actor}} left the group", - "adminPromoted": "{{target}} is now a group admin", - "adminPromotedAfterLeave": "{{target}} was promoted to admin after the previous admin left" - } - }, "notifications": { "title": "Notifications", "markAllRead": "Mark All Read", @@ -378,12 +282,10 @@ "deleteUser": { "title": "Delete user \"{{name}}\"?", "warning": "This user owns data. Deleting them will affect the following:", - "forceHint": "This will permanently remove their notes, orders, conversations they started, and messages they sent. This cannot be undone.", + "forceHint": "This will permanently remove their notes and orders. This cannot be undone.", "emptyBody": "Are you sure you want to delete this user?", "noteCount": "{{count}} note(s)", "orderCount": "{{count}} order(s)", - "conversationCount": "{{count}} conversation(s) created", - "messageCount": "{{count}} message(s) sent", "confirm": "Delete", "anyway": "Delete anyway" }, @@ -457,9 +359,7 @@ }, "counts": { "notes": "{{count}} notes", - "orders": "{{count}} orders", - "conversations": "{{count}} convos", - "messages": "{{count}} messages" + "orders": "{{count}} orders" }, "historyTitle": "Permission history", "historyHint": "Roles and groups assigned to this user. Filter by who changed it or when.", @@ -709,10 +609,6 @@ "restriction_other": "{{count}} restrictions", "note_one": "{{count}} note", "note_other": "{{count}} notes", - "conversation_one": "{{count}} conversation", - "conversation_other": "{{count}} conversations", - "message_one": "{{count}} message", - "message_other": "{{count}} messages", "open_one": "{{count}} open", "open_other": "{{count}} opens" }, @@ -891,18 +787,6 @@ "title": "Orders · {{name}}", "subtitle": "{{count}} orders" }, - "userConversations": { - "title": "Conversations · {{name}}", - "subtitle": "{{count}} conversations", - "kindGroup": "Group", - "kindDirect": "Direct", - "unnamedGroup": "(unnamed group)", - "unnamedDirect": "Direct chat" - }, - "userMessages": { - "title": "Messages · {{name}}", - "subtitle": "{{count}} messages" - }, "orderStatus": { "pending": "Pending", "received": "Received", diff --git a/artifacts/tx-os/src/pages/admin.tsx b/artifacts/tx-os/src/pages/admin.tsx index 0ee6d165..4aa99983 100644 --- a/artifacts/tx-os/src/pages/admin.tsx +++ b/artifacts/tx-os/src/pages/admin.tsx @@ -46,18 +46,12 @@ import { getGetAdminUserDependentNotesQueryKey, useGetAdminUserDependentOrders, getGetAdminUserDependentOrdersQueryKey, - useGetAdminUserDependentConversations, - getGetAdminUserDependentConversationsQueryKey, - useGetAdminUserDependentMessages, - getGetAdminUserDependentMessagesQueryKey, getAdminAppDependentGroups, getAdminAppDependentRestrictions, getAdminAppDependentOpens, getAdminServiceDependentOrders, getAdminUserDependentNotes, getAdminUserDependentOrders, - getAdminUserDependentConversations, - getAdminUserDependentMessages, useAdminIssueResetLink, useListGroups, getListGroupsQueryKey, @@ -130,8 +124,6 @@ import type { ServiceDependentOrdersPage, UserDependentNotesPage, UserDependentOrdersPage, - UserDependentConversationsPage, - UserDependentMessagesPage, } from "@workspace/api-client-react"; import { ListUsersStatus } from "@workspace/api-client-react"; import { useQueryClient, useQuery } from "@tanstack/react-query"; @@ -3182,9 +3174,7 @@ type DependencyTarget = | { kind: "appOpens"; appId: number; appName: string } | { kind: "serviceOrders"; serviceId: number; serviceName: string } | { kind: "userNotes"; userId: number; userLabel: string } - | { kind: "userOrders"; userId: number; userLabel: string } - | { kind: "userConversations"; userId: number; userLabel: string } - | { kind: "userMessages"; userId: number; userLabel: string }; + | { kind: "userOrders"; userId: number; userLabel: string }; type DependencyPage = | AppDependentGroupsPage @@ -3192,9 +3182,7 @@ type DependencyPage = | AppDependentOpensPage | ServiceDependentOrdersPage | UserDependentNotesPage - | UserDependentOrdersPage - | UserDependentConversationsPage - | UserDependentMessagesPage; + | UserDependentOrdersPage; const DEPENDENT_PAGE_LIMIT = 50; @@ -3314,10 +3302,7 @@ function useDependencyInitial(target: DependencyTarget): { : 0; const serviceId = target.kind === "serviceOrders" ? target.serviceId : 0; const userId = - target.kind === "userNotes" || - target.kind === "userOrders" || - target.kind === "userConversations" || - target.kind === "userMessages" + target.kind === "userNotes" || target.kind === "userOrders" ? target.userId : 0; @@ -3365,20 +3350,6 @@ function useDependencyInitial(target: DependencyTarget): { retry: false, }, }); - const uConvos = useGetAdminUserDependentConversations(userId, params, { - query: { - queryKey: getGetAdminUserDependentConversationsQueryKey(userId, params), - enabled: enabledFor("userConversations"), - retry: false, - }, - }); - const uMessages = useGetAdminUserDependentMessages(userId, params, { - query: { - queryKey: getGetAdminUserDependentMessagesQueryKey(userId, params), - enabled: enabledFor("userMessages"), - retry: false, - }, - }); switch (target.kind) { case "appGroups": @@ -3393,10 +3364,6 @@ function useDependencyInitial(target: DependencyTarget): { return uNotes; case "userOrders": return uOrders; - case "userConversations": - return uConvos; - case "userMessages": - return uMessages; } } @@ -3417,10 +3384,6 @@ async function fetchDependentsPage( return getAdminUserDependentNotes(target.userId, params); case "userOrders": return getAdminUserDependentOrders(target.userId, params); - case "userConversations": - return getAdminUserDependentConversations(target.userId, params); - case "userMessages": - return getAdminUserDependentMessages(target.userId, params); } } @@ -3460,16 +3423,6 @@ function describeDependencyTarget( title: t("admin.dependents.userOrders.title", { name: target.userLabel }), subtitle: t("admin.dependents.userOrders.subtitle", { count: totalCount }), }; - case "userConversations": - return { - title: t("admin.dependents.userConversations.title", { name: target.userLabel }), - subtitle: t("admin.dependents.userConversations.subtitle", { count: totalCount }), - }; - case "userMessages": - return { - title: t("admin.dependents.userMessages.title", { name: target.userLabel }), - subtitle: t("admin.dependents.userMessages.subtitle", { count: totalCount }), - }; } } @@ -3603,57 +3556,6 @@ function DependencyRow({ ); } - case "userConversations": { - const c = item as UserDependentConversationsPage["items"][number]; - const name = - (lang === "ar" ? c.nameAr : c.nameEn) ?? - t( - c.isGroup - ? "admin.dependents.userConversations.unnamedGroup" - : "admin.dependents.userConversations.unnamedDirect", - ); - return ( -
-
-
{name}
-
- {t( - c.isGroup - ? "admin.dependents.userConversations.kindGroup" - : "admin.dependents.userConversations.kindDirect", - )} -
-
-
- {formatOpenTimestamp(c.createdAt, lang)} -
-
- ); - } - case "userMessages": { - const m = item as UserDependentMessagesPage["items"][number]; - const where = - (lang === "ar" ? m.conversationNameAr : m.conversationNameEn) ?? - t( - m.conversationIsGroup - ? "admin.dependents.userConversations.unnamedGroup" - : "admin.dependents.userConversations.unnamedDirect", - ); - // Trim to a single-line preview so a long message doesn't blow up - // the popover height. - const preview = m.content.length > 160 ? `${m.content.slice(0, 160)}…` : m.content; - return ( -
-
-
{where}
-
- {formatOpenTimestamp(m.createdAt, lang)} -
-
-
{preview}
-
- ); - } } } @@ -3865,18 +3767,6 @@ function UsersPanel({ target: { kind: "userOrders", userId: u.id, userLabel }, testid: `user-counts-orders-${u.id}`, }); - if ((u.conversationCount ?? 0) > 0) - parts.push({ - label: t("admin.users.counts.conversations", { count: u.conversationCount }), - target: { kind: "userConversations", userId: u.id, userLabel }, - testid: `user-counts-conversations-${u.id}`, - }); - if ((u.messageCount ?? 0) > 0) - parts.push({ - label: t("admin.users.counts.messages", { count: u.messageCount }), - target: { kind: "userMessages", userId: u.id, userLabel }, - testid: `user-counts-messages-${u.id}`, - }); if (parts.length === 0) return null; return (
0 || - orderCount > 0 || - conversationCount > 0 || - messageCount > 0; + const hasDeps = noteCount > 0 || orderCount > 0; setUserDeleteConflict( hasDeps ? { error: "User has dependent records", noteCount, orderCount, - conversationCount, - messageCount, } : null, ); @@ -4098,10 +3980,6 @@ function UsersPanel({ items.push(t("admin.deleteUser.noteCount", { count: userDeleteConflict.noteCount })); if (userDeleteConflict.orderCount > 0) items.push(t("admin.deleteUser.orderCount", { count: userDeleteConflict.orderCount })); - if (userDeleteConflict.conversationCount > 0) - items.push(t("admin.deleteUser.conversationCount", { count: userDeleteConflict.conversationCount })); - if (userDeleteConflict.messageCount > 0) - items.push(t("admin.deleteUser.messageCount", { count: userDeleteConflict.messageCount })); } return ( ["t"]; // `unitLabel`. Keys not in this map are skipped from the inline chip strip. const DEPENDENCY_COUNT_KEYS: Record = { orderCount: "order", - messageCount: "message", noteCount: "note", - conversationCount: "conversation", groupCount: "group", memberCount: "member", appCount: "app", diff --git a/artifacts/tx-os/src/pages/chat.tsx b/artifacts/tx-os/src/pages/chat.tsx deleted file mode 100644 index 6c12d097..00000000 --- a/artifacts/tx-os/src/pages/chat.tsx +++ /dev/null @@ -1,1716 +0,0 @@ -import { useState, useEffect, useRef, useMemo } from "react"; -import { useTranslation } from "react-i18next"; -import { useLocation, useSearch } from "wouter"; -import { - useListConversations, - getListConversationsQueryKey, - useListMessages, - getListMessagesQueryKey, - useSendMessage, - useMarkConversationRead, - useCreateConversation, - useUpdateConversation, - useAddConversationParticipants, - useRemoveConversationParticipant, - useUpdateConversationState, - useLeaveConversation, -} from "@workspace/api-client-react"; -import { useUpload, type UploadResponse } from "@workspace/object-storage-web"; -import { resolveServiceImageUrl } from "@/lib/image-url"; -import { useToast } from "@/hooks/use-toast"; -import { useQuery, useQueryClient } from "@tanstack/react-query"; -import { useAuth } from "@/contexts/AuthContext"; -import { io } from "socket.io-client"; -import { - ArrowRight, - ArrowLeft, - MessageCircle, - Plus, - Send, - Search, - Users, - User as UserIcon, - Settings, - UserPlus, - Trash2, - MoreVertical, - Bell, - BellOff, - Archive, - ArchiveRestore, - LogOut, - Crown, -} from "lucide-react"; -import { Button } from "@/components/ui/button"; -import { Input } from "@/components/ui/input"; -import { formatTime } from "@/lib/i18n-format"; -import { Badge } from "@/components/ui/badge"; -import { ScrollArea } from "@/components/ui/scroll-area"; -import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; -import { Camera, Loader2, X } from "lucide-react"; - -const BASE = import.meta.env.BASE_URL.replace(/\/$/, ""); - -type UserDisplay = { - id: number; - username: string; - displayNameAr?: string | null; - displayNameEn?: string | null; -}; - -function pickDisplayName(u: UserDisplay | null | undefined, lang: string): string { - if (!u) return ""; - return (lang === "ar" ? u.displayNameAr : u.displayNameEn) ?? u.username; -} - -type SystemMessageMeta = { - actor?: UserDisplay | null; - oldNameAr?: string | null; - oldNameEn?: string | null; - newNameAr?: string | null; - newNameEn?: string | null; - addedUsers?: UserDisplay[]; - removedUser?: UserDisplay | null; - promoted?: UserDisplay | null; - reason?: string | null; -}; - -type SystemRenderable = { - kind?: string | null; - meta?: unknown; -}; - -function renderSystemMessage( - msg: SystemRenderable, - lang: string, - t: (k: string, opts?: Record) => string, -): string { - const meta = (msg.meta ?? {}) as SystemMessageMeta; - const actor = pickDisplayName(meta.actor, lang) || t("chat.system.someone"); - switch (msg.kind) { - case "group_renamed": { - const newName = - (lang === "ar" ? meta.newNameAr : meta.newNameEn) ?? - (lang === "ar" ? meta.newNameEn : meta.newNameAr) ?? - ""; - return t("chat.system.groupRenamed", { actor, name: newName }); - } - case "members_added": { - const names = (meta.addedUsers ?? []) - .map((u) => pickDisplayName(u, lang)) - .filter(Boolean); - return t("chat.system.membersAdded", { - actor, - names: names.join(t("chat.system.listSeparator")), - count: names.length, - }); - } - case "member_removed": { - const target = pickDisplayName(meta.removedUser, lang) || t("chat.system.someone"); - return t("chat.system.memberRemoved", { actor, target }); - } - case "member_left": { - return t("chat.system.memberLeft", { actor }); - } - case "admin_promoted": { - const target = pickDisplayName(meta.promoted, lang) || t("chat.system.someone"); - const key = - meta.reason === "previous_admin_left" - ? "chat.system.adminPromotedAfterLeave" - : "chat.system.adminPromoted"; - return t(key, { target }); - } - default: - return ""; - } -} - -function getSocket() { - return io(window.location.origin, { - path: `${BASE}/api/socket.io`, - }); -} - -type ConvMode = "direct" | "group"; - -export default function ChatPage() { - const { t, i18n } = useTranslation(); - const [, setLocation] = useLocation(); - const search = useSearch(); - const { user } = useAuth(); - const lang = i18n.language; - const isRtl = lang === "ar"; - const queryClient = useQueryClient(); - const BackIcon = isRtl ? ArrowRight : ArrowLeft; - - const [selectedConvId, setSelectedConvId] = useState(null); - const [messageText, setMessageText] = useState(""); - const [showNewConv, setShowNewConv] = useState(false); - const [mode, setMode] = useState("direct"); - const [selectedUserIds, setSelectedUserIds] = useState([]); - const [groupNameAr, setGroupNameAr] = useState(""); - const [groupNameEn, setGroupNameEn] = useState(""); - const [groupAvatarUrl, setGroupAvatarUrl] = useState(null); - const [userSearch, setUserSearch] = useState(""); - const [showSettings, setShowSettings] = useState(false); - const [showAddMembers, setShowAddMembers] = useState(false); - const [showActions, setShowActions] = useState(false); - const [showArchived, setShowArchived] = useState(false); - const [confirmLeave, setConfirmLeave] = useState(false); - const [successorChoice, setSuccessorChoice] = useState("auto"); - const [editNameAr, setEditNameAr] = useState(""); - const [editNameEn, setEditNameEn] = useState(""); - const [addMembersIds, setAddMembersIds] = useState([]); - const [addMembersSearch, setAddMembersSearch] = useState(""); - const bottomRef = useRef(null); - const { toast } = useToast(); - - const { uploadFile: uploadGroupAvatar, isUploading: isUploadingNewAvatar, progress: newAvatarProgress } = useUpload({ - onSuccess: (resp: UploadResponse) => setGroupAvatarUrl(resp.objectPath), - onError: (err: Error) => - toast({ title: t("chat.avatarUploadFailed"), description: err.message, variant: "destructive" }), - }); - - const { data: conversations, isLoading: convsLoading } = useListConversations({ - query: { queryKey: getListConversationsQueryKey() }, - }); - - const { data: messages } = useListMessages( - selectedConvId!, - { query: { queryKey: getListMessagesQueryKey(selectedConvId!), enabled: !!selectedConvId } }, - ); - - type DirectoryUser = { - id: number; - username: string; - displayNameAr: string | null; - displayNameEn: string | null; - avatarUrl: string | null; - isActive: boolean; - }; - const { data: users } = useQuery({ - queryKey: ["users-directory"], - queryFn: () => - fetch("/api/users/directory", { credentials: "include" }).then((r) => r.json()), - enabled: showNewConv || showAddMembers, - }); - - const sendMessage = useSendMessage(); - const markRead = useMarkConversationRead(); - const createConv = useCreateConversation(); - - // Socket.IO - useEffect(() => { - if (!user) return; - const socket = getSocket(); - - if (selectedConvId) { - socket.emit("join_conversation", selectedConvId); - } - - socket.on("new_message", () => { - queryClient.invalidateQueries({ queryKey: getListConversationsQueryKey() }); - if (selectedConvId) { - queryClient.invalidateQueries({ queryKey: getListMessagesQueryKey(selectedConvId) }); - } - }); - - socket.on("messages_read", () => { - queryClient.invalidateQueries({ queryKey: getListConversationsQueryKey() }); - if (selectedConvId) { - queryClient.invalidateQueries({ queryKey: getListMessagesQueryKey(selectedConvId) }); - } - }); - - socket.on("conversation_updated", () => { - queryClient.invalidateQueries({ queryKey: getListConversationsQueryKey() }); - }); - - return () => { - if (selectedConvId) { - socket.emit("leave_conversation", selectedConvId); - } - socket.disconnect(); - }; - }, [user, selectedConvId, queryClient]); - - // Open conversation specified via ?c= query param (e.g. from notifications) - useEffect(() => { - const params = new URLSearchParams(search); - const convParam = params.get("c"); - if (!convParam) return; - const convId = Number(convParam); - if (!Number.isFinite(convId) || convId <= 0) return; - setSelectedConvId(convId); - setLocation("/chat", { replace: true }); - }, [search, setLocation]); - - // Notify the current user when they have been promoted to admin of a group - // (e.g. after the previous admin left). We track per-user the set of group - // conversation IDs we have already observed the user being admin of; when a - // new one appears we toast. Using participant.isAdmin rather than only the - // lastMessage means the cue still fires reliably even if newer messages - // arrive in the conversation before the user next opens chat. - useEffect(() => { - if (!user || !conversations) return; - const ackKey = `tx:admin-known:${user.id}`; - let ack: number[] = []; - try { - ack = JSON.parse(localStorage.getItem(ackKey) ?? "[]"); - if (!Array.isArray(ack)) ack = []; - } catch { - ack = []; - } - const known = new Set(ack); - - // Conversations where the current user is currently an admin. - const currentAdminGroupIds = new Set(); - for (const conv of conversations) { - if (!conv.isGroup) continue; - const me = conv.participants?.find((p) => p.id === user.id); - if (me?.isAdmin) currentAdminGroupIds.add(conv.id); - } - - // First load for this user/browser: just record the baseline silently - // so we don't spam toasts about pre-existing admin roles. - if (known.size === 0 && localStorage.getItem(ackKey) === null) { - try { - localStorage.setItem( - ackKey, - JSON.stringify(Array.from(currentAdminGroupIds)), - ); - } catch { - // ignore storage errors - } - return; - } - - let changed = false; - for (const convId of currentAdminGroupIds) { - if (known.has(convId)) continue; - const conv = conversations.find((c) => c.id === convId); - if (!conv) continue; - const convDisplay = convDisplayName(conv); - toast({ - title: t("chat.actions.youAreAdminTitle"), - description: t("chat.actions.youAreAdminDescription", { - name: convDisplay, - }), - }); - known.add(convId); - changed = true; - } - // Forget conversations the user is no longer an admin of (or has left) - // so a future re-promotion will toast again. - for (const convId of Array.from(known)) { - if (!currentAdminGroupIds.has(convId)) { - known.delete(convId); - changed = true; - } - } - if (changed) { - try { - localStorage.setItem(ackKey, JSON.stringify(Array.from(known))); - } catch { - // ignore storage errors - } - } - }, [conversations, user, toast, t, lang]); - - // Mark conversation as read when selected - useEffect(() => { - if (selectedConvId) { - markRead.mutate( - { id: selectedConvId }, - { - onSuccess: () => { - queryClient.invalidateQueries({ queryKey: getListConversationsQueryKey() }); - }, - }, - ); - } - }, [selectedConvId]); - - // Scroll to bottom on new messages - useEffect(() => { - bottomRef.current?.scrollIntoView({ behavior: "smooth" }); - }, [messages]); - - const handleSend = () => { - if (!messageText.trim() || !selectedConvId) return; - sendMessage.mutate( - { id: selectedConvId, data: { content: messageText.trim() } }, - { - onSuccess: () => { - setMessageText(""); - queryClient.invalidateQueries({ queryKey: getListMessagesQueryKey(selectedConvId!) }); - queryClient.invalidateQueries({ queryKey: getListConversationsQueryKey() }); - }, - }, - ); - }; - - const resetNewConvState = () => { - setMode("direct"); - setSelectedUserIds([]); - setGroupNameAr(""); - setGroupNameEn(""); - setGroupAvatarUrl(null); - setUserSearch(""); - }; - - const openNewConv = () => { - resetNewConvState(); - setShowNewConv(true); - }; - - const closeNewConv = () => { - setShowNewConv(false); - resetNewConvState(); - }; - - const switchMode = (next: ConvMode) => { - setMode(next); - if (next === "direct") { - if (selectedUserIds.length > 1) { - setSelectedUserIds(selectedUserIds.slice(0, 1)); - } - setGroupNameAr(""); - setGroupNameEn(""); - } - }; - - const toggleUser = (uid: number) => { - if (mode === "direct") { - setSelectedUserIds(selectedUserIds.includes(uid) ? [] : [uid]); - } else { - setSelectedUserIds( - selectedUserIds.includes(uid) - ? selectedUserIds.filter((id) => id !== uid) - : [...selectedUserIds, uid], - ); - } - }; - - const filteredUsers = useMemo(() => { - const list = (users ?? []).filter((u) => u.id !== user?.id); - const q = userSearch.trim().toLowerCase(); - if (!q) return list; - return list.filter((u) => { - const fields = [u.username, u.displayNameAr ?? "", u.displayNameEn ?? ""]; - return fields.some((f) => f.toLowerCase().includes(q)); - }); - }, [users, userSearch, user?.id]); - - const validation: { ok: boolean; message: string | null } = useMemo(() => { - if (mode === "direct") { - if (selectedUserIds.length !== 1) { - return { ok: false, message: t("chat.validation.pickOnePerson") }; - } - return { ok: true, message: null }; - } - if (selectedUserIds.length < 2) { - return { ok: false, message: t("chat.validation.minTwoMembers") }; - } - if (!groupNameAr.trim() && !groupNameEn.trim()) { - return { ok: false, message: t("chat.validation.needGroupName") }; - } - return { ok: true, message: null }; - }, [mode, selectedUserIds, groupNameAr, groupNameEn, t]); - - const handleCreateConv = () => { - if (!validation.ok) return; - const isGroup = mode === "group"; - createConv.mutate( - { - data: { - participantIds: selectedUserIds, - isGroup, - nameAr: isGroup ? (groupNameAr.trim() || null) : null, - nameEn: isGroup ? (groupNameEn.trim() || null) : null, - avatarUrl: isGroup ? groupAvatarUrl : null, - }, - }, - { - onSuccess: (conv) => { - queryClient.invalidateQueries({ queryKey: getListConversationsQueryKey() }); - setSelectedConvId(conv.id); - closeNewConv(); - }, - }, - ); - }; - - const selectedConv = conversations?.find((c) => c.id === selectedConvId); - const convDisplayName = ( - conv: NonNullable, - ): string => { - const langName = lang === "ar" ? conv.nameAr : conv.nameEn; - const otherName = lang === "ar" ? conv.nameEn : conv.nameAr; - if (langName) return langName; - if (otherName) return otherName; - const others = conv.participants - ?.filter((p) => p.id !== user?.id) - .map((p) => (lang === "ar" ? p.displayNameAr : p.displayNameEn) ?? p.username); - if (others?.length) return others.join(", "); - return t("chat.directMessage"); - }; - - const convName = selectedConv ? convDisplayName(selectedConv) : ""; - const isAdminOfSelected = !!selectedConv?.participants?.find( - (p) => p.id === user?.id && p.isAdmin, - ); - - const updateConv = useUpdateConversation(); - const addParticipants = useAddConversationParticipants(); - const removeParticipant = useRemoveConversationParticipant(); - const updateConvState = useUpdateConversationState(); - const leaveConv = useLeaveConversation(); - - const handleToggleMute = () => { - if (!selectedConv) return; - const next = !selectedConv.isMuted; - updateConvState.mutate( - { id: selectedConv.id, data: { isMuted: next } }, - { - onSuccess: () => { - queryClient.invalidateQueries({ queryKey: getListConversationsQueryKey() }); - toast({ title: t(next ? "chat.actions.muted" : "chat.actions.unmuted") }); - }, - onError: (err: Error) => - toast({ title: t("chat.actions.actionFailed"), description: err.message, variant: "destructive" }), - }, - ); - }; - - const handleToggleArchive = () => { - if (!selectedConv) return; - const next = !selectedConv.isArchived; - updateConvState.mutate( - { id: selectedConv.id, data: { isArchived: next } }, - { - onSuccess: () => { - queryClient.invalidateQueries({ queryKey: getListConversationsQueryKey() }); - toast({ title: t(next ? "chat.actions.archived" : "chat.actions.unarchived") }); - if (next) { - setShowActions(false); - setSelectedConvId(null); - } - }, - onError: (err: Error) => - toast({ title: t("chat.actions.actionFailed"), description: err.message, variant: "destructive" }), - }, - ); - }; - - const handleLeave = () => { - if (!selectedConv) return; - const data = - successorChoice === "auto" - ? {} - : { successorId: successorChoice }; - leaveConv.mutate( - { id: selectedConv.id, data }, - { - onSuccess: () => { - queryClient.invalidateQueries({ queryKey: getListConversationsQueryKey() }); - toast({ title: t("chat.actions.left") }); - setConfirmLeave(false); - setShowActions(false); - setSelectedConvId(null); - setSuccessorChoice("auto"); - }, - onError: (err: Error) => - toast({ title: t("chat.actions.actionFailed"), description: err.message, variant: "destructive" }), - }, - ); - }; - - const openSettings = () => { - if (!selectedConv) return; - setEditNameAr(selectedConv.nameAr ?? ""); - setEditNameEn(selectedConv.nameEn ?? ""); - setShowSettings(true); - }; - - const closeSettings = () => { - setShowSettings(false); - setShowAddMembers(false); - setAddMembersIds([]); - setAddMembersSearch(""); - }; - - const handleSaveName = () => { - if (!selectedConvId) return; - const ar = editNameAr.trim(); - const en = editNameEn.trim(); - if (!ar && !en) { - toast({ - title: t("chat.settings.needGroupName"), - variant: "destructive", - }); - return; - } - updateConv.mutate( - { id: selectedConvId, data: { nameAr: ar || null, nameEn: en || null } }, - { - onSuccess: () => { - queryClient.invalidateQueries({ queryKey: getListConversationsQueryKey() }); - toast({ title: t("chat.settings.nameSaved") }); - }, - onError: (err: Error) => { - toast({ - title: t("chat.settings.saveFailed"), - description: err.message, - variant: "destructive", - }); - }, - }, - ); - }; - - const handleAddMembers = () => { - if (!selectedConvId || addMembersIds.length === 0) return; - addParticipants.mutate( - { id: selectedConvId, data: { userIds: addMembersIds } }, - { - onSuccess: () => { - queryClient.invalidateQueries({ queryKey: getListConversationsQueryKey() }); - setAddMembersIds([]); - setAddMembersSearch(""); - setShowAddMembers(false); - toast({ title: t("chat.settings.membersAdded") }); - }, - onError: (err: Error) => { - toast({ - title: t("chat.settings.addFailed"), - description: err.message, - variant: "destructive", - }); - }, - }, - ); - }; - - const handleRemoveMember = (memberId: number) => { - if (!selectedConvId) return; - removeParticipant.mutate( - { id: selectedConvId, userId: memberId }, - { - onSuccess: () => { - queryClient.invalidateQueries({ queryKey: getListConversationsQueryKey() }); - }, - onError: (err: Error) => { - toast({ - title: t("chat.settings.removeFailed"), - description: err.message, - variant: "destructive", - }); - }, - }, - ); - }; - - const existingMemberIds = useMemo( - () => new Set(selectedConv?.participants?.map((p) => p.id) ?? []), - [selectedConv], - ); - const addableUsers = useMemo(() => { - const list = (users ?? []).filter((u) => !existingMemberIds.has(u.id)); - const q = addMembersSearch.trim().toLowerCase(); - if (!q) return list; - return list.filter((u) => { - const fields = [u.username, u.displayNameAr ?? "", u.displayNameEn ?? ""]; - return fields.some((f) => f.toLowerCase().includes(q)); - }); - }, [users, existingMemberIds, addMembersSearch]); - - const toggleAddMember = (uid: number) => { - setAddMembersIds((prev) => - prev.includes(uid) ? prev.filter((id) => id !== uid) : [...prev, uid], - ); - }; - - const nameDirty = - !!selectedConv && - selectedConv.isGroup && - (editNameAr.trim() !== (selectedConv.nameAr ?? "") || - editNameEn.trim() !== (selectedConv.nameEn ?? "")); - const { uploadFile: uploadHeaderAvatar, isUploading: isUploadingHeaderAvatar } = useUpload({ - onSuccess: (resp: UploadResponse) => { - if (!selectedConvId) return; - updateConv.mutate( - { id: selectedConvId, data: { avatarUrl: resp.objectPath } }, - { - onSuccess: () => { - queryClient.invalidateQueries({ queryKey: getListConversationsQueryKey() }); - }, - onError: (err: Error) => { - toast({ title: t("chat.avatarUploadFailed"), description: err.message, variant: "destructive" }); - }, - }, - ); - }, - onError: (err: Error) => - toast({ title: t("chat.avatarUploadFailed"), description: err.message, variant: "destructive" }), - }); - - return ( -
- {/* Header */} -
- -
- {selectedConvId && selectedConv ? ( -
- - {selectedConv.avatarUrl && ( - - )} - - {selectedConv.isGroup ? ( - - ) : ( - String(convName).slice(0, 2).toUpperCase() - )} - - - {selectedConv.isGroup && isAdminOfSelected && ( - - )} - {selectedConv.isGroup && isAdminOfSelected && selectedConv.avatarUrl && ( - - )} -
- ) : ( - - )} - {selectedConvId && selectedConv?.isGroup ? ( - - ) : ( -

- {selectedConvId ? convName : t("chat.title")} -

- )} -
- {selectedConvId && selectedConv?.isGroup && ( - - )} - {selectedConvId && selectedConv && ( - - )} - {!selectedConvId && ( - - )} -
- - {/* New Conversation Dialog */} - {showNewConv && ( -
-
e.stopPropagation()} - > -

- {t("chat.createConversation")} -

- - {/* Mode tabs */} -
- - -
- - {/* Group name fields */} - {mode === "group" && ( -
-
-
- - {groupAvatarUrl && ( - - )} - - - - - {groupAvatarUrl && !isUploadingNewAvatar && ( - - )} -
- -
- setGroupNameAr(e.target.value)} - placeholder={t("chat.groupNamePlaceholderAr")} - aria-label={t("chat.groupNameAr")} - dir="rtl" - className="bg-white/70 border-slate-200" - /> - setGroupNameEn(e.target.value)} - placeholder={t("chat.groupNamePlaceholderEn")} - aria-label={t("chat.groupNameEn")} - dir="ltr" - className="bg-white/70 border-slate-200" - /> -
- )} - - {/* Search */} -
- - setUserSearch(e.target.value)} - placeholder={t("chat.searchUsersPlaceholder")} - className={`bg-white/70 border-slate-200 ${isRtl ? "pr-9" : "pl-9"}`} - /> -
- - {/* Counter */} -
- - {t("chat.participantsCount", { count: selectedUserIds.length })} - -
- - {/* User list */} - -
- {filteredUsers.length === 0 ? ( -
- {t("chat.noUsersFound")} -
- ) : ( - filteredUsers.map((u) => { - const checked = selectedUserIds.includes(u.id); - const display = - (lang === "ar" ? u.displayNameAr : u.displayNameEn) ?? u.username; - return ( - - ); - }) - )} -
-
- - {/* Validation message */} - {validation.message && ( -

- {validation.message} -

- )} - - {/* Actions */} -
- - -
-
-
- )} - - {/* Group Settings Dialog */} - {showSettings && selectedConv?.isGroup && ( -
-
e.stopPropagation()} - > -
-

- {t("chat.settings.title")} -

- -
- - {/* Name editing (admin only) */} - {isAdminOfSelected ? ( -
- - setEditNameAr(e.target.value)} - placeholder={t("chat.groupNamePlaceholderAr")} - aria-label={t("chat.groupNameAr")} - dir="rtl" - className="bg-white/70 border-slate-200" - /> - setEditNameEn(e.target.value)} - placeholder={t("chat.groupNamePlaceholderEn")} - aria-label={t("chat.groupNameEn")} - dir="ltr" - className="bg-white/70 border-slate-200" - /> - -
- ) : ( -
- {t("chat.settings.viewOnly")} -
- )} - - {/* Members list */} -
-
- - {isAdminOfSelected && ( - - )} -
-
- {selectedConv.participants?.map((p) => { - const display = - (lang === "ar" ? p.displayNameAr : p.displayNameEn) ?? p.username; - const isMe = p.id === user?.id; - return ( -
- - {p.avatarUrl && ( - - )} - - {display.slice(0, 2).toUpperCase()} - - -
-
- {display} - {p.isAdmin && ( - - {t("chat.settings.admin")} - - )} - {isMe && ( - - {t("chat.settings.you")} - - )} -
-
- @{p.username} -
-
- {isAdminOfSelected && !isMe && ( - - )} -
- ); - })} -
-
-
-
- )} - - {/* Add Members Dialog */} - {showAddMembers && selectedConv?.isGroup && isAdminOfSelected && ( -
setShowAddMembers(false)} - > -
e.stopPropagation()} - > -
-

- {t("chat.settings.addMembers")} -

- -
- -
- - setAddMembersSearch(e.target.value)} - placeholder={t("chat.searchUsersPlaceholder")} - className={`bg-white/70 border-slate-200 ${isRtl ? "pr-9" : "pl-9"}`} - /> -
- -
- {t("chat.participantsCount", { count: addMembersIds.length })} -
- - -
- {addableUsers.length === 0 ? ( -
- {t("chat.noUsersFound")} -
- ) : ( - addableUsers.map((u) => { - const checked = addMembersIds.includes(u.id); - const display = - (lang === "ar" ? u.displayNameAr : u.displayNameEn) ?? u.username; - return ( - - ); - }) - )} -
-
- -
- - -
-
-
- )} - - {/* Actions sheet (mute / archive / leave) */} - {showActions && selectedConv && ( -
setShowActions(false)} - > -
e.stopPropagation()} - data-testid="dialog-chat-actions" - > -
-

- {t("chat.actions.title")} -

- -
- - - {selectedConv.isGroup && ( - - )} -
-
- )} - - {/* Leave confirmation */} - {confirmLeave && selectedConv?.isGroup && (() => { - const others = (selectedConv.participants ?? []).filter( - (p) => p.id !== user?.id, - ); - const adminCount = (selectedConv.participants ?? []).filter( - (p) => p.isAdmin, - ).length; - const isSoleAdmin = isAdminOfSelected && adminCount === 1; - const showSuccessor = isSoleAdmin && others.length > 0; - const closeDialog = () => { - setConfirmLeave(false); - setSuccessorChoice("auto"); - }; - return ( -
-
e.stopPropagation()} - data-testid="dialog-confirm-leave" - > -

- {t("chat.actions.leaveConfirmTitle")} -

-

- {t("chat.actions.leaveConfirmBody", { name: convName })} -

- {showSuccessor && ( -
-

- {t("chat.actions.successorTitle")} -

-

- {t("chat.actions.successorHelp")} -

-
- - {others.map((p) => ( - - ))} -
-
- )} -
- - -
-
-
- ); - })()} - - {selectedConvId ? ( - /* Message View */ -
- -
- {messages?.map((msg) => { - if (msg.kind && msg.kind !== "user") { - const text = renderSystemMessage(msg, lang, t); - return ( -
-
- {text} -
-
- ); - } - const isMe = msg.senderId === user?.id; - const senderName = - (lang === "ar" ? msg.sender?.displayNameAr : msg.sender?.displayNameEn) ?? - msg.sender?.username ?? - ""; - return ( -
-
- {!isMe && ( -
{senderName}
- )} -
- {msg.content} -
-
- {formatTime(msg.createdAt, lang, { - hour: "2-digit", - minute: "2-digit", - hour12: user?.clockHour12 ?? false, - })} -
-
-
- ); - })} -
-
- - - {/* Message Input */} -
-
- setMessageText(e.target.value)} - onKeyDown={(e) => e.key === "Enter" && !e.shiftKey && (e.preventDefault(), handleSend())} - placeholder={t("chat.typeMessage")} - className="flex-1 bg-white/70 border-slate-200" - /> - -
-
-
- ) : ( - /* Conversation List */ -
- {(() => { - const allConvs = conversations ?? []; - const archivedCount = allConvs.filter((c) => c.isArchived).length; - const visibleConvs = allConvs.filter((c) => - showArchived ? c.isArchived : !c.isArchived, - ); - return ( - <> -
- - -
- {convsLoading ? ( -
- {t("common.loading")} -
- ) : visibleConvs.length === 0 ? ( -
- {showArchived ? ( - <> - - {t("chat.noArchived")} - - ) : ( - <> - - {t("chat.noConversations")} - - )} -
- ) : ( - visibleConvs.map((conv) => { - const name = convDisplayName(conv); - const lastMsg = conv.lastMessage; - const promotionMeta = - lastMsg && lastMsg.kind === "admin_promoted" - ? ((lastMsg.meta ?? {}) as SystemMessageMeta) - : null; - const newAdminName = promotionMeta - ? pickDisplayName(promotionMeta.promoted, lang) - : ""; - const isMeNewAdmin = - !!promotionMeta?.promoted && promotionMeta.promoted.id === user?.id; - - return ( - - ); - }) - )} - - ); - })()} -
- )} -
- ); -} diff --git a/artifacts/tx-os/src/pages/home.tsx b/artifacts/tx-os/src/pages/home.tsx index eb557473..27b6f896 100644 --- a/artifacts/tx-os/src/pages/home.tsx +++ b/artifacts/tx-os/src/pages/home.tsx @@ -28,7 +28,6 @@ import { Globe, Grid2X2, Coffee, - MessageSquare, BellRing, Sparkles, } from "lucide-react"; @@ -501,7 +500,7 @@ export default function HomePage() { ); }; - const dockApps = (orderedApps ?? apps)?.filter((a) => ["services", "chat", "notifications", "admin"].includes(a.slug)) ?? []; + const dockApps = (orderedApps ?? apps)?.filter((a) => ["services", "notifications", "admin"].includes(a.slug)) ?? []; const initials = (displayName || "?").trim().slice(0, 1).toUpperCase(); @@ -620,12 +619,6 @@ export default function HomePage() { Icon={Coffee} iconClass="bg-amber-100 text-amber-600" /> - { if (!n.isRead) { handleMarkOne(n.id); } - if (n.relatedType === "conversation" && n.relatedId != null) { - setLocation(`/chat?c=${n.relatedId}`); - } }; const unreadCount = notifications?.filter((n) => !n.isRead).length ?? 0; diff --git a/artifacts/tx-os/tests/admin-inline-dependency-counts.spec.mjs b/artifacts/tx-os/tests/admin-inline-dependency-counts.spec.mjs index d9e4ff04..f96b6b82 100644 --- a/artifacts/tx-os/tests/admin-inline-dependency-counts.spec.mjs +++ b/artifacts/tx-os/tests/admin-inline-dependency-counts.spec.mjs @@ -132,33 +132,11 @@ async function createNote(userId) { ); } -async function createConversationWithMessage(creatorId) { - const { rows } = await pool.query( - `INSERT INTO conversations (created_by, name_en) VALUES ($1, 'inline counts test') RETURNING id`, - [creatorId], - ); - const conversationId = rows[0].id; - await pool.query( - `INSERT INTO messages (conversation_id, sender_id, content) VALUES ($1, $2, 'hi')`, - [conversationId, creatorId], - ); - return conversationId; -} - test.afterAll(async () => { - // Order matters: messages / conversations / notes / service_orders - // must go before users (sender_id and created_by have no ON DELETE - // rule). service_orders must also go before services (service_id is - // ON DELETE RESTRICT). + // Order matters: notes / service_orders must go before users + // (user_id has no ON DELETE rule). service_orders must also go + // before services (service_id is ON DELETE RESTRICT). if (createdUserIds.length > 0) { - await pool.query( - `DELETE FROM messages WHERE sender_id = ANY($1::int[])`, - [createdUserIds], - ); - await pool.query( - `DELETE FROM conversations WHERE created_by = ANY($1::int[])`, - [createdUserIds], - ); await pool.query( `DELETE FROM notes WHERE user_id = ANY($1::int[])`, [createdUserIds], @@ -259,8 +237,6 @@ const COUNT_TEXT = { serviceOrders: "orders", userNotes: "notes", userOrders: "orders", - userConversations: "convos", - userMessages: "messages", }, ar: { appGroups: "مجموعة", @@ -269,8 +245,6 @@ const COUNT_TEXT = { serviceOrders: "طلب", userNotes: "ملاحظة", userOrders: "طلب", - userConversations: "محادثة", - userMessages: "رسالة", }, }; @@ -305,7 +279,6 @@ for (const lang of ["en", "ar"]) { // one so `serviceNoOrders` stays at zero orders and we can assert // its counts row is omitted. await createOrder(userWithDeps.id, serviceWithOrders.id); - await createConversationWithMessage(userWithDeps.id); // ---- Login ---- await setLanguage(page, lang); @@ -401,24 +374,12 @@ for (const lang of ["en", "ar"]) { const userOrdersChip = page.locator( `[data-testid="user-counts-orders-${userWithDeps.id}"]`, ); - const convChip = page.locator( - `[data-testid="user-counts-conversations-${userWithDeps.id}"]`, - ); - const msgChip = page.locator( - `[data-testid="user-counts-messages-${userWithDeps.id}"]`, - ); await expect(notesChip).toBeVisible(); await expect(userOrdersChip).toBeVisible(); - await expect(convChip).toBeVisible(); - await expect(msgChip).toBeVisible(); await expect(notesChip).toContainText("1"); await expect(notesChip).toContainText(labels.userNotes); await expect(userOrdersChip).toContainText("1"); await expect(userOrdersChip).toContainText(labels.userOrders); - await expect(convChip).toContainText("1"); - await expect(convChip).toContainText(labels.userConversations); - await expect(msgChip).toContainText("1"); - await expect(msgChip).toContainText(labels.userMessages); // The bare user: row present (delete button), counts row absent. await expect( diff --git a/artifacts/tx-os/tests/leave-group-successor.spec.mjs b/artifacts/tx-os/tests/leave-group-successor.spec.mjs deleted file mode 100644 index 6e2dee58..00000000 --- a/artifacts/tx-os/tests/leave-group-successor.spec.mjs +++ /dev/null @@ -1,245 +0,0 @@ -// UI test for the leave-group successor picker dialog in chat.tsx. -// -// Mirrors the backend coverage in -// artifacts/api-server/tests/conversations-leave.test.mjs but at the UI layer: -// it drives the actual dialog rendered by artifacts/tx-os/src/pages/chat.tsx -// in a real browser, including: -// - The cancel path (close the dialog -> nothing changes). -// - The chosen-successor path (pick a specific member -> they become admin). -// -// Run with: -// DATABASE_URL=... pnpm --filter @workspace/tx-os exec playwright test -// -// Browser binaries can be installed once with: -// pnpm --filter @workspace/tx-os exec playwright install chromium -// -// The test seeds its own users + group via the database and cleans up after -// itself, so it can run against the live dev environment without polluting it. - -import { test, expect } from "@playwright/test"; -import pg from "pg"; - -const DATABASE_URL = process.env.DATABASE_URL; -if (!DATABASE_URL) { - throw new Error("DATABASE_URL must be set to run the leave-group UI test"); -} - -// Same convention as artifacts/api-server/tests/conversations-leave.test.mjs: -// a precomputed bcrypt hash of the literal password "TestPass123!". -const TEST_PASSWORD = "TestPass123!"; -const TEST_PASSWORD_HASH = - "$2b$10$Bs636ukPMyz01nKrsi.5m.JlDXSN22AVCvn8cgPWWDbo5yJRQX2vu"; - -const pool = new pg.Pool({ connectionString: DATABASE_URL }); - -const createdUserIds = []; -const createdConversationIds = []; - -function uniqueSuffix() { - return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`; -} - -async function createUser(prefix) { - const username = `${prefix}_${uniqueSuffix()}`; - const { rows } = await pool.query( - `INSERT INTO users (username, email, password_hash, display_name_en, preferred_language, is_active) - VALUES ($1, $2, $3, $4, 'en', true) RETURNING id`, - [username, `${username}@example.com`, TEST_PASSWORD_HASH, prefix], - ); - const id = rows[0].id; - createdUserIds.push(id); - await pool.query( - `INSERT INTO user_roles (user_id, role_id) - SELECT $1, id FROM roles WHERE name = 'user'`, - [id], - ); - return { id, username, displayName: prefix }; -} - -async function createGroup(creatorId, members) { - const groupName = `Successor Picker Test ${uniqueSuffix()}`; - const { rows } = await pool.query( - `INSERT INTO conversations (name_en, is_group, created_by) - VALUES ($1, true, $2) RETURNING id`, - [groupName, creatorId], - ); - const conversationId = rows[0].id; - createdConversationIds.push(conversationId); - - // Insert participants in deterministic joined_at order so that the auto - // promotion would pick the *first* non-admin member. The test then verifies - // that an explicit successor choice can override that default. - let offsetMs = 0; - for (const m of members) { - await pool.query( - `INSERT INTO conversation_participants - (conversation_id, user_id, is_admin, joined_at) - VALUES ($1, $2, $3, NOW() - ($4 || ' milliseconds')::interval)`, - [conversationId, m.userId, !!m.isAdmin, 10000 - offsetMs], - ); - offsetMs += 1000; - } - return { conversationId, groupName }; -} - -async function getParticipants(conversationId) { - const { rows } = await pool.query( - `SELECT user_id AS "userId", is_admin AS "isAdmin" - FROM conversation_participants - WHERE conversation_id = $1 - ORDER BY joined_at ASC`, - [conversationId], - ); - return rows; -} - -test.afterAll(async () => { - if (createdConversationIds.length > 0) { - await pool.query( - `DELETE FROM messages WHERE conversation_id = ANY($1::int[])`, - [createdConversationIds], - ); - await pool.query( - `DELETE FROM conversation_participants WHERE conversation_id = ANY($1::int[])`, - [createdConversationIds], - ); - await pool.query( - `DELETE FROM conversations WHERE id = ANY($1::int[])`, - [createdConversationIds], - ); - } - if (createdUserIds.length > 0) { - await pool.query( - `DELETE FROM user_roles WHERE user_id = ANY($1::int[])`, - [createdUserIds], - ); - await pool.query(`DELETE FROM users WHERE id = ANY($1::int[])`, [ - createdUserIds, - ]); - } - await pool.end(); -}); - -async function loginViaUi(page, username, password) { - await page.goto("/login"); - await page.locator("#username").fill(username); - await page.locator("#password").fill(password); - await Promise.all([ - page.waitForURL((url) => !url.pathname.endsWith("/login"), { - timeout: 15_000, - }), - page.locator('form button[type="submit"]').click(), - ]); -} - -async function openLeaveDialog(page, groupName) { - await page.goto("/chat"); - // Wait for the conversation list to load and click the seeded group. - await page.getByRole("button", { name: new RegExp(groupName) }).first().click(); - // Open the actions sheet, then "Leave group". - await page.locator('[data-testid="button-chat-actions"]').click(); - await expect(page.locator('[data-testid="dialog-chat-actions"]')).toBeVisible(); - await page.locator('[data-testid="button-leave-group"]').click(); - await expect(page.locator('[data-testid="dialog-confirm-leave"]')).toBeVisible(); - await expect(page.locator('[data-testid="successor-chooser"]')).toBeVisible(); -} - -test.describe("Leave group: successor picker dialog", () => { - test("cancel path leaves the group and admin assignments unchanged", async ({ - page, - }) => { - const admin = await createUser("leave_ui_cancel_admin"); - const m1 = await createUser("leave_ui_cancel_m1"); - const m2 = await createUser("leave_ui_cancel_m2"); - const { conversationId, groupName } = await createGroup(admin.id, [ - { userId: admin.id, isAdmin: true }, - { userId: m1.id, isAdmin: false }, - { userId: m2.id, isAdmin: false }, - ]); - - await loginViaUi(page, admin.username, TEST_PASSWORD); - await openLeaveDialog(page, groupName); - - // Auto option is selected by default; both successor options are listed. - await expect( - page.locator('[data-testid="successor-option-auto"] input[type="radio"]'), - ).toBeChecked(); - await expect( - page.locator(`[data-testid="successor-option-${m1.id}"]`), - ).toBeVisible(); - await expect( - page.locator(`[data-testid="successor-option-${m2.id}"]`), - ).toBeVisible(); - - // Click the Cancel button inside the leave dialog. - await page - .locator('[data-testid="dialog-confirm-leave"] button') - .filter({ hasText: /^(Cancel|إلغاء)$/ }) - .click(); - - await expect( - page.locator('[data-testid="dialog-confirm-leave"]'), - ).toBeHidden(); - - // Membership and admin flags must be unchanged after a cancel. - const parts = await getParticipants(conversationId); - expect(parts).toHaveLength(3); - const adminRow = parts.find((p) => p.userId === admin.id); - const m1Row = parts.find((p) => p.userId === m1.id); - const m2Row = parts.find((p) => p.userId === m2.id); - expect(adminRow?.isAdmin).toBe(true); - expect(m1Row?.isAdmin).toBe(false); - expect(m2Row?.isAdmin).toBe(false); - }); - - test("picking a specific successor promotes that member, not the auto pick", async ({ - page, - }) => { - const admin = await createUser("leave_ui_pick_admin"); - const m1 = await createUser("leave_ui_pick_m1"); // would be the auto pick - const m2 = await createUser("leave_ui_pick_m2"); // explicitly chosen - const { conversationId, groupName } = await createGroup(admin.id, [ - { userId: admin.id, isAdmin: true }, - { userId: m1.id, isAdmin: false }, - { userId: m2.id, isAdmin: false }, - ]); - - await loginViaUi(page, admin.username, TEST_PASSWORD); - await openLeaveDialog(page, groupName); - - // Pick the later-joined member (m2) as the successor. - await page - .locator(`[data-testid="successor-option-${m2.id}"] input[type="radio"]`) - .check(); - await expect( - page.locator(`[data-testid="successor-option-${m2.id}"] input[type="radio"]`), - ).toBeChecked(); - await expect( - page.locator('[data-testid="successor-option-auto"] input[type="radio"]'), - ).not.toBeChecked(); - - // Confirm the leave. - const leavePromise = page.waitForResponse( - (resp) => - resp.url().includes(`/api/conversations/${conversationId}/leave`) && - resp.request().method() === "POST", - ); - await page.locator('[data-testid="button-confirm-leave"]').click(); - const leaveResp = await leavePromise; - expect(leaveResp.status()).toBe(200); - - // The dialog closes and the user is returned to the conversation list. - await expect( - page.locator('[data-testid="dialog-confirm-leave"]'), - ).toBeHidden(); - - // The chosen successor — not the auto pick — must be the new admin. - const parts = await getParticipants(conversationId); - expect(parts).toHaveLength(2); - expect(parts.find((p) => p.userId === admin.id)).toBeUndefined(); - const m1Row = parts.find((p) => p.userId === m1.id); - const m2Row = parts.find((p) => p.userId === m2.id); - expect(m1Row?.isAdmin).toBe(false); - expect(m2Row?.isAdmin).toBe(true); - }); -}); diff --git a/attached_assets/image_1778582606077.png b/attached_assets/image_1778582606077.png new file mode 100644 index 0000000000000000000000000000000000000000..29a928ce85949e2a2e47da1d2fbbbd6112a851ec GIT binary patch literal 357765 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

wa6|s(j4D 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 E4{J1vxc~qF literal 0 HcmV?d00001 diff --git a/lib/api-client-react/src/generated/api.schemas.ts b/lib/api-client-react/src/generated/api.schemas.ts index 517dcb10..6d3c1cb4 100644 --- a/lib/api-client-react/src/generated/api.schemas.ts +++ b/lib/api-client-react/src/generated/api.schemas.ts @@ -197,14 +197,6 @@ Omitted from single-user responses (GET /users/:id, PATCH, etc). admin list endpoint (GET /users). */ orderCount?: number; - /** Number of conversations created by this user. Populated only by the -admin list endpoint (GET /users). - */ - conversationCount?: number; - /** Number of messages authored by this user. Populated only by the -admin list endpoint (GET /users). - */ - messageCount?: number; } export interface UpdateUserBody { @@ -371,8 +363,6 @@ export interface UserDeletionConflict { error: string; noteCount: number; orderCount: number; - conversationCount: number; - messageCount: number; } export interface AppDeletionConflict { @@ -643,96 +633,6 @@ export interface BulkDeleteServiceOrdersResponse { failedIds: number[]; } -export interface ParticipantInfo { - id: number; - username: string; - /** @nullable */ - displayNameAr?: string | null; - /** @nullable */ - displayNameEn?: string | null; - /** @nullable */ - avatarUrl?: string | null; - isAdmin: boolean; -} - -export type MessageWithSenderKind = - (typeof MessageWithSenderKind)[keyof typeof MessageWithSenderKind]; - -export const MessageWithSenderKind = { - user: "user", - group_renamed: "group_renamed", - members_added: "members_added", - member_removed: "member_removed", - member_left: "member_left", - admin_promoted: "admin_promoted", -} as const; - -export type MessageWithSenderMeta = { [key: string]: unknown } | null; - -export interface MessageWithSender { - id: number; - conversationId: number; - senderId: number; - content: string; - kind: MessageWithSenderKind; - meta?: MessageWithSenderMeta; - sender: ParticipantInfo; - createdAt: string; - updatedAt: string; -} - -export interface ConversationWithDetails { - id: number; - /** @nullable */ - nameAr?: string | null; - /** @nullable */ - nameEn?: string | null; - /** @nullable */ - avatarUrl?: string | null; - isGroup: boolean; - createdBy: number; - participants: ParticipantInfo[]; - lastMessage?: MessageWithSender | null; - unreadCount: number; - isMuted: boolean; - isArchived: boolean; - createdAt: string; - updatedAt: string; -} - -export interface CreateConversationBody { - participantIds: number[]; - /** @nullable */ - nameAr?: string | null; - /** @nullable */ - nameEn?: string | null; - /** @nullable */ - avatarUrl?: string | null; - isGroup?: boolean; -} - -export interface UpdateConversationBody { - /** @nullable */ - avatarUrl?: string | null; - /** @nullable */ - nameAr?: string | null; - /** @nullable */ - nameEn?: string | null; -} - -export interface UpdateConversationStateBody { - isMuted?: boolean; - isArchived?: boolean; -} - -export interface AddParticipantsBody { - userIds: number[]; -} - -export interface SendMessageBody { - content: string; -} - export interface Notification { id: number; userId: number; @@ -808,7 +708,6 @@ export interface HomeStats { totalApps: number; totalServices: number; unreadNotifications: number; - unreadMessages: number; totalUsers: number; } @@ -1224,47 +1123,6 @@ export interface UserDependentOrdersPage { nextOffset: number | null; } -export interface UserDependentConversationItem { - id: number; - /** @nullable */ - nameAr: string | null; - /** @nullable */ - nameEn: string | null; - isGroup: boolean; - createdAt: string; -} - -export interface UserDependentConversationsPage { - items: UserDependentConversationItem[]; - totalCount: number; - limit: number; - offset: number; - /** @nullable */ - nextOffset: number | null; -} - -export interface UserDependentMessageItem { - id: number; - content: string; - kind: string; - createdAt: string; - conversationId: number; - /** @nullable */ - conversationNameAr: string | null; - /** @nullable */ - conversationNameEn: string | null; - conversationIsGroup: boolean; -} - -export interface UserDependentMessagesPage { - items: UserDependentMessageItem[]; - totalCount: number; - limit: number; - offset: number; - /** @nullable */ - nextOffset: number | null; -} - export interface AuditLogActor { id: number; username: string; @@ -1381,14 +1239,6 @@ export type DeleteServiceParams = { force?: boolean; }; -export type LeaveConversationBody = { - /** When the leaver is the only admin, optionally name a specific -remaining member to promote. Omit (or send null) to keep the -automatic behavior of promoting the longest-tenured member. - */ - successorId?: number | null; -}; - export type ListUsersParams = { /** * Free-text search across username, email, and display names @@ -1822,27 +1672,3 @@ export type GetAdminUserDependentOrdersParams = { */ offset?: number; }; - -export type GetAdminUserDependentConversationsParams = { - /** - * @minimum 1 - * @maximum 200 - */ - limit?: number; - /** - * @minimum 0 - */ - offset?: number; -}; - -export type GetAdminUserDependentMessagesParams = { - /** - * @minimum 1 - * @maximum 200 - */ - limit?: number; - /** - * @minimum 0 - */ - offset?: number; -}; diff --git a/lib/api-client-react/src/generated/api.ts b/lib/api-client-react/src/generated/api.ts index a332c32c..be21d74c 100644 --- a/lib/api-client-react/src/generated/api.ts +++ b/lib/api-client-react/src/generated/api.ts @@ -18,7 +18,6 @@ import type { import type { AddAppPermissionBody, - AddParticipantsBody, AddUserRoleBody, AdminAppOpensByApp, AdminAppOpensByUser, @@ -38,9 +37,7 @@ import type { AuthUser, BulkDeleteServiceOrdersBody, BulkDeleteServiceOrdersResponse, - ConversationWithDetails, CreateAppBody, - CreateConversationBody, CreateGroupBody, CreateNoteFolderBody, CreateRoleBody, @@ -63,8 +60,6 @@ import type { GetAdminAppOpensByUserParams, GetAdminServiceDependentOrdersParams, GetAdminStatsParams, - GetAdminUserDependentConversationsParams, - GetAdminUserDependentMessagesParams, GetAdminUserDependentNotesParams, GetAdminUserDependentOrdersParams, GetAppPermissionAuditParams, @@ -76,7 +71,6 @@ import type { GroupDetail, HealthStatus, HomeStats, - LeaveConversationBody, ListAuditLogsParams, ListGroupsParams, ListMyNotesAliasParams, @@ -84,7 +78,6 @@ import type { ListReceivedNotesParams, ListUsersParams, LoginBody, - MessageWithSender, MyNote, NoteFolder, NoteReply, @@ -105,7 +98,6 @@ import type { RolePermissionsImpact, RolePermissionsImpactBody, RoleUsage, - SendMessageBody, SendNoteBody, SendNoteResult, SentNote, @@ -119,8 +111,6 @@ import type { UpdateAppSettingsBody, UpdateClockHour12Body, UpdateClockStyleBody, - UpdateConversationBody, - UpdateConversationStateBody, UpdateGroupBody, UpdateLanguageBody, UpdateMyAppOrderBody, @@ -132,8 +122,6 @@ import type { UpdateServiceOrderStatusBody, UpdateUserBody, UserDeletionConflict, - UserDependentConversationsPage, - UserDependentMessagesPage, UserDependentNotesPage, UserDependentOrdersPage, UserProfile, @@ -3345,959 +3333,6 @@ export function useListServiceCategories< return { ...query, queryKey: queryOptions.queryKey }; } -/** - * @summary List conversations for current user - */ -export const getListConversationsUrl = () => { - return `/api/conversations`; -}; - -export const listConversations = async ( - options?: RequestInit, -): Promise => { - return customFetch(getListConversationsUrl(), { - ...options, - method: "GET", - }); -}; - -export const getListConversationsQueryKey = () => { - return [`/api/conversations`] as const; -}; - -export const getListConversationsQueryOptions = < - TData = Awaited>, - TError = ErrorType, ->(options?: { - query?: UseQueryOptions< - Awaited>, - TError, - TData - >; - request?: SecondParameter; -}) => { - const { query: queryOptions, request: requestOptions } = options ?? {}; - - const queryKey = queryOptions?.queryKey ?? getListConversationsQueryKey(); - - const queryFn: QueryFunction< - Awaited> - > = ({ signal }) => listConversations({ signal, ...requestOptions }); - - return { queryKey, queryFn, ...queryOptions } as UseQueryOptions< - Awaited>, - TError, - TData - > & { queryKey: QueryKey }; -}; - -export type ListConversationsQueryResult = NonNullable< - Awaited> ->; -export type ListConversationsQueryError = ErrorType; - -/** - * @summary List conversations for current user - */ - -export function useListConversations< - TData = Awaited>, - TError = ErrorType, ->(options?: { - query?: UseQueryOptions< - Awaited>, - TError, - TData - >; - request?: SecondParameter; -}): UseQueryResult & { queryKey: QueryKey } { - const queryOptions = getListConversationsQueryOptions(options); - - const query = useQuery(queryOptions) as UseQueryResult & { - queryKey: QueryKey; - }; - - return { ...query, queryKey: queryOptions.queryKey }; -} - -/** - * @summary Create a conversation - */ -export const getCreateConversationUrl = () => { - return `/api/conversations`; -}; - -export const createConversation = async ( - createConversationBody: CreateConversationBody, - options?: RequestInit, -): Promise => { - return customFetch(getCreateConversationUrl(), { - ...options, - method: "POST", - headers: { "Content-Type": "application/json", ...options?.headers }, - body: JSON.stringify(createConversationBody), - }); -}; - -export const getCreateConversationMutationOptions = < - TError = ErrorType, - TContext = unknown, ->(options?: { - mutation?: UseMutationOptions< - Awaited>, - TError, - { data: BodyType }, - TContext - >; - request?: SecondParameter; -}): UseMutationOptions< - Awaited>, - TError, - { data: BodyType }, - TContext -> => { - const mutationKey = ["createConversation"]; - const { mutation: mutationOptions, request: requestOptions } = options - ? options.mutation && - "mutationKey" in options.mutation && - options.mutation.mutationKey - ? options - : { ...options, mutation: { ...options.mutation, mutationKey } } - : { mutation: { mutationKey }, request: undefined }; - - const mutationFn: MutationFunction< - Awaited>, - { data: BodyType } - > = (props) => { - const { data } = props ?? {}; - - return createConversation(data, requestOptions); - }; - - return { mutationFn, ...mutationOptions }; -}; - -export type CreateConversationMutationResult = NonNullable< - Awaited> ->; -export type CreateConversationMutationBody = BodyType; -export type CreateConversationMutationError = ErrorType; - -/** - * @summary Create a conversation - */ -export const useCreateConversation = < - TError = ErrorType, - TContext = unknown, ->(options?: { - mutation?: UseMutationOptions< - Awaited>, - TError, - { data: BodyType }, - TContext - >; - request?: SecondParameter; -}): UseMutationResult< - Awaited>, - TError, - { data: BodyType }, - TContext -> => { - return useMutation(getCreateConversationMutationOptions(options)); -}; - -/** - * @summary Get conversation by ID - */ -export const getGetConversationUrl = (id: number) => { - return `/api/conversations/${id}`; -}; - -export const getConversation = async ( - id: number, - options?: RequestInit, -): Promise => { - return customFetch(getGetConversationUrl(id), { - ...options, - method: "GET", - }); -}; - -export const getGetConversationQueryKey = (id: number) => { - return [`/api/conversations/${id}`] as const; -}; - -export const getGetConversationQueryOptions = < - TData = Awaited>, - TError = ErrorType, ->( - id: number, - options?: { - query?: UseQueryOptions< - Awaited>, - TError, - TData - >; - request?: SecondParameter; - }, -) => { - const { query: queryOptions, request: requestOptions } = options ?? {}; - - const queryKey = queryOptions?.queryKey ?? getGetConversationQueryKey(id); - - const queryFn: QueryFunction>> = ({ - signal, - }) => getConversation(id, { signal, ...requestOptions }); - - return { - queryKey, - queryFn, - enabled: !!id, - ...queryOptions, - } as UseQueryOptions< - Awaited>, - TError, - TData - > & { queryKey: QueryKey }; -}; - -export type GetConversationQueryResult = NonNullable< - Awaited> ->; -export type GetConversationQueryError = ErrorType; - -/** - * @summary Get conversation by ID - */ - -export function useGetConversation< - TData = Awaited>, - TError = ErrorType, ->( - id: number, - options?: { - query?: UseQueryOptions< - Awaited>, - TError, - TData - >; - request?: SecondParameter; - }, -): UseQueryResult & { queryKey: QueryKey } { - const queryOptions = getGetConversationQueryOptions(id, options); - - const query = useQuery(queryOptions) as UseQueryResult & { - queryKey: QueryKey; - }; - - return { ...query, queryKey: queryOptions.queryKey }; -} - -/** - * @summary Update conversation properties (admin only) - */ -export const getUpdateConversationUrl = (id: number) => { - return `/api/conversations/${id}`; -}; - -export const updateConversation = async ( - id: number, - updateConversationBody: UpdateConversationBody, - options?: RequestInit, -): Promise => { - return customFetch(getUpdateConversationUrl(id), { - ...options, - method: "PATCH", - headers: { "Content-Type": "application/json", ...options?.headers }, - body: JSON.stringify(updateConversationBody), - }); -}; - -export const getUpdateConversationMutationOptions = < - TError = ErrorType, - TContext = unknown, ->(options?: { - mutation?: UseMutationOptions< - Awaited>, - TError, - { id: number; data: BodyType }, - TContext - >; - request?: SecondParameter; -}): UseMutationOptions< - Awaited>, - TError, - { id: number; data: BodyType }, - TContext -> => { - const mutationKey = ["updateConversation"]; - const { mutation: mutationOptions, request: requestOptions } = options - ? options.mutation && - "mutationKey" in options.mutation && - options.mutation.mutationKey - ? options - : { ...options, mutation: { ...options.mutation, mutationKey } } - : { mutation: { mutationKey }, request: undefined }; - - const mutationFn: MutationFunction< - Awaited>, - { id: number; data: BodyType } - > = (props) => { - const { id, data } = props ?? {}; - - return updateConversation(id, data, requestOptions); - }; - - return { mutationFn, ...mutationOptions }; -}; - -export type UpdateConversationMutationResult = NonNullable< - Awaited> ->; -export type UpdateConversationMutationBody = BodyType; -export type UpdateConversationMutationError = ErrorType; - -/** - * @summary Update conversation properties (admin only) - */ -export const useUpdateConversation = < - TError = ErrorType, - TContext = unknown, ->(options?: { - mutation?: UseMutationOptions< - Awaited>, - TError, - { id: number; data: BodyType }, - TContext - >; - request?: SecondParameter; -}): UseMutationResult< - Awaited>, - TError, - { id: number; data: BodyType }, - TContext -> => { - return useMutation(getUpdateConversationMutationOptions(options)); -}; - -/** - * @summary Add participants to a group conversation (admin only) - */ -export const getAddConversationParticipantsUrl = (id: number) => { - return `/api/conversations/${id}/participants`; -}; - -export const addConversationParticipants = async ( - id: number, - addParticipantsBody: AddParticipantsBody, - options?: RequestInit, -): Promise => { - return customFetch( - getAddConversationParticipantsUrl(id), - { - ...options, - method: "POST", - headers: { "Content-Type": "application/json", ...options?.headers }, - body: JSON.stringify(addParticipantsBody), - }, - ); -}; - -export const getAddConversationParticipantsMutationOptions = < - TError = ErrorType, - TContext = unknown, ->(options?: { - mutation?: UseMutationOptions< - Awaited>, - TError, - { id: number; data: BodyType }, - TContext - >; - request?: SecondParameter; -}): UseMutationOptions< - Awaited>, - TError, - { id: number; data: BodyType }, - TContext -> => { - const mutationKey = ["addConversationParticipants"]; - const { mutation: mutationOptions, request: requestOptions } = options - ? options.mutation && - "mutationKey" in options.mutation && - options.mutation.mutationKey - ? options - : { ...options, mutation: { ...options.mutation, mutationKey } } - : { mutation: { mutationKey }, request: undefined }; - - const mutationFn: MutationFunction< - Awaited>, - { id: number; data: BodyType } - > = (props) => { - const { id, data } = props ?? {}; - - return addConversationParticipants(id, data, requestOptions); - }; - - return { mutationFn, ...mutationOptions }; -}; - -export type AddConversationParticipantsMutationResult = NonNullable< - Awaited> ->; -export type AddConversationParticipantsMutationBody = - BodyType; -export type AddConversationParticipantsMutationError = ErrorType; - -/** - * @summary Add participants to a group conversation (admin only) - */ -export const useAddConversationParticipants = < - TError = ErrorType, - TContext = unknown, ->(options?: { - mutation?: UseMutationOptions< - Awaited>, - TError, - { id: number; data: BodyType }, - TContext - >; - request?: SecondParameter; -}): UseMutationResult< - Awaited>, - TError, - { id: number; data: BodyType }, - TContext -> => { - return useMutation(getAddConversationParticipantsMutationOptions(options)); -}; - -/** - * @summary Remove a participant from a group conversation (admin only) - */ -export const getRemoveConversationParticipantUrl = ( - id: number, - userId: number, -) => { - return `/api/conversations/${id}/participants/${userId}`; -}; - -export const removeConversationParticipant = async ( - id: number, - userId: number, - options?: RequestInit, -): Promise => { - return customFetch( - getRemoveConversationParticipantUrl(id, userId), - { - ...options, - method: "DELETE", - }, - ); -}; - -export const getRemoveConversationParticipantMutationOptions = < - TError = ErrorType, - TContext = unknown, ->(options?: { - mutation?: UseMutationOptions< - Awaited>, - TError, - { id: number; userId: number }, - TContext - >; - request?: SecondParameter; -}): UseMutationOptions< - Awaited>, - TError, - { id: number; userId: number }, - TContext -> => { - const mutationKey = ["removeConversationParticipant"]; - const { mutation: mutationOptions, request: requestOptions } = options - ? options.mutation && - "mutationKey" in options.mutation && - options.mutation.mutationKey - ? options - : { ...options, mutation: { ...options.mutation, mutationKey } } - : { mutation: { mutationKey }, request: undefined }; - - const mutationFn: MutationFunction< - Awaited>, - { id: number; userId: number } - > = (props) => { - const { id, userId } = props ?? {}; - - return removeConversationParticipant(id, userId, requestOptions); - }; - - return { mutationFn, ...mutationOptions }; -}; - -export type RemoveConversationParticipantMutationResult = NonNullable< - Awaited> ->; - -export type RemoveConversationParticipantMutationError = ErrorType; - -/** - * @summary Remove a participant from a group conversation (admin only) - */ -export const useRemoveConversationParticipant = < - TError = ErrorType, - TContext = unknown, ->(options?: { - mutation?: UseMutationOptions< - Awaited>, - TError, - { id: number; userId: number }, - TContext - >; - request?: SecondParameter; -}): UseMutationResult< - Awaited>, - TError, - { id: number; userId: number }, - TContext -> => { - return useMutation(getRemoveConversationParticipantMutationOptions(options)); -}; - -/** - * @summary Update per-user state (mute, archive) - */ -export const getUpdateConversationStateUrl = (id: number) => { - return `/api/conversations/${id}/state`; -}; - -export const updateConversationState = async ( - id: number, - updateConversationStateBody: UpdateConversationStateBody, - options?: RequestInit, -): Promise => { - return customFetch( - getUpdateConversationStateUrl(id), - { - ...options, - method: "PATCH", - headers: { "Content-Type": "application/json", ...options?.headers }, - body: JSON.stringify(updateConversationStateBody), - }, - ); -}; - -export const getUpdateConversationStateMutationOptions = < - TError = ErrorType, - TContext = unknown, ->(options?: { - mutation?: UseMutationOptions< - Awaited>, - TError, - { id: number; data: BodyType }, - TContext - >; - request?: SecondParameter; -}): UseMutationOptions< - Awaited>, - TError, - { id: number; data: BodyType }, - TContext -> => { - const mutationKey = ["updateConversationState"]; - const { mutation: mutationOptions, request: requestOptions } = options - ? options.mutation && - "mutationKey" in options.mutation && - options.mutation.mutationKey - ? options - : { ...options, mutation: { ...options.mutation, mutationKey } } - : { mutation: { mutationKey }, request: undefined }; - - const mutationFn: MutationFunction< - Awaited>, - { id: number; data: BodyType } - > = (props) => { - const { id, data } = props ?? {}; - - return updateConversationState(id, data, requestOptions); - }; - - return { mutationFn, ...mutationOptions }; -}; - -export type UpdateConversationStateMutationResult = NonNullable< - Awaited> ->; -export type UpdateConversationStateMutationBody = - BodyType; -export type UpdateConversationStateMutationError = ErrorType; - -/** - * @summary Update per-user state (mute, archive) - */ -export const useUpdateConversationState = < - TError = ErrorType, - TContext = unknown, ->(options?: { - mutation?: UseMutationOptions< - Awaited>, - TError, - { id: number; data: BodyType }, - TContext - >; - request?: SecondParameter; -}): UseMutationResult< - Awaited>, - TError, - { id: number; data: BodyType }, - TContext -> => { - return useMutation(getUpdateConversationStateMutationOptions(options)); -}; - -/** - * @summary Leave a group conversation - */ -export const getLeaveConversationUrl = (id: number) => { - return `/api/conversations/${id}/leave`; -}; - -export const leaveConversation = async ( - id: number, - leaveConversationBody?: LeaveConversationBody, - options?: RequestInit, -): Promise => { - return customFetch(getLeaveConversationUrl(id), { - ...options, - method: "POST", - headers: { "Content-Type": "application/json", ...options?.headers }, - body: JSON.stringify(leaveConversationBody), - }); -}; - -export const getLeaveConversationMutationOptions = < - TError = ErrorType, - TContext = unknown, ->(options?: { - mutation?: UseMutationOptions< - Awaited>, - TError, - { id: number; data: BodyType }, - TContext - >; - request?: SecondParameter; -}): UseMutationOptions< - Awaited>, - TError, - { id: number; data: BodyType }, - TContext -> => { - const mutationKey = ["leaveConversation"]; - const { mutation: mutationOptions, request: requestOptions } = options - ? options.mutation && - "mutationKey" in options.mutation && - options.mutation.mutationKey - ? options - : { ...options, mutation: { ...options.mutation, mutationKey } } - : { mutation: { mutationKey }, request: undefined }; - - const mutationFn: MutationFunction< - Awaited>, - { id: number; data: BodyType } - > = (props) => { - const { id, data } = props ?? {}; - - return leaveConversation(id, data, requestOptions); - }; - - return { mutationFn, ...mutationOptions }; -}; - -export type LeaveConversationMutationResult = NonNullable< - Awaited> ->; -export type LeaveConversationMutationBody = BodyType; -export type LeaveConversationMutationError = ErrorType; - -/** - * @summary Leave a group conversation - */ -export const useLeaveConversation = < - TError = ErrorType, - TContext = unknown, ->(options?: { - mutation?: UseMutationOptions< - Awaited>, - TError, - { id: number; data: BodyType }, - TContext - >; - request?: SecondParameter; -}): UseMutationResult< - Awaited>, - TError, - { id: number; data: BodyType }, - TContext -> => { - return useMutation(getLeaveConversationMutationOptions(options)); -}; - -/** - * @summary List messages in a conversation - */ -export const getListMessagesUrl = (id: number) => { - return `/api/conversations/${id}/messages`; -}; - -export const listMessages = async ( - id: number, - options?: RequestInit, -): Promise => { - return customFetch(getListMessagesUrl(id), { - ...options, - method: "GET", - }); -}; - -export const getListMessagesQueryKey = (id: number) => { - return [`/api/conversations/${id}/messages`] as const; -}; - -export const getListMessagesQueryOptions = < - TData = Awaited>, - TError = ErrorType, ->( - id: number, - options?: { - query?: UseQueryOptions< - Awaited>, - TError, - TData - >; - request?: SecondParameter; - }, -) => { - const { query: queryOptions, request: requestOptions } = options ?? {}; - - const queryKey = queryOptions?.queryKey ?? getListMessagesQueryKey(id); - - const queryFn: QueryFunction>> = ({ - signal, - }) => listMessages(id, { signal, ...requestOptions }); - - return { - queryKey, - queryFn, - enabled: !!id, - ...queryOptions, - } as UseQueryOptions< - Awaited>, - TError, - TData - > & { queryKey: QueryKey }; -}; - -export type ListMessagesQueryResult = NonNullable< - Awaited> ->; -export type ListMessagesQueryError = ErrorType; - -/** - * @summary List messages in a conversation - */ - -export function useListMessages< - TData = Awaited>, - TError = ErrorType, ->( - id: number, - options?: { - query?: UseQueryOptions< - Awaited>, - TError, - TData - >; - request?: SecondParameter; - }, -): UseQueryResult & { queryKey: QueryKey } { - const queryOptions = getListMessagesQueryOptions(id, options); - - const query = useQuery(queryOptions) as UseQueryResult & { - queryKey: QueryKey; - }; - - return { ...query, queryKey: queryOptions.queryKey }; -} - -/** - * @summary Send a message - */ -export const getSendMessageUrl = (id: number) => { - return `/api/conversations/${id}/messages`; -}; - -export const sendMessage = async ( - id: number, - sendMessageBody: SendMessageBody, - options?: RequestInit, -): Promise => { - return customFetch(getSendMessageUrl(id), { - ...options, - method: "POST", - headers: { "Content-Type": "application/json", ...options?.headers }, - body: JSON.stringify(sendMessageBody), - }); -}; - -export const getSendMessageMutationOptions = < - TError = ErrorType, - TContext = unknown, ->(options?: { - mutation?: UseMutationOptions< - Awaited>, - TError, - { id: number; data: BodyType }, - TContext - >; - request?: SecondParameter; -}): UseMutationOptions< - Awaited>, - TError, - { id: number; data: BodyType }, - TContext -> => { - const mutationKey = ["sendMessage"]; - const { mutation: mutationOptions, request: requestOptions } = options - ? options.mutation && - "mutationKey" in options.mutation && - options.mutation.mutationKey - ? options - : { ...options, mutation: { ...options.mutation, mutationKey } } - : { mutation: { mutationKey }, request: undefined }; - - const mutationFn: MutationFunction< - Awaited>, - { id: number; data: BodyType } - > = (props) => { - const { id, data } = props ?? {}; - - return sendMessage(id, data, requestOptions); - }; - - return { mutationFn, ...mutationOptions }; -}; - -export type SendMessageMutationResult = NonNullable< - Awaited> ->; -export type SendMessageMutationBody = BodyType; -export type SendMessageMutationError = ErrorType; - -/** - * @summary Send a message - */ -export const useSendMessage = < - TError = ErrorType, - TContext = unknown, ->(options?: { - mutation?: UseMutationOptions< - Awaited>, - TError, - { id: number; data: BodyType }, - TContext - >; - request?: SecondParameter; -}): UseMutationResult< - Awaited>, - TError, - { id: number; data: BodyType }, - TContext -> => { - return useMutation(getSendMessageMutationOptions(options)); -}; - -/** - * @summary Mark all messages in conversation as read - */ -export const getMarkConversationReadUrl = (id: number) => { - return `/api/conversations/${id}/read`; -}; - -export const markConversationRead = async ( - id: number, - options?: RequestInit, -): Promise => { - return customFetch(getMarkConversationReadUrl(id), { - ...options, - method: "POST", - }); -}; - -export const getMarkConversationReadMutationOptions = < - TError = ErrorType, - TContext = unknown, ->(options?: { - mutation?: UseMutationOptions< - Awaited>, - TError, - { id: number }, - TContext - >; - request?: SecondParameter; -}): UseMutationOptions< - Awaited>, - TError, - { id: number }, - TContext -> => { - const mutationKey = ["markConversationRead"]; - const { mutation: mutationOptions, request: requestOptions } = options - ? options.mutation && - "mutationKey" in options.mutation && - options.mutation.mutationKey - ? options - : { ...options, mutation: { ...options.mutation, mutationKey } } - : { mutation: { mutationKey }, request: undefined }; - - const mutationFn: MutationFunction< - Awaited>, - { id: number } - > = (props) => { - const { id } = props ?? {}; - - return markConversationRead(id, requestOptions); - }; - - return { mutationFn, ...mutationOptions }; -}; - -export type MarkConversationReadMutationResult = NonNullable< - Awaited> ->; - -export type MarkConversationReadMutationError = ErrorType; - -/** - * @summary Mark all messages in conversation as read - */ -export const useMarkConversationRead = < - TError = ErrorType, - TContext = unknown, ->(options?: { - mutation?: UseMutationOptions< - Awaited>, - TError, - { id: number }, - TContext - >; - request?: SecondParameter; -}): UseMutationResult< - Awaited>, - TError, - { id: number }, - TContext -> => { - return useMutation(getMarkConversationReadMutationOptions(options)); -}; - /** * @summary List notifications for current user */ @@ -9596,249 +8631,3 @@ export function useGetAdminUserDependentOrders< return { ...query, queryKey: queryOptions.queryKey }; } - -/** - * @summary List conversations created by a user - */ -export const getGetAdminUserDependentConversationsUrl = ( - id: number, - params?: GetAdminUserDependentConversationsParams, -) => { - const normalizedParams = new URLSearchParams(); - - Object.entries(params || {}).forEach(([key, value]) => { - if (value !== undefined) { - normalizedParams.append(key, value === null ? "null" : value.toString()); - } - }); - - const stringifiedParams = normalizedParams.toString(); - - return stringifiedParams.length > 0 - ? `/api/admin/users/${id}/dependents/conversations?${stringifiedParams}` - : `/api/admin/users/${id}/dependents/conversations`; -}; - -export const getAdminUserDependentConversations = async ( - id: number, - params?: GetAdminUserDependentConversationsParams, - options?: RequestInit, -): Promise => { - return customFetch( - getGetAdminUserDependentConversationsUrl(id, params), - { - ...options, - method: "GET", - }, - ); -}; - -export const getGetAdminUserDependentConversationsQueryKey = ( - id: number, - params?: GetAdminUserDependentConversationsParams, -) => { - return [ - `/api/admin/users/${id}/dependents/conversations`, - ...(params ? [params] : []), - ] as const; -}; - -export const getGetAdminUserDependentConversationsQueryOptions = < - TData = Awaited>, - TError = ErrorType, ->( - id: number, - params?: GetAdminUserDependentConversationsParams, - options?: { - query?: UseQueryOptions< - Awaited>, - TError, - TData - >; - request?: SecondParameter; - }, -) => { - const { query: queryOptions, request: requestOptions } = options ?? {}; - - const queryKey = - queryOptions?.queryKey ?? - getGetAdminUserDependentConversationsQueryKey(id, params); - - const queryFn: QueryFunction< - Awaited> - > = ({ signal }) => - getAdminUserDependentConversations(id, params, { - signal, - ...requestOptions, - }); - - return { - queryKey, - queryFn, - enabled: !!id, - ...queryOptions, - } as UseQueryOptions< - Awaited>, - TError, - TData - > & { queryKey: QueryKey }; -}; - -export type GetAdminUserDependentConversationsQueryResult = NonNullable< - Awaited> ->; -export type GetAdminUserDependentConversationsQueryError = - ErrorType; - -/** - * @summary List conversations created by a user - */ - -export function useGetAdminUserDependentConversations< - TData = Awaited>, - TError = ErrorType, ->( - id: number, - params?: GetAdminUserDependentConversationsParams, - options?: { - query?: UseQueryOptions< - Awaited>, - TError, - TData - >; - request?: SecondParameter; - }, -): UseQueryResult & { queryKey: QueryKey } { - const queryOptions = getGetAdminUserDependentConversationsQueryOptions( - id, - params, - options, - ); - - const query = useQuery(queryOptions) as UseQueryResult & { - queryKey: QueryKey; - }; - - return { ...query, queryKey: queryOptions.queryKey }; -} - -/** - * @summary List messages sent by a user - */ -export const getGetAdminUserDependentMessagesUrl = ( - id: number, - params?: GetAdminUserDependentMessagesParams, -) => { - const normalizedParams = new URLSearchParams(); - - Object.entries(params || {}).forEach(([key, value]) => { - if (value !== undefined) { - normalizedParams.append(key, value === null ? "null" : value.toString()); - } - }); - - const stringifiedParams = normalizedParams.toString(); - - return stringifiedParams.length > 0 - ? `/api/admin/users/${id}/dependents/messages?${stringifiedParams}` - : `/api/admin/users/${id}/dependents/messages`; -}; - -export const getAdminUserDependentMessages = async ( - id: number, - params?: GetAdminUserDependentMessagesParams, - options?: RequestInit, -): Promise => { - return customFetch( - getGetAdminUserDependentMessagesUrl(id, params), - { - ...options, - method: "GET", - }, - ); -}; - -export const getGetAdminUserDependentMessagesQueryKey = ( - id: number, - params?: GetAdminUserDependentMessagesParams, -) => { - return [ - `/api/admin/users/${id}/dependents/messages`, - ...(params ? [params] : []), - ] as const; -}; - -export const getGetAdminUserDependentMessagesQueryOptions = < - TData = Awaited>, - TError = ErrorType, ->( - id: number, - params?: GetAdminUserDependentMessagesParams, - options?: { - query?: UseQueryOptions< - Awaited>, - TError, - TData - >; - request?: SecondParameter; - }, -) => { - const { query: queryOptions, request: requestOptions } = options ?? {}; - - const queryKey = - queryOptions?.queryKey ?? - getGetAdminUserDependentMessagesQueryKey(id, params); - - const queryFn: QueryFunction< - Awaited> - > = ({ signal }) => - getAdminUserDependentMessages(id, params, { signal, ...requestOptions }); - - return { - queryKey, - queryFn, - enabled: !!id, - ...queryOptions, - } as UseQueryOptions< - Awaited>, - TError, - TData - > & { queryKey: QueryKey }; -}; - -export type GetAdminUserDependentMessagesQueryResult = NonNullable< - Awaited> ->; -export type GetAdminUserDependentMessagesQueryError = ErrorType; - -/** - * @summary List messages sent by a user - */ - -export function useGetAdminUserDependentMessages< - TData = Awaited>, - TError = ErrorType, ->( - id: number, - params?: GetAdminUserDependentMessagesParams, - options?: { - query?: UseQueryOptions< - Awaited>, - TError, - TData - >; - request?: SecondParameter; - }, -): UseQueryResult & { queryKey: QueryKey } { - const queryOptions = getGetAdminUserDependentMessagesQueryOptions( - id, - params, - options, - ); - - const query = useQuery(queryOptions) as UseQueryResult & { - queryKey: QueryKey; - }; - - return { ...query, queryKey: queryOptions.queryKey }; -} diff --git a/lib/api-spec/openapi.yaml b/lib/api-spec/openapi.yaml index f911437c..7773d186 100644 --- a/lib/api-spec/openapi.yaml +++ b/lib/api-spec/openapi.yaml @@ -18,10 +18,6 @@ tags: description: Internal services (khidmati) - name: orders description: Service orders workflow - - name: conversations - description: Chat conversations - - name: messages - description: Chat messages - name: notifications description: Notifications - name: users @@ -928,254 +924,6 @@ paths: items: $ref: "#/components/schemas/ServiceCategory" - # Conversations - /conversations: - get: - operationId: listConversations - tags: [conversations] - summary: List conversations for current user - responses: - "200": - description: Conversations - content: - application/json: - schema: - type: array - items: - $ref: "#/components/schemas/ConversationWithDetails" - - post: - operationId: createConversation - tags: [conversations] - summary: Create a conversation - requestBody: - required: true - content: - application/json: - schema: - $ref: "#/components/schemas/CreateConversationBody" - responses: - "201": - description: Created - content: - application/json: - schema: - $ref: "#/components/schemas/ConversationWithDetails" - - /conversations/{id}: - get: - operationId: getConversation - tags: [conversations] - summary: Get conversation by ID - parameters: - - name: id - in: path - required: true - schema: - type: integer - responses: - "200": - description: Conversation - content: - application/json: - schema: - $ref: "#/components/schemas/ConversationWithDetails" - - patch: - operationId: updateConversation - tags: [conversations] - summary: Update conversation properties (admin only) - parameters: - - name: id - in: path - required: true - schema: - type: integer - requestBody: - required: true - content: - application/json: - schema: - $ref: "#/components/schemas/UpdateConversationBody" - responses: - "200": - description: Updated conversation - content: - application/json: - schema: - $ref: "#/components/schemas/ConversationWithDetails" - - /conversations/{id}/participants: - post: - operationId: addConversationParticipants - tags: [conversations] - summary: Add participants to a group conversation (admin only) - parameters: - - name: id - in: path - required: true - schema: - type: integer - requestBody: - required: true - content: - application/json: - schema: - $ref: "#/components/schemas/AddParticipantsBody" - responses: - "200": - description: Updated conversation - content: - application/json: - schema: - $ref: "#/components/schemas/ConversationWithDetails" - - /conversations/{id}/participants/{userId}: - delete: - operationId: removeConversationParticipant - tags: [conversations] - summary: Remove a participant from a group conversation (admin only) - parameters: - - name: id - in: path - required: true - schema: - type: integer - - name: userId - in: path - required: true - schema: - type: integer - responses: - "200": - description: Updated conversation - content: - application/json: - schema: - $ref: "#/components/schemas/ConversationWithDetails" - - /conversations/{id}/state: - patch: - operationId: updateConversationState - tags: [conversations] - summary: Update per-user state (mute, archive) - parameters: - - name: id - in: path - required: true - schema: - type: integer - requestBody: - required: true - content: - application/json: - schema: - $ref: "#/components/schemas/UpdateConversationStateBody" - responses: - "200": - description: Updated conversation - content: - application/json: - schema: - $ref: "#/components/schemas/ConversationWithDetails" - - /conversations/{id}/leave: - post: - operationId: leaveConversation - tags: [conversations] - summary: Leave a group conversation - parameters: - - name: id - in: path - required: true - schema: - type: integer - requestBody: - required: false - content: - application/json: - schema: - type: object - properties: - successorId: - type: integer - description: | - When the leaver is the only admin, optionally name a specific - remaining member to promote. Omit (or send null) to keep the - automatic behavior of promoting the longest-tenured member. - nullable: true - responses: - "200": - description: Left conversation - content: - application/json: - schema: - $ref: "#/components/schemas/SuccessResponse" - - /conversations/{id}/messages: - get: - operationId: listMessages - tags: [messages] - summary: List messages in a conversation - parameters: - - name: id - in: path - required: true - schema: - type: integer - responses: - "200": - description: Messages - content: - application/json: - schema: - type: array - items: - $ref: "#/components/schemas/MessageWithSender" - - post: - operationId: sendMessage - tags: [messages] - summary: Send a message - parameters: - - name: id - in: path - required: true - schema: - type: integer - requestBody: - required: true - content: - application/json: - schema: - $ref: "#/components/schemas/SendMessageBody" - responses: - "201": - description: Message sent - content: - application/json: - schema: - $ref: "#/components/schemas/MessageWithSender" - - /conversations/{id}/read: - post: - operationId: markConversationRead - tags: [messages] - summary: Mark all messages in conversation as read - parameters: - - name: id - in: path - required: true - schema: - type: integer - responses: - "200": - description: Marked as read - content: - application/json: - schema: - $ref: "#/components/schemas/SuccessResponse" - # Notifications /notifications: get: @@ -3074,70 +2822,6 @@ paths: schema: $ref: "#/components/schemas/ErrorResponse" - /admin/users/{id}/dependents/conversations: - get: - operationId: getAdminUserDependentConversations - tags: [users] - summary: List conversations created by a user - parameters: - - in: path - name: id - required: true - schema: { type: integer } - - in: query - name: limit - required: false - schema: { type: integer, minimum: 1, maximum: 200, default: 50 } - - in: query - name: offset - required: false - schema: { type: integer, minimum: 0, default: 0 } - responses: - "200": - description: Paged list of conversations - content: - application/json: - schema: - $ref: "#/components/schemas/UserDependentConversationsPage" - "404": - description: User not found - content: - application/json: - schema: - $ref: "#/components/schemas/ErrorResponse" - - /admin/users/{id}/dependents/messages: - get: - operationId: getAdminUserDependentMessages - tags: [users] - summary: List messages sent by a user - parameters: - - in: path - name: id - required: true - schema: { type: integer } - - in: query - name: limit - required: false - schema: { type: integer, minimum: 1, maximum: 200, default: 50 } - - in: query - name: offset - required: false - schema: { type: integer, minimum: 0, default: 0 } - responses: - "200": - description: Paged list of messages - content: - application/json: - schema: - $ref: "#/components/schemas/UserDependentMessagesPage" - "404": - description: User not found - content: - application/json: - schema: - $ref: "#/components/schemas/ErrorResponse" - components: schemas: HealthStatus: @@ -3463,16 +3147,6 @@ components: description: | Number of service orders owned by this user. Populated only by the admin list endpoint (GET /users). - conversationCount: - type: integer - description: | - Number of conversations created by this user. Populated only by the - admin list endpoint (GET /users). - messageCount: - type: integer - description: | - Number of messages authored by this user. Populated only by the - admin list endpoint (GET /users). required: - id - username @@ -3817,16 +3491,10 @@ components: type: integer orderCount: type: integer - conversationCount: - type: integer - messageCount: - type: integer required: - error - noteCount - orderCount - - conversationCount - - messageCount AppDeletionConflict: type: object @@ -4304,161 +3972,6 @@ components: - deletedIds - failedIds - ConversationWithDetails: - type: object - properties: - id: - type: integer - nameAr: - type: ["string", "null"] - nameEn: - type: ["string", "null"] - avatarUrl: - type: ["string", "null"] - isGroup: - type: boolean - createdBy: - type: integer - participants: - type: array - items: - $ref: "#/components/schemas/ParticipantInfo" - lastMessage: - $ref: "#/components/schemas/MessageWithSender" - nullable: true - unreadCount: - type: integer - isMuted: - type: boolean - isArchived: - type: boolean - createdAt: - type: string - format: date-time - updatedAt: - type: string - format: date-time - required: - - id - - isGroup - - createdBy - - participants - - unreadCount - - isMuted - - isArchived - - createdAt - - updatedAt - - ParticipantInfo: - type: object - properties: - id: - type: integer - username: - type: string - displayNameAr: - type: ["string", "null"] - displayNameEn: - type: ["string", "null"] - avatarUrl: - type: ["string", "null"] - isAdmin: - type: boolean - required: - - id - - username - - isAdmin - - CreateConversationBody: - type: object - properties: - participantIds: - type: array - items: - type: integer - nameAr: - type: ["string", "null"] - nameEn: - type: ["string", "null"] - avatarUrl: - type: ["string", "null"] - isGroup: - type: boolean - required: - - participantIds - - UpdateConversationBody: - type: object - properties: - avatarUrl: - type: ["string", "null"] - nameAr: - type: ["string", "null"] - nameEn: - type: ["string", "null"] - - UpdateConversationStateBody: - type: object - properties: - isMuted: - type: boolean - isArchived: - type: boolean - - AddParticipantsBody: - type: object - properties: - userIds: - type: array - items: - type: integer - required: - - userIds - - MessageWithSender: - type: object - properties: - id: - type: integer - conversationId: - type: integer - senderId: - type: integer - content: - type: string - kind: - type: string - enum: [user, group_renamed, members_added, member_removed, member_left, admin_promoted] - meta: - type: object - nullable: true - additionalProperties: true - sender: - $ref: "#/components/schemas/ParticipantInfo" - createdAt: - type: string - format: date-time - updatedAt: - type: string - format: date-time - required: - - id - - conversationId - - senderId - - content - - kind - - sender - - createdAt - - updatedAt - - SendMessageBody: - type: object - properties: - content: - type: string - required: - - content - Notification: type: object properties: @@ -4579,15 +4092,12 @@ components: type: integer unreadNotifications: type: integer - unreadMessages: - type: integer totalUsers: type: integer required: - totalApps - totalServices - unreadNotifications - - unreadMessages - totalUsers AdminStats: @@ -5179,55 +4689,6 @@ components: nextOffset: { type: ["integer", "null"] } required: [items, totalCount, limit, offset, nextOffset] - UserDependentConversationItem: - type: object - properties: - id: { type: integer } - nameAr: { type: ["string", "null"] } - nameEn: { type: ["string", "null"] } - isGroup: { type: boolean } - createdAt: { type: string, format: date-time } - required: [id, nameAr, nameEn, isGroup, createdAt] - - UserDependentConversationsPage: - type: object - properties: - items: - type: array - items: - $ref: "#/components/schemas/UserDependentConversationItem" - totalCount: { type: integer } - limit: { type: integer } - offset: { type: integer } - nextOffset: { type: ["integer", "null"] } - required: [items, totalCount, limit, offset, nextOffset] - - UserDependentMessageItem: - type: object - properties: - id: { type: integer } - content: { type: string } - kind: { type: string } - createdAt: { type: string, format: date-time } - conversationId: { type: integer } - conversationNameAr: { type: ["string", "null"] } - conversationNameEn: { type: ["string", "null"] } - conversationIsGroup: { type: boolean } - required: [id, content, kind, createdAt, conversationId, conversationNameAr, conversationNameEn, conversationIsGroup] - - UserDependentMessagesPage: - type: object - properties: - items: - type: array - items: - $ref: "#/components/schemas/UserDependentMessageItem" - totalCount: { type: integer } - limit: { type: integer } - offset: { type: integer } - nextOffset: { type: ["integer", "null"] } - required: [items, totalCount, limit, offset, nextOffset] - TopUserItem: type: object properties: diff --git a/lib/api-zod/src/generated/api.ts b/lib/api-zod/src/generated/api.ts index fb55e7df..80878a3f 100644 --- a/lib/api-zod/src/generated/api.ts +++ b/lib/api-zod/src/generated/api.ts @@ -1332,456 +1332,6 @@ export const ListServiceCategoriesResponse = zod.array( ListServiceCategoriesResponseItem, ); -/** - * @summary List conversations for current user - */ -export const ListConversationsResponseItem = zod.object({ - id: zod.number(), - nameAr: zod.string().nullish(), - nameEn: zod.string().nullish(), - avatarUrl: zod.string().nullish(), - isGroup: zod.boolean(), - createdBy: zod.number(), - participants: zod.array( - zod.object({ - id: zod.number(), - username: zod.string(), - displayNameAr: zod.string().nullish(), - displayNameEn: zod.string().nullish(), - avatarUrl: zod.string().nullish(), - isAdmin: zod.boolean(), - }), - ), - lastMessage: zod - .object({ - id: zod.number(), - conversationId: zod.number(), - senderId: zod.number(), - content: zod.string(), - kind: zod.enum([ - "user", - "group_renamed", - "members_added", - "member_removed", - "member_left", - "admin_promoted", - ]), - meta: zod.record(zod.string(), zod.unknown()).nullish(), - sender: zod.object({ - id: zod.number(), - username: zod.string(), - displayNameAr: zod.string().nullish(), - displayNameEn: zod.string().nullish(), - avatarUrl: zod.string().nullish(), - isAdmin: zod.boolean(), - }), - createdAt: zod.coerce.date(), - updatedAt: zod.coerce.date(), - }) - .nullish(), - unreadCount: zod.number(), - isMuted: zod.boolean(), - isArchived: zod.boolean(), - createdAt: zod.coerce.date(), - updatedAt: zod.coerce.date(), -}); -export const ListConversationsResponse = zod.array( - ListConversationsResponseItem, -); - -/** - * @summary Create a conversation - */ -export const CreateConversationBody = zod.object({ - participantIds: zod.array(zod.number()), - nameAr: zod.string().nullish(), - nameEn: zod.string().nullish(), - avatarUrl: zod.string().nullish(), - isGroup: zod.boolean().optional(), -}); - -/** - * @summary Get conversation by ID - */ -export const GetConversationParams = zod.object({ - id: zod.coerce.number(), -}); - -export const GetConversationResponse = zod.object({ - id: zod.number(), - nameAr: zod.string().nullish(), - nameEn: zod.string().nullish(), - avatarUrl: zod.string().nullish(), - isGroup: zod.boolean(), - createdBy: zod.number(), - participants: zod.array( - zod.object({ - id: zod.number(), - username: zod.string(), - displayNameAr: zod.string().nullish(), - displayNameEn: zod.string().nullish(), - avatarUrl: zod.string().nullish(), - isAdmin: zod.boolean(), - }), - ), - lastMessage: zod - .object({ - id: zod.number(), - conversationId: zod.number(), - senderId: zod.number(), - content: zod.string(), - kind: zod.enum([ - "user", - "group_renamed", - "members_added", - "member_removed", - "member_left", - "admin_promoted", - ]), - meta: zod.record(zod.string(), zod.unknown()).nullish(), - sender: zod.object({ - id: zod.number(), - username: zod.string(), - displayNameAr: zod.string().nullish(), - displayNameEn: zod.string().nullish(), - avatarUrl: zod.string().nullish(), - isAdmin: zod.boolean(), - }), - createdAt: zod.coerce.date(), - updatedAt: zod.coerce.date(), - }) - .nullish(), - unreadCount: zod.number(), - isMuted: zod.boolean(), - isArchived: zod.boolean(), - createdAt: zod.coerce.date(), - updatedAt: zod.coerce.date(), -}); - -/** - * @summary Update conversation properties (admin only) - */ -export const UpdateConversationParams = zod.object({ - id: zod.coerce.number(), -}); - -export const UpdateConversationBody = zod.object({ - avatarUrl: zod.string().nullish(), - nameAr: zod.string().nullish(), - nameEn: zod.string().nullish(), -}); - -export const UpdateConversationResponse = zod.object({ - id: zod.number(), - nameAr: zod.string().nullish(), - nameEn: zod.string().nullish(), - avatarUrl: zod.string().nullish(), - isGroup: zod.boolean(), - createdBy: zod.number(), - participants: zod.array( - zod.object({ - id: zod.number(), - username: zod.string(), - displayNameAr: zod.string().nullish(), - displayNameEn: zod.string().nullish(), - avatarUrl: zod.string().nullish(), - isAdmin: zod.boolean(), - }), - ), - lastMessage: zod - .object({ - id: zod.number(), - conversationId: zod.number(), - senderId: zod.number(), - content: zod.string(), - kind: zod.enum([ - "user", - "group_renamed", - "members_added", - "member_removed", - "member_left", - "admin_promoted", - ]), - meta: zod.record(zod.string(), zod.unknown()).nullish(), - sender: zod.object({ - id: zod.number(), - username: zod.string(), - displayNameAr: zod.string().nullish(), - displayNameEn: zod.string().nullish(), - avatarUrl: zod.string().nullish(), - isAdmin: zod.boolean(), - }), - createdAt: zod.coerce.date(), - updatedAt: zod.coerce.date(), - }) - .nullish(), - unreadCount: zod.number(), - isMuted: zod.boolean(), - isArchived: zod.boolean(), - createdAt: zod.coerce.date(), - updatedAt: zod.coerce.date(), -}); - -/** - * @summary Add participants to a group conversation (admin only) - */ -export const AddConversationParticipantsParams = zod.object({ - id: zod.coerce.number(), -}); - -export const AddConversationParticipantsBody = zod.object({ - userIds: zod.array(zod.number()), -}); - -export const AddConversationParticipantsResponse = zod.object({ - id: zod.number(), - nameAr: zod.string().nullish(), - nameEn: zod.string().nullish(), - avatarUrl: zod.string().nullish(), - isGroup: zod.boolean(), - createdBy: zod.number(), - participants: zod.array( - zod.object({ - id: zod.number(), - username: zod.string(), - displayNameAr: zod.string().nullish(), - displayNameEn: zod.string().nullish(), - avatarUrl: zod.string().nullish(), - isAdmin: zod.boolean(), - }), - ), - lastMessage: zod - .object({ - id: zod.number(), - conversationId: zod.number(), - senderId: zod.number(), - content: zod.string(), - kind: zod.enum([ - "user", - "group_renamed", - "members_added", - "member_removed", - "member_left", - "admin_promoted", - ]), - meta: zod.record(zod.string(), zod.unknown()).nullish(), - sender: zod.object({ - id: zod.number(), - username: zod.string(), - displayNameAr: zod.string().nullish(), - displayNameEn: zod.string().nullish(), - avatarUrl: zod.string().nullish(), - isAdmin: zod.boolean(), - }), - createdAt: zod.coerce.date(), - updatedAt: zod.coerce.date(), - }) - .nullish(), - unreadCount: zod.number(), - isMuted: zod.boolean(), - isArchived: zod.boolean(), - createdAt: zod.coerce.date(), - updatedAt: zod.coerce.date(), -}); - -/** - * @summary Remove a participant from a group conversation (admin only) - */ -export const RemoveConversationParticipantParams = zod.object({ - id: zod.coerce.number(), - userId: zod.coerce.number(), -}); - -export const RemoveConversationParticipantResponse = zod.object({ - id: zod.number(), - nameAr: zod.string().nullish(), - nameEn: zod.string().nullish(), - avatarUrl: zod.string().nullish(), - isGroup: zod.boolean(), - createdBy: zod.number(), - participants: zod.array( - zod.object({ - id: zod.number(), - username: zod.string(), - displayNameAr: zod.string().nullish(), - displayNameEn: zod.string().nullish(), - avatarUrl: zod.string().nullish(), - isAdmin: zod.boolean(), - }), - ), - lastMessage: zod - .object({ - id: zod.number(), - conversationId: zod.number(), - senderId: zod.number(), - content: zod.string(), - kind: zod.enum([ - "user", - "group_renamed", - "members_added", - "member_removed", - "member_left", - "admin_promoted", - ]), - meta: zod.record(zod.string(), zod.unknown()).nullish(), - sender: zod.object({ - id: zod.number(), - username: zod.string(), - displayNameAr: zod.string().nullish(), - displayNameEn: zod.string().nullish(), - avatarUrl: zod.string().nullish(), - isAdmin: zod.boolean(), - }), - createdAt: zod.coerce.date(), - updatedAt: zod.coerce.date(), - }) - .nullish(), - unreadCount: zod.number(), - isMuted: zod.boolean(), - isArchived: zod.boolean(), - createdAt: zod.coerce.date(), - updatedAt: zod.coerce.date(), -}); - -/** - * @summary Update per-user state (mute, archive) - */ -export const UpdateConversationStateParams = zod.object({ - id: zod.coerce.number(), -}); - -export const UpdateConversationStateBody = zod.object({ - isMuted: zod.boolean().optional(), - isArchived: zod.boolean().optional(), -}); - -export const UpdateConversationStateResponse = zod.object({ - id: zod.number(), - nameAr: zod.string().nullish(), - nameEn: zod.string().nullish(), - avatarUrl: zod.string().nullish(), - isGroup: zod.boolean(), - createdBy: zod.number(), - participants: zod.array( - zod.object({ - id: zod.number(), - username: zod.string(), - displayNameAr: zod.string().nullish(), - displayNameEn: zod.string().nullish(), - avatarUrl: zod.string().nullish(), - isAdmin: zod.boolean(), - }), - ), - lastMessage: zod - .object({ - id: zod.number(), - conversationId: zod.number(), - senderId: zod.number(), - content: zod.string(), - kind: zod.enum([ - "user", - "group_renamed", - "members_added", - "member_removed", - "member_left", - "admin_promoted", - ]), - meta: zod.record(zod.string(), zod.unknown()).nullish(), - sender: zod.object({ - id: zod.number(), - username: zod.string(), - displayNameAr: zod.string().nullish(), - displayNameEn: zod.string().nullish(), - avatarUrl: zod.string().nullish(), - isAdmin: zod.boolean(), - }), - createdAt: zod.coerce.date(), - updatedAt: zod.coerce.date(), - }) - .nullish(), - unreadCount: zod.number(), - isMuted: zod.boolean(), - isArchived: zod.boolean(), - createdAt: zod.coerce.date(), - updatedAt: zod.coerce.date(), -}); - -/** - * @summary Leave a group conversation - */ -export const LeaveConversationParams = zod.object({ - id: zod.coerce.number(), -}); - -export const LeaveConversationBody = zod.object({ - successorId: zod - .number() - .nullish() - .describe( - "When the leaver is the only admin, optionally name a specific\nremaining member to promote. Omit (or send null) to keep the\nautomatic behavior of promoting the longest-tenured member.\n", - ), -}); - -export const LeaveConversationResponse = zod.object({ - success: zod.boolean(), -}); - -/** - * @summary List messages in a conversation - */ -export const ListMessagesParams = zod.object({ - id: zod.coerce.number(), -}); - -export const ListMessagesResponseItem = zod.object({ - id: zod.number(), - conversationId: zod.number(), - senderId: zod.number(), - content: zod.string(), - kind: zod.enum([ - "user", - "group_renamed", - "members_added", - "member_removed", - "member_left", - "admin_promoted", - ]), - meta: zod.record(zod.string(), zod.unknown()).nullish(), - sender: zod.object({ - id: zod.number(), - username: zod.string(), - displayNameAr: zod.string().nullish(), - displayNameEn: zod.string().nullish(), - avatarUrl: zod.string().nullish(), - isAdmin: zod.boolean(), - }), - createdAt: zod.coerce.date(), - updatedAt: zod.coerce.date(), -}); -export const ListMessagesResponse = zod.array(ListMessagesResponseItem); - -/** - * @summary Send a message - */ -export const SendMessageParams = zod.object({ - id: zod.coerce.number(), -}); - -export const SendMessageBody = zod.object({ - content: zod.string(), -}); - -/** - * @summary Mark all messages in conversation as read - */ -export const MarkConversationReadParams = zod.object({ - id: zod.coerce.number(), -}); - -export const MarkConversationReadResponse = zod.object({ - success: zod.boolean(), -}); - /** * @summary List notifications for current user */ @@ -1888,18 +1438,6 @@ export const ListUsersResponseItem = zod.object({ .describe( "Number of service orders owned by this user. Populated only by the\nadmin list endpoint (GET \/users).\n", ), - conversationCount: zod - .number() - .optional() - .describe( - "Number of conversations created by this user. Populated only by the\nadmin list endpoint (GET \/users).\n", - ), - messageCount: zod - .number() - .optional() - .describe( - "Number of messages authored by this user. Populated only by the\nadmin list endpoint (GET \/users).\n", - ), }); export const ListUsersResponse = zod.array(ListUsersResponseItem); @@ -1972,18 +1510,6 @@ export const GetUserResponse = zod.object({ .describe( "Number of service orders owned by this user. Populated only by the\nadmin list endpoint (GET \/users).\n", ), - conversationCount: zod - .number() - .optional() - .describe( - "Number of conversations created by this user. Populated only by the\nadmin list endpoint (GET \/users).\n", - ), - messageCount: zod - .number() - .optional() - .describe( - "Number of messages authored by this user. Populated only by the\nadmin list endpoint (GET \/users).\n", - ), }); /** @@ -2044,18 +1570,6 @@ export const UpdateUserResponse = zod.object({ .describe( "Number of service orders owned by this user. Populated only by the\nadmin list endpoint (GET \/users).\n", ), - conversationCount: zod - .number() - .optional() - .describe( - "Number of conversations created by this user. Populated only by the\nadmin list endpoint (GET \/users).\n", - ), - messageCount: zod - .number() - .optional() - .describe( - "Number of messages authored by this user. Populated only by the\nadmin list endpoint (GET \/users).\n", - ), }); /** @@ -2169,18 +1683,6 @@ export const AddUserRoleResponse = zod.object({ .describe( "Number of service orders owned by this user. Populated only by the\nadmin list endpoint (GET \/users).\n", ), - conversationCount: zod - .number() - .optional() - .describe( - "Number of conversations created by this user. Populated only by the\nadmin list endpoint (GET \/users).\n", - ), - messageCount: zod - .number() - .optional() - .describe( - "Number of messages authored by this user. Populated only by the\nadmin list endpoint (GET \/users).\n", - ), }); /** @@ -2231,18 +1733,6 @@ export const RemoveUserRoleResponse = zod.object({ .describe( "Number of service orders owned by this user. Populated only by the\nadmin list endpoint (GET \/users).\n", ), - conversationCount: zod - .number() - .optional() - .describe( - "Number of conversations created by this user. Populated only by the\nadmin list endpoint (GET \/users).\n", - ), - messageCount: zod - .number() - .optional() - .describe( - "Number of messages authored by this user. Populated only by the\nadmin list endpoint (GET \/users).\n", - ), }); /** @@ -2878,7 +2368,6 @@ export const GetHomeStatsResponse = zod.object({ totalApps: zod.number(), totalServices: zod.number(), unreadNotifications: zod.number(), - unreadMessages: zod.number(), totalUsers: zod.number(), }); @@ -3830,88 +3319,3 @@ export const GetAdminUserDependentOrdersResponse = zod.object({ offset: zod.number(), nextOffset: zod.number().nullable(), }); - -/** - * @summary List conversations created by a user - */ -export const GetAdminUserDependentConversationsParams = zod.object({ - id: zod.coerce.number(), -}); - -export const getAdminUserDependentConversationsQueryLimitDefault = 50; -export const getAdminUserDependentConversationsQueryLimitMax = 200; - -export const getAdminUserDependentConversationsQueryOffsetDefault = 0; -export const getAdminUserDependentConversationsQueryOffsetMin = 0; - -export const GetAdminUserDependentConversationsQueryParams = zod.object({ - limit: zod.coerce - .number() - .min(1) - .max(getAdminUserDependentConversationsQueryLimitMax) - .default(getAdminUserDependentConversationsQueryLimitDefault), - offset: zod.coerce - .number() - .min(getAdminUserDependentConversationsQueryOffsetMin) - .default(getAdminUserDependentConversationsQueryOffsetDefault), -}); - -export const GetAdminUserDependentConversationsResponse = zod.object({ - items: zod.array( - zod.object({ - id: zod.number(), - nameAr: zod.string().nullable(), - nameEn: zod.string().nullable(), - isGroup: zod.boolean(), - createdAt: zod.coerce.date(), - }), - ), - totalCount: zod.number(), - limit: zod.number(), - offset: zod.number(), - nextOffset: zod.number().nullable(), -}); - -/** - * @summary List messages sent by a user - */ -export const GetAdminUserDependentMessagesParams = zod.object({ - id: zod.coerce.number(), -}); - -export const getAdminUserDependentMessagesQueryLimitDefault = 50; -export const getAdminUserDependentMessagesQueryLimitMax = 200; - -export const getAdminUserDependentMessagesQueryOffsetDefault = 0; -export const getAdminUserDependentMessagesQueryOffsetMin = 0; - -export const GetAdminUserDependentMessagesQueryParams = zod.object({ - limit: zod.coerce - .number() - .min(1) - .max(getAdminUserDependentMessagesQueryLimitMax) - .default(getAdminUserDependentMessagesQueryLimitDefault), - offset: zod.coerce - .number() - .min(getAdminUserDependentMessagesQueryOffsetMin) - .default(getAdminUserDependentMessagesQueryOffsetDefault), -}); - -export const GetAdminUserDependentMessagesResponse = zod.object({ - items: zod.array( - zod.object({ - id: zod.number(), - content: zod.string(), - kind: zod.string(), - createdAt: zod.coerce.date(), - conversationId: zod.number(), - conversationNameAr: zod.string().nullable(), - conversationNameEn: zod.string().nullable(), - conversationIsGroup: zod.boolean(), - }), - ), - totalCount: zod.number(), - limit: zod.number(), - offset: zod.number(), - nextOffset: zod.number().nullable(), -}); diff --git a/lib/db/src/schema/conversations.ts b/lib/db/src/schema/conversations.ts deleted file mode 100644 index 46db5ef6..00000000 --- a/lib/db/src/schema/conversations.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { pgTable, text, serial, timestamp, integer, varchar, boolean, primaryKey, jsonb } from "drizzle-orm/pg-core"; -import { createInsertSchema } from "drizzle-zod"; -import { z } from "zod/v4"; -import { usersTable } from "./users"; - -export const conversationsTable = pgTable("conversations", { - id: serial("id").primaryKey(), - nameAr: varchar("name_ar", { length: 300 }), - nameEn: varchar("name_en", { length: 300 }), - avatarUrl: text("avatar_url"), - isGroup: boolean("is_group").notNull().default(false), - createdBy: integer("created_by").notNull().references(() => usersTable.id), - createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(), - updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow().$onUpdate(() => new Date()), -}); - -export const conversationParticipantsTable = pgTable("conversation_participants", { - conversationId: integer("conversation_id").notNull().references(() => conversationsTable.id, { onDelete: "cascade" }), - userId: integer("user_id").notNull().references(() => usersTable.id, { onDelete: "cascade" }), - joinedAt: timestamp("joined_at", { withTimezone: true }).notNull().defaultNow(), - isAdmin: boolean("is_admin").notNull().default(false), - isMuted: boolean("is_muted").notNull().default(false), - isArchived: boolean("is_archived").notNull().default(false), -}, (t) => [primaryKey({ columns: [t.conversationId, t.userId] })]); - -export const messagesTable = pgTable("messages", { - id: serial("id").primaryKey(), - conversationId: integer("conversation_id").notNull().references(() => conversationsTable.id, { onDelete: "cascade" }), - senderId: integer("sender_id").notNull().references(() => usersTable.id), - content: text("content").notNull(), - kind: varchar("kind", { length: 32 }).notNull().default("user"), - meta: jsonb("meta"), - createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(), - updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow().$onUpdate(() => new Date()), -}); - -export const messageReadsTable = pgTable("message_reads", { - messageId: integer("message_id").notNull().references(() => messagesTable.id, { onDelete: "cascade" }), - userId: integer("user_id").notNull().references(() => usersTable.id, { onDelete: "cascade" }), - readAt: timestamp("read_at", { withTimezone: true }).notNull().defaultNow(), -}, (t) => [primaryKey({ columns: [t.messageId, t.userId] })]); - -export const insertMessageSchema = createInsertSchema(messagesTable).omit({ id: true, createdAt: true, updatedAt: true }); -export const insertConversationSchema = createInsertSchema(conversationsTable).omit({ id: true, createdAt: true, updatedAt: true }); -export type InsertMessage = z.infer; -export type Message = typeof messagesTable.$inferSelect; -export type Conversation = typeof conversationsTable.$inferSelect; diff --git a/lib/db/src/schema/index.ts b/lib/db/src/schema/index.ts index 5a6e1566..2381f68d 100644 --- a/lib/db/src/schema/index.ts +++ b/lib/db/src/schema/index.ts @@ -3,7 +3,6 @@ export * from "./roles"; export * from "./apps"; export * from "./services"; export * from "./service-orders"; -export * from "./conversations"; export * from "./notifications"; export * from "./settings"; export * from "./user-app-orders"; diff --git a/scripts/src/seed.ts b/scripts/src/seed.ts index 9a8595a1..f037bab2 100644 --- a/scripts/src/seed.ts +++ b/scripts/src/seed.ts @@ -43,7 +43,6 @@ async function main() { { name: "apps:manage", descriptionAr: "إدارة التطبيقات", descriptionEn: "Manage Apps" }, { name: "services:manage", descriptionAr: "إدارة الخدمات", descriptionEn: "Manage Services" }, { name: "users:manage", descriptionAr: "إدارة المستخدمين", descriptionEn: "Manage Users" }, - { name: "chat:access", descriptionAr: "الوصول للمحادثات", descriptionEn: "Access Chat" }, { name: "orders.receive", descriptionAr: "استلام الطلبات", descriptionEn: "Receive service orders" }, ]; @@ -78,17 +77,6 @@ async function main() { .onConflictDoNothing(); } - // Assign chat permission to user role - if (userRoleResolved && allInsertedPerms.length > 0) { - const chatPerm = allInsertedPerms.find((p) => p.name === "chat:access"); - if (chatPerm) { - await db - .insert(rolePermissionsTable) - .values({ roleId: userRoleResolved.id, permissionId: chatPerm.id }) - .onConflictDoNothing(); - } - } - // Assign orders:receive permission to order_receiver role if (orderReceiverResolved && allInsertedPerms.length > 0) { const ordersPerm = allInsertedPerms.find((p) => p.name === "orders.receive"); @@ -170,19 +158,6 @@ async function main() { isSystem: true, sortOrder: 1, }, - { - slug: "chat", - nameAr: "المحادثات", - nameEn: "Chat", - descriptionAr: "تواصل مع زملائك", - descriptionEn: "Connect with your colleagues", - iconName: "MessageCircle", - route: "/chat", - color: "#22c55e", - isActive: true, - isSystem: true, - sortOrder: 2, - }, { slug: "notifications", nameAr: "الإشعارات",