From ed33156148c3ce525581fcd747eaaff6d1d9877f Mon Sep 17 00:00:00 2001 From: Abhimanyu Saharan Date: Mon, 2 Feb 2026 13:09:35 +0530 Subject: [PATCH] chore(frontend): use Orval types directly; drop normalize hacks --- .gitignore | 25 ++--- backend/.gitignore | 4 + .../__pycache__/activities.cpython-312.pyc | Bin 1725 -> 0 bytes .../app/api/__pycache__/hr.cpython-312.pyc | Bin 4428 -> 0 bytes .../app/api/__pycache__/org.cpython-312.pyc | Bin 5298 -> 0 bytes .../api/__pycache__/projects.cpython-312.pyc | Bin 6534 -> 0 bytes .../app/api/__pycache__/utils.cpython-312.pyc | Bin 968 -> 0 bytes .../app/api/__pycache__/work.cpython-312.pyc | Bin 5636 -> 0 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 594 -> 0 bytes .../__pycache__/activity.cpython-312.pyc | Bin 1035 -> 0 bytes .../app/models/__pycache__/hr.cpython-312.pyc | Bin 1836 -> 0 bytes .../models/__pycache__/org.cpython-312.pyc | Bin 1446 -> 0 bytes .../__pycache__/projects.cpython-312.pyc | Bin 1262 -> 0 bytes .../models/__pycache__/work.cpython-312.pyc | Bin 1929 -> 0 bytes .../schemas/__pycache__/hr.cpython-312.pyc | Bin 1279 -> 0 bytes .../schemas/__pycache__/org.cpython-312.pyc | Bin 1580 -> 0 bytes .../__pycache__/projects.cpython-312.pyc | Bin 780 -> 0 bytes .../schemas/__pycache__/work.cpython-312.pyc | Bin 1409 -> 0 bytes frontend/src/app/departments/page.tsx | 6 +- frontend/src/app/hr/page.tsx | 12 +-- frontend/src/app/page.tsx | 8 +- frontend/src/app/people/page.tsx | 6 +- frontend/src/app/projects/[id]/page.tsx | 12 +-- frontend/src/app/projects/page.tsx | 3 +- frontend/src/lib/api.ts | 24 ----- frontend/src/lib/normalize.ts | 95 +----------------- 26 files changed, 41 insertions(+), 154 deletions(-) create mode 100644 backend/.gitignore delete mode 100644 backend/app/api/__pycache__/activities.cpython-312.pyc delete mode 100644 backend/app/api/__pycache__/hr.cpython-312.pyc delete mode 100644 backend/app/api/__pycache__/org.cpython-312.pyc delete mode 100644 backend/app/api/__pycache__/projects.cpython-312.pyc delete mode 100644 backend/app/api/__pycache__/utils.cpython-312.pyc delete mode 100644 backend/app/api/__pycache__/work.cpython-312.pyc delete mode 100644 backend/app/models/__pycache__/__init__.cpython-312.pyc delete mode 100644 backend/app/models/__pycache__/activity.cpython-312.pyc delete mode 100644 backend/app/models/__pycache__/hr.cpython-312.pyc delete mode 100644 backend/app/models/__pycache__/org.cpython-312.pyc delete mode 100644 backend/app/models/__pycache__/projects.cpython-312.pyc delete mode 100644 backend/app/models/__pycache__/work.cpython-312.pyc delete mode 100644 backend/app/schemas/__pycache__/hr.cpython-312.pyc delete mode 100644 backend/app/schemas/__pycache__/org.cpython-312.pyc delete mode 100644 backend/app/schemas/__pycache__/projects.cpython-312.pyc delete mode 100644 backend/app/schemas/__pycache__/work.cpython-312.pyc delete mode 100644 frontend/src/lib/api.ts diff --git a/.gitignore b/.gitignore index 2c9b447c..261aed6d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,20 +1,15 @@ -# OS / IDE -.idea/ -.DS_Store - # Python -backend/.venv/ -backend/__pycache__/ -backend/.pytest_cache/ -backend/.env +__pycache__/ +*.py[cod] -# Node -frontend/node_modules/ -frontend/.next/ -frontend/.env.local +# Node / Next +node_modules/ +.next/ -# Logs -*.log +# Env +.env +.env.local -# Local run logs +# IDE +.idea/ .runlogs/ diff --git a/backend/.gitignore b/backend/.gitignore new file mode 100644 index 00000000..3d6a54ba --- /dev/null +++ b/backend/.gitignore @@ -0,0 +1,4 @@ +__pycache__/ +*.py[cod] +.env +.venv/ diff --git a/backend/app/api/__pycache__/activities.cpython-312.pyc b/backend/app/api/__pycache__/activities.cpython-312.pyc deleted file mode 100644 index a3e601ced052c7f1ba3356f8a1cfcd995059b6f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1725 zcmZuxZ)hAv6rcTbw|jegxi-<5i}upiCiH~nAgK^j6>3^RJxgo?%9XNgZYSxUyL;#C zq~_#;Q46*p6#Wtp0#Oi*)GvY{`bEJn1^tk4fgA(HN)gGo)ZmwX^3B~%R!RrjD!m6V=`hxUr;+EWrQ%vDh`G^P}X~(!F zbu1?d^J4hGo|m1JV_u8h>N*$GH96O_%dMQml6DYOs7>8U5MId1EOB=Fm5Y@{iV4%s z;VKTC5Lj&nhatGIc!)h*qI}{4rdHUY!PL)|sC(6=wfB;Fy8~SuG9$vUOuS0)yt~9y zYA=Kg?T*17O5KCCcb5bS36}OvU{_IHDt8an{@WE4JUWA_0*S+yHNiwW@+#{QD^Quo zd}xSN9juyq$N@~67Mvr|!vfc#ygeb@?2+{2@ZiYF#Nm z9(f5=S08l}VEctfq=6lXEP;R>6gbkrJ{4I40h<*#(qxDp6IS`SK#_j*ERlmiau9f& zi2Ma|lr>FwN$8VnDyl0pD5qZ7%`q=&cH|uwV5mHH`%rUKM*Sw1DFr!4UO|fIyG}p&eyo5`HHx5aFV0wi(m{@Z)(#uWN!C{HT zJlA(AQ+#^~gc~r$_BjE4^iFGwy%c&?e& zy+bVKQtXFJfy>7vJLK=mQ9d3N@>eQ8&fB4V#U^%;pRSbv_|v3PhN~FnE3k!CH@T zCo{H{8T)?Xhcn-u*%_bO8lP&8pKoSf-pLfUGKJq~Hs83oJ^SY7TbDPjx#n!C`MT50 z;HEjhW0tqfa?|uy&bJJ6WvZ3x{Rbsu#&xNsCvO@zjJy3$tU8}Mt>KZK;fbx`iPq53 z_2tHL>qvI}QsYuIt-w`W_~p>?m}-B0VO zo_`f1VeBce_TB(8(<`s;!!e*=I@wj+fD+ziB+l7G%&@HaMY>3^WfA_45Z<~>o3}#> zxgz{QAw2a=58v_pii5rO%yxUQ9!Tk^GdJ2T8R5?f>*HkGGaT)vwbp5*IO#m33OtqV zG=GE0Gd#da5D)a{VbY?9UnHl&e~r+?IbNj4`6`zS4?_Z1``x-SE22m24oyoGT9 diff --git a/backend/app/api/__pycache__/hr.cpython-312.pyc b/backend/app/api/__pycache__/hr.cpython-312.pyc deleted file mode 100644 index 7d8b6a85b70974eccf882e11ac6740ea2b598b63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4428 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 Iifs4)3-dYyg#Z8m diff --git a/backend/app/api/__pycache__/utils.cpython-312.pyc b/backend/app/api/__pycache__/utils.cpython-312.pyc deleted file mode 100644 index 8880b6418de8d455723e15be33a8afead1424e23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 968 zcmZ`%y=xRv5TCbSxA&P`au;HdcqAa6#B91WA_R*Rfe^4e3Cm{pne1i1e7hG}S6i@ZFo>pMhEBSg)M=UwoDJjGMK1X*- zZ?s-HmAd7h;>a%HRVxU>#7f*Sh_}&~H-Z#R=?RTvj3LxF?8H5ClOh~hsTW#~O-3Dq zinfYBG9XtGf)mJ~KUp0o36qRD0%RnUGC5N+^|+mg`a=5J1pTv_dN$rEAP#&cXXETi zlt2nyX}hcPre!A~GpQeWVM?j#I=o7Q1e-RKG@`sbb}+6SQMSixVj85fzjLMHgKnouQFv8d`4a-28rP6*ovaS!X*8XhDw4al%Fn+ajr;IVX_d`m*h~cJdTcRyz1jcE^=m zV>B7CfGc93ZiQD&^Vt9+)HIp6cQ%EJYj_oIu+J3X=<##U4;|_i&G1HJD$@O9JUI)6UBRRbYA{uL@LyY9p@;)PTlvE-LeB&??tWL`4sO0OZ~1ga7~l diff --git a/backend/app/api/__pycache__/work.cpython-312.pyc b/backend/app/api/__pycache__/work.cpython-312.pyc deleted file mode 100644 index e81425b06ff802d1d5a7d216dc88c6c4bef8934b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5636 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 diff --git a/backend/app/models/__pycache__/activity.cpython-312.pyc b/backend/app/models/__pycache__/activity.cpython-312.pyc deleted file mode 100644 index d412768e818e919d5dddee55f30cbf509a912c02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1035 zcmYjQO-LI-6rSDeCYw#7O*N%dtwD21q3)$8k%As977Z5dWho3}W}>V66K5yd4TT2U zg2&wKvDacK_S9?dy%dszE)*=KNDqaAr3X))*-gZOeSF`0-@Nzsz1=UloDTRoZ@;vD zO91>3WN?x(kS-QEI0P7A$p(&ON|L~`EjzL)M>t_89K}=|)l?-QgGT@>uK`wxij$qx zkrL-IlYv%F{}QAug&E|!9z)FXT%S`7BSx6zkg^=Aix#nQsI5I&Uhy!otMUEV_LE5$ zA2>e*1eg*Aru>vQXC`Do6fEOJM>&#XxvBCtk~lfXX+N6kXjjox6itgL*10YdA=%U- zfA-3s>-*Dqh^vML6WNHqeJieW-F9vq@llFnW^tbDZwh@Nmq$WvzRIjUiv^*MVq_7& zvd&*Rg-H!HY!+tf)N&9F;0_6zy5+Lsi(!Y91xl zrYmlQd7js!aG--04ii43VTQPj*M%&olQ7*UJgDpuy3y3RWKbttM}h4j47YvH<*OO) zcLr-w>VS$BgnE?{zA_9EE9XKDLKis%!cd3M@o>WyI1Ax!1KIsZ4nl@DY!Xwd@+>qf zQVm0R?PGwD4vA1+m=R&3ddUW>y52r5aL;>i!7aF4F}6I17|2Ikh$7cm4XPYCtJK>j zRpuLBow!vS?cYb690bM&s_qaM8>n74c$38Tjs6ybnR-AqQA`-|_|Ld`15QSZt(EVE zJMSJGulEYGt%U=t5Rq;yUN;GezdEMo{Se;O9z}6PxRcYrL)QD z)^ht^SD8K?D<0qeH2HC|H#XmT+}3)^Je?SnTjxVoqtR5#DKWrWgEc50AWaBK^!l2= zYey}|a}&R2-0!$RQL4KfU21dj^dHhGPQ_>F3;&;lBuU@E)K4&R4oZKM8EHW}c>b3C J0|G_&{{x!=8chHI diff --git a/backend/app/models/__pycache__/hr.cpython-312.pyc b/backend/app/models/__pycache__/hr.cpython-312.pyc deleted file mode 100644 index bfa75cbf04f0b98abefc59db58205c7e5c894015..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1836 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 diff --git a/backend/app/schemas/__pycache__/hr.cpython-312.pyc b/backend/app/schemas/__pycache__/hr.cpython-312.pyc deleted file mode 100644 index c8957d2952706d224562a5220fc1cb8d3a0ba1fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1279 zcmaJ=&1(}u6rag%Hfh@0uOzkFl%Vwxq3*pDL8My5##$+q92}-QQC7&&AQ(`g zM?JOwg7~L+jEAt`Nj&r>G+ui0&1_oIT3p!Qy!Yn4H#6`3-na4b0#e`Scdc9op`ThA zKsH_R$x9Fp5km~S$ioecm7H-ip3yKc%Am)H86OZcx$)IVV;ZKmX2EI=S+m-j18aWB zYQ-b9!m$dh;bfHheh|{I75Ea={EO#L*8|2~CrzB<;1qna3Hl-8sDT-3WVYaj++dj% zuxiQB65NYr&m~JsxrV7d@>&~dWLW{cMwJG)8B5A*oH8ef{BV=+M_h&v1*aiTjFulJ z%tRxvD1mfMn&IBPt zFgz!!7^h)&n+X5ev~O4_7?`u0ZbfZ%P2V2?YYw1YPH9hbgYf;ae1Z0}I# zHTRiK+ihDqP3}=?H^senEG(5;f%@eVz(>@ZDR<3suTt%r)!yXH`)30~vD8^RaJpux zS6%F^e_H--E{gJ5{MDVk3)>ev+knn;lchby&@rW%x?{MO{kLOVZ3Z2yiwVe-SQ0oD zNnMMYC8pHj(+Xx3+)z+dplT&b3iSPEl{9w-Dw9-pcgk%Pp^=sCB5d8L+=QOd_5vrw}R6Q*M| z1qap1!pL!1%U-UFE=d)FE|+9p*%T-bxc~qqnJRY8V(;cc*IXFL*XKK{2hi>Lw3;fQ zUdt&0??z!HfWShHa*~((E>N1g!UQ#?mae)!=VCif^D8O)?~B{utY%2s0KW~4@eg$C g7pn9v3*R}~?ju<{9 diff --git a/backend/app/schemas/__pycache__/org.cpython-312.pyc b/backend/app/schemas/__pycache__/org.cpython-312.pyc deleted file mode 100644 index 40fca14ffcaa5e05441d1a8c7e99ec282204b9e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1580 zcmZvc&ui2`6vt;av)MH5YOT_0f6=N~Bj}#IXz8W?K+&RzAi0EbXS7@MW1VExfZ&1( zJ+3GJ2Jzq@;zei=OTd$O@FsM<^yGV!wB2pD&~M&*Gn1M3$#>^_wQ3Xm`}D5ytwhK# zofJ~epL8dI;4=|KP@e?Ur4-|mUkVJ@prk}@6JdNHf=T16k*{%?u9l%{_EpQeT7jz7 zS2cBY1gdslwUUlHV}I~<4$Ve+7)A+C8c`TSYCU>*?|vktU(dJ8wb+~PT!8#Dk;J8f zxTVK%ZfS_pGE{}(GCZd!W0o3@nT_9&O|FtahRLduJdv3ZCn{qh59Hde-3XI~w+m}g zD6{c($%Q9_rXQtJdJW-}Gt2XEqUU9{=LL~y`52FR-pdyEi;?4=*LQr+Q;7Tv*#RZH zcWUcVAZtA4>s;}$_8_f85Ij)PhO8%XEo#cJ?(^4|`Ev-;+EZSCAwyB)&1NmGugieL z9QFK4GgT(MPYVX|1jt9ywX5&%bk8mQV5d48+iXdV?@bzx?h*_SqH_VAWWvz+s9Oen ztiVSH@jY$|zz58LU%^aSxZMZ}Htm>d6yq_JDvBOIh7pdd<0$%wConp>C%7t}0)dXE zX4*G4FKw}zBW>aI;cdAvGT7F>BhVXpa}2yuhRoEhGH4aEN|Bl9SuvtB+pTC%jbfHE zXDmB*v#>?(Ayt6^-CS1PH%yW?<(h_(RmHyPz(<)K@DRSQf>@n`m03AyB)-f{UQZgY z;2DGWTd`vu#;3`h#=XvvSoHrZV`-@f0uw#CkO=N8*{ zJN6b^?4F)&-`s@SYRQ@$Rxxu#XBvJ=9s2-x;WfLQNmqW!Dt~nN7BhOk%OTjgw@IuS1_@xgQi}V$PH2;z7--Z6B`Y?kZ zd)HddFQOH-2rDT3$Jasr8kEwXV&_edz@umP$0nWWJn0d5^d?L?-+A&6 I;(2|<|C6p)6aWAK diff --git a/backend/app/schemas/__pycache__/projects.cpython-312.pyc b/backend/app/schemas/__pycache__/projects.cpython-312.pyc deleted file mode 100644 index d9fc27855c443530d415a68f970aa09aec26be7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 780 zcmZuuOKTKC5bmCr!z5#TfMS*nK|$Dn&L0R~BD#tW5y@pPO*`GXYvz^i8D&H;phAxE zl;0r!6p!Yx40sX|Z^EvZoUEGJg#;X!ufD44uB!g(tM7XRzfbSRzrg%xojKT@rPCph zBO-{P2}x;0DRLt*QZq6sG01%)%nw9Z()?m}cOt8e+7NY4MeX|B!2OL!2DDk?S(cZ) z9Osz^*M0ir(c@gmB<@OdIIl;iH^Dz5l0;OH$k>5dq$!L|hzc{ZTF*kSwg*n*Z>#*J zjLR)0c_|xHm#VQcp327IaXEekRzv4XhXcED8N(D~jmKD;iz-3B%-CMVlX+%^u~XAB zrckxdWC}=5!eErAGT@qzxZ+u`UB^Ju`3yS93z@|Ue|?L;08$6fc)Tk!5%8i2bUczN z*Fn(@tZx^!a-e7nNc2U3k7VNc?;lJqt?u7D*gCdW)rG~G|EskD>9cA@pq8|R*(ydO zyY)K7D2T97Y^M;QSop>R$=2Vlhj}KIi@or{14k_(Uq1+HetiSrk4Y*0POkqX{h4FX-r;aYz|1^@t{o2l0$*zf_y;;9v`YX0 diff --git a/backend/app/schemas/__pycache__/work.cpython-312.pyc b/backend/app/schemas/__pycache__/work.cpython-312.pyc deleted file mode 100644 index ddbdc63ac79346bfa7d41afdf340f7f2acf84ff2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1409 zcmZux&uiR96rNd)R$8ssaU9om;o_YwOP(oVjrrVSx7ac0bJ5%r0`mveO z)(8SIIDybpa*F?jkUymt!{)FEdMZ8iRG4lsyd;7M8k2;El%m~;8;KQKlr+dUL|9LVVA6VRRquq%cx~`D zr@XfDI^cDuyv?HJdw=7LJ}uikO|zWmgDllR-FrXY`92de?p28^tWTlGec&&NBq0?f zY&?J)N=r0uf>&5zF=N>w!&?Z)FgLVKtX0RF!h=}5W{zQVHFFK?AS-NtzVz;My?aYZ zp3Bl2qJaUHo3MN>jYk(z@V)jYxi!bOBdfLG)gkeqG>{Vb6I*SyaaPlLNf z4~*n)Rlg3hp-g)*-`nInU=#tCDN_;f;V{s>zD&3d_A<45eORa_CP%iW3)a zIz!#1jvnC*PQK8MJxVE<1R%oEJIsN{J&S%u}hg*4u0l1+MLx>=*-S&L76#aMCJNtvS0ba%hp<7tBgY#05KtkFL6D=faByex zv46yt54|z-Ctl~tw^hBkv+FxJ7(b8lk%GZc_-9hO`e6*CB4fpXRvl`jHV4cedg|V+ zrs_-e5p1UL=m6j!i&FXrS^tZyoirVK{rSoXf#qb$rk|k=%gKU8=MUX~2`uJD{{fwi BOM3tS diff --git a/frontend/src/app/departments/page.tsx b/frontend/src/app/departments/page.tsx index 75ba167d..d4744dd9 100644 --- a/frontend/src/app/departments/page.tsx +++ b/frontend/src/app/departments/page.tsx @@ -5,7 +5,7 @@ import { useState } from "react"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; -import { normalizeDepartments, normalizeEmployees } from "@/lib/normalize"; + import { Select } from "@/components/ui/select"; import { @@ -20,10 +20,10 @@ export default function DepartmentsPage() { const [headId, setHeadId] = useState(""); const departments = useListDepartmentsDepartmentsGet(); - const departmentList = normalizeDepartments(departments.data); + const departmentList = departments.data ?? []; const employees = useListEmployeesEmployeesGet(); - const employeeList = normalizeEmployees(employees.data); + const employeeList = employees.data ?? []; const createDepartment = useCreateDepartmentDepartmentsPost({ mutation: { diff --git a/frontend/src/app/hr/page.tsx b/frontend/src/app/hr/page.tsx index 2e49f51b..30805b84 100644 --- a/frontend/src/app/hr/page.tsx +++ b/frontend/src/app/hr/page.tsx @@ -5,7 +5,7 @@ import { useState } from "react"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; -import { normalizeAgentOnboardings, normalizeDepartments, normalizeEmployees, normalizeEmploymentActions, normalizeHeadcountRequests } from "@/lib/normalize"; + import { Select } from "@/components/ui/select"; import { Textarea } from "@/components/ui/textarea"; @@ -22,16 +22,16 @@ import { useListDepartmentsDepartmentsGet, useListEmployeesEmployeesGet } from " export default function HRPage() { const departments = useListDepartmentsDepartmentsGet(); - const departmentList = normalizeDepartments(departments.data); + const departmentList = departments.data ?? []; const employees = useListEmployeesEmployeesGet(); - const employeeList = normalizeEmployees(employees.data); + const employeeList = employees.data ?? []; const headcount = useListHeadcountRequestsHrHeadcountGet(); const actions = useListEmploymentActionsHrActionsGet(); const onboarding = useListAgentOnboardingHrOnboardingGet(); - const headcountList = normalizeHeadcountRequests(headcount.data); - const actionList = normalizeEmploymentActions(actions.data); - const onboardingList = normalizeAgentOnboardings(onboarding.data); + const headcountList = headcount.data ?? []; + const actionList = actions.data ?? []; + const onboardingList = onboarding.data ?? []; const [hcDeptId, setHcDeptId] = useState(""); const [hcManagerId, setHcManagerId] = useState(""); diff --git a/frontend/src/app/page.tsx b/frontend/src/app/page.tsx index 1766ba26..a34ed799 100644 --- a/frontend/src/app/page.tsx +++ b/frontend/src/app/page.tsx @@ -6,7 +6,7 @@ import styles from "@/app/_components/Shell.module.css"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; -import { normalizeActivities, normalizeDepartments, normalizeEmployees, normalizeProjects } from "@/lib/normalize"; +import { normalizeActivities } from "@/lib/normalize"; import { Select } from "@/components/ui/select"; import { useCreateProjectProjectsPost, useListProjectsProjectsGet } from "@/api/generated/projects/projects"; @@ -16,12 +16,12 @@ import { useListActivitiesActivitiesGet } from "@/api/generated/activities/activ export default function Home() { const projects = useListProjectsProjectsGet(); - const projectList = normalizeProjects(projects.data); + const projectList = projects.data ?? []; const departments = useListDepartmentsDepartmentsGet(); - const departmentList = normalizeDepartments(departments.data); + const departmentList = departments.data ?? []; const employees = useListEmployeesEmployeesGet(); const activities = useListActivitiesActivitiesGet({ limit: 20 }); - const employeeList = normalizeEmployees(employees.data); + const employeeList = employees.data ?? []; const activityList = normalizeActivities(activities.data); const [projectName, setProjectName] = useState(""); diff --git a/frontend/src/app/people/page.tsx b/frontend/src/app/people/page.tsx index 10cb1d29..e0c06d83 100644 --- a/frontend/src/app/people/page.tsx +++ b/frontend/src/app/people/page.tsx @@ -6,7 +6,7 @@ import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; -import { normalizeDepartments, normalizeEmployees } from "@/lib/normalize"; + import { Select } from "@/components/ui/select"; import { @@ -24,8 +24,8 @@ export default function PeoplePage() { const employees = useListEmployeesEmployeesGet(); const departments = useListDepartmentsDepartmentsGet(); - const departmentList = normalizeDepartments(departments.data); - const employeeList = normalizeEmployees(employees.data); + const departmentList = departments.data ?? []; + const employeeList = employees.data ?? []; const createEmployee = useCreateEmployeeEmployeesPost({ mutation: { diff --git a/frontend/src/app/projects/[id]/page.tsx b/frontend/src/app/projects/[id]/page.tsx index 723c78fa..78326342 100644 --- a/frontend/src/app/projects/[id]/page.tsx +++ b/frontend/src/app/projects/[id]/page.tsx @@ -6,7 +6,7 @@ import { useParams } from "next/navigation"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; -import { normalizeEmployees, normalizeProjectMembers, normalizeProjects, normalizeTaskComments, normalizeTasks } from "@/lib/normalize"; + import { Select } from "@/components/ui/select"; import { Textarea } from "@/components/ui/textarea"; @@ -34,14 +34,14 @@ export default function ProjectDetailPage() { const projectId = Number(params?.id); const projects = useListProjectsProjectsGet(); - const projectList = normalizeProjects(projects.data); + const projectList = projects.data ?? []; const project = projectList.find((p) => p.id === projectId); const employees = useListEmployeesEmployeesGet(); - const employeeList = normalizeEmployees(employees.data); + const employeeList = employees.data ?? []; const members = useListProjectMembersProjectsProjectIdMembersGet(projectId); - const memberList = normalizeProjectMembers(members.data); + const memberList = members.data ?? []; const addMember = useAddProjectMemberProjectsProjectIdMembersPost({ mutation: { onSuccess: () => members.refetch() }, }); @@ -53,7 +53,7 @@ export default function ProjectDetailPage() { }); const tasks = useListTasksTasksGet({ project_id: projectId }); - const taskList = normalizeTasks(tasks.data); + const taskList = tasks.data ?? []; const createTask = useCreateTaskTasksPost({ mutation: { onSuccess: () => tasks.refetch() }, }); @@ -76,7 +76,7 @@ export default function ProjectDetailPage() { { task_id: commentTaskId ?? 0 }, { query: { enabled: Boolean(commentTaskId) } }, ); - const commentList = normalizeTaskComments(comments.data); + const commentList = comments.data ?? []; const addComment = useCreateTaskCommentTaskCommentsPost({ mutation: { onSuccess: () => { diff --git a/frontend/src/app/projects/page.tsx b/frontend/src/app/projects/page.tsx index e47c5392..c97a5148 100644 --- a/frontend/src/app/projects/page.tsx +++ b/frontend/src/app/projects/page.tsx @@ -7,7 +7,6 @@ import styles from "@/app/_components/Shell.module.css"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; -import { normalizeProjects } from "@/lib/normalize"; import { useCreateProjectProjectsPost, @@ -18,7 +17,7 @@ export default function ProjectsPage() { const [name, setName] = useState(""); const projects = useListProjectsProjectsGet(); - const projectList = normalizeProjects(projects.data); + const projectList = projects.data ?? []; const createProject = useCreateProjectProjectsPost({ mutation: { onSuccess: () => { diff --git a/frontend/src/lib/api.ts b/frontend/src/lib/api.ts deleted file mode 100644 index af53c09a..00000000 --- a/frontend/src/lib/api.ts +++ /dev/null @@ -1,24 +0,0 @@ -export function apiUrl(path: string) { - const base = process.env.NEXT_PUBLIC_API_URL; - if (!base) throw new Error("NEXT_PUBLIC_API_URL is not set"); - return `${base}${path}`; -} - -export async function apiGet(path: string): Promise { - const res = await fetch(apiUrl(path), { cache: "no-store" }); - if (!res.ok) throw new Error(`GET ${path} failed (${res.status})`); - return (await res.json()) as T; -} - -export async function apiSend( - path: string, - opts: { method: "POST" | "PATCH" | "DELETE"; body?: unknown } -): Promise { - const res = await fetch(apiUrl(path), { - method: opts.method, - headers: opts.body ? { "Content-Type": "application/json" } : undefined, - body: opts.body ? JSON.stringify(opts.body) : undefined, - }); - if (!res.ok) throw new Error(`${opts.method} ${path} failed (${res.status})`); - return (await res.json()) as T; -} diff --git a/frontend/src/lib/normalize.ts b/frontend/src/lib/normalize.ts index f92bea55..7ddb1b03 100644 --- a/frontend/src/lib/normalize.ts +++ b/frontend/src/lib/normalize.ts @@ -1,6 +1,8 @@ -import type { Department } from "@/api/generated/model/department"; +// NOTE: +// Orval-generated hooks already return strongly-typed arrays for most endpoints. +// We keep only the Activity type + a tiny normalizer here because Activity is not +// currently generated as a model. -// Local activity shape (not generated as a model) export type Activity = { id?: number; actor_employee_id?: number | null; @@ -10,59 +12,6 @@ export type Activity = { payload?: unknown; created_at?: string; }; -import type { Employee } from "@/api/generated/model/employee"; -import type { AgentOnboarding } from "@/api/generated/model/agentOnboarding"; -import type { EmploymentAction } from "@/api/generated/model/employmentAction"; -import type { HeadcountRequest } from "@/api/generated/model/headcountRequest"; -import type { Project } from "@/api/generated/model/project"; -import type { Task } from "@/api/generated/model/task"; -import type { ProjectMember } from "@/api/generated/model/projectMember"; -import type { TaskComment } from "@/api/generated/model/taskComment"; - -export function normalizeEmployees(data: unknown): Employee[] { - if (Array.isArray(data)) return data as Employee[]; - if (data && typeof data === "object" && "data" in data) { - const maybe = (data as { data?: unknown }).data; - if (Array.isArray(maybe)) return maybe as Employee[]; - } - return []; -} - -export function normalizeDepartments(data: unknown): Department[] { - if (Array.isArray(data)) return data as Department[]; - if (data && typeof data === "object" && "data" in data) { - const maybe = (data as { data?: unknown }).data; - if (Array.isArray(maybe)) return maybe as Department[]; - } - return []; -} - -export function normalizeHeadcountRequests(data: unknown): HeadcountRequest[] { - if (Array.isArray(data)) return data as HeadcountRequest[]; - if (data && typeof data === "object" && "data" in data) { - const maybe = (data as { data?: unknown }).data; - if (Array.isArray(maybe)) return maybe as HeadcountRequest[]; - } - return []; -} - -export function normalizeEmploymentActions(data: unknown): EmploymentAction[] { - if (Array.isArray(data)) return data as EmploymentAction[]; - if (data && typeof data === "object" && "data" in data) { - const maybe = (data as { data?: unknown }).data; - if (Array.isArray(maybe)) return maybe as EmploymentAction[]; - } - return []; -} - -export function normalizeAgentOnboardings(data: unknown): AgentOnboarding[] { - if (Array.isArray(data)) return data as AgentOnboarding[]; - if (data && typeof data === "object" && "data" in data) { - const maybe = (data as { data?: unknown }).data; - if (Array.isArray(maybe)) return maybe as AgentOnboarding[]; - } - return []; -} export function normalizeActivities(data: unknown): Activity[] { if (Array.isArray(data)) return data as Activity[]; @@ -72,39 +21,3 @@ export function normalizeActivities(data: unknown): Activity[] { } return []; } - -export function normalizeProjects(data: unknown): Project[] { - if (Array.isArray(data)) return data as Project[]; - if (data && typeof data === "object" && "data" in data) { - const maybe = (data as { data?: unknown }).data; - if (Array.isArray(maybe)) return maybe as Project[]; - } - return []; -} - -export function normalizeTasks(data: unknown): Task[] { - if (Array.isArray(data)) return data as Task[]; - if (data && typeof data === "object" && "data" in data) { - const maybe = (data as { data?: unknown }).data; - if (Array.isArray(maybe)) return maybe as Task[]; - } - return []; -} - -export function normalizeTaskComments(data: unknown): TaskComment[] { - if (Array.isArray(data)) return data as TaskComment[]; - if (data && typeof data === "object" && "data" in data) { - const maybe = (data as { data?: unknown }).data; - if (Array.isArray(maybe)) return maybe as TaskComment[]; - } - return []; -} - -export function normalizeProjectMembers(data: unknown): ProjectMember[] { - if (Array.isArray(data)) return data as ProjectMember[]; - if (data && typeof data === "object" && "data" in data) { - const maybe = (data as { data?: unknown }).data; - if (Array.isArray(maybe)) return maybe as ProjectMember[]; - } - return []; -}