TIL

24.03.22

아리단길아조씨 2024. 3. 25. 10:55
728x90

트롤로 프로젝트 List 컬럼 이동 기능 구현

 // 컬럼 위치 이동(컨트롤러)
 // UseGuards = 인증된 사용자만 사용할 수 있게 제한을 걸어둠.
  @UseGuards(JwtAuthGuard)
  // 괄호 안의 url로 Patch를 요청하면
  // changeListPositon메서드를 실행하는데 메서드를 사용하기 위한 파라미터로
  // 파라미터로 받는 listId와 index를 인자로 받는다.
  @Patch('/:boardId/column/:listId/index/:index')
  changeListPositon(
    @Param('listId') listId: number,
    @Param('index') hopeindex: number,
    // @userInfo() user: User,
  ) {  // 반환 값으로 listService의 changeListPosition 메서드에 인자로 listId, hopeindex 를 전달해서 실행값을 반환한다.
    return this.listService.changeListPosition(listId, hopeindex);
  }

// 컬럼 위치 이동
  // 이동 시킬 컬럼 1개 찾아야함
  // changeListPosition 함수를 사용하기 위해서 받아야할 인자는 listId, hopeindex임.
  async changeListPosition(listId: number, hopeindex: number) {
    /**움직이고 싶은 리스트를 selectedlist에다가 할당해버림
    ListRepository에서 listId로 1개의 리스트를 찾은 후 없으면 400을 던져준다.
    findOneBy에 들어있는 listId는 changeListPosition의 파라미터 listId와 같음
    즉, 인자로 받은 listId로 list를 하나 찾는거임.  **/
    const selectedlist = await this.ListRepository.findOneBy({ listId });
    if (!selectedlist) {
      throw new NotFoundException(`해당하는 컬럼이 존재하지 않습니다.`);
    }
		/* 시작 인덱스, 끝 인덱스, 인덱스를 더하고 뺄 add 변수를 선언*/
    let startIndex: number;
    let lastIndex: number;
    let add: number;
		/* 만약에 selectedlist의 index가 hopeindex보다 작을 경우(selectedlist의 index가 hopeIndex보다 앞에 있는 list라는 것)
		에는 startIndex에 selectedlist의 index에 1을 더해서 
		startindex에 할당해주고, lastindex는 hopeindex를 할당해주고, add는 -1을 준다.*/
    if (selectedlist.index < hopeindex) {
    /**/
      startIndex = selectedlist.index + 1;
      lastIndex = hopeindex;
      add = -1;
    } else {
    /* 위의 경우가 아니라면 startIndex와 hopeIndex는 같고 lastIndex에 selectedlsit.index에 -1을 해준다.*/
      startIndex = hopeindex; 2
      lastIndex = selectedlist.index - 1; // 5(select) -> 2(hope)  
      add = 1;
    }
    /* index를 담아줄 indexArr이라는 숫자형 배열을 초기화 해준다.*/
    const indexArr: Array<number> = [];
    /* startIndex가 lastIndex 보다 작거나 같을 때 까지 startIndex를 1씩 증가해서 반복문을 돌려주는데
    false가 될 때 까지 inexArr의 뒤쪽에 startIndex를 넣어준다.*/
    for (let i = startIndex; i <= lastIndex; i++) {
      indexArr.push(i); // [3, 4, 5]
    }
    // 옮길 리스트를 찾음
    /* indexArr에 들어있는 index를 모두 찾아서 lists에 넣어준다.*/
    const lists = await this.ListRepository.find({
      where: { index: In(indexArr) }, // In안에있는 배열의 값이 index에 존재하면 찾아온다. lists = 배열
    });
    console.log('가나다라', indexArr, startIndex, lastIndex);
    // 옮기는 부분(1칸 씩)
    /* lists의 각 요소에 대해서 업데이트를 해주는데 listId는 list(각 요소)의 listId
    index는 각 요소의 index에 add를 더한값으로 업데이트를 해준다.*/
    // index가 3,4,5인 리스트를 -1(add)씩 옮겨주는 작업
    for (const list of lists) {
      await this.ListRepository.update(
        { listId: list.listId }, // 찾을 것
        { index: list.index + add }, // 바꿀 것
      );
    }
    // 2 -> 5 바꾸려는 리스트의 위치를 옮겨주는 작업
    await this.ListRepository.update(
      { listId: selectedlist.listId },
      { index: hopeindex },
    );

    return await this.ListRepository.find({ order: { index: 'ASC' } });
  }
  
  /* update문 tip => 첫번째 파라미터: 조건(where), 두번 째 파라미터: 변경하고 싶은 값*/

'TIL' 카테고리의 다른 글

24.03.26  (0) 2024.03.26
24.03.25  (0) 2024.03.26
24.03.21  (0) 2024.03.22
24.03.20  (0) 2024.03.20
24.03.19  (0) 2024.03.20