From 31893414eb9574b54fc2eff63079735788577f7f Mon Sep 17 00:00:00 2001 From: xds Date: Sun, 8 Feb 2026 02:13:59 +0300 Subject: [PATCH] feat: Add pagination with total count to generation listings and enable filtering assets by type. --- __pycache__/main.cpython-313.pyc | Bin 7802 -> 7828 bytes .../__pycache__/assets_router.cpython-313.pyc | Bin 8855 -> 8907 bytes .../generation_router.cpython-313.pyc | Bin 5167 -> 5192 bytes api/endpoints/assets_router.py | 4 ++-- api/endpoints/generation_router.py | 4 ++-- api/models/GenerationRequest.py | 5 +++++ .../GenerationRequest.cpython-313.pyc | Bin 2827 -> 3111 bytes .../generation_service.cpython-313.pyc | Bin 19822 -> 20267 bytes api/service/generation_service.py | 7 +++++-- main.py | 4 +++- repos/__pycache__/assets_repo.cpython-313.pyc | Bin 14364 -> 14470 bytes .../generation_repo.cpython-313.pyc | Bin 3518 -> 3939 bytes repos/assets_repo.py | 7 +++++-- repos/generation_repo.py | 8 ++++++++ 14 files changed, 30 insertions(+), 9 deletions(-) diff --git a/__pycache__/main.cpython-313.pyc b/__pycache__/main.cpython-313.pyc index 06281cf6b41db6c8fd43540de8612431e81f37c2..414005b02f6bfaccdbe85db1fdd477b79dac3815 100644 GIT binary patch delta 78 zcmexmGsTwoGcPX}0}u!tYtMYXk#`X%qxa+uoGMZZ8mby;nK`L>iMgqo#a5~sIhlE> hdHI?tnv<_^E@#X6%*@D|x4DsvPmnQh^91QvOaRyg8C3uP delta 51 zcmbPY`^$#+GcPX}0}y=GZ_7Npk#`X%qv7NYoGO#waV}>I`pnG88nSsd7oQ+w$mUhj Gub2S7C=nn4 diff --git a/api/endpoints/__pycache__/assets_router.cpython-313.pyc b/api/endpoints/__pycache__/assets_router.cpython-313.pyc index 79f5d02eaca114a637a5cac9743e1709a9bf6d1f..dd7f063207f0fbf9d6b07396202907918d8b1cd8 100644 GIT binary patch delta 792 zcmX|-O=uHA6vt;~ce6>eTWdZVQ);_u8}mgPsHxh96irNMs}|`rrKF1`lq9Cur0gz2 zp@Jw>K}2v4iWk9?r=sMn(xTwUCD4NqPojbsp;{Drb0!~s@P6}uJO4MleUDO~Qoemz z?f^8NzPnR0+yH!IMLRlMVt?eN?>h|0xEF&cj~%KFcdLE)xQbN2Ks~rm9mf4MU8*Z8 zVTJgS4|>RD;WtM3LI_CqD6~xAXJ^@Ok#*P*4OfN;aX|6WYkTSLP5_P%WR-_h*aFBxxYYebOc4N z6JV6#$yUcWpW#P2GHi82_^{JKj#BLJ~ zUSF$}^}McI=!Mb_EyBF9HqKL_KOk?Uh{f@uuxpQhmgD5FG?Se8YKtEHk$@`$5A>7N zbt{$#!dEci;a_{G+U|#mL4I2?GwmNvc=?@fiRzs}$mkUk!Rn?wB{&Oc48%hV7$=BL095{eMn!{eRAN$QP9xz97m}bBXq+K{d(ny0*Vxr)_Se7&8 zIKXjo2Wh^8ri2qFGKU1Z8(Wzc@gR9a-AOXcMW99yr@def4vix+Aq2@Mm!FKd z5Br1??*Vh7jZ(ly9x$l^P!mbb9fKly>`o0zHSv63ckB6^n9HIBkU_CbGjF3PT}A!7 z?iWxdcNL#_h__B_l9GHop3G-8L;BQW{^-~K^xkg; z1WItv9;2RnIYWnUp%LZZ#VBotp%LddBQj%c)JX7KK85mD95PJ^hF)J+rv!h4cW&RP zG?emM&8gI!OKfBrPd&$aPq8aZGMQpxkQvVcERYS)!g1DWNLQEaCC9Pap6Ql{$r&ay zRCL*z_&*zFG{U4%KjB>$yzF7c>JJWpb2?`oVVw;56MWcPU^vU9^+P%GB!pq1{yk&~ wFh}O2(@?6vimEVm7H^lY`~nI*4WF<4Y}Ji?yM7pJ*X;|79jM+Se`7oU0Mb>NSO5S3 diff --git a/api/endpoints/__pycache__/generation_router.cpython-313.pyc b/api/endpoints/__pycache__/generation_router.cpython-313.pyc index 3c9f1b002b9704e235f94d460471c8026ccfe6ca..4ae2f694477b0e92bb0f6afca616b37ca82577e7 100644 GIT binary patch delta 962 zcmZWo&ubGw6yCSH&5x#Qvb$L~8?yPaCN>dFu}unXrB*2v+FM6OaG)*iQd4VEW>fJX zSnyDKv&>!a*ozi&@Fe!&!J9=WNKg<)TYW({KG1tg%z+{Iawm_CorrDiQ+`MiHFP0~0$Ke~HhJj>L9 zTL=QNvFr#ah6aWJDPtnZ;_Up5Aa@?o1)N0jF%d@{0muJU*8nB3fm9qr8a9!RleGv+ zriC?m4eBT5B>%r-gy)cflN3XJsL;oEDGa#JXJ=MckCnr$X6OMJpwq9As|1xcE}|^E zSsiPi>!~U6_OvM0Z9bsN6i$!gvhVs>yjm!n97C;zP^m{X=&L@6BZgU%(O^%uOb4W= z&_{Qqa#Ejhn=V;uH(E_^-t{)v;?jNTF6f=GoD#vN`A|hmutQg5VzPy#I9T+4s2OrN zb?B$icd$GA;VsZITo@r)p2%^?(_7JcP#-2XkCZrAbSLU)ml*ZJ4D!K6iu7I7glgv~ z`WCcdE*xP{kxmTh%a~cd#>1yMVzI3!GvF4a$dmkSl6vP`Y#U0alXUg5h_3jdB_sjxkSS;5*XyiUH%DBjp}ImR93-W`ZmIzM?M*x=!-w zBwdYv&YZcN7ff-%6upxehYEd>cr6l@PN+rD=%Q+}kK~E!Eb?)?A=27p^L6Eome(fy zA$KK4NY!VnZo4Zrn(g42RyR=ECi;U93`ZWUU#goA3MHH@mZ+3vUbZu`Kr> zK3=|fwzRb^>-g99n7f`s1d(X9e?CQ1K_087=QXMYc~4cRx}(?1z&krEUCniYxaMG|E67fi^bVywSGw7jJvEUG=PJNuKF$_HJ<}N?gZ$xY z+*7tgX&5{)D`K1ATHy$*12F=V*phg4Khsb1qsw|SRj@>cVBRs(( z+Y}1yldyo*Rz}n!*kF@VQB82aMUkfXMAHy7){q)f9@0GfDgD4k>tpu@RtEqWr6z0) zLddd(m>u%FsR5N?2pZdoS*pcTx0{DtIOq`Djiqs^br^e()d>Jz=AkIG1=+iJx^M}~ z|MsZHm#)YINYEkJggZpbt)uuRmO>}&sjN#`C>v}?9vp}7-98A3Vk; z>y0|S?=3YOw9-11?_g}QxrAv<0W;_s2}of_xPf$rJx+Wz!q>ys?rFd*0A|_4-YHyQ zuX^9G+e%(nc+po@n-A(M?)a^fhAP`qtaWhiOSHM>)u}InDGKk~7kENTLAF@;d||2K zg(t4?8V#I4x7X;HM-=$;qt|(twUzn}N_Y+aCAY-w9SIoY?^)@fBWoXx{zmD2 pG;x5$)jhPzrqu)axwkuf AssetsResponse: +async def get_assets(request: Request, dao: DAO = Depends(get_dao), type: Optional[str] = None, limit: int = 10, offset: int = 0) -> AssetsResponse: logger.info(f"get_assets called. Limit: {limit}, Offset: {offset}") - assets = await dao.assets.get_assets(limit, offset) + assets = await dao.assets.get_assets(type, limit, offset) # assets = await dao.assets.get_assets() # This line seemed redundant/conflicting in original code total_count = await dao.assets.get_asset_count() diff --git a/api/endpoints/generation_router.py b/api/endpoints/generation_router.py index 0b4a092..575ba5c 100644 --- a/api/endpoints/generation_router.py +++ b/api/endpoints/generation_router.py @@ -7,7 +7,7 @@ from starlette.requests import Request from api import service from api.dependency import get_generation_service -from api.models.GenerationRequest import GenerationResponse, GenerationRequest, PromptResponse, PromptRequest +from api.models.GenerationRequest import GenerationResponse, GenerationRequest, GenerationsResponse, PromptResponse, PromptRequest from api.service.generation_service import GenerationService from models.Generation import Generation @@ -43,7 +43,7 @@ async def prompt_from_image( return PromptResponse(prompt=generated_prompt) -@router.get("", response_model=List[GenerationResponse]) +@router.get("", response_model=GenerationsResponse) async def get_generations(character_id: Optional[str] = None, limit: int = 10, offset: int = 0, generation_service: GenerationService = Depends(get_generation_service)): logger.info(f"get_generations called. CharacterId: {character_id}, Limit: {limit}, Offset: {offset}") diff --git a/api/models/GenerationRequest.py b/api/models/GenerationRequest.py index b9f1469..45e9d06 100644 --- a/api/models/GenerationRequest.py +++ b/api/models/GenerationRequest.py @@ -18,6 +18,11 @@ class GenerationRequest(BaseModel): assets_list: List[str] +class GenerationsResponse(BaseModel): + generations: List["GenerationResponse"] + total_count: int + + class GenerationResponse(BaseModel): id: str status: GenerationStatus diff --git a/api/models/__pycache__/GenerationRequest.cpython-313.pyc b/api/models/__pycache__/GenerationRequest.cpython-313.pyc index 76e1265819f29df4a187da9bea8530d34c201827..daf935434e13a9fa5a26b1cd8f671e0b7a2132a8 100644 GIT binary patch delta 556 zcmYL_&npCB7{}+e^J|B}*jZ*rYD2rm9;{_8(k6;f4yK%xHpZsbjNX~e4JQsRw)f&6 zkQ^lk|AHJyNpqrHoGDk&Gm@$I^L*d;`+eW%o%f{k!cad|RpH>9zdYW)Z>TA9*T~+O z2G`5kZ6;^8uZhJN`W#0SRn6+SdYy}rJUf(=2X>PH%WHxi%VHHl@u+NpN>$O4!o99HQf=X?D!>hXi?Sd`KmP`$(G=(q$8tq1j zcc49pG<%2}nG8w9cNkRxF#-sMt(sQ}=qN4}5oyF2qJ$Vn;B$pB*W05!PA3qPcr^t(MeR)H zO5bFFseFnZ$cv=F?&PvKjkXXa%P0{AmXG(5a+KVOmq>}7$7eG$Xd|$zF9F~mTiTA6 zXy2c+Z0W33*)K#rqvN7Y_>{k)eo&!2wc~BpYfhOiz?8u7SJ|zSYiT0MGwX|k@};nM GCHn*VFnZkp delta 337 zcmZ23(JjXNnU|M~0SI33w`C?zSk z07NK&2tyEI1R{(<1T&Dh#hjO4Uc>_8nt%w?$&XmnCf9O&o~*_yHMxt^i&1y-RZcq% zYmg+^CM6I{97HIC2o(@v2_tkTTXQKhT23zHl$>0_WzJ|cc>|ZTnk`5gM1brrW(N}O z3^#cA+q@x0fMonMg(pjL*Xe>y0;@;0;ueQZZhlH>PO4pz3s5;D$RMxDC%LsJ@u&j; Defdf4 diff --git a/api/service/__pycache__/generation_service.cpython-313.pyc b/api/service/__pycache__/generation_service.cpython-313.pyc index 041fbd7b7e4ed88f02154628112d8d61c90297a7..c8001aa51978139c0ebd0b35d05693c712fd4088 100644 GIT binary patch delta 2562 zcmZuyT}&L;6`s3417={s>>q{&1{NFE*w~h{E<+Mn{qdP0 zHjQLx(1bx~5;ndZSSeW+AbPSZZ*DLv=T z24l4&?YHNg``vTzJ@=e*|M^3<^)mB)*3{G>;rF{+&*lF#e$&^+7H;eu4FEKZdxcZxH|CCWQK)3RxqFEVp zRoz_?^3reT@TQ~9DH;AW?Iz^Ae} zkNe89@Nt%J`MTr%w7>v?ieNV_IR`T|%eZDi9}VnBh}FTvB#Zr@oL|OqXAp#!VFECupMh(w?KzygaAy>aq5X zN7xB=!F3+vtw^d=^dPb6OX6dbY4?b$PpX$vI{t=Dmx>OH@}l$=_acjVQ!zI@j%0X( zAcGKN!Vq)WN-b2B1GZw7EId%Qv{tlkQM5#eFX4m@yLrj5wB6*rg0|ZPEy%PR3Z;~6ylUD}lHM$}iP ze=vPJa&$X#^mgR*cI0&RLZ*7;WO*( z3LJzED+dOye}e4h71^(1#iCt5routt8@5k2mJs4UMM#vJ&?d0ns%8)}a-3U7&TIL(U{cN%F*nTDshQLiUN@z$Nxg-t>#w0HR;Wb7t+MRY1|RD@(0Sj(GV&Y`^0_lJvy+d&3cudj z*Fjsb<=g^Yy5rH=&nEi(P3I(AueiIm*v4g~#r8swywEZ39~Deefq<&aRwd>`)#+yg?@vHIQhQ324-)g?NV&t^!vJSWsoU5cye49-= z!K0PvNVb0$OV3({po-2yp|!m<+oa}X2}gng7VjAjFC8L6fC#mT)Pl8~Zs~BA{3mH# zaeATCm}y@SAhUPo{F$jqc%BT@Y3+JiVKKjIz&WxVAP`OMDgMfE+xQ96cQtOBf;DKt z(=_lc0;)84mVla!NQK%}@P7}-WKp|M^61C~`8gUN;OirY^>d~4)J^dyRQgJ~3V zT6wu-m7tNvzKalRb1rU^KRVjWI{7-{H2=})arr1wj`6>Y#vP|G@|Ll$Dxw!q*4RK@tUiKQHHl@;@d=V7xG2;C8_swS>(+dWD}_+uI#6%Vg-tpzR91N z>Ioi0%kBq=_^DnL0l28VUmWqJMoRU*E`RCHt_E8pC7&_k^Fnp`LF7^noziMr@r-5H!HHhe+1>8 zkN+xhDJOm%zn;^}SUKj9d0eZ>BChrx%+T4=(vksiho*~*6w&>J zRFTx;;Fn45+KGl;e-ih(wrZS$f8YqUK=U2`i`hX>c3aBwyR#e3lOFc)za&Bt#Qy>T Cj%lp` delta 2174 zcmZ`)Uu=_A6#s6!e$1A&v}?Pz`_rx)+q%DyF`-)lhtAn<6rreyb>F)6V=MIE&izUt zgp5BLgc##;H5#IXL?eL_qxNNqKKNq78{@$M-;;?i@2j9HsenY@$lm2?{Ip>~x z?mfSAx_pH^yiDwm>guc#|4iF2Y(k~AP|B)#C0i+! z`5i=h)2KJ|ys4Q>qNw~AW>FntU;DglUxSs*Ru4DWNROx_hKDHx4?1l)@LDn%PmV{3 z2uP9c$cztt0kQDt0~5RhfMZ5C9)tPDLS z-USxW_D@0pxSU6z2qJxrOA*<4vpl=q+R}I&ZI~@Z=1gNz`MtTQd)ZRZ%UZ(Sq)?5A zZ@T}d5v|*Q^IkxIdp=h@re>Ad`3&%;fU#=rj*G-5&PCEgiG3FJ%YxWZ_I)(q$Aoof zg{n#!N=I^eRS_cqdf3BgU=e!_66j)EZ#FR*@GPiDwI#lHbbJinM+Nr0UW;tOI538~ z%?P3+PoUMM&|IOC$2a50&4EfO457c!JVG4;(q;W^+4bRw zEQmzez2R5ochJNsq&zH0kAn)NKhltOp#A#-Wg-H|Z z=Qz&x#|GsAblJi##fFTaOYEoEJ{y(=kOq1i=S>^=sQTj0o3;r-2Mf)sY8jT%G6pES6De7A-&bh@owV58yQh? z${F)^C%d0`WzmmoJ3;^fDFrr!-3V6^EC~BK=$4t2no8jfl+C%KX0TrLB=)&M<)bJ$ z5KbY8Cb+^S-J>W}%V@b-C8KGOo2l?vK1BiSAQ(ju&$S(;?QCV@?2yR<Moyf)_V6Aow`w&w*Ml(f(|v1o*0YeI}bJ zYbwxwI;gD6{FV2iD`)IvX>Lvh_!;+$x?V-;K7t^*c!y`-Mz4+W>?(P67d+s8IP&Os XteET}N%nbi(Xpq7?EXVS6z};rqNN0; diff --git a/api/service/generation_service.py b/api/service/generation_service.py index 7b31ba9..d098a6b 100644 --- a/api/service/generation_service.py +++ b/api/service/generation_service.py @@ -9,7 +9,7 @@ from aiogram import Bot from aiogram.types import BufferedInputFile from adapters.Exception import GoogleGenerationException from adapters.google_adapter import GoogleAdapter -from api.models.GenerationRequest import GenerationRequest, GenerationResponse +from api.models.GenerationRequest import GenerationRequest, GenerationResponse, GenerationsResponse # Импортируйте ваши модели DAO, Asset, Generation корректно from models.Asset import Asset, AssetType, AssetContentType from models.Generation import Generation, GenerationStatus @@ -94,7 +94,10 @@ class GenerationService: async def get_generations(self, character_id: Optional[str] = None, limit: int = 10, offset: int = 0) -> List[ Generation]: - return await self.dao.generations.get_generations(character_id = character_id,limit=limit, offset=offset) + generations = await self.dao.generations.get_generations(character_id = character_id,limit=limit, offset=offset) + total_count = await self.dao.generations.count_generations(character_id = character_id) + generations = [GenerationResponse(**gen.model_dump()) for gen in generations] + return GenerationsResponse(generations=generations, total_count=total_count) async def get_generation(self, generation_id: str) -> Optional[GenerationResponse]: gen = await self.dao.generations.get_generation(generation_id) diff --git a/main.py b/main.py index 1855801..2a86438 100644 --- a/main.py +++ b/main.py @@ -51,7 +51,8 @@ ADMIN_ID = int(os.getenv("ADMIN_ID", 0)) def setup_logging(): logging.basicConfig(level=logging.INFO, - format="%(asctime)s [%(levelname)s] %(name)s: %(message)s") + format="%(asctime)s [%(levelname)s] %(name)s (%(filename)s:%(lineno)d): %(message)s", + force=True) # --- ИНИЦИАЛИЗАЦИЯ ЗАВИСИМОСТЕЙ --- @@ -115,6 +116,7 @@ gen_router.message.middleware(AlbumMiddleware(latency=0.8)) @asynccontextmanager async def lifespan(app: FastAPI): # --- STARTUP --- + setup_logging() print("🚀 Starting up...") # 1. Настройка DAO для FastAPI diff --git a/repos/__pycache__/assets_repo.cpython-313.pyc b/repos/__pycache__/assets_repo.cpython-313.pyc index fa07fdbe83d34f4920b21aafecee2b0398555bb6..3ae1148a6ff3c3be2ed66a48af8a20b42125653e 100644 GIT binary patch delta 1648 zcmaJ>TWB0r7(Qoqc6N96o|(;MlWn%y*zMXh*=n*$$;E7vZF);IIUP;gDan#cyEW!A z*(CTN5kaf=Mg36_M2bGBh@$L^C@6sji=`zY4;xk}K8TR2(6k6Dcsc)UR_lug&UgOv z{nzuKGxOHm3-g|PZnsSM=v=#$$uzv``77kYEg$z9C?T&Cofwo6Ltxafuxfaa9$cwm z4&ACdtlWsnx|2Eibm=Z;)7`oq*=Cu!gXE%kks2NrVjkVGtG72x%)6`cn!Kdjn?>eB z&hVLxUw3e(%w+s*4^y~zDT|q5#Y|ym>TaMiR?Ce_1=(~bcMt696jsiQDwg_hc_OPY z!>eXOo9^Nsl_nG5hbV6rSe3b}U_qnuybuc)F)2^k46 z8s#$ANSavEOz=x#f+jHw>P$(D!WAh9-F`(Fc^vLILl!HOz~>4X5C8%-A)XLXO@hWX5sUjk$1Wj$tn({mLO*3%^?&rB!n(rd3n$r?L&F9ml_d_&!I0&DX?S&ie{T7s|sDMwY z47oJde|)}~_LQ<}cIfs5n&eVlVKVR&Ax_>q&0bIJWbju$7x`>xwM@~NJZRK&S6K0M z(GK|1(_iN{6iyiJ2ptHW2wfZs(o|+TJ83}B8hL-{y{Vqbt79AL*m`uU~f;cfdzF>Hf9DqZ$1N4pD3P(B)H^LE`hMjN+y^?F( z`x>Q5Sglh!ift+e#M198;(xL}iIzj)iv%gA2|#xwPT$SVNB$6a+}VBAl)>eFJ-lf* z_Z_7l!2Q4Qjm6`3#B!2tzOse~e$# z+i^y}$lZ-cMO7T!#vio7e<9>ZjGl@K#>>#qvefh_vKqo!gi(Y^gbczA!V(AGuFQDW zxC9$5)wCCWZmFROkQ2?x25b5IZJ+dh(0PY&@tVb4*3XIf(|=+ZYpt%`YvOl0|;iBz3^3QC4CdNT3ftx7AoH*h(;wh_#2ZmWS0N{ delta 1603 zcmaKsOH3O_7{_PUYkU31-ZcS(A=D7#P=cYn(h!PW2p|G93?^w=WQ=*liFvI}a;Vz0 zmD0zl&{5MK8Yxl_je6*zzHn<%gql+eLMoDTuS8W7IsG{GuJd$3z(*EX~|2N-b zXU2Yi@rwoL6Nke};Mrflo!YHgaqj!|DJV}~poDx%RH9KvG=Wjgzy`lWQ2f5iP?SRns|+BPFBhss^!oxHJX_7(Bsl|lPWce%!Qg(peqHc1r)cg zxS5}MAo{4v^A%(txuuuzurgR=R4rHxFt zcp<*9QD8;->;x;;ie`jRdEOeyWTvv2p{a%W9UGJx$eWVsR4y(!EhWZuYBrV4o93sd zVNKq0GnKs>pG;&ENs+I3mD*nfLIUI@>|mJ8i7`Vp#N#sw`^#udWI_;Tx@8FRUD3yv z-Le=aF_D+q{RWX4dAr?D1+K!3Hc`G?<>PnkC4OTanKQ+VGU@r1kU8_HLr)8cnTK3_ z#VzxX%RC`7Gh_Zy_mP)LklWlzo9UeNteeDFeB4pQ!&MgJ9mpW@eNTWtbyORqA%!m% z%6wcdD!0TeN8Kk(gk1SNZ9mEylZJep$`yw(zT+5c%=(|0`)TKKjA^KxUoy+5r6#yx z_?#sDzY$`CF=nbH5*hdt-X(ZnY%xsJkY#{>>ujgz_@1-dYtv+i(9R*+5a$8>4OdXa z6XGAZTBRyTyF=a~{AX9qSwY1vd-R_)(UY$?6l%D|>F@bJc#GP13xn~J(I z26A#+xxT4f-$*ZPDT~|AMSiy68>Z1c5Ak25dsb3*nf{e&g&OZg!d>-rt$}vch-)uJ zMVLHjp~$U0-J9CLQD@zG0fl zE%;(WE&8<)#3&$S(C|8FR}lEK0YTqPJ^d(uT-r^Sb1(ZJ(ex|mrCKMh>_8l}iK^uw z$*ZX9r_hDg1w=hU|B7C;@KZwOgA#ERjt?y_PR=JYnhV7~{%(0c<+-1LG{OB90UGC# ziZ*&T_jbi6ly-1;KyG_h->kR(ToeCOHH8HR`FOxbv5c252g3ATZY}VS0C~SVRYEWE zN2j8&X=TA4`gLw5_@fyd&2Gv?BtGQ@>P?QZj_@}DDKLWWBqQfCU`;foYbfd2yRfc#SF@{JYW)Nva767}I zN@lg&XnN!EOg52CCF6-~R!dDRWv4RnI9#Ci=2GhCqs@)gA!Fga)u0a#JN02> zEU_^$vpIJ45A^Mgr diff --git a/repos/__pycache__/generation_repo.cpython-313.pyc b/repos/__pycache__/generation_repo.cpython-313.pyc index f64f0d8bfe31ca6f586f9e0c21213320c872b4b7..caf29439a859f973eb91c1b1c2b4a95ca336ed6a 100644 GIT binary patch delta 636 zcmX|5O=}ZT6n$?#(oANO$s`?(Eh&Xqn-rTG8=5p-NJ7Pm7(%9nsDV&pEQy-fm(&U_ z6kYhSQXV4s2gF@sD0Cr8v4YDP6gp(-LsQ#ls&#zD9XOu!abuVZv%28pG$Xmu}+Og<;K+7xF_qxHJ)%*kgQNirO@J z1XZ{SCbGumZBa&ZTbj5vg(z!6NNs<{Ke%J}FhT(|4u70MRel9u=Mc)N?JZl5!CTZN z_-I6Ucj1Bn1#f*4p#1EdB(}egj|-#vX=wH9QIP6{Z&*pkHheni&#k zj&(mgiR>uN#n_uT#HL9EY$Oa2Vu%M?M=sVjs*S>pT5;n}soJQAIO4TD(?>=!53CL= zqj4yr0_iCIM{A{OiL5rtwQ9XHeqkW8rMtE8k)t@UOj$WefZym5GG*l%XNt!SFB=cXnlwel5dEe<@Y44@ZK@~U6kZkf)Tp6Go6FzT#Gahc?FmCp{Hsfl@^~hWTX>H9 zz{lIageb;msbAc5oQJCrlTL>`^sTtgkQB8`aona!>Ef!BA8iJ=XIs-<1XR!D^ebf} zQ|T#lBG_eNYQ_@%zPR*l#8_NDu!eueZ2UrVXPSN9(rSktbX XewB7{mcDRK$U)q|f02d62P^#t)f=Oi delta 294 zcmaDXw@;eyGcPX}0}#~CZ^?9F-^eG*C^8MmoyriyP{bI_P{b6>Si~GGIN6-ho>6FW zIis;COAMO{Q!u|2Ll#RBf3QH2Ksu+U@aCtCS6Gyq7#SFp85DrJ4H)uRLm87;85kl& zgBjIigXIRd_(g8z8(L-;1l2C_s6Wus>u{ND z%ehLx$jP4Zpb4XsEz3buM@}dE&2ii&jEp*yC-aoEIRZ`46r3!=TR6Fk*Oak$@&R5? zYkpSg4H`R)H|l<105UHGL|ll>ycm!L=G{=$_`nPly List[Asset]: + async def get_assets(self, asset_type: Optional[str] = None, limit: int = 10, offset: int = 0, with_data: bool = False) -> List[Asset]: + filter = {} + if asset_type: + filter["type"] = asset_type args = {} if not with_data: args["data"] = 0 @@ -68,7 +71,7 @@ class AssetsRepo: # So list DOES NOT return thumbnails by default. args["thumbnail"] = 0 - res = await self.collection.find({}, args).sort("created_at", -1).skip(offset).limit(limit).to_list(None) + res = await self.collection.find(filter, args).sort("created_at", -1).skip(offset).limit(limit).to_list(None) assets = [] for doc in res: doc["id"] = str(doc.pop("_id")) diff --git a/repos/generation_repo.py b/repos/generation_repo.py index eefe10d..fe4393e 100644 --- a/repos/generation_repo.py +++ b/repos/generation_repo.py @@ -39,5 +39,13 @@ class GenerationRepo: generations.append(Generation(**generation)) return generations + async def count_generations(self, character_id: Optional[str] = None, status: Optional[GenerationStatus] = None) -> int: + args = {} + if character_id is not None: + args["linked_character_id"] = character_id + if status is not None: + args["status"] = status + return await self.collection.count_documents(args) + async def update_generation(self, generation: Generation, ): res = await self.collection.update_one({"_id": ObjectId(generation.id)}, {"$set": generation.model_dump()})