
    }xjd                    
   d dl mZ d dlZd dlmZ d dlmZmZ d dlm	Z	 d dl
mZ d dlmZ d dlmZ d d	lmZmZmZmZmZmZmZmZmZmZmZmZmZ d d
lmZm Z m!Z!m"Z" g dZ#h dZ$ddhZ%dZ&ddZ'dd dZ(ddd!dZ) e)            Z*dS )"    )annotationsN)urlparse)FastAPIRequest)$request_validation_exception_handler)RequestValidationError)CORSMiddleware)JSONResponse)budgetcashcryptocrypto_traderequityhealthmarketoverview	positionspostfinancereportssystem
truewealth)WRITE_METHODSis_local_requestis_write_request_allowedresolve_write_mode)zhttp://localhost:5173zhttp://127.0.0.1:5173zhttp://100.85.29.67:5173z#http://agent.tailbd371b.ts.net:5173zhttp://localhost:8503zhttp://127.0.0.1:8503>   /api/portfolio/policy/preview/api/truewealth/imports/preview /api/portfolio/ingestion/preview%/api/truewealth/manual-values/preview*/api/budget/household/review/items/preview,/api/crypto/reconciliation/snapshots/preview,/api/crypto/reconciliation/transfers/preview3/api/budget/household/transactions/category/preview3/api/portfolio/performance/reclassification/preview7/api/portfolio/performance/truewealth-cashflows/preview;/api/portfolio/performance/truewealth-bank-payments/preview@/api/portfolio/performance/truewealth/activation-package-preview /api/postfinance/imports/preview(/api/market/equity/update-quotes/dry-runr(   z /api/postfinance/imports/confirmi originstrreturnboolc                    t          |           }|j        dk    s|j        r|j        sdS |j                                        }|dv rdS |                    d          rdS |                    d          rdS dS )NhttpF>   	127.0.0.1	localhostTz100.z.ts.net)r   schemehostnameportlower
startswithendswith)r*   parsedr3   s      V/home/agent/.hermes/worktrees/FinanceManager-sprint20h1/src/jarvis_finance/api/main.py_is_safe_local_originr:   .   s    fF}foV[u$$&&H---t6"" t## t5    environdict[str, str] | None	list[str]c                D   | pt           j        }t          t                    }|                    dd                              d          D ]S}|                                                    d          }|r(t          |          r||vr|	                    |           T|S )NJARVIS_FINANCE_CORS_ORIGINS ,/)
osr<   listLOCAL_ORIGINSgetsplitstriprstripr:   append)r<   envorigins
raw_originr*   s        r9   build_local_originsrO   <   s    

RZC=!!Ggg;R@@FFsKK # #
!!##**3// 	#+F33 	#g8M8MNN6"""Nr;   )
write_moderP   
str | Noner   c                   t          |           t          ddd          }|                    t          t	                      ddk    rddgng d	d
g           |                    t                    dd            }|                    d          dfd            }|j        _	        t          j        t          j        t          j        t          j        t          j        t           j        t"          j        t$          j        t&          j        t(          j        t*          j        t,          j        t.          j        fD ]}|                    |d           |S )NzJARVIS Finance APIz0.1.0z@Read-only FastAPI v0 skeleton for the future Vue User Dashboard.)titleversiondescriptionFdisabledGETPOST)rW   rX   PUTPATCHDELETE*)allow_originsallow_credentialsallow_methodsallow_headersrequestr   excr   c                   K   | j         j                            d          rGd |                                D             }|ddhz  rd}n|ddhz  rd}nd	}t	          d
d|i          S t          | |           d {V S )Nz/api/postfinance/imports/c                `    h | ]+}t          |                    d d          d                   ,S )loc)rA   )r+   rG   ).0errors     r9   	<setcomp>zCcreate_app.<locals>.safe_upload_validation_error.<locals>.<setcomp>X   s3    QQQ5c%))E511"566QQQr;   zip_file_namezip_mime_typeu4   Bitte ein unterstütztes PostFinance-ZIP auswählen.overview_file_nameoverview_mime_typeu=   Bitte eine offizielle Portfolioübersicht als PDF auswählen.uE   Eine Datei ist leer, zu gross oder unvollständig übertragen worden.i  detailstatus_codecontent)urlpathr6   errorsr
   r   )ra   rb   fieldsrn   s       r9   safe_upload_validation_errorz0create_app.<locals>.safe_upload_validation_errorU   s      ;&&'BCC 	MQQCJJLLQQQF/:: aO/1EFF aX`C(F9KLLLL9'3GGGGGGGGGr;   r/   c                6  K   | j         dk    rm| j        j        t          v rZ| j                            dd          }|                                r+t          |          t          k    rt          dddi          S | j         dk    o| j        j        t          v }| j         dk    r2| j        j        dk    r"t          |           st          d	dd
i          S | j         t          v r%|s#t          |           st          d	ddi          S  ||            d {V S )NrX   zcontent-lengthrA   i  rn   u7   Upload ist grösser als das sichere Verarbeitungslimit.ro   r)   i  local_request_requiredwrite_operations_disabled)methodrr   rs   POSTFINANCE_UPLOAD_PATHSheadersrG   isdigitintMAX_POSTFINANCE_REQUEST_BYTESr
   READ_ONLY_POST_PATHSr   r   r   )ra   	call_next
raw_lengthread_only_postactive_write_modes       r9   block_untrusted_writesz*create_app.<locals>.block_untrusted_writesb   sR     >V##(8<T(T(T ,,-=rBBJ!!## J:W(W(W# #%'`a    !61^gk6FJ^6^>V##(8<f(f(fo  AH  pI  pI(fC(D\9]^^^^>]**>*Jbcjl}J~J~*C(D_9`aaaaYw'''''''''r;   z/api)prefix)ra   r   rb   r   )ra   r   )r   r   add_middlewarer	   rO   exception_handlerr   
middlewarestaterP   r   routerr   r   r   r   r   r   r   r   r   r   r   r   include_router)rP   apprv   r   r   r   s        @r9   
create_appr   F   s   *:66
"V  C
 )++):j)H)HufooNwNwNwe     	122
H 
H 
H 32
H 	^^F( ( ( ( ( ( -CI=(/6=-BVX^Xegkgrt{  uC  EN  EU  W]  Wd  fl  fs  u{  uB  DN  DU  Wb  Wi  j 2 26&1111Jr;   )r*   r+   r,   r-   )N)r<   r=   r,   r>   )rP   rQ   r,   r   )+
__future__r   rD   urllib.parser   fastapir   r   fastapi.exception_handlersr   fastapi.exceptionsr   fastapi.middleware.corsr	   fastapi.responsesr
   jarvis_finance.api.routersr   r   r   r   r   r   r   r   r   r   r   r   r   jarvis_finance.api.securityr   r   r   r   rF   r   r{   r   r:   rO   r   r    r;   r9   <module>r      s   " " " " " " 				 ! ! ! ! ! ! $ $ $ $ $ $ $ $ K K K K K K 5 5 5 5 5 5 2 2 2 2 2 2 * * * * * * b  b  b  b  b  b  b  b  b  b  b  b  b  b  b  b  b  b  b  b  b  b  b  b  b  b  b  b  b  b u u u u u u u u u u u u     " '&  !+         ,0 / / / / / /d jllr;   