From 53993111a43863f2c5800db66d20555c88e4fdeb Mon Sep 17 00:00:00 2001 From: ebby Date: Fri, 25 Sep 2026 21:57:03 +0200 Subject: [PATCH] rate limit --- .../backend/__pycache__/main.cpython-314.pyc | Bin 848 -> 886 bytes .../__pycache__/xml_reader.cpython-314.pyc | Bin 0 -> 1013 bytes backend/src/backend/internal/xml_reader.py | 18 ++++++++++++++++++ backend/src/backend/main.py | 6 ++++-- .../__pycache__/__init__.cpython-314.pyc | Bin 260 -> 260 bytes .../__pycache__/article.cpython-314.pyc | Bin 0 -> 969 bytes .../__pycache__/comments.cpython-314.pyc | Bin 1173 -> 579 bytes .../routers/__pycache__/users.cpython-314.pyc | Bin 5032 -> 5506 bytes backend/src/backend/routers/comments.py | 6 ------ backend/src/backend/routers/users.py | 16 +++++++++++++--- 10 files changed, 35 insertions(+), 11 deletions(-) create mode 100644 backend/src/backend/internal/__pycache__/xml_reader.cpython-314.pyc create mode 100644 backend/src/backend/internal/xml_reader.py create mode 100644 backend/src/backend/models/__pycache__/article.cpython-314.pyc diff --git a/backend/src/backend/__pycache__/main.cpython-314.pyc b/backend/src/backend/__pycache__/main.cpython-314.pyc index efb4ef8e2813a061f5101635e4205cdd85676203..8a169934b4a140e7180e9a8b2453d90eb81220c1 100644 GIT binary patch delta 134 zcmcb>_Kl5Kn~#@^fq{YH((!FsJ0|ia#dfq~%zGb1D8T?X07{LE1t*BF$Gco`TN0LCjAT>t<8 diff --git a/backend/src/backend/internal/__pycache__/xml_reader.cpython-314.pyc b/backend/src/backend/internal/__pycache__/xml_reader.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8c0ad4a4f19cad974643a94579877cd8127779ee GIT binary patch literal 1013 zcmYjPO-~zF6g_Xo2Ad(Mq~P$;lCj#6>tZ}rL_Ug~E~*fLXepYgmWV9SjOP_kI<}|p zJ&TVOOO{qR27B4|>dhQcipnekmgRbX-J(}oZcpRsK(bUW)V=afw~-3||U*{3$+yu8s2>xmhK zUI03P^E*Tts$HBdC04H>k6J2`)8sviP{mSD61~I+c-R6WQp+Z>DsfO6OB60EXtlUu z3QPT$=LzztY7Uw1`ib@)mQ2exEzh);O>1t(`gX>8 zWLl4lM5cUqlW(OLX=lciX%UE!E*AS_-w%}fk;^z`G9ABV=Hcw@gVpbyZ)7iR2^LT; zbuJiF?UxxYSfmCn^;UbGsqx8l#DbP6resPLlf5nzK|Q3>P|LB(1q)hhUD5WQ(7NEN zlxdo#T(%qSCbg;OZQ76O4Mqb`1iap`Bi4>H?XSZQU3Ud#Uf5o{fPq&vK)Cg@eiCvGP&Q-Z9Q{6Q{Yti(KKUad`W?qukPt@!H7kfA)Ln*V1q0KfnAt z|8lZ&JXSd|?w|D!{ye)^I4B&CeSSDPd3e2a(m!=>V8}dIb1kOh_Qm~TYAczc9?IDt wU^f&Wj@w&lw*5{>zha{R)Y9+~0B?0d$bXpl2Oqz};Onfto%uhNCFS_$I|4`Br~m)} literal 0 HcmV?d00001 diff --git a/backend/src/backend/internal/xml_reader.py b/backend/src/backend/internal/xml_reader.py new file mode 100644 index 0000000..466fd6c --- /dev/null +++ b/backend/src/backend/internal/xml_reader.py @@ -0,0 +1,18 @@ + +from datetime import timedelta +from datetime import datetime +import feedparser + +FEED_URL="https://blauwasser-mausis.de/rss.xml" + +def get_feed(): + feed = feedparser.parse(FEED_URL) + # feed.entries.reverse() + + for article in feed.entries: + date_string = str(article["published"]) + date_object = datetime.strptime(date_string, '%a, %d %b %Y %H:%M:%S %Z') + + if date_object > (datetime.now() - timedelta(days=1)): + print(f"Neu: {article["title"]}") + # TODO: Send Mail to Tim to power on newsletter \ No newline at end of file diff --git a/backend/src/backend/main.py b/backend/src/backend/main.py index 9a5062d..454352b 100644 --- a/backend/src/backend/main.py +++ b/backend/src/backend/main.py @@ -1,4 +1,4 @@ -from sqlmodel import SQLModel +from backend.internal.xml_reader import get_feed from .routers import users, comments from backend.internal.database import create_db_and_tables from fastapi import APIRouter @@ -17,4 +17,6 @@ def on_startup(): router = APIRouter() app.include_router(users.router) -app.include_router(comments.router) \ No newline at end of file +app.include_router(comments.router) + +get_feed() \ No newline at end of file diff --git a/backend/src/backend/models/__pycache__/__init__.cpython-314.pyc b/backend/src/backend/models/__pycache__/__init__.cpython-314.pyc index 9f0875104fdaf6dc25bff1b3ceb20d9a1f172952..70e9e42bcab02fef79ae535d6ff42dfbf88c230f 100644 GIT binary patch delta 18 ZcmZo+YGLBi=HumJU|?W)erh7uF90B%1g!u7 delta 18 ZcmZo+YGLBi=HumJU|?WitDDI63jiAj1AqVk diff --git a/backend/src/backend/models/__pycache__/article.cpython-314.pyc b/backend/src/backend/models/__pycache__/article.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..af09444be450020adb1053709c6a40207035859a GIT binary patch literal 969 zcmYjP%T5$Q6g|~Fj|K*i2$CQK5i#kQ(1|WE;SnXqFo_ar3>!04s=I5PhJFmyH6gQ` zsEK}pOSkTHqu=0?gbkIjP*?2KF~Oy&c@XZRa;oY+&OP_u85te~fcV>&y&nL6>Pz2> zJK$B$*jgk+1N0o(ZOaJ8>Td8F@ZU_xk`gL*`s-9`?YQ zzS>0PABQ{&Y@)1yNiM^fYrMVnJ2XnvlwQ_-r^Nbtf8aa!fz9Vd>@@W%B}v% zgOIi!!bfb{C1p{Xuvljsq%=;0Mx=3x(t`$zdOxF-Rzs1=C`@>gQYy5xqNES4g))=$ zPz-A{c8N)~k@%FV2}(1`Wav{Sr3k%- z-Rd^g!pX?h54q!!h1UAX)a)ngYw2_8cxts(KG(gyh8XXM>9xsA=0$wd&MPZBh&qyX z`D^MT-**)g8g(LdX=SZ+#aI(JdV7^k1NdbULQXMtikVZ){4E${?OpACa1Mj4b)x?R DqTud{ literal 0 HcmV?d00001 diff --git a/backend/src/backend/routers/__pycache__/comments.cpython-314.pyc b/backend/src/backend/routers/__pycache__/comments.cpython-314.pyc index 9d07c29fd99a0a5480f849441788ad0a6ef708b5..24e770894a07b07eafc36fa2ffb01d0577f0817d 100644 GIT binary patch delta 133 zcmbQrd6RaR7`74WwB%_7HUPrn?fbTE#y*T*kq^8YLX2z6G2du zfY2Tjf;SHytrtD{5BMJ#@niAe)tg$-tITF2n)fi@?>oQenR%-{orqtE$BqL)=<%Do z8%i%ePhR%Umv0s(a!I-Tf0)sAGF&OBODK@h>>@E^b1>s`s7_VMdXOY0&BQYFsa`il z4tuX3wLD^!Wqwct3IG+r(K!HZ(9bYo!XS-*ICGM4ES8WDylMdrC6Am0AB)iu zAcZ_~;jwK1BV$uAeKR~wP%g5%#v;;{c+ItGwRqpEI<_UKr&_k{h01QN<_KM7)ACF! zEa$W?yht!u<5JGb;v$nqcrixz94;s;HaTVN3;^j3U-RXDO(eU!2X6cNm&EMHMEYGK z{d{kb$h2>K(kAz}I$PcFdu?8hvz_b*ZHCPP$m&t=RLLseqjfvezf24>1b|6>0W!}7 zEJGb3<~9Xop4M==@Cgp#R~iyVuGCz+S*2ImO7NF>p|2{NtL@PDIF!i#LTBM%dq7Tn ZPOrY$8KgIV$p<}Bp-lf&G?Mg7{Q(cLoR9zj diff --git a/backend/src/backend/routers/__pycache__/users.cpython-314.pyc b/backend/src/backend/routers/__pycache__/users.cpython-314.pyc index 88e427c25b769c263b0c63ee1bae1c6206c01b42..6a26c93207eb253ac93ad60c1f223e9b727a114d 100644 GIT binary patch delta 2575 zcma)7O>7%Q6n?YopN+HriJipxF-aUJPVKY~RYMXWHHEh7ZhsPY`zKVK$c;CtTPIG( z6G2f`7cPhshdn_nE^r`HrK&1I=>Y-9-cnpdx>5uZ;()}#QKWK0LT}bi8b@lG!}!hH zneTn?n|aUQ417FT8uYkb004hK{_e`3E`UF9Q5)W>vH7(Ka0{kDBPu9_k#4jF6%>I9 z+!j?(L?&|ErrH!cvvb?7Ius{!a@(Og6p2aPcB&1Ei@B6iBWvUiNtG2hb91{v^(bEE z<+e+e6(93)yHRaY{LIg7S+ywv7T~s9wJFW4ncE(P=Ye&1J`PB}klXZ4Ox;+e9Kno;D0<>nWMQa@*LqrRX+AI}VC>=_@S(9daXl+xE zwDwWK@}z@dNVg6XYjuEV9YN4KgOK;-$#C@$>)JvpZQ}rd7Mgm*0XoBw7Q>Jh!Z0PK zNh-Nx8y{0$d+poa;cEC=VC|LBDutRSLA0(>(K?ZKhruG_hkC|>(Id2!dbSwu7+QE2 zJ(4D=cXn*z<9`wA-BN9fkj1C;oP>fF34+#FCt+_olsdLMtk%ElGMqI94iGIG1Z|)W zsV^N$ov1^?Yk3h=-7O2+o*-zkI^h0vD0Qk17;)n}DAr|e(LIYB>w<{dU=XyubwLKS zeG!Ny{=x$>VoFDrXolqq3o&Bav<%Z@#B`p_&F7d-jemvTG2{eQ_9ROfVdR4SdFaRtIv=TqEsK0QgWw0g6Mj1v*z?F=AzVLq2sLGd1n{d?uIYQc^6> z*bDM|9iyXIx8NTTiF*U5JBKUy^X({K(Wr4#YBzct@4dAL(HwLXv)mGcj^T0~Cq#>h zmW?-Am$~7STbr>5y@pZWwsLlX95BY@y}mVPgURO(@r2}=B}(-L zX5BkpUrgZlKpihh?=7Rj9U)O;pZlamUf@S4iXJ2M5c0rlk6JIRWlm?)&j*{%EzA}u z_NAn;;tttReH40>KPf!U^Q_T%*=sstyyrnWw>+~WTuZ@pWc9qxbUJ8dwFOzkP8_v( z(W4j$r^80b8zxaB>AiBolBT$HsW?M(i&(7Nr(>dNyHqITEtOtIOEosVgCuHn`{=8j zmPoND(l}0>Sku&#yLJs5n7zZ-Pw_He3+uxjk}! zZslru7%Q6n?YopLP5jJBgDzsejrybpnncY12ZQRJ6cuff80NP$4%s&L(xUvD4YH z_z{u|LZY0Im>bOj2@Z{fgix!hoT!A5K;lwzKwVT3sT|-$s-kj2LT@%3Qx~;!7{7Tt z^S$qT^WONqk&8pkkw~}$0N~GWuAI3N0Jwz<69_A6YNAs#a=2QL5FVY@gPl23b(peoaxEAr=w~MGLDD77=zp12xK` z!tT&Ojj@=pgIcE=XK`VNG(}CYgs{U}huX!ugdNcowVQRPq12rPJ*r2GqzHOU@6_X? zWR&QM36CR+^^|&MMvuBuTSMA`7MXIB`~EMDIz0o=k!nGs*bYA=Zmf zyhxJG*113y-0y7|lHQjDeMcKcA7ZpvxI<65u^))op9Fm%3C(+G?I`ukOt?U;q3^s; zpzH=2BYHXsdZvwBf2n8Y$rge;?n7!q3+g`A*(B(>HsFC$&&)v=t~K;s_fTxlg&G1eo;e8YUlDwc? z;J+v*CwJifVfPRn0Dv`#?nFln01AYr0l>mi%h3$Fk(ikBd?heUa(pz@cj#cGZ21%N^PcpR|RH-hnx zCO@29^{uiCp`Uw)ulEjrG5+P$+SJvP*GHaN=hMOQcn$#G4xw~wbfHcc>+Iv`3ooNe z+iNVBtENZ}#iD+YwjxHwQ|I7s@R0CroK_ES;?Ly?v7)H_`^DXeeiuWCn~4QwMAq09xhJ; z;>A;$FU1F&*sP*M?3l&M)HE0~iWV!gh9$aPw2k|)>`4@y$ BkuCrL diff --git a/backend/src/backend/routers/comments.py b/backend/src/backend/routers/comments.py index 6393035..0ba527a 100644 --- a/backend/src/backend/routers/comments.py +++ b/backend/src/backend/routers/comments.py @@ -16,9 +16,3 @@ router = APIRouter( responses={404: {"description": "Not found"}}, ) -@router.post("/") -def register_user(session: Session = Depends(get_session)): - comment = {"test":"test"} - comment1 = Comment.model_validate(comment) - session.add(comment) - session.commit() diff --git a/backend/src/backend/routers/users.py b/backend/src/backend/routers/users.py index 594646a..2bf0f6d 100644 --- a/backend/src/backend/routers/users.py +++ b/backend/src/backend/routers/users.py @@ -1,3 +1,6 @@ +from pyrate_limiter import Duration +from pyrate_limiter import Rate +from pyrate_limiter import Limiter from backend.models.user import UserInfo from backend.internal.authentication import get_current_user from backend.internal.authentication import create_access_token @@ -12,6 +15,7 @@ from backend.internal.database import get_session from fastapi import Depends from sqlmodel import Session from fastapi import APIRouter +from fastapi_limiter.depends import RateLimiter router = APIRouter( prefix="", @@ -34,7 +38,11 @@ def register_user(new_user: NewUser, session: Session = Depends(get_session)) -> raise HTTPException(HTTP_400_BAD_REQUEST) return user.user_code -@router.post("/login", status_code=201) # TODO: rate limit +@router.post( + "/login", + status_code=201, + dependencies=[Depends(RateLimiter(limiter=Limiter(Rate(3, Duration.SECOND * 30))))] +) def login(user_code: str = Form(), session: Session = Depends(get_session)) -> str: user = session.exec(select(User).where(User.user_code == user_code)).first() @@ -42,10 +50,12 @@ def login(user_code: str = Form(), session: Session = Depends(get_session)) -> s raise HTTPException(HTTP_401_UNAUTHORIZED) return create_access_token({"sub": user.user_code}) -@router.post("users/forgot") # TODO: rate limit +@router.post( + "users/forgot", + dependencies=[Depends(RateLimiter(limiter=Limiter(Rate(1, Duration.MINUTE))))] +) def forgot_user_code(email: str = Form(), session: Session = Depends(get_session)): user = session.exec(select(User).where(User.email == email)).first() - if user is not None: pass # TODO: send Mail