File

src/chatbot/chat.service.ts

Index

Methods

Constructor

constructor(prismaService: PrismaService, messageService: MessageService)
Parameters :
Name Type Optional
prismaService PrismaService No
messageService MessageService No

Methods

Async create
create(userMessage: UserMessage, userId: string)
Parameters :
Name Type Optional
userMessage UserMessage No
userId string No
Returns : unknown
Async findForUser
findForUser(userId: string, queryOptions: literal type)
Parameters :
Name Type Optional
userId string No
queryOptions literal type No
Returns : unknown
Async findMessagesForChat
findMessagesForChat(chatId: number, queryOptions: literal type)
Parameters :
Name Type Optional
chatId number No
queryOptions literal type No
Returns : unknown
Async findOne
findOne(id: number)
Parameters :
Name Type Optional
id number No
Async ping
ping(id: number)
Parameters :
Name Type Optional
id number No
Returns : unknown
Async update
update(id: number, updateChatDto: UpdateChatDto)
Parameters :
Name Type Optional
id number No
updateChatDto UpdateChatDto No
Returns : unknown
import { Injectable } from "@nestjs/common";
import { UserMessage } from "./dto/userMessage.dto";
import { PrismaService } from "../common/prisma/prisma.service";
import { MessageService } from "./message.service";
import { Chat, ChatStatus } from "./entities/chat.entity";
import { ChatDto, UpdateChatDto } from "./dto/chat.dto";
import { Message } from "./entities/message.entity";

@Injectable()
export class ChatService {
  constructor(
    private readonly prismaService: PrismaService,
    private readonly messageService: MessageService,
  ) {}

  async create(userMessage: UserMessage, userId: string) {
    const chat = new ChatDto({
      title: userMessage.content.text,
      userId: userId,
      status: ChatStatus.ACTIVE,
      summary: `User Asked: ${userMessage.content.text}`,
    });
    return new Chat(
      await this.prismaService.chat.create({
        data: chat,
      }),
    );
  }

  async findOne(id: number): Promise<Chat | null> {
    const chat = await this.prismaService.chat.findUnique({
      where: { id: id },
    });
    return new Chat(chat);
  }

  async findMessagesForChat(
    chatId: number,
    queryOptions: {
      pageSize?: number;
      pageOffset?: number;
      startID?: number;
    },
  ) {
    const chat = await this.prismaService.chat.findFirstOrThrow({
      where: { id: chatId },
    });
    return (await this.messageService.findForChat(chat, queryOptions)).map(
      (message) =>
        new Message({
          ...message,
          content: {
            text: message.content["text"],
            data: message.content["data"],
          },
        }),
    );
  }

  async update(id: number, updateChatDto: UpdateChatDto) {
    const chat = await this.prismaService.chat.update({
      where: {
        id: id,
        NOT: { status: ChatStatus.DELETED },
      },
      data: updateChatDto,
    });
    return new Chat(chat);
  }

  async ping(id: number) {
    const chat = await this.prismaService.chat.update({
      where: {
        id: id,
        NOT: { status: ChatStatus.DELETED },
      },
      data: { status: ChatStatus.ACTIVE },
    });
    return new Chat(chat);
  }

  async findForUser(
    userId: string,
    queryOptions: {
      pageSize?: number;
      pageOffset?: number;
      startId?: number;
      status?: ChatStatus;
    },
  ) {
    const pageSize = +queryOptions.pageSize || 30;
    const pageOffset = +queryOptions.pageOffset || 0;
    const findArgs = {
      where: {
        userId: userId,
      },
      take: Math.min(100, pageSize), // Limit the number of messages returned
      skip: pageOffset * pageSize, // Offset based on the page number and page size
    };

    if (queryOptions.startId) {
      findArgs["cursor"] = { id: +queryOptions.startId }; // start from ID
    }

    if (queryOptions.status) {
      findArgs.where["status"] = queryOptions.status;
    }

    if (queryOptions.status != ChatStatus.DELETED) {
      findArgs.where["NOT"] = { status: ChatStatus.DELETED };
    }

    const chats = await this.prismaService.chat.findMany(findArgs);
    return chats;
  }
}

results matching ""

    No results matching ""