[TIL] 최종 프로젝트 채널 멤버 초대

최하온·2024년 4월 4일
0

TIL

목록 보기
61/71
post-thumbnail

🚨Issue occuring


1)❓어떻게 링크에 무작위 스트링으로 반환할것인가?

2)❓어떻게 유저와 채널 아이디를 담을 것인가?

💦What I tried


어떻게 링크에 무작위 스트링으로 반환할것인가?

  • 반복문 사용❌ => 하드코딩
  • encodeURI 같은 URI 인코딩 함수❌ => 숫자는 안 됨
  • uuid 사용 ✅

어떻게 유저와 채널 아이디를 담을 것인가?

  • uuid를 사용❔ => 값을 담지 못함
    -> uuid와 redis 사용✅ => 저장도 가능하며 유효시간이 지나면 만료도 가능

그렇다면 로직은 어떻게 짤 것인가?
1. 링크에서 user_idchannel_id를 추출 후 2번으로.
2. 멤버 생성 함수로 멤버 추가

💡How solve issue


2)❗uuid 사용 ✅

2)❗uuid와 redis 사용

// 멤버 초대 링크 발급
  async linkToInvite(channelId: number, email: string) {
    /**
     * 이메일을 받은 뒤 매칭되는 유저 id가져오기
     * 랜덤 스트링 키에 user와 channel 아이디 값 넣어주기
     * 수락 링크에는 매개변수로 랜덤 스트링을 넣어 주기
     */
    
    const user = await this.userRepository.findOne({ where: { email }, select: ['id'] });
    const uuid = crypto.randomUUID();
    const userIdAndChannelId = `${user.id}_${channelId}`;
    await redisCache.set(`randomKey:${uuid}`, userIdAndChannelId);

    const url = `http://localhost:3000/channel/accept?code=${uuid}`;

    return url;
  }

  // 링크를 해독하여 user와 channel id를 추출, 멤버 생성 함수로 연결

  async getUserIdAndChannelIdFromLink(uuid: string) {
    const Info = await redisCache.get(`randomKey:${uuid}`);
    const userId = +Info.split('_')[0];
    const channelId = +Info.split('_')[1];
    await this.createMember(userId, channelId);
  }

  //TODO: 호출 형식 여쭤보기
  // 링크 클릭 시 멤버 생성
  async createMember(user: number, channel: number) {
    const newMember = this.channelMemberRepository.create({
      role: MemberRole.User,
      user: user,
      channel: channel,
    } as any);

    await this.channelMemberRepository.save(newMember);
    return newMember;
  }
  • 여러개의 객체를 값으로 넣어주고 싶었지만 사용하는 라이브러리에선 지원하는 명령어가 부족 -> 불가피하게 _으로 나누어주어 추출함

📃What I learned new


  • 하나의 함수는 하나의 기능을 하는게 좋음 -> 멤버 생성은 재사용을 위해 따로 분리함.

0개의 댓글