Project Tours/Tour on Plantopia
[오늘의 이슈] 삭제 기능 버그 픽스
Kestrel
2023. 9. 18. 17:01
삭제 로직에 문제가 생겼다. 삭제 자체는 잘 되지만 메인 식물이 삭제 될 때 다음으로 메인 식물을 지정해주지 않는 문제가 발생하였다.
const deletePlant = async () => {
if (docId) {
await deletePlantDataByDocId(docId);
}
navigate('/myplant');
};
파이어베이스 함수를 바깥으로 빼주었기에 이 함수를 살펴보면
export const deletePlantDataByDocId = async (docId: string) => {
if (!docId) return;
const docRef = doc(db, 'plant', docId);
const plantData = await findPlantDataByDocId(docId);
const q = query(
collection(db, 'plant'),
where('userEmail', '==', plantData?.userEmail),
);
const userPlants = await getDocs(q);
if (userPlants.size === 1) {
await deleteDoc(docRef);
successNoti('식물을 삭제하였습니다.');
return;
}
if (plantData?.isMain == true) {
try {
await deleteDoc(docRef);
const firstPlantDataId = userPlants.docs[0].id;
const documentRef = doc(db, 'plant', firstPlantDataId);
const updatedFields = {
isMain: true,
};
await updateDoc(documentRef, updatedFields);
successNoti('식물을 삭제하였습니다.');
return;
} catch {
errorNoti('식물 삭제에 실패 하였습니다.');
return;
}
} else if (plantData?.isMain == false) {
try {
await deleteDoc(docRef);
successNoti('내 식물이 삭제 되었습니다.');
return;
} catch (error) {
errorNoti('식물 삭제에 실패 하였습니다.');
return;
}
}
};
1) docId로 식물 데이터를 받아온다.
2) 식물 데이터에는 유저의 이메일이 저장되어 있는데 유저 이메일을 통해 유저가 가진 식물들을 모두 가져온다.
3) 체크 사항으로 먼저 유저의 식물 수를 size 메서드로 확인한다. 1개 이면 메인 식물인지 따져볼 필요 없이 삭제하면 되기 때문이다.
4) 2개 이상일 때는 메인 식물 여부를 따져줘야한다. 만약 메인 식물이면 해당 식물을 삭제하고 남은 식물 중에 메인 식물을 자동으로 지정해줘야한다.
5) 메인 식물이 아니면 그냥 삭제하고 끝
4번에서 문제가 생긴 것인데 다시 한 번 시도
잘 작동한다. 근데 이따금씩 왜 작동안하는지 버그가 또 발생할 때 확인해야겠다.