From 4f3946d1c38cdd4cb4731e00f73aa3bf14c51414 Mon Sep 17 00:00:00 2001 From: c-d-p Date: Thu, 17 Apr 2025 11:25:21 +0200 Subject: [PATCH] Calendar + NLP modules implemented --- MAIA_ICON.jpeg | Bin 0 -> 80486 bytes MAIA_ICON2.jpeg | Bin 0 -> 34065 bytes backend/.env | 3 +- backend/__pycache__/main.cpython-312.pyc | Bin 1301 -> 1405 bytes .../core/__pycache__/config.cpython-312.pyc | Bin 1016 -> 1083 bytes backend/core/config.py | 2 + backend/main.py | 29 ++--- backend/modules/__init__.py | 13 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 144 -> 706 bytes .../admin/__pycache__/api.cpython-312.pyc | Bin 1637 -> 1784 bytes backend/modules/admin/api.py | 3 +- .../auth/__pycache__/api.cpython-312.pyc | Bin 4664 -> 4708 bytes .../__pycache__/dependencies.cpython-312.pyc | Bin 1369 -> 1372 bytes .../auth/__pycache__/models.cpython-312.pyc | Bin 1459 -> 1579 bytes backend/modules/auth/api.py | 2 +- backend/modules/auth/dependencies.py | 2 +- backend/modules/auth/models.py | 10 +- .../calendar/__pycache__/api.cpython-312.pyc | Bin 0 -> 2450 bytes .../__pycache__/models.cpython-312.pyc | Bin 0 -> 1004 bytes .../__pycache__/schemas.cpython-312.pyc | Bin 0 -> 1053 bytes .../__pycache__/service.cpython-312.pyc | Bin 0 -> 2793 bytes backend/modules/calendar/api.py | 46 ++++++++ backend/modules/calendar/models.py | 18 ++++ backend/modules/calendar/schemas.py | 17 +++ backend/modules/calendar/service.py | 45 ++++++++ .../nlp/__pycache__/api.cpython-312.pyc | Bin 0 -> 2399 bytes .../nlp/__pycache__/service.cpython-312.pyc | Bin 0 -> 3051 bytes backend/modules/nlp/api.py | 53 ++++++++++ backend/modules/nlp/service.py | 100 ++++++++++++++++++ .../user/__pycache__/api.cpython-312.pyc | Bin 4228 -> 4271 bytes backend/modules/user/api.py | 2 +- .../test_auth.cpython-312-pytest-8.3.5.pyc | Bin 23885 -> 23885 bytes ...test_calendar.cpython-312-pytest-8.3.5.pyc | Bin 0 -> 4905 bytes .../__pycache__/generators.cpython-312.pyc | Bin 2270 -> 2270 bytes ...test_calendar.cpython-312-pytest-8.3.5.pyc | Bin 0 -> 3754 bytes backend/tests/test_calendar.py | 44 ++++++++ 36 files changed, 366 insertions(+), 23 deletions(-) create mode 100644 MAIA_ICON.jpeg create mode 100644 MAIA_ICON2.jpeg create mode 100644 backend/modules/calendar/__pycache__/api.cpython-312.pyc create mode 100644 backend/modules/calendar/__pycache__/models.cpython-312.pyc create mode 100644 backend/modules/calendar/__pycache__/schemas.cpython-312.pyc create mode 100644 backend/modules/calendar/__pycache__/service.cpython-312.pyc create mode 100644 backend/modules/calendar/api.py create mode 100644 backend/modules/calendar/models.py create mode 100644 backend/modules/calendar/schemas.py create mode 100644 backend/modules/calendar/service.py create mode 100644 backend/modules/nlp/__pycache__/api.cpython-312.pyc create mode 100644 backend/modules/nlp/__pycache__/service.cpython-312.pyc create mode 100644 backend/modules/nlp/api.py create mode 100644 backend/modules/nlp/service.py create mode 100644 backend/tests/__pycache__/test_calendar.cpython-312-pytest-8.3.5.pyc create mode 100644 backend/tests/helpers/__pycache__/test_calendar.cpython-312-pytest-8.3.5.pyc create mode 100644 backend/tests/test_calendar.py diff --git a/MAIA_ICON.jpeg b/MAIA_ICON.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..9016bc061958a003f30f1865aee1842f656dbfdc GIT binary patch literal 80486 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 bIPi-TcW^QJgEn(o^(A-TF7hk>GycB-on=m5 literal 0 HcmV?d00001 diff --git a/MAIA_ICON2.jpeg b/MAIA_ICON2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..2383cb9ca85f5b197a3404ce94aa9cf6ae311fb9 GIT binary patch literal 34065 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 literal 0 HcmV?d00001 diff --git a/backend/.env b/backend/.env index 0726ac7..d0c81d1 100644 --- a/backend/.env +++ b/backend/.env @@ -1,2 +1,3 @@ PEPPER = "LsD7%" -JWT_SECRET_KEY="1c8cf3ca6972b365f8108dad247e61abdcb6faff5a6c8ba00cb6fa17396702bf" \ No newline at end of file +JWT_SECRET_KEY="1c8cf3ca6972b365f8108dad247e61abdcb6faff5a6c8ba00cb6fa17396702bf" +GOOGLE_API_KEY="AIzaSyBrte_mETZJce8qE6cRTSz_fHOjdjlShBk" \ No newline at end of file diff --git a/backend/__pycache__/main.cpython-312.pyc b/backend/__pycache__/main.cpython-312.pyc index bbfcf28fb39881931257daea40dbc4245f68d6e3..3000c46954dbd163ba71151aed0d3c6d8bae5335 100644 GIT binary patch literal 1405 zcmaJ=&2Jk;6o0e3-ksQ9LlVP5I#kpX@YM)u{7lu3yI?0^k6alj=8aV0|{!j>G_RSd<=8M(xk9o5wg&7}rS zY{i*z^G4n+7=^^nIYn1D^h8&kl2MX?mHL$|;dHgN+n7^){b$qlxI~|`$L&b8F7~X@LycWx55LiduPtGbRu}?7h7L`jt{t>bNBwiL5 zIm;$z3PGf0MwamonRawq;eW=P$$Y2l|Hrf8uJQ%hA;=Znl|LjkX$_mFw0oXi%W*OC zF?CsF+Gb?N)aHKBLN2(-6Xz|?%!mn~M)*?*g`ykP$LAW?e3vyWJ7`$G%^FvltIbB+ zwBAR)8m`&%>H(7K^g1jIOz)$!nbzu<7EZ>Xe%|pd(+Mxsvz?L%{yK_>@aGVIrNz(n z&-4RY8PUqkcWzwXqm_O7@=qCD9ntE|{tai3R`=;E52*fEsG{$u&6CXqydf7nana^m zgrC4AEt@}sYW#GTGAo9kLbxbSiKm3gbEn3VoGX2`@(18DkwINZfN>s*<>A!{o&tUn zMePK(C>>~=KQ87hNgb=vAn18rF4*UyvRLcjRGUFBsftqp>6Xt~UG%+;6Px{+KVxoN^uT6K--j zCHnz;4Ia!@QBXS`(6pKaB%qD%SRvr^>Z*&VL5%M9Y~4Jg&yLM@h6@jj zr2PTbFy2k*@KUANx3H}JxC zFZ5?mqB$tYPMj$~;SwpHC`x;cED(Gi+>9Y*bhwr$^M zA`UWTJBnhVc=Y2o^L#I$rsGDY({rggIdOEtoVJ|{m>)B+y|5L{a?STcP%R;tBUzdsr(m z7@Ng1O$1Z@UI&}2!-u~h#uVGgOJ-R`kSf?$Cy<8?rNs#8Me6g?&r?&UrqaYQk#b)5 zLdWmBG}m?))^QiuAWk2(1KITl**Kb_wDDD(-phoLw=nhsc0Pwa>9_AW?0yRMH?Zd= zH0RVcXs$qW-gpEfYcRe7qgDfjiavM;;t|bm+|TPiK+;7|yXVl=TUf9y|X4 diff --git a/backend/core/__pycache__/config.cpython-312.pyc b/backend/core/__pycache__/config.cpython-312.pyc index ccff7aa6981cf2a247eb55f9c87cb9360eb4d635..72ecfb17e51331b720f3c4e7ca5f80dc5ac76686 100644 GIT binary patch delta 184 zcmeytzMF&hG%qg~0}yP}VaN!c$h((u+r-ne6_^-Oc~S&Y_*OH4^O`*wIj5maD@wxl^yZgAtI|g{hd%H&ZX$nksWy)bH5}mw`$(6Bm@)xFL@yje` z52X|?C>m}sx-4bZ;5Whf3X55h?Bp0`PbnFoX+^RiLJmm$;;_lhPbtkwwJTDdyq{T7 Zf|t>}qvi_(koqXcz$4Oa)yM%>4FK7_F>(L^ delta 147 zcmdnZ@q?ZBG%qg~0}%YZ@jqR9BJWJCV#0O?ZM#iTM nT6Y;l?=r|eWZ-V${ldb{Xx>rtg#k!?lw#l!>9%U*0Gk8=h%qO* diff --git a/backend/core/config.py b/backend/core/config.py index b37efe8..392a083 100644 --- a/backend/core/config.py +++ b/backend/core/config.py @@ -18,4 +18,6 @@ class Settings(BaseSettings): PEPPER: str = getenv("PEPPER", "") JWT_SECRET_KEY: str = getenv("JWT_SECRET_KEY", "") + GOOGLE_API_KEY: str = getenv("GOOGLE_API_KEY", "") + settings = Settings() diff --git a/backend/main.py b/backend/main.py index cef61bd..6bae420 100644 --- a/backend/main.py +++ b/backend/main.py @@ -1,25 +1,26 @@ # main.py +from contextlib import _AsyncGeneratorContextManager, asynccontextmanager +from typing import Any, Callable from fastapi import FastAPI, Depends from core.database import get_engine, Base -from modules.auth.api import router as auth_router -from modules.user.api import router as user_router -from modules.admin.api import router as admin_router -from modules.auth.dependencies import admin_only +from modules import router import logging -from modules.auth.security import get_current_user - logging.getLogger('passlib').setLevel(logging.ERROR) # fix bc package logging is broken # Create DB tables (remove in production; use migrations instead) -def lifespan(app): - # Base.metadata.drop_all(bind=get_engine()) - Base.metadata.create_all(bind=get_engine()) - yield +def lifespan_factory() -> Callable[[FastAPI], _AsyncGeneratorContextManager[Any]]: + + @asynccontextmanager + async def lifespan(app: FastAPI): + Base.metadata.drop_all(bind=get_engine()) + Base.metadata.create_all(bind=get_engine()) + yield + return lifespan + +lifespan = lifespan_factory() app = FastAPI(lifespan=lifespan) -# Include all module routers -app.include_router(auth_router, prefix="/api/auth") -app.include_router(user_router, prefix="/api/user") -app.include_router(admin_router, prefix="/api/admin", dependencies=[Depends(admin_only)]) \ No newline at end of file +# Include module router +app.include_router(router) \ No newline at end of file diff --git a/backend/modules/__init__.py b/backend/modules/__init__.py index e69de29..154386d 100644 --- a/backend/modules/__init__.py +++ b/backend/modules/__init__.py @@ -0,0 +1,13 @@ +from fastapi import APIRouter +from .admin.api import router as admin_router +from .auth.api import router as auth_router +from .user.api import router as user_router +from .calendar.api import router as calendar_router +from .nlp.api import router as nlp_router + +router = APIRouter(prefix="/api") +router.include_router(admin_router) +router.include_router(auth_router) +router.include_router(user_router) +router.include_router(calendar_router) +router.include_router(nlp_router) diff --git a/backend/modules/__pycache__/__init__.cpython-312.pyc b/backend/modules/__pycache__/__init__.cpython-312.pyc index 7ed90b2a15a4c441547a5dc4a40afbbc5266312a..8e2100d8ef7c04525f1c1cc63cd28616a58af814 100644 GIT binary patch literal 706 zcmaiwyGjE=6o$`alih4?f*2dIh(aKUnZj0ulqnRkOtY*z6SK+Q*b5jdAHhyvLG(?m zgcZX=3K4{KLb_DW?8VrG9G2nx|MQ=j*?Fy2OTg;;1O^iX@Wn+|LJIRD>pTDff($TG z4vO@To<^m#9B$lqoNx41Ky0voc`>8 ziHAxIGP9;znh_A1>L-}9TfhS2fo)Q(5eI8Fq4=!R?cgg_8?pVdX_LU99#$0H(tSl~ zJL5(1IB`$iZ8pze!MkS5kAM)G!tN9fr*IH|M^k8h%A1ePP;T6b6A(Y3{s#4XBZU2> V8ila8O4%Vam%ZUTG~6wA)-MppsQ>@~ delta 88 zcmX@aI)TyrG%qg~0}$|P|4Rqak3j@F_{;(nna)tjpvmaBlA(x+fnhQ`lan|rP?Qmf Qi$RQ!%#4hTMa)1J06&cjdH?_b diff --git a/backend/modules/admin/__pycache__/api.cpython-312.pyc b/backend/modules/admin/__pycache__/api.cpython-312.pyc index 171f615c8de704609b66f97b7411bff25df4c98f..3090f205dbb77ad4fe780aa3835932d266931e07 100644 GIT binary patch delta 528 zcmaFL^MjZ7G%qg~0}z}PX2{q%kyn!O+eCHW`V@u~wjADEz9>FM1}277<`ni6j&w#K zizStBH6utp14BCF8qU?s5Ox%QDu0$DgpEw5aKTikaJMk5hDt>V;!w>4RjtpE!kfyN z$_BQO6J|sjlO)i9G^P~378bZsLY4fQ0u%p*T5B@i;z~@(&CH9>&&#Q-V$%n6Zn1(X zP3Bu{1x2Z8nH9HKN)pqHZ}Ft07Nq8-q~;}OrWQ{QW^`s0o;;n=T}BLO0}l`v^8$$m zh6g;N6KXGTt6pGHEfU%Mi;;?GG%qg~0}$N%_&?osBCjOlrHSgk^-K(@%&S4dKoG^7%9|w%VIz|%Y^xa| z{1o;U2DoZ|9I83ssyR~`Q`vwvu%vRr#L}1~fkve=abVBU~Zq*Acszv;pBbk_(7jJ`f9}4s6OV4x8Nkl+v73yCMys7$`7`Gl9ehW=2NFrwlUp d8Px7FC;`d)40<2g7`TMHr6(_C^Jf7W007MONhJUP diff --git a/backend/modules/admin/api.py b/backend/modules/admin/api.py index 78f2635..56f7761 100644 --- a/backend/modules/admin/api.py +++ b/backend/modules/admin/api.py @@ -4,9 +4,10 @@ from fastapi import APIRouter, Depends from sqlalchemy.orm import Session from core.database import Base, get_db from modules.auth.models import User, UserRole +from modules.auth.dependencies import admin_only -router = APIRouter() +router = APIRouter(prefix="/admin", tags=["admin"], dependencies=[Depends(admin_only)]) @router.get("/") def read_admin(): diff --git a/backend/modules/auth/__pycache__/api.cpython-312.pyc b/backend/modules/auth/__pycache__/api.cpython-312.pyc index c55ab03f9947376ae8c79a339a4ab3ca550e787c..e50b60104cee8eb4d93f4fbc15164ae8d0a61d22 100644 GIT binary patch delta 674 zcmYLGO=uHA6y7)4-TZEnrfu4Ft4U3o8k06nQ6V&lMi5%D7Y_k1Qk+RzX^l)0@aG_c zAbJq$JLp00l>{%j=uHqWiU=Ztp-07wcfphMcH26Kk2i0=pZA#8*&kW!qh*COb-s^k z>%X=w8(wYC{tWRbk2Rqm?=g%*3Px}q>{z1bBc`VDQ4!-~_!exR&c{(grjQgP{fQpi zd!H13Zi}=CGEMk;UQ=r@o3x~J;1KRY1~0Op$)|*QV0IXfvkV-;RpyMRc)CBmZ`oj+ zOi4UhqDI| z&xYm=DH_gHdqZcC#Si|IaNl5sU{B zd-GK0s^CeG1QqtuyEg>|4<7d1Uc4w?1QGPjZW}s>kNNp#zM03{nctq*K51GaB<#GjyBV?4vvyK6!2AP&=ma1gT$PqT5n3Dc0pKIA7R`1tVf zK-sHK@)$dU??DIR7~v?>aR>70sR8UU3?2>owWFJnk$zd~n*}Ar!(88|%1B`|Y<75T ze|%G6BtWC56m}e6DMrrZOKg_s_>v(7nhBQMR7X=Qk7len*Hc~qV&rplPBKIuZM6Xw zzE#hI>3&xu3gqxd>cUZ5*Yr>W}`VP)6KFF*n&!^oFnU@eD>VGVNl$!tm diff --git a/backend/modules/auth/__pycache__/dependencies.cpython-312.pyc b/backend/modules/auth/__pycache__/dependencies.cpython-312.pyc index 9cbe2589719688567e301b5f252ee0120c777791..b6e718cab69e5890ee06189805175eda1e495e8f 100644 GIT binary patch delta 52 zcmcb~b%%@hG%qg~0}xb8Fl6l8$a|fMsfls&Go~&^)yaj-65K+n7u2FI3q@bxiQYVs H`2-^XjBpSB delta 49 zcmcb^b(4$tG%qg~0}wd=_@BOGBky%4CPs$I&zQOxl_nQ5OK|YWUr-3S!V|iA3iAm@ E0EPGuy#N3J diff --git a/backend/modules/auth/__pycache__/models.cpython-312.pyc b/backend/modules/auth/__pycache__/models.cpython-312.pyc index 3ae7a10bcfb64cc6b62a1c69f1a496863df63b71..fe97777fe806675e36d26dfdbbdbf8275d0399d7 100644 GIT binary patch delta 635 zcmYjMJBSlO7@pZjc9Tsu4>exl87_+Fp4=%I72%BF`4)4HT#+WMnSq4cN1RF2RCj_! z#3o@H?JR|8qaccif~D$Npb+g~!76cDFtgVwS- zvS;96G=FRZ0tArinSQdKjJf8e{6yV?Kmk_((jNkpz-eraHJJ=RJrnDO&`k`->QuF3 zH7V58e`>aGIq9F$;y|ula4B|lo>&RJo*!`ITF}KKK3m{vf<3p}4g=b1cN|EJ(eKaD zU>{%wzG2_gDm$Uz83o`RGLZQqIaa1k^Zk@#v8T#8hi6t?4+qF4m+s=AOESAH?b~j1 zz0nCfJy9Rinp0pCrL-YeA-Vvrv=K>2qV;-h#LXVXByfGqHHpNKMoU5=Hj&W7Jlk?< z3!_HIrSx7%5J}3vY;!t51Ir00*(1~TO4ui1|6j0xXipmqtH)1T`Qeer)y<0&D?d6s zyw8@NpL%=rR_FjECHz$kz+k%wkGhRdQ zhU+*WCVQlnQVUX+P-L&PGlpa}C&zZQvpH_lJD%$`TiEX}g~Vr$eh4nGoBC|6B5Y7x zx-4Kvg%JJ#2fu^rS5Vys^V^^lX$mY1=R#dYXmEMREjU4~+pf`NvK-4=MR|~caOV^$fVg1y zu$JU!r{)!LPJY88&!r9$1`#5YMOn?+K`cK_{>j0tmXqhODl@82KENvLX#f;u1ma?I zAn}2jk&*E!gWP=v|LY9?cNyfrurM(Sbrer<`@#TZeBt0=l1Ht#;7@9vGLg+8CXnc`C*iI{;fe0elK`yqit5^yaYsFDr&C;Z-I=ZV{x|B61 zlP#N9s8=j3cr>H&WKJqf=YmVqRNUe{(p1Zy$CKrv@aA>hB%u!7wY?b5 zHZZx_kiflAkq!{+V;0eWaI{orQcD~@! zY>pJOIdCca`Q)X^?2MiJ7Q&kaC(91?UXje&#r$aTCXWUImEN-ffQkvsy)Z1Hf1@aR zU?s8g)uXEquddQsgF4d@Clm}tq2wnLQ-irxJ%c;W((PP2Xxc!$WppBk2i4G|nq+y)MD6dhV-D<>a~ zJsexT`0I&UWUQ)013ORXqvX`u??h|C=u7T9#CDQ1|C?Tmj90aBNvwVGodJNBjJ&b<;Pu8t$>S-MQ7?1Dg+90E z=wj@m=(@DuNCdLg`HGgxB&}W5>E|gL^qx;>7;cTg&l`e4R-4|xd~likGWYY`%8jSm zvGr*3{twm2NL3q=v@%27n6;tsig_lgo{4brxc8l7JGpu4-W)A3mx*R$q6~Q|sQOX6 zT$&#x^1-4Dxjgk4JlBZFas@_5;gPUsY-n3k?De$Vk-hD)usG>!oHU+?QBN4PJtqEV znfOa>r$gEGe2&Wg^{ZOefQT3mG5;;qiUqGEn~$qd$y{^tuucmVwOEEG%P*9eNIwtx z0c0X{kC6d4upfg1jBD})lMYARFfe)rErYI*pl?3SV9 zQ|poabrt5#j(A;%xgJ8{t{38DTSdxvT@ib6q?mX5Z};E5v_h&!Kl)>Ma;d+D&pq$% zYXMvzJg`16v=t8FGwT4S!n|pA)^(TxHrjii+?%KyVr8O^#Qh8RhF%C=Vdy-rE8?Il zuvCqvtM7d*tbDR%?s6P%O{~Yeg@uVtAOIF7z(S-`piclgP!Ku-`BRBJ;Uf>;9;|jA fs^P=!q7lMJ0?;Ee8n6zc0g`}vXA68hA~W?LsjN6{ literal 0 HcmV?d00001 diff --git a/backend/modules/calendar/__pycache__/models.cpython-312.pyc b/backend/modules/calendar/__pycache__/models.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aa9c860a9eee5d664695fe88713f12c1a260a091 GIT binary patch literal 1004 zcmZ8fziSjh6rTP489;dl zKm{2GQeMw7yJ|)I!AV7->SByLVMMi+C`C;~sQNG^LDZyr-AmC%5F%}}&?6v$jYUb0R ze5joJ^xStKjB<>OoB!k#a^HE5_1~Rh#ua8uP#tGw6~;Q0S!@DoP&m}jJ74M=6_XYh zJ&Ypgk;XF=rL^pisEasHHrTTZZ4!hY>AG8}yTrI2bujieF?z0d5=4?}0IB?lAr>ob zdj6K%j@uok97@(JlT>%z$P1C{Qqy(A74oH7i~=IvG- zBHM>;+m9i#*J>*@o6pY5*!hr&J=TId5KgM?E-A3fnc=;YfSDceW$H$6?W`ut(T25#Z6$uI)W`q87)c1gbuMzO|XFv^V5^V`tqWcy#i2kkwfSjQ?YNKQh zttD!oSgj%F{1;&>uA{ppS#5*~%}B`Zy``CGFpB+2OT;3fO<5+CM=WlMIM1ZTMaYCS z&|5l59)*f^$D|VkS(wrwkmEs+=A@k{c_Ikjw8La*F}PrIDhR?X%f%p&2LW@i38tRQ z)I3-j;S=-`;pnEfk*Cy)NXv`xhrG4r`^(;oFnW#Ey`l*BqG9VEk2Yu;^2Jt%*(#F) zHAsE~;XU-qlidfs+QR0;-RiFRFneGw^vc!lWu8IFmpI(?P-{NW77q^l1;U6OrW1p)Y0$8v2sGxF(AC~xH%r&5oJEVVghK}<%f z;*t(de;TjTszmb*9HMbFe{R0TMxL$5FP}DDlTBbCt0~;~#uAri7a$Gdng5GRxXR2_UL!#;0XA>K7CYXv~%Hd2}HlsKNsvUj_0f*z1 zyDPoQbobF;Q?u&70ih_N9Gk8+*bwQoIwZ_Q95FS5V$6edqn#f)OT~8FVm0(rAIGmF j{4z96`vF(KLG94Av}+&TL%{2B($eZ*=Dk0t6jlELq-gKv literal 0 HcmV?d00001 diff --git a/backend/modules/calendar/__pycache__/service.cpython-312.pyc b/backend/modules/calendar/__pycache__/service.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8088b0de29980debbe419ea8db0a520947c63267 GIT binary patch literal 2793 zcmdUx&2Jk;6u@Ucy>Zr#OXDQ1YLqs7#FZKgRTU~lEfu8ngSLl=OVrA8cgM*(>o}cV z7c6b01cGn{qOF9KfRNzO162>?m_GrDOO1;XR;h%9IB;_@5>ijRH{LbQ(gFuKFp}rJ zd2jaZ?3>@r^EZh^oIu-1k=d^lLVm{?Owl5qSn8b{c?w0Y9qAfiBEMl9+lB#g%WeSh}vh#*aotaO3lF5Mwnh2a~0*|ZGTmkOrot45_< zwp>5PXpvE8HY+oHC4az=Q_N5va#!#bt~)X~N1;7>F*jQ&)0|;0-nZcWFl)=^w=5N46&jsGc;pcSjt#l-M}~Mf)p%<*RGL|yql7Vq&LZe$LxJB`ds&D62F0?^zzdj04J$L`5PY&R}T z>!1&3zn7fu*oTG91}U@b*PzQFSqCym_*xclu%@dESV$tgvgcqPXZur7o`~y6LmOE;-O!$iz^h0J z^*5Eo^kw?)Oe;o|_(P58yS9`2o5`_z+Su06=xXIwr8)Hc=Fp+W(4po~?iV5`W7p$# zss84+HgHq9>8wqDryXcXVE*BWw<0HdM=is%$ZtaJ|HZT9Nl)OJJdWob6_NZE)dHyn zob^RGW22BO4jS8!8e-jagc*O;lK!ArA~MJ%2bT;}c=2o&W>2olYqjFe;2r zbpJ3pos3A-VEAFM+!{< literal 0 HcmV?d00001 diff --git a/backend/modules/calendar/api.py b/backend/modules/calendar/api.py new file mode 100644 index 0000000..a754225 --- /dev/null +++ b/backend/modules/calendar/api.py @@ -0,0 +1,46 @@ +# modules/calendar/api.py +from fastapi import APIRouter, Depends +from sqlalchemy.orm import Session +from datetime import datetime +from modules.auth.dependencies import get_current_user +from core.database import get_db +from modules.auth.models import User +from modules.calendar.schemas import CalendarEventCreate, CalendarEventResponse +from modules.calendar.service import create_calendar_event, get_calendar_events, update_calendar_event, delete_calendar_event + +router = APIRouter(prefix="/calendar", tags=["calendar"]) + +@router.post("/events", response_model=CalendarEventResponse) +def create_event( + event: CalendarEventCreate, + user: User = Depends(get_current_user), + db: Session = Depends(get_db) +): + return create_calendar_event(db, user.id, event) + +@router.get("/events", response_model=list[CalendarEventResponse]) +def get_events( + user: User = Depends(get_current_user), + db: Session = Depends(get_db), + start: datetime | None = None, + end: datetime | None = None +): + return get_calendar_events(db, user.id, start, end) + +@router.put("/events/{event_id}", response_model=CalendarEventResponse) +def update_event( + event_id: int, + event: CalendarEventCreate, + user: User = Depends(get_current_user), + db: Session = Depends(get_db) +): + return update_calendar_event(db, user.id, event_id, event) + +@router.delete("/events/{event_id}") +def delete_event( + event_id: int, + user: User = Depends(get_current_user), + db: Session = Depends(get_db) +): + delete_calendar_event(db, user.id, event_id) + return {"message": "Event deleted"} \ No newline at end of file diff --git a/backend/modules/calendar/models.py b/backend/modules/calendar/models.py new file mode 100644 index 0000000..ae27719 --- /dev/null +++ b/backend/modules/calendar/models.py @@ -0,0 +1,18 @@ +# modules/calendar/models.py +from sqlalchemy import Column, Integer, String, DateTime, ForeignKey +from sqlalchemy.orm import relationship +from core.database import Base + +class CalendarEvent(Base): + __tablename__ = "calendar_events" + + id = Column(Integer, primary_key=True) + title = Column(String, nullable=False) + description = Column(String) + start = Column(DateTime, nullable=False) + end = Column(DateTime) + location = Column(String) + user_id = Column(Integer, ForeignKey("users.id"), nullable=False) # <-- Relationship + + # Bi-directional relationship (for eager loading) + user = relationship("User", back_populates="calendar_events") \ No newline at end of file diff --git a/backend/modules/calendar/schemas.py b/backend/modules/calendar/schemas.py new file mode 100644 index 0000000..00b6755 --- /dev/null +++ b/backend/modules/calendar/schemas.py @@ -0,0 +1,17 @@ +# modules/calendar/schemas.py +from datetime import datetime +from pydantic import BaseModel + +class CalendarEventCreate(BaseModel): + title: str + description: str | None = None + start: datetime + end: datetime | None = None + location: str | None = None + +class CalendarEventResponse(CalendarEventCreate): + id: int + user_id: int + + class Config: + from_attributes = True \ No newline at end of file diff --git a/backend/modules/calendar/service.py b/backend/modules/calendar/service.py new file mode 100644 index 0000000..0a9830f --- /dev/null +++ b/backend/modules/calendar/service.py @@ -0,0 +1,45 @@ +# modules/calendar/service.py +from sqlalchemy.orm import Session +from datetime import datetime +from modules.calendar.models import CalendarEvent +from core.exceptions import not_found_exception + +def create_calendar_event(db: Session, user_id: int, event_data): + event = CalendarEvent(**event_data.dict(), user_id=user_id) + db.add(event) + db.commit() + db.refresh(event) + return event + +def get_calendar_events(db: Session, user_id: int, start: datetime, end: datetime): + query = db.query(CalendarEvent).filter( + CalendarEvent.user_id == user_id + ) + if start: + query = query.filter(CalendarEvent.start_time >= start) + if end: + query = query.filter(CalendarEvent.end_time <= end) + return query.all() + +def update_calendar_event(db: Session, user_id: int, event_id: int, event_data): + event = db.query(CalendarEvent).filter( + CalendarEvent.id == event_id, + CalendarEvent.user_id == user_id + ).first() + if not event: + raise not_found_exception() + for key, value in event_data.dict().items(): + setattr(event, key, value) + db.commit() + db.refresh(event) + return event + +def delete_calendar_event(db: Session, user_id: int, event_id: int): + event = db.query(CalendarEvent).filter( + CalendarEvent.id == event_id, + CalendarEvent.user_id == user_id + ).first() + if not event: + raise not_found_exception() + db.delete(event) + db.commit() \ No newline at end of file diff --git a/backend/modules/nlp/__pycache__/api.cpython-312.pyc b/backend/modules/nlp/__pycache__/api.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bfb7551ab7a5d2346fb4e9708c36194fe43985c7 GIT binary patch literal 2399 zcma)7O>7fK6rNq%Ysc|VVrN6ssHyo8iJ{n~0@?y94HQzKK@`fNt4i)>XOe8PyEe0H zej-OuRH>XQZgA)!s(LUA5*(3w$q}g+TjoGVi9kY8)f+UNP!D}G>xG2S(vf!Ny_xsE zH}mFwv%e*iaRlw>VKn(`457zd2^#34tvrL_I>HD`7P2KxvSm${xGq~EJFJC;9I_&| zqA5ZSTTwfv#e^KOI_$U>7qVh?+6gTo$Wpm#?ES4yGQF0 z^BtCI_iDWok`a+`9CuDgw-WQRzcpb{|u&}33xHDbF_C9wQW!u&r%;NkYCDW-?J(gH~I40vUBh*eN9~AhwzVbKR z%ys0o?+2k83hrYzgr!>O9HJ@jg=Y=s`oJx)xdIkg<}(*09GV_Nh(eus5ttAS_nHVS z!rbB)=|^ccj3c!$R(_ICbC0O-$bm<+?SN`>O_~a7J(z@XTwaG1TZPmikhTL-XW+Ch zcEn2tYyTFd7MX9K6?Ph5h2JUgcf0{V{U&^zs6}oi=fl1o#7M1*krpxDff)Y-XVpHt z0u0|Iv$iS<@W#ut5e-}S*LCSncPa*aS5+u-;qTz z@pRL2DZd!jx0Y0#ejYV}V3=iej9=wk?^^Sc&rD2HfJOO>1eA&kdX|8OI(yaLXD6mS z+3Oa4j$#(AI@3=1yu;FMq0~-`c?~Et({sk5#3)ZV<_y6>#vrcZAM7T|$0&c&DX(vl z691^OiD?&~O7M>FIIqwiE~~ujg^oo7Rx6OXs^vj~`Mcn9>hcTA<(?OclVzI}4O}T2 zWlV~r!$*gUW4bX7Z&T4O!eEG1oq3I65>W0q+4x-EGSsbMYZcMdO z`O71ZqN!_x&1m0ZYV+JkeWbZ%S1Yx<5!?MJ-hFMT8Sh_8s*7rWQ+@x&#N1?apa{~{ zBM%0)-&LB~1C7Li<>aPCb*P@He{;KZv(!{iEky6dnxB3N61V$!VZ50gZ6rpQlN%R% z2Ae(m>w|ZOn%nk)boKC}x~={}y>|Q3%}WcBmU@JH>{-~;%pPkbjx8s*{I`d6kK9+k zTIaJ0Q);OP*Q`HI_C6RW-W^%^yt#k0nLW`+oOqB-EoKJmp~kLb_cO;EiQ_AfD0Cv< z&!XeH>p@B>e=8^_GfTN=E!{FEiG8t9rZ(j-AWIr$N(#LA#&lp5zc`i_b1(ixuBZ&w z*S@TRUiBsmSp3t7W0=IH{4HeJHS3@dAWg@b6}aXC1UY9K#4kBPz_$X&fGjU;MCEbb z`GgTHc#SnblJ1IPWeW9wy5UOM^;pRDs3;&h$WaQsdk?zjvHgC~Pv|~S`JctDLH8si zNzxx^>k`_ujB-n8=Q7%}gtk0HA3j90Ei}7?K6g<&hNqq5r%7 zM)KX3l>2?}aO2>q*51=iW2!NIwq?+#XtVT%G#7dz#yh+GvGMh{e~F2e5Rx}OmAQ@B F-9P7ZnTG%X literal 0 HcmV?d00001 diff --git a/backend/modules/nlp/__pycache__/service.cpython-312.pyc b/backend/modules/nlp/__pycache__/service.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fa577a797dd7e3990a3c332682dab637a1615d96 GIT binary patch literal 3051 zcmbtWO>7&-6`tktPpe-hk!m*)Ghqu`bjhWx$VNiM5}3rXWmJ|Sstv@nAlAD>a;fDm zJ+m}TMgoi=hxiaUx5P+-IH%aKffhOE(sM6zRiMGvKnwKL8&xGh;8Wks?#8m57zi@h zo!>Wa-n{p{_vWvoqY8p@X%RKP8bjzmd=Qp+(AkSf2z`hQWJnfjNfk-r{fHH*M4*)| zxg}TRRw9Ox48%gqUYZhuXp&8PN{{eHMRZ2K^6 zBzRp>jO5Sf_c1btK9wuOhC&jxh%x+bv@#O(N1#92i)2Ut%SFjbUaU@R%{-rtcu7NZ ziEFlqm*jQdv59xIwA9ziy;rGAs;$#&m2*0I>C)+w`s!M_U#*>8X&Ozd+<0{Z7$vl} zS=}H#O^PC0HDn!>)td8f64`7@?Sw zOC7>ohD{q5m`gjl+o8n3=gKSRvF@~5nr$#uQA(FJ)6yOB4?3R@lp-D4Z@ic+r^GQ3TU_x8fIpz4a~&pzzok2^@@t$Y-p|!5;k{<20SRX z%nbrk8(MEMo5MZ0Dr-0$%fPy3S#S)n3q{IdkQUb*+SRBbB;c1k%ED`cv|<(%ptXog zsH)7VxK7+E@FKRM(JHwN60;dl9CeF$rOj`uS#O2b`eP0Q-488fl@~!9hH-$^jBC0U z5qimCgD{<%f@d%joD;JDQSLcxIl9J$@l~wMtGLtV+YX*5E>JZ=M$mo^2giSZ5wH*3 z;SoU&to`(>?-%Y7W?AKg3TIiM>L-esRg_i2+71}+*s+!Kzg<6e40lbp;iJ$80NA;x zyscoI@llm2;>_df&g3|SurC7&P7h z65S27%tC6R9ZoklJ9i>KJD)#(5+6TNoSlVFofYLbVi0ZsxEv%u`2_ON%zV#Et!C;Z z19#X`wiIOzoFW7Yre?k2V%zC*cj-q|rT_j<4Fj6Zy5L_T4g~J_NK8)rZK1+AqyW z*n8MEV-Ndb&yd_O_duT6L=ckr#Ify8C>E964v^UJRh9g&bb9*&JJT5#5Sxec3rnil_+X+=TBdF0=hWGJ&C*z-pH!6JL69rreq7=4zgT}!l%2)? zgw}3brXMy6P3G8;cZOZkY7?sQDDOQ*h1W4iH;{v>Zm&(UvKMPP;Im#*7#xD37l&TW ztoNsv?8};E2FW4Zi)++rLBh!!s^QM zg*7kArSf8yqZ!PLa(H>l?=`DKPE+d8+Yy=seR|38D8^xc@q@WS0}xrzjdno?SquE$ zg^QZL0nS!{vpW`H1>0&DKrxrWh17P>8wZExO0NdMqt61bJp8N;)m8LO5=~59-@3N- zkMaDy@%-0g_(3S+S=4w4q$|x)MYXW5@wjnSG$kV>h z&^`dyc)Eqpv8|p+!0=SK*z+GA-3GD6z98)b*<*R$=R)~IFB_qw&`|C|*%;;TIhx`X zf5Ul`0Z`spS$(s#`g#BuI>iYNK@~uO{*n{N{Z|N0!{9BxI1d$=RC(N_M{aiSrPM)8 zm`@hwOQMlyuAjPgYCC#p5B8z#m=~`L_oLhj^ch~kGYe5}7%%>s0J#v@lOdmaGK67I z?zlRAno~{lila-&a~sj;d7lgVAo+@q&INh|hCGn48&ClzBaJ-skM@}e|I#1BWe(d1w(Clx;`?;&Uge~^Zx!yml% J4T469{(r^DJU0LU literal 0 HcmV?d00001 diff --git a/backend/modules/nlp/api.py b/backend/modules/nlp/api.py new file mode 100644 index 0000000..b495008 --- /dev/null +++ b/backend/modules/nlp/api.py @@ -0,0 +1,53 @@ +# modules/nlp/api.py +from fastapi import APIRouter, Depends +from sqlalchemy.orm import Session + +from core.database import get_db +from core.exceptions import bad_request_exception + +from modules.auth.dependencies import get_current_user +from modules.auth.models import User +from modules.nlp.service import process_request, ask_ai +from modules.calendar.service import create_calendar_event, get_calendar_events, update_calendar_event, delete_calendar_event +from modules.calendar.schemas import CalendarEventCreate + + +router = APIRouter(prefix="/nlp", tags=["nlp"]) + +@router.post("/process-command") +def process_command(user_input: str, current_user: User = Depends(get_current_user), db: Session = Depends(get_db)): + """ + Process the user command and return the appropriate action. + """ + command = process_request(user_input) + + if "error" in command: + raise bad_request_exception(command["error"]) + + match command["intent"]: + case "ask_ai": + result = ask_ai(**command["params"]) + return {"action": "ai_response", "details": result} + + case "get_calendar_events": + result = get_calendar_events(db, current_user.id, **command["params"]) + return {"action": "calendar_events_retrieved", "details": result} + + case "add_calendar_event": + event = CalendarEventCreate(**command["params"]) + result = create_calendar_event(db, current_user.id, event) + return {"action": "calendar_event_created", "details": result} + + case "update_calendar_event": + event = CalendarEventCreate(**command["params"]) + result = update_calendar_event(db, current_user.id, 0, event_data=event) ## PLACEHOLDER + return {"action": "calendar_event_updated", "details": result} + + case "delete_calendar_event": + result = update_calendar_event(db, current_user.id, 0) ## PLACEHOLDER + return {"action": "calendar_event_deleted", "details": result} + + case "unknown": + return {"action": "unknown_command", "details": command["params"]} + case _: + raise bad_request_exception(400, detail="Unrecognized command") \ No newline at end of file diff --git a/backend/modules/nlp/service.py b/backend/modules/nlp/service.py new file mode 100644 index 0000000..24c825d --- /dev/null +++ b/backend/modules/nlp/service.py @@ -0,0 +1,100 @@ +# modules/nlp/service.py + +from google import genai +import json +from datetime import datetime, timezone +# from core.config import settings + +# client = genai.Client(api_key=settings.GOOGLE_API_KEY) +client = genai.Client(api_key="AIzaSyBrte_mETZJce8qE6cRTSz_fHOjdjlShBk") + +### Base prompt for MAIA, used for inital user requests +SYSTEM_PROMPT = """ +You are MAIA - My AI Assistant. Your job is to parse user requests into structured JSON commands. + +Available functions: +1. ask_ai(request: str). If the intent of the request is a simple question (e.x. What is the weather like today?), you should call this function, and forward the user's request as the parameter. +2. get_calendar_events(start: Optional[datetime], end: Optional[datetime]) +3. add_calendar_event(title: str, description: str, start: datetime, end: Optional[datetime], location: str) +4. update_calendar_event(event_id: int, title: Optional[str], description: Optional[str], start: Optional[datetime], end: Optional[datetime], location: Optional[str]) +5. delete_calendar_event(event_id: int) + +Respond **ONLY** with JSON like this: +{ + "intent": "add_calendar_event", + "params": { + "title": "Team Meeting", + "description": "Discuss project updates", + "start": "2025-04-16 15:00:00.000000+00:00", + "end": "2025-04-16 16:00:00.000000+00:00", + "location": "Office" + } +} + +The datetime right now is """+str(datetime.now(timezone.utc))+""". +""" + +### Prompt for MAIA to forward user request to AI +SYSTEM_FORWARD_PROMPT = f""" +You are MAIA - My AI Assistant. Your job is to answer user simple user requests. +Here is some context for you: + - The datetime right now is {str(datetime.now(timezone.utc))}. +Here is the user request: + +""" +def process_request(request: str): + """ + Process the user request using the Google GenAI API. + """ + response = client.models.generate_content( + model="gemini-2.0-flash", + contents=SYSTEM_PROMPT + f"\n\nUser: {request}\nMAIA:", + config={ + "temperature": 0.3, # Less creativity, more factual + "response_mime_type": "application/json", + # "response_schema": { ### NOT WORKING + # "type": "object", + # "properties": { + # "intent": { + # "type": "string", + # "enum": [ + # "get_calendar_events", + # "add_calendar_event", + # "update_calendar_event", + # "delete_calendar_event" + # ] + # }, + # "params": { + # "type": "object", + # "properties": { + # "title": {"type": "string"}, + # "description": {"type": "string"}, + # "start": {"type": "string", "format": "date-time"}, + # "end": {"type": "string", "format": "date-time"}, + # "location": {"type": "string"}, + # "event_id": {"type": "integer"}, + + # }, + # } + # }, + # "required": ["intent", "params"] + # } + } + ) + + # Parse the JSON response + try: + return json.loads(response.text) + except ValueError: + raise ValueError("Invalid JSON response from AI") + +def ask_ai(request: str): + """ + Ask the AI a question. + This is only called by MAIA when the intent is a simple question. + """ + response = client.models.generate_content( + model="gemini-2.0-flash", + contents=SYSTEM_FORWARD_PROMPT+request, + ) + return response.text \ No newline at end of file diff --git a/backend/modules/user/__pycache__/api.cpython-312.pyc b/backend/modules/user/__pycache__/api.cpython-312.pyc index 102b33b70b5fa243f8eb1f0baf0885557e560cf1..73019e3466d1e66d6383a2982ff1c4219ebbaf3c 100644 GIT binary patch delta 673 zcmaixy-UMD7{+^T8k5wdYHDNJ`cVrl^#dt(a1cK>@h=b;Dc;#us+LO%DmV!B4=A^Y zi;F{{6^G*B>Zl+Nf|5<#T?HraZ4|U39^}V+_df6Q+>vVhBCg)5s^a16MfVgAYpRKs zYpJ~%EMp~)nt_HFdLGYeh=exB-TFImHwiY?FBR5m_a+LmJ7jkCkl==hdzpd~dfyL` zPK-{WghOl}C5+#~exh}X6&z--|F{|uFJYr9G(NAp8rvI4n{3;A74uJ3EJ7UtnD#ni znUam-t|QpFyv35fOHt=DG{l~L3&?DZ3a1D~*|mRsG79Hz6RIGGC2)-JMF)7{NO@wf zfiE3pQL%_3tt0WwYYg(h00&f+3N+G0h?(+7GMA(0J!kGG`qEfDx`Z^N35GJRfrl>Pt&_|T@Y12O z=wO#1x^(OZ1VZQf1w|3mye zx3;R7h8R}Tkx^H87a9d{0mJ~N*ojgIjN}CDzmw?<`%o5rqd-TiflCH4Gc#<}{>n3# z92aO4GE)j2-yV7@9ELI`HDVB&24 UserResponse: diff --git a/backend/tests/__pycache__/test_auth.cpython-312-pytest-8.3.5.pyc b/backend/tests/__pycache__/test_auth.cpython-312-pytest-8.3.5.pyc index d5548a8f5e245ddbbd0277fcf11467de6f391d87..9470be8ce9974a937a29d79747ca1e579ad8d863 100644 GIT binary patch delta 21 bcmX@Ri}CC(My}Jmyj%=GuvB~_mvbxtPtFD* delta 21 bcmX@Ri}CC(My}Jmyj%=GFrRfJmvbxtPf!L4 diff --git a/backend/tests/__pycache__/test_calendar.cpython-312-pytest-8.3.5.pyc b/backend/tests/__pycache__/test_calendar.cpython-312-pytest-8.3.5.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c04a8ee0a98c1cbd19f43ec9214f34f9f85a9818 GIT binary patch literal 4905 zcmds5&2JmW72hS7UrX^zpSIM>l;x^oTk}JdEX9p%t4ZLtPJCzs6c7p!YtBj}z5M9x zDzW6&{J+Kl#@<P}d;C*s{_~j4@5Pr>1f*%O013kJB=pvhZO8gSL zy`ADs@m*Qf-cZVNO#>J%QcxwTAiwZjk^K zUickrKtJX*-ma^-tvX7bf7+@4In){+!|Spa?3PZc^SY;E2g*@%y7wve36CM@0^!di z=L62eIKR$SLah1}AzmU7AMro-K$wEM?|0nqJ!PJFbbp!uW9Vt8eY=-{(3_}>>YucTZBvQboKuppF0S!p0Nbp2Z2u&pC2X6@pv^hu(+>L{r;fP% z4?7k%rw8n4Qn%%(UGJ2RWsQgaol*C*4ccB`VHdLPNc6FH3$kQ{NsPqxaG7V)fQHFn zkIU1zt#e9!!1iR9zlLRSk2iww!7Gd=kwEA7SW=5#IMrE~Ri6_GusZq`pB}J|giDu;YV7;p+Z1E@GLg8e1E;~1W zIh(&cmwh+4a5bBScXi)m`n0m9$fl@j64eS?xhk8Hl?|;_r{yh4gT3M;@B>+*GEMG# zO`)RJYi6J%OGJi!BT%f@@0Mlt%fCRv_W2Xf^71~vmH*akV{DAbd=tUQ=c0#S6Ab=8!C$L?u;~sm6RPf+;8$X&ib?@mquF zIG0jwSMw<~4Ys7Vk6p;1>g zGwd3$Dc)#oYOtLaBx)uK5NxGDUSiizYjE^2A21B&j8t6dDky_v@6HUaB@IZf`V<A+#1Gh<8r4Bd6@y9`(#g@+z3?<{|KeRr`H zo^A^HJsn6hJiVv4!q5cY7afHq9Wcq_pP{|Qy6JNve+)6@PM!aF&a(4A4GZW0;r!=0 zKo7V!dLBRzFQW#ri$f4K4D>Vs5l}<;CDahJ?JBrc^*n$V5H&=4P(xH3vJESJuz-CU zGSuMs?{|i|QG;W7&i3w)CRw}5d-9Q{jA}e zPjShoJQQaJ9YccON)h=|92YysDWYVG6PjK`f)_Bj&GFX&3`q!v03lhx3m6A@&0-bc zEUOBbPF3Dk0n)4LKt8CD=y&k zw+FfS=%cNjt>$YYLFip@8q-Itokb(iS$eqyvZTRzDM_AKvR$+w61D8kQCf9&}mgvdiyHS!@r5 zfzcI6aw=*D?aKk1+UEI!b)86C(+t3Wn#%9fvL>6MuF4E_bZlXmgKHApNE+od&L!(# z8;Z!xjHbn6IZ07BAY+P(^o&;a7*2#t< zU!y;RdYF!!dJ{<7%k%s{IPL@P1(*7qyZAYGsqK&P^ShNc2gQ?hR(yKt7^U{b5&qKd TkJ}s+Pj0f}Q{gL=SV#W`hll-J literal 0 HcmV?d00001 diff --git a/backend/tests/helpers/__pycache__/generators.cpython-312.pyc b/backend/tests/helpers/__pycache__/generators.cpython-312.pyc index b572c2094d049793ee2320bd640796973c1fe9d2..636ef09965a6447a7c5b4a984369477548a103bc 100644 GIT binary patch delta 21 bcmca7cu$b$G%qg~0}$l%GGuJzxx@hgKQRSW delta 21 bcmca7cu$b$G%qg~0}!x3{hz*(=Mo11N6rSr diff --git a/backend/tests/helpers/__pycache__/test_calendar.cpython-312-pytest-8.3.5.pyc b/backend/tests/helpers/__pycache__/test_calendar.cpython-312-pytest-8.3.5.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f71f8e1f75a5c0390d740e820ce96cca5e150b6a GIT binary patch literal 3754 zcmd5-AjFi`CTwPUNRoz?F z(_i_A?rvRz=a+72?mJnMenvq&N{iWk8<+YkTdOx@U!E5`X@`@f zhC-4J)mMD=+7L*Zud#1=LKw^^1=kr#%GYLPl186dWmSu2NQP&G&3u>(Aw}bAOS~?z zL$UZ>yRA_2<<-`2qH)Wf=UG-|SiiIDy=)Z`^#yjSup|1CT8H1?NDzZ``H8X|N=e=? zb`pzpK;*n&mE1BEg5q}^7`Skhfswc{78i<<5XGH{3sZ5k zLR=V)n~leXNoK&xgPmvRY<|wGIQbH(<*{`6kI#Q}K7Yk7U4uiE$E>mZoa5FU%0da# z7ap(S+G5ZjX0=2en>$u`+~_+H9jf^WAH07Lg=RwNms?>qlTW0~3m^!efTDgylD z9(#b+vmVd{=;Z%?BK8Zloi@by+j88glpWYi?=yDi8F zUopno0=1EbwxIhG#g3Dvk>GVi5dcE`q20(~cSf-ttIx*3cuHVAFdd8^LP!QkkKiAe z)>KibfN7}!xQDTS&>KUh-pGXr4=4?MpqCi{Ew`&BC(zt7<7Sd#V(392i0wt%haz@+ zC{CH(fqK>96u&ZxDW=%#(PKznMe-Vw<48^*$s$42rNc<_KunzuB9EUEeI3agNKPVo z6UiwgZvlzp=wuu^-(}dQcaW3fzb8R&2!XJ>2>%!z2QB8AjliJ^0r2k4J2#uz@r~Yz zTNeR({%x>3eBwdnex<49?pMC@VEFRvJ?|mkFmk}J8@Wxb^FGGeNU_mj+ZO9u?%rH` zTCk5mTZy!2;I+*o23C2<+fIT7r{?ap!3374IY^zE4$`6@3#%L)wW1DgI69)xRSi?; z6I$lbjkQ%ls-=t02zDZ2HCCiBYFMwG^!pW$EV#}&`X0>Vcg^sEf2zu|{F5ZzmVTF# N^4NBtDxV3x{s3Xp)O!E` literal 0 HcmV?d00001 diff --git a/backend/tests/test_calendar.py b/backend/tests/test_calendar.py new file mode 100644 index 0000000..caba7ab --- /dev/null +++ b/backend/tests/test_calendar.py @@ -0,0 +1,44 @@ +from fastapi.testclient import TestClient +from sqlalchemy.orm import Session +from tests.helpers import generators + + +def test_create_event(client: TestClient, db: Session) -> None: + user, unhashed_password = generators.create_user(db) + rsp = generators.login(db, user.username, unhashed_password) + access_token = rsp["access_token"] + refresh_token = rsp["refresh_token"] + + response = client.post("/api/calendar/events", + json={ + "title": "Test Event", + "start_time": "2024-03-20T15:00:00Z" + }, + headers={"Authorization": f"Bearer {access_token}"}, + cookies={"refresh_token": refresh_token}, + ) + assert response.status_code == 200 + assert response.json()["title"] == "Test Event" + +def test_get_events(client: TestClient, db: Session) -> None: + user, unhashed_password = generators.create_user(db) + rsp = generators.login(db, user.username, unhashed_password) + access_token = rsp["access_token"] + refresh_token = rsp["refresh_token"] + + # Create an event to retrieve + client.post("/api/calendar/events", + json={ + "title": "Test Event", + "start_time": "2024-03-20T15:00:00Z" + }, + headers={"Authorization": f"Bearer {access_token}"}, + cookies={"refresh_token": refresh_token}, + ) + + response = client.get("/api/calendar/events", + headers={"Authorization": f"Bearer {access_token}"}, + cookies={"refresh_token": refresh_token}, + ) + assert response.status_code == 200 + assert len(response.json()) > 0 \ No newline at end of file