TIL | 칸반보드 팀프로잭트 <Trollo> 코드 리뷰 (shift Cards)

bubblegum·2024년 3월 24일
0

Today I learn(TIL)

목록 보기
35/84
post-thumbnail
  async moveCard(cardId: number, listOrder: number, cardOrder: number) {
    // 카드 아이디와 일치하는 카드를 찾고 카드를 위치시키고자 하는 칼럼의 카드들을 모두 조회함
    const card = await this.cardRepository.findOneBy({ cardId });
    const cards = await this.cardRepository.find({
      where: { listId: listOrder },
    });

    if (_.isNil(card)) {
      throw new NotFoundException('존재하지 않는 카드입니다.');
    }
	// 해당 칼럼을 조회함
    const list = await this.listRepository.findOneBy({ listId: listOrder });

    if (!list) {
      throw new NotFoundException('해당 리스트(칼럼)가 존재하지 않습니다.');
    }

    // 같은 칼럼 내에서 카드 순서 이동할 때
    // card.order : 옮길 카드의 순서 
    // cardOrder: 옮기려는 순서
    if (card.listId === listOrder) {
      await this.cardRepository.update({ cardId }, { order: cardOrder });

      //카드를 위로 옮길 때
      if (card.order > cardOrder) {
        //옮긴 카드 순서(cardOrder)부터 하나씩 뒤로 밀기(카드 order값 +1)
        for (let i = cardOrder; i < card.order; i++) {
          //해당 리스트의 i번째 카드 order 1씩 더해서 순서 뒤로 밀기
          const upCard = await this.cardRepository.findOne({
            where: { listId: listOrder, order: i },
          });
          await this.cardRepository.update(
            { cardId: upCard.cardId },
            { order: i + 1 },
          );
        }
      } else {
        //카드를 아래로 옮길 때
        //옮긴 카드 순서(order)부터 하나씩 앞으로 밀기(카드 order값 -1)
        for (let j = cardOrder; j > card.order; j--) {
          //해당 리스트의 j번째 카드 order 1씩 줄여서 순서 앞으로 밀기
          const downCard = await this.cardRepository.findOne({
            where: { listId: listOrder, order: j },
          });

          await this.cardRepository.update(
            { cardId: downCard.cardId },
            { order: j - 1 },
          );
        }
      }

      // 다른 리스트로 카드 이동할 때
      //card : 옮기려는 카드 / cards : 옮기려는 리스트
    } else {
      //기존 리스트에서 카드 뺀 자리만큼 뒤의 카드들 order 앞으로 가져오기
      const fList = await this.cardRepository.find({
        where: { listId: card.listId },
      });
      console.log('다른 리스트로 옮기기 전의 카드 리스트 정보', card.listId);

      //삭제된 카드 밑에 있는 카드들 order값 1씩 줄이기
      for (let y = card.order + 1; y <= fList.length; y++) {
        const fLCard = await this.cardRepository.findOne({
          where: { listId: card.listId, order: y },
        });
        await this.cardRepository.update(
          { cardId: fLCard.cardId },
          { order: y - 1 },
        );
      }

      //옮기려는 카드의 순서가 해당 칼럼의 가장 마지막 순서보다 큰 경우는 그냥 마지막 순서 +1
      if (cardOrder > cards.length) {
        await this.cardRepository.update(
          { cardId },
          { listId: listOrder, order: cards.length + 1 },
        );
      } else {
        //다른 리스트 중간에 카드 넣기
        for (let z = cardOrder; z <= cards.length; z++) {
          //해당 리스트의 z번째 카드 order 1씩 더해서 순서 뒤로 밀기
          const mCard = await this.cardRepository.findOne({
            where: { listId: listOrder, order: z },
          });
          await this.cardRepository.update(
            { cardId: mCard.cardId },
            { order: z + 1 },
          );
        }
        await this.cardRepository.update(
          { cardId },
          { listId: listOrder, order: cardOrder },
        );
      }
    }
  }
profile
황세민

0개의 댓글

관련 채용 정보