o
    i8                     @   s  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ejgd
 eeZej	ej	ej	ej	eZ ej	!e dZ"ej	#e"ree"dd e$dd% Z&e&dkrej	!e dZ'nej	!e dZ'ej	#e'ree'dd e(de& de'  ne)de'  ne)de" d e  eeej	!ej	eddZ*e*j+,e$ddde$dde$dd e$dd e$d!d"d#ed$d%dd&d'
 dd(l-m.Z. e.j/ree*g d)dd* n	ee*d+d,gdd* e0e* e1e* dd-l2m3Z3 e34e* 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ZrdEdFddGdHddIddJdKdLdMdGdHdNdOddJdPdQdRdGdHdNdSddJdTdUdVdGdHdNdWddJdKdLdXdGdYdNdOddJdPdQdZdGdYdNdSddJdTdUd[dGdYdNdWddJgZserD ]\ZtZue*jveteud\ qXdd]lwmxZxmyZy dd^lzm{Z{ e*|e{d_d` Z}e*~dadbdc Zex  eyeZe*j~ddded"idfe*~dgdeefdhdiZddkdlZz!ddmlmZ e*j+dn ZeeZe Ze  e(doe  W n ey Z zedpe  W Y dZ[ndZ[ww zddlZe*j+dq ZejeZe  e(dre  W n  ey! Z ze)dse  e(dt W Y dZ[ndZ[ww e*~dudvdw Ze$dxZes=e&dkr;dyZndzZej	#esMe)d{e  ne(d|e  e*j+d dkrbe)d} e*j+d!sne)d~ ejdZes{eddd Zedkre  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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                 C   s   t ddidfS )u"   요청 크기 초과 에러 처리errorup   요청 크기가 너무 큽니다. 파일 크기를 줄이거나 파일 개수를 줄여주세요. (최대 50MB)i  )r   )e rg   ;/home/kdj-ubuntu1/mlink_AI_Server/mlink-backend/src/main.pyhandle_request_entity_too_large   s
   ri   z/healthc                   C      t dt  ddfS )u   헬스체크 엔드포인트healthy)status	timestamp   r   r   now	isoformatrg   rg   rg   rh   health_check   s   rr   /path)defaultsz/<path:path>c                 C   sn   |  drtddd tjtj| }| r!tj|r!ttj| S zt	dW S  t
y6   tdd Y dS w )u+   정적 파일 서빙 - API 경로는 제외zapi/i  zAPI endpoint not found)rU   z
index.htmlzindex.html not foundN)
startswithr	   osrt   joinappr   existsr   send_static_fileFileNotFoundError)rt   	full_pathrg   rg   rh   serve_static   s   
r~   returnc               
   C   s   z5t   td tj s.tD ]} tdi | }t j	| qt j
  td W dS td W dS  tyJ } z	td|   d}~ww )u8   데이터베이스 초기화 및 초기 데이터 생성u.   ✅ 데이터베이스 테이블 생성 완료u)   ✅ 초기 상품 데이터 생성 완료u2   ℹ️ 상품 데이터가 이미 존재합니다.u)   ❌ 데이터베이스 초기화 실패: Nrg   )r)   
create_allloggerinfor+   queryfirstINITIAL_PRODUCTSsessionaddcommit	Exceptionre   )product_dataproductrf   rg   rg   rh   initialize_database  s   


r   )create_enginer   u   DB 연결 성공: u   DB 연결 실패: r    u   Redis 연결 성공: u!   Redis 연결 실패 (선택적): u:   Redis 없이 애플리케이션을 계속 실행합니다.z	/api/testc                   C   rj   )Nu   API 정상 동작)messagerm   rn   ro   rg   rg   rg   rh   api_test;  s   r   OUTPUT_PATHz/home/ubuntu/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               
   C   s   zBt jddd t  t  t jddd W d   n1 s!w   Y  t jddd	d
d ttdd	} tjd| ddd W dS  t	yg } zt j
d| dt|d td W Y d}~dS d}~ww )u   메인 실행 함수u"   MLink AI 애플리케이션 시작	app_start)
event_typeu#   데이터베이스 초기화 완료db_initNu   서버 시작z0.0.0.0iJ  server_start)hostportr   	BACK_PORTTF)r   r   debuguse_reloaderu"   애플리케이션 시작 실패: app_start_failed)r   re      )r   r   ry   app_contextr   intrw   getenvrunr   re   strsysexit)r   rf   rg   rg   rh   mainU  s   
r   __main__)r   N)__doc__rw   r   loggingr   r   typingr   r   rt   insertdirname__file__flaskr   r   r   r	   
flask_corsr
   dotenvr   src.config.securityr   basicConfigINFOStreamHandlerstdout	getLogger__name__r   abspathproject_rootrx   main_env_filerz   r   lowerenvironmentenv_filer   warningry   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.   r/   src.models.postr0   r1   src.models.chatr2   r3   r4   src.models.snsr5   r6   r7   r8   src.models.downloadr9   r:   src.models.gif_feedbackr;   r<   src.models.creditr=   r>   r?   r@   src.celery_apprA   rB   src.routes.authrC   src.routes.subscriptionrD   src.routes.chatbotrE   rF   src.routes.postrG   src.routes.chatrH   src.routes.snsrI   src.routes.downloadrJ   src.routes.feedbackrK   src.routes.commonrL   src.routes.payments_v2rM   src.routes.portone_webhookrN   src.routes.gifrO   src.routes.userrP   
BLUEPRINTSr   	blueprintra   register_blueprintsrc.config.logging_configrb   rc   werkzeug.exceptionsrd   errorhandlerri   routerr   setup_loggingr   r~   r   
sqlalchemyr   db_urlengineconnectconncloser   rf   re   redis	redis_urlRedisfrom_urlrpingr   output_pathgetenvironr   RuntimeErrorr   rg   rg   rg   rh   <module>   s  
$








K











