import '@pnp/sp/items'; import '@pnp/sp/comments'; import type { ICommentInfo, IComments } from '@pnp/sp/comments'; import { resolveDataList } from '../dataList'; import { RequestTypeId } from '../../models/types'; import { IChatMessage } from './models/IChatMessage'; import { toChatMessages } from './chatMessages'; /** * Чат по заявке ПОВЕРХ штатных комментариев к строке списка. * * Почему комментарии, а не своя колонка/список переписки: комментарии к * элементу — готовый механизм SharePoint. Он сам хранит автора и время, сам * раздаёт права (кто видит заявку — видит переписку), не требует ни новой * колонки в девяти списках, ни провижининга, и переписка не мешает * согласованию (комментарий решения — отдельное поле строки маршрута). * * Заявка живёт в КОНКРЕТНОЙ партиции (списки нумерованные, см. * shared/approval/listPartitions.ts), поэтому список резолвим общим * resolveDataList(formKey, listId) — тем же, которым формы пишут саму заявку. * Иначе переписка архивной заявки читалась бы из текущей партиции, где под * тем же Id лежит другая заявка. */ /** Комментарии элемента списка данных заявки. */ function commentsOf(formKey: RequestTypeId, itemId: number, listId?: string): IComments { return resolveDataList(formKey, listId).items.getById(itemId).comments; } /** * Прочитать переписку по заявке. * * currentUserEmail нужен, чтобы отметить свои сообщения. Передаём РЕАЛЬНОГО * пользователя (context.pageContext.user.email), а не подменённого: комментарий * SharePoint пишет под настоящей учёткой, отладочная подмена личности * (shared/impersonation.ts) на автора не влияет. * * SharePoint отдаёт комментарии страницей. Дочитывания страниц здесь нет: * переписка по одной заявке — это единицы сообщений, и усложнять сервис под * гипотетический случай смысла нет. Если объём вырастет, дочитывание добавится * здесь, интерфейс менять не придётся. */ export async function getChatMessages( formKey: RequestTypeId, itemId: number, listId: string | undefined, currentUserEmail: string ): Promise { const comments: ICommentInfo[] = await commentsOf(formKey, itemId, listId)(); return toChatMessages(comments, currentUserEmail); } /** * Отправить сообщение — добавить комментарий к строке заявки. Автора и время * ставит сам SharePoint, поэтому передаём только текст. */ export async function addChatMessage( formKey: RequestTypeId, itemId: number, listId: string | undefined, text: string ): Promise { await commentsOf(formKey, itemId, listId).add(text); }