Files
trading-daemon/dashboard/__pycache__/server.cpython-313.pyc

193 lines
18 KiB
Plaintext
Raw Normal View History

2026-01-27 13:08:14 +01:00
<EFBFBD>
e<>xi=G<00><00><><00>SSKJrJr SSKJr SSKJr SSKJr SSK r SSK
2026-01-27 13:08:14 +01:00
r
SSK r SSK J r JrJr \ R "\5r\"SS9r\R)\S /S /S /S
9 \R+S \"S S 9SS9 \R-S5S5r\
R0"SS5r\
R0"SS5r\(a \(a\\4OSr\
R0"SS5rS\S3rSGS\S\S\ \\\44Sjjr S\\\4S\\\44Sjr!\R-S 5SHS!\S"\4S#jj5r"\R-S$5S%5r#\R-S&5SIS"\4S'jj5r$\R-S(5SIS"\4S)jj5r%\R-S*5SJS,\S-\S.\S/\S0\S1\4 S2jj5r&\R-S35SKS"\S+\4S4jj5r'\R-S55SLS"\4S6jj5r(\R-S75SMS"\S8\4S9jj5r)\R-S:5SNS;\S0\S<\S,\S-\S=\S>\4S?jj5r*\R-S@5SA\4SBj5r+\SC:XaSSK,r,\,RZ"\SDSESF9 gg)O<>)<02>FastAPI<50> HTTPException)<01>CORSMiddleware)<01> StaticFiles<65><01> FileResponseN)<03>Optional<61>Dict<63>AnyzTrading Dashboard API)<01>title<6C>*)<03> allow_origins<6E> allow_methods<64> allow_headersz/staticzdashboard/public)<01> directory<72>static)<01>name<6D>/c<00><00> # <00>[S5$7f)Nzdashboard/public/index.htmlr<00><00><00>dashboard/server.py<70>
read_indexrs<00><00><00> <17>5<> 6<>6<>s<00> <01>DB_USER<45>admin<69> DB_PASSWORD<52>quest<73>DB_HOST<53>questdbzhttp://z:9000<30>query<72>timeout<75>returnc<00><><00>[R"[S3SU0[US9nURS:XaUR 5$[ URSUR3S9e![RRa [ SSS9e[RRan[ S S
2026-01-27 13:08:14 +01:00
[U53S9eS nAff=f) z!Zentrale QuestDB-Abfrage-Funktionz/execr )<03>params<6D>authr!<00><>zQuestDB error: <20><02> status_code<64>detaili<6C>zQuestDB query timeouti<74>zQuestDB connection error: N) <0C>requests<74>get<65>DB_URL<52>DB_AUTHr(<00>jsonr<00>text<78>
exceptions<EFBFBD>Timeout<75>RequestException<6F>str)r r!<00>response<73>es r<00> query_questdbr6$s<><00><00> [<01><1B><<3C><<3C>6<EFBFBD>(<28>%<25> 0<>'<27>5<EFBFBD>9I<39>PW<50>ah<61>i<><08> <13> <1F> <1F>3<EFBFBD> &<26><1B>=<3D>=<3D>?<3F> "<22><1F>H<EFBFBD>,@<40>,@<40>?<3F>[c<>[h<>[h<>Zi<5A>Ij<49>k<> k<><6B> <13> <1E> <1E> &<26> &<26>M<01><1B><03>4K<34>L<>L<> <13> <1E> <1E> /<2F> /<2F>[<01><1B><03>6P<36>QT<51>UV<55>QW<51>PX<50>4Y<34>Z<>Z<><5A>[<01>s<00>AA'<00>!A'<00>'AC<03>,C<03>C<03>datac<00><00>U(d//S.$U$)z/Einheitliche Formatierung der QuestDB-Antworten<65><02>columns<6E>datasetr)r7s r<00>format_questdb_responser<1s<00><00> <0F><1D>"<22>-<2D>-<2D> <0F>Krz /api/trades<65>isin<69>daysc<00><00>(# <00>U(a
SUSUS3nOSUS3n[U5nU(a5URS5(a[URS/55S:Xa&[R S5 S S
0S S 0S S 0S S 0//S.$[ U5$7f)u<>
2026-01-27 13:08:14 +01:00
Gibt aggregierte Analyse aller Trades zurück (nicht einzelne Trades).
Nutzt vorberechnete Daten aus analytics_exchange_daily.
z<EFBFBD>
select
date_trunc('day', timestamp) as date,
count(*) as trade_count,
sum(price * quantity) as volume,
avg(price) as avg_price
from trades
where isin = 'z('
and timestamp > dateadd('d', -zB, now())
group by date
order by date desc
z<>
select
timestamp as date,
exchange,
trade_count,
volume
from analytics_exchange_daily
where timestamp >= dateadd('d', -z:, now())
order by date desc, exchange asc
r;r<00>Oanalytics_exchange_daily is empty. Analytics worker should calculate this data.r<00>date<74>exchange<67> trade_count<6E>volumer9)r6r+<00>len<65>logger<65>warningr<)r=r>r r7s r<00>
get_tradesrH8s<><00><00><00>  <0C><17><1C>f<EFBFBD>'<27>'+<2B>f<EFBFBD>- <09>  <0C><05>*<2A>+/<2F><16>0 <09>  <0C><05> <19><15> <1F>D<EFBFBD> <10>t<EFBFBD>x<EFBFBD>x<EFBFBD> <09>*<2A>*<2A>c<EFBFBD>$<24>(<28>(<28>9<EFBFBD>b<EFBFBD>2I<32>.J<>a<EFBFBD>.O<><0E><0E><0E>h<>j<>#<23>V<EFBFBD>,<2C>v<EFBFBD>z<EFBFBD>.B<>V<EFBFBD>]<5D>D[<5B>^d<>fn<66>]o<>p<>}<>A<02> A<02> "<22>4<EFBFBD> (<28>(<28>s<00>BBz /api/metadatac<00><00>:# <00>Sn[U5n[U5$7f)uGibt alle Metadata zurückzselect * from metadata<74>r6r<)r r7s r<00> get_metadatarKcs!<00><00><00> %<25>E<EFBFBD> <18><15> <1F>D<EFBFBD> "<22>4<EFBFBD> (<28>(<28>s<00>z /api/summaryc<00><00><># <00>U(aSUS3nOSn[U5nU(a URS5(a
US(d&[RS5 SS0SS0SS 0//S
Q/S .$U(akURS5(aUUS(aKUSS S (a USS S OS nUSS S (a USS S OSnSS0SS0SS 0/SX4//S .$SS0SS0SS 0//S
Q/S .$7f)u<>
2026-01-27 13:08:14 +01:00
Gibt Zusammenfassung zurück. Nutzt analytics_daily_summary für total_trades.
Optional: days Parameter für Zeitraum-basierte Zusammenfassung.
z<EFBFBD>
select
sum(total_trades) as total_trades,
sum(total_volume) as total_volume
from analytics_daily_summary
where timestamp >= dateadd('d', -z, now())
2026-01-27 13:08:14 +01:00
z<>
select
sum(total_trades) as total_trades,
sum(total_volume) as total_volume
from analytics_daily_summary
r;zNanalytics_daily_summary is empty. Analytics worker should calculate this data.r<00> continentrC<00> total_volume)<03>Allr<00>r9r<00>rPrO)r6r+rFrG)r>r r7<00> total_tradesrNs r<00> get_summaryrSjsV<00><00><00>  <0C>*<2A>
+/<2F><16>0 <09>  <0C><05> <0C><05> <19><15> <1F>D<EFBFBD> <10>t<EFBFBD>x<EFBFBD>x<EFBFBD> <09>*<2A>*<2A>$<24>y<EFBFBD>/<2F><0E><0E><0E>g<>i<><18><1B>%<25><17><1D>'<27><17><1E>(<28><0E>
(<28>(<28> 
<EFBFBD>
<EFBFBD> <0C><04><08><08><19>#<23>#<23><04>Y<EFBFBD><0F>04<30>Y<EFBFBD><0F><01>0B<30>1<EFBFBD>0E<30>t<EFBFBD>I<EFBFBD><EFBFBD>q<EFBFBD>)<29>!<21>,<2C>1<EFBFBD> <0C>04<30>Y<EFBFBD><0F><01>0B<30>1<EFBFBD>0E<30>t<EFBFBD>I<EFBFBD><EFBFBD>q<EFBFBD>)<29>!<21>,<2C>3<EFBFBD> <0C>
2026-01-27 13:08:14 +01:00
<18><1B>%<25><17><1D>'<27><17><1E>(<28><0E>
<1F> <0C>;<3B><<3C> 
<EFBFBD>
<EFBFBD><14>[<5B> !<21> <13>]<5D> #<23> <13>^<5E> $<24>
<EFBFBD>
$<24>$<24>  <06><06>s<00>C,C.z/api/statistics/total-tradesc<00><00><># <00>U(aSUS3nOSn[U5nU(aAURS5(a+US(a!USSS(a USSSOSnSU0$SS0$7f)ukGibt Gesamtzahl aller Trades zurück (aus analytics_daily_summary). Optional: days Parameter für Zeitraum.z`select sum(total_trades) as total from analytics_daily_summary where timestamp >= dateadd('d', -z, now())z>select sum(total_trades) as total from analytics_daily_summaryr;rrR)r6r+)r>r r7<00>totals r<00>get_total_tradesrV<00>s<><00><00><00> <0C>r<>sw<73>rx<72>yA<02>B<02><05>P<><05> <18><15> <1F>D<EFBFBD> <0B><04><08><08><19>#<23>#<23><04>Y<EFBFBD><0F>)-<2D>i<EFBFBD><1F><11>);<3B>A<EFBFBD>)><3E><04>Y<EFBFBD><0F><01>"<22>1<EFBFBD>%<25>A<EFBFBD><05><1E><05>&<26>&<26> <1A>A<EFBFBD> <1E><1E>s<00>A(A*z/api/custom-analyticsrB<00> date_from<6F>date_to<74>x_axis<69>y_axis<69>group_by<62> exchangesc <00><00>4# <00>/SQn/SQn/SQnX&;a [SSU3S9eX7;a [SSU3S9eXH;a [SSU3S9eUS :wa
[SS
S9eS nU(aNURS 5Vs/sHnUR5PM nn[ U5S:XaUSnO
[SSS9eSUSUSUSUSUS3 n[ USS 9nU(aURS5(d#[RS5 SS0SS0SS0//S.$[ U5$s snf7f)u<>
2026-01-27 13:08:14 +01:00
Flexibler Analytics-Endpunkt für custom Graphen.
Nutzt vorberechnete Daten aus analytics_custom für bessere Performance.
Parameters:
- date_from: Startdatum (YYYY-MM-DD)
- date_to: Enddatum (YYYY-MM-DD)
- x_axis: X-Achse (date, exchange, isin) - aktuell nur "date" unterstützt
- y_axis: Y-Achse (volume, trade_count, avg_price)
- group_by: Gruppierung (exchange, isin, date)
- exchanges: Komma-separierte Liste von Exchanges (optional)
)rArBr=)rDrC<00> avg_price)rBr=rA<00><>z Invalid x_axis. Must be one of: r'z Invalid y_axis. Must be one of: z"Invalid group_by. Must be one of: rAzrx_axis must be 'date' for pre-calculated analytics. Other x_axis values are not supported for performance reasons.<2E>,<2C>r!<00>allrQrz<>Multiple exchanges are not supported for pre-calculated analytics. Please specify a single exchange or leave empty for all exchanges.z<>
2026-01-27 13:08:14 +01:00
select
timestamp as x_value,
group_value,
y_value
from analytics_custom
where timestamp >= 'z'
and timestamp <= 'z'
and y_axis = 'z'
and group_by = 'z'
and exchange_filter = 'z2'
order by timestamp asc, group_value asc
<20>r;z^No pre-calculated data found in analytics_custom. Analytics worker should calculate this data.r<00>x_value<75> group_value<75>y_valuer9)
r<00>join<69>split<69>stripr6r<rEr+rFrG)rWrXrYrZr[r\<00> valid_x_axis<69> valid_y_axis<69>valid_group_by<62>
2026-01-27 13:08:14 +01:00
y_axis_map<EFBFBD>
x_axis_map<EFBFBD> group_by_map<61>y_metric<69>x_label<65>group_by_fieldr r5<00> exchange_listr7<00>exchange_filters r<00>get_custom_analyticsru<00>s<><00><00><00>,0<>L<EFBFBD>9<>L<EFBFBD>1<>N<EFBFBD> <0A>!<21><1B><03>6V<36>Wc<57>Vd<56>4e<34>f<>f<> <0A>!<21><1B><03>6V<36>Wc<57>Vd<56>4e<34>f<>f<><0F>%<25><1B><03>6X<36>Yg<59>Xh<58>4i<34>j<>j<><0E><16><17><1B><1B>H<02>
<EFBFBD>
<EFBFBD>V<1C>O<EFBFBD><10>-6<>O<EFBFBD>O<EFBFBD>C<EFBFBD>,@<40>A<>,@<40>q<EFBFBD><11><17><17><19>,@<40> <0A>A<> <0E>}<7D> <1D><11> "<22>+<2B>A<EFBFBD>.<2E>O<EFBFBD> <20><1F>_<02><0E> <0E> <19> #<23> <0B>$<17><1E>i<EFBFBD> <13><19>(<28><15><1D>J<EFBFBD><1C>+<2B>,<2C>-<05> <08>E<EFBFBD> <19><15><01> *<2A>D<EFBFBD> <0F>t<EFBFBD>x<EFBFBD>x<EFBFBD> <09>*<2A>*<2A><0E><0E><0E>w<>y<><18><19>#<23><17><1D>'<27><17><19>#<23><0E>
<1A> 
<EFBFBD>
<EFBFBD> #<23>4<EFBFBD> (<28>(<28><>MB<01>s<00>A/D<01>1D<04> B Dz/api/statistics/moving-averagec<00><00>f# <00>US;a
2026-01-27 13:08:14 +01:00
[SSS9eSUSUSUS3nU(a US US
3- nUS - n[US S 9nU(a5URS5(a[URS/55S:Xa,[R S5 SS0SS0SS0SS0SS0SS0//S.$[ U5$7f)u<>
2026-01-27 13:08:14 +01:00
Gibt Moving Average Daten für Tradezahlen und Volumen je Exchange zurück.
Unterstützte Zeiträume: 7, 30, 42, 69, 180, 365 Tage
<EFBFBD><06><00><00>*<00>E<00><>imr_<00>?Invalid days parameter. Must be one of: 7, 30, 42, 69, 180, 365r'zi
2026-01-27 13:08:14 +01:00
select
timestamp as date,
exchange,
trade_count,
volume,
maz_count as ma_count,
maz\_volume as ma_volume
from analytics_exchange_daily
where timestamp >= dateadd('d', -z , now())
z and exchange = '<27>'z order by date asc, exchange ascrcrar;rr@rrArBrCrD<00>ma_count<6E> ma_volumer9)rr6r+rErFrGr<)r>rBr r7s r<00>get_moving_averager<65>1s<00><00><00>  <0C>,<2C>,<2C><1B><03>4u<34>v<>v<> <0B> <10>&<26> <0B> <0F>&<26>&<26>&*<2A>V<EFBFBD>,<05>
<08>E<EFBFBD><10> <0A>$<24>X<EFBFBD>J<EFBFBD>a<EFBFBD>0<>0<><05> <09> /<2F>/<2F>E<EFBFBD> <18><15><01> *<2A>D<EFBFBD> <10>t<EFBFBD>x<EFBFBD>x<EFBFBD> <09>*<2A>*<2A>c<EFBFBD>$<24>(<28>(<28>9<EFBFBD>b<EFBFBD>2I<32>.J<>a<EFBFBD>.O<><0E><0E><0E>h<>j<><18><16> <20><17><1A>$<24><17><1D>'<27><17><18>"<22><17><1A>$<24><17><1B>%<25> <0E><1A>

<EFBFBD>
<EFBFBD> #<23>4<EFBFBD> (<28>(<28>s<00>B/B1z/api/statistics/volume-changesc<00><00><># <00>US;a
[SSS9eSUS3n[USS9nU(aURS 5(d0[R S
US 35 S S 0S S0S S0S S0S S0S S0//S.$[ U5$7f)ut
2026-01-27 13:08:14 +01:00
Gibt Änderungen in Volumen und Anzahl je Exchange zurück.
Unterstützte Zeiträume: 7, 30, 42, 69, 180, 365 Tage
rwr_r}r'z<>
2026-01-27 13:08:14 +01:00
select
exchange,
trade_count,
volume,
count_change_pct,
volume_change_pct,
trend
from analytics_volume_changes
where period_days = z.
order by timestamp desc
limit 20
rcrar;z+No pre-calculated volume changes found for z3 days. Analytics worker should calculate this data.rrBrCrD<00>count_change_pct<63>volume_change_pct<63>trendr9)rr6r+rFrGr<)r>r r7s r<00>get_volume_changesr<73>_s<><00><00><00>  <0C>,<2C>,<2C><1B><03>4u<34>v<>v<> <19><1E><06><05> <08>E<EFBFBD> <19><15><01> *<2A>D<EFBFBD> <10>t<EFBFBD>x<EFBFBD>x<EFBFBD> <09>*<2A>*<2A><0E><0E><0E>D<>T<EFBFBD>F<EFBFBD>J}<7D>~<7E><><18><1A>$<24><17><1D>'<27><17><18>"<22><17>+<2B>,<2C><17>,<2C>-<2D><17><17>!<21> <0E><1A>

<EFBFBD>
<EFBFBD> #<23>4<EFBFBD> (<28>(<28>s<00>A9A;z/api/statistics/stock-trends<64>limitc<00><00>l# <00>US;a
2026-01-27 13:08:14 +01:00
[SSS9eSUSUSUS3n[US S
9n[U5$7f) ur
Gibt Trendanalyse für häufig gehandelte Aktien zurück.
Unterstützte Zeiträume: 7, 30, 42, 69, 180, 365 Tage
rwr_r}r'z<>
2026-01-27 13:08:14 +01:00
select
timestamp as date,
isin,
trade_count,
volume,
count_change_pct,
volume_change_pct
from analytics_stock_trends
where period_days = z$
and timestamp >= dateadd('d', -z,, now())
order by volume desc
limit z
rcra)rr6r<)r>r<>r r7s r<00>get_stock_trendsr<73><00>sc<00><00><00>  <0C>,<2C>,<2C><1B><03>4u<34>v<>v<> <19><1E><06>$<24>$(<28>6<EFBFBD>* <0B> <10>'<27><05> <08>E<EFBFBD> <19><15><01> *<2A>D<EFBFBD> "<22>4<EFBFBD> (<28>(<28>s<00>24z/api/analytics<63>metric<69> sub_group_by<62>isins<6E>
2026-01-27 13:08:14 +01:00
continentsc <00><00><># <00>SS/n[U/SQU-;U/SQU-;USL/5nU(aSOSn U(aSOSn
SU S U S
3S S U S 3S.n SU S3SU S3U S3U S3U(a SU
SU S3OSU(aSU
S3OSU(aSU
S3OSU(a SU SU
S3OSU(a SU SU
S3OSS. n U RX S5n U RXS 5nS!US"3nU(aX,;a US#X<>S$3- nUS%:Xa US&U S U S'3- nO US#U S(3- nU(aUS)- nUS*- nU(a US+U S,US-3- nU(a US+U S.US-3- nU(aOS/RURS/5Vs/sHnS-UR 5S-3PM sn5nUS+U S0US13- nU(aVU(aOS/RURS/5Vs/sHnS-UR 5S-3PM sn5nUS+U
S2US13- nUS3U3- nU(aX,;a
US#X<>3- nUS4- n[ U5n[ U5$s snfs snf7f)5u&Analytics Endpunkt für Report Builder<65>exchange_continent<6E>exchange_sector)rrM<00>sectorNzt.<2E>zm.zsum(zprice * z quantity)zcount(*)zavg(zprice))rD<00>countr^zdate_trunc('day', z
timestamp)zdate_trunc('month', rBr=z coalesce(zname, zisin)zcontinent, 'Unknown')z 'Unknown'zsector, 'Unknown')zconcat(zexchange, ' - ', coalesce(zcontinent, 'Unknown'))zsector, 'Unknown'))) <09>day<61>monthrBr=rrMr<>r<>r<>rDr<>zselect z as labelz, z as sub_labelrbz, count(*) as value_count, sum(z%quantity) as value_volume from tradesz as value from tradesz* t left join metadata m on t.isin = m.isinz
where 1=1z and ztimestamp >= 'r~ztimestamp <= 'r`z isin in (<28>)zcontinent in (z
group by z order by label asc)<07>anyr+rgrhrir6r<)r<>r[r<>rWrXr<>r<><00>composite_keys<79>needs_metadata<74>t_prefix<69>m_prefix<69> metrics_map<61>
2026-01-27 13:08:14 +01:00
groups_map<EFBFBD>selected_metric<69>selected_groupr <00>i<>
isins_list<EFBFBD>c<> cont_listr7s r<00> get_analyticsr<73><00>s<00><00><00>+<2B>,=<3D>><3E>N<EFBFBD><18><10>3<>n<EFBFBD>D<>D<><14>7<>.<2E>H<>H<><12>$<24><1E><06><07>N<EFBFBD> &<26>t<EFBFBD>2<EFBFBD>H<EFBFBD>%<25>t<EFBFBD>2<EFBFBD>H<EFBFBD><19><18>
2026-01-27 13:08:14 +01:00
<EFBFBD>(<28>8<EFBFBD>*<2A>I<EFBFBD>><3E><1B><1B>H<EFBFBD>:<3A>V<EFBFBD>,<2C><06>K<EFBFBD>$<24>H<EFBFBD>:<3A>Z<EFBFBD>8<>'<27><08>z<EFBFBD><1A><<3C><1F>j<EFBFBD><08>)<29><1B>*<2A>D<EFBFBD>!<21>?M<>)<29>H<EFBFBD>:<3A>V<EFBFBD>H<EFBFBD>:<3A>U<EFBFBD>;<3B>SY<53>DR<44>y<EFBFBD><18>
<EFBFBD>*?<3F>@<40>Xc<58>>L<>I<EFBFBD>h<EFBFBD>Z<EFBFBD>'9<>:<3A>R]<5D>p~<7E><07><08>z<EFBFBD>1K<31>H<EFBFBD>:<3A>Uk<55>l<>EP<02>jx<6A>W<EFBFBD>X<EFBFBD>J<EFBFBD>.H<><18>
<EFBFBD>Re<EFBFBD>f<>J<02>
<06>J<EFBFBD>"<22>o<EFBFBD>o<EFBFBD>f<EFBFBD>(<28>.C<>D<>O<EFBFBD><1F>^<5E>^<5E>H<EFBFBD><15>.?<3F>@<40>N<EFBFBD><15>n<EFBFBD>%<25>Y<EFBFBD> /<2F>E<EFBFBD><13> <0C>2<> <0A>2<EFBFBD>j<EFBFBD>.<2E>/<2F>}<7D>=<3D>=<3D><05> <0A><15><EFBFBD> <0A>2<>8<EFBFBD>*<2A>H<EFBFBD>X<EFBFBD>J<EFBFBD>Ns<4E>t<>t<><05> <0A>2<EFBFBD>o<EFBFBD>&<26>&;<3B><<3C><<3C><05><15> <0A>=<3D>=<3D><05> <09>\<5C><19>E<EFBFBD><10> <0A>5<EFBFBD><18>
<EFBFBD>.<2E><19> <0B>1<EFBFBD>=<3D>=<3D><05><0E> <0A>5<EFBFBD><18>
<EFBFBD>.<2E><17> <09><11>;<3B>;<3B><05> <0C><18>X<EFBFBD>X<EFBFBD><15><1B><1B>S<EFBFBD>9I<39>J<>9I<39>A<EFBFBD><11>1<EFBFBD>7<EFBFBD>7<EFBFBD>9<EFBFBD>+<2B>Q<EFBFBD>/<2F>9I<39>J<>K<>
<EFBFBD> <0A>5<EFBFBD><18>
<EFBFBD>)<29>J<EFBFBD><<3C>q<EFBFBD>9<>9<><05><11>n<EFBFBD><17>H<EFBFBD>H<EFBFBD>
<EFBFBD>8H<EFBFBD>8H<EFBFBD><13>8M<38>N<>8M<38>1<EFBFBD><01>!<21>'<27>'<27>)<29><1B>A<EFBFBD>.<2E>8M<38>N<>O<> <09> <0A>5<EFBFBD><18>
<EFBFBD>.<2E><19> <0B>1<EFBFBD>=<3D>=<3D><05> <09>z<EFBFBD>.<2E>)<29> *<2A>*<2A>E<EFBFBD><13> <0C>2<> <0A>2<EFBFBD>j<EFBFBD>.<2E>/<2F>0<>0<><05> <09> "<22>"<22>E<EFBFBD> <18><15> <1F>D<EFBFBD> "<22>4<EFBFBD> (<28>(<28><>K<01><>O<01>s<00>E-I<01>/H6<08> ?I<01> H;<08>*AIz/api/metadata/search<63>qc<00><00>H# <00>SUSUS3n[U5n[U5$7f)z(Case-insensitive search for ISIN or Namez3select isin, name from metadata where isin ilike '%z%' or name ilike '%z %' limit 10rJ)r<>r r7s r<00>search_metadatar<61><00>s5<00><00><00>B<01>!<21><13>DW<44>XY<58>WZ<57>Ze<5A> f<>E<EFBFBD> <18><15> <1F>D<EFBFBD> "<22>4<EFBFBD> (<28>(<28>s<00> "<01>__main__z0.0.0.0i@)<02>host<73>port)<01>
)Nrx)N)rArDrBN)rxN)rx)rx<00>)rDr<>NNNNN).<2E>fastapirr<00>fastapi.middleware.corsr<00>fastapi.staticfilesr<00>fastapi.responsesrr*<00>os<6F>logging<6E>typingr r
r <00> getLogger<65>__name__rF<00>app<70>add_middleware<72>mountr+r<00>getenvrrr-rr,r3<00>intr6r<rHrKrSrVrur<>r<>r<>r<>r<><00>uvicorn<72>runrrr<00><module>r<>sw<00><01>*<2A>2<>+<2B>*<2A><0F> <09><0E>&<26>&<26> <10> <1A> <1A>8<EFBFBD> $<24><06> <0A>+<2B>,<2C><03><03><12><12><12><16>%<25><16>%<25><16>%<25> <13><02><04> <09> <09>)<29>[<5B>+=<3D>><3E>X<EFBFBD> <09>N<><04><17><17><13><1C>7<><0E>7<> <0A>)<29>)<29>I<EFBFBD>w<EFBFBD>
2026-01-27 13:08:14 +01:00
'<27><07><10>i<EFBFBD>i<EFBFBD> <0A>w<EFBFBD>/<2F> <0B>$+<2B> <0B>7<EFBFBD>K<EFBFBD>
<20><14><07>
<0C>)<29>)<29>I<EFBFBD>y<EFBFBD>
)<29><07> <12>7<EFBFBD>)<29>5<EFBFBD> !<21><06> [<01><13> [<01>s<EFBFBD> [<01>H<EFBFBD>T<EFBFBD>#<23>s<EFBFBD>(<28>^<5E>4L<34> [<01><10>$<24>s<EFBFBD>C<EFBFBD>x<EFBFBD>.<2E><10>T<EFBFBD>#<23>s<EFBFBD>(<28>^<5E><10><05><17><17><1D><17>()<29>3<EFBFBD>()<29>S<EFBFBD>()<29><18>()<29>T<05><17><17><1F><19>)<29><1A>)<29> <05><17><17><1E><18><<06>C<EFBFBD><<06><19><<06>|<05><17><17> '<27>(<28>
2026-01-27 13:08:14 +01:00
<1F><13>
<1F>)<29>
<1F><05><17><17> <20>!<21><19><1A><1E><19> x)<29><12>x)<29> <10>x)<29> <10>x)<29> <10> x)<29>
<12> x)<29> <13> x)<29>"<22>x)<29>t<05><17><17> )<29>*<2A>+)<29>3<EFBFBD>+)<29>c<EFBFBD>+)<29>+<2B>+)<29>Z<05><17><17> )<29>*<2A>))<29>3<EFBFBD>))<29>+<2B>))<29>V<05><17><17> '<27>(<28>)<29><13>)<29><13>)<29>)<29>)<29>4<05><17><17> <19><1A><1A><19><1C><19><17><15><1A>K)<29> <0F>K)<29><11>K)<29><16>K)<29><13> K)<29>
2026-01-27 13:08:14 +01:00
<11> K)<29> <0F> K)<29><14>K)<29><1B>K)<29>Z<05><17><17> <1F> <20>)<29>S<EFBFBD>)<29>!<21>)<29>  <0C>z<EFBFBD><19><12> <0B>K<EFBFBD>K<EFBFBD><03>)<29>$<24>/<2F>r