Files
zellyy-finance/src/utils/sync/transaction/deleteTransaction.ts

92 lines
2.9 KiB
TypeScript

import { supabase } from '@/archive/lib/supabase';
import { isSyncEnabled } from '../syncSettings';
import { addToDeletedTransactions } from './deletedTransactionsTracker';
/**
* Supabase 서버에서 트랜잭션을 삭제하는 함수 - 안정성 및 성능 최적화 버전
* 네트워크 타임아웃과 에러 처리를 강화하였습니다.
*/
export const deleteTransactionFromServer = async (userId: string, transactionId: string): Promise<void> => {
// 동기화 기능이 비활성화된 경우 빠르게 종료
if (!isSyncEnabled()) return;
try {
console.log(`[서버 삭제] 요청 시작: ${transactionId}`);
// 타임아웃 설정 (2초)
const controller = new AbortController();
const timeoutId = setTimeout(() => {
console.warn(`[서버 삭제] 타임아웃 발생: ${transactionId}`);
controller.abort();
}, 2000);
try {
// 삭제된 트랜잭션 ID 추적 목록에 추가
addToDeletedTransactions(transactionId);
// 서버 요청 실행
const { error } = await supabase
.from('transactions')
.delete()
.eq('transaction_id', transactionId)
.eq('user_id', userId)
.abortSignal(controller.signal);
// 타임아웃 제거
clearTimeout(timeoutId);
if (error) {
console.error('[서버 삭제] 실패:', error.message);
} else {
console.log(`[서버 삭제] 성공: ${transactionId}`);
}
} catch (e) {
// 타임아웃 오류 처리
clearTimeout(timeoutId);
const error = e as Error;
if (error.name === 'AbortError') {
console.warn('[서버 삭제] 요청이 타임아웃으로 중단됨');
} else {
console.error('[서버 삭제] 오류 발생:', error);
}
}
} catch (error) {
console.error('[서버 삭제] 예상치 못한 오류:', error);
}
};
/**
* 재시도 메커니즘이 포함된 트랜잭션 삭제 함수
* 최대 2회까지 재시도하며 네트워크 불안정 상황에서 안정성을 높입니다.
*/
export const deleteTransactionWithRetry = async (
userId: string,
transactionId: string,
maxRetries = 2
): Promise<boolean> => {
let retries = 0;
const attemptDelete = async (): Promise<boolean> => {
try {
await deleteTransactionFromServer(userId, transactionId);
return true;
} catch (error) {
if (retries < maxRetries) {
retries++;
console.log(`[서버 삭제] 재시도 ${retries}/${maxRetries}: ${transactionId}`);
// 지수 백오프 적용 (첫 재시도: 500ms, 두번째: 1000ms)
await new Promise(resolve => setTimeout(resolve, 500 * retries));
return attemptDelete();
} else {
console.warn(`[서버 삭제] 최대 재시도 횟수 초과: ${transactionId}`);
return false;
}
}
};
return attemptDelete();
};