
# Service Library - `messagingCenter`

This document provides a complete reference of the custom code library for the `messagingCenter` service. It includes all library functions, edge functions with their REST endpoints, templates, and assets.


## Library Functions

Library functions are reusable modules available to all business APIs and other custom code within the service via `require("lib/<moduleName>")`.


### `validateParticipantsCount.js`

```js
module.exports = function validateParticipantsCount(participantIds,isGroup) {
  if (!Array.isArray(participantIds)) return false;
  const uniqueCount = new Set(participantIds).size;
  if (isGroup) {
    return uniqueCount >= 2;
  } else {
    return uniqueCount === 2;
  }
};
```


### `isThreadAccessibleByUser.js`

```js
module.exports = function isThreadAccessibleByUser(threadOrThreadCtx,session) {
  if(!threadOrThreadCtx||!session||!session.userId) return false;
  if(['superAdmin','admin'].includes(session.roleId)) return true;
  if(Array.isArray(threadOrThreadCtx.participantIds))
    return threadOrThreadCtx.participantIds.includes(session.userId);
  return false;
};
```


### `canUpdateThread.js`

```js
module.exports = function canUpdateThread(apiContext,session,thread) {
  if(!session||!thread) return false;
  if(['superAdmin','admin'].includes(session.roleId)) return true;
  if(thread.createdBy===session.userId) return true;
  if(Array.isArray(thread.participantIds)&&thread.participantIds.includes(session.userId)){
    // Only allow subject/threadStatus update for participants
    return true;
  }
  return false;
};
```


### `isMessageSendAllowed.js`

```js
module.exports = function isMessageSendAllowed(userId,thread) {
  if(!thread||!userId) return false;
  if(Array.isArray(thread.participantIds)){
    return thread.participantIds.includes(userId);
  }
  return false;
};
```


### `canUpdateMessage.js`

```js
module.exports = function canUpdateMessage(session,msgInstance,updateInput) {
  if(!session||!msgInstance) return false;
  const isAdmin = ['superAdmin','admin'].includes(session.roleId);
  const upFields = Object.keys(updateInput||{});
  // Only admin can update moderationStatus, flaggedReason, adminAction
  if(
    upFields.some(f=>['moderationStatus','flaggedReason','adminAction'].includes(f))
    && !isAdmin
  )return false;
  // Only sender can update content if not flagged/removed
  if(upFields.includes('content')) {
    if(msgInstance.senderId===session.userId && ['normal'].includes(msgInstance.moderationStatus)){
      return true;
    }
    return false;
  }
  return isAdmin; // allow if admin
};
```


### `canDeleteMessage.js`

```js
module.exports = function canDeleteMessage(session,msgInstance) {
  if(!session||!msgInstance) return false;
  if(['superAdmin','admin'].includes(session.roleId)) return true;
  if(msgInstance.senderId===session.userId && ['normal'].includes(msgInstance.moderationStatus)){
    return true;
  }
  return false;
};
```














---

*This document was generated from the service library configuration and should be kept in sync with design changes.*
