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), 두번 째 파라미터: 변경하고 싶은 값*/