From 83b5da171666b3ee04d7d99fea42366a5cb90995 Mon Sep 17 00:00:00 2001 From: Robin COuret Date: Tue, 10 Feb 2026 17:36:30 +0100 Subject: [PATCH] init server --- server/.env.example | 1 + server/.gitignore | 3 ++ server/README.md | 14 ++++++ server/requirements.txt | 3 ++ server/src/__init__.py | 0 .../src/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 157 bytes server/src/__pycache__/app.cpython-311.pyc | Bin 0 -> 1397 bytes .../src/__pycache__/database.cpython-311.pyc | Bin 0 -> 1238 bytes server/src/__pycache__/main.cpython-311.pyc | Bin 0 -> 483 bytes server/src/app.py | 27 +++++++++++ server/src/database.py | 17 +++++++ .../__pycache__/controller.cpython-311.pyc | Bin 0 -> 1768 bytes .../__pycache__/crud.cpython-311.pyc | Bin 0 -> 3318 bytes .../__pycache__/cruds.cpython-311.pyc | Bin 0 -> 3319 bytes .../__pycache__/models.cpython-311.pyc | Bin 0 -> 1008 bytes server/src/knowledges/controller.py | 19 ++++++++ server/src/knowledges/crud.py | 42 ++++++++++++++++++ server/src/knowledges/models.py | 9 ++++ server/src/knowledges/router.py | 0 .../__pycache__/models.cpython-311.pyc | Bin 0 -> 812 bytes server/src/metrics/crud.py | 29 ++++++++++++ server/src/metrics/models.py | 7 +++ server/src/metrics/router.py | 0 .../__pycache__/controller.cpython-311.pyc | Bin 0 -> 1146 bytes .../__pycache__/crud.cpython-311.pyc | Bin 0 -> 2690 bytes .../__pycache__/models.cpython-311.pyc | Bin 0 -> 1199 bytes server/src/questions/controller.py | 13 ++++++ server/src/questions/crud.py | 42 ++++++++++++++++++ server/src/questions/models.py | 12 +++++ server/src/questions/router.py | 0 server/src/questions/service.py | 0 server/src/questions/utils.py | 0 32 files changed, 238 insertions(+) create mode 100644 server/.env.example create mode 100644 server/.gitignore create mode 100644 server/README.md create mode 100644 server/requirements.txt create mode 100644 server/src/__init__.py create mode 100644 server/src/__pycache__/__init__.cpython-311.pyc create mode 100644 server/src/__pycache__/app.cpython-311.pyc create mode 100644 server/src/__pycache__/database.cpython-311.pyc create mode 100644 server/src/__pycache__/main.cpython-311.pyc create mode 100644 server/src/app.py create mode 100644 server/src/database.py create mode 100644 server/src/knowledges/__pycache__/controller.cpython-311.pyc create mode 100644 server/src/knowledges/__pycache__/crud.cpython-311.pyc create mode 100644 server/src/knowledges/__pycache__/cruds.cpython-311.pyc create mode 100644 server/src/knowledges/__pycache__/models.cpython-311.pyc create mode 100644 server/src/knowledges/controller.py create mode 100644 server/src/knowledges/crud.py create mode 100644 server/src/knowledges/models.py create mode 100644 server/src/knowledges/router.py create mode 100644 server/src/metrics/__pycache__/models.cpython-311.pyc create mode 100644 server/src/metrics/crud.py create mode 100644 server/src/metrics/models.py create mode 100644 server/src/metrics/router.py create mode 100644 server/src/questions/__pycache__/controller.cpython-311.pyc create mode 100644 server/src/questions/__pycache__/crud.cpython-311.pyc create mode 100644 server/src/questions/__pycache__/models.cpython-311.pyc create mode 100644 server/src/questions/controller.py create mode 100644 server/src/questions/crud.py create mode 100644 server/src/questions/models.py create mode 100644 server/src/questions/router.py create mode 100644 server/src/questions/service.py create mode 100644 server/src/questions/utils.py diff --git a/server/.env.example b/server/.env.example new file mode 100644 index 0000000..c850c8a --- /dev/null +++ b/server/.env.example @@ -0,0 +1 @@ +DATABASE_URI="sqlite:///database.db" \ No newline at end of file diff --git a/server/.gitignore b/server/.gitignore new file mode 100644 index 0000000..4d767c2 --- /dev/null +++ b/server/.gitignore @@ -0,0 +1,3 @@ +.venv/ +.env +database.db \ No newline at end of file diff --git a/server/README.md b/server/README.md new file mode 100644 index 0000000..eb861dc --- /dev/null +++ b/server/README.md @@ -0,0 +1,14 @@ +# Run +``` +fastapi dev main.py +``` + +# Best Practice +## Simple Boilerplate +https://github.com/anthonycepeda/fastapi-sqlmodel/tree/main + +## Global Boilerplate +https://github.com/zhanymkanov/fastapi-best-practices?tab=readme-ov-file#excessively-use-pydantic + +## SQLEModel-boilerplate +https://github.com/benavlabs/SQLModel-boilerplate/tree/main diff --git a/server/requirements.txt b/server/requirements.txt new file mode 100644 index 0000000..13f4297 --- /dev/null +++ b/server/requirements.txt @@ -0,0 +1,3 @@ +fastapi==0.128.6 +sqlmodel==0.0.32 +python-dotenv==1.2.1 \ No newline at end of file diff --git a/server/src/__init__.py b/server/src/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/server/src/__pycache__/__init__.cpython-311.pyc b/server/src/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..964069fc54b26ffeb2fdf52a8b151ea4b21d10e2 GIT binary patch literal 157 zcmZ3^%ge<81iS0HGC}lX5CH>>P{wCAAY(d13PUi1CZpdeKPH7eECFHBi{fRacF&0v_%fNy%x`AiyqTAeg+dm=x@^9)e@O^^ z7s_zS1L5!+2z!Vif*EqKiLsC+CONVx$Fj^6CuOE$Sz)T9nOZETSlY>$nOIg?*2$T< zSk_qHDVPPPXcl8V%}P$$EIVW7m{Tz;7*R|zR9=%vc1PKV-9Ha&LS|J$RHoH0xqS?F zc#oG^qqPs?L+$jJVrLff0O!w?YSUl7F_Qcqhy_eqAt>a+f7}HN`ufR z1J9@csmRJu)#a!>@OV6ok4mx2NcW>Mp^U=*BU2<>tyXi?4LAo(6Uo31?}D&^FibEw zg(o|JQ81h~c%Q`xT1F4iUOac`6JF9Ko&rB!0H$MJgpV(BH;!hF4bPzl_f~D!ShQS^ z+18xJS{s((Q~s24!{oSQNLxmd<=q1B8vg+2Rv=`M@6a017)hCOohtS zSEY8K)H_N&RO($N)4qA~972ewLgYBYMpLN6C7SRW-a}F1aT5q8l8xaQ@=~NZ)c0Y! z&vUmaV_sv~6IexH zPJFFKKw1FjlKDhE++&P#o&lJPA3mBqllYWVPB`TS6XT8B8c#Tq*I_f!g){v*N?(DR zHyORkF90eof?oyRmodg&bSX?y7o882)I)P&l6puFlhj4CVUoINCQMRaMfe5|(e;0+ ziynplCkT|r`;vmQ@3lUH&k6f21JuE_80{C4R&1~DZiQ;&Ky7r?MqBP-<;}#aiMQ34 X(>v3B3FC`>1Wd#gPa9%ud`tcU8$e-! literal 0 HcmV?d00001 diff --git a/server/src/__pycache__/database.cpython-311.pyc b/server/src/__pycache__/database.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..053851b4433e76ad666e4e3a370f8f794e3e8e2a GIT binary patch literal 1238 zcmZ`&&1(}u6rb5_HrXWG54E|~7V4o(snJ7kB2@gqY6F^9=ptRV*`Z0@?ADoWt56|A z549BZBI&UQjh1@wB>owx6bu7G!HeE1@lc8f-|Qx_K{_+*EuiEoE{bFEq;1J%~bRkmpsPf?6Ff4tsE99T7wF{ zc?_DqNTJyyP#jOS-q>8CMJoR90UyD`1{KpDVG~amP;wl<0$Go8D06@VQ z*U|Y}=c*&M9LxhWRy%zipkz7uTwBx1T3zejG+xeb%x-1(w2^&nq?|hF8QPw%b%Rz{ m)9d}OR^MOv{II4@?5Pv`>O@&Nlrh$UnHDG#2A=7o literal 0 HcmV?d00001 diff --git a/server/src/__pycache__/main.cpython-311.pyc b/server/src/__pycache__/main.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9b5e865a114e934342b431e2699c4cf50d5b35df GIT binary patch literal 483 zcmZ8dF-rq66n@FIy=tu>A|34DQlX&U9}vMs6tO4{LbtSuZQ!msa#c`JS}iC}Zmyjw z;-Bd#Hx*oTJL%TRmuoBPOWyZhzPyjTyyt9o7SOua53-5z-5jQ7O_E^+lPBQ7i3=Vn z69N1PEUi(D~m)%*IcC1Bh>D*Z=?k literal 0 HcmV?d00001 diff --git a/server/src/app.py b/server/src/app.py new file mode 100644 index 0000000..bff65bb --- /dev/null +++ b/server/src/app.py @@ -0,0 +1,27 @@ +from contextlib import asynccontextmanager +from fastapi import FastAPI + +from src.database import create_db_and_tables +#TODO : best practice to manage models import +from src.questions.models import Question +from src.knowledges.models import Knowledge +from src.metrics.models import Metric + +#Test +from src.questions.controller import create_question, read_question +from src.knowledges.controller import create_knowledge, read_knowledges, delete_knowledge + +#TODO : alternative @app.on_event("startup") ? +@asynccontextmanager +async def lifespan(app: FastAPI): + #startup + create_db_and_tables() + delete_knowledge() + yield + #shutdown + +app = FastAPI(lifespan=lifespan) + +@app.get("/") +async def root(): + return {"message": "Hello World"} \ No newline at end of file diff --git a/server/src/database.py b/server/src/database.py new file mode 100644 index 0000000..c63b1ee --- /dev/null +++ b/server/src/database.py @@ -0,0 +1,17 @@ +from dotenv import load_dotenv +import os +#import secrets +from sqlmodel import Session, SQLModel, create_engine + +load_dotenv() +database_uri=os.environ.get("DATABASE_URI") + +connect_args = {"check_same_thread": False} +engine = create_engine(database_uri, echo=True, connect_args=connect_args) + +def create_db_and_tables(): + SQLModel.metadata.create_all(engine) + +def get_session(): + with Session(engine) as session: + yield session \ No newline at end of file diff --git a/server/src/knowledges/__pycache__/controller.cpython-311.pyc b/server/src/knowledges/__pycache__/controller.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9e8776dd5f9c60ca1a542fb0b4c752d3dc36d78e GIT binary patch literal 1768 zcmb_c&2Jk;6rcUD9cPo)!fhm?0Mj&SV^#4U5C=*@s*1#c-~&0amuRyyPNv;2&Fr=! z0?`9E{($z_Q@{%UMg9R>@&T=s6Q|sQ!l@T{Z)`7K!;z8w^Lz98d%yRde_mZ(CNS#W zPvRGgkl)dn4RdN-?}71(Fv5(GM22S=Xq%xKS)Lu$yn58|mZGM&968@4M2x2?UPRP60hzUMf1xzc@c7U#5=X36-e%9{NUMauDA&k>>pnhH>wjw zD^FSVNQ?21&tDQuqtHJ#AcRS-p8~uhnW1MjFoT)DTBi{7*(`AKJ;`wQbbLonVgFfq z#voa3wnoS)m}jNS>~~8W0OL6%ZjE*IdO|iD9(?OI#)Dp>nrYrNWC}d0De(D}45qD*BC}Q_3 zKTbm7@A_eS?7ND~=Ulo<25u?5a`ADQgdvyR^jnFtX+T4L1n`nvv^R#^kB47;Gi-aK zwl{8jFZV9&_1BL^_RiSe8QMD+&icsN7&{xUzaBeuXwz#rNGkb2rFA~u2cw#gs-F8~ zVDuok+tmV4lh6l5w%`JJ69Hw=&;&!>006QM9XXq0XLD$8>a9VUMOa4$ngs=;%3?9+ z`$WD2n}Er!Dw7Ejl)qH*K(LAY6JB*VClOZQtB^19`rysV$k`n`yF+_-!VDJ5fw5?2 zTVPa~VZAcz6jsl0haOOAcJC5J&3^#s`#~ON=K~r+9r+=rsZ3Zdp!_nL$DH~~iAaQg zCXyHmQPL1fGL<5u?0z0&wL$^rG&y|AgG}_{`1!yO{lk#sg*1~s+?G)uQzedKt|-@z zVCMsHJ~??fE9<`Oz7Wqu%9-%Hi9B-AbDzw0!`;ufpM1Fe_~X8a1=0Z_*A{zwTIRPP zvbl6O&_%%Ht9t+_>zy}ut_ZnzWC9A4TYrG;ed|w+FjebY{}vl%)M8UG7R9c%J_v30 zF7Z_)y7-s#-$a*Sw?x1KD)SFSN6yyR*&5ngno_T`THJ30S{mL&T|X*4|xj?9hg>_wAea z-puUG`^|gr*Jw0^pk4g@``l^(p}%;?X~8!0N(W{GsYt~-%Huhl7v==a`+`pL;+$yn zL=WVHb3x!mO}r(jfxF_Iqz3PzIa!r71tc;^LY!9>Ev$yL@U5U423e%7j{qN4qq8U( z`-d-`6ijJWV=PxJm_erLTGmKnQ@K(ouIQS&pg||76&7*@%~ZZ}gjwAFYX0IoAn?5U z9mobUI&_8rqITN^`L?S&gH~|~S32~L9YQ7Kx5Wr7`3hZa6C~TN)IK3Nu}zqD+nt$9 zXVE1305NezxJ|C16^zj}gyF|ETli{HqJSHWoppQYXW&Ig#Fis>gGQs=x(^_s zdWc|j5Ts#v*pEPbkRXA{^303)(Vx!M<5P|J)SA*97}+@e=ydr`eIVHwNUllE!O@ND zkFGzw@%YAC$dX`$g&eZOxm~yGDfV$TESy0dIvGWVYT{rE6c^G7QcZ~INvZlC25Ls! z9nR;}-Vx$4Z0HaWIWR(W!Udv*@4l}Jhjg#txYrj27Bs_l?-rp$@YS|s?O?!osBoPZ z^E;0o1?2!dY!!&lcVggNdB&0v_~*)_E59gD&e!8-8}YMiilua zOU|GUT?j=6Yhs-B!56HLeoFoj(^#sC7^o>_iv@$@k}T6)wlk)>*Z2#F(TDI6DUse$ z{Ea>mOPC5JTnLuLFZpe-TS=Vvcmec+t#_|9=sliPIzoms1LO|T9~2;WkP46CUCkd9 zY&*Hj2n5|T_QuznvrH?1C>;T080NMSMvrlBloMViP=57!+_(jyV=)bm@>_IGxgUM`pGk=)slI!CWu-1pG~|hzJYn_0nig`%4(E2=uBYh5*+_Rr z_A+4n%B`nAxj0ImkBS$^r00_uXzw8OH`pEm;BOg(pk#5u3=6ugBy<53|DUY&cEwG1 z-g04Q234r`49&(H9f1$@N4EZ!+DlAy0&J$Z-OoULa3Xf8(gRMdTIIo=x;);H$7}L< zSM>rJ3Mv(c@C*gji_`TKy|{Lo>KMMystt=k`UI(-5Ywlm>NEy=H5oHy_O+fb!WLUM zlDogc(U@Lh2ZrREa3I5)wB5y5*J}LP{Hd!LX)tue*wM3f$IPO literal 0 HcmV?d00001 diff --git a/server/src/knowledges/__pycache__/cruds.cpython-311.pyc b/server/src/knowledges/__pycache__/cruds.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..652e680217bd7997b61ed84e2735ddcd609845eb GIT binary patch literal 3319 zcmbVO&2JM&6rb5ydw2bjq`^rOh~j*dA_I+8wMe0&NJc^tiprrmR0JVpybHKp+v&`v zA(A8Yz#&bM3Mo;1spLbO5~T;!6PF&$Utmikj6UdN#g6X)%l z_uhQI-@NyJjYdNV+T_{qvtI-d`ipm*7HlzlIxw3^MJm=&4$tG9FfU-<7j%*n=S7<* zdLS2^4+1Z0;%z|<+!yC1HFzJ*%c`U)Adx{5;=HP8VKtKyZD2+g@nLxX{I6f{t#XZKfF?tN9*!vRUYM%p0%EuJXDv5 zs`8K(07Ki_CcAvxJ|~{+Q0~>MSBL6s1$zf}wQ)KXA(e=j>XRzRFwhJL-RAng0iq-L z9~m4Dg`p>)~XDz4N{VC-Q5mL4 z1U;NkzNIEQMD3oI0o>?104WS&Q(*=;Ij7|fQ=%GM)D32aT$eM($Bsdx5pLZJkWf8D zFd73XpNIVj#0Loym@Lh_h#mjwd@Xje9y__JH2Q}(&#s>>E!X-J_5Q@F)EF4qyuN<@ z(T&G9RzsEqBP`^QUC!;hT~E=$*|2a1wdrIO8LWx}O;B7+#YrVDrY5Dz`xvMhaZh+N zt9B0&kKsT^fXJaCq8%;}E_@GuML42+1;@R6Yn`sZN?qmKOLiG_mMT(?*Fn^<` z#3H6b5$A(N@k{{b+Sdb|L7!PdJE8}uGe%58zenE|1q=noB$LP%Ni^d9FA4YnPB z>Id4v8M~wG&B>-2MwGTN@-D1o-{OMm&oFT?-~-v8Kzv}7csOaqPIN-CacZhMa=A29nt6Jq{_*8ir7jOQ;uF=O zb0tzDPn6%HtIC7u%l}MGJXQ6s^_G;HJW-b?s`7-@3u{`)A-kO0ce|dV8)qZk8QIN% z@h7*D`sC6Gc|Iau8k3$+VxZka(cfTu1c1L~D1yqx1v4z@wxVzVp!omfuD7dk4rVVG zc4kn8a?j9gywM@ppg*$pHPv2vq7z_qlH2_Z#0Mv07c5=i)T~$@F4yGox;$Q$#}Cvn zkf)$taR|>-P{TM~PtlEQC9AgK9ab$^1X8C+<&>B@BUPp_(5s0aQ)XZ5xdI%q`69Wi z%mJv~ro1>mW$Rfp)knAvo>%%-8VWrgdhGhm&e$f&<_$aYn}ivZ@@HpX);8J$7TL-E zwR{2QThz6S^fbtLJ|Zbnf$abQ literal 0 HcmV?d00001 diff --git a/server/src/knowledges/__pycache__/models.cpython-311.pyc b/server/src/knowledges/__pycache__/models.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f942fba16888bc2d8895115235e4510d56d22f47 GIT binary patch literal 1008 zcmaJ<&1(}u6rb7MB%3rbU<_y#8bU4sZ9wY5P&_DD{Ai)J1=)k+HZ$5K`;pG>s`ZqE zhlrOPg!b4|MOwt8f5tB45auL!@>Z#*o_w>Lh=}#=o44=H{NB8;`A{kq5K!>=oz=w% zeUrwNvJ>T`4azQ}h+-Q#*uairD2{5V7%6B8QRNMyDpRO-lsV84I)s&yq0#IbYUaL6 zv#E;AU5nXN=xeJFmp#gCQGCQ~Gq60@-?Dn0iC6NQ-f{8?%w5EgfhjVS4T#88im7s> z9w-nCR!WA(G8DhgA;hv&TZGL7sX$Ip*CDJ4F2{60WdDQ6Cy3kxQJ^|R%l{Q^h81by z()3apb4KDRhI)%4|G@QL+KfJDE9*@~=KX{+pG&^0=^LioliuvMP$MicUWdu6N0w(m;komHSBELP+{ANk$ zgt(@|2oVKB9FK;!)Qf~{ho+sLa1~PK@&O3dg4kt3OxN{-bR>lEVshjMoR=grBgJ{S zr`eVtd_*UpqtlzMEze;s?rmCbYuR)?+cK}2c5lmU`Ha6{yyf#w>vu_h3$kIhKi}Ko zFfNn`IdA_xi2fhnxH>!B*kAa(9#z|MwLPk~`?m+`fW9q6S{pdl+T+T_;f=i@sx;zC zV^nGMmj-K*)&P#R#<+Z85biBRjmowDok1niYQV8p`&yshzxt&c8Bd}*iR)xk zC;fYaV0eF2o{KaB948VKetDYax|~>GZrW_6nGw3bZ6~#)jg&Q{Jxa=&m1g331+-Ir vF&)A!J_n|JkG=)sSj8BR(e>zTKF((FQ+$m6ErHV%6u?TAYwLv077Faw`FQ`LQA(a*wAdOH`R7FS^CwHY5{z%RaBAtT7 z5X2Iuc4P`5IxzBQI8uk`RwlNfFm>XclcGxW`QG#I-TS?J@A>>WpU)zY?28X>5hL_d zIv0{zg82r3V?+_f9`bPm`$|K>NI{PgRo)@0GKFfV`dCBg8|XqBD$Uf8W&Dz^r3n3z z%RDN~+OwyXkTS2mC8I-juAr*Oi@GGgBnbwm@230Sb@_)7t+v}PVtd}5X(?) z6E>Gjon}sru?k$!CD*vbH6@qnkhLNa#n59`WGXD?ZhN;5jT)34I6W^Gxej-Ihxf@V z))$IPk8<4}i()qn)?F%$?XBAO*3Lsq<%`kuwSISj6PKXl(VeH5*B0_i`LSNAw zEIQw?4?~~XJZ!mvU2%fYbDg`6*Ew|Ti1F8q+YxWuemZGnLqX<6>zzKA*PI%8cTo$> z;LKq z1Ddf@Au4~2BW0*8bz)+(l&ur*oZ70h!Rh?nd-v|%ecyZj(P}jjj5}|>`wu0Aeha4< z;OArZ0+vJMArDg&U>jp$OH>METM24*J!sf!z9&;HXxdG%71Desd9?$@mc9A`vTI%g zu;Hnj$khIbv?fl~*F(Z%KMGAbZM%#(F&TWk*h-hc_ez(it%?t~wU=S^nG)|kNwp7! z>EfL7928h&_-0Q54pDq5wg+Nzce;aHr$7<>2_&YzTbgg_uK_rKf)+SCB% z1|sgNsG3rVKLME-PjLFyogJVKdh1Q%os<9x%~ zjsjw_Xv+_+S56pF-+AEBoo&bBgnc5+;>@**#N2|HV-`_LSZ`;S3Eer=L`oB2ADy*t z96e7SZ6$4Y(srk9cmLU$vNpOmQP!u*dQ!|897dHQ3d(sA4KNmqSS`^e8sk26W~I_9 zKG$dByc}E<)L<<@Cg|m$fx)i=08jnakv7pgQ@xWY9kv9U|4)aBoIq%~La5-A>O}zu zzIT~d9d0oJSKupo-5h(!9UhTgn0BI{iH zwc;VR3|6`-Zj`@rnXLh_G0LCJ>vpbgz&k@q9H$$*2f{JlBLnYKPzAxNG$d&vB7sd@d literal 0 HcmV?d00001 diff --git a/server/src/questions/__pycache__/crud.cpython-311.pyc b/server/src/questions/__pycache__/crud.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5ce8e5d6ae4bdaacb87e4e8df3010324a5b74e7a GIT binary patch literal 2690 zcmcIm%}*Og6rb4-?=Chb#Y+Vw2#dNx3n^9)M3K@~buMW|NsBnem&ox>!O7ZAW|l%E zBju0-O)E7)L2!x0p`t~om);|lsDFSRS*o>Fq)5FaHzPQpocd<%U3-l=P^shHw{PBi z^LFRG-@NBvdV6~ijKAl9$c@Vg{lh2T5Sq-P3Ct!kk%=vo$7!4w(gNml!4mUQT5@^O zlJlW-$mJzV$*XAf91xHpqb2W(vh+io+8|bzXRDs zcAL)j_6C|Aknj1rX|#$0`5R7*9gyt#Qa2_LuO0BZ=X>VTdGrDL z7%^#CSP^faWsK1cgyF|EyZE{xQSP29KpZh+nocNN%;$5qA-LOh6xN6n<6h(OcbAfj z#XL#U;;mdEIh!dItz71#jCFT0lVpT`M`)7KZ1P?+k}R2}OXk$w`%Yh$l8jAmdKwx9 zfBdcN36KZqm3D69{qIMA9IYck9@@HAQ~Q1jKMFtoqN0ve)seC~!X?p1(TX})RR_!J zU|j}7*V-iqeBBWzE!nBu@$vDgI#>!02uLLpBN>f!%{4X+v*835Cj3YD#79G z0=PoBJKRdrJfa%7F|-!oDBofOX7chPp~Q*Y@s8cioaqQ~OJs#)0hyL%$d2Z#X#|!! z8nXdYc~Y<)g%Y-8+04;AgfYhB6X%2Wa_cA{(DVVw=nx3Gg7I?{K%gj(ZC!h%4?nwH z(GyiY@s~dFQlI$ka&_|aKfe6)tCy4CRP?#3KDVaT`iC|zu3y}`U+Fih{l=P7)6Z|t ztj|1|eLB0Q)fMnmM;t+RDLOb8o!+80or)p@Wl3lK@Vy(U#8p{*Axl>^&2M zPi$`>v2+x4I^1jpNFc9Rz66yeHoSRd{mQeIU(Z)!)79AYnpzh@Q%4>-;M|cvZ7Di9 zH&5Q8mhN>p_TX#Q2QS~a@TvG*N?~PR!a%zx3Ju zmEE)QMc82@GCWg`4vlom2mF+)W{pq{aFt&RnWy7Dz=?33nXxmsGSHBD(RW*|TkRY% zSFqjl;YM#49fBIU)$yJB3A|y+BA?L-knw*j>^TrP8W`75qTKCzjf`^es-ekp@T#HF va`384A|BdWgy>)%tN@9~c%Y7a5*4w&#ki5)Nya2Rv>mG>c$`Y80Xz5?9Zem3 literal 0 HcmV?d00001 diff --git a/server/src/questions/__pycache__/models.cpython-311.pyc b/server/src/questions/__pycache__/models.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4450c54148e041238a17607de835a58852784545 GIT binary patch literal 1199 zcmZ`&&2Q646d!-Z&S$G#Wu@H%MoKRR(MX8HDymijc8gF_Bxpd$MY5dClv?#iI(C54 z)hb9FvVueRM2?)gyR-+6{S!FaQV-FbkT`KGDko07v6Jv27{7V`&G`48-~68aZ@FAR zFmB&@;#5S0-tfhA2uqI6XW{&f* z0J6+8?RuYt{P@?}hR9S**6qFnrvfd)zIyrM>g9{S z|6xcp4_R4pJ)p$7>!*QQ;Df{@BJ5L;1wr{~vJeEXbnNb?)eCxk=mQB^ewN=5=?^?- zrE7;>8xw1iOkE)nb-E!_y$l!?rdgJ6d&II>!Lqyn_g#)lmbKNl-RueFD$^p*C^>$_ z<}Azh{UFM^4{RxnD4pjd-fj9Lcl=|dKY?Si>x9w&=maqO@N0b|@JO8o9mlV)*nZ$T z_Bq?_ZP@jY(0hc|L)xv+j#-C_h#M~UwyDMwa>w5hz5qA)>>5{p*}eJv!pnACZ6wvk zQMEC+G?a$;??Nm$z!JGJF3%5IgVv+gYkgtV|F3=cSA5%!^-iL9j`Yr;wObp>|D1{C z4p<_0#U`gr$P<>i_8ycrXcE=^x43%l&mYbe1lbHW}sf4TwDlE?W87^irWTK`* zoZ{3p>uEqAw56 literal 0 HcmV?d00001 diff --git a/server/src/questions/controller.py b/server/src/questions/controller.py new file mode 100644 index 0000000..70e0aa6 --- /dev/null +++ b/server/src/questions/controller.py @@ -0,0 +1,13 @@ +from src.questions.models import Question +from src.questions.crud import create_question as create_question_model, read_questions as read_questions_model, read_question as read_question_model +from src.knowledges.models import Knowledge + +def create_question(knowledge: Knowledge): + question = Question(knowledge = knowledge, question = "Quel est le sens du mot connaissance ?") + create_question_model(question) + +def read_questions(knowledge): + return read_questions_model(knowledge) + +def read_question(question_id): + return read_question_model(question_id) \ No newline at end of file diff --git a/server/src/questions/crud.py b/server/src/questions/crud.py new file mode 100644 index 0000000..0eae63d --- /dev/null +++ b/server/src/questions/crud.py @@ -0,0 +1,42 @@ +from sqlmodel import Session, select + +from src.questions.models import Question +from src.knowledges.models import Knowledge +from src.database import engine + +def create_question(Question: Question): + with Session(engine) as session: + session.add(Question) + session.commit() + + +def read_questions(knowledge): + with Session(engine) as session: + statement = select(Question).where(Question.knowledge_id == knowledge.id) + results = session.exec(statement) + questions = results.all() + return questions + +def read_question(question_id: int): + with Session(engine) as session: + question = session.get(Question, question_id) + return question + +# #TODO adapt logic with args +# def update_question(question_id: int, content: str, uri: str): +# with Session(engine) as session: +# question = session.get(Question, question_id) +# question.content = content if content else question.content +# question.uri = uri if uri else question.uri + +# session.add(question) +# session.commit() +# session.refresh(question) + +#TODO : test +def delete_question(question_id: int): + with Session(engine) as session: + question = session.get(Question, question_id) + session.delete(question) + session.commit() + diff --git a/server/src/questions/models.py b/server/src/questions/models.py new file mode 100644 index 0000000..923ebe7 --- /dev/null +++ b/server/src/questions/models.py @@ -0,0 +1,12 @@ +from sqlmodel import Field, SQLModel, Relationship +from src.knowledges.models import Knowledge +#TODO : add pydantic validation + +class Question(SQLModel, table=True): + id: int | None = Field(default=None, primary_key=True) + question:str + + knowledge_id: int | None = Field(default=None, foreign_key="knowledge.id", ondelete="CASCADE") + knowledge: Knowledge | None = Relationship(back_populates="questions") + + metrics: list["Metrics"] = Relationship(back_populates="question", cascade_delete=True) # type: ignore diff --git a/server/src/questions/router.py b/server/src/questions/router.py new file mode 100644 index 0000000..e69de29 diff --git a/server/src/questions/service.py b/server/src/questions/service.py new file mode 100644 index 0000000..e69de29 diff --git a/server/src/questions/utils.py b/server/src/questions/utils.py new file mode 100644 index 0000000..e69de29