@@ -314,5 +314,95 @@ export const RequestService = {
314314 timeline : timeline ,
315315 formData : formData
316316 } ;
317+ } ,
318+
319+ /**
320+ * 제출된 신청서 조회
321+ */
322+ async getSubmittedRequestForm ( userId , dto ) {
323+ const { requestId } = dto ;
324+
325+ // Request 존재 여부 및 권한 확인
326+ const request = await RequestRepository . findSubmittedRequestById ( requestId ) ;
327+ if ( ! request ) {
328+ throw new RequestNotFoundError ( { requestId } ) ;
329+ }
330+
331+ // 본인 신청서인지 확인
332+ if ( request . userId !== BigInt ( userId ) ) {
333+ throw new UnauthorizedRequestStatusChangeError ( { userId, requestId } ) ;
334+ }
335+
336+ // 참고 이미지 조회
337+ const images = await RequestRepository . findImagesByRequestId ( requestId ) ;
338+
339+ // formSchema와 formAnswer 처리
340+ const customFields = request . commission . formSchema ?. fields || [ ] ;
341+ const defaultFields = [
342+ {
343+ id : ( customFields . length + 1 ) . toString ( ) ,
344+ type : "textarea" ,
345+ label : "신청 내용"
346+ } ,
347+ {
348+ id : ( customFields . length + 2 ) . toString ( ) ,
349+ type : "file" ,
350+ label : "참고 이미지"
351+ }
352+ ] ;
353+ const allFields = [ ...customFields , ...defaultFields ] ;
354+
355+ // formResponses 구성 (커스텀 필드만)
356+ const formResponses = [ ] ;
357+ for ( const field of customFields ) {
358+ const answer = request . formAnswer [ field . id ] ;
359+ let answerLabel = null ;
360+
361+ if ( field . type === 'radio' && field . options ) {
362+ const selectedOption = field . options . find ( option => option . value === answer ) ;
363+ answerLabel = selectedOption ? selectedOption . label : null ;
364+ }
365+
366+ formResponses . push ( {
367+ questionId : field . id ,
368+ questionLabel : field . label ,
369+ answer : answerLabel
370+ } ) ;
371+ }
372+
373+ // requestContent 구성 (기본 필드들)
374+ const textFieldId = ( customFields . length + 1 ) . toString ( ) ;
375+ const fileFieldId = ( customFields . length + 2 ) . toString ( ) ;
376+
377+ const requestContent = {
378+ text : request . formAnswer [ textFieldId ] || null ,
379+ images : images . map ( img => ( {
380+ id : img . id ,
381+ imageUrl : img . imageUrl ,
382+ orderIndex : img . orderIndex
383+ } ) )
384+ } ;
385+
386+ // displayTime 계산
387+ const displayTime = request . status === 'CANCELED'
388+ ? request . updatedAt . toISOString ( )
389+ : request . createdAt . toISOString ( ) ;
390+
391+ return {
392+ requestId : request . id ,
393+ status : request . status ,
394+ displayTime : displayTime ,
395+ commission : {
396+ id : request . commission . id ,
397+ title : request . commission . title
398+ } ,
399+ artist : {
400+ id : request . commission . artist . id ,
401+ nickname : request . commission . artist . nickname ,
402+ profileImageUrl : request . commission . artist . profileImage
403+ } ,
404+ formResponses : formResponses ,
405+ requestContent : requestContent
406+ } ;
317407 }
318408} ;
0 commit comments