
    vi                     t   d Z ddlZddlZddlmZmZmZmZ ddl	m
Z
mZ ddlmZmZ  eddg          Zd	 Zd
ededefdZdedefdZe                    d           edd           edd          fdedefd            Ze                    d           edd          fd
ededefd            ZdS )u   
매뉴얼(C파트) REST API 라우터
- GET /manual/list?title=NDA&session_id=xxx  → 매뉴얼 목록 반환
- GET /manual/media/{path:path}?session_id=xxx → 파일 서빙 (인증 포함)
    N)	APIRouterHTTPExceptionQueryRequest)FileResponseStreamingResponse)C_DB_CONFIGBACK_DIR Manual)prefixtagsc                  8    t          j        j        di t          S )N )mysql	connectorconnectr	   r       !/app/app/routers/manual_router.py_get_cdbr      s    ?"11[111r   request	file_pathcontent_typec                 z  
 t          j                  j        }| j                            d          }|dt          |          d}d|dz
  }d}||                                                                                    dd          	                    d	          }|d         rt          |d                   t          |          dk    r|d         rt          |d                   }|z
  dz   
t          
          |d
<   d d	| d| |d<   d}n|

fd}	t           |	            ||          S )Nrangebytes)zcontent-typezaccept-rangescontent-lengthr         zbytes=r   -r   zbytes /zcontent-range   c               3      K   t          d          5 } |                                }d}|dk    rB|                     t          ||                    }|sn|t	          |          z  }|V  |dk    Bd d d            d S # 1 swxY w Y   d S )Nrbi   r   )openseekreadminlen)f	remaining
chunk_sizedatachunk_lengthr   starts       r   iterfilez)range_requests_response.<locals>.iterfile5   s      )T"" 		aFF5MMM$I$Ja--vvc*i8899 SYY&	


 a--			 		 		 		 		 		 		 		 		 		 		 		 		 		 		 		 		 		s   A"BB
B)status_codeheaders)osstatst_sizer2   getstrstriplowerreplacesplitintr)   r   )r   r   r   	file_sizerange_headerr2   endr1   range_matchr0   r.   r/   s    `        @@r   range_requests_responserA      sw   	""*I?&&w//L % i.. G E
a-CK"((**0022::8RHHNNsSSq> 	(A''E{aKNk!n%%CU{Q$'$5$5 !#EE#E#EC#E#E)#E#E  
 
 
 
 
 
 
 XXZZ['RRRRr   
session_idreturnc                 H    t          | o|                                           S )u   
    세션 ID 유효성 검사.
    chat_log_DB 또는 Goalskill_DB 등 기존 세션 관리 DB에서 확인.
    현재는 단순히 "비어있지 않으면 허용" 방식 (추후 강화 가능).
    )boolr8   )rB   s    r   _validate_sessionrF   D   s#     
1z//11222r   z/listNDAu   매뉴얼 타이틀 (예: NDA))defaultdescription.u   세션 ID (로그인 확인용))rI   titlec                   K   t          |          st          dd          	 t                      }|                    d          }|                    d| f           |                                }|                                 |                                 d| t          |          |dS # t          $ r&}t          d	d
t          |                     d}~ww xY w)ud   
    C_DB.manual 테이블에서 title 기준으로 sortorder 순 데이터를 반환합니다.
      Unauthorized: invalid sessionr1   detailT)
dictionaryz
            SELECT id, title, media_type, img_path, logo_path, slide_label, sort_order
            FROM manual
            WHERE title = %s
            ORDER BY sort_order ASC
            success)statusrJ   totalitemsi  z
DB error: N)
rF   r   r   cursorexecutefetchallcloser)   	Exceptionr7   )rJ   rB   connrU   rowses         r   get_manual_listr]   P   s      Z(( U4STTTTKzz-- H	
 	
 	
   

  YY	
 
 	
  K K K4IQ4I4IJJJJKs   B
B/ /
C9!CCz/media/{file_path:path}u   세션 ID (인증용)c           	      2  K   t          |          st          dd          d|v s|                    d          rt          dd          t          j                            t          j                            t          |                    }|                    t          j                            t                              st          dd          t          j                            |          st          d	d
|           t          j        	                    |          d         
                                }ddddddddd}|                    |d          }|                    d          rt          | ||          S t          ||          S )u   
    back/img/menual/NDA/ 등의 파일을 인증된 사용자에게만 반환합니다.
    직접 URL 접근은 불가능하고 반드시 이 API를 통해야 합니다.

    예) GET /manual/media/img/menual/NDA/1-0.png?session_id=abc123
    rL   rM   rN   z..r!   i  zInvalid file pathz Access denied: path out of scopei  zFile not found: r   z	image/pngz
image/jpegz	image/gifz
image/webpz	video/mp4z
video/webmzvideo/quicktime)z.pngz.jpgz.jpegz.gifz.webpz.mp4z.webmz.movzapplication/octet-streamzvideo/)
media_type)rF   r   
startswithr3   pathnormpathjoinr
   isfilesplitextr9   r6   rA   r   )r   r   rB   abs_pathextmedia_type_mapr_   s          r   serve_manual_mediari   x   s      Z(( U4STTTT yI00554GHHHH wXy A ABBH rw//99:: X4VWWWW7>>(## T4Ry4R4RSSSS '

8
$
$Q
'
-
-
/
/C!	 	N  ##C)CDDJX&& F&w*EEEZ8888r   )__doc__r3   mysql.connectorr   fastapir   r   r   r   fastapi.responsesr   r   app.core.configr	   r
   routerr   r7   rA   rE   rF   r6   r]   ri   r   r   r   <module>rp      s   
 
			     < < < < < < < < < < < < = = = = = = = = 1 1 1 1 1 1 1 1	"H:	.	.	.
2 2 2(SW (S (SC (S (S (S (SV3# 3$ 3 3 3 3 Gu2RSSSeC-NOOO!K !K!K!K !K !K !KN %&& eC-DEEE-9 -9-9-9 -9 -9 -9 '&-9 -9 -9r   