• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

dms 의 서비스에서 코드를 봐도 모르겠는 부분이 있어서 질문합니다.

22.08.10 16:34 작성 조회수 84

1

 function getKeyByValue(object, value) {
  return Object.keys(object).find((key) => object[key] === value);
}
...

  async getWorkspaceDMChats(
    url: string,
    id: number,
    myId: number,
    perPage: number,
    page: number,
  ) {
    return this.dmsRepository
      .createQueryBuilder('dms')
      .innerJoinAndSelect('dms.Sender', 'sender')
      .innerJoinAndSelect('dms.Receiver', 'receiver')
      .innerJoin('dms.Workspace', 'workspace')
      .where('workspace.url = :url', { url })
      .andWhere(
        '((dms.SenderId = :myId AND dms.ReceiverId = :id) OR (dms.ReceiverId = :myId AND dms.SenderId = :id))',
        { id, myId },
      )
      .orderBy('dms.createdAt', 'DESC')
      .take(perPage)
      .skip(perPage * (page - 1))
      .getMany();
  }

...

 async createWorkspaceDMChats(
    url: string,
    content: string,
    id: number,
    myId: number,
  ) {
    const workspace = await this.workspacesRepository.findOne({
      where: { url },
    });
    const dm = new DMs();
    dm.SenderId = myId;
    dm.ReceiverId = id;
    dm.content = content;
    dm.WorkspaceId = workspace.id;
    const savedDm = await this.dmsRepository.save(dm);
    const dmWithSender = await this.dmsRepository.findOne({
      where: { id: savedDm.id },
      relations: ['Sender'],
    });
    const receiverSocketId = getKeyByValue(
      onlineMap[`/ws-${workspace.url}`],
      Number(id),
    );
    this.eventsGateway.server.to(receiverSocketId).emit('dm', dmWithSender);
  }
...

1.  getKeyByValue가 어떠한 역할을 하나요? 소켓을 사용할 때 필요한 부분이라고 짐작만 하고 있습니다. 코드에 대한 간단한 해석과 역할을 간단하게 알려주시면 감사하겠습니다.

2. async getWorkspaceDMChats 기능에서 .innerJoinAndSelect('dms.Sender', 'sender') 부분이 헷갈립니다. dms라는 별칭과 Sender라는 테이블이 join 되는 부분이라고 생각하고 있었는데, Sender 라는 테이블이 존재했었나요?
저는 여태까지 dms.Workspaces 이런식으로 DMs와 Workspaces 테이블을 join 하는 부분이라고 생각하고 있었는데 잘못 알고 있는건가요..?

3. async createWorkspaceDMChats 중 const dmWithSender 부분에서 2번과 비슷한 내용의 질문인데, relations: ['Sender']가 나오는데 이 부분 또한 테이블과의 관계를 나타내는 부분으로 알고있었는데 Sender라는 테이블이 존재하는건가요?

답변 1

답변을 작성해보세요.

0

1. onlineMap(소켓아이디: 내 아이디 꼴)에서 내 아이디가 들어있는 소켓 아이디를 찾아내는 겁니다.

2. Join이 맞고요. Sender는 User입니다. Sender와 Receiver 둘 다 User와 연결되게 해야 해서 이름을 바꾼 것이고요. DM 엔티티 보시면 Sender가 User 엔티티와 연결되어 있음을 보실 수 있습니다.

3. 2번과 마찬가지 답변입니다.