
- Complete NestJS TypeScript implementation with WebSocket support - Direct messaging (DM) and group chat functionality - End-to-end encryption with AES encryption and key pairs - Media file support (images, videos, audio, documents) up to 100MB - Push notifications with Firebase Cloud Messaging integration - Mention alerts and real-time typing indicators - User authentication with JWT and Passport - SQLite database with TypeORM entities and relationships - Comprehensive API documentation with Swagger/OpenAPI - File upload handling with secure access control - Online/offline status tracking and presence management - Message editing, deletion, and reply functionality - Notification management with automatic cleanup - Health check endpoint for monitoring - CORS configuration for cross-origin requests - Environment-based configuration management - Structured for Flutter SDK integration Features implemented: ✅ Real-time messaging with Socket.IO ✅ User registration and authentication ✅ Direct messages and group chats ✅ Media file uploads and management ✅ End-to-end encryption ✅ Push notifications ✅ Mention alerts ✅ Typing indicators ✅ Message read receipts ✅ Online status tracking ✅ File access control ✅ Comprehensive API documentation Ready for Flutter SDK development and production deployment.
132 lines
3.6 KiB
Cheetah
132 lines
3.6 KiB
Cheetah
<?js
|
|
var data = obj;
|
|
var self = this;
|
|
?>
|
|
<?js if (data.kind !== 'module' && !data.hideconstructor) { ?>
|
|
<?js if (data.kind === 'class' && data.classdesc) { ?>
|
|
<h2>Constructor</h2>
|
|
<?js } ?>
|
|
|
|
<?js if (data.kind !== 'namespace') { ?>
|
|
<h4 class="name" id="<?js= id ?>"><?js= data.attribs + (kind === 'class' ? 'new ' : '') +
|
|
name + (data.signature || '') ?></h4>
|
|
<?js } ?>
|
|
|
|
<?js if (data.summary) { ?>
|
|
<p class="summary"><?js= summary ?></p>
|
|
<?js } ?>
|
|
<?js } ?>
|
|
|
|
<?js if (data.kind !== 'module' && data.description && !data.hideconstructor) { ?>
|
|
<div class="description">
|
|
<?js= data.description ?>
|
|
</div>
|
|
<?js } ?>
|
|
|
|
<?js if (data.augments && data.alias && data.alias.indexOf('module:') === 0) { ?>
|
|
<h5>Extends:</h5>
|
|
<?js= self.partial('augments.tmpl', data) ?>
|
|
<?js } ?>
|
|
|
|
<?js if (kind === 'event' && data.type && data.type.names) {?>
|
|
<h5>Type:</h5>
|
|
<ul>
|
|
<li>
|
|
<?js= self.partial('type.tmpl', data.type.names) ?>
|
|
</li>
|
|
</ul>
|
|
<?js } ?>
|
|
|
|
<?js if (data['this']) { ?>
|
|
<h5>This:</h5>
|
|
<ul><li><?js= this.linkto(data['this'], data['this']) ?></li></ul>
|
|
<?js } ?>
|
|
|
|
<?js if (data.params && params.length && !data.hideconstructor) { ?>
|
|
<h5>Parameters:</h5>
|
|
<?js= this.partial('params.tmpl', params) ?>
|
|
<?js } ?>
|
|
|
|
<?js= this.partial('details.tmpl', data) ?>
|
|
|
|
<?js if (data.kind !== 'module' && data.requires && data.requires.length) { ?>
|
|
<h5>Requires:</h5>
|
|
<ul><?js data.requires.forEach(function(r) { ?>
|
|
<li><?js= self.linkto(r) ?></li>
|
|
<?js }); ?></ul>
|
|
<?js } ?>
|
|
|
|
<?js if (data.fires && fires.length) { ?>
|
|
<h5>Fires:</h5>
|
|
<ul><?js fires.forEach(function(f) { ?>
|
|
<li><?js= self.linkto(f) ?></li>
|
|
<?js }); ?></ul>
|
|
<?js } ?>
|
|
|
|
<?js if (data.listens && listens.length) { ?>
|
|
<h5>Listens to Events:</h5>
|
|
<ul><?js listens.forEach(function(f) { ?>
|
|
<li><?js= self.linkto(f) ?></li>
|
|
<?js }); ?></ul>
|
|
<?js } ?>
|
|
|
|
<?js if (data.listeners && listeners.length) { ?>
|
|
<h5>Listeners of This Event:</h5>
|
|
<ul><?js listeners.forEach(function(f) { ?>
|
|
<li><?js= self.linkto(f) ?></li>
|
|
<?js }); ?></ul>
|
|
<?js } ?>
|
|
|
|
<?js if (data.modifies && modifies.length) {?>
|
|
<h5>Modifies:</h5>
|
|
<?js if (modifies.length > 1) { ?><ul><?js
|
|
modifies.forEach(function(m) { ?>
|
|
<li><?js= self.partial('modifies.tmpl', m) ?></li>
|
|
<?js });
|
|
?></ul><?js } else {
|
|
modifies.forEach(function(m) { ?>
|
|
<?js= self.partial('modifies.tmpl', m) ?>
|
|
<?js });
|
|
} } ?>
|
|
|
|
<?js if (data.exceptions && exceptions.length) { ?>
|
|
<h5>Throws:</h5>
|
|
<?js if (exceptions.length > 1) { ?><ul><?js
|
|
exceptions.forEach(function(r) { ?>
|
|
<li><?js= self.partial('exceptions.tmpl', r) ?></li>
|
|
<?js });
|
|
?></ul><?js } else {
|
|
exceptions.forEach(function(r) { ?>
|
|
<?js= self.partial('exceptions.tmpl', r) ?>
|
|
<?js });
|
|
} } ?>
|
|
|
|
<?js if (data.returns && returns.length) { ?>
|
|
<h5>Returns:</h5>
|
|
<?js if (returns.length > 1) { ?><ul><?js
|
|
returns.forEach(function(r) { ?>
|
|
<li><?js= self.partial('returns.tmpl', r) ?></li>
|
|
<?js });
|
|
?></ul><?js } else {
|
|
returns.forEach(function(r) { ?>
|
|
<?js= self.partial('returns.tmpl', r) ?>
|
|
<?js });
|
|
} } ?>
|
|
|
|
<?js if (data.yields && yields.length) { ?>
|
|
<h5>Yields:</h5>
|
|
<?js if (yields.length > 1) { ?><ul><?js
|
|
yields.forEach(function(r) { ?>
|
|
<li><?js= self.partial('returns.tmpl', r) ?></li>
|
|
<?js });
|
|
?></ul><?js } else {
|
|
yields.forEach(function(r) { ?>
|
|
<?js= self.partial('returns.tmpl', r) ?>
|
|
<?js });
|
|
} } ?>
|
|
|
|
<?js if (data.examples && examples.length) { ?>
|
|
<h5>Example<?js= examples.length > 1? 's':'' ?></h5>
|
|
<?js= this.partial('examples.tmpl', examples) ?>
|
|
<?js } ?>
|