From 1948d05d87cc39f3f4f421ce03409a800c9d1dcf Mon Sep 17 00:00:00 2001 From: Matthew Tuckman Date: Fri, 1 Mar 2024 14:24:46 -0500 Subject: [PATCH 1/3] Review comments --- h2/db.mv.db | Bin 53248 -> 32768 bytes pom.xml | 6 +- src/main/java/Controller/Controller.java | 72 ++++++++++-------- src/main/java/DAO/VendorDAO.java | 20 +++++ src/main/java/Model/Vendor.java | 6 +- src/main/java/Service/VendorService.java | 4 +- src/main/java/Util/ConnectionSingleton.java | 4 +- target/classes/Application.class | Bin 1279 -> 1279 bytes target/classes/Util/ConnectionSingleton.class | Bin 1489 -> 1489 bytes 9 files changed, 73 insertions(+), 39 deletions(-) diff --git a/h2/db.mv.db b/h2/db.mv.db index 512981cdbfb2a44ea450e5ad4f8d5a3a58cf6bcf..059717bcead1c908ca99e2de874c96a1057c0187 100644 GIT binary patch delta 1958 zcmb`|O>Epm6ae6{y+2NLEP1Q z70%mldrOunE!OJ|imx?^F37(wfq z<45}uLX+H0#B&@%Co2f)m!rtBkB5duO0aF1Dn%%BJ^KpB4+XbNO_6w->`)U2)8#Y4 z=H#XJ593b@aH0G!!b?0qjDio#r$v+LjM%;(?3AwsKTiw16?5yzwQ$*R5BSQ$UQWLKdwQkcsA5v*hRRN?vDpE&_>WueTE z!x4V>k<)o@2xZ~bOexW?nh(dS>L$^PBh`|qCy@rDm%k0}C^|=i78~Og5=^P1klbT5 zOzyElFzrl?C`6j|RxE=Vwv4eaU9jh@^r?RP=$jWP05!|mb@)(>ghLbo2m*@;=`(bT~<8N{srJ>-+m0~bbnqFP5 zEiZX)&&7M z#CHfJZ$&LeOvgzNsT#vN%t#ZVr=E*r*h7#*4a~=hzMohJlk5>&25y#BV7Q!otu)=9Fr17W6;7c2Y;ss35c#vt^*(z0uqlM_?+j95ujqH)kGUBSSFe&+Qd~f*|mdT%bR;iZ6>7VVp3y; zOPTBW{Ym|lZRLXveDqY|``nHEeWnJs_cuk2#Euz9CMOXmQAtf{u_-MwrNySgkeJdQ zG?hLUm^#LkUQOOASM6+ literal 53248 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 qC$NRL{Of|KImq+dlyN|NjB8;~C`u diff --git a/pom.xml b/pom.xml index 3111293..2944e27 100644 --- a/pom.xml +++ b/pom.xml @@ -11,6 +11,10 @@ 11 11 + + + + 4.13.2 junit junit - 4.13.2 + ${junit.version} diff --git a/src/main/java/Controller/Controller.java b/src/main/java/Controller/Controller.java index 191086a..7f4a05d 100644 --- a/src/main/java/Controller/Controller.java +++ b/src/main/java/Controller/Controller.java @@ -9,6 +9,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import io.javalin.Javalin; +import io.javalin.http.HttpStatus; import java.sql.PreparedStatement; import java.sql.SQLException; @@ -17,12 +18,17 @@ public class Controller { - VendorService vendorService; - ProductService productService; + public static final String VENDOR_ID_QUERY_PARAM = "vendor_id"; + private VendorService vendorService; + private ProductService productService; + private ObjectMapper objectMapper; - public Controller(VendorService vendorService, ProductService productService){ + public Controller(VendorService vendorService, ProductService productService) { this.vendorService = vendorService; this.productService = productService; + // Moving the initialization of object mapper to the constructor makes it get called once, instead of + // once per API request. More efficient code. + objectMapper = new ObjectMapper(); } @@ -32,14 +38,14 @@ public Javalin getAPI() { //VENDORS app.post("vendor", context -> { try { - ObjectMapper om = new ObjectMapper(); - Vendor v = om.readValue(context.body(), Vendor.class); - vendorService.saveVendor(v); - context.status(201); - context.json(v); + Vendor vendor = objectMapper.readValue(context.body(), Vendor.class); + vendorService.saveVendor(vendor); + // Using constants can help with clarity + context.status(HttpStatus.CREATED); + context.json(vendor); } catch (JsonProcessingException e) { context.result(e.getMessage()); - context.status(400); + context.status(HttpStatus.BAD_REQUEST); } }); @@ -49,39 +55,43 @@ public Javalin getAPI() { }); app.get("vendor/{vendor_id}", context -> { - int vendorID = Integer.parseInt(context.pathParam("vendor_id")); - try{ + int vendorID = Integer.parseInt(context.pathParam(VENDOR_ID_QUERY_PARAM)); + try { Vendor v = vendorService.getVendorById(vendorID); context.json(v); - }catch (VendorException e){ + } catch (VendorException e) { context.status(404); context.result(e.getMessage()); } }); app.put("vendor/{vendor_id}", context -> { - ObjectMapper om = new ObjectMapper(); - Vendor v = om.readValue(context.body(), Vendor.class); - int id = Integer.parseInt(context.pathParam("vendor_id")); - try{ + Vendor v = objectMapper.readValue(context.body(), Vendor.class); + int id = Integer.parseInt(context.pathParam(VENDOR_ID_QUERY_PARAM)); + try { vendorService.updateVendor(v, id); context.json(v); - }catch (VendorException e){ + } catch (VendorException e) { context.status(400); context.result(e.getMessage()); } }); - //PRODUCTS + // Separating out logically separate code can help organize and enhance readability + initializeProductEndpoints(app); + + return app; + } + + private void initializeProductEndpoints(Javalin app) { app.post("product", context -> { - ObjectMapper om = new ObjectMapper(); - Product p = om.readValue(context.body(), Product.class); - try{ + Product p = objectMapper.readValue(context.body(), Product.class); + try { productService.saveProduct(p); context.status(201); context.json(p); - }catch(ProductException e){ + } catch (ProductException e) { context.status(400); context.result(e.getMessage()); } @@ -94,10 +104,10 @@ public Javalin getAPI() { app.get("product/{product_id}", context -> { int productID = Integer.parseInt(context.pathParam("product_id")); - try{ + try { Product p = productService.getProductById(productID); context.json(p); - }catch (ProductException e){ + } catch (ProductException e) { context.status(400); context.result(e.getMessage()); } @@ -106,23 +116,22 @@ public Javalin getAPI() { ///RETURNING ALL PRODUCTS app.get("product?soldBy={sold_by}", context -> { int soldBy = Integer.parseInt(context.pathParam("sold_by")); - try{ + try { List p = productService.getProductByVendor(soldBy); context.json(p); - }catch (ProductException e){ + } catch (ProductException e) { context.status(400); context.result(e.getMessage()); } }); app.put("product/{product_id}", context -> { - ObjectMapper om = new ObjectMapper(); - Product p = om.readValue(context.body(), Product.class); + Product p = objectMapper.readValue(context.body(), Product.class); int id = Integer.parseInt(context.pathParam("product_id")); - try{ + try { productService.updateProduct(p, id); context.json(p); - }catch (ProductException e){ + } catch (ProductException e) { context.status(400); context.result(e.getMessage()); } @@ -133,8 +142,5 @@ public Javalin getAPI() { productService.deleteProduct(productID); context.status(200); }); - - - return app; } } diff --git a/src/main/java/DAO/VendorDAO.java b/src/main/java/DAO/VendorDAO.java index 7ead4c6..9b6bf65 100644 --- a/src/main/java/DAO/VendorDAO.java +++ b/src/main/java/DAO/VendorDAO.java @@ -29,6 +29,26 @@ public void insertVendor(Vendor v){ } } + //get vendor from table "Vendor" with a matching name + public List getVendorsByName(String vendorName) { + List vendorList = new ArrayList<>(); + try{ + PreparedStatement ps = conn.prepareStatement("select * from Vendor where vendor_name = ?"); + ps.setString(1, vendorName); + ResultSet resultSet = ps.executeQuery(); + while (resultSet.next()) { + int resultID = resultSet.getInt("vendor_id"); + String resultName = resultSet.getString("vendor_name"); + Vendor v = new Vendor(resultID, resultName); + vendorList.add(v); + } + }catch (SQLException e) { + //add better messaging + e.printStackTrace(); + } + return vendorList; + } + //get all vendors from table "Vendor" public List getVendors(){ List vendorList = new ArrayList<>(); diff --git a/src/main/java/Model/Vendor.java b/src/main/java/Model/Vendor.java index a4a273a..dc3edaa 100644 --- a/src/main/java/Model/Vendor.java +++ b/src/main/java/Model/Vendor.java @@ -3,8 +3,10 @@ import java.util.Objects; public class Vendor { - public int vendorId; - public String vendorName; + // We have getters and setter so that we can control how these fields are accessed. Making them + // private forces consumers to use these methods instead of accessing the fields directly. + private int vendorId; + private String vendorName; public Vendor(){ diff --git a/src/main/java/Service/VendorService.java b/src/main/java/Service/VendorService.java index 5f036d7..8cf0091 100644 --- a/src/main/java/Service/VendorService.java +++ b/src/main/java/Service/VendorService.java @@ -22,7 +22,9 @@ public VendorService() { public void saveVendor(Vendor v) throws VendorException { if (v.getVendorName().isEmpty()) { throw new VendorException("Vendor Name cannot be null"); - } else if (vendorDAO.getVendors().contains(v)){ //update to be only name and not both params + + // More efficient to not pull the whole database and instead pull a small subset as needed. + } else if (!vendorDAO.getVendorsByName(v.getVendorName()).isEmpty()){ //update to be only name and not both params throw new VendorException("Vendor already exists"); } vendorDAO.insertVendor(v); diff --git a/src/main/java/Util/ConnectionSingleton.java b/src/main/java/Util/ConnectionSingleton.java index 1f6bc45..e196f05 100644 --- a/src/main/java/Util/ConnectionSingleton.java +++ b/src/main/java/Util/ConnectionSingleton.java @@ -19,7 +19,7 @@ public class ConnectionSingleton { /** * url will represent our connection string. Since this is an in-memory db, we will represent a file location to store the data */ - private static String url = "jdbc:h2:./h2/db"; + private static String URL = "jdbc:h2:./h2/db"; // SCREAMING_SNAKE_CASE is standard for constants. /** * Default username for connecting to h2 */ @@ -40,7 +40,7 @@ public class ConnectionSingleton { public static Connection getConnection(){ if(connection == null){ try { - connection = DriverManager.getConnection(url, username, password); + connection = DriverManager.getConnection(URL, username, password); resetTestDatabase(); } catch (SQLException e) { e.printStackTrace(); diff --git a/target/classes/Application.class b/target/classes/Application.class index aa154d592e6d97a6c2bf9adac80672bfb3ba8bc2..7c1bbabb06af93a486c37b8720ca591cd384f830 100644 GIT binary patch delta 645 zcmYL{%W@Jy6o$WM21X_jfd~nxxq2BO2^udbiBZhOSVa=cRAEuBkWdyW93sJN^9U|x z<Z3vz&KNNx=;7{{=ZMpoCnW?o4@}2_zC2BY2(ANFhlqWC?W^d z<7%#1b>HW9-yPIz9YtWJ;Wj#}3d2d4Z7vbCutSUx^1k^tPAoY|%Uw>FEyfh1ntRo5?SHCu`e2NRMM4qZtGACEwfazW znAyac(85VY%qeMj=fbtGc~z14hYocw*c8__JE<5Ou>Xzw?6lZ=UsZh6W{O!|I;U82 zylpk^?HMUsFW(Gti`(7@V>WD)CS#EeG0%ec*~mvNa*C1S;bF5;tLipS-+oai%&;hz ztREjrR09(4NS2dP$>`5?QK$XwyAt&_a=l9uLxTeDabL0^4|pgm8vczbp8~eNW0iV@ zE7>lWw|m6&|3#4Cl@8 z0N#kL-~obwcJvw|D4tx_{_dDCq-2 zdfoSep6|Ndp7mEsxNcwrn*t9FJi-NAxolZM&e2*};*FJ1pZrgifZNJ{@b^=27 zW#G8-5RXI0Ki*lH=A_veRvx_l2YJ;(GbBpq36o~y|IQf^%4RsDOoi_$ANFZ3{7ID~ z%;FrcSAH=N_cy_Ik|T>fvDX#`ppQd*o^5=XOd`$NI4wX1Qye9bMUFG_=kHK4!hY*B zVvPt&t2luAB!VVI{AmQyS{z`+R+l0qTBQMWTZ@ov<G!s;Ga8U>4dx?red8G8s z83(h**p*50Lln1dT*5mR<{Vtcyuj=*cR4Jf=_9J)857e%bZ58KnQ(z&9J@-iZp-W0pFZNX8?#Wi5 zk{X+0qk`Ld0%|08jvCc{8}H)-3o8yj#7ERNiaYMXikn7Jkhr_Ou<6Bqm&0PI7s~6U zN}xW#`A^ULnvr0iTz#aLU6u5Lw5ig%g-=L%w3NqDx)t@p_J~@mC|mec;G&5$BQx~o zQKyK9?UuK8u(DRuRNJjQJ`>0!QXsbxwMlWZ;fLyR@2I6>qlKQo$dkdojD4-mz?e%9 z{6t``@up#CEElNNpXM`Vrf`Z26Ov2cvSF{X|&eTvcvtWzw!M1Fhu z7c9~LGb6{jyO+5DS(9TC7BQ-{-oy-U(dW{88}q0!W@VUro<(h7ld+HZvyl1L!qps! zaQg;Cei{&|7$Wv5-hK8G3%{fCO_6oo+NOE=6fTX1&z)B+v%vdHOw>O=9*|n1j=&m` z>-5}1i8QV-{SwPBQ-B*Jai0;hL?|(K3!n3=Y$$%gH%&2*Y+=vBYL0JT4mqwGsetL? n+6fB9^%G3#$F!hST6keZDH2Jek714-Tx2iH^n68I2HXDtv`tIJ literal 1489 zcma)6U2hXd6g^`*S!dZa#3T-dgwm82CjoC8D5P=9S3W4jp=umJRiDP|k+bP$*WFzM zQvXN)0{@vyNxvV!*)%e*iBR%%0tCxM<&V3C~gVZUKEDPOZ_MmnC`_TzXa}jA7<$2 znjiY<9j31=JQFCaM=fTVsQaOM(miadcuzJ1BBgrd$>5ocef^z*g>>If1TNH{rv7l= z25AKw}rQDCOBa0(T{GBX2P$h z#GZR7{m`XU!zXc#_@v5Qy7+e%9yxf7Z8{HUcoL;sQ8#S$1#+SXt){oSzr0#?_m|yP zQy`Z}YCCOm0%uJ|)2Q#82izlpa|387b=ja=-bU=dQ1OloWm}J6r_!6j@Ungga@vAS zbhz)S*@L}UdK}I4|5VUxT#n+l)|p08khr_uu;ImihYBq9N_pLsp|vbj^BxSi*58_J zV}`iws-zpF4VBjLDSx(8{IM5c>&f$F>*1T5^EWrw!gvV1CE$ek-4-&*$-HA(-12&!wh{Z6aZQ@#l?&w1&;4oSSrwdtBbAwloB(6^BUo-Y$6k;+1H8XQ2h^vbxU6W From e2234af83fc5a27a6b2db6144f065bd687f03845 Mon Sep 17 00:00:00 2001 From: Matthew Tuckman Date: Fri, 1 Mar 2024 14:42:07 -0500 Subject: [PATCH 2/3] Removing class files --- h2/db.mv.db | Bin 32768 -> 32768 bytes target/classes/Application.class | Bin 1279 -> 0 bytes target/classes/Util/ConnectionSingleton.class | Bin 1489 -> 0 bytes 3 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 target/classes/Application.class delete mode 100644 target/classes/Util/ConnectionSingleton.class diff --git a/h2/db.mv.db b/h2/db.mv.db index 059717bcead1c908ca99e2de874c96a1057c0187..af125666a5ea59b30897a9a929663f7a2d2b23b9 100644 GIT binary patch delta 2536 zcmeH}&u<$=6vtqQcbznW{%6OV0Zaksf>{H&De8jbX)#X znw2i&dlLe}0-8J5bUVEp^DlPYCPGM)J`sKizUz?l(g)(N6C%QM;+!xKGs6AxV-l{Q zG1y^EjaoVp_NkXzE%v#WSeDpEFs=TLjbNHqp{>zbXfIF;+NIaR_K)7rOT2+?Y+wsh ztc#R;a4~F(@Nl>^czt;)7(~=i8mEg}eAHy`5saFD0 ze=itRCq`e?@65u`PXCFLp}?Iqy>of$4J#=RJ%UsH7o3U)!Hcof5-i>5{M2L(QovFt zs#S=m6~)u{m2f``Rp1hx!CxZ*V}xD?$M`t1xcS4e<0Vs5T+5~=z%x2JXdkKrziqD1rqf*()~l|z=L<1X+wc&mFy*YS&K7z zP^5#I?We{erQ*Bak7hQuj-JhV%7bR*;%b?|pPlo^>`b2biz5YOSQC{$7kwWJL7 zqB!b=`UMK@h(fCKP#m8D2!&gsj!-$*mjX^1Sk^2@_DgZE&l_naq?gQ delta 2013 zcmeIy%WoS+7y$5@UE8tUK#~R}=_@!@iUr-+^V->matNqu5~+|9Bn|`+vo9JYvGZ_B z!zD(DL&c$_BcUQyLU7|o?uq0x1ZI0~Hed13B5aRSG|q5Ramm=%~{#7sw?IrBHqxO{tZqH#Za56TxBhli57cvKVdGBWgVcllPih}!GypX)HoGF$Yg?zMH^d46fc3wnf1Hs!XUZ4) zUr*i1=m3uCW7=u;N;^1uA`M4CdPS_3NZit%W}hOG#3ZMpl~XT?zU+PIH%Mh~v7p+C z;;3pb6m8YMR9K7RImU{( z;^N3gMkTyba|2^lyclk{meE}4GTT;{2bm-axKUeN30(^d&k1eMG&U=n8)48K2tsah zlngvtd%AP>)ac#=(z*x2B1YBsH&;c)KegprQKM5EP41Bs-yG`OWaKczO ziCE_iC4s}$6{`a<@hkvv3g{DW0`Ns0q!#v6+yg1^8~|Sekg86pc~c;j-`H0j0Mh0C z-L;pp*9+NVS6lbnG9y|JYyPEh-DSkFXlQy0+Y|EF@{v9>`Km0@X;0s)(`=oJ&FrSm zveF68z}rBB5P;b!0JthpMd;laIhM5;7PdnzRp9&SIjD^&!uyR+@Yi|{fS&L5$2IMk z+%tp51Ygf6i&>~0=q-wa$5THYPI0i5{<%eQ@LcAXKT;gH*mEdF8YJYxRt2eM;%M8ZrTI2Y!**Kx5 zhvmS`F!64*TrLa&a98=estDYzgVeRpRNMopn|lg~8h>YAMaA;D`Q5dHOp|4oS(l~R vWoi13#Yl(cp#1LPtQEo?yo;Tegas>zKS9E6!=33ASe(%)i3porQ6la;qj?a z@dSb!rfqtg0zNHOQgH*r3e*rr5E7XB=$Te#%du^`nvPvG?W$#Xjx8`+HN37tAfcrS zP4e@vy@;HGF*KjhK5<;GRE#1l6PjQIZ6GRDQV z$Auq-~kW(rIWQj;7-=fbTRJEkmlxTl`0QhCf{mCslHhCpEvt9PkK_xf{k4JmrZ5|AwEB9N7B~rO?1=d8v-^cMU}3 zV)CGYSb4dQMAqNHba|zYTiHMZv*n~e8K`4E8%zeTa5t+Ym5GI=D`=m(@fR5feA|AE z%NLF~CNPHx(und?6vHM@c9Cf2_r8?_&z}+F$2OiL%M3@6<9~w}j??c2F+Or=c!^i^ dN@E6jyk;rZ$-PBXkRB@DUG5i1k diff --git a/target/classes/Util/ConnectionSingleton.class b/target/classes/Util/ConnectionSingleton.class deleted file mode 100644 index ba5b8ed5321b5a758e8338e71aaffdd1e8d491c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1489 zcma)6T~8ZV5Ixs6tl6$hZ~&(SNP^SGCW*JDAEB7$3qn6Ise%bn)u-$Am07y%y1VN% zQvXN)LS7q?TGUE?t<)b?_1tUAxDAo|;Jv#ubI+VPGvmMh{_PI{chInrLDoXf!5GE` zE*#3|(hX$TaldXIDlZinU-v^ly(^HdRQD&4$Aksj!CPG!s;Ga8U>4dx?red8G8s z83(h**p*50Lln1dT*5mR<{Vtcyuj=*cR4Jf=_9J)857e%bZ58KnQ(z&9J@-iZp-W0pFZNX8?#Wi5 zk{X+0qk`Ld0%|08jvCc{8}H)-3o8yj#7ERNiaYMXikn7Jkhr_Ou<6Bqm&0PI7s~6U zN}xW#`A^ULnvr0iTz#aLU6u5Lw5ig%g-=L%w3NqDx)t@p_J~@mC|mec;G&5$BQx~o zQKyK9?UuK8u(DRuRNJjQJ`>0!QXsbxwMlWZ;fLyR@2I6>qlKQo$dkdojD4-mz?e%9 z{6t``@up#CEElNNpXM`Vrf`Z26Ov2cvSF{X|&eTvcvtWzw!M1Fhu z7c9~LGb6{jyO+5DS(9TC7BQ-{-oy-U(dW{88}q0!W@VUro<(h7ld+HZvyl1L!qps! zaQg;Cei{&|7$Wv5-hK8G3%{fCO_6oo+NOE=6fTX1&z)B+v%vdHOw>O=9*|n1j=&m` z>-5}1i8QV-{SwPBQ-B*Jai0;hL?|(K3!n3=Y$$%gH%&2*Y+=vBYL0JT4mqwGsetL? n+6fB9^%G3#$F!hST6keZDH2Jek714-Tx2iH^n68I2HXDtv`tIJ From 27f583b7b522cfcb97a830bc9834df54f920fd59 Mon Sep 17 00:00:00 2001 From: Matthew Tuckman Date: Fri, 1 Mar 2024 14:44:15 -0500 Subject: [PATCH 3/3] Commented on constant usage --- src/main/java/Controller/Controller.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/Controller/Controller.java b/src/main/java/Controller/Controller.java index 7f4a05d..ef71151 100644 --- a/src/main/java/Controller/Controller.java +++ b/src/main/java/Controller/Controller.java @@ -18,6 +18,8 @@ public class Controller { + // Constants are useful when reusing strings so you only have to modify in one play when changing. + // This can go in a dedicated constants file if desired. public static final String VENDOR_ID_QUERY_PARAM = "vendor_id"; private VendorService vendorService; private ProductService productService;