mirror of
https://github.com/ktds-dg0501/kt-event-marketing-fe.git
synced 2025-12-06 10:16:25 +00:00
distribution api 생성
This commit is contained in:
parent
b6d6859050
commit
bdcf23e693
@ -21,6 +21,7 @@ import { ArrowBack, CheckCircle, Edit, RocketLaunch, Save, People, AttachMoney,
|
|||||||
import { EventData } from '../page';
|
import { EventData } from '../page';
|
||||||
import { cardStyles, colors, responsiveText } from '@/shared/lib/button-styles';
|
import { cardStyles, colors, responsiveText } from '@/shared/lib/button-styles';
|
||||||
|
|
||||||
|
|
||||||
interface ApprovalStepProps {
|
interface ApprovalStepProps {
|
||||||
eventData: EventData;
|
eventData: EventData;
|
||||||
onApprove: () => void;
|
onApprove: () => void;
|
||||||
@ -32,19 +33,62 @@ export default function ApprovalStep({ eventData, onApprove, onBack }: ApprovalS
|
|||||||
const [termsDialogOpen, setTermsDialogOpen] = useState(false);
|
const [termsDialogOpen, setTermsDialogOpen] = useState(false);
|
||||||
const [successDialogOpen, setSuccessDialogOpen] = useState(false);
|
const [successDialogOpen, setSuccessDialogOpen] = useState(false);
|
||||||
const [isDeploying, setIsDeploying] = useState(false);
|
const [isDeploying, setIsDeploying] = useState(false);
|
||||||
|
const DISTRIBUTION_API_BASE_URL = process.env.NEXT_PUBLIC_DISTRIBUTION_HOST || 'http://kt-event-marketing-api.20.214.196.128.nip.io';
|
||||||
|
|
||||||
const handleApprove = () => {
|
const handleApprove = async () => {
|
||||||
if (!agreeTerms) return;
|
if (!agreeTerms) return;
|
||||||
|
|
||||||
setIsDeploying(true);
|
setIsDeploying(true);
|
||||||
|
|
||||||
// 배포 시뮬레이션
|
try {
|
||||||
setTimeout(() => {
|
|
||||||
|
// 채널 매핑: 프론트엔드 채널명 → API 채널명
|
||||||
|
const channelMap: Record<string, string[]> = {
|
||||||
|
uriTV: ['URIDONGNETV'],
|
||||||
|
ringoBiz: ['RINGOBIZ'],
|
||||||
|
genieTV: ['GINITV'],
|
||||||
|
sns: ['INSTAGRAM', 'NAVER', 'KAKAO'],
|
||||||
|
};
|
||||||
|
|
||||||
|
const apiChannels = eventData.channels?.flatMap(ch => channelMap[ch] || []) || [];
|
||||||
|
|
||||||
|
const distributionRequest = {
|
||||||
|
eventId: `evt-${eventData.eventDraftId || Date.now()}`,
|
||||||
|
title: eventData.recommendation?.title || '이벤트',
|
||||||
|
description: eventData.recommendation?.description || eventData.recommendation?.participationMethod || '',
|
||||||
|
imageUrl: '', // TODO: 이미지 URL 연동 필요
|
||||||
|
channels: apiChannels,
|
||||||
|
channelSettings: {},
|
||||||
|
};
|
||||||
|
|
||||||
|
console.log('🚀 Distributing event:', distributionRequest);
|
||||||
|
|
||||||
|
const response = await fetch(`${DISTRIBUTION_API_BASE_URL}/api/v1/distribution/distribute`, {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
},
|
||||||
|
body: JSON.stringify(distributionRequest),
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!response.ok) {
|
||||||
|
const errorData = await response.json();
|
||||||
|
throw new Error(errorData.error || '배포 중 오류가 발생했습니다');
|
||||||
|
}
|
||||||
|
|
||||||
|
const data = await response.json();
|
||||||
|
console.log('✅ Distribution completed:', data);
|
||||||
|
|
||||||
setIsDeploying(false);
|
setIsDeploying(false);
|
||||||
setSuccessDialogOpen(true);
|
setSuccessDialogOpen(true);
|
||||||
}, 2000);
|
} catch (error) {
|
||||||
|
console.error('❌ Distribution failed:', error);
|
||||||
|
setIsDeploying(false);
|
||||||
|
alert(error instanceof Error ? error.message : '배포 중 오류가 발생했습니다');
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
const handleSaveDraft = () => {
|
const handleSaveDraft = () => {
|
||||||
// TODO: 임시저장 API 연동
|
// TODO: 임시저장 API 연동
|
||||||
alert('임시저장되었습니다');
|
alert('임시저장되었습니다');
|
||||||
|
|||||||
44
src/app/api/distribution/[eventId]/status/route.ts
Normal file
44
src/app/api/distribution/[eventId]/status/route.ts
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
import { NextRequest, NextResponse } from 'next/server';
|
||||||
|
|
||||||
|
const DISTRIBUTION_API_BASE_URL = process.env.NEXT_PUBLIC_DISTRIBUTION_HOST || 'http://kt-event-marketing-api.20.214.196.128.nip.io';
|
||||||
|
|
||||||
|
export async function GET(
|
||||||
|
request: NextRequest,
|
||||||
|
{ params }: { params: { eventId: string } }
|
||||||
|
) {
|
||||||
|
try {
|
||||||
|
const { eventId } = params;
|
||||||
|
|
||||||
|
console.log('🔄 Proxying distribution status request to Distribution API:', {
|
||||||
|
url: `${DISTRIBUTION_API_BASE_URL}/api/v1/distribution/${eventId}/status`,
|
||||||
|
eventId,
|
||||||
|
});
|
||||||
|
|
||||||
|
const response = await fetch(`${DISTRIBUTION_API_BASE_URL}/distribution/${eventId}/status`, {
|
||||||
|
method: 'GET',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!response.ok) {
|
||||||
|
const errorText = await response.text();
|
||||||
|
console.error('❌ Distribution API error:', response.status, errorText);
|
||||||
|
return NextResponse.json(
|
||||||
|
{ error: 'Failed to get distribution status', details: errorText },
|
||||||
|
{ status: response.status }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const data = await response.json();
|
||||||
|
console.log('✅ Distribution status retrieved:', data);
|
||||||
|
|
||||||
|
return NextResponse.json(data);
|
||||||
|
} catch (error) {
|
||||||
|
console.error('❌ Proxy error:', error);
|
||||||
|
return NextResponse.json(
|
||||||
|
{ error: 'Internal server error', details: error instanceof Error ? error.message : 'Unknown error' },
|
||||||
|
{ status: 500 }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -33,6 +33,15 @@ export const participationClient: AxiosInstance = axios.create({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Distribution API 전용 클라이언트
|
||||||
|
export const distributionClient: AxiosInstance = axios.create({
|
||||||
|
baseURL: `${API_HOSTS.distribution}`,
|
||||||
|
timeout: 90000,
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
// 공통 Request interceptor 함수
|
// 공통 Request interceptor 함수
|
||||||
const requestInterceptor = (config: InternalAxiosRequestConfig) => {
|
const requestInterceptor = (config: InternalAxiosRequestConfig) => {
|
||||||
console.log('🚀 API Request:', {
|
console.log('🚀 API Request:', {
|
||||||
@ -92,4 +101,8 @@ apiClient.interceptors.response.use(responseInterceptor, responseErrorIntercepto
|
|||||||
participationClient.interceptors.request.use(requestInterceptor, requestErrorInterceptor);
|
participationClient.interceptors.request.use(requestInterceptor, requestErrorInterceptor);
|
||||||
participationClient.interceptors.response.use(responseInterceptor, responseErrorInterceptor);
|
participationClient.interceptors.response.use(responseInterceptor, responseErrorInterceptor);
|
||||||
|
|
||||||
|
// Distribution API Client 인터셉터 적용
|
||||||
|
distributionClient.interceptors.request.use(requestInterceptor, requestErrorInterceptor);
|
||||||
|
distributionClient.interceptors.response.use(responseInterceptor, responseErrorInterceptor);
|
||||||
|
|
||||||
export default apiClient;
|
export default apiClient;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user