From eca07e4b4eda5f5a1572793d0320068b0b10e733 Mon Sep 17 00:00:00 2001
From: "cc02503@surrey.ac.uk" <cc02503@surrey.ac.uk>
Date: Sun, 24 Mar 2024 01:27:36 +0000
Subject: [PATCH] First commit for product microservice. It consists of 3 pages
 and 4 functions: The firt function displays products by category on the home
 page. The second function displays a product on another page after it has
 been clicked on. It displays the product name, price, image, description and
 reviews and the product id is sent through a get request. The third function
 communicates with the user microservice to get a users username when they
 want to add a product. And the fourth function inserts the product reviews
 and username gotten from the user microservice into the product reviews table

---
 Product_MicroService_Group3/app.yaml          |   2 +
 Product_MicroService_Group3/app/__init__.py   |  10 ++
 .../app/__pycache__/config.cpython-311.pyc    | Bin 0 -> 351 bytes
 Product_MicroService_Group3/app/config.py     |   7 ++
 .../app/controllers/__init__.py               |   3 +
 .../__pycache__/__init__.cpython-311.pyc      | Bin 0 -> 356 bytes
 .../addReviewController.cpython-311.pyc       | Bin 0 -> 3139 bytes
 .../changePasswordController.cpython-311.pyc  | Bin 0 -> 3880 bytes
 .../deleteProfileController.cpython-311.pyc   | Bin 0 -> 1354 bytes
 .../getProductController.cpython-311.pyc      | Bin 0 -> 1509 bytes
 .../__pycache__/login.cpython-311.pyc         | Bin 0 -> 1151 bytes
 .../loginController.cpython-311.pyc           | Bin 0 -> 3422 bytes
 .../logoutController.cpython-311.pyc          | Bin 0 -> 1096 bytes
 .../productHomeController.cpython-311.pyc     | Bin 0 -> 1308 bytes
 .../signupController.cpython-311.pyc          | Bin 0 -> 2617 bytes
 .../updateProfileController.cpython-311.pyc   | Bin 0 -> 1792 bytes
 .../app/controllers/addReviewController.py    |  98 ++++++++++++++++++
 .../app/controllers/getProductController.py   |  30 ++++++
 .../app/controllers/productHomeController.py  |  30 ++++++
 Product_MicroService_Group3/app/index.py      |  50 +++++++++
 .../app/models/__init__.py                    |  15 +++
 .../__pycache__/__init__.cpython-311.pyc      | Bin 0 -> 571 bytes
 .../__pycache__/addReview.cpython-311.pyc     | Bin 0 -> 2468 bytes
 .../changePassword.cpython-311.pyc            | Bin 0 -> 5555 bytes
 .../database_connection.cpython-311.pyc       | Bin 0 -> 807 bytes
 .../__pycache__/deleteProfile.cpython-311.pyc | Bin 0 -> 2913 bytes
 .../__pycache__/getProduct.cpython-311.pyc    | Bin 0 -> 3518 bytes
 .../models/__pycache__/login.cpython-311.pyc  | Bin 0 -> 4431 bytes
 .../models/__pycache__/models.cpython-311.pyc | Bin 0 -> 4492 bytes
 .../__pycache__/productHome.cpython-311.pyc   | Bin 0 -> 3362 bytes
 .../models/__pycache__/signup.cpython-311.pyc | Bin 0 -> 3576 bytes
 .../__pycache__/updateProfile.cpython-311.pyc | Bin 0 -> 2586 bytes
 .../app/models/addReview.py                   |  41 ++++++++
 .../app/models/database_connection.py         |  14 +++
 .../app/models/getProduct.py                  |  59 +++++++++++
 .../app/models/productHome.py                 |  80 ++++++++++++++
 Product_MicroService_Group3/app/run.py        |   0
 .../app/templates/index.html                  |   6 ++
 Product_MicroService_Group3/requirements.txt  |   3 +
 39 files changed, 448 insertions(+)
 create mode 100644 Product_MicroService_Group3/app.yaml
 create mode 100644 Product_MicroService_Group3/app/__init__.py
 create mode 100644 Product_MicroService_Group3/app/__pycache__/config.cpython-311.pyc
 create mode 100644 Product_MicroService_Group3/app/config.py
 create mode 100644 Product_MicroService_Group3/app/controllers/__init__.py
 create mode 100644 Product_MicroService_Group3/app/controllers/__pycache__/__init__.cpython-311.pyc
 create mode 100644 Product_MicroService_Group3/app/controllers/__pycache__/addReviewController.cpython-311.pyc
 create mode 100644 Product_MicroService_Group3/app/controllers/__pycache__/changePasswordController.cpython-311.pyc
 create mode 100644 Product_MicroService_Group3/app/controllers/__pycache__/deleteProfileController.cpython-311.pyc
 create mode 100644 Product_MicroService_Group3/app/controllers/__pycache__/getProductController.cpython-311.pyc
 create mode 100644 Product_MicroService_Group3/app/controllers/__pycache__/login.cpython-311.pyc
 create mode 100644 Product_MicroService_Group3/app/controllers/__pycache__/loginController.cpython-311.pyc
 create mode 100644 Product_MicroService_Group3/app/controllers/__pycache__/logoutController.cpython-311.pyc
 create mode 100644 Product_MicroService_Group3/app/controllers/__pycache__/productHomeController.cpython-311.pyc
 create mode 100644 Product_MicroService_Group3/app/controllers/__pycache__/signupController.cpython-311.pyc
 create mode 100644 Product_MicroService_Group3/app/controllers/__pycache__/updateProfileController.cpython-311.pyc
 create mode 100644 Product_MicroService_Group3/app/controllers/addReviewController.py
 create mode 100644 Product_MicroService_Group3/app/controllers/getProductController.py
 create mode 100644 Product_MicroService_Group3/app/controllers/productHomeController.py
 create mode 100644 Product_MicroService_Group3/app/index.py
 create mode 100644 Product_MicroService_Group3/app/models/__init__.py
 create mode 100644 Product_MicroService_Group3/app/models/__pycache__/__init__.cpython-311.pyc
 create mode 100644 Product_MicroService_Group3/app/models/__pycache__/addReview.cpython-311.pyc
 create mode 100644 Product_MicroService_Group3/app/models/__pycache__/changePassword.cpython-311.pyc
 create mode 100644 Product_MicroService_Group3/app/models/__pycache__/database_connection.cpython-311.pyc
 create mode 100644 Product_MicroService_Group3/app/models/__pycache__/deleteProfile.cpython-311.pyc
 create mode 100644 Product_MicroService_Group3/app/models/__pycache__/getProduct.cpython-311.pyc
 create mode 100644 Product_MicroService_Group3/app/models/__pycache__/login.cpython-311.pyc
 create mode 100644 Product_MicroService_Group3/app/models/__pycache__/models.cpython-311.pyc
 create mode 100644 Product_MicroService_Group3/app/models/__pycache__/productHome.cpython-311.pyc
 create mode 100644 Product_MicroService_Group3/app/models/__pycache__/signup.cpython-311.pyc
 create mode 100644 Product_MicroService_Group3/app/models/__pycache__/updateProfile.cpython-311.pyc
 create mode 100644 Product_MicroService_Group3/app/models/addReview.py
 create mode 100644 Product_MicroService_Group3/app/models/database_connection.py
 create mode 100644 Product_MicroService_Group3/app/models/getProduct.py
 create mode 100644 Product_MicroService_Group3/app/models/productHome.py
 create mode 100644 Product_MicroService_Group3/app/run.py
 create mode 100644 Product_MicroService_Group3/app/templates/index.html
 create mode 100644 Product_MicroService_Group3/requirements.txt

diff --git a/Product_MicroService_Group3/app.yaml b/Product_MicroService_Group3/app.yaml
new file mode 100644
index 00000000..ab488dfb
--- /dev/null
+++ b/Product_MicroService_Group3/app.yaml
@@ -0,0 +1,2 @@
+runtime: python312
+entrypoint: gunicorn -b :$PORT index:app
\ No newline at end of file
diff --git a/Product_MicroService_Group3/app/__init__.py b/Product_MicroService_Group3/app/__init__.py
new file mode 100644
index 00000000..e5da06c3
--- /dev/null
+++ b/Product_MicroService_Group3/app/__init__.py
@@ -0,0 +1,10 @@
+from flask import Flask
+
+from app.models import login
+
+app = Flask(__name__)
+
+from app import routes
+
+if __name__ == '__main__':
+    app.run(debug=True)
\ No newline at end of file
diff --git a/Product_MicroService_Group3/app/__pycache__/config.cpython-311.pyc b/Product_MicroService_Group3/app/__pycache__/config.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..f5dbbfc7766e0722ceb9c91c99c512ea13f2f156
GIT binary patch
literal 351
zcmXv|ze~eF6uwJSwJn*%#VO#_MFb~Bgqns9qAg8IF&vb5_u3w&cj2xnWXtMb;N&d+
zM<tWs<W}g`$%{X}$NR<iy~p?FI89`5cCmww>7Ui|59@E(9-H9>F~o3!BE+l+vsz>^
zJE}1ppmzPM65fa9UQfv^J?GDd2(|6flDe#S{hLv*YzDqJ^ux)m|4`b4{xEz;+v;fd
z>RpnN2Bk^7$myK)1#}f(0qIJbEkG<a85mZII3Xip2&MTlcjeR#GNm9Vp3Ia6cP!Nt
z>9AESC@|NX$4LTW2HNGq9mAs=0-Xz)$QcLoQAw83<>Zc2B?C|^PGR!voy2KMs1#E^
yJ5BT5!PUY@6S!6_;})CLC#Gy_7~?f+6hE=qLk*{>ubrc!`LW+B>?%~l=)M5~tY~xq

literal 0
HcmV?d00001

diff --git a/Product_MicroService_Group3/app/config.py b/Product_MicroService_Group3/app/config.py
new file mode 100644
index 00000000..c00614d7
--- /dev/null
+++ b/Product_MicroService_Group3/app/config.py
@@ -0,0 +1,7 @@
+import os
+
+
+DEBUG = True
+SECRET_KEY = "Group3"
+
+PORT = 5001
\ No newline at end of file
diff --git a/Product_MicroService_Group3/app/controllers/__init__.py b/Product_MicroService_Group3/app/controllers/__init__.py
new file mode 100644
index 00000000..83fe4b03
--- /dev/null
+++ b/Product_MicroService_Group3/app/controllers/__init__.py
@@ -0,0 +1,3 @@
+from flask import Flask
+from flask import Blueprint
+
diff --git a/Product_MicroService_Group3/app/controllers/__pycache__/__init__.cpython-311.pyc b/Product_MicroService_Group3/app/controllers/__pycache__/__init__.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..5a4bfd8103bb4380305718ed59e96e027557a8a4
GIT binary patch
literal 356
zcmZvWy-EW?5XX1#5;Q_;3qiKMMhhDe5i}uo8i*kf7LN07l3TL3d(7Sj?nU$wByW>4
zq_q+oAzdoxKnuZPK7KRvADFjp_lS`V2cK|B^}T6+E%<@mDZwktSjIIg_>}X81L9yB
z5QifcwLThg#JBB%PTYc^bEiF&s7&<`h1>S58DmHyY*AXVU30L1>0QaO19UPe>NJ;+
z2KuO$Ap17;1(?doA#JTmv>Y2+pi@;X>`aV2BGj^HJvtB*iwk+1EfbSMCVF|IHJCX#
zp^TWovv`6uH&)xZ0w?d$`tm|1Whql@Dzqe~58_xERmJgHS?>?83!8ZjH`t*!IfXl?
W^c8Z>H|%)**Ej5B{h#9j-FyQ`G-u)f

literal 0
HcmV?d00001

diff --git a/Product_MicroService_Group3/app/controllers/__pycache__/addReviewController.cpython-311.pyc b/Product_MicroService_Group3/app/controllers/__pycache__/addReviewController.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..0e51d65e2ae6279d43717f3f1f61d3ea671e160c
GIT binary patch
literal 3139
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

literal 0
HcmV?d00001

diff --git a/Product_MicroService_Group3/app/controllers/__pycache__/changePasswordController.cpython-311.pyc b/Product_MicroService_Group3/app/controllers/__pycache__/changePasswordController.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..24490b5e77a15d00d5e34c42c5464eadaa725643
GIT binary patch
literal 3880
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

literal 0
HcmV?d00001

diff --git a/Product_MicroService_Group3/app/controllers/__pycache__/deleteProfileController.cpython-311.pyc b/Product_MicroService_Group3/app/controllers/__pycache__/deleteProfileController.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..5f0bf9cd2f33585660325e6ee6fa5211a03cf5c3
GIT binary patch
literal 1354
zcmah|&1)M+6rb5o$+De~RU_94&4O*5z1V>kLz@t2<&qTI#Gs@uVqv?{jO4ZVL!DU}
z6lBODP#<zAy;y}Fd~#ddLvH;yRzVQ6Cqv1hHx-i-a>|=ktVFr=vHRwI{N~M@-`o9d
zYH9+3Tz>YFmSu$g7S5?CZ;X>iVC*4+2=-Bct2mIVQXp65K&dKN#3f%1w5o=YgeWF5
z)ej_u4&fb2HAi#%`BU%Rl_*4Q;6Jr-JkcMa1ArZlpw$VIs~{`?kBC@Gn*YLY(I)f4
zIMp|K6ngb`sx$gSi*kr?%DESX7EU!neHznrYPhbksP6gn!SwQ&pDJs2Dt7^{2Q=P@
z2(OI}21C#Q)S#39K<%Lz!}3NpM>fF+U>}bB9n?YW`}mYXz;B8gnGk6!qlSGQtEVx@
zkFeuc-@zTcKdSo{j}VdHJ5%aN9YmC0r5!mgyhV22$0_mDJ6WZJ#_6vhq7u!+u<9fy
zRx5uy)mxl0$0JM(GF55ddcGwwQHf285Rk{Y+n}iuwtOEDj799h`FpU<45Qfeqeg=g
z(+e$~X<~!ipfM8+q}q`8GzSq!%#-P&tYE}aht(D0#%^|6njdx&)}vGrCKokKA+P=_
ze`bpVx$Oq++J=26q^r!^ruJ%7YXvlnxxEJ2D0F@MUI+=sy|`^gb+gi9jJEA^)MA{P
z>k-?sKPTI6Sc8_!8?Nuuut7O=Z?4n(=3QFb2qU<WM|pOj^Nm+yQH8Q?uST7lENV4B
zw%umau0>(YBG?W+jeT_GQDUjtW;t<Rp#(Gh7f=t;3k{vQ@OZ0h^`__h)AJ8+9_!Ns
zbV0rPym0>UjqbNk3v)?f4p7C5ePga?EcA_q-PNPw%-*e^Z*|vu#f5%xVfV{{hAx^%
zm*xhl{2}ZIwfohJ2~?bg!p3~xnBQH^YIHx@FZB$oZ&=Bs1)DzjXkSZ=#bk03oO3hD
z>{4=OIms=bKy&D}RY=vk@A54szUypM*(`^nEd~)>mM@LnI2&r3bDYo(sN<w($Fk1-
zW~u^jG0k}R1F;!VxCH7|?mE<K`Sb?646gVY_>Z6lGRF7_tt9{V9HGTz{5du*{q$+q
z`Te_|vC=o7!r5bd?insU#ieBC%9E8RR}x(6;cI<-Z6M9!s{;h;Ul~c)$0AucYxFh1
C$5^-k

literal 0
HcmV?d00001

diff --git a/Product_MicroService_Group3/app/controllers/__pycache__/getProductController.cpython-311.pyc b/Product_MicroService_Group3/app/controllers/__pycache__/getProductController.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..927290aca63a4c1d8b1ad3a1fa801dae5ce7413d
GIT binary patch
literal 1509
zcma)5OK%)S5bmDG&OYL761;vOaK^C-+5>A85C>yf0-IQ|L_l&LVwq?)nQpJgp2yNX
zW3<*T_~3&NIT$YXfkRHl$Q-zl6UtARjaI^%D<^J7RwQHziR#%0S)VBN)>eOARo(Sf
z&5uJvSp<^%`ycv_jL;uq(-Wm@ob7_Kj|d{zK`t(1S1L=cT$Wv>thj1f#o|nIQm$6k
zFp?0(M5gIO387>7b)=l3nWxEJJ*4+f6rxt~&#6IwqV1qVa5?U|p>mF-S5PtYr$CBo
zocY)ZX^q)l5Nqq)_w3brtTFmkNO=$|0*N(FIk$bUh~r$929+A~Noaw8*Vr1H=~^>$
zkY~2LxwAMQ%S)f!gD}md!J1FFh5PS7C=E7{h0cBhwU2^V&er=j!G~ZU_xDX4^azEh
zbrGKkkv0;N*ar>Nl!8nTN2nnUW-uV8DL0j-O5`2XP!}%{)Jz4rSE5r5xuG=F1}4f6
z${@Kbh^QoGW1v&J8*3q_tYQ-;+A~n7c<^iRJDUKtkE*DF9%Y*tQlfD{I`W<LBnOFb
zoLvZc;JcLFS^NnVrC2Jx8|N6^wCUFsVg@D`b?W;0uM4xreYlbvrdzkxjL$r}$m~sO
zEc#aHQZL}f=WyzKreoaq;DB*EsO$c!z7jG<>&Ai~GEVh}KHD%pBAcdXQKB!bnT|uf
zD&@NE=@02+{T{W}Jm2xFHie9x)>l5YE#|LKwrN|mvc&wb_MTzZYKG-|0rMdPJPSsp
z>%P!OOSSrWcFwVRVEJxsert-@yylqo-b|I|9N#h>J`YCEX$<P+Z-UxJ(eQF-{qo`7
zmrvhl7fOBPOwd?VnCN_*vRxBO5Q8ju<4hB%N*VK6tazd06jL2chF3B*iRsKJ6JyCl
z%Zgf@>5noS5<c1PUbI<U#72Y~6-ODX+cwU{WqL=L=zE;MP$jz#sJMrJ3u+s^OriY9
zlZ}I7>+*E_^7Qr+0O|bBHwT3m+C-#HoTkvo_1)~tOK5uLXsb0f+n$<jrS)BHZ{%R~
zB;n-w+rUI?c)2~iyqkgWE2De$qw4dU(St|P28$*+tX4i~=YuF6K)$PE2REbqWR#v{
z1$e{V;-y$!bxgj&#3z;1pU}cmVw=!+)%6K=c<H~sCS1koO2so>TB*d>F4S3hT#Hp0
zj({c=vnwK(xGtgPJUs^)Lx;|@w*V8LIR75hsf;l`L37dnTPLU(4X%W)y)O>xM`NwR
zt#;v7gsuT54gZeEU*PfR_4l8J&#Dm~Z{gc*eEU=?;2Wn1)L$}^mhb?S;K`f+1!j<u
AegFUf

literal 0
HcmV?d00001

diff --git a/Product_MicroService_Group3/app/controllers/__pycache__/login.cpython-311.pyc b/Product_MicroService_Group3/app/controllers/__pycache__/login.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..ee02eac64b23cc7222f821324eb85aa9d76b8dc0
GIT binary patch
literal 1151
zcma)5%}X0W6rb6TY)nj3N}GC6S*aEmTcuS>DN<+?QK6`yMF<PB?oPhkk2td{M3Rz&
zhf)d+w9rcro-D=w0sSL-h{b~p2tw&Wda-!()R~R(qagJ0_RVkJd-J|#_H!Z;1B?bH
zexpGFfS-KRCg~I$ml*g6EMP$!I4}zxAuBjyR)kz9*pee>WrjsdvLlX?RUi-mQcBTw
zAWOC)dH7Y?Vi~sC*CH#r0k#<2ZYw~x!|Ip^TI`T(G?8{Zw*yqhMc1cFiFj@?SD^|<
zs{tau25BsZe6z3=5QGmQKLKgf_VPt{X}P=}83`ek=4R&?m_>1rU+^qqo@HY|JpGQp
zGr&58HQ-;cmw42WYOo47&nj<g`DzJU%xnAHQ}C5@d-Y$dSOrzF)SfI@31i}$mRJ=m
z>61{C{P=~_(&gCmz>@#ZPm9b@`N6}{vBy+Kj#0GNlP~yW)cL?fgyaHS6Zl97G4co}
zSjzR}1ou;muIXWnOkay&ndzy-Cr`yZ@^OUkW9fkSo`djo2J=2NnJQt5=?s-D!#Bck
zRN~h{6Bv=Q=MuEUErbVDIi0*uKha+@5271R#VqKvF3RBI8qzbK892!Gi9W}yo@?0p
zOP3iiDf$)F%drkvc@;hF1(+ap(ZehHGi%LoO=PL*f??ap%_GA4P#4j%x`51r>+z?6
zh(3wEpggJ@<+5&iu8%$D%qj>U%5b?t<q+Z9tV-T0S!JRQjv^qLs!#66Z@e9^XZAX;
zzngk9)mYr=?Ah(?sZach-)f+pc=v9+yPi2vt~L5UjQmjgno8f^ow090vulF!>%@LC
z)u`<x2X>PK&FH|v)uv;X6wGKbD(7s2tYH2|!$G&MBjI=!vdM63X<Z4x{8ytgYtKhv
z`CkC;;^$IKoJ7Z&b6}&VxR-7DOC_(EI1(X*d*FWaYTg6=&C7fMQq9YJ0F(8ujowCd
h^U>yD6Atabp<Ot1BqZS7Bf!KT5eWA#X+m{a-(RDLCEWl3

literal 0
HcmV?d00001

diff --git a/Product_MicroService_Group3/app/controllers/__pycache__/loginController.cpython-311.pyc b/Product_MicroService_Group3/app/controllers/__pycache__/loginController.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..0ae33a0fab843db2a609b147bf8a5d6eaea25f24
GIT binary patch
literal 3422
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

literal 0
HcmV?d00001

diff --git a/Product_MicroService_Group3/app/controllers/__pycache__/logoutController.cpython-311.pyc b/Product_MicroService_Group3/app/controllers/__pycache__/logoutController.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..fef5e24b0dc447c671daa0656ba2d91c90e66b0a
GIT binary patch
literal 1096
zcmb7C%WD%s7@tY9k38B+Us4sj(iWOSAK(i_3ff{7wJoF%2n$QPGfB4H-H9{1#T1nw
zf*yM4tvU8ok$Uhik*)Ml_EeA_yhVyodU9sd1bg&j_nY5*Gv7DA?>F<gqay{l>EF-r
z83f>`n6xZ$0ZwZi>;ME1w1ETj(23<^PCOrX68VH9<t0bX%Mio>hA4)Wy%+%d{BK%b
z#p-UdHT!o&ag->*uhQlHNd5r!__qD_)_e*nIgnL<iAYuslaFm5SE%KBp|Zw^YZa@Z
zLh&mfGcQbtNT@K(n8krgF|sH&y->DEiTK{8GSLKKVqreFn1!L@V6RLNGusDpAX<;}
z|8$$X9pG_kTDI242<~yb-=4n(ZvY+hTC(wkHBlon6kCrZp#zs{wf7>3z-1vI5CT~+
z2ats1i%}6{R-FqKpJ8fPh>GhIJup@%;mz(Bq@?jSHRhWpj}?78lrW`)h6&fV?al5b
zo~OCQ)3^*Jj5N#5N>mX=;w9`+Ng%l?Nf@t?N*2-%9%G_Q?fl#H16@>LdcmohWqsbo
zGt}C^`V29B2fH5A7x*f13%0)G@&(E)ud0!vmh&maRehTHlwoa!&~^P0+9<dt=P+F^
z*fw@cm~lGV3SQL~u~~Krr)Xgo9ca9?OiFT?ZdfKZW-0M2xAj7$qMO9^DB<axQ}br0
z+mZ1~m5QeqIazdJa90C=WYE>WwO-F2bPgYO4%cRnmCgo8Ns}k(?yaf%@{jaTkRCe8
z^lUw^CwK20WJV7&qd{i$sPATQ>u%6{FUZ_)$e`~=y%_Y21euZJD_4VS<3ZO%piZ3f
zBfwlX9ZE&Jz}BgF0#w{{q%9RRBE6}~QK%Y*TX3*pgvlm*W3>`Wygd&`tiJ%-Co+1u
zJ69h%1o<|eqSyIU+z5NeT_X-5JOWRG|M@uoj{Z;2w#)U`&Hif1W0?9l_<nGEV0U@<
eX>ITTjvd0WMywM~HUM|O;~+MEDH4Svet!WT`XG-0

literal 0
HcmV?d00001

diff --git a/Product_MicroService_Group3/app/controllers/__pycache__/productHomeController.cpython-311.pyc b/Product_MicroService_Group3/app/controllers/__pycache__/productHomeController.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..28e57e844880d4812c306d2a88329e736f9193a6
GIT binary patch
literal 1308
zcma)5&2QX96rb_O+96F$6L2a($_7<PhJG9ng;o_3?25vHw$ipLT3NCj&t%t$?OA5*
zNQ)APP!BmEQE|y0IOG&S;m~9MjNNJ_qPap3+=8N9dO*B!cDGGVJdNMX{C;oV%=_>!
zGc&Iskni{ZrEls8{i!x%F-D7{ZCLCef(TAfikmpqnp&zi_0(t@so6BK;<TiaT1^Wh
z4N**VYVT<X?ZbB>%_%yyTi!KB#xpU9*}}h9PTLdfA=(3z{jnKpP7}L<ys5tx;+b;l
z)1;ss9%s3<Rt3xAm9Dfn{kotcmxe;5C8!WF%RDUI7R`eWXQYVoV7VIz8s)%9qs>zK
z&CJyibyaPparaK+9vre#nztDd(c}@ZFyVt#p`*V*?VudPG?LZHn&3TH?@#udC?BU2
zY**F!Qi!%zrig!$E59RIo!FjE!6x3oyAz*dYc&)7%zauu{es`n&aiqu^Af9XAY%M{
z#-@RYNh&dhlv}r@RS3$1m~d4>IUR*LZ86>j#M7ibN}k}BVol09<I>2AB=M{hOo#My
z6``!0<W$<KAgW5-2AHdeJ%g)fNrQxW$Y&MofD($Uf;@jxyW!u5hX_ARyHVS}lhHbl
z*QsA;QIXOt7yeyfSr#V#{R{{$;=EgBE7eB9Iqmv2R&YV94;WwbKOyU37Ew~IwZkN#
zS&NEloK+vt<?1~ewKJBmR!qU;sA;~8BhDI>ug4J$ZgEz0-uJ^!$B$T+a|RyZS))XJ
z4oy^>z*jn5>5Q0h-|+>ANd+znP+RD@f*kjUwVpSay*Qk`xOEEv+j;nH&wXkw_N~Qd
zjyrS~2hP&aS=u%Z+&6aGKec<C1NZXKy}Uhrd=9<#?yv6+=C2LsuWj4MHhOho_p2u#
z_7`d}22OqG)cbb*u!7EC=)Kc-miqS65nPOJd*`INl7wQ7tDY>&P}Yf8)V8eWT*?Sd
z#FdwVD{Ch0Ajra$2EmK))bA54cccmV$!QtoZ-`$|zFbhx?VI4NNa)9W5w@z8#gCv4
zb&T-=y4nAK;{bioKRqC_`L`Z<z0Y<(8q8f9&RyDa0MgF?f!(Lree~U9_p#l_?f_pO
Y;_HXn>-g<M1nM6hX*W(GC0suEKX<E6Q~&?~

literal 0
HcmV?d00001

diff --git a/Product_MicroService_Group3/app/controllers/__pycache__/signupController.cpython-311.pyc b/Product_MicroService_Group3/app/controllers/__pycache__/signupController.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..d6315f975befa50cae416644dbce66638592358c
GIT binary patch
literal 2617
zcma)7&2JM&6rZ)%>s_xMJ0#90*iN9u20_(OXiE4{Nz?`;0#cwL*Q&MgPU210yYB27
z2y!Z`Lakd>Dnv-}frHgUN}E>Y*kk_$8|}dwsZykh12<QQ9yoPojUC%jTE^?Q@4flW
z%zMxCe*V$t^8hkt&-??^JOF=DqdC~u%8MU}vH@fuGb+e1aVF!4J2K9=GsDJNhWZ_<
zE5pS(TX(ANxSRN#Dj(<Vw-6T`05UQQJ(~^yw#c_J;vy8w-lo<5mR&Np#Qfs!#LN6W
zut{KBEoj^)3->_0M|RGGnCCh5$5<>}P;)Sg6wSo$Wkc7L#Z~M^@berrOw3YGjKRDH
zZzppGM01!klqD^fz3YCbp<wpvmHBG~<IX@ct;<HLbs$k_!JOp#;wnjG1DI`d%S_Xd
znH4+D`wZG=w!8o=x03HnWDVp&neMu4$c|02eyg>|8nY+T*@blMiDbKw&OMQ?E+o4r
zlIudc_C&h7ken&(q@C~H$DMb}{BR4f#uHm;vjt*%+H6mrDZ5(mHl?%TvbbW`8=cED
zc}L!vXY;N+m*?|B-XnV-32UP1+gZHqZt8ilD|)Zl+nfVn*R0R%Yn%0TuAK+6Pwr6|
z`|YRiSYQs(Vqh1{NQ#O*iwZK#q$Xt`7F4OJ@~WPaOhwl)w*)mABFtwc!?>*@8MA50
zNMqKJR1<p?6CxXEU=R}!Z8k*HLOoRYsR&R(Q$YKupy8r^BIxZm3~3484cf6pQj(_W
zW@G_IU?yv>VphwkYRrRZu`$<Z70fR|Gf7(vJBfw|NO&{?m~6(Ew8L{5CQ`D9qf1?K
zE|WD7tuUgT6YIgOESb`OM~eecOX)I{TRV5hFVOBz(w%S*jmYlyhRx-&#19Qxg-FME
z^<?^V;yPJqB&5u0DxJ8Z!5O67f{7VDmCHcQG!j?ItgcCF;<`pAkfE5X5q&W-pF;?)
zCZ_cqGGOF}j#d&M%C{sf1?9+eT2fW0EkPrqXptLmA#x3-(weU7OA0jX1Cy7P6w>D*
zx}~IG@?)guvL_N!Hk(N4nu&C>oW#^1sOgsHcy<*L-Uhay7sq&yFhv2p<N)u#_eE*o
zsXJVChlv>&wEW?!f6Vfa71>&#e}iA=OM}(Gm=zc+x@y7UjhpK?OKLTE)CwLgdTRYc
z8?)=PrBAE<F{?jT6l#5g8<XpkrAyVm!&cwnB46tbZVastm7>+&gI4dsBDV|i=jgjn
zqSetUYjmo@57qqPGH3Y@lhb#!;9F(Y3Z5u>w#C5rQ{PT~bN0Klr3+8RP(=*Yc`y>L
zg`%|sZ`bx8s*Oab9NJHxP_*9X8SbeAB8nGZj)2hkqxfT?dSJpjFj1T%=?;WSN;Md@
zg3;nf&-zA6ryiVtc)sEtuX7+6szlze^i5X0liS{4iK~d=3LAbwiU(3Hnk5FkoHo&0
zL?J}qHrGz{oh`k_$c{CK*+xLiEn1f;%{Kp4$(}o-lbR?YZ4%s83%llgGg6~O_D1B#
zKBE7auDR#5`<3!n4C!DaElr#}6?5)TfZb6s4!aGQLeMm@XzD9aOD?RE-ob9#$*Qt|
z#q7e0yf~3eXQUM78f}T4X?Q2bHi)IgDfWg2O^Y@iI!F{W+7urU#gK?7fM?=9OAM7z
zRUEg(@xsh@?_lB5Yv-NEL%)T84p(ERt=Q?`XZ|=+6)#)j<-!cPFXT#+YyH6U&{G?T
zyuRers=HY)R|gH@;?N;-O3aU4i-b~F5dDE{=CP@)K}x<1;TF|6-e|Z6IUS+6C=rBX
zX{vnECgx-k3k_IuA&Xt4aS7?#O-WPx3D~FExxV7hkZp4+Jcmw_DSDxdUx}zY8HTBW
z6P5paYGAz5`P4v9!Tz)<V!{59%U!&9KV7<0^+qjkv><FVp0C4ShVKuTKPk@^!d2#&
e#T=_Ujxv!tAmVQ)a2#)WK4W|gDcNper}Hm<#!-v_

literal 0
HcmV?d00001

diff --git a/Product_MicroService_Group3/app/controllers/__pycache__/updateProfileController.cpython-311.pyc b/Product_MicroService_Group3/app/controllers/__pycache__/updateProfileController.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..99f644e6d21227d53f1b3576205412c1a32bf653
GIT binary patch
literal 1792
zcma)6&1)M+6rYu}Uy?1ymK002Wfa>=DwNnJB`K5;XzeC;p^m{x9E3n9+L5&OeyFo6
zV+R>>=s|~2ilJD9Ky-3l+<W^+lvW!Sy3ENCa_CLPq?DXGvx?M8#n8v@n>X`*^WMC-
zzuE7Ghy8%ax4-@cXIKDU(@9r+?~SuMF%E$QBt`)$lVMa(#-n;OUe%ZJsceR2sL!Kt
zDxcvQ-~o`4yihpu0B}Oyj$}kAHr-s^mF_6{B(}u-!1d!L{wr`qASYcI$OI%|1Ej>?
z=}L;l;-^X#R*<ZjnBOvVO)l<X9>FiG&@i!&u3+APh9T=(iot<uMar8nS2ZBQTxarx
zU+5Uvw|;NqK0)y+G|ReV6na^S!IRfZ-m_mA+6R;9u59&ei8&(nNpHRnY5@Igc6&%R
zY|$95NS<xCFX$(e^t>xuJ#2s7`%H~#_TqNYbd<aUIX&kheFI4Exkz>Z={pz64ItTb
zk^BIXtAU!Q=B@c^Y>ktI7u-H?2L7pRi|g98!JUFR()9uGAFpVR{>v-YKtHE8fFw$O
znQ_Me9aBSVn5UG;$r7UM#4J?vvV#3Z85w3y%c~HJO1^6fieAW@gi)9)K}~`v#i3!c
z4F##9M?)8=qQ^jEM3Hz1=?MF@s-ip@dq7epG~G-ndZ`4Zgsi1RMEQliC1@hb2F!Ih
zhy}8eqclde9hjA>YQ;bTu@PlT%I{{zK0@pK`T0e+I*P$T8qB=_Id_jpq8PO3L{HxR
zxb$(B9@5C>)xAPFdryPQNZx_jWxY^Up=KJ{b>h{vypnyO5eG74b1$J66B|{8;9hn~
zuOb5`Hg&X}{Y2WyYXwr~QaP_EP%A-$RGip^j}!M{p{(ho3o<m^gt;%|0@61i+K~$|
zcNgi^%7@u}rIIb^nu&C>ot&w2Ti20ZlohztbIe!vaPa;8u5_FzPU@nKHU1>(DR|3)
zk&Dl^8!0O|X9wq=-aX}mZ7{<wz6p#yyWM#BDlpp$%o0?1(hkj9p`;y3)|Z`d^l;^1
zrLk#+lXf^+|ICTSUq+utn^&#af*o6^f9^!5UJB2J=A;$9W=F5pSDo?6!`*}3rr#P*
z+vDl_iW7+)K00{RC|i*$cH~O^PTLRSb53m9nf}0uUv{SEoQXtxn2(Y35LI7&8wS%e
zFEYoX6~AuBuh-YesV-h>#;i!%j-=~%-h?I^H=7?>p|l-Jw}#Sf4n(FJ#a1ZU8cLpC
z7;jC?w?-CP!onG;9IT~=Fk2)H-bVEQ<5I`vnaipU_rj_!LB*KwYp=^REacofkjvrG
z{s!kBS1?Pyk_p{be-F?!4L?QHJK+`ySXJO{lq6I7>oUG3s_kVM#sRll|L<|Y)mHyQ
zE1mvkwNY;FTH!@Iyx0Pxr_9)IO!O5KZN!cr9<Q{RsKwl{nHz1-WoEGri2B0|JU9DR
J+-3K?e*@r-wwV9`

literal 0
HcmV?d00001

diff --git a/Product_MicroService_Group3/app/controllers/addReviewController.py b/Product_MicroService_Group3/app/controllers/addReviewController.py
new file mode 100644
index 00000000..1a2b5d35
--- /dev/null
+++ b/Product_MicroService_Group3/app/controllers/addReviewController.py
@@ -0,0 +1,98 @@
+from flask import Blueprint, jsonify, request, json, session
+from models.addReview import add_user_review
+
+import requests
+
+
+add_review_bp = Blueprint("addReview",__name__)
+
+
+@add_review_bp.route("/product/<int:productID>/addReview", methods=["GET"])
+def get_username_from_user_microservice(productID):
+
+    user_id = session.get("user_id")
+
+    if user_id:
+        if request.method == 'GET':
+
+
+            product_id = productID
+
+            response = requests.post('http://localhost:5000/user/getUsername', json={'id': user_id})
+            if response.status_code == 200:
+                username = response.json()['username']
+                userID = user_id
+                session['username'] = username
+                session['productID'] = product_id
+
+
+                rating_info = {
+                    "UserID" : userID,
+                    "ProductID" : product_id,
+                    "Username" : username
+                }
+
+                return rating_info
+            else:
+                return {"Error" : "Failed to retrieve username"}
+            
+            #return "You can review the product with ID: {}".format(product_id)
+        
+        else:
+            return {"error" : "null"}
+        
+    else:
+        return {"error" : "You need to be logged in to add a review"}
+    
+
+
+
+@add_review_bp.route("/product/<int:productID>/addReview", methods=["POST"])
+def add_review(productID):
+
+    user_id = session.get("user_id")
+
+    if user_id:
+        if request.method == 'POST':
+
+            data = request.get_json()
+            review = data.get("review")
+            rating = data.get("rating")
+            product_id = productID
+            username = session.get('username')
+            product_id = session.get('productID')
+
+            if review.strip() != "":
+
+                if username is None:
+                    return {"error": "Username is not available"}
+
+                # Check if product_id is available
+                if product_id is None:
+                    return {"error": "Product ID is not available"}
+
+                if isinstance(rating, int) and 1 <= rating <= 5:
+
+                    review_info = {
+                        "UserID" : user_id,
+                        "ProductID" : product_id,
+                        "Review" : review,
+                        "Rating" : rating,
+                        "Username" : username
+                    }
+
+                    user_review_message = add_user_review(review_info)
+                    return user_review_message
+                
+                else:
+                    return {"error" : "Rating must be an integer between 1 and 5"}
+                
+            else:
+                return {"error" : "Review cannot be empty"}
+            
+        
+        else:
+            return {"error" : "null"}
+        
+    else:
+        return {"error" : "You need to be logged in to add a review"}
\ No newline at end of file
diff --git a/Product_MicroService_Group3/app/controllers/getProductController.py b/Product_MicroService_Group3/app/controllers/getProductController.py
new file mode 100644
index 00000000..88c9f2c6
--- /dev/null
+++ b/Product_MicroService_Group3/app/controllers/getProductController.py
@@ -0,0 +1,30 @@
+from flask import Blueprint, jsonify, request, json, session
+from models.getProduct import get_product
+
+
+display_product_bp = Blueprint("product",__name__)
+
+
+@display_product_bp.route("/product/<int:productID>", methods=["GET"])
+def display_product(productID):
+
+    user_id = session.get("user_id")
+
+
+    if request.method == 'GET':
+
+
+        product_id = productID
+            
+
+        # Convert to JSON
+        #json_user_data = json.dumps(user_data)
+
+        product, images, reviews = get_product(product_id) #Send user info to database
+        customers = [review_data["CustomerID"] for review_data in reviews]
+
+
+        return jsonify(customers,{"product" : product, "images" : images, "reviews" : reviews, "session" : user_id})
+    
+    else:
+        return {"error" : "null"}
\ No newline at end of file
diff --git a/Product_MicroService_Group3/app/controllers/productHomeController.py b/Product_MicroService_Group3/app/controllers/productHomeController.py
new file mode 100644
index 00000000..4acfaf5e
--- /dev/null
+++ b/Product_MicroService_Group3/app/controllers/productHomeController.py
@@ -0,0 +1,30 @@
+from flask import Blueprint, jsonify, request, json, session
+from models.productHome import get_product_by_section
+
+
+product_home_bp = Blueprint("home",__name__)
+
+
+@product_home_bp.route("/product/home", methods=["POST"])
+def product_section():
+
+    user_id = session.get("user_id")
+
+
+    if request.method == 'POST':
+
+        data = request.get_json()
+        category_id = data.get("category_id")
+            
+
+        # Convert to JSON
+        #json_user_data = json.dumps(user_data)
+
+        products = get_product_by_section(category_id) #Send user info to database
+        #customers = [review_data["CustomerID"] for review_data in reviews]
+
+
+        return jsonify({"products" : products, "session" : user_id})
+    
+    else:
+        return {"error" : "null"}
\ No newline at end of file
diff --git a/Product_MicroService_Group3/app/index.py b/Product_MicroService_Group3/app/index.py
new file mode 100644
index 00000000..9f0267b5
--- /dev/null
+++ b/Product_MicroService_Group3/app/index.py
@@ -0,0 +1,50 @@
+from flask import Flask, redirect, url_for, request, render_template, make_response, session, abort
+from flask_cors import CORS
+from flask import jsonify
+
+
+from config import DEBUG, SECRET_KEY, PORT
+import os
+import requests
+
+from controllers.getProductController import display_product_bp
+from controllers.addReviewController import add_review_bp
+from controllers.productHomeController import product_home_bp
+
+
+
+
+app = Flask(__name__)
+CORS(app)
+
+
+app.secret_key = SECRET_KEY
+
+
+# Read user microservice URL from environment variable
+USER_MICROSERVICE_URL = os.getenv('USER_MICROSERVICE_URL', 'http://127.0.0.1:5000')
+
+@app.route('/product', methods=['POST'])
+def get_session_id():
+    session_id = session.get('user_id')
+    if session_id:
+        return jsonify({'session_id': session_id})
+    else:
+        return jsonify({'message': 'Session ID not found'})
+
+
+
+@app.route('/')
+def index():
+    return render_template("index.html")
+
+
+
+app.register_blueprint(display_product_bp)
+app.register_blueprint(add_review_bp)
+app.register_blueprint(product_home_bp)
+
+
+
+if __name__ == '__main__':
+    app.run(debug=DEBUG, port=PORT)
\ No newline at end of file
diff --git a/Product_MicroService_Group3/app/models/__init__.py b/Product_MicroService_Group3/app/models/__init__.py
new file mode 100644
index 00000000..d55ce4a0
--- /dev/null
+++ b/Product_MicroService_Group3/app/models/__init__.py
@@ -0,0 +1,15 @@
+from flask import Flask
+from flask_cors import CORS
+
+
+#from app.models import models
+
+app = Flask(__name__)
+CORS(app)
+
+#db = sqlAlchemy
+
+#from app import routes
+
+if __name__ == '__main__':
+    app.run(debug=True)
\ No newline at end of file
diff --git a/Product_MicroService_Group3/app/models/__pycache__/__init__.cpython-311.pyc b/Product_MicroService_Group3/app/models/__pycache__/__init__.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..dfb0366dfbe4ee46a4cd5603bac50bd5dcb0efcf
GIT binary patch
literal 571
zcmZWlF>ezw6n>6<O%o+z429(emMko62qB?Fgoz^3s#0Xhx}IN?Q+#%0=PIQOS5!eq
zm{^%W2!2dJ4AG4+A(lwpI$=XQL_EFc_xXF@v!DI3-EM-n7yaM(!{?u2b8YkrT)gt&
z9Y~NwK~6@51YA?KoQ^1g8X!UTfdG8=@y|w)XDLRTECFPaPHRD9Z({U*>q@?nB>VDT
zpWGTkh;IE?&~`}`JywaEdcb<S&xh5v5P6bmA@)K|;$bm<+O1d7QBc|NlB)R^i_}<W
zSs;9mPI45YqRDJlQCsLwa1qYGeA~Ov_Z?ctlYEg*_^!sj&5n`xO<Lrr=Z-(~RihKd
z_q8urm(3TkIf{pcwYcCtQ&@-bfw5EmNFFCTMH%-diBhP?=;BPr2Y49oVLH)9nQ?}W
z53DI>_qd;h=SHG(T!>6(b0O}|7MI%(JXt7wXm9ul!%w@pU)GcmvVzWX(^qhNx#{aB
z)LSK<KRGpLrlc!iB`b%gjk8ACShs++&QHG4oh98_vHI)5%fXvF<=`vpd}p2IwXZ3#
KTV7$?{^CFEX_?Ld

literal 0
HcmV?d00001

diff --git a/Product_MicroService_Group3/app/models/__pycache__/addReview.cpython-311.pyc b/Product_MicroService_Group3/app/models/__pycache__/addReview.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..9e72c77e0f1e3ecc5183d5731a8b0a948337a6a9
GIT binary patch
literal 2468
zcmcf@OK2NMbXKdC$BI6dTQ|t^XGwgpQq^heKuuz&xVF=nx=OI@hPWbPy*suyUhOKg
zE88-18cGjt2!ui*hf>HXNl6bq=2-G6h4!#E0*i%0p!Cq&7B^sWY2QeZ6*(=Ggmm`J
z+xMF{@4fl#-V6r)2->#t7x~GH(65ZCHO~`bI|0Nsq#%XU&<uNfG%o9z@o<dhH9qT|
z@dEAr49y4%mqKyjcQ!N`=bWbVrlG5I1t9&hq3cApGRmyXJ#o!m&Cq%1+X~=oz*<jf
zZ-C-9^lDq<irn?5v^6<Gd+a<4x5gJe*J~-%4S_21MMxpKD+7*i;Jgi-(7^fX+?;R&
z{NLW4gF_G<%jB8X7#)<VNx>>t^w3u!MkxEUZSRO8N87;rf3i)X6gr5k%EDGXpZC>f
z=s{Fk^IG8=kC4(_^nQiD_S}HF-rlWkB^O+`s#AL-Q~b(4m6JVZVKc0GFM3~QR@E7n
zIjglE&p%`oc;SqK|93{qXoWwEmbruIWz}yP)#iwYlB<j3$<)~7lsKN8IwdNzM&Be^
zQpvJ8tSgg}rRwvh*gKLpEh9_l_-H~rO${Y4Ta2t)CPZ4XONi4Zp}LeMasNld6VqcU
zvG?7CScmvA$Hz>@N1f(fFOIM31>O}e4z77|nzF<+rFpU%t(u6Eq7X$i^Rf(zxxA(o
zR=Y+eOPZBTA`(gsDyllO%Fs#<M@2^%W8&3NquFZjv`$uXa0P+C>Oe!5^Axx}4pv+C
zTE_j9oju0~_NGCdCbB~0yhT7@WV5Q}2(o6Fz~%}D+;23%jD;Lkb<4rj(6m`eUUZtr
zR%DX1R6~yoj#q&sc5g+H(I6WXQFW-6mB|CnT*wnza5!QLpb}Yod~@Vznib1TOWA_F
zkUpi8QK~MH^r#`{vqZPd^l8u<x}>G2bx=@KwF;s!C#Le0l0tgKfE0*$#-NMoVP#3u
zWhlVNf~09gpC=}(#ThayP7!%QH#B2jCE&5T{Fx6`nHniVmsFW#-ls-B*PoVhxpdZ0
zhz1cUN_Eltas?;MmZXwJbzNvX<j@4&d=swBOUU(#LicZN-Cv}?Ot1UPk=Rz`z-HvY
zMx>_{=~?%=nCpz$IQkHWu7)m$?ESsBj(mr|J$~oN_xno6CVo`x)W<*T_PJSGUM!u{
zY@OQXT1mfXANu4E_^1qf{;XiPiv6hhl`S0I#L*2LD`9XPd)N}SJKnLw18zGCw7Q6E
zj+FzgS0^q{e4f0LTu+wwwJ~9LIq=$6pkp)8u@UGh1-k4CxIAcf9>rkfl|dKrLZXg-
z!9hFp_N@zm05))c3HRH$zl>YAaBLIDHgIPNciOnK+_K+pKV*krw{ZiwEzcX!&d$!G
z2ns;pywF!im52uKMC{NYzy=;F;UOCj{Yyj%JN$-?8^HCwKtyf?f`Q0(+`#jDF;BwI
z`E>Zmdp+oGPk3yIzuO-l4fFRpIH2!!dQTv9KO6-5en)(4fPWw``2!!5KNt`gJ;Ve3
z13G--Fdz5P2)J{EIZZMbDf?zS?bSWp$4(`?S~5?5SJ=U1N58Utzd_qTBFcUO9^*k6
ulGn&_+6^rGbebOkf~~=EWfZ(rdCDkiH$oY`WjBJ04{+TsdKS?x@b@>(eNxu|

literal 0
HcmV?d00001

diff --git a/Product_MicroService_Group3/app/models/__pycache__/changePassword.cpython-311.pyc b/Product_MicroService_Group3/app/models/__pycache__/changePassword.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..3e2f696425d98b4acece898d09560e3b644ec81a
GIT binary patch
literal 5555
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

literal 0
HcmV?d00001

diff --git a/Product_MicroService_Group3/app/models/__pycache__/database_connection.cpython-311.pyc b/Product_MicroService_Group3/app/models/__pycache__/database_connection.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..005839d68435047d092e0b3a8b7c4d965cb7ff3d
GIT binary patch
literal 807
zcmZWnzi-n(6h1q@oK&F%fuJy8vCxRZ!bWH%lN4H&meM2yDofGDcO<6HopomyB_vV?
zMs^0o3PMb5{0WRfVu(B;AqKWc**ftqNuh{m`Fr1Y@7}xjPWL{W%^<KV%SZH?hR_cs
zj!mDF$yp$;5kW-r&^{viOSG>Mt&H-qUuw&aGv7FMX}}o#lg9v%rS&1BuaQ_^C-Hua
zBzou#BFUZxnCj_(MlS}Kew*&c1L)z{R6jH8#oqz{_(#LZnVrZewp`rC2RJfz1t*~s
z$Zoc{v1x5vTUM&waas}TUMlTvK3d;feNldR-z-ycNJYO;Uf)w|-AtimRjfN!d408;
zC{#B~%I(&`T_{vUC<99BMa~#?0++MZ4wZ$x9wq$_Ck-b`IkQkc5hdlca%2!3;0Bg7
zGD28lxDCw5Qa<N`M7ena)T+xsxU4A?FrcaI=u`2QU4<NJW7WF-fYFk052;<^PS~a_
zkoGP_Im4b^We^b34LT-&YL-JGXvZ${P)KUlxHzyaa)_BjiCJu6&!enKrRg%WMjK{@
zIxWUM-gGHcoZVY}+jRt2x8pjreoyewziDINx7(ahPuj;*)&CA~!|z0yxvZ0hScE~;
zFwzGYpzqo9gS(@}rNPE%@v?&4U}GFdOI!Nq<QOSG!!OGx)$j@aN4ETva>j@8b3Yey
zuhxbauYFxu`L?h!jIT`KOqAC}3f#1l4@jI={1m{EaT~@6J-Q~&fK-o2UIiG(G))_!
R>|pwhjkI=sjQ)pdq2E8S<Rt(A

literal 0
HcmV?d00001

diff --git a/Product_MicroService_Group3/app/models/__pycache__/deleteProfile.cpython-311.pyc b/Product_MicroService_Group3/app/models/__pycache__/deleteProfile.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..11cd5e31a86ac49992cc243db920bc089e02298a
GIT binary patch
literal 2913
zcmcguTWcFf6rPo|(nywN%a;UOcDzZP5+%N%hCnWEg0U4RG_lh-A;cAk_3kL%c(tp}
zu3}5bA(TF-A&|5fQW^?=N?r2O{)Lju>&gf$77B*ahrS6yz~rfCWZAOi1d2;Knw>qj
zIp;fPF4~_P8+`~`a&?{j=tk&I#%wl6m3Y$!#1kYVnNv}co8mY|J5<M%1Kv*6nRHFL
zK<4@eP4Tj05{3D{+0-y+d+r#zrX(`sK>H+J(}-lo<!Onlx@IpP9w$6+&be3^FEY1j
zpMl~zJR5C+%W+HFw3~8->g*gj0Nb&pUT^~M*v7kL=K`N|EN!N^Wyy#fpL0C}&GRiS
zhrpI$+|}yhx^r&o&ADaQwpbo5BJ;9a;c^bz27VyR-EF5Ih{w@($n{^@PNGR9dlv8q
z^T9b!eLgZ?@P5$VyW1YHuyxwi>T%0n+4pfXJ&a6$4aObMCf$puxZpE`n><2tL(caU
z{p5HCJLdV;u3@!Z^46?s)UI53*{^Vt;}&f91>Zg2M_s>4ggMS^tKoT1MvebDqrm^2
z(Hxq0-a>QSVK_q{XaCQk%^2aPahoSeQBiGA+8{Kp$l1tb^m26Mx^M&dOQS-9>PbPK
z)(03LH^pg{2sbZAuSKf{p9$wFJNGsprBtWc0J9S`-4qgfT9dO!N5S3osBq!h#FdJl
z;j}q(NlWPUUb4sQEk6)ZfRMH)Nen~0O|o6Xk_3TF!AMII$P#H)%?L74iAm&a=covf
zMS}>0p%WCXsyZWN13Puu-WwX3Pr-#t<f^qUNofk)_F2vKR^bN9ZXMeVwuVk^51A)Y
z+9Wnk5L24bHDdFUsv86>^kh;oZFef8!<|lXrEDpxXr_&+uBy|bG;4dK^Abs!imrtl
zY?lo9xBdx0M%mvFb+dt;WILe9acPD~v+=Legl24<X3IqNIor*sOQUxCMlIqZ)LntP
zR}F(zam9XPE=P<8@F~>VyXBEHF}4gwOiX5^nb?FzMyYa_#71=~og|uR#IAx?*F-gT
zLjwgh6f+~}31Ko#Daph}bf^mK7@f|>hUL4WCP6(%W<*sb+HGR6(%vM~!gV6eXu7K3
zR)|pv7{8)ORG%dDt|F267}e9M6EQKBiY0XbZp1dwU!{6NQOQ6mW4kvbv<os|g*ASI
zU3njsT@k+LulAnrVvDi7uM`Ze1`n+S4;6yF#b9sVz1H0J_~v3`o-eiRdz@Ju%zMgi
z)Om%=2TC~bDDWWg_}<c70S^}OpoIrZtsPI!e}BHv+FNYx&EvI()-rN>2TSeUKZuK8
z<}c(gthI%#?tZIvpge^9EoH=cLnVL9qstF2e>?tgJU?D)XlKHnl7HW-ziY+cRq!7u
z`VUx@UUq_}d=?#?;4Iu-1z_#(TTT@4$s#^!;ge;Iy2nA=v86q_{7C^via287NZF6P
zt*f|W1$Pv1sE9)r4y`qJSY2nVrnBYFJtA6v8-ke+hagwJuQvRF8?C^=as&qGwHo1;
zRUBHup#ttM;%=5m^M0%InALRL!aI7od9Q%h*Vo?$ksnIw<Oga)1<|Qrzpw(QpcnAz
zB0g>5)1~(#>a&{qExe<{+V5@A0ML3l2w*CNfA3z53D~+{5BH4*(eGWu9(cV7HjN!~
zz7WFEA?Hgk2lPvyYpfr=9BKsml{Y+g#QEw|CVzE;$zLDgfqs3=$>{#Ui(SsJ+vXFh
zXv|XfMMj%ousb)7(Ez(%*!38%ervKDhTUeBWAqDp10<p$7~bI_n37h>IeHLS_H|%<
k4g>62j$1<=*3Mo+jrS|R5{g(mdl{eLddg_`Kn3vk4=g0DJ^%m!

literal 0
HcmV?d00001

diff --git a/Product_MicroService_Group3/app/models/__pycache__/getProduct.cpython-311.pyc b/Product_MicroService_Group3/app/models/__pycache__/getProduct.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..a9147d61c3c536e412c3a60130eaf89b7d9581a8
GIT binary patch
literal 3518
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

literal 0
HcmV?d00001

diff --git a/Product_MicroService_Group3/app/models/__pycache__/login.cpython-311.pyc b/Product_MicroService_Group3/app/models/__pycache__/login.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..54f0eb17fc5e099f4eaf6dcc17f1775c07a610e1
GIT binary patch
literal 4431
zcmeHL-D?|H7QZv2k;b+p+p_G~No-FO?@}kJyh&)5wzi8u<gUA^QmSS{Q!QpPa~&%k
z&8T-q{z5LH<UtLABoIiT1pJgu$Um^piPLAP2r32wW|w`~mqkk`8~oIBMv`U4-Xbqu
zXrWhk&YXMhnS0JX_v8G~Ujl(v0_EQ)|3m-gBjoScs1?4-yf_8SU7`_<)5%4A^E#K}
zFY+Anf-a;y7d^mxu91tPCIa<pT$~Jh|A_;{hB?P~#WIcL{0gwGs%aQhwdb@;Dpxgt
zFE2a-JTC@--X$%>-qHI2Iv&GQDQjGoTi?-JlN0ia9<On0LY7~zO{A^}Tvo`E2hj6)
zyO$%Ni$3fsuZ-)__-mkh#Zyz9e$}#Qx7GRxu>*BJD`q{7Rv*Aj9&gWP&71XRc@_pw
zU^#Y|Mo++Fj&(ycn$nGvI5|q}j{2xqT59|dVSiln+1<4^frZWbz9#qiM*leS2`u`W
z?+f2Pz3ge$OAWlNJZNQ!vwP}3?ct^8=i%iNSr$GaOWaY|7yqBtTOu_Z!(wdpL_B&n
zI`y%9OrH7Z+y}CD$&8%0D4VmDOFEU87AT`~G^HeUc}#w{;h^EB?SkjU0Fb-nGRcxZ
zx8jk~NZ)p(Z}T_W;^Yy>@NhgLk9dcV{Lb;Jrk+U|77Ar~YklhN1RAvxN@_)2NSrh1
zG)peh#I&hqQq-`m#D~yp8j7AcZ$JmLlJ<&h&dc!(V{|1kWoDQ~<qIbJEHR-iDuzlm
zd1^t?b!uFumYg)?3-prwF;y1~Q#UUsspT4+`yi<@GfvrJQl)e6F*B1solw&0M9S2t
zZY5CFh@@AxT1WMyWvgZ?J-#|HPi=K!E&~onMs-tFbZZ=#T0e%wIt=70$%n=(b-m}-
znR~C@d23tn0{Y3;z_bEkR={)0n90!1`q*#FTd$ut=yDqFIG9aE!&KD_gVrmW!+wUV
z0da*mn9T9fWvXUu>PYT*ra_%Hjan*8rtPF@I36vj+K#ZAOgo~gn-+Dv=@k<$Qb&xU
zCytnANyBzpqRT3EKY1iMBE@a6eec3JtP_ojpJymraRg>AIlk(`IxQHUISuCLaMY4O
zPp%f`$B$a;6J<jnz<bB~7u;S~N!imc4*sKi@OI)(BG+2#JoH`Xk#9SX6gr2BokKbA
zX2*C=EJ?we!Rx_WnR~P#4Hc!Kyfm~K4Bs@bn}y(DF*ukLHr?PqJX1VA24OFR#*3lx
zobP$K_kP#C3+rm3?^v<#SRs787(SkBDNCfIuiQiYp)%oG4wd|&n`f_|{VH}NmW!3z
zx=}b-^7nk_Km4u#aKS%N^bh3SS{9(^<@X2R%NwI*!i(WLc`gO=!BY=E2LiPqoi0kJ
z^U~>3dsoiJUpcscdtlWy>3Z}M%J=QW5B}{oJo?wpd~g(MK^iMcV|i(;ZrJ-17%sPi
zP4uALy8qECVSD+~8ijTLa$;=q4f5oT_UJ+3$!KVr7oG+^(SEYQ2SBpX9*TAg8?T|{
zS+@w1X9or3`$uN{Lc@*Zg~8m^f9)5L`m>&^CpBIZl3ewo#}mA({FgM{lrE-e#8Ln-
z#M;1n0E``=!fvnW0jy~rU^L}T6<{=_yH9{2HkG=YvJ74#z-UT$p8&)A^YF5k{I>x{
zQ*+(V>g@m+zS!#HD!{N$MqC_mLIw`A{p>Wbry{d9WeR2`%WZzBSk{usv_B};LW3Z#
z==Po%MX_K+c{Ub{ek8wtZZ_s(n2C(NFl)@4GWMR5&&BFi0my*aiU&IZ4&WQdm!g)X
zT&Anx3g*#FKo5p#%XAs@`!>3UV}fC868<pEZVZzkL!4ZNJ#Hdoc=}e4RI*{ZI`_R`
z#Tb5Ag%v%MdAF|r>DJ;s<<3f_1(XHR1|DLD;JgY8+%(NXC`E_a0VH80h|(FtV%CcU
zVH-P$<PZ|Hwnyp?Hag2*2elKZ`VPQ3Oy5U-EPa<fr1J|tCvG;8!P|nlcS_;@ynH6#
z_51Q~|Hm{_{tY=W#X)o)E*3{7;9cmMEcQ(1-h1AA_<nr-z{8`3{z$PuQs^Bi_KxIc
z0Skotf5ien0(y3Vke>z%Ou{Dma-wTWCQpPBpikxYnSk(gBsBe|u)%p|I>^SG0gyc7
zLo<@_ER2$GBoQRv1O((eMrPg>hJEg4cEovIu|8vn2b_ZyJRd<kig<gj`riR!SUkrr
z1a&uZ<&?U|2yyC`Gzy<)bUMzCLle)x^(hd*FC4c?0$1H%iS*?gYl)o9H`cOukQ*$M
PZSp=hgzeqLJ;Of$v-#2z

literal 0
HcmV?d00001

diff --git a/Product_MicroService_Group3/app/models/__pycache__/models.cpython-311.pyc b/Product_MicroService_Group3/app/models/__pycache__/models.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..0c5497a917a5f33bfe0edde28b561ef47b6a7caf
GIT binary patch
literal 4492
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

literal 0
HcmV?d00001

diff --git a/Product_MicroService_Group3/app/models/__pycache__/productHome.cpython-311.pyc b/Product_MicroService_Group3/app/models/__pycache__/productHome.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..491496f7b159eb7864c8ba8eaaddc449f296add3
GIT binary patch
literal 3362
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
VD~Ecr)mPp$#xO_osCKVv{2TD}R!sl^

literal 0
HcmV?d00001

diff --git a/Product_MicroService_Group3/app/models/__pycache__/signup.cpython-311.pyc b/Product_MicroService_Group3/app/models/__pycache__/signup.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..94a888ae05aa3787387431d65168edf553a0a2cf
GIT binary patch
literal 3576
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
JFQ6f?_a7koS7`tM

literal 0
HcmV?d00001

diff --git a/Product_MicroService_Group3/app/models/__pycache__/updateProfile.cpython-311.pyc b/Product_MicroService_Group3/app/models/__pycache__/updateProfile.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..e15076a9dadaac885919dee4330bc1ada1af79da
GIT binary patch
literal 2586
zcmcf@OKcNIbavP4jEz5WN`T;ewtT7@LQq8x6(vCwCjm80113s|ELoe~aagk6b!XQ}
z961P8J){VURzl)XRYE;bDlQy3w*0Q$M3!Q$R0*l-p|`ClQpBlm?8J!^Dpeplo_+Iv
z^L{(?yg!D+K?LKMUsp*|MCf-$tPg$-dEO1kEu<oq(@~C_;5df!IzPd~D(FJaH{k=G
z?<+JRs(cD1#6Q{A1m`wgwoF6I7DoUNDyCr&#m=ac3b$sOEdh80c%IJyyalAaNqPqa
z_u#3G1+K*1-XvY;BeX@2FF~+vb@76r@(aEae|tTpx`ZJmA7~33+S@2!gG_9o{F^8t
z>%RjY?$y0;2;ybAZ5xg8Lh+hZtZ^lt?u00P+th)vbw`P#tzi8>>84N$?MHU?Ro84^
z_OJUmfT+A6+R=3yAvI7EzeC^icc9Yu>ea61f;Y4_u&t4)L3M}5Df~q^CJW*f@oi>R
z^DxWVEgSK?BBRh7XB7UwGnz$n!bLR8?MH8`ezR!ZM<O!fHWe&FGnzX8!`Nu@)P(^_
zoiuyK7|)g`brO_dqy{cjSB5i@A?HY+bh5k79Mq^~XGXTNhviptO+~gf(`c|TL=2Ts
zU{!67pBXqmP`A!po=t+x4Q8v3n145*GwW3p>uV-m|5VkE+ms`gB~Ow0_EBnPHJwO>
zyeiv7m8^oIfGk_k_2PV2Qid#Li%5i0lS-Pgrk7z=IWD>40OQX`8ujKAV+NVaLsJ8T
zwVkG-6ev(zEzCD>RZRpbyS%O+HdrQgo5&nd3N`_TnagRmD=NBa0huqF&@yR=DT{fk
z8Mce5sq2%nGVKNi<`j}=WlZ>8AEYMN8!hl?7&cLM*WFkx@oGYuFA9VfU5;2x#NMVP
zy}Wz+c$!t%O3S&Taw+|pL6TIPA?c*46mrC{t@J2JO+(hxV+IJQrP)Qv%u1;OrKFfX
zZ9*bM8aL^5`jk2&8w%9n^d(u>i7`biR+4ctDP17SCBxLsDUDcFhnY_`g_<csXEcRm
zhNxM{A4|*md^%^UM7Pqlz}MbiPrm5x*pv$03mLGsWQ{`Gy^1{FA+hU^)~;{UH`9y3
zN-Vw-+qWFsw-h^2jvZL^KWo|bP4VW@#U{^>J6avw=Ium*=#9v=h_n0syS?{A<->gs
z?4O6rC(k*lap!ZToKl_aWoNoj&dxY<B@dx1+#vrqLPc(f2kI<8%9g|D_`l$<>^zeI
z1P+531>RY~ZOgcA3CGJg?%?>d<~FDOxD)-z>qMaz4{?EbCDd|b_}cK-BiBb3M=Cp7
z8MCVr+O-mDUk<e|g*wZjPNzCO0VJz0;;{4j2@eTk_XhY4hn>i=`y2q6OSrd;dmY?c
z!7VE|zKr8bxTB0a9NbZ9-tFu?<U|iUxM6zDuN%<n>gtOa3PIq4*s}qu5%oQI*NODO
zT*Ccj-0$H2e~GBui5_uq!}R=b5Rn&yU?8$pFZB9WtTS-3zC6|U@e%a!NOaIIJUo#|
z?hzgx<N$y4o^LRK9`6YQ{`g>GkQ1In82?F>@t<-c;7|Pm!vjYLKNR4Cidkq@)0BM@
z&=>%BZ|#itu#3z3PiE~SiQQe+9jeFsC-fXpMA@gtOMC*h6m-&0yMSbW&(<dZ;An8%
eGt}lZ&I$@&t^O+L1E+C%xSQ+p&~`vO!QMYaNoA%0

literal 0
HcmV?d00001

diff --git a/Product_MicroService_Group3/app/models/addReview.py b/Product_MicroService_Group3/app/models/addReview.py
new file mode 100644
index 00000000..8f67372f
--- /dev/null
+++ b/Product_MicroService_Group3/app/models/addReview.py
@@ -0,0 +1,41 @@
+import pyodbc
+from flask import jsonify
+from models.database_connection import connect_db
+
+
+
+def add_user_review(data):
+
+    try: #error handling
+
+        connection = connect_db()
+        cursor = connection.cursor()
+
+        
+        #insert data into reviews and ratings table
+        insert_user_query = '''INSERT INTO dbo.ReviewsAndRatings (CustomerID, ProductID, Review, rating, Username)
+VALUES (?, ?, ?, ?, ?);'''
+        cursor.execute(insert_user_query, (data["UserID"], data["ProductID"], data["Review"], data["Rating"], data["Username"]))
+        
+
+
+        #commit changes to database if no errors
+        connection.commit()
+
+        return {"message" : "Review added successfully"}
+    
+    except pyodbc.Error as e: #more error handling
+        print(f"Database error in add_review: {e}")
+        connection.rollback()
+        return {"Error" : "Database error"}
+    
+    except Exception as e: #more error handling
+        print(f"Unexpected error occured in add_review: {e}")
+        connection.rollback()
+        return {"Error" : "Unexpected error"}
+    
+    finally:
+        if cursor:
+            cursor.close()
+        if connection:
+            connection.close()
\ No newline at end of file
diff --git a/Product_MicroService_Group3/app/models/database_connection.py b/Product_MicroService_Group3/app/models/database_connection.py
new file mode 100644
index 00000000..0986cea0
--- /dev/null
+++ b/Product_MicroService_Group3/app/models/database_connection.py
@@ -0,0 +1,14 @@
+import pyodbc
+
+
+#Connect to database
+def connect_db():
+    
+    server = 'Chiamaka'
+    database = 'Products'
+    username = 'CHIAMAKA\amych'
+    password = ''
+
+    connection_string = f'DRIVER={{SQL Server}};SERVER={server};DATABASE={database};UID={username};PWD={password};Trusted_Connection=yes;'
+    
+    return pyodbc.connect(connection_string)
\ No newline at end of file
diff --git a/Product_MicroService_Group3/app/models/getProduct.py b/Product_MicroService_Group3/app/models/getProduct.py
new file mode 100644
index 00000000..e6625570
--- /dev/null
+++ b/Product_MicroService_Group3/app/models/getProduct.py
@@ -0,0 +1,59 @@
+#from app import db
+import pyodbc
+from flask import jsonify
+from models.database_connection import connect_db
+
+#Function to get user info
+def get_product(data):
+
+    try: #error handling
+
+        connection = connect_db()
+        cursor = connection.cursor()
+
+        product_id = data
+
+        #Get image info from database
+        product_query = "SELECT * FROM dbo.ProductCatalog WHERE ProductID = ?"
+        cursor.execute(product_query, product_id)
+
+        row = cursor.fetchone() #fetch data
+
+        columns = [column[0] for column in cursor.description]
+        product_data = dict(zip(columns, row))
+
+        #Collect image information from database
+        image_query = "SELECT * FROM dbo.ProductImage WHERE ProductID = ?"
+        cursor.execute(image_query, product_id)
+        images = cursor.fetchall()
+
+        image_data = [{"ImageIdentifier": row[0], "ProductID": row[1]} for row in images]
+
+
+        #Get reviews from database
+        reviews_query = "SELECT CustomerID, Username, Review, rating FROM dbo.ReviewsAndRatings WHERE ProductID= ?"
+        cursor.execute(reviews_query, product_id)
+        reviews = cursor.fetchall()
+
+        reviews_data = [{"CustomerID": row[0], "Username": row[1], "Review": row[2], "rating" : row[3]} for row in reviews]
+
+
+
+        #connection.close()
+
+        return (product_data, image_data, reviews_data)
+    
+    except pyodbc.Error as e: #error handling
+        print(f"Database error in get_product: {e}")
+        return None
+    
+    except Exception as e: #error handling
+        print(f"Unexpected error occured in get_product: {e}")
+        return None
+    
+    finally:
+        if cursor:
+            cursor.close()
+        if connection:
+            connection.close()
+    
\ No newline at end of file
diff --git a/Product_MicroService_Group3/app/models/productHome.py b/Product_MicroService_Group3/app/models/productHome.py
new file mode 100644
index 00000000..5370a168
--- /dev/null
+++ b/Product_MicroService_Group3/app/models/productHome.py
@@ -0,0 +1,80 @@
+#from app import db
+import pyodbc
+from flask import jsonify
+from models.database_connection import connect_db
+
+#Function to get user info
+def get_product_by_section(data):
+
+    try: #error handling
+
+        connection = connect_db()
+        cursor = connection.cursor()
+
+        category_id = data
+
+        #Get image info from database
+        product_section_query = """SELECT 
+    t1.ProductID, 
+    t1.ProductName, 
+    t1.ProductDesc, 
+    t1.Price, 
+    t3.ProductCategoryID, 
+    t3.CategoryName, 
+    COALESCE(AVG(t4.Rating), 0) AS AverageRating,
+    t5.ImageIdentifier
+FROM 
+    dbo.ProductCatalog AS t1 
+INNER JOIN 
+    dbo.ProductCategory AS t2 ON t1.ProductID = t2.ProductID  
+INNER JOIN 
+    dbo.Category AS t3 ON t2.ProductCategoryID = t3.ProductCategoryID
+LEFT JOIN 
+    dbo.ReviewsAndRatings AS t4 ON t1.ProductID = t4.ProductID
+LEFT JOIN 
+    dbo.ProductImage AS t5 ON t1.ProductID = t5.ProductID
+WHERE 
+    t3.ProductCategoryID = ?
+GROUP BY 
+    t1.ProductID, 
+    t1.ProductName, 
+    t1.ProductDesc, 
+    t1.Price, 
+    t3.ProductCategoryID, 
+    t3.CategoryName,
+    t5.ImageIdentifier;
+"""
+        
+        cursor.execute(product_section_query, category_id)
+
+        products = cursor.fetchall()#fetch data
+
+        products_data = [{"ProductID": row[0], 
+                          "ProductName": row[1], 
+                          "ProductDesc": row[2], 
+                          "Price" : row[3], 
+                          "ProductCategoryID" : row[4], 
+                          "CategoryName" : row[5], 
+                          "AverageRating" : row[6], 
+                          "ImageName" : row[7]} for row in products]
+
+
+
+        #connection.close()
+
+        return (products_data)
+    
+    except pyodbc.Error as e: #error handling
+        print(f"Database error in get_product_by_section: {e}")
+        return None
+    
+    except Exception as e: #error handling
+        print(f"Unexpected error occured in get_product_by_section: {e}")
+        return None
+    
+    finally:
+        if cursor:
+            cursor.close()
+        if connection:
+            connection.close()
+    
\ No newline at end of file
diff --git a/Product_MicroService_Group3/app/run.py b/Product_MicroService_Group3/app/run.py
new file mode 100644
index 00000000..e69de29b
diff --git a/Product_MicroService_Group3/app/templates/index.html b/Product_MicroService_Group3/app/templates/index.html
new file mode 100644
index 00000000..6207c520
--- /dev/null
+++ b/Product_MicroService_Group3/app/templates/index.html
@@ -0,0 +1,6 @@
+<html>
+    <head></head>
+    <body>
+        <p>HELLO</p>
+    </body>
+</html>
\ No newline at end of file
diff --git a/Product_MicroService_Group3/requirements.txt b/Product_MicroService_Group3/requirements.txt
new file mode 100644
index 00000000..6da6fc6e
--- /dev/null
+++ b/Product_MicroService_Group3/requirements.txt
@@ -0,0 +1,3 @@
+Flask==3.0.0
+gunicorn==21.2.0
+boto3==1.29.0
\ No newline at end of file
-- 
GitLab