hexabot/api/src/chat/services/message.service.ts
2024-10-12 12:44:32 +01:00

120 lines
3.9 KiB
TypeScript

/*
* Copyright © 2024 Hexastack. All rights reserved.
*
* Licensed under the GNU Affero General Public License v3.0 (AGPLv3) with the following additional terms:
* 1. The name "Hexabot" is a trademark of Hexastack. You may not use this name in derivative works without express written permission.
* 2. All derivative works must include clear attribution to the original creator and software, Hexastack and Hexabot, in a prominent location (e.g., in the software's "About" section, documentation, and README file).
*/
import {
Injectable,
InternalServerErrorException,
Optional,
} from '@nestjs/common';
import { LoggerService } from '@/logger/logger.service';
import { BaseService } from '@/utils/generics/base-service';
import {
SocketGet,
SocketPost,
} from '@/websocket/decorators/socket-method.decorator';
import { SocketReq } from '@/websocket/decorators/socket-req.decorator';
import { SocketRes } from '@/websocket/decorators/socket-res.decorator';
import { Room } from '@/websocket/types';
import { SocketRequest } from '@/websocket/utils/socket-request';
import { SocketResponse } from '@/websocket/utils/socket-response';
import { WebsocketGateway } from '@/websocket/websocket.gateway';
import { MessageRepository } from '../repositories/message.repository';
import { MessageFull, MessagePopulate } from '../schemas/message.schema';
import { Subscriber } from '../schemas/subscriber.schema';
import { AnyMessage } from '../schemas/types/message';
@Injectable()
export class MessageService extends BaseService<
AnyMessage,
MessagePopulate,
MessageFull
> {
private readonly logger: LoggerService;
private readonly gateway: WebsocketGateway;
constructor(
private readonly messageRepository: MessageRepository,
@Optional() logger?: LoggerService,
@Optional() gateway?: WebsocketGateway,
) {
super(messageRepository);
this.logger = logger;
this.gateway = gateway;
}
/**
* Subscribes the socket to the message room
*
* @param req - The socket request object
* @param res - The socket response object
*/
@SocketGet('/message/subscribe/')
@SocketPost('/message/subscribe/')
subscribe(@SocketReq() req: SocketRequest, @SocketRes() res: SocketResponse) {
try {
this.gateway.io.socketsJoin(Room.MESSAGE);
return res.status(200).json({
success: true,
});
} catch (e) {
this.logger.error(
'MessageController subscribe : Websocket subscription',
e,
);
throw new InternalServerErrorException(e);
}
}
/**
* Retrieves the message history for a given subscriber up until a specific
* date, with an optional limit on the number of messages to return.
*
* @param subscriber - The subscriber whose message history is being retrieved.
* @param until - The date until which to retrieve messages (defaults to the current date).
* @param limit - The maximum number of messages to return (defaults to 30).
*
* @returns The message history until the specified date.
*/
async findHistoryUntilDate(
subscriber: Subscriber,
until = new Date(),
limit: number = 30,
) {
return await this.messageRepository.findHistoryUntilDate(
subscriber,
until,
limit,
);
}
/**
* Retrieves the message history for a given subscriber since a specific
* date, with an optional limit on the number of messages to return.
*
* @param subscriber - The subscriber whose message history is being retrieved.
* @param since - The date since which to retrieve messages (defaults to the current date).
* @param limit - The maximum number of messages to return (defaults to 30).
*
* @returns The message history since the specified date.
*/
async findHistorySinceDate(
subscriber: Subscriber,
since = new Date(),
limit: number = 30,
) {
return await this.messageRepository.findHistorySinceDate(
subscriber,
since,
limit,
);
}
}