Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion next.config.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import type { NextConfig } from "next";

const nextConfig: NextConfig = {
/* config options here */
images: {
domains: ['storage.googleapis.com'], // 여기에 에러에 나온 도메인 추가
},
Expand Down
260 changes: 258 additions & 2 deletions src/apis/event.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,16 @@
import { CategoryProps, CheckListType, LeftEventCount, MonthlyChecklistType } from "./event.type";
import {
CategoryProps,
CheckListType,
LeftEventCount,
MonthlyChecklistType,
CalendarEvent,
CalendarResponseDTO,
TempEvent,
CreateEventRequest,
UpdateEventRequest,
FixEventRequest,
CheckStatusUpdate
} from "./event.type";
import instance from "./instance";

export const getMajorEventChecklist = async (params?: { year?: number; category?: string }): Promise<CheckListType[]> => {
Expand Down Expand Up @@ -45,4 +57,248 @@ export const getCountLeftEvent = async(): Promise<LeftEventCount>=>{
console.error("남은 과행사 개수 조회 실패", error);
throw error;
}
}
}

// ========== Calendar 관련 API 함수들 ==========

// 월별 달력 조회
export const getCalendarEvents = async (year: number, month: number): Promise<CalendarResponseDTO[]> => {
try {
const response = await instance.get<CalendarResponseDTO[]>("/api/v1/major-event/calendar", {
params: { year, month }
});
console.log("월별 달력 조회 성공", response);
return response.data;
} catch (error) {
console.error("월별 달력 조회 실패", error);
throw error;
}
};

// 임시 행사 저장 (Swagger 스펙에 맞게 구현)
export const saveTempEvent = async (eventData: CreateEventRequest): Promise<TempEvent> => {
try {
const formData = new FormData();

// 필수 필드들 추가 (Swagger Create 스키마에 맞게)
formData.append("eventName", eventData.eventName);
formData.append("category", eventData.category);
formData.append("hostType", eventData.hostType);
formData.append("location", eventData.location);
formData.append("notice", eventData.notice);
formData.append("googleFormLink", eventData.googleFormLink);
formData.append("startDate", eventData.startDate);
formData.append("endDate", eventData.endDate);
formData.append("time", eventData.time);

// 이미지 파일들 추가 (cardNewsImages 필드명 사용)
eventData.cardNewsImages.forEach((image) => {
formData.append("cardNewsImages", image);
});

// FormData 내용 로깅
console.log("📤 임시 행사 저장 FormData 내용:");
for (let [key, value] of formData.entries()) {
if (value instanceof File) {
console.log(` ${key}: File(${value.name}, ${value.size}bytes, ${value.type})`);
} else {
console.log(` ${key}: ${value}`);
}
}

const response = await instance.post<TempEvent>("/api/v1/major-event/temp", formData);
console.log("✅ 임시 행사 저장 성공", response);
return response.data;
} catch (error) {
console.error("❌ 임시 행사 저장 실패", error);
throw error;
}
};

// 임시 행사 수정 (Swagger 스펙에 맞게 구현)
export const updateTempEvent = async (tempEventId: number, eventData: UpdateEventRequest): Promise<TempEvent> => {
try {
const formData = new FormData();

// 필수 필드들 추가 (Swagger Update 스키마에 맞게)
formData.append("eventName", eventData.eventName);
formData.append("category", eventData.category);
formData.append("hostType", eventData.hostType);
formData.append("location", eventData.location);
formData.append("notice", eventData.notice);
formData.append("googleFormLink", eventData.googleFormLink);
formData.append("startDate", eventData.startDate);
formData.append("endDate", eventData.endDate);
formData.append("time", eventData.time);
formData.append("majorEventId", eventData.majorEventId.toString());

// 기존 이미지 URL들 추가
eventData.existingImageUrls.forEach((url) => {
formData.append("existingImageUrls", url);
});

// 새 이미지 파일들 추가
eventData.newImages.forEach((image) => {
formData.append("newImages", image);
});

// FormData 내용 로깅
console.log("📤 임시 행사 수정 FormData 내용:");
for (let [key, value] of formData.entries()) {
if (value instanceof File) {
console.log(` ${key}: File(${value.name}, ${value.size}bytes, ${value.type})`);
} else {
console.log(` ${key}: ${value}`);
}
}

const response = await instance.patch<TempEvent>(`/api/v1/major-event/temp/${tempEventId}`, formData);
console.log("✅ 임시 행사 수정 성공", response);
return response.data;
} catch (error) {
console.error("❌ 임시 행사 수정 실패", error);
throw error;
}
};

// 임시 행사 삭제
export const deleteTempEvent = async (tempEventId: number): Promise<void> => {
try {
const response = await instance.delete(`/api/v1/major-event/temp/${tempEventId}`);
console.log("임시 행사 삭제 성공", response);
} catch (error) {
console.error("임시 행사 삭제 실패", error);
throw error;
}
};

// 임시 행사 최종 제출 (확정)
export const submitAllTempEvents = async (tempEventIds: number[]): Promise<CheckListType[]> => {
try {
const response = await instance.post<CheckListType[]>("/api/v1/major-event/fix", {
tempEventIds
});
console.log("임시 행사 최종 제출 성공", response);
return response.data;
} catch (error) {
console.error("임시 행사 최종 제출 실패", error);
throw error;
}
};

// 확정된 행사 수정 (Swagger 스펙에 맞게 구현)
export const updateMajorEvent = async (majorEventId: number, eventData: UpdateEventRequest): Promise<CheckListType> => {
try {
const formData = new FormData();

// 필수 필드들 추가 (Swagger Update 스키마에 맞게)
formData.append("eventName", eventData.eventName);
formData.append("category", eventData.category);
formData.append("hostType", eventData.hostType);
formData.append("location", eventData.location);
formData.append("notice", eventData.notice);
formData.append("googleFormLink", eventData.googleFormLink);
formData.append("startDate", eventData.startDate);
formData.append("endDate", eventData.endDate);
formData.append("time", eventData.time);
formData.append("majorEventId", eventData.majorEventId.toString());

// 기존 이미지 URL들 추가
eventData.existingImageUrls.forEach((url) => {
formData.append("existingImageUrls", url);
});

// 새 이미지 파일들 추가
eventData.newImages.forEach((image) => {
formData.append("newImages", image);
});

// FormData 내용 로깅
console.log("📤 확정된 행사 수정 FormData 내용:");
for (let [key, value] of formData.entries()) {
if (value instanceof File) {
console.log(` ${key}: File(${value.name}, ${value.size}bytes, ${value.type})`);
} else {
console.log(` ${key}: ${value}`);
}
}

const response = await instance.put<CheckListType>(`/api/v1/major-event/${majorEventId}`, formData);
console.log("✅ 확정된 행사 수정 성공", response);
return response.data;
} catch (error) {
console.error("❌ 확정된 행사 수정 실패", error);
throw error;
}
};

// 확정된 행사 삭제
export const deleteMajorEvent = async (majorEventId: number): Promise<void> => {
try {
const response = await instance.delete(`/api/v1/major-event/${majorEventId}`);
console.log("확정된 행사 삭제 성공", response);
} catch (error) {
console.error("확정된 행사 삭제 실패", error);
throw error;
}
};

// 체크리스트 항목 상태 변경
export const updateChecklistItemStatus = async (itemId: number, isChecked: boolean): Promise<CheckStatusUpdate> => {
try {
const response = await instance.put<CheckStatusUpdate>(`/api/v1/major-event/checklists/${itemId}`, {
isChecked
});
console.log("체크리스트 항목 상태 변경 성공", response);
return response.data;
} catch (error) {
console.error("체크리스트 항목 상태 변경 실패", error);
throw error;
}
};

// ========== Swagger 스펙에 맞는 새로운 임시 행사 저장 API ==========

/**
* Swagger 스펙에 맞는 임시 행사 저장 API
* @param eventData - Create 스키마에 맞는 행사 데이터
* @returns TempEventResponseDTO
*/
export const saveTempEventV2 = async (eventData: CreateEventRequest): Promise<TempEvent> => {
try {
const formData = new FormData();

// Swagger Create 스키마의 모든 필수 필드 추가
formData.append("eventName", eventData.eventName);
formData.append("category", eventData.category);
formData.append("hostType", eventData.hostType);
formData.append("location", eventData.location);
formData.append("notice", eventData.notice);
formData.append("googleFormLink", eventData.googleFormLink);
formData.append("startDate", eventData.startDate);
formData.append("endDate", eventData.endDate);
formData.append("time", eventData.time);

// 이미지 파일들 추가 (cardNewsImages 필드명 사용)
eventData.cardNewsImages.forEach((image) => {
formData.append("cardNewsImages", image);
});

// FormData 내용 로깅
console.log("📤 Swagger 스펙 임시 행사 저장 FormData 내용:");
for (let [key, value] of formData.entries()) {
if (value instanceof File) {
console.log(` ${key}: File(${value.name}, ${value.size}bytes, ${value.type})`);
} else {
console.log(` ${key}: ${value}`);
}
}

const response = await instance.post<TempEvent>("/api/v1/major-event/temp", formData);
console.log("✅ Swagger 스펙 임시 행사 저장 성공", response);
return response.data;
} catch (error) {
console.error("❌ Swagger 스펙 임시 행사 저장 실패", error);
throw error;
}
};
94 changes: 90 additions & 4 deletions src/apis/event.type.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,22 @@ export interface CheckListType{//연도별, 행사별

export type CategoryProps = "ALL"|
"FRESHMAN_ORIENTATION"|
"MEETING" |
"FIRST_SEMESTER_OPENING_MEETING" |
"FIRST_SEMESTER_CLOSING_MEETING" |
"SECOND_SEMESTER_OPENING_MEETING" |
"SECOND_SEMESTER_CLOSING_MEETING" |
"FACE_TO_FACE_MEETING" |
"SNACK_EVENT" |
"FIRST_SEMESTER_MIDTERM_SNACK" |
"FIRST_SEMESTER_FINAL_SNACK" |
"SECOND_SEMESTER_MIDTERM_SNACK" |
"SECOND_SEMESTER_FINAL_SNACK" |
"MT" |
"KICK_OFF" |
"SPORTS_DAY" |
"COLLEGE_SPORTS_DAY" |
"UNIVERSITY_SPORTS_DAY" |
"FESTIVAL" |
"HOME_COMING_DAY"
"HOMECOMING_DAY" |
"ETC"

// Tip 객체 타입 정의
export interface Tip {
Expand Down Expand Up @@ -47,4 +55,82 @@ export interface MonthlyChecklistType { // 할일별

export interface LeftEventCount{
count: number; // 남은 과행사 개수
}

// Calendar 관련 타입 정의
export interface CalendarEvent {
id: number;
eventName: string;
startDate: string;
endDate: string;
eventStatus: "TEMPORARY" | "FIXED";
}

// API 스키마에 맞는 CalendarResponseDTO 타입 정의
export interface CalendarResponseDTO {
id: number;
eventName: string;
startDate: string;
endDate: string;
eventStatus: "TEMPORARY" | "FIXED";
category: string;
location: string;
notice: string;
googleFormLink: string;
time: string;
cardNewsImageUrls: string[];
}

// 임시 행사 관련 타입 정의
export interface TempEvent {
tempEventId: number;
eventName: string;
category: string;
startDate: string;
endDate: string;
time: string;
location: string;
notice: string;
googleFormLink: string;
cardNewsImageUrls: string[];
}

// Swagger 스펙에 맞는 행사 생성 요청 타입 (Create 스키마)
export interface CreateEventRequest {
eventName: string;
category: "FRESHMAN_ORIENTATION" | "FIRST_SEMESTER_OPENING_MEETING" | "FIRST_SEMESTER_CLOSING_MEETING" | "SECOND_SEMESTER_OPENING_MEETING" | "SECOND_SEMESTER_CLOSING_MEETING" | "FACE_TO_FACE_MEETING" | "FIRST_SEMESTER_MIDTERM_SNACK" | "FIRST_SEMESTER_FINAL_SNACK" | "SECOND_SEMESTER_MIDTERM_SNACK" | "SECOND_SEMESTER_FINAL_SNACK" | "MT" | "KICK_OFF" | "COLLEGE_SPORTS_DAY" | "UNIVERSITY_SPORTS_DAY" | "FESTIVAL" | "HOMECOMING_DAY" | "ETC";
hostType: "COMPUTER_SCIENCE" | "ETC";
location: string;
notice: string;
googleFormLink: string;
startDate: string; // YYYY-MM-DD 형식
endDate: string; // YYYY-MM-DD 형식
time: string; // HH:mm:ss 형식
cardNewsImages: File[];
}

// Swagger 스펙에 맞는 행사 수정 요청 타입 (Update 스키마)
export interface UpdateEventRequest {
eventName: string;
category: "FRESHMAN_ORIENTATION" | "FIRST_SEMESTER_OPENING_MEETING" | "FIRST_SEMESTER_CLOSING_MEETING" | "SECOND_SEMESTER_OPENING_MEETING" | "SECOND_SEMESTER_CLOSING_MEETING" | "FACE_TO_FACE_MEETING" | "FIRST_SEMESTER_MIDTERM_SNACK" | "FIRST_SEMESTER_FINAL_SNACK" | "SECOND_SEMESTER_MIDTERM_SNACK" | "SECOND_SEMESTER_FINAL_SNACK" | "MT" | "KICK_OFF" | "COLLEGE_SPORTS_DAY" | "UNIVERSITY_SPORTS_DAY" | "FESTIVAL" | "HOMECOMING_DAY" | "ETC";
hostType: "COMPUTER_SCIENCE" | "ETC";
location: string;
notice: string;
googleFormLink: string;
startDate: string; // YYYY-MM-DD 형식
endDate: string; // YYYY-MM-DD 형식
time: string; // HH:mm:ss 형식
majorEventId: number;
existingImageUrls: string[];
newImages: File[];
}

// 행사 확정 요청 타입
export interface FixEventRequest {
tempEventIds: number[];
}

// 체크리스트 상태 업데이트 타입
export interface CheckStatusUpdate {
isChecked: boolean;
}
Loading