92 lines
2.9 KiB
TypeScript
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();
|
|
};
|