From a4b572dcc7709f3f658f794e84ef615b1b13ad03 Mon Sep 17 00:00:00 2001 From: Andrey Chervyakov Date: Sat, 9 Oct 2021 21:33:03 +0600 Subject: [PATCH] Dump changes --- .env.dev | 14 ++--- app/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 130 bytes app/__pycache__/config.cpython-39.pyc | Bin 0 -> 259 bytes app/__pycache__/db.cpython-39.pyc | Bin 0 -> 687 bytes app/__pycache__/init.cpython-39.pyc | Bin 0 -> 689 bytes app/__pycache__/main.cpython-39.pyc | Bin 0 -> 991 bytes app/access_control/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 123 bytes .../__pycache__/role.cpython-39.pyc | Bin 0 -> 331 bytes app/access_control/role.py | 6 +++ app/auth/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 113 bytes app/auth/__pycache__/dto.cpython-39.pyc | Bin 0 -> 515 bytes app/auth/__pycache__/handlers.cpython-39.pyc | Bin 0 -> 733 bytes .../__pycache__/middleware.cpython-39.pyc | Bin 0 -> 861 bytes app/auth/__pycache__/service.cpython-39.pyc | Bin 0 -> 1380 bytes app/auth/service.py | 4 +- app/db.py | 2 +- app/init.py | 23 ++++++++ app/main.py | 7 ++- app/migrations/__pycache__/env.cpython-39.pyc | Bin 0 -> 1974 bytes app/migrations/env.py | 5 +- .../versions/2a84260bc774_add_roles.py | 39 ++++++++++++++ .../2a84260bc774_add_roles.cpython-39.pyc | Bin 0 -> 1167 bytes .../646ae6f3e17a_initial.cpython-39.pyc | Bin 0 -> 1185 bytes app/role/__init__.py | 0 app/role/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 135 bytes app/role/__pycache__/model.cpython-39.pyc | Bin 0 -> 691 bytes app/role/__pycache__/service.cpython-39.pyc | Bin 0 -> 1513 bytes app/role/model.py | 14 +++++ app/role/service.py | 49 ++++++++++++++++++ app/user/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 135 bytes app/user/__pycache__/dto.cpython-39.pyc | Bin 0 -> 1637 bytes app/user/__pycache__/handlers.cpython-39.pyc | Bin 0 -> 2088 bytes app/user/__pycache__/model.cpython-39.pyc | Bin 0 -> 1402 bytes app/user/__pycache__/service.cpython-39.pyc | Bin 0 -> 2156 bytes app/user/handlers.py | 2 + app/user/model.py | 10 +++- app/user/root.py | 21 -------- app/user/service.py | 25 ++++++++- docker-compose-dev-win.yml | 2 +- 40 files changed, 186 insertions(+), 37 deletions(-) create mode 100644 app/__pycache__/__init__.cpython-39.pyc create mode 100644 app/__pycache__/config.cpython-39.pyc create mode 100644 app/__pycache__/db.cpython-39.pyc create mode 100644 app/__pycache__/init.cpython-39.pyc create mode 100644 app/__pycache__/main.cpython-39.pyc create mode 100644 app/access_control/__init__.py create mode 100644 app/access_control/__pycache__/__init__.cpython-39.pyc create mode 100644 app/access_control/__pycache__/role.cpython-39.pyc create mode 100644 app/access_control/role.py create mode 100644 app/auth/__pycache__/__init__.cpython-39.pyc create mode 100644 app/auth/__pycache__/dto.cpython-39.pyc create mode 100644 app/auth/__pycache__/handlers.cpython-39.pyc create mode 100644 app/auth/__pycache__/middleware.cpython-39.pyc create mode 100644 app/auth/__pycache__/service.cpython-39.pyc create mode 100644 app/init.py create mode 100644 app/migrations/__pycache__/env.cpython-39.pyc create mode 100644 app/migrations/versions/2a84260bc774_add_roles.py create mode 100644 app/migrations/versions/__pycache__/2a84260bc774_add_roles.cpython-39.pyc create mode 100644 app/migrations/versions/__pycache__/646ae6f3e17a_initial.cpython-39.pyc create mode 100644 app/role/__init__.py create mode 100644 app/role/__pycache__/__init__.cpython-39.pyc create mode 100644 app/role/__pycache__/model.cpython-39.pyc create mode 100644 app/role/__pycache__/service.cpython-39.pyc create mode 100644 app/role/model.py create mode 100644 app/role/service.py create mode 100644 app/user/__pycache__/__init__.cpython-39.pyc create mode 100644 app/user/__pycache__/dto.cpython-39.pyc create mode 100644 app/user/__pycache__/handlers.cpython-39.pyc create mode 100644 app/user/__pycache__/model.cpython-39.pyc create mode 100644 app/user/__pycache__/service.cpython-39.pyc delete mode 100644 app/user/root.py diff --git a/.env.dev b/.env.dev index db6b050..b6325da 100644 --- a/.env.dev +++ b/.env.dev @@ -1,13 +1,13 @@ -CGNO_ID_JWT_SECRET=secret +JWT_SECRET=secret # Database -CGNO_ID_DB_USERNAME=root -CGNO_ID_DB_PASSWORD=root -CGNO_ID_DB_HOST=127.0.0.1 -CGNO_ID_DB_NAME=cgno-id +DB_USERNAME=root +DB_PASSWORD=root +DB_HOST=127.0.0.1 +DB_NAME=cgno-id # # Root -CGNO_ROOT_EMAIL=cognioandrey@gmail.com -CGNO_ROOT_PASSWORD=password +ROOT_EMAIL=cognioandrey@gmail.com +ROOT_PASSWORD=password # \ No newline at end of file diff --git a/app/__pycache__/__init__.cpython-39.pyc b/app/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f5b1058abd3309d8a17949086c94ceab47e78701 GIT binary patch literal 130 zcmYe~<>g`k0_!5Z1Q7igL?8o3AjbiSi&=m~3PUi1CZpdg`kf-SLT36p^IV-N=!FatRbKwNADBvKes7;_k+Kr~YhV=hw^6C*<=Ln>1W zb2H;oMj*`srWvxBmoi4Nq%a0EXtKTp>SOTJWW2?jl3$XVR~BEEm{XcsT*aXW-|3i}Lesu_fo{rDdkCWGG?-ii3$?s;*Ws1x5K; zsmUe9G3BXAF-eKZ*)f?ZF^L5QF%b271(mlrY;yBcN^?@}7=b#A1%Lzx6Au#;Binx_ LCboY}%q)Ka-zGt$ literal 0 HcmV?d00001 diff --git a/app/__pycache__/db.cpython-39.pyc b/app/__pycache__/db.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6efa9b9445cec08d8cc8b277e759e92c37917b82 GIT binary patch literal 687 zcmYk4OK;Oa5XWcN@gt6%25xZUMkJJQB_LEsiNpa?6t`4bSu(bF8%+HOYx77|B&2ZV z6Cflw@^v`+%89R#6SFQA8EZ$s8IRWgnQ`R0HlRKD_3))l0e-7s-?|ta;;BBNu97W$OW(gv!En!`u zi!OJ+5M~Q)3#`Zc{NOV%hYx%h-uQzmU`QG_ks_)^D2i2D2uuvPNU}&qb^1<(aa5_C zQ;Did%Oa1?g~ZrM%Hk|tUAXJAs#j7}Z?egF%zCqFc;e5O3-8%{M<#9j-1Gg@qvdQz z4w;GXpB(weJ2Gxr)!}WOI4yXh^jsT3u<)p4br)R?TlfeUH!tA@5IBWP_)dNx74|jV z$2nqOWHF@8!9Tg-S(MbJ+%$TUm8ua&dHfTkgE#K(%qPKGmaj!pSHXJ`2XT~~2PqGt z^*Z43XuWBSm8e4=50nZe2Z%u^v8e1LFNSVoW8+blyb}3F;?9BH{+}3$5A|qomQqs% z{k?)x=CY%bHhyw+HBzZ#qH$*4u{ZVnd3dsX+89^6k?Q|y?0HeA^=68TX=Sv{>^WBz cS&#CPzsr_Ri_r8x5V%~Le<-b|fkDd73```M>I0^lzt50Av;C0>7oL4y_@^r94k zu)QLT*6Cm1Xu{W7aZ<0>C+(^oiuFZ!L;!u=8kyoR zo;M+4nTSNrq?;l4pF!LYP=7Y~6v3Ur5jMCHG$ZfLh|z@B zSjoRRA0X-Je;_H+Wr*f^8d8*BY*)rp2r&`*l)IGsl+c8MrfF06G|i5! cap4DI$h~7l$@AXo^Uk~=!#tIl;7=vHH)AD}^8f$< literal 0 HcmV?d00001 diff --git a/app/__pycache__/main.cpython-39.pyc b/app/__pycache__/main.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..114f6e13a02111e7e98c20de2920ed74142cc688 GIT binary patch literal 991 zcmYjQO>fjN5Vf7p?k3sY77pAhAt42!N9q@#qh*NBc3+-Y#v_n~!^X4a`B+DlTKJqn!^2hwpR71V5*e-(u~`#U9a7Ugj#5 zRi)Cl;ZhGepRyt^Au2eOyOOI`mYF%^ZeRco%pI7`3or^@p>OCConS>62J(bia}ckK zSj>iqGl!49L_pZx*N!=@xo}^0D^Rx;oi^I7B|px;Xq&cb7Gv3m*0C+&?vSCHiI#ET zWj;*zP3g)p1xrU7X17R=VEOy>-PWX*)d|m3Gdbr+lOvj)PI5M(bv-F)UXJUpx^KX; z+Ps*?2ZOMS*YOa`4Zs&+R!z&i+T44)3EF}zj>?tb+G`Y*s;xDC{wcO~NQJ1*(@N&k zylnJn;bxLEUaFjm<}Rb)YF4q8JL8mrAlgsUj!SwG0Ku`rTL9w6+H249tdgbnj^UDN zol63|7ScR1Bm`HAkBikkk0HB}HY5QJ=w;*@&u9tH0OGDG9;`NveD|9}6ZcJ#c@EP2 zCeldKNue#+fR>D<{0zP-UG~(G3EiJBqpnMumbBn$sx8@;-JLuz>s`urQL$F=SLRhU d&%pQ~dq4sl;Gq?Hy$;!!;Kj86xqd)={2%lR4^jXC literal 0 HcmV?d00001 diff --git a/app/access_control/__init__.py b/app/access_control/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/access_control/__pycache__/__init__.cpython-39.pyc b/app/access_control/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f0c600e472f3fffbe82dd467125197bad40d8a11 GIT binary patch literal 123 zcmYe~<>g`kf}_{16F~H15P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!H5UQA*^K}=$D sa%ypLd~$wXNl|`IOniK1US>&ryk0@&Ee@O9{FKt1R6CH)&p^xo0O$4^6#xJL literal 0 HcmV?d00001 diff --git a/app/access_control/__pycache__/role.cpython-39.pyc b/app/access_control/__pycache__/role.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..79cc9102fe04a206096b24853b0dbf3d201ade99 GIT binary patch literal 331 zcmYjMJxc>Y5S`gwq}%|7P6nOQp;odL)7@6F3M*R7D_&`j<*;}wGkj}_E7MTDRNdiA5c_U6k> zwLf`+{B*}E$T6Ac7-*xCX>1*mSut};dWVp=wmSL_!Y!9cp%ElXEbxI<=93`6}7%|}Jw literal 0 HcmV?d00001 diff --git a/app/access_control/role.py b/app/access_control/role.py new file mode 100644 index 0000000..935789b --- /dev/null +++ b/app/access_control/role.py @@ -0,0 +1,6 @@ +from app.user.model import User + + +def has_role(name: str, user: User): + if user.role.name != name: + raise Exception() diff --git a/app/auth/__pycache__/__init__.cpython-39.pyc b/app/auth/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ef9f2f6e1c13c76b132b3e09a3d9890537921400 GIT binary patch literal 113 zcmYe~<>g`k0@Gam1Q7igL?8o3AjbiSi&=m~3PUi1CZpdI`qe6ZDn5GVuyb zoE;=80Vmz(`|j-X-6!%qBWO!?cK?RwyC=IABUzxEa|9qjYtqn?QgTHg0`^LPN&3Rd z2zd+%@+5EuqZ=~a`@mOZO5J!VjJ#GL>y^*!8bh)`H>U`aloUuA-4V%T40Jx6(H#H5 zezDuX)DmQC*P=Eq?Tyr}XrxO!Va&7AP;3*Ia_*CyyNvTjL0|iL!ueA#>hB6OR=Y#a zMcXPX>{_*k^DWU693sHy@vIVESBc&}RAAMt+h{+k7sPnTXi7uo|BX)Y+V71Z!cCaV zZq=h~gC;JqJ}&eKAN-6kM7hr$AdJyXgpkp|3zQ@6HXu-qmG*@&PN@CW#HI5=j0@^J K`5h+gDER`8nQ49i literal 0 HcmV?d00001 diff --git a/app/auth/__pycache__/handlers.cpython-39.pyc b/app/auth/__pycache__/handlers.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4233117102152df15ce9bb81ed54fde6b862fb39 GIT binary patch literal 733 zcmYjPJCD;q5Z*`ph+~IvAWC{mD0I*u1UitQ;B+FXtVqG}&JlxO?5+`qLPKa%&{NRz zPxuYnQr%ymV#Y|Pj5MF;u{$&0tn(y^7>fS+;LSt9*dKC^#Yg7}s@WkZrg+6_p7B~_ zqL!KD6cg2`_A+mk&af8L1Pprvx*E zUrgV`&)+-qRo-) z$Z->0sfm~-HbZAOH6NP#huA5W8xw5UM-)NZ7&937H^vAM*fr9fX utTuW~cYXc;c}HDq?9hH-aReuHEPRAd&{yynSHlc(zK!F~c#P=FDgOtUMYAvf literal 0 HcmV?d00001 diff --git a/app/auth/__pycache__/middleware.cpython-39.pyc b/app/auth/__pycache__/middleware.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4fb1775c0b5e056608c5b449204a8644bd1dfa39 GIT binary patch literal 861 zcmYjQO>fgc5ZzgSRVg^xEo@mk(Rf`*l}f0A zV-MW<1KjvMzQTpSz=;_bN_Vy6H*d$|nKyElrd>hn^Y=Tie@Y>Kuyb*REoT9XPY0UX725* zpqnle4^4&!>zj-pRQ~M@?NP=78)&pCyv}T&xL4Nq6 zG|czk7(cEEk0*<<)x^Zi=m~u*%qVvqqwy6MQps*{2d8iX%V1Y*i%|Gz@f-y2<}TFHsXT#KqLAw(KS>gA z)j?TJ>=z(mpiWAk`KlaGXWAU4Pm06LS$*rQDT#fmq>i=mnRUY$TkIy&|C(TjnZOnv z140;+8HSiJEA>RB+Hhihrc&ME{u^<=3A{oviW?E`Mum~?aX_c#Av>#Q&#Of zo->vMG6E!Y;j(N)SH{o-yhhyC@KW8{�BTMV7UxMh*T_qtZ+(w0?msGe%@ocrc?G zalL9l6^!^x6o-d)YR>xXGtGk><h9#7rGHsrt9MuC`P^#u9fXew&DyI`*J%k8_A WsdDBXNiRy)b^rtD$sYAVJNN_0RM!Il literal 0 HcmV?d00001 diff --git a/app/auth/__pycache__/service.cpython-39.pyc b/app/auth/__pycache__/service.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e270c55e2ea8a4d9712d826ddeddbb76df25aff2 GIT binary patch literal 1380 zcmZWo&2A$_5bmFu@z@?aPS*L`16qWHG#q?DfRI=rP>9$d$Vzb#QY(^oGTm{;J3pqo zy}`&ig%eWVAO|?|0=x+l>MN&x1-MYv4(uX&)HPMr)!kKJeVz4s9RlO`-#&WwV?f9s zXuLkaM?QgRegz?kq$LsfXCZNW31Gy{a$zUT>Eh)j$lYO|eOd>dVeP5nHk=9;ifhRG^0YL?(A!_GJHuKy0fW zHIy57Ob+BG*t=?|_T(1W59AQ+eM!e8-F^wVljD@RSY}q)qEfDnQmWEsDRuGFxh^GnzH;+xaS`0(K5@bvq3-c0MFd35wy%3U{qb+BXd+(la1 zg|2gk+20Rr2Zwn8(>w-Y$%?MXjNY(owqlYjh~ATAOe|P44lDeI>Gx~^R(M0N`HGLB zUF(_B<22IPe-~ron6U18^Pj9;w=ia*CboI5YR3wh2D%3kx{qN2?sB1D{DtTp@cp?x zI?Lwsvut56&tUaMk*m>s=@N7xY&mpb69NsMKxo2Z8n8a?fYf{70VG=<#X{;0uycxW z_XA6hVfykv1jUk{=+ESuLb>FIS`J{qX9GzkyQRCp%e(NJ*>D!Em~Gj3)|SC7K#+#V zFY#dLV0fj}bCZUSo5i`{P%ntg3SOUIIIg~%Lrgm>r;RS`WtDa`_QORBo7c@1Y_fXY z)1&eD>%$X`DeBONs5)2u z4TM-HFV%mO*Kgr%Z-Pka`etnRtCU^xLh0gSxu(iHux31QseT*xJanuv9y*VZi|le< z)KiUwcEPLxs^Gn%kLm~>m9bfE%^J79`L@i;{8ClRQKKu}!pH<@HbPd7q-`{^0_p+R z`a$Y89y~w?vT1ZrMbCE6@pW6U9{mUfa?kOiwjNy<$Rf8s_19YCE5`n~_;J<9MX5eU Yw9P{hF&zMz6AGV~10*)z=?#*<0eh!F{r~^~ literal 0 HcmV?d00001 diff --git a/app/auth/service.py b/app/auth/service.py index f1ab419..b324b18 100644 --- a/app/auth/service.py +++ b/app/auth/service.py @@ -10,8 +10,8 @@ from app.auth.dto import Credentials from app.config import config from app.user.service import get_user_by_username, passwords_match -JWT_SECRET = config["CGNO_ID_JWT_SECRET"] -JWT_ISSUER = "Energia" +JWT_SECRET = config["JWT_SECRET"] +JWT_ISSUER = "cognio ID" def authenticate(credentials: Credentials, db: Session) -> Optional[str]: diff --git a/app/db.py b/app/db.py index d14febc..6c425e2 100644 --- a/app/db.py +++ b/app/db.py @@ -4,7 +4,7 @@ from sqlalchemy.orm import sessionmaker from app.config import config -DATABASE_URL = f"postgresql://{config['CGNO_ID_DB_USERNAME']}:{config['CGNO_ID_DB_PASSWORD']}@{config['CGNO_ID_DB_HOST']}/{config['CGNO_ID_DB_NAME']}" +DATABASE_URL = f"postgresql://{config['DB_USERNAME']}:{config['DB_PASSWORD']}@{config['DB_HOST']}/{config['DB_NAME']}" engine = create_engine(DATABASE_URL) diff --git a/app/init.py b/app/init.py new file mode 100644 index 0000000..8e6d094 --- /dev/null +++ b/app/init.py @@ -0,0 +1,23 @@ +from app.config import config +from app.db import session_factory +from app.role.service import create_admin_role +from app.user.service import create_root_user + + +def init_root_user(): + db = session_factory() + + root_email = config["ROOT_EMAIL"] + root_password = config["ROOT_PASSWORD"] + + create_root_user(db, root_email, root_password) + + db.close() + + +def init_admin_role(): + db = session_factory() + + create_admin_role(db) + + db.close() diff --git a/app/main.py b/app/main.py index 385045f..f68138b 100644 --- a/app/main.py +++ b/app/main.py @@ -1,9 +1,10 @@ +import uvicorn from fastapi import FastAPI, APIRouter from starlette.middleware.cors import CORSMiddleware from app.user.handlers import router as user_router from app.auth.handlers import router as auth_router -from app.user.root import init_root_user +from app.init import init_root_user, init_admin_role def main_router() -> APIRouter: @@ -15,6 +16,7 @@ def main_router() -> APIRouter: app = FastAPI(title="cognio ID API") +app.add_event_handler("startup", init_admin_role) app.add_event_handler("startup", init_root_user) app.add_middleware( CORSMiddleware, @@ -25,3 +27,6 @@ app.add_middleware( ) app.include_router(main_router()) + +if __name__ == "__main__": + uvicorn.run("app.main:app") diff --git a/app/migrations/__pycache__/env.cpython-39.pyc b/app/migrations/__pycache__/env.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c9d0d0bc56e8faf906b077f022c16b63117eb92d GIT binary patch literal 1974 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 Y&0(CdHx%*3G8)77sACvZ{d8yPFChyzGynhq literal 0 HcmV?d00001 diff --git a/app/migrations/versions/__pycache__/646ae6f3e17a_initial.cpython-39.pyc b/app/migrations/versions/__pycache__/646ae6f3e17a_initial.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..77a1f4bef744995b523b9d4d9987c4efe503d671 GIT binary patch literal 1185 zcmZuw%}*0S6yL9Qw+ltSf&KKIXb(~1 z4B}tq!02HGS1vd=XQrq3@;bg0c6_F$G95{UR0e}B?2yAdzE7GyRZb%3B%s#?>;$T^ zKIQHBSY>EHn6KP6JEPo7EY!#m37FqanL}ktdZBW)y+d!Ow)d%~talr`Rh8YUrsr6q z*x29S-L7oB*{#;?G(Nq+2v+JW*JL6-27FZIL`2H-P=Ly}lDEcr@DfFFL?lzEMpG&E z;xuDJ5|yolekb6{-sUlFQ=zg4v0%KdtSavW%1UNMISC#zOniD@uz-l}4((P#E@MF$ zkJb1G&Q3dYAo-z*Cm1h&IN2v}RBdCJBawiOeW zjp2FoSbxChqOP(#5gG%XLf7&Uf@Wm(Nqr`z8T~Py$##{$Ui#D8 z({J9^sEI^fH2S@AL4;AiQ-fmqw*s1}9E9gQ&F49?GU=~oh-Zk!5oLQGge}igHt}iD zWUU*Y^3*4O>zD>zF@u)M5jVfB$|vr;0oxRWw~jrWE$U0<0*xpK>4iKkERAz-TF!b9 YLdU1Cbo4LB5iEODcPvX!x9Lp%1L2W7NdN!< literal 0 HcmV?d00001 diff --git a/app/role/__init__.py b/app/role/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/role/__pycache__/__init__.cpython-39.pyc b/app/role/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f7c0f052a01bb0658310834156add39e1d748b80 GIT binary patch literal 135 zcmYe~<>g`k0@?l62_X70h(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o2D9)hec-C_gJT zxuiIzJT)mMDKR-aCNm`_v7jKPC_g7PCO$qhFS8^*Uaz3?7Kcr4eoARhsvXFb&p^xo E002)O2mk;8 literal 0 HcmV?d00001 diff --git a/app/role/__pycache__/model.cpython-39.pyc b/app/role/__pycache__/model.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e0890e22c972e796000a47e5c1ba4b0d6d718412 GIT binary patch literal 691 zcmYjP!EV$r5Vf7e@n(06)EkH&$fX|u2vtA}Tza5;vLYF8Y)Yt|WF1E(=jGZnS2*%9 z{D7~V`U{*GXOY^GW->ExX8gvnT(1iRa{T-G$L|=SKQVYHDFmmW!#gkvDQu8M9O38_ zgDv62COokzPi@9COF5mf#N?K7hS6K3Qk8u}D${JA@P(q6sLbzR8Y*#MN_y=ZtII6V z*PR({8}j$9*H_vFdg)!$UIq3BiZ)Ob(vAM=p{+P;edDKBa?o|0^iVPgPC;kJ8gZ-; zCkpdKr#e$aCAWlA@N<>!F~pgow+UyES?n<{;JXB_s~_v1NacVWDF%!eA^p%99Wn=Y z*Z_xR?;0!JB(C*z7Y{ryNuXof>_#0}I~pUmMwi4L0TyzlKgrSfi}F!mLbTFqAwnU9 z?bK+ZzY=0MO7kCC3*lq`A#@4MaPeOR(kK^K3~7X19^IwVL+zU0H(l#!EG02bM_;$y zO<31X%ZQ11+rN-|98044Tb@0ude?o?wI8Y*y{)#gzOEWo$-b}Rsul3l=A@t80_qv) z5FZS~DOurT%i&6o#Lut&7v<_IpAH?+E~by*OOW QOL&%Oh+D15Q?g3_0o1gs0ssI2 literal 0 HcmV?d00001 diff --git a/app/role/__pycache__/service.cpython-39.pyc b/app/role/__pycache__/service.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b75ddf58726eff404e4ec127a04a19ab0e2df886 GIT binary patch literal 1513 zcmb_bJ#*Ve5WT$vz;Bw8CE3o`IO&jrMT)pc#^Z^{tuhmJ8qF{??`%T>NO}P!;SAD5 zY15}rA(i?^nQLA7FSzpCBPhyo8(?m4Z*jPLZ{O~8Fz6~gkN*Ac=SPuJZ)9=%K}ZymX^!~$;g(;|1N@!CH35ySThyXuVRGc7+hkN5`TDMtANOiicilCCgM zRHf^%KG#;A5r0*gbM+_H>N2Y73i*H+U#T!BO@xlrH65lcAI+zQ^KriT&9NW7bk#&K zOrEbM;X~)y?=u&0do#7xC$mLSWR-8Rd%>=Jm1>TGh7*`;#Uo7b_QxmFq;cqB~91;SX zNBo;&5*4;N+~&<}Awl{)zoxY;|H07NU?@MwL7VG8h0mhS?DoBqKB<c2OoYov57^i0j6kEgcC&^AH9GzwDi07tEJCuADhz8kiNa$9Q| zkc*&xrzyqljxP}|rCt=uuuUW4FW~b%m=DTN(sq-&Z?O;xwNTKtJ|&CtDJ7q*j4snghH1h(C89B z#QHG3-P6J?ksnYr4mYs_cdO#J2;3AqP=L?eh=)DBr5;_ literal 0 HcmV?d00001 diff --git a/app/role/model.py b/app/role/model.py new file mode 100644 index 0000000..2aacdb8 --- /dev/null +++ b/app/role/model.py @@ -0,0 +1,14 @@ +from datetime import datetime + +from sqlalchemy import Column, Integer, String, DateTime, Text + +from app.db import EntityBase + + +class Role(EntityBase): + __tablename__ = "roles" + + id = Column(Integer, primary_key=True) + name = Column(String(64), unique=True, nullable=False) + description = Column(Text) + creation_date = Column(DateTime, nullable=False, default=datetime.utcnow()) diff --git a/app/role/service.py b/app/role/service.py new file mode 100644 index 0000000..e2d46aa --- /dev/null +++ b/app/role/service.py @@ -0,0 +1,49 @@ +from typing import Optional + +from sqlalchemy.orm import Session + +from app.role.model import Role + + +def create_role(db: Session, role: Role) -> Role: + role.name = role.name.lower() + + if get_role_by_name(db, role.name) is not None: + raise Exception() + + db.add(role) + db.commit() + db.refresh(role) + + return role + + +def get_role_by_name(db: Session, name: str) -> Optional[Role]: + return db.query(Role).filter(Role.name == name).one_or_none() + + +def get_role_by_id(db: Session, id: int) -> Optional[Role]: + return db.query(Role).filter(Role.id == id).one_or_none() + + +def get_roles(db: Session) -> list[Role]: + return db.query(Role).all() + + +def create_admin_role(db: Session): + admin_role = get_role_by_name(db, "admin") + + if admin_role is None: + db.add(Role(name="admin")) + db.commit() + + +def delete_role_by_id(db: Session, id: int): + role = get_role_by_id(db, id) + + if role.name == "admin": + return + + if role is not None: + db.delete(role) + db.commit() diff --git a/app/user/__pycache__/__init__.cpython-39.pyc b/app/user/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ff3a5256c081d5e88747739e8a6ed25af5153870 GIT binary patch literal 135 zcmYe~<>g`kf;**p2_X70h(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o2D9)hec-C_gJT zxuiIzJT)mMDKR-aCNm`_v7jKPv^cdWCO$qhFS8^*Uaz3?7Kcr4eoARhsvXFb&p^xo E05$aXHzL2z#WuStVe?S2p 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 UserResourceModel: user = model.to_entity() created_user = user_service.create_user(db, user) + return UserResourceModel.from_entity(created_user) diff --git a/app/user/model.py b/app/user/model.py index 0b1b62e..b69bafa 100644 --- a/app/user/model.py +++ b/app/user/model.py @@ -1,9 +1,11 @@ import enum from datetime import datetime -from sqlalchemy import Column, String, Integer, DateTime, Enum, Date +from sqlalchemy import Column, String, Integer, DateTime, Enum, Date, ForeignKey +from sqlalchemy.orm import relationship from app.db import EntityBase +from app.role.model import Role class Sex(enum.Enum): @@ -22,8 +24,14 @@ class User(EntityBase): username = Column(String(length=32), unique=True, nullable=False) email = Column(String, unique=True, nullable=False) password = Column(String, nullable=False) + role_id = Column(Integer, ForeignKey("roles.id")) given_name = Column(String(length=32), nullable=False) family_name = Column(String(length=32)) sex = Column(Enum(Sex), nullable=False, default=Sex.NOT_KNOWN) birthdate = Column(Date) creation_date = Column(DateTime, nullable=False, default=datetime.utcnow()) + + role = relationship("Role", back_populates="users") + + +Role.users = relationship("User", back_populates="role") diff --git a/app/user/root.py b/app/user/root.py deleted file mode 100644 index 050ff35..0000000 --- a/app/user/root.py +++ /dev/null @@ -1,21 +0,0 @@ -from datetime import date - -from app.config import config -from app.db import session_factory -from app.user import service as user_service -from app.user.model import User - - -def init_root_user(): - db = session_factory() - root_user = user_service.get_user_by_username(db, "root") - - if root_user is None: - user_service.create_user(db, User( - username="root", - email=config["CGNO_ROOT_EMAIL"], - password=config["CGNO_ROOT_PASSWORD"], - given_name="Root", - birthdate=date.today() - )) - db.close() diff --git a/app/user/service.py b/app/user/service.py index 32dd92b..016983a 100644 --- a/app/user/service.py +++ b/app/user/service.py @@ -1,15 +1,18 @@ +from datetime import date from typing import Optional from passlib.context import CryptContext from sqlalchemy.orm import Session from app.user.model import User +from app.role import service as role_service pwd_context = CryptContext(schemes=["bcrypt"]) def create_user(db: Session, user: User) -> User: - if get_user_by_username_or_email(db, user.username, user.email) is not None: + existing_user = get_user_by_username_or_email(db, user.username, user.email) + if existing_user is not None: raise Exception() user.password = pwd_context.hash(user.password) @@ -31,8 +34,28 @@ def get_user_by_username_or_email(db: Session, username: str, email: str) -> Opt return db.query(User).filter(User.username == username, User.email == email).one_or_none() +def create_root_user(db: Session, root_email: str, root_password: str): + root_user = get_user_by_username(db, "root") + admin_role = role_service.get_role_by_name(db, "admin") + + if root_user is None: + root_user = User( + username="root", + email=root_email, + password=root_password, + given_name="Root", + role=admin_role, + birthdate=date.today() + ) + create_user(db, root_user) + + def delete_user_by_id(db: Session, id: int): user = get_user_by_id(db, id) + + if user.username == "root": + raise Exception() + if user is not None: db.delete(user) db.commit() diff --git a/docker-compose-dev-win.yml b/docker-compose-dev-win.yml index b902b28..b0d4d46 100644 --- a/docker-compose-dev-win.yml +++ b/docker-compose-dev-win.yml @@ -8,4 +8,4 @@ services: env_file: - ./.env.dev environment: - - CGNO_ID_DB_HOST=host.docker.internal + - DB_HOST=host.docker.internal