Task #511: Fully remove Chat feature
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.
This commit is contained in:
@@ -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(),
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user