[TIL] Work-Flow 프로젝트 - Membership, payment (3/4) 23.08.30

이상훈·2023년 8월 31일
0

[내일배움캠프]

목록 보기
61/68

이전에 발생했던 문제

취소된 결제가 존재할 때 새로운 멤버십을 결제하는 경우

아래 취소되었던 멤버십도 같이 활성화되는 문제를 발견


payment 컬럼의 status를 활용하여 true인 경우에만 push를 할 수 있도록 변경

const paymentHistory = [];
    for (const payment of payments) {
      const workspaceId = payment.workspaceId;
      const status = payment.status;
      const workspace = await this.workspaceService.getWorkspaceDetail(workspaceId);

      if (workspace.memberships.length > 0 && status === true) {
        const membership = workspace.memberships[0];
        const paymentInfo = {
          paymentId: payment.id,
          paymentCreatedAt: payment.created_at,
          workspaceId,
          workspaceName: workspace.name,
          membershipCreatedAt: membership.created_at,
          membershipEndDate: membership.end_date,
          membershipPrice: membership.package_price,
        };
        paymentHistory.push(paymentInfo);
      } else {
        const paymentInfo = {
          paymentId: payment.id,
          paymentCreatedAt: payment.created_at,
          workspaceId,
          workspaceName: workspace.name,
        };
        paymentHistory.push(paymentInfo);
      }
    }
    return paymentHistory;

true가 아닐 경우 취소된 결제 내역이므로 membership의 정보를 담지 않음, 프론트에서는 멤버십의 생성정보가 없을 경우 모두 취소된 결제로 볼 수 있도록 아래와 같이 코드를 작성

          const paymentDate = new Date(history.paymentCreatedAt);
          if (paymentDate >= oneMonthAgo && paymentDate <= currentDate) {
            if (!history.membershipCreatedAt) {
              result += ` <tbody>
                            <tr>
                              <td data-workspace-id="${history.workspaceId}" id="workspace-name-table">${history.workspaceName}</td>
                              <td>취소된 결제입니다.</td>
                              <td>-</td>
                              <td>`;

출력 결과

추가로 한달 이내의 결제 내역만 출력되도록 설정
52번 paymentId가 취소된 워크스페이스 결제이며 payment 생성날짜를 한달 이전으로 세팅하면

결제내역에 출력되지 않는 것을 확인


추가로 아직 테스트하지 못한 내용이지만 멤버십을 이용 후 다시 결제하지 않는 경우가 있을수도 있으므로 node schedule을 사용하여 멤버십의 endDate를 확인하고 현재날짜 이전이라면 삭제하는 코드를 작성

  @Cron('0 0 * * *')
  async deleteExpiredMembership(): Promise<IResult> {
    return await this.membershipService.deleteExpiredMembership();
  }
  // 만료된 멤버십 삭제
  async deleteExpiredMembership(): Promise<IResult> {
    const expiredMembership = await this.membershipRepository.find({
      where: {
        end_date: LessThan(new Date()),
      },
    });
    await this.membershipRepository.remove(expiredMembership);
    return { result: true };
  }
profile
코린이

0개의 댓글