Skip to content

Commit 118fc56

Browse files
authored
[CCI-71] feat : v.1.5.0 api 연결 및 수정사항 반영 (#9)
* fix : delete api * feat: 탈퇴 api 연결 * feat: 자기소개서 및 이력서 삭제 기능 추가, 로딩 컴포넌트에 위험 상태 추가 * feat: 삭제 확인 다이얼로그 컴포넌트로 변경 및 이력서, 자기소개서 삭제 기능 통합 * feat: 인터뷰 관련 컴포넌트 및 상태 관리 개선, 자기소개서 및 이력서 상세보기 다이얼로그 추가 * feat: 삭제 확인 다이얼로그 옵션 타입 수정 및 제네릭 제거 * feat: 자기소개서 및 이력서의 면접 연결 확인 로직 통합 및 공통 함수 추가 * feat: 면접 연결 확인 쿼리에서 오류 처리 추가 및 toast 알림 기능 구현 * feat: 날짜 변환 함수에서 KST 보정 로직 수정 및 절대 날짜 반환 방식 개선 * feat: 면접 목록 쿼리 함수 수정 및 인터뷰 형식 관련 UI 개선 * feat: 면접 공고 URL 추가 및 인터뷰 관련 타입 수정 * feat: API 오류 처리 개선 및 공통 타입 추가 * feat: API 오류 처리 통합 및 toast 알림 기능 개선
1 parent d34fd41 commit 118fc56

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+1033
-366
lines changed

apis/ai-interview.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,17 +39,21 @@ export async function generateQuestions(
3939
memberInterviewId: string,
4040
payload?: ApiResponseInterviewStartResponseDTO
4141
): Promise<InterviewSession> {
42+
const noticeUrl =
43+
payload?.result?.interview?.noticeUrl ??
44+
'https://hanabank.incruit.com/hire/viewhire.asp?projectid=113'
45+
4246
const updatedPayload = {
4347
...payload,
4448
result: {
4549
...payload?.result,
4650
interview: {
4751
...payload?.result?.interview,
48-
notice_url:
49-
'https://hanabank.incruit.com/hire/viewhire.asp?projectid=113',
52+
notice_url: noticeUrl,
5053
},
5154
},
5255
}
56+
5357
const res = await aiFetch.post<any>(
5458
`/interview/${interviewId}/${memberInterviewId}/generate_questions`,
5559
updatedPayload

apis/coverletter.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ import {
66
ApiResponseMyCoverletterListDTO,
77
} from './types/coverletter-types'
88

9+
import { ApiResponseVoid } from './types/common-types'
10+
import { checkEntityInterviewConnections } from '../utils/api-helpers'
11+
912
// 자기소개서 생성
1013
export async function createCoverletter(data: CreateCoverletterDTO) {
1114
return serverFetch.post<
@@ -25,3 +28,13 @@ export async function getCoverletterDetail(coverletterId: number) {
2528
export async function findMyCoverletter() {
2629
return serverFetch.get<ApiResponseMyCoverletterListDTO>('/coverletters')
2730
}
31+
32+
// 자기소개서에 연결된 면접이 있는지 확인
33+
export async function checkHasConnectedInterview(coverletterId: number) {
34+
return checkEntityInterviewConnections('coverletters', coverletterId)
35+
}
36+
37+
// 자기소개서 삭제
38+
export async function deleteCoverletter(coverletterId: number) {
39+
return serverFetch.del<ApiResponseVoid>(`/coverletters/${coverletterId}`)
40+
}

apis/interview.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import {
1717
UpdateDocumentDTO,
1818
ApiResponseMemberInterviewDocumentDTO,
1919
} from './types/interview-types'
20+
import { checkEntityInterviewConnections } from '../utils/api-helpers'
2021

2122
// 면접 생성
2223
export async function createInterview(data: InterviewCreateDTO) {
@@ -133,3 +134,6 @@ export async function updateInterviewDocuments(
133134
export async function deleteInterview(interviewId: number) {
134135
return serverFetch.del(`/interviews/${interviewId}`)
135136
}
137+
138+
// 엔티티에 연결된 면접 목록 조회 (공통 함수)
139+
export { checkEntityInterviewConnections }

apis/member.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,8 @@ export async function reissueToken(data: TokenReissueRequestDto) {
4646

4747
return response.json()
4848
}
49+
50+
// 계정 탈퇴
51+
export async function deleteAccount() {
52+
return serverFetch.del('/members')
53+
}

apis/resume.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ import {
77
ApiResponseResumeListDTO,
88
} from './types/resume-types'
99

10+
import { ApiResponseVoid } from './types/common-types'
11+
import { checkEntityInterviewConnections } from '../utils/api-helpers'
12+
1013
// presigned url 발급
1114
export async function getPresignedUploadUrl(fileName: string) {
1215
return serverFetch.get<ApiResponsePresignedUploadDTO>('/resumes/upload', {
@@ -31,3 +34,13 @@ export async function getResumeDetail(resumeId: number) {
3134
export async function getResumeList() {
3235
return serverFetch.get<ApiResponseResumeListDTO>('/resumes')
3336
}
37+
38+
// 이력서에 연결된 면접이 있는지 확인
39+
export async function checkHasConnectedInterview(resumeId: number) {
40+
return checkEntityInterviewConnections('resumes', resumeId)
41+
}
42+
43+
// 이력서 삭제
44+
export async function deleteResume(resumeId: number) {
45+
return serverFetch.del<ApiResponseVoid>(`/resumes/${resumeId}`)
46+
}

apis/types/common-types.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
export interface ApiResponseVoid {
2+
isSuccess?: boolean
3+
code?: string
4+
message?: string
5+
result?: void
6+
}
7+
8+
export interface ApiErrorResponse {
9+
isSuccess?: boolean
10+
code?: string
11+
message?: string
12+
result?: string
13+
}

apis/types/interview-types.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ export interface InterviewCreateDTO {
2727
coverLetterId: number
2828
coverLetterTitle?: string
2929
inviteEmailDTOList?: InviteEmailDTO[]
30+
noticeUrl?: string
3031
}
3132

3233
export interface InviteEmailDTO {
@@ -180,6 +181,7 @@ export interface GroupInterviewDetailDTO {
180181
maxParticipants?: number
181182
currentParticipants?: number
182183
startedAt?: string
184+
noticeUrl?: string
183185
hostName?: string
184186
groupInterviewParticipants?: GroupInterviewParticipantDTO[]
185187
}
@@ -210,6 +212,7 @@ export interface InterviewDTO {
210212
interviewId?: number
211213
corporateName?: string
212214
jobName?: string
215+
noticeUrl?: string
213216
startType?: 'NOW' | 'SCHEDULED'
214217
participantCount?: number
215218
}

app/providers.tsx

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ import { ReactNode, useState } from 'react'
44
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
55
import { ReactQueryDevtools } from '@tanstack/react-query-devtools'
66
import { MemberSessionProvider } from '../components/member-session-context'
7+
import { ApiError } from '@/utils/error/error'
8+
import { errorToast } from '@/utils/error/errorToast'
9+
import { toast } from 'sonner'
710

811
export default function Providers({ children }: { children: ReactNode }) {
912
// 한 번만 생성되는 QueryClient
@@ -14,6 +17,15 @@ export default function Providers({ children }: { children: ReactNode }) {
1417
queries: {
1518
retry: false,
1619
},
20+
mutations: {
21+
onError: error => {
22+
if (error instanceof ApiError) {
23+
errorToast(error)
24+
} else {
25+
toast.error(error.message ?? '에러가 발생했습니다.')
26+
}
27+
},
28+
},
1729
},
1830
})
1931
)

app/workspace/interviews/group/community/[id]/join/page.tsx

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -94,9 +94,6 @@ export default function JoinGroupInterviewPage({
9494
)
9595
window.location.href = `/workspace/interview/group/community/${postId}`
9696
},
97-
onError: (err: any) => {
98-
alert(err?.message || '면접 참여 신청에 실패했습니다.')
99-
},
10097
})
10198

10299
// 에러/호스트 본인 체크 후 뒤로 이동 처리

app/workspace/interviews/group/community/[id]/page.tsx

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ export default function InterviewPostDetailPage({
3737

3838
// 로그인 유저 정보
3939
const { memberId } = useMemberSession()
40-
// 호스트 판별: hostName(닉네임/이름) 비교만 사용
40+
4141
const isHost = !!(
4242
memberId &&
4343
post &&
@@ -211,6 +211,14 @@ export default function InterviewPostDetailPage({
211211
</p>
212212
</div>
213213
)}
214+
{post.noticeUrl && (
215+
<div className="pt-4 border-t">
216+
<h3 className="font-medium mb-2">모집 공고</h3>
217+
<p className="text-gray-600 whitespace-pre-line">
218+
{post.noticeUrl}
219+
</p>
220+
</div>
221+
)}
214222
</CardContent>
215223
<CardFooter className="flex justify-between border-t pt-6">
216224
<Button

0 commit comments

Comments
 (0)