Files
sam-react-prod/src/lib/api/today-issue.ts

120 lines
3.3 KiB
TypeScript
Raw Normal View History

'use server';
/**
* TodayIssue API
* API
*/
import { apiClient } from './index';
import { AuthError } from './errors';
import type {
ApiResponse,
TodayIssueUnreadResponse,
TodayIssueUnreadCountResponse,
TodayIssueMarkAllReadResponse,
} from '@/types/today-issue';
/**
*
*/
function isAuthenticationError(error: unknown): boolean {
if (error instanceof AuthError) return true;
if (error && typeof error === 'object') {
const err = error as { status?: number; code?: string; message?: string };
if (err.status === 401) return true;
if (err.code === 'AUTH_ERROR') return true;
if (err.message?.includes('회원정보') || err.message?.includes('인증')) return true;
}
return false;
}
/**
* ( )
* @param limit ( 10)
*/
export async function getUnreadTodayIssues(limit: number = 10): Promise<ApiResponse<TodayIssueUnreadResponse>> {
try {
const response = await apiClient.get<ApiResponse<TodayIssueUnreadResponse>>(
'/today-issues/unread',
{ params: { limit: String(limit) } }
);
return response;
} catch (error) {
console.error('[TodayIssue] getUnreadTodayIssues error:', error);
// 인증 에러인 경우 authError 플래그 설정
if (isAuthenticationError(error)) {
return {
success: false,
message: '인증이 만료되었습니다.',
data: { items: [], total: 0 },
authError: true,
};
}
// 일반 에러
return {
success: false,
message: '알림을 불러오는데 실패했습니다.',
data: { items: [], total: 0 },
};
}
}
/**
* ( )
*/
export async function getUnreadTodayIssueCount(): Promise<ApiResponse<TodayIssueUnreadCountResponse>> {
try {
const response = await apiClient.get<ApiResponse<TodayIssueUnreadCountResponse>>(
'/today-issues/unread/count'
);
return response;
} catch (error) {
console.error('[TodayIssue] getUnreadTodayIssueCount error:', error);
return {
success: false,
message: '알림 개수를 불러오는데 실패했습니다.',
data: { count: 0 },
};
}
}
/**
*
* @param id ID
*/
export async function markTodayIssueAsRead(id: number): Promise<ApiResponse<null>> {
try {
const response = await apiClient.post<ApiResponse<null>>(
`/today-issues/${id}/read`
);
return response;
} catch (error) {
console.error('[TodayIssue] markTodayIssueAsRead error:', error);
return {
success: false,
message: '읽음 처리에 실패했습니다.',
data: null,
};
}
}
/**
*
*/
export async function markAllTodayIssuesAsRead(): Promise<ApiResponse<TodayIssueMarkAllReadResponse>> {
try {
const response = await apiClient.post<ApiResponse<TodayIssueMarkAllReadResponse>>(
'/today-issues/read-all'
);
return response;
} catch (error) {
console.error('[TodayIssue] markAllTodayIssuesAsRead error:', error);
return {
success: false,
message: '모두 읽음 처리에 실패했습니다.',
data: { count: 0 },
};
}
}