From 8c5513d6c8918889cb10469753a15e061d61dfc2 Mon Sep 17 00:00:00 2001 From: ebby Date: Sat, 12 Sep 2026 12:12:13 +0300 Subject: [PATCH] essentials working --- backend/dev.db | Bin 12288 -> 12288 bytes backend/pyrefly.toml | 6 ++- .../__pycache__/__init__.cpython-314.pyc | Bin 177 -> 177 bytes .../__pycache__/dependencies.cpython-314.pyc | Bin 0 -> 1183 bytes .../backend/__pycache__/main.cpython-314.pyc | Bin 3176 -> 725 bytes backend/src/backend/dependencies.py | 13 ++++++ .../__pycache__/__init__.cpython-314.pyc | Bin 0 -> 186 bytes .../__pycache__/database.cpython-314.pyc | Bin 0 -> 1256 bytes backend/src/backend/internal/database.py | 16 +++++++ backend/src/backend/main.py | 43 ++---------------- .../__pycache__/__init__.cpython-314.pyc | Bin 185 -> 185 bytes .../__pycache__/subscriptions.cpython-314.pyc | Bin 382 -> 2144 bytes backend/src/backend/routers/subscriptions.py | 40 ++++++++++------ 13 files changed, 64 insertions(+), 54 deletions(-) create mode 100644 backend/src/backend/__pycache__/dependencies.cpython-314.pyc create mode 100644 backend/src/backend/dependencies.py create mode 100644 backend/src/backend/internal/__pycache__/__init__.cpython-314.pyc create mode 100644 backend/src/backend/internal/__pycache__/database.cpython-314.pyc create mode 100644 backend/src/backend/internal/database.py diff --git a/backend/dev.db b/backend/dev.db index fcfbf0a7d9744fcc80ae7e18f4b38c88e6a5db71..0fe3af0a6ddc3e7884a1904ea5de3d8a746dcf2c 100644 GIT binary patch delta 133 zcmZojXh@hK&B!`Y#+i|IW5N=CE@u9l4E$gCpYh+^tf;V%e`14{DK{$%gEXgUaY<2T zUOEpW3xg~th+UqVm(In&!XOFef!GWT%>4Hl`0w$5<9`L!t*^w*EX@ej%gW7+(8|dy I$pJAE0OkuN+W-In delta 192 zcmZojXh@hK&B#7c#+i|QW5N=CK34uc4E*2u-|#=+zrep|v!K8#{xBg{76whu;*z4` zl;Yx);*^xkymUSm76wJA7>Lis%)%fE;%DZib270oh;xEe7PB+5FbIQ~Tnr2hto(-< z_a5L z{QzA00Wg8YJN+QLn2BlhN)yAKgc#zTIj0@bJ8wKm+qX@7`aHkqeJ3-0-2m_{^LFD6 z0ltcx&Qjvy>>hx9timAkC=yP_M6Jv#MU|_?1W$~?P_r-+S=0x3(nw}uq-32kv~lR^ z6S0v_!mbCd>v5A)TUWwVk(xGTVPA21dGXP%MSbpgu0;TdL#!kK6~I|Z3RuCaGW!~^ zRbUiLq(%%n2xR3BSQx}m4E1h|tVWE)IPRzp(UW`G zHFJ~ZgN9F8KA;w(JTD2I91vh{=y`rw@XFO>dO644HtUXktb{!QH+dtdSe{M8lufzm z)Jw;N2~|2_X< z^uno%^wh625z@=-F!`%vgdy266aUaLQ6Df($Vo3|yp$`mktZQO7`g~( zNd~k;4hKalON90PmsCP+g9d?PnXDhc-f+pwJ&qpar0|^2yluy(HX8s?VuO*3Y{x|m zy{>kIfzbCuC4_vz=y&KpQ=;R~yDvcg23Mr{ AF#rGn literal 0 HcmV?d00001 diff --git a/backend/src/backend/__pycache__/main.cpython-314.pyc b/backend/src/backend/__pycache__/main.cpython-314.pyc index 44c34e84d6b2226969ff0f7cc69c6acdb05a9dfa..cc7f2199080ee0d6763e6328c0f28c82f275735c 100644 GIT binary patch literal 725 zcmYjP&ubGw7=4r7?542^*tGOVDnWawi;%taBr4Q{WIdFyUQNU7?r65%>@G92N^cPl z3SRstJoMnz|Dy;k3>V;Z#sDyc^W!5ELnxHm>~Qioap7>=}SqJP@`u=_du rNwy{>LYh+zrR|#>O$<~UUz#K18rl`sF0l6X=~ZL@qOpI8hlS@qvs$9U literal 3176 zcmZuz&2t<_6@NW5`~9IWODk)&UMT{HiHsMpf)mRIoDyb5jG~N;4&e3F>}*RKdv<2s z)9YA1P^*M0r4lHs3J$JZFhveAryMx)CvcF;ia)wg;S^kalk8CDz=3)*vmY|)sp@&t z{ko@ruYd2?J)O-Y0RV1a{^aVPA^`uyk9LWL#`8ZDfEHW{N+})#!@Rw7E(|;=JRy+~Bn4e=N>xZj)1{5;0_W>yBx<4yQMH-EfRmzd1HX z8`P9j?$trL~lGMpk> zBnNh!$F(R=ECWw!WD3-nNG~<3p2@5Rw_Io8k}5G707R<6th&M0^=oupl|;mHYV@Xv zHXZAFlbT4BkSu`o!y(Tv0>D|)f@QcOz42>+nhY=w?~*lAf+g}x(8!5)x&Xkeq)EpC zu!qb_njG5FtfVPuPk|bFiiBMdl2sECS~o0PL=BT$H>fHL*>bp$Juc{R)Ay6)i|ue8KZOKWbOmT0xQURpBO7`3Y0^31hTgSl6!$-UBBc9Xtm zaLTH-yIQIm<~8cnN**&icHOX?lZ|ze)^#J~imr>Jy%9Xw+tmjE-U$Hs&nCPNkK?Hi zYrjqIC}$32Amqzbc1I~4M1YWkC}ak9l(Anj%XxNSMqadn*~0Dui+HG)+RH*=t8Q7cWy)O9he>mE0_W$Fg!%&Imy z^>iIQJFzpVZR@&9*f_$#?fwxf;G77{uY7#d0lpSI9v-_p^ZBLS;WMqb9uJJ%x%AmL zb_YtWA3q)%{oU!-g%=3!17H*F(U(*rBHXCj^j5S+Z=9@EZza9!w#Dh0QmG^c%r$CW z(>;s;Ut`p$T~LWgo37(flj{as^$w*DaBjERTQd5W+T{l6c%UHnb)&QBg?hd;`^kRf^WcJX%c zqvC(PBLMLJ=sEI9M2-9*d5+vmok{#9agKhYy!HTd;QOo{oiYF61S0H9uY8Gn{1>A|fxw^M~}r4VqUS9g)EKJK%=@Bgc=M!Gqm zNnMs`a<{!CPl2j1jJQbmqGNc*izuVK$sASk(_JLPGi{DGRKoJOP+ZX~fh-(DMqq^$ z_Yh(WUVuVI53u^w-pAKpf8oFWcF}JPP<8klBJxpP4N#HA4$r$~xx@4#ER)5M%e|$$ z_sit#a{bT@Fcq>x7P3*RiKyw;>lPO=Mpqd1)>Mh%J;V=*f1DgY9&mgp%-ER=@paX%a)YdNOftWiC1dYS+6v%%^11Ez%+3lHyS`!XS94<`0td=CnH@Y){a z_aOfdnEL|ezUr4re(R09Gyeve z$kwgT)4Pdtt>`m_5cOG9A|v~8$mX`*`(y00)cuK>?cB^4nb%v%FQb_ctd{(QD4XLO z;~!f0$>@PZNdCDD($Rgi4&sm;`Z(W;J|VHqv5m3q^!R;JK&NBqbPS!2?MFe1Z{|1h j+nK_Ba_lQfA*0w^+(&Ca3q*McgF7&|_5BAB$jko#PBN!) diff --git a/backend/src/backend/dependencies.py b/backend/src/backend/dependencies.py new file mode 100644 index 0000000..49d6ead --- /dev/null +++ b/backend/src/backend/dependencies.py @@ -0,0 +1,13 @@ +from typing import Annotated + +from fastapi import Header, HTTPException + + +async def get_token_header(x_token: Annotated[str, Header()]): + if x_token != "fake-super-secret-token": + raise HTTPException(status_code=400, detail="X-Token header invalid") + + +async def get_query_token(token: str): + if token != "jessica": + raise HTTPException(status_code=400, detail="No Jessica token provided") \ No newline at end of file diff --git a/backend/src/backend/internal/__pycache__/__init__.cpython-314.pyc b/backend/src/backend/internal/__pycache__/__init__.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a6c85caf94f102c3c1e92c72a9b2902c3f2b7be5 GIT binary patch literal 186 zcmX|*KMKMy9ED#j{z1@7IEi2`APyeDK?lds#2+?onv^6(x_KD~uhi8W*b7KSeZ%)Y zc*|SOXHx(u#`nDMXOCalSGo~^8xB}t$@UNU0f4R_+Y`@RNt~o?_)%q^w2V5aj91>} zq+;MZQ`0q#l&IJ@eqz-?fe8ZECm>+Uh98x@y|VrgZ1p(AE!u&y�D`AZJ G1i%}A1uxA2 literal 0 HcmV?d00001 diff --git a/backend/src/backend/internal/__pycache__/database.cpython-314.pyc b/backend/src/backend/internal/__pycache__/database.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ab0bf1b28b5cb34a4ce8d2352dbc6a8dd58d0725 GIT binary patch literal 1256 zcmYk5&u`pB6vw|~d%eFmsnp#N)ZnEnRIH#_YJ)&6L8u3sNF{0=QG}G#8r#!dw_ZCP z&r+HLS|LsqQaJPwAtX3})Z94mholnFU^P-D#345zhg>+IvAt<#Wb2Ln=DqiMKjvG_ z8UXCHf4ch@0sfSS$to4X5eG2FZP;W5%R~@E%F2qetO_-g)fHt~6Iv!~E6Q?7lnmG< zq1*a~-oQmglAZm7f26kfx;k2mR%^u9wp;RzQ zTD`_1#;J(8Nz(EfOOhatOp;dCZeIT=_E~6>wCQn11#?)`4&7Ho zr`EbYIV_S~GGL>JU9xIwTwX{kLnf$C1x;%O01d-b&nb3sB(J5PSc7=TEatiotu=4J zS>TEw@dnl=kMA;1B-Yh%#2!$=xEscO%cb5u7Wr1fy%RZz1mh76E$Pgq30v5Fn4T?s z`mRGG-x1UeS;Ef%r~^nk8TWIo@l0z!)!NUr?o+M%W9N76O+E#{lTZa%)+{n%M;~OD zZsE4_?pJ`X0_Sj(42Vr$CUE^Efwp2Rm(;gjog@mdNDroZC^b@@Gcn@Ps;O{kn`?PL z=yzg1q#}{N&+}=i*>D^hMX``A;BXmuOA;7aFvn0x=O6ic{ONZOo@h_}J>%kU?MvCG z9Ob2dpbVfVQNED&VPK5)3FfKLCpEo795PZys)NPC$|i2%bBu|sw%m&{c%Z0$7xTDK zX!aGEon`2b}2-5kH(XTmAI^Vtb~7r-IL zcwU`;+}Sq1Hg>M$oMZg3*gIFmdLjyv-Ev!iR{)dSAVH4kyW#i zPI++{GEW3?lq^u!%c_u8lKbIMj$Iy>>|-uFJ+0@%=G+NFmKKxejCjZ^QbmTJ^;Q-j zm-WeVpA%Hx8^-=9WbgCWimpno0{B}cgdE_F1Drd++yTz-w>snc{?zQw{Lb87^TN3H kV!HRk$9q%rH-4=yjrD&uLd;`bA$fiO2aVqf#sB~S literal 0 HcmV?d00001 diff --git a/backend/src/backend/internal/database.py b/backend/src/backend/internal/database.py new file mode 100644 index 0000000..16820d8 --- /dev/null +++ b/backend/src/backend/internal/database.py @@ -0,0 +1,16 @@ +from collections.abc import Generator +from sqlmodel import Session +from sqlmodel import SQLModel +from sqlmodel import create_engine +sqlite_file = "dev.db" +sqlite_url = f"sqlite:///{sqlite_file}" + +connect_args = {"check_same_thread": False} +engine = create_engine(sqlite_url, connect_args=connect_args) + +def create_db_and_tables(): + SQLModel.metadata.create_all(engine) + +def get_session() -> Generator[Session, None, None]: + with Session(engine) as session: + yield session diff --git a/backend/src/backend/main.py b/backend/src/backend/main.py index d6b4e54..8bb7703 100644 --- a/backend/src/backend/main.py +++ b/backend/src/backend/main.py @@ -1,56 +1,19 @@ -from email.policy import default -from typing import Annotated +from .routers import subscriptions +from backend.internal.database import create_db_and_tables from fastapi import APIRouter -from contextlib import asynccontextmanager -from fastapi import Depends from fastapi import FastAPI -from sqlmodel import Field, Session, SQLModel, create_engine, select -# TODO: sql zeugs richtig implementieren nach FastApi docs # TODO: Integrationtests schreiben # TODO: Api Specs definieren (Subscription, Comment, Like) # TODO: Settings hinzufügen -class Subscription(SQLModel, table=True): - id: int | None = Field(default=None, primary_key=True) - email: str = Field(index=True, unique=True) - active: bool = Field() - -sqlite_file = "dev.db" -sqlite_url = f"sqlite:///{sqlite_file}" - -connect_args = {"check_same_thread": False} -engine = create_engine(sqlite_url, connect_args=connect_args) - -def create_db_and_tables(): - SQLModel.metadata.create_all(engine) - -def get_session(): - with Session(engine) as session: - yield session - -SessionDep = Annotated[Session, Depends(get_session)] - app = FastAPI() @app.on_event("startup") def on_startup(): create_db_and_tables() - router = APIRouter() -@router.get("/subscription/") -def get_sub(): - return {"name":"TestSub"} - -@router.post("/subscription/") -def create_subscription(subscription: Subscription, session: SessionDep) -> Subscription: - session.add(subscription) - session.commit() - session.refresh(subscription) - return subscription - - -app.include_router(router) +app.include_router(subscriptions.router) diff --git a/backend/src/backend/routers/__pycache__/__init__.cpython-314.pyc b/backend/src/backend/routers/__pycache__/__init__.cpython-314.pyc index a0e08ca7919d75bba3bcedd33ac885cb049fe931..5cd87a4947fca70048fa021d01271234cd6f1903 100644 GIT binary patch delta 19 acmdnVxRa4vn~#@^fq{V`n|RhcIf?R_&#?ETPb2HQtYG=sS#_XP(FJ_j~X6Je})F z0|5Lm^yBTbD!`xep>4^QbNCVf>aeO{G!Ju#qj6XTtjsHODpzA)omb{GuEoAKpP19R z9{Y*;#GJv6xg<}H!yrrm)(e1*qJfh*bzW=U&r?Nh0&p51y*PRl)wZMPqB;RZ)PDCJg!>AB`wI}92vFyi93Gei zbMS8k08At@YlPd3Fy=?0iG=YnsglrRCK9O+7w2(QBtG>?;F*d@F5S5HS>%yG z7)#B!+;$?;60L{B5&$?*hazxYL3R4Xx;`c>{n;li@12*V>~rxtLLsZzh<&<*6M8N5@79PbDQ?jWvSca%99{!}%cu@3u&P}68o*NlPQeYdjx1P0HvyxwMhhYU zTvD(y1t3q*B?YT3U%8}UP5P5yCa8qDAQayd2~u(VK8>W0YLwiAXCcQ~kZsM!Mv%!(av%f6w4qmKZ zd6pk~wEWYXyLqer$+Q09@6OjheI>y?04jAEzr8HQ!ktn;?&pqkEP9Sn?thN}M8+eX z=DnXC7e27 zz{rw1QG_PB6~;1Qe5qEVr)0wM5~nUH5Jo%;Y9(p`z>wspC%)zPY~S{~JDIT^Z7hyH zCLLLt_=}h0*#8R$qgx%tVC7az^#E8s+PBn6Ftu1JBHK-qFj})o=#=mp4Naw4DOn{G z(Kt(4#WT$+o|LfUB2h7^!8*JG0}VIi@@wDe1JyvofAtI;Bn&kCLI=ICVHjw*iK~-a z3sa2ib`uv`Y!8brTY>hp9fuXPDC1wV_6&>9+tabjj@=*!23nAV!SOtyyHTa$b74?Y zri87V3Oy&`y)B{1RHvqzb?bL2k*e(`j$QzO5g93^T8D!)B(hsqH?MAIceSxSEwi<- zxv;AZNbmaQ_3dlB+QeR_u%i`XDi+LMk@rJRXy^npp2MAz!w8iCg;91Gcd9;>Q<>pLykG|iU&+HojI8YHn z`!Kx^qx&$n4(7@(0p8(B;|a=IFzvrzqdhVR-z}mro1R PFJ-65u)gO?yHoxH+Q8}1 literal 382 zcmX|)KTE?v7{;GVnlvr7gOezwNT(n)i=zlikpxt<-4uoVIqlUX7w;}eH*xhF_znC< za*#os+=OmUl3IPI-}CUkzjvp*)&_v@i*4ZW6I$|_UT%w)H`SA%)XzCK(o=_OEls5Dfsj6NT{|&68mkvRqho)w~I%3JWIeI@w}* z|B6NZR$qEko>7lR(cGKFQ$bmzn2e`hA^42ON_vNBNgqN*MU?VeZ>9I7i2wQ5C_Pz5 xG8U{*jOTJ#%(b(Z@uW=YzUTrV0OSUMFOv{bVY5Q7!k|L$y|w Subscription: -# session.add(subscription) -# session.commit() -# session.refresh(subscription) -# return subscription \ No newline at end of file +@router.post("/") +def create_subscription( + subscription: Subscription, + session: Session = Depends(get_session), +) -> Subscription: + session.add(subscription) + session.commit() + session.refresh(subscription) + return subscription \ No newline at end of file