
    Ncil;                        d Z ddlZddlZddlZddlmZmZ ddlmZmZ ej	        
                    dej	                            ej	                            e                               ddlmZmZmZmZ ddlmZ ddlmZ ddlmZ  ej        ej        d	 ej        ej                  g
            ej        e          Zej	                            ej	                            ej	                            ej	                            e                                        Z ej	        !                    e d          Z"ej	        #                    e"          r ee"d            ej$        dd          %                                Z&e&dk    rej	        !                    e d          Z'nej	        !                    e d          Z'ej	        #                    e'          r) ee'd           e(                    de& de'            n<e)                    de'            n#e)                    de" d            e              eeej	        !                    ej	                            e          d                    Z*e*j+        ,                     ej$        dd          d ej$        dd           ej$        dd            ej$        dd            ej$        d!d"          d# ed$%          dd&d'
           dd(l-m.Z. e.j/        r ee*g d)d*           n ee*d+d,gd*            ej0        e*            ej1        e*           dd-l2m3Z3  e3j4        e*           dd.l5m6Z6 dd/l7m8Z8m9Z9m:Z:m;Z;m<Z< dd0l=m>Z>m?Z? dd1l@mAZAmBZBmCZC dd2lDmEZEmFZFmGZGmHZH dd3lImJZJmKZK dd4lLmMZMmNZN dd5lOmPZPmQZQmRZRmSZS dd6lTmUZUmVZV  eVe*          ZUdd7lWmXZX dd8lYmZZZ dd9l[m\Z\ dd:l[m]Z] dd;l^m_Z_ dd<l`maZa dd=lbmcZc dd>ldmeZe dd?lfmgZg dd@lhmiZi ddAljmkZk ddBllmmZm ddClnmoZo ddDlpmqZq e_d"fead"fecd"feZd"feed"feXd"fe\d"fe]d"fegd"feid"fekd"femd"feod"feqd"fgZrddElsmtZtmuZumvZvmwZw  eter          Zr ev            re)                    dF           ne(                    dGew           dHdIddJdKddLddMdNdOdPdJdKdQdRddMdSdTdUdJdKdQdVddMdWdXdYdJdKdQdZddMdNdOd[dJd\dQdRddMdSdTd]dJd\dQdVddMdWdXd^dJd\dQdZddMgZxerD ]\  ZyZze*{                    eyez_           dd`l|m}Z}m~Z~ ddalmZ e*                    e          db             Ze*                    dc          dd             Z e}j                      e~e          Ze*                    dedfd"ig          e*                    dh          dfefdi                        ZddkZ eu            r	 ddllmZ e*j+        dm         Z ee          Ze                                Ze                                 e(                    dne            n?# e$ r"Ze                    doe            Y dZ[ndZ[ww xY we(                    dp           	 ddlZe*j+        dq         Zej                            e          Ze                                 e(                    dre            n?# e$ r7Ze)                    dse            e(                    dt           Y dZ[ndZ[ww xY we*                    du          dv             Z ej$        dw          Zese&dk    rdxZndyZej	        #                    e          se)                    dze            ne(                    d{e            e*j+        d         dk    re)                    d|           e*j+                            d!          se)                    d}           ej                            d~          Z eu            res ed          d Zedk    r e             dS dS )u=   
MLink Backend Application
Flask 기반 백엔드 API 서버
    N)datetime	timedelta)DictAny)Flasksend_from_directoryjsonifyabort)CORS)load_dotenv)SecurityConfigz'%(asctime)s [%(levelname)s] %(message)s)levelformathandlersz.envF)overrideENVIRONMENTdevelopment
productionz.env.productionz.env.developmentTu   환경: u   , 환경 변수 파일 로드: u+   환경 변수 파일을 찾을 수 없음: u2   메인 환경 변수 파일을 찾을 수 없음: u"   , 기본 .env 파일 로드 시도static)static_folderDATABASE_URLz>mysql+pymysql://mlink_user:1111@dw.kdjsystem.com:3306/mlink_db
SECRET_KEYzyour-secret-key-here	REDIS_URLzredis://localhost:6379/0JWT_SECRET_KEY i      )hoursLax)
SQLALCHEMY_DATABASE_URISQLALCHEMY_TRACK_MODIFICATIONSr   CELERY_BROKER_URLCELERY_RESULT_BACKENDr   MAX_CONTENT_LENGTHPERMANENT_SESSION_LIFETIMESESSION_COOKIE_HTTPONLYSESSION_COOKIE_SAMESITE)env)zhttp://localhost:3000zhttp://localhost:3001zhttp://127.0.0.1:3000zhttp://127.0.0.1:3001)originssupports_credentialszhttps://mlink.sellmall.co.kr zhttps://sellmall.co.kr )db)User)ProductSubscriptionPaymentSubscriptionStatusPaymentStatus)PostComment)ChatRoomChatMessageChatParticipant)SnsPostSnsLike
SnsCommentFollow)DownloadFileDownloadLog)GifFeedbackGifUsage)CreditTransactionCreditBalance
CreditTypeEventCreditLot)celeryinit_celery_with_app)auth_bp)subscription_bp)
chatbot_bp)chatbot_bp2)post_bp)chat_bp)sns_bp)download_bp)feedback_bp)	common_bp)payments_v2_bp)portone_webhook_bp)gif_bp)user_bp)filter_blueprintsis_server_roleis_local_roleMLINK_APP_ROLEu   MLINK_APP_ROLE=local: 인증/구독/결제 등 DB API 블루프린트는 비활성입니다. 프론트는 Vite proxy(VITE_API_PROXY_TARGET)로 원격 서버 API를 사용하세요.u7   MLINK_APP_ROLE=%s — 전체 API 블루프린트 등록Freeu   무료 플랜KRWmonthlyuA   ["매일 300 갱신 크레딧 제공", "엠링크 기본 기능"])namedescriptionpricecurrencybilling_cycle
trial_daysfeatures	is_activeBasicu%   개인 셀러를 위한 기본 플랜iHq     u   ["매일 300 갱신 크레딧 제공", "매월 1,900 크레딧 자세히 알아보기", "매달 +1,900 추가 크레딧 제공 한정 제안", "엠링크 기본 기능", "엘림 기본 기능", "기본 고객지원"]Plusu*   성장하는 비즈니스를 위한 플랜ix  u  ["매일 300 갱신 크레딧 제공", "매월 3,900 크레딧 자세히 알아보기", "매달 +3,900 추가 크레딧 제공 한정 제안", "엠링크 모든 기능", "엘림 고급 기능", "우선 고객지원", "자동화 스케쥴러", "상세 분석 리포트"]Prou1   대규모 비즈니스를 위한 최고급 플랜i uz  ["매일 300 갱신 크레딧 제공", "매월 19,900 크레딧 자세히 알아보기", "매달 +19,900 추가 크레딧 제공 한정 제안", "엠링크 모든 기능 + 추가 기능", "엘림 프리미엄 기능", "PC2대 동시 작업", "전담 고객지원", "고급 자동화 기능", "AI 접근 권한", "맞춤형 분석 대시보드", "베타 기능 얼리 액세스"]iHh yearlyix i )
url_prefix)LoggingConfigStructuredLogger)RequestEntityTooLargec                 (    t          ddi          dfS )u"   요청 크기 초과 에러 처리errorup   요청 크기가 너무 큽니다. 파일 크기를 줄이거나 파일 개수를 줄여주세요. (최대 50MB)i  )r	   )es    A/var/www/html/web/mlink/mlink_AI_Server/mlink-backend/src/main.pyhandle_request_entity_too_largern      s,       D       z/healthc                  p    t          dt          j                                                    d          dfS )u   헬스체크 엔드포인트healthy)status	timestamp   r	   r   now	isoformat ro   rm   health_checkry      s2     ihlnn6N6N6P6PQQRRTWWWro   /path)defaultsz/<path:path>c                    |                      d          rt          dd           t          j                            t
          j        |           }| r9t          j                            |          rt          t
          j        |           S 	 t
          	                    d          S # t          $ r t          dd           Y dS w xY w)u+   정적 파일 서빙 - API 경로는 제외zapi/i  zAPI endpoint not found)rZ   z
index.htmlzindex.html not foundN)
startswithr
   osr{   joinappr   existsr   send_static_fileFileNotFoundError)r{   	full_paths     rm   serve_staticr     s    
 v 9c78888 S.55I <y)) <"3#4d;;;+##L111 + + +c)******+s   B' 'CCreturnc                     	 t          j                     t                              d           t          j                                        sot          D ]-} t	          di | }t           j        	                    |           .t           j        
                                 t                              d           dS t                              d           dS # t          $ r#}t                              d|             d}~ww xY w)u8   데이터베이스 초기화 및 초기 데이터 생성u.   ✅ 데이터베이스 테이블 생성 완료u)   ✅ 초기 상품 데이터 생성 완료u2   ℹ️ 상품 데이터가 이미 존재합니다.u)   ❌ 데이터베이스 초기화 실패: Nrx   )r*   
create_allloggerinfor,   queryfirstINITIAL_PRODUCTSsessionaddcommit	Exceptionrk   )product_dataproductrl   s      rm   initialize_databaser     s    
DEEE }""$$ 	N 0 ( (!11L11
w''''JKKCDDDDDKKLMMMMM   DDDEEEs   B8C <C 
D"D  D)create_enginer   u   DB 연결 성공: u   DB 연결 실패: u=   MLINK_APP_ROLE=local — DATABASE_URL 연결 테스트 생략r!   u   Redis 연결 성공: u!   Redis 연결 실패 (선택적): u:   Redis 없이 애플리케이션을 계속 실행합니다.z	/api/testc                  p    t          dt          j                                                    d          dfS )Nu   API 정상 동작)messagers   rt   ru   rx   ro   rm   api_testr   H  s1    2AYAYA[A[\\]]_bbbro   OUTPUT_PATHz../../output_final0922z"/home/kdj-ubuntu1/output_final0922u6   output_final0922 경로가 존재하지 않습니다: u    output_final0922 경로 확인: uS   SECRET_KEY가 기본값입니다. 운영 환경에서는 반드시 변경하세요.u/   JWT_SECRET_KEY가 설정되지 않았습니다.TOSS_API_KEYu.   TOSS_API_KEY 환경 변수가 필요합니다.c                     	 t                               dd           t                                          5  t	                      r+t                       t                               dd           nt                               dd           ddd           n# 1 swxY w Y   t                               d	d
dd           t          t          j        dd                    } t          	                    d
| dd           dS # t          $ rL}t                               d| dt          |                     t          j        d           Y d}~dS d}~ww xY w)u   메인 실행 함수u"   MLink AI 애플리케이션 시작	app_start)
event_typeu#   데이터베이스 초기화 완료db_initu3   MLINK_APP_ROLE=local — initialize_database 생략db_init_skippedNu   서버 시작z0.0.0.0iJ  server_start)hostportr   	BACK_PORTTF)r   r   debuguse_reloaderu"   애플리케이션 시작 실패: app_start_failed)r   rk      )r   r   r   app_contextrS   r   intr   getenvrunr   rk   strsysexit)r   rl   s     rm   mainr   b  s   8[QQQ__ 	q 	q q#%%%AiXXXXQ^oppp	q 	q 	q 	q 	q 	q 	q 	q 	q 	q 	q 	q 	q 	q 	q 	O)$>ZZZ29[$//00YTEJJJJJ   =!==J\dghidjdjkkks=   5D ABD BD  B!A!D 
EAEE__main__)r   N)__doc__r   r   loggingr   r   typingr   r   r{   insertdirname__file__flaskr   r   r	   r
   
flask_corsr   dotenvr   src.config.securityr   basicConfigINFOStreamHandlerstdout	getLogger__name__r   abspathproject_rootr   main_env_filer   r   lowerenvironmentenv_filer   warningr   configupdatesrc.config.env_loaderr'   is_developmentconfigure_corsconfigure_security_headerssrc.models.dbr*   init_appsrc.models.userr+   src.models.subscriptionr,   r-   r.   r/   r0   src.models.postr1   r2   src.models.chatr3   r4   r5   src.models.snsr6   r7   r8   r9   src.models.downloadr:   r;   src.models.gif_feedbackr<   r=   src.models.creditr>   r?   r@   rA   src.celery_apprB   rC   src.routes.authrD   src.routes.subscriptionrE   src.routes.chatbotrF   rG   src.routes.postrH   src.routes.chatrI   src.routes.snsrJ   src.routes.downloadrK   src.routes.feedbackrL   src.routes.commonrM   src.routes.payments_v2rN   src.routes.portone_webhookrO   src.routes.gifrP   src.routes.userrQ   
BLUEPRINTSsrc.config.deploymentrR   rS   rT   rU   r   	blueprintrf   register_blueprintsrc.config.logging_configrg   rh   werkzeug.exceptionsri   errorhandlerrn   routery   setup_loggingr   r   r   
sqlalchemyr   db_urlengineconnectconncloser   rl   rk   redis	redis_urlRedisfrom_urlrpingr   output_pathgetenvironr   RuntimeErrorr   rx   ro   rm   <module>r      s   
 
			 



  ( ( ( ( ( ( ( (         27??27??8#<#<== > > > < < < < < < < < < < < <             . . . . . .  
,4#g#CJ//0   
 
	8	$	$ wrwrwrwx?X?X/Y/YZZ[[\6227>>-   K....")M=99??AAK l""7<<.?@@7<<.@AA 
w~~h QHt,,,,U{UU8UUVVVVOXOOPPPP
NNyyyyzzzKMMM eHBGLL1J1JH$U$UVVV 
  (ry9yzz&+")L*@AA";0JKK&RY{4NOObi 0"55*"+)""5"5"5#$      & % % % % %  "D   
 !" " " " " 	D'! !" " " "  c " " " ) )# . . .       C    !           e e e e e e e e e e e e e e ) ) ) ) ) ) ) ) B B B B B B B B B B ? ? ? ? ? ? ? ? ? ? ? ? 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 Z Z Z Z Z Z Z Z Z Z Z Z 8 7 7 7 7 7 7 7		c	"	" $ # # # # # 3 3 3 3 3 3 ) ) ) ) ) ) * * * * * * # # # # # # # # # # # # ! ! ! ! ! ! + + + + + + + + + + + + ' ' ' ' ' ' 1 1 1 1 1 1 9 9 9 9 9 9 ! ! ! ! ! ! # # # # # # bMbMRLb"bM""ORRLbM
" c b b b b b b b b b b bz**
=?? [
NN	b   
 KKI>ZZZ
 &"W	 	 >" o	 	 C" d	 	 J" Q	 	 >! o	 	 C! d	 	 J! Q	 	}H V ( = =Iz9<<<< E E E E E E E E 6 5 5 5 5 5'((  )( 9X X X      
	(	#	# 3&"&&>+s + + +  '&+$   . > Q/,,,,,,56v&&~~

1112222 / / /-!--......../ KKOPPP	NLLL
./IY''AFFHHH
KK3	334444 N N N
NN:q::;;;
KKLMMMMMMMMN
 ;c c c bi&& ;l"".:	w~~k"" B
NNYKYYZZZZ
KK@;@@AAA :l555
NNhiii
z~~&'' F
NNDEEEz~~n--> IL I
,G
H
HH  . zDFFFFF s2   +AX
 
X1X,,X1
AZ" "['-[[