From c6191377f4c3fb4507080e0f891093faf2ef73e3 Mon Sep 17 00:00:00 2001 From: Florent TRIMOREAU Date: Fri, 3 Dec 2021 14:00:23 +0100 Subject: [PATCH 01/12] Gettting Started --- Poseiden-skeleton/.classpath | 32 ++++++ Poseiden-skeleton/.project | 28 ++++++ .../org.eclipse.core.resources.prefs | 5 + .../.settings/org.eclipse.jdt.core.prefs | 9 ++ .../org.springframework.ide.eclipse.prefs | 2 + Poseiden-skeleton/pom.xml | 18 ++++ .../target/classes/META-INF/MANIFEST.MF | 10 ++ .../spring-boot-skeleton/pom.properties | 7 ++ .../spring-boot-skeleton/pom.xml | 92 ++++++++++++++++++ .../classes/application-prod.properties | 16 +++ .../target/classes/application.properties | 14 +++ .../com/nnk/springboot/Application.class | Bin 0 -> 725 bytes .../controllers/BidListController.class | Bin 0 -> 2489 bytes .../controllers/CurveController.class | Bin 0 -> 2525 bytes .../controllers/HomeController.class | Bin 0 -> 863 bytes .../controllers/LoginController.class | Bin 0 -> 1707 bytes .../controllers/RatingController.class | Bin 0 -> 2475 bytes .../controllers/RuleNameController.class | Bin 0 -> 2517 bytes .../controllers/TradeController.class | Bin 0 -> 2456 bytes .../controllers/UserController.class | Bin 0 -> 5003 bytes .../com/nnk/springboot/domain/BidList.class | Bin 0 -> 421 bytes .../nnk/springboot/domain/CurvePoint.class | Bin 0 -> 433 bytes .../com/nnk/springboot/domain/Rating.class | Bin 0 -> 417 bytes .../com/nnk/springboot/domain/RuleName.class | Bin 0 -> 425 bytes .../com/nnk/springboot/domain/Trade.class | Bin 0 -> 413 bytes .../com/nnk/springboot/domain/User.class | Bin 0 -> 2023 bytes .../repositories/BidListRepository.class | Bin 0 -> 360 bytes .../repositories/CurvePointRepository.class | Bin 0 -> 369 bytes .../repositories/RatingRepository.class | Bin 0 -> 357 bytes .../repositories/RuleNameRepository.class | Bin 0 -> 363 bytes .../repositories/TradeRepository.class | Bin 0 -> 354 bytes .../repositories/UserRepository.class | Bin 0 -> 523 bytes .../target/classes/messages.properties | 1 + .../classes/static/css/bootstrap.min.css | 7 ++ .../target/classes/templates/403.html | 16 +++ .../target/classes/templates/bidList/add.html | 26 +++++ .../classes/templates/bidList/list.html | 46 +++++++++ .../classes/templates/bidList/update.html | 25 +++++ .../classes/templates/curvePoint/add.html | 27 +++++ .../classes/templates/curvePoint/list.html | 46 +++++++++ .../classes/templates/curvePoint/update.html | 25 +++++ .../target/classes/templates/home.html | 13 +++ .../target/classes/templates/rating/add.html | 27 +++++ .../target/classes/templates/rating/list.html | 47 +++++++++ .../classes/templates/rating/update.html | 26 +++++ .../classes/templates/ruleName/add.html | 27 +++++ .../classes/templates/ruleName/list.html | 49 ++++++++++ .../classes/templates/ruleName/update.html | 27 +++++ .../target/classes/templates/trade/add.html | 27 +++++ .../target/classes/templates/trade/list.html | 46 +++++++++ .../classes/templates/trade/update.html | 25 +++++ .../target/classes/templates/user/add.html | 61 ++++++++++++ .../target/classes/templates/user/list.html | 48 +++++++++ .../target/classes/templates/user/update.html | 61 ++++++++++++ .../com/nnk/springboot/BidTests.class | Bin 0 -> 1225 bytes .../com/nnk/springboot/CurvePointTests.class | Bin 0 -> 1241 bytes .../nnk/springboot/PasswordEncodeTest.class | Bin 0 -> 1249 bytes .../com/nnk/springboot/RatingTests.class | Bin 0 -> 1213 bytes .../com/nnk/springboot/RuleTests.class | Bin 0 -> 1222 bytes .../com/nnk/springboot/TradeTests.class | Bin 0 -> 1189 bytes 60 files changed, 936 insertions(+) create mode 100644 Poseiden-skeleton/.classpath create mode 100644 Poseiden-skeleton/.project create mode 100644 Poseiden-skeleton/.settings/org.eclipse.core.resources.prefs create mode 100644 Poseiden-skeleton/.settings/org.eclipse.jdt.core.prefs create mode 100644 Poseiden-skeleton/.settings/org.springframework.ide.eclipse.prefs create mode 100644 Poseiden-skeleton/target/classes/META-INF/MANIFEST.MF create mode 100644 Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.properties create mode 100644 Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.xml create mode 100644 Poseiden-skeleton/target/classes/application-prod.properties create mode 100644 Poseiden-skeleton/target/classes/application.properties create mode 100644 Poseiden-skeleton/target/classes/com/nnk/springboot/Application.class create mode 100644 Poseiden-skeleton/target/classes/com/nnk/springboot/controllers/BidListController.class create mode 100644 Poseiden-skeleton/target/classes/com/nnk/springboot/controllers/CurveController.class create mode 100644 Poseiden-skeleton/target/classes/com/nnk/springboot/controllers/HomeController.class create mode 100644 Poseiden-skeleton/target/classes/com/nnk/springboot/controllers/LoginController.class create mode 100644 Poseiden-skeleton/target/classes/com/nnk/springboot/controllers/RatingController.class create mode 100644 Poseiden-skeleton/target/classes/com/nnk/springboot/controllers/RuleNameController.class create mode 100644 Poseiden-skeleton/target/classes/com/nnk/springboot/controllers/TradeController.class create mode 100644 Poseiden-skeleton/target/classes/com/nnk/springboot/controllers/UserController.class create mode 100644 Poseiden-skeleton/target/classes/com/nnk/springboot/domain/BidList.class create mode 100644 Poseiden-skeleton/target/classes/com/nnk/springboot/domain/CurvePoint.class create mode 100644 Poseiden-skeleton/target/classes/com/nnk/springboot/domain/Rating.class create mode 100644 Poseiden-skeleton/target/classes/com/nnk/springboot/domain/RuleName.class create mode 100644 Poseiden-skeleton/target/classes/com/nnk/springboot/domain/Trade.class create mode 100644 Poseiden-skeleton/target/classes/com/nnk/springboot/domain/User.class create mode 100644 Poseiden-skeleton/target/classes/com/nnk/springboot/repositories/BidListRepository.class create mode 100644 Poseiden-skeleton/target/classes/com/nnk/springboot/repositories/CurvePointRepository.class create mode 100644 Poseiden-skeleton/target/classes/com/nnk/springboot/repositories/RatingRepository.class create mode 100644 Poseiden-skeleton/target/classes/com/nnk/springboot/repositories/RuleNameRepository.class create mode 100644 Poseiden-skeleton/target/classes/com/nnk/springboot/repositories/TradeRepository.class create mode 100644 Poseiden-skeleton/target/classes/com/nnk/springboot/repositories/UserRepository.class create mode 100644 Poseiden-skeleton/target/classes/messages.properties create mode 100644 Poseiden-skeleton/target/classes/static/css/bootstrap.min.css create mode 100644 Poseiden-skeleton/target/classes/templates/403.html create mode 100644 Poseiden-skeleton/target/classes/templates/bidList/add.html create mode 100644 Poseiden-skeleton/target/classes/templates/bidList/list.html create mode 100644 Poseiden-skeleton/target/classes/templates/bidList/update.html create mode 100644 Poseiden-skeleton/target/classes/templates/curvePoint/add.html create mode 100644 Poseiden-skeleton/target/classes/templates/curvePoint/list.html create mode 100644 Poseiden-skeleton/target/classes/templates/curvePoint/update.html create mode 100644 Poseiden-skeleton/target/classes/templates/home.html create mode 100644 Poseiden-skeleton/target/classes/templates/rating/add.html create mode 100644 Poseiden-skeleton/target/classes/templates/rating/list.html create mode 100644 Poseiden-skeleton/target/classes/templates/rating/update.html create mode 100644 Poseiden-skeleton/target/classes/templates/ruleName/add.html create mode 100644 Poseiden-skeleton/target/classes/templates/ruleName/list.html create mode 100644 Poseiden-skeleton/target/classes/templates/ruleName/update.html create mode 100644 Poseiden-skeleton/target/classes/templates/trade/add.html create mode 100644 Poseiden-skeleton/target/classes/templates/trade/list.html create mode 100644 Poseiden-skeleton/target/classes/templates/trade/update.html create mode 100644 Poseiden-skeleton/target/classes/templates/user/add.html create mode 100644 Poseiden-skeleton/target/classes/templates/user/list.html create mode 100644 Poseiden-skeleton/target/classes/templates/user/update.html create mode 100644 Poseiden-skeleton/target/test-classes/com/nnk/springboot/BidTests.class create mode 100644 Poseiden-skeleton/target/test-classes/com/nnk/springboot/CurvePointTests.class create mode 100644 Poseiden-skeleton/target/test-classes/com/nnk/springboot/PasswordEncodeTest.class create mode 100644 Poseiden-skeleton/target/test-classes/com/nnk/springboot/RatingTests.class create mode 100644 Poseiden-skeleton/target/test-classes/com/nnk/springboot/RuleTests.class create mode 100644 Poseiden-skeleton/target/test-classes/com/nnk/springboot/TradeTests.class diff --git a/Poseiden-skeleton/.classpath b/Poseiden-skeleton/.classpath new file mode 100644 index 0000000000..a5d95095cc --- /dev/null +++ b/Poseiden-skeleton/.classpath @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Poseiden-skeleton/.project b/Poseiden-skeleton/.project new file mode 100644 index 0000000000..f0f3aebf47 --- /dev/null +++ b/Poseiden-skeleton/.project @@ -0,0 +1,28 @@ + + + Poseiden-skeleton + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.springframework.ide.eclipse.boot.validation.springbootbuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + diff --git a/Poseiden-skeleton/.settings/org.eclipse.core.resources.prefs b/Poseiden-skeleton/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000000..839d647eef --- /dev/null +++ b/Poseiden-skeleton/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,5 @@ +eclipse.preferences.version=1 +encoding//src/main/java=UTF-8 +encoding//src/main/resources=UTF-8 +encoding//src/test/java=UTF-8 +encoding/=UTF-8 diff --git a/Poseiden-skeleton/.settings/org.eclipse.jdt.core.prefs b/Poseiden-skeleton/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..71df5229ce --- /dev/null +++ b/Poseiden-skeleton/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,9 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.methodParameters=generate +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore +org.eclipse.jdt.core.compiler.release=disabled +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/Poseiden-skeleton/.settings/org.springframework.ide.eclipse.prefs b/Poseiden-skeleton/.settings/org.springframework.ide.eclipse.prefs new file mode 100644 index 0000000000..a12794d68f --- /dev/null +++ b/Poseiden-skeleton/.settings/org.springframework.ide.eclipse.prefs @@ -0,0 +1,2 @@ +boot.validation.initialized=true +eclipse.preferences.version=1 diff --git a/Poseiden-skeleton/pom.xml b/Poseiden-skeleton/pom.xml index a7dcbc04dc..e028ef190e 100644 --- a/Poseiden-skeleton/pom.xml +++ b/Poseiden-skeleton/pom.xml @@ -60,6 +60,24 @@ com.h2database h2 + + org.projectlombok + lombok + true + + + + jakarta.xml.bind + jakarta.xml.bind-api + 2.3.2 + + + + + org.glassfish.jaxb + jaxb-runtime + 2.3.2 + diff --git a/Poseiden-skeleton/target/classes/META-INF/MANIFEST.MF b/Poseiden-skeleton/target/classes/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..478a5fde4e --- /dev/null +++ b/Poseiden-skeleton/target/classes/META-INF/MANIFEST.MF @@ -0,0 +1,10 @@ +Manifest-Version: 1.0 +Built-By: Draflosword +Build-Jdk: 13.0.2 +Implementation-Title: spring-boot-skeleton +Implementation-Version: 0.0.1-SNAPSHOT +Implementation-Vendor-Id: net.guides.springboothelloworld +Implementation-URL: https://projects.spring.io/spring-boot/#/spring-boot + -starter-parent/spring-boot-skeleton +Created-By: Maven Integration for Eclipse + diff --git a/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.properties b/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.properties new file mode 100644 index 0000000000..5bce0a2138 --- /dev/null +++ b/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.properties @@ -0,0 +1,7 @@ +#Generated by Maven Integration for Eclipse +#Fri Dec 03 13:58:21 CET 2021 +m2e.projectLocation=C\:\\Users\\Draflosword\\git\\JavaDA_PROJECT7_RESTAPI\\Poseiden-skeleton +m2e.projectName=Poseiden-skeleton +groupId=net.guides.springboothelloworld +artifactId=spring-boot-skeleton +version=0.0.1-SNAPSHOT diff --git a/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.xml b/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.xml new file mode 100644 index 0000000000..da271353d0 --- /dev/null +++ b/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.xml @@ -0,0 +1,92 @@ + + + 4.0.0 + + net.guides.springboothelloworld + spring-boot-skeleton + 0.0.1-SNAPSHOT + jar + + spring-boot-skeleton + Demo project for Spring Boot + + + org.springframework.boot + spring-boot-starter-parent + 2.0.4.RELEASE + + + + + UTF-8 + UTF-8 + 1.8 + + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.boot + spring-boot-devtools + true + + + mysql + mysql-connector-java + + + com.h2database + h2 + + + org.projectlombok + lombok + true + + + + jakarta.xml.bind + jakarta.xml.bind-api + 2.3.2 + + + + + org.glassfish.jaxb + jaxb-runtime + 2.3.2 + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/Poseiden-skeleton/target/classes/application-prod.properties b/Poseiden-skeleton/target/classes/application-prod.properties new file mode 100644 index 0000000000..b18b11eff0 --- /dev/null +++ b/Poseiden-skeleton/target/classes/application-prod.properties @@ -0,0 +1,16 @@ + +logging.level.org.springframework=INFO + +################### DataSource Configuration ########################## +spring.datasource.driver-class-name=com.mysql.jdbc.Driver +spring.datasource.url=jdbc:mysql://localhost:3306/test +spring.datasource.username=root +spring.datasource.password=admin + +spring.datasource.initialize=true + +################### Hibernate Configuration ########################## + +spring.jpa.hibernate.ddl-auto=update +spring.jpa.show-sql=true + diff --git a/Poseiden-skeleton/target/classes/application.properties b/Poseiden-skeleton/target/classes/application.properties new file mode 100644 index 0000000000..28a89bb203 --- /dev/null +++ b/Poseiden-skeleton/target/classes/application.properties @@ -0,0 +1,14 @@ + +logging.level.org.springframework=INFO + +################### DataSource Configuration ########################## +spring.datasource.driver-class-name=com.mysql.jdbc.Driver +spring.datasource.url=jdbc:mysql://localhost:3306/demo +spring.datasource.username=root +spring.datasource.password= + +################### Hibernate Configuration ########################## + +spring.jpa.hibernate.ddl-auto=update +spring.jpa.show-sql=true + diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/Application.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/Application.class new file mode 100644 index 0000000000000000000000000000000000000000..4b07e1c9af4892848e30de7d73908f129ea7324a GIT binary patch literal 725 zcmaJm$m^y3El#a^ z=m+$pD#ivWdx$vf%+8Gc=DivJ`~T-JfJ3}%qrvb#H3irDmX|ZDbe0(7_{nURt5i5; zbQ?{E-i^2uJQq6SpOPDyI)>$sN-KBFurxTBGBn5LQbt(9N*66GGpxr-%ZsW=r2Q(A zTr%`ylZt#Qtn%?wvgxi>$*>nc&tgO!3ZXQ^*5G?QXESl0^XOn2;UzZO=ratB&7QPe zSy9Lz#@_OvY7zw2v~}?co20;21e^?NxZ_-u`gs7Y$&Vj4sk8?St#n&2)un!syJrtlpf3#GxZHhQ~M!q%th0c8_M`V2& zbl?Tq?&AUSs}!wZ4eJErFCPUkpwnl=-{^gt-;byQL;+!r(ZLqBDgTDPEWcC literal 0 HcmV?d00001 diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/controllers/BidListController.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/controllers/BidListController.class new file mode 100644 index 0000000000000000000000000000000000000000..dbae23e602bd87f172d8f03309d66a3ee708db4c GIT binary patch literal 2489 zcmbVNU2_vR6uny8vGYk{z|is?T5v*%Ak7EGOlN=rhQR?QKwfxSd(~L5UYT8)wA1NR z|3iOA`_!2}^at>xIz7_b>$OpsfM<5K(v|K#=iIC75C8r1FA;6foicfhZnRaGN6}lJ z^kNz9x0KSnts)((FcfjZ@5!Jk6Ma8hDpQfs;v4_H&qF`j=g(SiL|ZeOx+5d0e`Hjs zuk0}@-dBN`p#n|MQHiD)9c#)+JneT|B7W(&LcyroRBb=p^J8h|gTrOeE0UjUuIe zEmZ_Cx19bCM2oj%6mUP=%Xh`QzDV?r-|MArOYi-#4@~peYK7z>)U41+MsxWUMy0L+ z$LPE>SOy;2?+D#d!E@g*)5sB{89xY+sD~=Vz!9Z+E(Y!JV#>BXo4D@iY*OBYfezP6XUcQog0t* z@|WItg)bx>b?~ZZginj;K|Oa#9!Fa2i}*|AJCVuIx8C`$GWd`4|swKx&yAer7}`AT^y)7^FsCGws@PU=;HKsF2;KTfkQco~1Vk}fY3c75AuBPT3 zu{5Zmc$Mk{+J1+Q(|3&-MnLhLf^hb62?aHwwXTzj;M%w#1-}jxfNB-yEzy2nob$T>K9;3Cc>hm~$ z$J0R~}$?2FCO#1vH+&Akow10DtO9{;}cR&+I^Q;%dU_1BF2 z=E^Rk%BBiMoqU=;LsdG(Xtph5@jUByMDjA|M1oPHt-3+98zj<Yqb*Fb1 z;crEO>}-)Fz|`mpqnQFn%pp5E67O3lgU6@_1!Wj$i1_OXIXTe}%^;%u38IGZ?1(gr zbj!JWq_i_x?m5r6^x0O$Y*;7?H0E`^oO`2~mXh#-&DtM%fyb^<2Dw`wON?8XSX#K% zPLPG;Wf>S_b2o~@nW_RBC?BW?mPSd}e152F{e{Ysu6Qa<6<*jZ*Y`D39vR(sf=f|r zgwn_jKK>%KXo+yK@kt??LJ#F0?HTnbc~OybZzY8s`ar%*CE6qk55NFZqQAvpY}0v3mx+_N24C>AS4 z6lK9)VX11-+?zzRX3-eK#&e!nrZ+}oq_b&crL&|g!pcZGpgxptzG4BF<$G|9d=F0` Y-x0v;A10qiUxA@V8#avQQniTw1F1Jvu>b%7 literal 0 HcmV?d00001 diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/controllers/HomeController.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/controllers/HomeController.class new file mode 100644 index 0000000000000000000000000000000000000000..d6138c45178d5e5df3ea825e57d3199ab410eb71 GIT binary patch literal 863 zcmb7?O>Yx15Qg8$chfd42?WYV5w{iumJkw%AS6@?ao7NAQ7)XkyC!kFYX`5l75@rO zNF4Y9{3ygYiBhP71c#mRyY{~GjAwuR{PrEdBiwGHLb#vUTo`jAimB6P99!!}VvTn; z%akj`E1Ro>rEa1|*glr0Qe@JM#hdt8C7#fDrj7Q`3Dv#*5utWqQ`JTlYa6JeLD-74 zQLoE9R_>jQGezh|Hj&v#Ivw=lWzA1?K@ib@K@GUzgfR&Z_af`Yi&j23nX5DFPDH82 zkb$znesqq0@o29IB6{D*RAR zr*qr-smw}dBGE#JP|pJaVRxnDl8|qAsQkpHZ)L#uJOaX+Oml6*BnazbCPZksg&Tyv zQ>k`5g{RDvM!N7K<3MO1+0rHIr4HBK`*V&D!aWe~t%NDKsL6=a0VtY~oP`C5H93?(!^q$!*W5 ztkcrk@wU#K(P=7;<+1Ll?D4=+!5G8L3$ZVFDzXm$vGqc>9m8~PrP-D}ZI#pJ6~jh6 zB(XUG z+hcMu2;j}!=>uhCLTS(3SDA7T7|P2lI}Brwbs{HG#@Q++Fv)N(R+)T~cU#gt6NJkU z#=0%i9buH;A3Dd}o+2Vc>-vOXL|{Di8dB);%FrqfWQ&s)`>Aw%i^!$TEZI@=fI>G% z2DDU`oUHf<>9$0#M=kV-`y$O{1)npl4byED;v{M~8zA&{sfsUffnmx@=h-|V(HZ8K z4ZvcfU8uQ zpEElFhU-;~I{`#(vcWY)2TZ}X}MD=kCk-|FT>3$*1;Jj zM3Nj0`?Db;oRFn|tnoja9pDzB`0{v4;8dzKMwU?HxDi|=v1{)T-0+|vcQSt2t>8RiR&T0iCxBcN{=afvcB zL?h5H7ihmyE{_%+qg`2jhikv%2E%)-{ag<>PNRn;0C1iVmasrK_98BvU=R%$EDRXj z9>L&t!9WoMFZR+AgYeE)J-oZt2mkssc#Zl2Tp{qQ6nu>mU&kVD6a=DvngM~?LjqIe b`3B!onI$wRx`g|M_#wT0NBakZ20Z*1;BTvO literal 0 HcmV?d00001 diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/controllers/RatingController.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/controllers/RatingController.class new file mode 100644 index 0000000000000000000000000000000000000000..c5b6acc574ad48112ecc834d946f254d44ace62b GIT binary patch literal 2475 zcmbVNTXWk)6h152iF0l0kkC?kNuZ6Bf|nNeLd`H!IxW+w1D&+Z3r}*i#M{bRBgqX6 z!wdg`{{c_T@W2n?M=^Z6E6H-Yp{1UYR%b8geBXD@9{>H%pMMcihq|-mG2#bm$m940 zPe+N25Bo}Gn2NJRMUhBSz87SezE{r7QjO8d^WbH`qaZ%y-}Il0gN)J4=Q5Vr7mWPY z_CBN9Jr#<1@@a07>NLaXR8Pj@>+!HJlBYpG5{#NXbr3}RK_a!CPu8-5Oc`D4{ZCk3 zgdC_L++J_>RC1Wp`7Q~D;z%Vg_*n8?K#IECy$SdyndXeMXZOZ&CWm5QrV?Q8#<9vk zT*bh0+v)E}^m$*#ArH#Ed{2Bo7HPH{j7HXN{bdl1foYK^Mn)dVG;7crqlL-@qxw)o zV|2k8s)P>VcSSZ(;p0H_%8(yMOFn&5 z6x@KLK^GX!=hR@MEUdw3^Yy40HK3OagA9`W@&+`VfO8kf9sd&fK_d1a7+kjE!^tlMH`GeLC?wH4U;s(H@|H zCsALYpy2cRvR)ajI?&?E*=2h(82#$x|Et0pbc4}aB0`y@!&=PRR3kIc{b~;yc{)rkV2jYR$9d*s_oiyvVZgq^VI)SC=A3|j)2R=E`r42$4 z#~%dIEWXgY@t%dnF*1zxoj<7YJ3c&`$6GHGouUQ27wra&ORyL%W8S9~d@sW~ji>o7 zv6NPg!&|UDtohA%e#208w{G06+vVIHHqtu1i$iCyyUt+f7-#9dN{n-5jQ5YlIDb6G zxf5bsq)U?+7fp-}+Jq1Vj}OWiAJS#4FZh_af)D-EN^J#wUA7FwOLn;eu}#--NJG@XJcDG;GafC9>-4EpC5vLcRz)!_*fT8E4VunzG;M>X zW0#$1v~;G7jC6*SL0BuL1L{J$(=`KlTE3en$am`veW~sc F{R@qJLEiuX literal 0 HcmV?d00001 diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/controllers/RuleNameController.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/controllers/RuleNameController.class new file mode 100644 index 0000000000000000000000000000000000000000..2fcbd6142357a9408892af41311fb7d137dca93d GIT binary patch literal 2517 zcmbVOTW=Fb6h5FGF-x?7*(RER8<{{0_3GnYwt83SnrtKS<(ve z*8kAIL7yu1p+BHMs_Hkh_U_tDsuW9}`<(NA-#K&azyJC3FCyBa2Q%a`y3tbu9>=eE zI!t7|*HudMo{Dv%qDUku-^n8JBp8TC#o7$j7#({Vya{*|#C!aQ?n}|rjE+2zvD9BN z@>}b>jB1ZmDCWqg*#)Z85k^NlG8Rv=L02TtgKi`kH9M*oM7u#E&3v?2(|wsTy4CsL zz}j%yR|6Qn+3KidZ$#;*1n~D&@``7YZv#}+UhkCfpJ~GzcTewRv6cg|D^m$L593(r zKuZ+^%{`~RebMDz8HYS5&hj1cIuohh4u-?rZ2e6TWx%w=laZ7>lBsUcNk)qkON{CR z1CP;pr@I0^dF&%~F_>)1}E|D*`!@b*F5a{>&>Zc8w}X*2Y*`yt~9wVzlW5Sh+kY z0i$!1AfEp+oXq;Aw6FGG3{4dBtoo)^c{tz2TI`ABW28J;N|IUg{H+Y%F}mYq;FLJf z{c+)d9G*nR-9U{Q%ffTJj7~TZ<1yyj=DnEW#^^UEGe-%UenL*f2Wsv-{aA}kzZCWL~Y5bHB&0vHYk9Gz#j-H{fZ~Q@x-!brL4z1ZHI!g0s7xDw>7cm15tow8f z<0Z_F_5dFj=wj*Pg7vXVmmtKL$7h9)%k(++=Y1@Efr0rLrM}0!hTd;};B?hG z-N?5q#MZ1+L$O8cBie?nPa7~aOU#fpJ`DFopVrW|@Xa;2LRVpNjIY$-n#H%|0nerZ zog#=i#D|!gAp6bh)4Hr#h!^wi3Pesfamhe5z&wj&*0UCK6u0p2!=+M=V!2jDF)7#! zY}GBA+tX+^EgECkc+L~cj7l^{I-5pTI!nqTtQFD$^;o*&H4AuBzPks=ckdALeE@jt UnDq;*4RDgBf3Cr%1cDM?%E4l`|sb~-rFNt4`gC3{7zcD*vY zas$I~!8`CEaK#K4JOB^H@JYM2*Qr9GnaOIklFs>kpN^FL_4glt644gjt5Lvcv!@3< zNnY@5n5yKktF_@hotRX|u}m|*mx@R}oP4NJh0&Sk;-%oRNDlee-RH7r7@fMO5@kMT z6t>n67*!tXNH!>>xdp1yDMm{jmB_C~gRV^XL^qapC*NOpNwB@q{sxqMfCH3-%1oW!V$_)S8C3@s zjL~Ipq6s)$-;t)Tqo=~EGT0kNH4#PonM@gNw|tgGdLUGi@1bA%mN%A5}R3r>M`uX+zUeY20_KH8ie!%!$nT=x8_RgNT=`Dk8 z?;4*MPjz{pmkKkcYOc)|)MU$MD(k!}#qW7Z!h!Vz1zB}=;#8$h3{I&Rt+aAhJflmq z1baUWXUlpq>+7Tap*8=JP6v#>Xq8UJlf=kFnZAjM&BBb4i_L#j(NBzSdGWo@3ez9o z2{0m1sIN~LE#&o;2W525!-{j35AWH-#^@KXAkV!rb4a|PC;IH2{clB9r(2AcQyHlg z*XG^Q#Q=O<131?O{@BO-W8q`tnI5G*`AFFdblJ_EUd@~KW@B{S3zgx*klLUO_;f{^ zRte`7e+`Igc*9MNXAM1$mZ7a~{7&`X@Dfl1PdiMsMDutq?%XY=D0xblyY30%)?J^0x1Ee7D(w9pwg zF-N?QuHEFYdE>Y*YYy>hK3qcNbQ6m#q6G^a$z0$f<`kde9|)gIImJq)OfhTNK8C7} zX8SnJrlYZeZRWhN?Aw&aTIb5hS?5GK!pg)tP>-!UTXDd%_T4_gzB~WHzE^;^-psy$ QK7+!5?z(NXhpJ8V525-vIRF3v literal 0 HcmV?d00001 diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/controllers/UserController.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/controllers/UserController.class new file mode 100644 index 0000000000000000000000000000000000000000..309b04d02c14d02ac4a83bd7f5aa6cd750d1cb5d GIT binary patch literal 5003 zcmbVP`F9i775+w&kt`3!h+uFUmQWVsg)zi&z#@QU40dXRYl8_%w~;iq29IWxnURf~ zX6cfIrcJkWOSN!Z|(twLSftdiuRLT1I7TPVhO_XlCBM_kGK|@9E$F{oo$} zhVgz9F$IGKr>xobvgTD>(_YFuj;|FQ+jkwyGF(r)>KX2M<35Rmg036-imq9@y`){v z-!KZkg3c<3%^4NPGkwQhQ!q3gk=LycFpVH_Ga{>?XRd1dX4zOUJu`0^W47)1x^FtR zr{LtY<1W>vxajI-W7Tn&wY;I*p0=nLL`_X^1ZZPb-&r+XqsX*dPMfyrpHUF+J-VPE zG42$NG~(E*q8(`k+onz1xKu6Y4fl%9x(YJWPC>U8bk`L3wTB76WO5=}6t0c=V*NzP zDKqJb-be^lQ=8$0tnAV0Cad$lkb<$%uvd+|mN)HU81bC(Le=p68NE^oLfck!tIE1* zO-Q3zrst=yTS1$+_1dA}Q59|2(t*dYH;Fw8j(s@ARP4ik1<6IuWX!TiTW<|R)i*6| zngz2RIDmsmd{n_>QTo-vt2l(i3RJyV9P^1iU-dcj^S$>|5_%F?kGyS`Ih#VSg7yXl z#9tP4E7-ev99=$R_$8+}s|&mNdt_OCYA%OJ)(4JX5oy2Jc15qXljc-A$ z;tbBxRVCe9@fMcCmb zHeS-*dC^Aff)OQ~nA9Z|modwNUbx`SaGF}ZqYI+5%&C~i6*fUnU!nC5hX*zmaI^8% z9;LuWy@TzWExh25Hai#-3GWkuE4|0273rjnlw(Ux2H2S+7a96tv|_rg^S)kKX4|c8 z6MI?>d1bBAx{-ByC1>?&MXbaNj$2kR5vF9y_KhXOeV8S+Jz%LSQ)@4p#g`O}L?Vn_ zX1ZUhZ+Ju%GmApKq6!0xY#yS==hmj!YI?)dZBzKk%qU7#j0Hp(b{~qQn5_(kcI_23DT62p)Dm;IH=Hyjyqv_#+8!mtSUHOo1Ywc zf5PxC+b|owfE2E!P-QmRTLTv9!O(tFpE0-8;B~MQyd5T_KITFFI8v7lO&d9Svj!_x z>StBFh|h7q<4P66bw|xp9Ej4~4!OStXlgDB9!VEvcv2_{Gkjjf7w|O~T^I$*@V(V0g}TSfMGm zRG>p|;cXS)7F{^yJHg8|UdLNaBDiIz=bfrsFfN$le7Qq#-8@qt6SG&)A1SlPlZWB> zY$IATf-AHu$Ah}(yLu%!rg&-m5I;`hM=h+G_KLG?Xwy;<4%BOBWfeccPib}@Z0e5` z{3i^&78xX;)a{~Wcn7B)XSrI*-bY6GNlTz;e-HOED7krTcrn+?j_Z~+Z~8`d+ZO!b z|98Tgm|ggJnx_7hiZ9_cj{Bw9m%_QGHt<@u3%{ua|3SrfW$^F$j3?JA+oq%zw{pWv z;1)^WB~_GfW&=QYVYaZT|mj`aLN!_N-hX}q$n zp{?%@)c5!$hE9Hp!9WJv_^Ad1(1q>1V~fQOrWYwYdG`qacRmlrL$^#g!*?;h+u5Jl z)%QMn?&2c~?&9${u4Rtg=8K>}S`O-AvPWf+?jWdEgyA@fKBn$xM4Q4JQF#D^p~}Y^ zl{H!UDc+09@yt-OP5@+Is7Aa|BaRbzqFLjFtTBuyNm?Du1g|vlEXN24B|OFj|4u! zNFq3kPx1?m(9MfLBUs)_g?M?E{{h>d!lxNhXQIjWXCxDyF*2bGdOYMABglA}$rHTx z)zB7V=>Gsqz&e)yiSw5RGcS;efs8j;Glbt1DkCF@unWhrhr%2o909a1$k+hd$7(Aq zE8Yl;#2B$df{#lW?J+r>0KzJ6Mv56g=uU(owCegVLfOJ1lbkAbeFs}I{_VQ7Z38`R z0}W{hsPdXXObZBodlFFsGgqMQ0l5lKk^WIGt*7bqGyL^?mVnO@_82Cppa6a*sNVoS z*#JH%;R>ryO0C6OpOj=InC%Ivbz5C)wV^dRt82YIAxUc0`=t%^etAQ^->m69(xUe( z4ZX!<^7m>C0~=5hG=o6u_#1lu2ky8b;s5{u literal 0 HcmV?d00001 diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/domain/BidList.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/domain/BidList.class new file mode 100644 index 0000000000000000000000000000000000000000..83459813457ef965e921a2c00aa73f7eb62c2dcb GIT binary patch literal 421 zcmah_u};G<5Pfdb21-jyfuU>_3ozh?4TJ;;rU)cJ-JQfLSCVs;I0!zA35kIZ;G+L$8|P^$$iD1ayz4v#QuWWdE?2kxbH=^=2b6k zQOZh|6RWR9?cc<7@(0<36E0wr%Tr-YX(ksjh3qTe2dS#wQ!tcHH$Bif`oP+|3|i<3 g)-*7{hG4%rcccy)ezUR literal 0 HcmV?d00001 diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/domain/CurvePoint.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/domain/CurvePoint.class new file mode 100644 index 0000000000000000000000000000000000000000..21dc29b7b1a8087ed49335211517128706907ec4 GIT binary patch literal 433 zcma)2u};G<5Pfcw7D7u(fuU?j2mu3L*g#0Af++$7D7%wdz~iSJyIpGpZq7wsX%mZ>oV6@&ig{^NHr)yyV literal 0 HcmV?d00001 diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/domain/Rating.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/domain/Rating.class new file mode 100644 index 0000000000000000000000000000000000000000..3a205ec213b1c6cf31fe36f357afacddbff295b2 GIT binary patch literal 417 zcmah_yH3ME5S&Z=04LxOpa>OE0R`94fshb_$^t1M_h;u6F4%jKeMazER7ezj03U@| z8%iXancJP!-0XgSy?+2W!FGtAz;13!N%Sb|Wo2ldS?lD?mdcQvD#x7=p1^3Ko|G&U z&E;*j(76)`&I}oMF3>+XOa;74JJS*RSRKMgAP^^p^i5M{y1G|cp#{c?%~g@A%Cz-w z({m4|7T8bz%W*0Y-Pxwf^|fi;20!tR+hhWhX+zGGIyJRn^9v&DIKCzJ-bvb-XSvi> zZEB|}*Yb*|-3xn8{t&xpta+qL{wb)sLtqcQET0a{qFs_Png>-6;wV~m(%p5I^|^UP+At#3S!WQG6$ literal 0 HcmV?d00001 diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/domain/RuleName.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/domain/RuleName.class new file mode 100644 index 0000000000000000000000000000000000000000..44c13aa5df7017f6894a29869b650afdbdd9301d GIT binary patch literal 425 zcmah_yH3ME5S&Y#mq|znP=pRd0Tf(A2SP#!Dl13~jR4MTJDc2k=pd zJqtP{nwi_3(cbKSe!YJHIKyrS4S|Ey=F*raS*{8)i^N(d=QdYleLCeFUXL)6lfkD#{$8%o$C-y^!jL_EijD8=xLQFx_D4YrUk~4O;r}F zf_(kc4BR7?0*BH6NzMhrds`K$z9m0z@Eh^erxTdWD&r{EF_pw0Tp44Xa%2t9-;2EG zS*~@$LAQ6W+A03L-{ zTa-vNJG(ohxw-xN{`drNioHHM3I~}hH1m_LRweN~bs10}0^{kVk9^e{kGs(G&>b`e*m;NVy*xH literal 0 HcmV?d00001 diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/domain/User.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/domain/User.class new file mode 100644 index 0000000000000000000000000000000000000000..f1a1a9ea33f751b2d01523a68d836af2091e8f44 GIT binary patch literal 2023 zcmaKrZBr955XU#Ar92b?q2)nAM1%s$A)q24ijF$WATaXq{@TV8XmiXZMfp}bqvMP( z`~ZF^$NyeiDA$7*cS$z?&Hi??`TOtpA0k?!jU>ecjpn_wqxFenPJN||InT3B!7IB; zI|oMkNs0^VId;!nr{wCQvy(fPc`GQU3WEB!E;lx{l||{V3L5%U(N>k^p)x90k{eok z*0svhMo=d3`0AWW-za0H&P!*r0H^VYjSo^w-?g%E=$0xHqBdiBT|B>0k4XFHr>u`} z9PIDFt%5|fTb6=uHxTbxP8hPOTI@5oqzVD4lLswgDQ%6j?b$cT{RGNnSsLROaZs9z z!)J~uGgfvr{5&6ABUh7WkShgfJ9Ulu;`yjvdbc(W9nto=QYuw()9*3eZjKW7y%HdL zKVb-Yx2`Fz?7E*1PsdAD@v`ij>z zW85Ao+}GIF&Fz7jB#P2*ayr@RhT_)Sp`8RhOi_Ybp)^%xCL1AS*q)El9(jdb*GI}0 zEh4BBr`Jm@sQ*fg+68imM=9!}TaY8fr99mjsHWyPd}zJ+?ENG~eRc1;y{h8+^Hs3w zX^PTyRo#x3z*&3^tay>40aheI!8So1dtSxQ%lC>G?MybuPe#yit>+pa!aF=0dybM0 zMQjH5g1vaPGZGb?W#~Slw%|1mP@aOGLn7i@y7$|SU z&_$w;E=@76MzglRS=$d4YSOIDG;1?Zp*qdl!Dj7Xz=(bY})}oQZUvq$#M_c^zX6W9!W9Pnx(4-4R%a zQS>{(37j1RRm1bFdL3C<6KH)5f~ILEf@wC)G#bhDnC1|piD@>>G>%{ou3_RH5L9F8 z3YeTorui__WF*r{`S_(7GMKV2$W?Bj}Er4n98Yb@P z3#N3y^gNPjIn4Adl4&KHX*tZa0;bh#nE35nFb#ky1}Xp7f=Atr*-Na~A$n!#^?#E$ BTEYMT literal 0 HcmV?d00001 diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/repositories/BidListRepository.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/repositories/BidListRepository.class new file mode 100644 index 0000000000000000000000000000000000000000..fbf9afb1a4fa62c5c083d540c078ef4db31b57ca GIT binary patch literal 360 zcmbV|K~4fe5Ji83IDi{g9>WR=tcJL7VWOGDL{3o5G@Txpu1QU!Vd=G8cmNM&90&xX zu2@u6QmOn`|9^hHe*l=^DnZ9!oJ&O^tf;Bg2e%N3q_&pEM^SGZy7NWmoA`X(Z4+D= zj7olCT61vpv?y&J6I>chMcqMYsa)At(G?XOnaY|^vRitr`6OsCoXbXYd+*oQ;Q9~o zW(PAE%)JX7H`*S(WxpRtv$No{?4JM%so003_4EhpAw=t}rnhNp*Pz>0uT2x^Aldgm I2Kzbu2Blhb=Kufz literal 0 HcmV?d00001 diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/repositories/CurvePointRepository.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/repositories/CurvePointRepository.class new file mode 100644 index 0000000000000000000000000000000000000000..4f32301688e879d7055ecf0fcc7c552ff1d9d0cb GIT binary patch literal 369 zcmbV|!Ab*B3`Os2)oJU-tv_Klbv5Ef5R?JMenC2ok2meS44F5T?)@qket;h(jzwva zu3RL65bn9TAD?gU0H!$2FmRZbT2qWmY8wmD&s7tdG}?xw7Nn({&erm%A*QF_^(MoS z!&${^rWHp|5A#aOl;OnTQqBKpJsa2ZqPC<3C#I_5o$`k68{P>zOlI0yDYs!I4(ErU z7vDUG@htersk8p>wfO5HFaE{9Dh|Z3(3(Ts3n1Ua-NhtcEWghCryYiU9rv*U17zDi I!gxC;U+=Pc8~^|S literal 0 HcmV?d00001 diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/repositories/RatingRepository.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/repositories/RatingRepository.class new file mode 100644 index 0000000000000000000000000000000000000000..a9c68b83d83b4286ad606e0af9442386c4c40254 GIT binary patch literal 357 zcmbV|O=TOG7j!7RMq;-aCgZqj< znHC%zy-zD!#tgRxLs7T)`B1LyN_0*$j!ad8sq-G!X!SfT;C`9Y5<}Y~)YjBn3CRGV^knMICz1{8q E0#&(m5&!@I literal 0 HcmV?d00001 diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/repositories/RuleNameRepository.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/repositories/RuleNameRepository.class new file mode 100644 index 0000000000000000000000000000000000000000..a4e0da1c62cb9e6256d19adfe3c2c33495f49da0 GIT binary patch literal 363 zcmbV|O-{o=429p6pU|>l*IQr-!75dkNT3L$_5^M^j3!OSkuw2x%duE+01kyZRL~+| z#lp5^+3)l7+xyEafJ>Za7#LiX(ohI1>RR=|Ekq)zZKd;3)Z30`eQoc!v9qt{I>VvC zS;db`H3vuci^`TU!?D4YsQXlU(6saFB|@lKbDyCd0AAdCgBu zD~_J-7PXWq!_eVM&Huza8aMK+wxo&^Q{D0|bVIi-?*bjhb6s00v#=6}iv!-|3*|7H z2Ol}Dtv`7w4)J;MFZ6ZshkT_Chxo0X?~!g|5-*ld^Ip~AsIQa$kH7%gwx43Oo#RiU CN^-CO literal 0 HcmV?d00001 diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/repositories/UserRepository.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/repositories/UserRepository.class new file mode 100644 index 0000000000000000000000000000000000000000..6428c160013763aed12b6d254c520684a30569c5 GIT binary patch literal 523 zcmb7>UrGZp5XL9<&)TXWc#q~qpH_-53d(}u;sK`VG-TV&gxRdxtNGvoJcb7msxrWKi(!M=iX7W=I-7p&=tWua#nQC9)ink#)9a8vL=!DWxHWgz3`&R}%x zub#=Y2~@$Tw_yCo?&{S7_-;#Dv#o%I-7NgeOS-x>0v2gI8HqSzAPjB9khi!R?V ny77@LNj~Z2wRPZsZ6|qJiGm#%z#e32;gDX#?i|5kcOQKM-kGwH literal 0 HcmV?d00001 diff --git a/Poseiden-skeleton/target/classes/messages.properties b/Poseiden-skeleton/target/classes/messages.properties new file mode 100644 index 0000000000..5a5e3cc198 --- /dev/null +++ b/Poseiden-skeleton/target/classes/messages.properties @@ -0,0 +1 @@ +app.title=Simple App - Demo \ No newline at end of file diff --git a/Poseiden-skeleton/target/classes/static/css/bootstrap.min.css b/Poseiden-skeleton/target/classes/static/css/bootstrap.min.css new file mode 100644 index 0000000000..92e3fe8712 --- /dev/null +++ b/Poseiden-skeleton/target/classes/static/css/bootstrap.min.css @@ -0,0 +1,7 @@ +/*! + * Bootstrap v4.3.1 (https://getbootstrap.com/) + * Copyright 2011-2019 The Bootstrap Authors + * Copyright 2011-2019 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#7abaff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#b3b7bb}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#8fd19e}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#86cfda}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ffdf7e}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#ed969e}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#95999c}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#343a40}.table-dark td,.table-dark th,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.form-control.is-valid,.was-validated .form-control:valid{border-color:#28a745;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:center right calc(.375em + .1875rem);background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#28a745;padding-right:calc((1em + .75rem) * 3 / 4 + 1.75rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip{display:block}.form-control-file.is-valid~.valid-feedback,.form-control-file.is-valid~.valid-tooltip,.was-validated .form-control-file:valid~.valid-feedback,.was-validated .form-control-file:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{border-color:#28a745}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{border-color:#34ce57;background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E");background-repeat:no-repeat;background-position:center right calc(.375em + .1875rem);background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#dc3545;padding-right:calc((1em + .75rem) * 3 / 4 + 1.75rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip{display:block}.form-control-file.is-invalid~.invalid-feedback,.form-control-file.is-invalid~.invalid-tooltip,.was-validated .form-control-file:invalid~.invalid-feedback,.was-validated .form-control-file:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{border-color:#dc3545}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{border-color:#e4606d;background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;-ms-flex-negative:0;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;text-decoration:none}.btn-link:hover{color:#0056b3;text-decoration:underline}.btn-link.focus,.btn-link:focus{text-decoration:underline;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:1 1 auto;flex:1 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#007bff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#80bdff}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#b3d7ff;border-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:#adb5bd solid 1px}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:no-repeat 50%/50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{border-color:#007bff;background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label::after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff;-webkit-transform:translateX(.75rem);transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select-sm{height:calc(1.5em + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.5em + .75rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:disabled~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:calc(1rem + .4rem);padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-ms-flexbox;display:flex;-ms-flex:1 0 0%;flex:1 0 0%;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion>.card{overflow:hidden}.accordion>.card:not(:first-of-type) .card-header:first-child{border-radius:0}.accordion>.card:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.accordion>.card:first-of-type{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.accordion>.card .card-header{margin-bottom:-1px}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#0062cc}a.badge-primary.focus,a.badge-primary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#545b62}a.badge-secondary.focus,a.badge-secondary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#1e7e34}a.badge-success.focus,a.badge-success:focus{outline:0;box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#117a8b}a.badge-info.focus,a.badge-info:focus{outline:0;box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:focus,a.badge-warning:hover{color:#212529;background-color:#d39e00}a.badge-warning.focus,a.badge-warning:focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#bd2130}a.badge-danger.focus,a.badge-danger:focus{outline:0;box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:focus,a.badge-light:hover{color:#212529;background-color:#dae0e5}a.badge-light.focus,a.badge-light:focus{outline:0;box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#1d2124}a.badge-dark.focus,a.badge-dark:focus{outline:0;box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-horizontal{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}@media (min-width:576px){.list-group-horizontal-sm{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-sm .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-sm .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:768px){.list-group-horizontal-md{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-md .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-md .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:992px){.list-group-horizontal-lg{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-lg .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-lg .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:1200px){.list-group-horizontal-xl{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-xl .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-xl .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush .list-group-item:last-child{margin-bottom:-1px}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{margin-bottom:0;border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}a.close.disabled{pointer-events:none}.toast{max-width:350px;overflow:hidden;font-size:.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-50px);transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal-dialog-scrollable{display:-ms-flexbox;display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{-ms-flex-negative:0;flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);content:""}.modal-dialog-centered.modal-dialog-scrollable{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #dee2e6;border-bottom-right-radius:.3rem;border-bottom-left-radius:.3rem}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered::before{height:calc(100vh - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=top]>.arrow::before,.bs-popover-top>.arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top]>.arrow::after,.bs-popover-top>.arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow::before,.bs-popover-right>.arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right]>.arrow::after,.bs-popover-right>.arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=bottom]>.arrow::before,.bs-popover-bottom>.arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom]>.arrow::after,.bs-popover-bottom>.arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow::before,.bs-popover-left>.arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left]>.arrow::after,.bs-popover-left>.arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{-ms-touch-action:pan-y;touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){-webkit-transform:translateX(100%);transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){-webkit-transform:translateX(-100%);transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;-webkit-transform:none;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:0s .6s opacity}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:no-repeat 50%/100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:spinner-border .75s linear infinite;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:spinner-grow .75s linear infinite;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0056b3!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#a71d2a!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;overflow-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/Poseiden-skeleton/target/classes/templates/403.html b/Poseiden-skeleton/target/classes/templates/403.html new file mode 100644 index 0000000000..fa066d8ce1 --- /dev/null +++ b/Poseiden-skeleton/target/classes/templates/403.html @@ -0,0 +1,16 @@ + + + + Spring Boot + + +

Access Denied Exception

+
+ Logged in user: [[${#httpServletRequest.remoteUser}]] +
+ +
+
+

Error

+ + \ No newline at end of file diff --git a/Poseiden-skeleton/target/classes/templates/bidList/add.html b/Poseiden-skeleton/target/classes/templates/bidList/add.html new file mode 100644 index 0000000000..8e9bcf1877 --- /dev/null +++ b/Poseiden-skeleton/target/classes/templates/bidList/add.html @@ -0,0 +1,26 @@ + + + + +Home + + + +
+ +
+

Add New Bid

+
+ +
+
+ +
+
+ +
+ + \ No newline at end of file diff --git a/Poseiden-skeleton/target/classes/templates/bidList/list.html b/Poseiden-skeleton/target/classes/templates/bidList/list.html new file mode 100644 index 0000000000..4b67ad6d4e --- /dev/null +++ b/Poseiden-skeleton/target/classes/templates/bidList/list.html @@ -0,0 +1,46 @@ + + + + +Home + + + +
+
+
+ Bid List |  + Curve Points |  + Ratings |  + Trade |  + Rule +
+
+ Logged in user: [[${#httpServletRequest.remoteUser}]] +
+ +
+
+
+

Bid List

+
+ Add New + + + + + + + + + + + + + +
IdAccountTypeBid QuantityAction
+
+
+ + \ No newline at end of file diff --git a/Poseiden-skeleton/target/classes/templates/bidList/update.html b/Poseiden-skeleton/target/classes/templates/bidList/update.html new file mode 100644 index 0000000000..bf034a02da --- /dev/null +++ b/Poseiden-skeleton/target/classes/templates/bidList/update.html @@ -0,0 +1,25 @@ + + + + +Home + + + +
+
+

Update Bid

+
+ +
+
+ +
+
+ +
+ + \ No newline at end of file diff --git a/Poseiden-skeleton/target/classes/templates/curvePoint/add.html b/Poseiden-skeleton/target/classes/templates/curvePoint/add.html new file mode 100644 index 0000000000..df25715899 --- /dev/null +++ b/Poseiden-skeleton/target/classes/templates/curvePoint/add.html @@ -0,0 +1,27 @@ + + + + +Home + + + +
+ +
+

Add New Curve Point

+
+ +
+
+ + +
+
+ +
+ + \ No newline at end of file diff --git a/Poseiden-skeleton/target/classes/templates/curvePoint/list.html b/Poseiden-skeleton/target/classes/templates/curvePoint/list.html new file mode 100644 index 0000000000..bec05b5d15 --- /dev/null +++ b/Poseiden-skeleton/target/classes/templates/curvePoint/list.html @@ -0,0 +1,46 @@ + + + + +Home + + + +
+
+
+ Bid List |  + Curve Points |  + Ratings |  + Trade |  + Rule +
+
+ Logged in user: [[${#httpServletRequest.remoteUser}]] +
+ +
+
+
+

Curve Point List

+
+ Add New + + + + + + + + + + + + + +
IdCurvePointIdTermValueAction
+
+
+ + \ No newline at end of file diff --git a/Poseiden-skeleton/target/classes/templates/curvePoint/update.html b/Poseiden-skeleton/target/classes/templates/curvePoint/update.html new file mode 100644 index 0000000000..dff83d36c1 --- /dev/null +++ b/Poseiden-skeleton/target/classes/templates/curvePoint/update.html @@ -0,0 +1,25 @@ + + + + +Home + + + +
+
+

Update CurvePoint

+
+ +
+
+ +
+
+ +
+ + \ No newline at end of file diff --git a/Poseiden-skeleton/target/classes/templates/home.html b/Poseiden-skeleton/target/classes/templates/home.html new file mode 100644 index 0000000000..c470aac704 --- /dev/null +++ b/Poseiden-skeleton/target/classes/templates/home.html @@ -0,0 +1,13 @@ + + + + Spring Boot + + + +

HOME PAGE

+

+ Login or create one User management +

+ + \ No newline at end of file diff --git a/Poseiden-skeleton/target/classes/templates/rating/add.html b/Poseiden-skeleton/target/classes/templates/rating/add.html new file mode 100644 index 0000000000..51d002b641 --- /dev/null +++ b/Poseiden-skeleton/target/classes/templates/rating/add.html @@ -0,0 +1,27 @@ + + + + +Home + + + +
+ +
+

Add New Rating

+
+ +
+
+ + +
+
+ +
+ + \ No newline at end of file diff --git a/Poseiden-skeleton/target/classes/templates/rating/list.html b/Poseiden-skeleton/target/classes/templates/rating/list.html new file mode 100644 index 0000000000..f5b292673b --- /dev/null +++ b/Poseiden-skeleton/target/classes/templates/rating/list.html @@ -0,0 +1,47 @@ + + + + +Home + + + +
+
+
+ Bid List |  + Curve Points |  + Ratings |  + Trade |  + Rule +
+
+ Logged in user: [[${#httpServletRequest.remoteUser}]] +
+ +
+
+
+

Rating List

+
+ Add New + + + + + + + + + + + + + + +
IdMoodysRatingSandPRatingFitchRatingOrderAction
+
+
+ + \ No newline at end of file diff --git a/Poseiden-skeleton/target/classes/templates/rating/update.html b/Poseiden-skeleton/target/classes/templates/rating/update.html new file mode 100644 index 0000000000..046e158891 --- /dev/null +++ b/Poseiden-skeleton/target/classes/templates/rating/update.html @@ -0,0 +1,26 @@ + + + + + Home + + + +
+ +
+

Update Rating

+
+ +
+
+ +
+
+ +
+ + \ No newline at end of file diff --git a/Poseiden-skeleton/target/classes/templates/ruleName/add.html b/Poseiden-skeleton/target/classes/templates/ruleName/add.html new file mode 100644 index 0000000000..713a73ab7b --- /dev/null +++ b/Poseiden-skeleton/target/classes/templates/ruleName/add.html @@ -0,0 +1,27 @@ + + + + +Home + + + +
+ +
+

Add New Rule

+
+ +
+
+ + +
+
+ +
+ + \ No newline at end of file diff --git a/Poseiden-skeleton/target/classes/templates/ruleName/list.html b/Poseiden-skeleton/target/classes/templates/ruleName/list.html new file mode 100644 index 0000000000..a9b94978d8 --- /dev/null +++ b/Poseiden-skeleton/target/classes/templates/ruleName/list.html @@ -0,0 +1,49 @@ + + + + +Home + + + +
+
+
+ Bid List |  + Curve Points |  + Ratings |  + Trade |  + Rule +
+
+ Logged in user: [[${#httpServletRequest.remoteUser}]] +
+ +
+
+
+

Rule List

+
+ Add New + + + + + + + + + + + + + + + + +
IdNameDescriptionjsontemplatesqlsqlPartAction
+
+
+ + \ No newline at end of file diff --git a/Poseiden-skeleton/target/classes/templates/ruleName/update.html b/Poseiden-skeleton/target/classes/templates/ruleName/update.html new file mode 100644 index 0000000000..de0c103a80 --- /dev/null +++ b/Poseiden-skeleton/target/classes/templates/ruleName/update.html @@ -0,0 +1,27 @@ + + + + + Home + + + +
+ +
+

Update New Rule

+
+ +
+
+ + +
+
+ +
+ + \ No newline at end of file diff --git a/Poseiden-skeleton/target/classes/templates/trade/add.html b/Poseiden-skeleton/target/classes/templates/trade/add.html new file mode 100644 index 0000000000..75f774f4ba --- /dev/null +++ b/Poseiden-skeleton/target/classes/templates/trade/add.html @@ -0,0 +1,27 @@ + + + + +Home + + + +
+ +
+

Add New Trade

+
+ +
+
+ + +
+
+ +
+ + \ No newline at end of file diff --git a/Poseiden-skeleton/target/classes/templates/trade/list.html b/Poseiden-skeleton/target/classes/templates/trade/list.html new file mode 100644 index 0000000000..9f0408afa3 --- /dev/null +++ b/Poseiden-skeleton/target/classes/templates/trade/list.html @@ -0,0 +1,46 @@ + + + + +Home + + + +
+
+
+ Bid List |  + Curve Points |  + Ratings |  + Trade |  + Rule +
+
+ Logged in user: [[${#httpServletRequest.remoteUser}]] +
+ +
+
+
+

Trade List

+
+ Add New + + + + + + + + + + + + + +
IdAccountTypeBuy QuantityAction
+
+
+ + \ No newline at end of file diff --git a/Poseiden-skeleton/target/classes/templates/trade/update.html b/Poseiden-skeleton/target/classes/templates/trade/update.html new file mode 100644 index 0000000000..411dfc9e26 --- /dev/null +++ b/Poseiden-skeleton/target/classes/templates/trade/update.html @@ -0,0 +1,25 @@ + + + + +Home + + + +
+
+

Update Trade

+
+ +
+
+ +
+
+ +
+ + \ No newline at end of file diff --git a/Poseiden-skeleton/target/classes/templates/user/add.html b/Poseiden-skeleton/target/classes/templates/user/add.html new file mode 100644 index 0000000000..8fde2bbb6a --- /dev/null +++ b/Poseiden-skeleton/target/classes/templates/user/add.html @@ -0,0 +1,61 @@ + + + + +Home + + + +
+ +
+

Add New User

+
+ +
+
+
+ +
+ +

+
+
+
+ +
+ +

+
+
+
+ +
+ +

+
+
+
+ +
+ + +

+
+
+ + +
+
+ Cancel + +
+
+ +
+
+ +
+ + \ No newline at end of file diff --git a/Poseiden-skeleton/target/classes/templates/user/list.html b/Poseiden-skeleton/target/classes/templates/user/list.html new file mode 100644 index 0000000000..d5f524d303 --- /dev/null +++ b/Poseiden-skeleton/target/classes/templates/user/list.html @@ -0,0 +1,48 @@ + + + + +Home + + + +
+
+
+ +
+
+ Home | Login +
+
+

User List

+
+ Add New + + + + + + + + + + + + + + + + + + + +
IdFull NameUser NameRoleAction
+ Edit |  + Delete +
+
+
+ + \ No newline at end of file diff --git a/Poseiden-skeleton/target/classes/templates/user/update.html b/Poseiden-skeleton/target/classes/templates/user/update.html new file mode 100644 index 0000000000..0d471f56b2 --- /dev/null +++ b/Poseiden-skeleton/target/classes/templates/user/update.html @@ -0,0 +1,61 @@ + + + + + Home + + + +
+ +
+

Update User

+
+ +
+
+
+ +
+ +

+
+
+
+ +
+ +

+
+
+
+ +
+ +

+
+
+
+ +
+ + +
+
+ + +
+
+ + Cancel + +
+
+ +
+
+ +
+ + \ No newline at end of file diff --git a/Poseiden-skeleton/target/test-classes/com/nnk/springboot/BidTests.class b/Poseiden-skeleton/target/test-classes/com/nnk/springboot/BidTests.class new file mode 100644 index 0000000000000000000000000000000000000000..75becad04a4648a5640b0d3503b8cb50fae47b85 GIT binary patch literal 1225 zcmcIkOK%e~5FV#V({5AJh8Fsuu)U=S;R6vu1R=EuB%~FHCZyu%>^h0ljUCzEl>8We z1gA1E#b1Qv3X z)!J-Em~CS^4mUHLS6X&I!2+nesTW}vGcKn1R%@l#;65SWK1xnS75T+)#o}q~w~S+%JUfp=b&t7AFXLo~d$+!lC%=mVdQ0 z)l!W%(gj5ZBtn90V7k9c=n3o$_c~Q090RTe{s0K%pa83Ai|9GKhBk*5R|L-u^e9?_ zw($5GO5fAZckpz<0NYT;vor~SE%Y5}1;M#FWA0I?`xtpET3 literal 0 HcmV?d00001 diff --git a/Poseiden-skeleton/target/test-classes/com/nnk/springboot/CurvePointTests.class b/Poseiden-skeleton/target/test-classes/com/nnk/springboot/CurvePointTests.class new file mode 100644 index 0000000000000000000000000000000000000000..3b33357cbe5c39fcc89c45a3e9ca924c5259b882 GIT binary patch literal 1241 zcmcgsOK%e~5FT%nrd>i)LJDnpZ4rkQA$*A{L=aM`KthTDH6ay8XV*!bX6?xKru0|v zTR2q$3GVzT#CY@Aw8{kzTs#`@eBV6$&HnoR?FRtVV6Olkfrp`rsg$SGjI@xwj#8E$ zC3?(1C?Rc&8*2)XBd|GOV@8Ke_UQZ0fQObqC7j0{^N}*bDt%7ips|Ef&jJKD3;Y?b zPGILakygaKEsW?4`Jt4`GAooc1fDgN?oDg#Y8LY|rB7*xGihj-g)TE?a{xU|tU42# zM@YN+LP%j>5?HD3w+ZBqRK$H)f$K$B2cJNxAtZm7#2v0%4D%8wH&n=mZKj3ur1D@uK6IVpo-7-B#2aku`|0L2ooeS;$3VtnxJED`zi{0 z+`f&fmji+>GFr@F&qsWL`YJF@`fq5%?F^0e{`d5M)wK^5*l}XnC9qX(WKY(#Ze{9D zRen^aS<__dJy$>;Y~D{tyUwkcU;Y1@xR)ZLV?gz@)~<$eecAOQFS>1t|U literal 0 HcmV?d00001 diff --git a/Poseiden-skeleton/target/test-classes/com/nnk/springboot/PasswordEncodeTest.class b/Poseiden-skeleton/target/test-classes/com/nnk/springboot/PasswordEncodeTest.class new file mode 100644 index 0000000000000000000000000000000000000000..13dd772428ba9ac20334b8b470ddb72ec04dfbaf GIT binary patch literal 1249 zcmbtT+foxj5IqwD32`+LE)hfxDw1#;fq<7FVkmuzN*O8^W%;n#j4+tY#?36qXX!(z zk}5yIkFxC94F%CWSmn#~%=Gl>(>Oiqx51VA#9K{Is{N|#YQAH) zTF0(ed!Zb+CU!+j#}H*0I<${$Ubodge^Wgaj%FCxkV@)JhQ4gB!Vul2_X+f2&_X{3 z7?LHa#B0A%72d90tqX=!$#v{{#rC8*cP^v)K(-iWOaDZsz+h=2bxxCE;;pZ=Y>0|% zNkV2jEq0;3$6sIX#*bORcnjw9WEd(w4vR)Hj z9CsNa?=uNxFk}AaKEYh()}fHAm={?KIm}TRcC#r|jbX9Z)4vMnFic(&ndd7dJWi5)C-nhg^dH%EpTgIBQZ-8Ej;plz zqC=VHc{!LxLLeXl=p7i0YFBg^R-_RQgpO&DWN6lb2<>PfX^qi|lVxQ4=S~s-8n_d* z8aGJAS7^1u2V}3(iQyV~BS>~$4UsiKKB7T_`7;dfonoXkpBimr{M9#1o*}cBx^s$q z3vJA%=4okTv5n=6bSVl3MnOYFz~h)hI!K)fAv>u_xmd?TqL9QC9^o<3h~NoDMofgc5S>kvrZs_t&_Y|FxVID`RzeX%1R)g!5>iB^BouLU>`Ahzy&LVWQ~DeD zHJmDe1b2QEV%82#T5^B`mmSY~-kXno^W*22ZvfDQy)qOS?1n1gQXX?N(LxUUN?G0s zEPeLSSW|`~gW5Ql20RYrkRSHP7+Sj0Sxg5f$_T6UDT7DtB~ij-p4>1J_tgWl?Uelevn#qA~Z%syZTH> zVV^TtY3v^{D85t?dawdlE3gh8gKAqye48eH)V+Z6GN`vz7{o_`7S5kt7VSt-A^x(? z7KTI#y?h>SW;C3v@Nr5daCg%x!zSgNPw|!3O0U5!#y-818jXsl82L25iHNiA{fSmo zMq-}&-g<9@^iLYAQ`fYgXKr+@d$0%oWh@e7DwCB&2Pq^ijc<90z>?}OJPNhW6N#XB>9g#>%(;!X>_jswWEh&Z5J6rr{c_yAF?`BI$ z3`9f(%YoU>UO?xt7qrWn{9q4g6KLrf6rcpFWXt3^yGFJ^mbQYu<@aO^9;7WlUIN_+tvb`H)AWn V?JVj}##g2IyTq~^!aeW-egT?(ULODe literal 0 HcmV?d00001 diff --git a/Poseiden-skeleton/target/test-classes/com/nnk/springboot/RuleTests.class b/Poseiden-skeleton/target/test-classes/com/nnk/springboot/RuleTests.class new file mode 100644 index 0000000000000000000000000000000000000000..51f258b4fdf9dcf51706e435c2a77d7dfed10f95 GIT binary patch literal 1222 zcmbVLO>Yx15FKxmCS5{PLJMsvWqV5z!j}jkf{+RV2`MU45`s87yH4VC*N$v&O8*Ie zgHt7t;LeXij5i@4CuKM|0D=*GTvoWoxnje zl~yFYBaGQZPPA?@aK zA%%TGV5554A&`5eBJRTm+$_Ns_yo!gA^CZlbh&Ob)WxP6Dr9koY2ohE$DADqEaZ4q zZ?iF>T+vO$%?#(26+KK*p1PNM0rpUDKE>BsD_w-UgnWK4H8(0A^C-aKjYOPv9*nfY z5)$()@VD9nj^CuQI&}>PPSp*u+OqD4JqrFUo(94Msf>6J`;I2G3AY0k1$}PcM%Cqn zpodZxrR~*-&ouvrWp%6#G~6yUur?ga{Xg9``t)HJ4xCdC3G7uH^M5xPcHLRZZ>dy= z{Ecwt*`ArB1R7*E(e}B@J2BbjQNMxQ2LU6 z-p11<1Kff#o~20w?BLyzRuJsXC~xDNBdVdK!}#A|_haSGHSGVun+J2Y{RK9E%I3kn UEbA!aD`WnBWH}Du0R#ZQ0kEWB#sB~S literal 0 HcmV?d00001 diff --git a/Poseiden-skeleton/target/test-classes/com/nnk/springboot/TradeTests.class b/Poseiden-skeleton/target/test-classes/com/nnk/springboot/TradeTests.class new file mode 100644 index 0000000000000000000000000000000000000000..2702b7860ac39edf8dfc48f226903038251b0920 GIT binary patch literal 1189 zcmcIj&ubGw6n?W!nr4lr##Y;E?e><6I0!++h!90V2ntP%c%1A`l1X=G!pv-H{wz-g z1-<)6iEnn(ZY#O;;AI{&^S`rhw9-+ux?3l1yb5!eq^LZv*RW~PN450$dCuUW+V z+*nhA5`oPrn==|SIi??nQyy9Zb?aP?`AivMm0l2d+Fe1U&m9CeIcouF6WBdYr4yq0id1Ks#BqPgtY4~g%tJ` zfwkt*fI#VuintGJaI*$g@G<$Wko-fM47u(zj7y-=RUwN9Obd5kK9=l6U?K;r3M)E< z@v2!fT)(haS=!SS6QJ&;U4d`uAA7NQhj!C$ks3;h7n<3su&8uF)2+1sx z+r^CMtp5T#VW@CC*901F&w;D5`)_ftRjChKuczaDIBx=bm*%WfDY>R7=Fh@TP!Q!gi&KO>Td84-vY Date: Mon, 6 Dec 2021 18:21:12 +0100 Subject: [PATCH 02/12] BidList Entity Finished with all the tests commit 78516eb8cfbbf91a768fabeb55f0085527350407 Author: Florent TRIMOREAU Date: Mon Dec 06 09:01:41 2021 +0100 Testing service class not working commit d924163068aabd7767f6dbccde237c05d16d9166 Author: Florent TRIMOREAU Date: Fri Dec 03 18:51:17 2021 +0100 Testing first Controller --- Poseiden-skeleton/.classpath | 1 + Poseiden-skeleton/pom.xml | 53 +++++- .../Exceptions/AlreadyExistException.java | 13 ++ .../controllers/BidListController.java | 104 +++++++----- .../com/nnk/springboot/domain/BidList.java | 67 +++++++- .../com/nnk/springboot/domain/CurvePoint.java | 10 +- .../com/nnk/springboot/domain/Rating.java | 10 ++ .../com/nnk/springboot/domain/RuleName.java | 10 ++ .../java/com/nnk/springboot/domain/Trade.java | 10 ++ .../java/com/nnk/springboot/domain/User.java | 47 +++++- .../repositories/BidListRepository.java | 2 + .../repositories/UserRepository.java | 7 +- .../security/SpringSecurityConfig.java | 59 +++++++ .../security/UserDetailsServiceImpl.java | 26 +++ .../springboot/services/BidListService.java | 56 +++++++ .../src/main/resources/application.properties | 9 +- .../main/resources/templates/bidList/add.html | 29 +++- .../resources/templates/bidList/list.html | 14 +- .../resources/templates/bidList/update.html | 31 +++- .../com/nnk/springboot/CurvePointTests.java | 94 +++++------ .../java/com/nnk/springboot/RatingTests.java | 92 +++++------ .../java/com/nnk/springboot/RuleTests.java | 92 +++++------ .../java/com/nnk/springboot/TradeTests.java | 92 +++++------ .../controllers/BidListControllerTests.java | 155 ++++++++++++++++++ .../services/BidListServicesTest.java | 119 ++++++++++++++ .../Exceptions/AlreadyExistException.class | Bin 0 -> 471 bytes .../target/classes/META-INF/MANIFEST.MF | 6 +- .../spring-boot-skeleton/pom.properties | 2 +- .../spring-boot-skeleton/pom.xml | 53 +++++- .../target/classes/application.properties | 9 +- .../controllers/BidListController.class | Bin 2489 -> 3891 bytes .../com/nnk/springboot/domain/BidList.class | Bin 421 -> 7104 bytes .../nnk/springboot/domain/CurvePoint.class | Bin 433 -> 850 bytes .../com/nnk/springboot/domain/Rating.class | Bin 417 -> 834 bytes .../com/nnk/springboot/domain/RuleName.class | Bin 425 -> 842 bytes .../com/nnk/springboot/domain/Trade.class | Bin 413 -> 830 bytes .../com/nnk/springboot/domain/User.class | Bin 2023 -> 3049 bytes .../repositories/BidListRepository.class | Bin 360 -> 482 bytes .../repositories/UserRepository.class | Bin 523 -> 803 bytes .../security/SpringSecurityConfig.class | Bin 0 -> 4377 bytes .../security/UserDetailsServiceImpl.class | Bin 0 -> 2326 bytes .../springboot/services/BidListService.class | Bin 0 -> 3460 bytes .../target/classes/templates/bidList/add.html | 29 +++- .../classes/templates/bidList/list.html | 14 +- .../classes/templates/bidList/update.html | 31 +++- .../com/nnk/springboot/BidTests.class | Bin 1225 -> 2239 bytes .../com/nnk/springboot/CurvePointTests.class | Bin 1241 -> 0 bytes .../com/nnk/springboot/RatingTests.class | Bin 1213 -> 0 bytes .../com/nnk/springboot/RuleTests.class | Bin 1222 -> 0 bytes .../com/nnk/springboot/TradeTests.class | Bin 1189 -> 0 bytes .../controllers/BidListControllerTests.class | Bin 0 -> 8210 bytes .../services/BidListServicesTest.class | Bin 0 -> 6282 bytes 52 files changed, 1081 insertions(+), 265 deletions(-) create mode 100644 Poseiden-skeleton/src/main/java/Exceptions/AlreadyExistException.java create mode 100644 Poseiden-skeleton/src/main/java/com/nnk/springboot/security/SpringSecurityConfig.java create mode 100644 Poseiden-skeleton/src/main/java/com/nnk/springboot/security/UserDetailsServiceImpl.java create mode 100644 Poseiden-skeleton/src/main/java/com/nnk/springboot/services/BidListService.java create mode 100644 Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/BidListControllerTests.java create mode 100644 Poseiden-skeleton/src/test/java/com/nnk/springboot/services/BidListServicesTest.java create mode 100644 Poseiden-skeleton/target/classes/Exceptions/AlreadyExistException.class create mode 100644 Poseiden-skeleton/target/classes/com/nnk/springboot/security/SpringSecurityConfig.class create mode 100644 Poseiden-skeleton/target/classes/com/nnk/springboot/security/UserDetailsServiceImpl.class create mode 100644 Poseiden-skeleton/target/classes/com/nnk/springboot/services/BidListService.class delete mode 100644 Poseiden-skeleton/target/test-classes/com/nnk/springboot/CurvePointTests.class delete mode 100644 Poseiden-skeleton/target/test-classes/com/nnk/springboot/RatingTests.class delete mode 100644 Poseiden-skeleton/target/test-classes/com/nnk/springboot/RuleTests.class delete mode 100644 Poseiden-skeleton/target/test-classes/com/nnk/springboot/TradeTests.class create mode 100644 Poseiden-skeleton/target/test-classes/com/nnk/springboot/controllers/BidListControllerTests.class create mode 100644 Poseiden-skeleton/target/test-classes/com/nnk/springboot/services/BidListServicesTest.class diff --git a/Poseiden-skeleton/.classpath b/Poseiden-skeleton/.classpath index a5d95095cc..8db55780fa 100644 --- a/Poseiden-skeleton/.classpath +++ b/Poseiden-skeleton/.classpath @@ -28,5 +28,6 @@ + diff --git a/Poseiden-skeleton/pom.xml b/Poseiden-skeleton/pom.xml index e028ef190e..70cca3c4ba 100644 --- a/Poseiden-skeleton/pom.xml +++ b/Poseiden-skeleton/pom.xml @@ -15,7 +15,7 @@ org.springframework.boot spring-boot-starter-parent - 2.0.4.RELEASE + 2.5.2 @@ -47,6 +47,11 @@ org.springframework.boot spring-boot-starter-security + + org.springframework.security + spring-security-test + test + org.springframework.boot spring-boot-devtools @@ -78,6 +83,19 @@ jaxb-runtime 2.3.2 + + org.javassist + javassist + 3.23.1-GA + + + org.hibernate.validator + hibernate-validator + + + org.hibernate.validator + hibernate-validator-annotation-processor + @@ -86,6 +104,39 @@ org.springframework.boot spring-boot-maven-plugin + + org.apache.maven.plugins + maven-surefire-plugin + + + org.junit.platform + junit-platform-surefire-provider + 1.2.0 + + + + + **/*IT.java + + + + + integration-test + + test + + integration-test + + + none + + + **/*IT.java + + + + + diff --git a/Poseiden-skeleton/src/main/java/Exceptions/AlreadyExistException.java b/Poseiden-skeleton/src/main/java/Exceptions/AlreadyExistException.java new file mode 100644 index 0000000000..af497a786e --- /dev/null +++ b/Poseiden-skeleton/src/main/java/Exceptions/AlreadyExistException.java @@ -0,0 +1,13 @@ +package Exceptions; + + +public class AlreadyExistException extends Exception { + /** + * + */ + private static final long serialVersionUID = 7199678130285702283L; + + public AlreadyExistException(String message) { + super(message); + } +} \ No newline at end of file diff --git a/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/BidListController.java b/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/BidListController.java index a31b9b53ca..8c8f40c624 100644 --- a/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/BidListController.java +++ b/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/BidListController.java @@ -1,55 +1,79 @@ package com.nnk.springboot.controllers; -import com.nnk.springboot.domain.BidList; +import javax.persistence.EntityNotFoundException; +import javax.validation.Valid; + +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; -import javax.validation.Valid; +import com.nnk.springboot.domain.BidList; +import com.nnk.springboot.services.BidListService; +import Exceptions.AlreadyExistException; @Controller public class BidListController { - // TODO: Inject Bid service - - @RequestMapping("/bidList/list") - public String home(Model model) - { - // TODO: call service find all bids to show to the view - return "bidList/list"; - } - - @GetMapping("/bidList/add") - public String addBidForm(BidList bid) { - return "bidList/add"; - } - - @PostMapping("/bidList/validate") - public String validate(@Valid BidList bid, BindingResult result, Model model) { - // TODO: check data valid and save to db, after saving return bid list - return "bidList/add"; - } - - @GetMapping("/bidList/update/{id}") - public String showUpdateForm(@PathVariable("id") Integer id, Model model) { - // TODO: get Bid by Id and to model then show to the form - return "bidList/update"; - } - - @PostMapping("/bidList/update/{id}") - public String updateBid(@PathVariable("id") Integer id, @Valid BidList bidList, - BindingResult result, Model model) { - // TODO: check required fields, if valid call service to update Bid and return list Bid - return "redirect:/bidList/list"; - } - - @GetMapping("/bidList/delete/{id}") - public String deleteBid(@PathVariable("id") Integer id, Model model) { - // TODO: Find Bid by Id and delete the bid, return to Bid list - return "redirect:/bidList/list"; - } + + @Autowired + private BidListService bidListService; + + @RequestMapping("/bidList/list") + public String home(Model model) { + model.addAttribute("bidLists", bidListService.findAll()); + return "bidList/list"; + } + + @GetMapping("/bidList/add") + public String addBidForm(Model model) { + model.addAttribute("bidList", new BidList()); + return "bidList/add"; + } + + @PostMapping("/bidList/validate") + public String validate(@Valid @ModelAttribute("bidList") BidList bid, BindingResult result, Model model) { + if (result.hasErrors()) { + return "bidList/add"; + } else { + try { + bidListService.createBidList(bid); + } catch (AlreadyExistException e) { + model.addAttribute("message", e.getMessage()); + } + return "redirect:/bidList/list"; + } + } + + @GetMapping("/bidList/update/{id}") + public String showUpdateForm(@PathVariable("id") Integer id, Model model) { + BidList bidList = bidListService.findById(id); + model.addAttribute("bidList", bidList); + return "bidList/update"; + } + + @PostMapping("/bidList/update/{id}") + public String updateBid(@PathVariable("id") Integer id, @Valid BidList bidList, BindingResult result, Model model) { + if (result.hasErrors()) { + return "bidList/update"; + } else { + try { + bidListService.updateBidList(bidList, id); + } catch (EntityNotFoundException e) { + model.addAttribute("message", e.getMessage()); + } + return "redirect:/bidList/list"; + } + } + + @GetMapping("/bidList/delete/{id}") + public String deleteBid(@PathVariable("id") Integer id, Model model) { + bidListService.deleteById(id); + return "redirect:/bidList/list"; + } } diff --git a/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/BidList.java b/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/BidList.java index 3a0e27efc8..8170ab5954 100644 --- a/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/BidList.java +++ b/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/BidList.java @@ -1,15 +1,70 @@ package com.nnk.springboot.domain; -import org.springframework.beans.factory.annotation.Required; +import java.sql.Timestamp; -import javax.persistence.*; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; import javax.validation.constraints.Digits; -import javax.validation.constraints.NotBlank; -import java.sql.Date; -import java.sql.Timestamp; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; @Entity +@Getter +@Setter @Table(name = "bidlist") +@NoArgsConstructor +@ToString public class BidList { - // TODO: Map columns in data table BIDLIST with corresponding java fields + + public BidList(String account, String type, Double bidQuantity) { + this.account = account; + this.type = type; + this.bidQuantity = bidQuantity; + } + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "BidListId") + private Integer BidListId; + + @NotEmpty(message = "Account is mandatory") + private String account; + + @NotEmpty(message = "Type is mandatory") + private String type; + + @NotNull(message = "Bid quantity is mandatory") + @Min(value = 0, message = "bidQuantity must be positive") + @Column(name = "bidQuantity") + private Double bidQuantity; + + private Double askQuantity; + private Double bid; + private Double ask; + private String benchmark; + private Timestamp bidListDate; + private String commentary; + private String security; + private String status; + private String trader; + private String book; + private String creationName; + private Timestamp creationDate; + private String revisionName; + private Timestamp revisionDate; + private String dealName; + private String dealType; + private String sourceListId; + private String side; + } diff --git a/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/CurvePoint.java b/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/CurvePoint.java index 151f80d02f..1c4f1cd179 100644 --- a/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/CurvePoint.java +++ b/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/CurvePoint.java @@ -2,6 +2,9 @@ import org.hibernate.validator.constraints.Length; +import lombok.Getter; +import lombok.Setter; + import javax.persistence.*; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; @@ -9,7 +12,12 @@ @Entity +@Getter +@Setter @Table(name = "curvepoint") public class CurvePoint { - // TODO: Map columns in data table CURVEPOINT with corresponding java fields + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Integer Id; } diff --git a/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/Rating.java b/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/Rating.java index 12d1be58c0..a8988eb119 100644 --- a/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/Rating.java +++ b/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/Rating.java @@ -3,10 +3,20 @@ import javax.persistence.*; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; + +import lombok.Getter; +import lombok.Setter; + import java.sql.Timestamp; @Entity +@Getter +@Setter @Table(name = "rating") public class Rating { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Integer Id; // TODO: Map columns in data table RATING with corresponding java fields } diff --git a/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/RuleName.java b/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/RuleName.java index b8ac970edf..ceadf32a4c 100644 --- a/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/RuleName.java +++ b/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/RuleName.java @@ -2,10 +2,20 @@ import javax.persistence.*; import javax.validation.constraints.NotBlank; + +import lombok.Getter; +import lombok.Setter; + import java.sql.Timestamp; @Entity +@Getter +@Setter @Table(name = "rulename") public class RuleName { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Integer Id; // TODO: Map columns in data table RULENAME with corresponding java fields } diff --git a/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/Trade.java b/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/Trade.java index b6db7c13b7..40de92d26a 100644 --- a/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/Trade.java +++ b/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/Trade.java @@ -2,11 +2,21 @@ import javax.persistence.*; import javax.validation.constraints.NotBlank; + +import lombok.Getter; +import lombok.Setter; + import java.sql.Timestamp; @Entity +@Getter +@Setter @Table(name = "trade") public class Trade { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Integer Id; // TODO: Map columns in data table TRADE with corresponding java fields } diff --git a/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/User.java b/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/User.java index 2be0b8c4ab..13ebc7c066 100644 --- a/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/User.java +++ b/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/User.java @@ -1,12 +1,24 @@ package com.nnk.springboot.domain; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + import javax.persistence.*; import javax.validation.constraints.NotBlank; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; + @Entity @Table(name = "users") -public class User { - @Id +public class User implements UserDetails { + /** + * + */ + private static final long serialVersionUID = 3635251098002037167L; + @Id @GeneratedValue(strategy= GenerationType.AUTO) private Integer id; @NotBlank(message = "Username is mandatory") @@ -57,4 +69,35 @@ public String getRole() { public void setRole(String role) { this.role = role; } + + @Override + public Collection getAuthorities() { + List grantedAuthorityList = new ArrayList<>(); + grantedAuthorityList.add(new SimpleGrantedAuthority(this.role)); + return grantedAuthorityList; + } + + @Override + public boolean isAccountNonExpired() { + // TODO Auto-generated method stub + return true; + } + + @Override + public boolean isAccountNonLocked() { + // TODO Auto-generated method stub + return true; + } + + @Override + public boolean isCredentialsNonExpired() { + // TODO Auto-generated method stub + return true; + } + + @Override + public boolean isEnabled() { + // TODO Auto-generated method stub + return true; + } } diff --git a/Poseiden-skeleton/src/main/java/com/nnk/springboot/repositories/BidListRepository.java b/Poseiden-skeleton/src/main/java/com/nnk/springboot/repositories/BidListRepository.java index f74b94e51d..6e07733f86 100644 --- a/Poseiden-skeleton/src/main/java/com/nnk/springboot/repositories/BidListRepository.java +++ b/Poseiden-skeleton/src/main/java/com/nnk/springboot/repositories/BidListRepository.java @@ -5,5 +5,7 @@ public interface BidListRepository extends JpaRepository { + + BidList findByAccount(String account); } diff --git a/Poseiden-skeleton/src/main/java/com/nnk/springboot/repositories/UserRepository.java b/Poseiden-skeleton/src/main/java/com/nnk/springboot/repositories/UserRepository.java index b6a3363949..3a85129717 100644 --- a/Poseiden-skeleton/src/main/java/com/nnk/springboot/repositories/UserRepository.java +++ b/Poseiden-skeleton/src/main/java/com/nnk/springboot/repositories/UserRepository.java @@ -1,12 +1,17 @@ package com.nnk.springboot.repositories; import com.nnk.springboot.domain.User; + +import java.util.Optional; + import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; - +@Repository public interface UserRepository extends JpaRepository, JpaSpecificationExecutor { + Optional findByUsername(String username); } diff --git a/Poseiden-skeleton/src/main/java/com/nnk/springboot/security/SpringSecurityConfig.java b/Poseiden-skeleton/src/main/java/com/nnk/springboot/security/SpringSecurityConfig.java new file mode 100644 index 0000000000..43e1d80e78 --- /dev/null +++ b/Poseiden-skeleton/src/main/java/com/nnk/springboot/security/SpringSecurityConfig.java @@ -0,0 +1,59 @@ +package com.nnk.springboot.security; + +import javax.annotation.Resource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.authentication.dao.DaoAuthenticationProvider; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; + +@Configuration +@EnableWebSecurity +public class SpringSecurityConfig extends WebSecurityConfigurerAdapter { + + @Autowired + private PasswordEncoder passwordEncoder; + + @Resource + private UserDetailsServiceImpl userDetailsServiceImpl; + + @Override + public void configure(HttpSecurity http) throws Exception { + http.authorizeRequests() + .antMatchers("/").permitAll() + .anyRequest().authenticated() + .and().formLogin() + .and().logout().logoutSuccessUrl("/") + + + + ; + } + + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } + + @Bean + public DaoAuthenticationProvider authProvider() { + DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider(); + authProvider.setUserDetailsService(this.userDetailsServiceImpl); + authProvider.setPasswordEncoder(this.passwordEncoder); + return authProvider; + } + + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + + auth.authenticationProvider(authProvider()); + + } + +} diff --git a/Poseiden-skeleton/src/main/java/com/nnk/springboot/security/UserDetailsServiceImpl.java b/Poseiden-skeleton/src/main/java/com/nnk/springboot/security/UserDetailsServiceImpl.java new file mode 100644 index 0000000000..104c8f81f3 --- /dev/null +++ b/Poseiden-skeleton/src/main/java/com/nnk/springboot/security/UserDetailsServiceImpl.java @@ -0,0 +1,26 @@ +package com.nnk.springboot.security; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; + +import com.nnk.springboot.repositories.UserRepository; + +@Service +public class UserDetailsServiceImpl implements UserDetailsService { + + @Autowired + private UserRepository userRepository; + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + return userRepository.findByUsername(username) + .orElseThrow(() -> { + return new UsernameNotFoundException( + "Username " + username + " not found"); + }); + } + +} diff --git a/Poseiden-skeleton/src/main/java/com/nnk/springboot/services/BidListService.java b/Poseiden-skeleton/src/main/java/com/nnk/springboot/services/BidListService.java new file mode 100644 index 0000000000..fb255d8bdb --- /dev/null +++ b/Poseiden-skeleton/src/main/java/com/nnk/springboot/services/BidListService.java @@ -0,0 +1,56 @@ +package com.nnk.springboot.services; + +import java.sql.Timestamp; +import java.util.List; + +import javax.persistence.EntityNotFoundException; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.nnk.springboot.domain.BidList; +import com.nnk.springboot.repositories.BidListRepository; + +import Exceptions.AlreadyExistException; + + + +@Service +public class BidListService { + + @Autowired + private BidListRepository bidListRepository; + + public List findAll() { + return bidListRepository.findAll(); + } + + public BidList createBidList(BidList bidList) throws AlreadyExistException { + if (bidListRepository.findByAccount(bidList.getAccount()) != null) { + throw new AlreadyExistException("This BidList already exists"); + } + bidList.setCreationDate(new Timestamp(System.currentTimeMillis())); + return bidListRepository.save(bidList); + } + + public BidList updateBidList(BidList bidList, int id) throws EntityNotFoundException { + if (bidListRepository.findById(id) == null) { + throw new EntityNotFoundException("BidList does not exists"); + } + BidList updatedBidList = bidListRepository.getById(id); + updatedBidList.setAccount(bidList.getAccount()); + updatedBidList.setType(bidList.getType()); + updatedBidList.setBidQuantity(bidList.getBidQuantity()); + updatedBidList.setRevisionDate(new Timestamp(System.currentTimeMillis())); + return bidListRepository.save(updatedBidList); + } + + public BidList findById(int id) { + return bidListRepository.findById(id).orElseThrow(() -> new EntityNotFoundException("BidList does not exists")); + } + + public void deleteById(int id) { + bidListRepository.deleteById(id); + } + +} diff --git a/Poseiden-skeleton/src/main/resources/application.properties b/Poseiden-skeleton/src/main/resources/application.properties index 8b194cc76e..dd0e5e23ca 100644 --- a/Poseiden-skeleton/src/main/resources/application.properties +++ b/Poseiden-skeleton/src/main/resources/application.properties @@ -3,12 +3,13 @@ logging.level.org.springframework=INFO ################### DataSource Configuration ########################## spring.datasource.driver-class-name=com.mysql.jdbc.Driver -spring.datasource.url=jdbc:mysql://localhost:3306/demo -spring.datasource.username=root -spring.datasource.password= +spring.datasource.url=jdbc:mysql://localhost:3306/demo?useSSL=false +spring.datasource.username=Draflo@localhost +spring.datasource.password=rootroot ################### Hibernate Configuration ########################## spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true - +spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl +spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl \ No newline at end of file diff --git a/Poseiden-skeleton/src/main/resources/templates/bidList/add.html b/Poseiden-skeleton/src/main/resources/templates/bidList/add.html index c0fb91a99e..94e33a5e31 100644 --- a/Poseiden-skeleton/src/main/resources/templates/bidList/add.html +++ b/Poseiden-skeleton/src/main/resources/templates/bidList/add.html @@ -15,9 +15,32 @@

Add New Bid

- +
+ +
+ +

+
+
+
+ +
+ +

+
+
+
+ +
+ +
+
+
+
+ Cancel + +
+
diff --git a/Poseiden-skeleton/src/main/resources/templates/bidList/list.html b/Poseiden-skeleton/src/main/resources/templates/bidList/list.html index 84a1d14a12..9977fee8e5 100644 --- a/Poseiden-skeleton/src/main/resources/templates/bidList/list.html +++ b/Poseiden-skeleton/src/main/resources/templates/bidList/list.html @@ -37,7 +37,19 @@ - + + You don't have any bit list registered + + + Bid List Id + Account + Type + Bid Quantity + + Edit |  + Delete + + diff --git a/Poseiden-skeleton/src/main/resources/templates/bidList/update.html b/Poseiden-skeleton/src/main/resources/templates/bidList/update.html index 7786ebd1ff..514b29c77c 100644 --- a/Poseiden-skeleton/src/main/resources/templates/bidList/update.html +++ b/Poseiden-skeleton/src/main/resources/templates/bidList/update.html @@ -14,9 +14,34 @@

Update Bid

- +
+ +
+ +

+
+
+
+ +
+ +

+
+
+
+ +
+ +
+
+ +
+
+ Cancel + +
+
+
diff --git a/Poseiden-skeleton/src/test/java/com/nnk/springboot/CurvePointTests.java b/Poseiden-skeleton/src/test/java/com/nnk/springboot/CurvePointTests.java index 854615c0a0..dc083ce8c9 100644 --- a/Poseiden-skeleton/src/test/java/com/nnk/springboot/CurvePointTests.java +++ b/Poseiden-skeleton/src/test/java/com/nnk/springboot/CurvePointTests.java @@ -1,47 +1,47 @@ -package com.nnk.springboot; - -import com.nnk.springboot.domain.CurvePoint; -import com.nnk.springboot.repositories.CurvePointRepository; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -import java.util.List; -import java.util.Optional; - -@RunWith(SpringRunner.class) -@SpringBootTest -public class CurvePointTests { - - @Autowired - private CurvePointRepository curvePointRepository; - - @Test - public void curvePointTest() { - CurvePoint curvePoint = new CurvePoint(10, 10d, 30d); - - // Save - curvePoint = curvePointRepository.save(curvePoint); - Assert.assertNotNull(curvePoint.getId()); - Assert.assertTrue(curvePoint.getCurveId() == 10); - - // Update - curvePoint.setCurveId(20); - curvePoint = curvePointRepository.save(curvePoint); - Assert.assertTrue(curvePoint.getCurveId() == 20); - - // Find - List listResult = curvePointRepository.findAll(); - Assert.assertTrue(listResult.size() > 0); - - // Delete - Integer id = curvePoint.getId(); - curvePointRepository.delete(curvePoint); - Optional curvePointList = curvePointRepository.findById(id); - Assert.assertFalse(curvePointList.isPresent()); - } - -} +//package com.nnk.springboot; +// +//import com.nnk.springboot.domain.CurvePoint; +//import com.nnk.springboot.repositories.CurvePointRepository; +//import org.junit.Assert; +//import org.junit.Test; +//import org.junit.runner.RunWith; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.test.context.SpringBootTest; +//import org.springframework.test.context.junit4.SpringRunner; +// +//import java.util.List; +//import java.util.Optional; +// +//@RunWith(SpringRunner.class) +//@SpringBootTest +//public class CurvePointTests { +// +// @Autowired +// private CurvePointRepository curvePointRepository; +// +// @Test +// public void curvePointTest() { +// CurvePoint curvePoint = new CurvePoint(10, 10d, 30d); +// +// // Save +// curvePoint = curvePointRepository.save(curvePoint); +// Assert.assertNotNull(curvePoint.getId()); +// Assert.assertTrue(curvePoint.getCurveId() == 10); +// +// // Update +// curvePoint.setCurveId(20); +// curvePoint = curvePointRepository.save(curvePoint); +// Assert.assertTrue(curvePoint.getCurveId() == 20); +// +// // Find +// List listResult = curvePointRepository.findAll(); +// Assert.assertTrue(listResult.size() > 0); +// +// // Delete +// Integer id = curvePoint.getId(); +// curvePointRepository.delete(curvePoint); +// Optional curvePointList = curvePointRepository.findById(id); +// Assert.assertFalse(curvePointList.isPresent()); +// } +// +//} diff --git a/Poseiden-skeleton/src/test/java/com/nnk/springboot/RatingTests.java b/Poseiden-skeleton/src/test/java/com/nnk/springboot/RatingTests.java index 6c3ebf0b08..9671dab96a 100644 --- a/Poseiden-skeleton/src/test/java/com/nnk/springboot/RatingTests.java +++ b/Poseiden-skeleton/src/test/java/com/nnk/springboot/RatingTests.java @@ -1,46 +1,46 @@ -package com.nnk.springboot; - -import com.nnk.springboot.domain.Rating; -import com.nnk.springboot.repositories.RatingRepository; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -import java.util.List; -import java.util.Optional; - -@RunWith(SpringRunner.class) -@SpringBootTest -public class RatingTests { - - @Autowired - private RatingRepository ratingRepository; - - @Test - public void ratingTest() { - Rating rating = new Rating("Moodys Rating", "Sand PRating", "Fitch Rating", 10); - - // Save - rating = ratingRepository.save(rating); - Assert.assertNotNull(rating.getId()); - Assert.assertTrue(rating.getOrderNumber() == 10); - - // Update - rating.setOrderNumber(20); - rating = ratingRepository.save(rating); - Assert.assertTrue(rating.getOrderNumber() == 20); - - // Find - List listResult = ratingRepository.findAll(); - Assert.assertTrue(listResult.size() > 0); - - // Delete - Integer id = rating.getId(); - ratingRepository.delete(rating); - Optional ratingList = ratingRepository.findById(id); - Assert.assertFalse(ratingList.isPresent()); - } -} +//package com.nnk.springboot; +// +//import com.nnk.springboot.domain.Rating; +//import com.nnk.springboot.repositories.RatingRepository; +//import org.junit.Assert; +//import org.junit.Test; +//import org.junit.runner.RunWith; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.test.context.SpringBootTest; +//import org.springframework.test.context.junit4.SpringRunner; +// +//import java.util.List; +//import java.util.Optional; +// +//@RunWith(SpringRunner.class) +//@SpringBootTest +//public class RatingTests { +// +// @Autowired +// private RatingRepository ratingRepository; +// +// @Test +// public void ratingTest() { +// Rating rating = new Rating("Moodys Rating", "Sand PRating", "Fitch Rating", 10); +// +// // Save +// rating = ratingRepository.save(rating); +// Assert.assertNotNull(rating.getId()); +// Assert.assertTrue(rating.getOrderNumber() == 10); +// +// // Update +// rating.setOrderNumber(20); +// rating = ratingRepository.save(rating); +// Assert.assertTrue(rating.getOrderNumber() == 20); +// +// // Find +// List listResult = ratingRepository.findAll(); +// Assert.assertTrue(listResult.size() > 0); +// +// // Delete +// Integer id = rating.getId(); +// ratingRepository.delete(rating); +// Optional ratingList = ratingRepository.findById(id); +// Assert.assertFalse(ratingList.isPresent()); +// } +//} diff --git a/Poseiden-skeleton/src/test/java/com/nnk/springboot/RuleTests.java b/Poseiden-skeleton/src/test/java/com/nnk/springboot/RuleTests.java index 541dab5412..24c7ff53a2 100644 --- a/Poseiden-skeleton/src/test/java/com/nnk/springboot/RuleTests.java +++ b/Poseiden-skeleton/src/test/java/com/nnk/springboot/RuleTests.java @@ -1,46 +1,46 @@ -package com.nnk.springboot; - -import com.nnk.springboot.domain.RuleName; -import com.nnk.springboot.repositories.RuleNameRepository; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -import java.util.List; -import java.util.Optional; - -@RunWith(SpringRunner.class) -@SpringBootTest -public class RuleTests { - - @Autowired - private RuleNameRepository ruleNameRepository; - - @Test - public void ruleTest() { - RuleName rule = new RuleName("Rule Name", "Description", "Json", "Template", "SQL", "SQL Part"); - - // Save - rule = ruleNameRepository.save(rule); - Assert.assertNotNull(rule.getId()); - Assert.assertTrue(rule.getName().equals("Rule Name")); - - // Update - rule.setName("Rule Name Update"); - rule = ruleNameRepository.save(rule); - Assert.assertTrue(rule.getName().equals("Rule Name Update")); - - // Find - List listResult = ruleNameRepository.findAll(); - Assert.assertTrue(listResult.size() > 0); - - // Delete - Integer id = rule.getId(); - ruleNameRepository.delete(rule); - Optional ruleList = ruleNameRepository.findById(id); - Assert.assertFalse(ruleList.isPresent()); - } -} +//package com.nnk.springboot; +// +//import com.nnk.springboot.domain.RuleName; +//import com.nnk.springboot.repositories.RuleNameRepository; +//import org.junit.Assert; +//import org.junit.Test; +//import org.junit.runner.RunWith; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.test.context.SpringBootTest; +//import org.springframework.test.context.junit4.SpringRunner; +// +//import java.util.List; +//import java.util.Optional; +// +//@RunWith(SpringRunner.class) +//@SpringBootTest +//public class RuleTests { +// +// @Autowired +// private RuleNameRepository ruleNameRepository; +// +// @Test +// public void ruleTest() { +// RuleName rule = new RuleName("Rule Name", "Description", "Json", "Template", "SQL", "SQL Part"); +// +// // Save +// rule = ruleNameRepository.save(rule); +// Assert.assertNotNull(rule.getId()); +// Assert.assertTrue(rule.getName().equals("Rule Name")); +// +// // Update +// rule.setName("Rule Name Update"); +// rule = ruleNameRepository.save(rule); +// Assert.assertTrue(rule.getName().equals("Rule Name Update")); +// +// // Find +// List listResult = ruleNameRepository.findAll(); +// Assert.assertTrue(listResult.size() > 0); +// +// // Delete +// Integer id = rule.getId(); +// ruleNameRepository.delete(rule); +// Optional ruleList = ruleNameRepository.findById(id); +// Assert.assertFalse(ruleList.isPresent()); +// } +//} diff --git a/Poseiden-skeleton/src/test/java/com/nnk/springboot/TradeTests.java b/Poseiden-skeleton/src/test/java/com/nnk/springboot/TradeTests.java index ed50409266..414fd53a07 100644 --- a/Poseiden-skeleton/src/test/java/com/nnk/springboot/TradeTests.java +++ b/Poseiden-skeleton/src/test/java/com/nnk/springboot/TradeTests.java @@ -1,46 +1,46 @@ -package com.nnk.springboot; - -import com.nnk.springboot.domain.Trade; -import com.nnk.springboot.repositories.TradeRepository; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -import java.util.List; -import java.util.Optional; - -@RunWith(SpringRunner.class) -@SpringBootTest -public class TradeTests { - - @Autowired - private TradeRepository tradeRepository; - - @Test - public void tradeTest() { - Trade trade = new Trade("Trade Account", "Type"); - - // Save - trade = tradeRepository.save(trade); - Assert.assertNotNull(trade.getTradeId()); - Assert.assertTrue(trade.getAccount().equals("Trade Account")); - - // Update - trade.setAccount("Trade Account Update"); - trade = tradeRepository.save(trade); - Assert.assertTrue(trade.getAccount().equals("Trade Account Update")); - - // Find - List listResult = tradeRepository.findAll(); - Assert.assertTrue(listResult.size() > 0); - - // Delete - Integer id = trade.getTradeId(); - tradeRepository.delete(trade); - Optional tradeList = tradeRepository.findById(id); - Assert.assertFalse(tradeList.isPresent()); - } -} +//package com.nnk.springboot; +// +//import com.nnk.springboot.domain.Trade; +//import com.nnk.springboot.repositories.TradeRepository; +//import org.junit.Assert; +//import org.junit.Test; +//import org.junit.runner.RunWith; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.test.context.SpringBootTest; +//import org.springframework.test.context.junit4.SpringRunner; +// +//import java.util.List; +//import java.util.Optional; +// +//@RunWith(SpringRunner.class) +//@SpringBootTest +//public class TradeTests { +// +// @Autowired +// private TradeRepository tradeRepository; +// +// @Test +// public void tradeTest() { +// Trade trade = new Trade("Trade Account", "Type"); +// +// // Save +// trade = tradeRepository.save(trade); +// Assert.assertNotNull(trade.getTradeId()); +// Assert.assertTrue(trade.getAccount().equals("Trade Account")); +// +// // Update +// trade.setAccount("Trade Account Update"); +// trade = tradeRepository.save(trade); +// Assert.assertTrue(trade.getAccount().equals("Trade Account Update")); +// +// // Find +// List listResult = tradeRepository.findAll(); +// Assert.assertTrue(listResult.size() > 0); +// +// // Delete +// Integer id = trade.getTradeId(); +// tradeRepository.delete(trade); +// Optional tradeList = tradeRepository.findById(id); +// Assert.assertFalse(tradeList.isPresent()); +// } +//} diff --git a/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/BidListControllerTests.java b/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/BidListControllerTests.java new file mode 100644 index 0000000000..0eebc46ec6 --- /dev/null +++ b/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/BidListControllerTests.java @@ -0,0 +1,155 @@ +package com.nnk.springboot.controllers; + +import static org.mockito.Mockito.when; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; +import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view; + +import javax.persistence.EntityNotFoundException; + +import org.junit.Before; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; + +import com.nnk.springboot.domain.BidList; +import com.nnk.springboot.security.UserDetailsServiceImpl; +import com.nnk.springboot.services.BidListService; + +import Exceptions.AlreadyExistException; + +@WebMvcTest(controllers = BidListController.class) +class BidListControllerTests { + + @Autowired + private MockMvc mockMvc; + + @Autowired + private WebApplicationContext context; + + @MockBean + private BidListService bidListService; + + @MockBean + private UserDetailsServiceImpl userDetailsServiceImpl; + + @Before + void setup() { + mockMvc = MockMvcBuilders.webAppContextSetup(context).apply(springSecurity()).build(); + } + + @Test + @WithMockUser + void testBidListList() throws Exception { + mockMvc.perform(get("/bidList/list").with(csrf().asHeader())).andExpect(status().isOk()) + .andExpect(view().name("bidList/list")); + } + + @Test + @WithMockUser + void testAddBidForm() throws Exception { + mockMvc.perform(get("/bidList/add").with(csrf().asHeader())).andExpect(status().isOk()) + .andExpect(view().name("bidList/add")); + } + + @Test + @WithMockUser + void testValidate() throws Exception { + when(bidListService.createBidList(Mockito.any(BidList.class))).thenThrow(AlreadyExistException.class); + mockMvc.perform(post("/bidList/validate").with(csrf().asHeader()).param("account", "test").param("type", "test") + .param("bidQuantity", "10.0")).andExpect(status().isFound()) + .andExpect(view().name("redirect:/bidList/list")); + } + + @Test + @WithMockUser + void testValidateAlreadyExistException() throws Exception { + mockMvc.perform(post("/bidList/validate").with(csrf().asHeader()).param("account", "test").param("type", "test") + .param("bidQuantity", "10.0")).andExpect(status().isFound()) + .andExpect(view().name("redirect:/bidList/list")); + } + + @Test + @WithMockUser + void testValidateHasError() throws Exception { + mockMvc.perform(post("/bidList/validate").with(csrf().asHeader()).param("account", "") + .param("type", "test") + .param("bidQuantity", "10.0")) + .andExpect(status().isOk()) + .andExpect(view().name("bidList/add")) + .andExpect(model().hasErrors()) + .andExpect(model().attributeHasFieldErrorCode("bidList", "account", "NotEmpty")); + } + + @Test + @WithMockUser + void testShowUpdateForm() throws Exception { + BidList bidList = new BidList(); + bidList.setBidListId(1); + bidList.setAccount("test"); + bidList.setType("test"); + bidList.setBidQuantity(10.0); + when(bidListService.findById(1)).thenReturn(bidList); + mockMvc.perform(get("/bidList/update/1").with(csrf().asHeader())) + .andExpect(status().isOk()) + .andExpect(view().name("bidList/update")) + .andExpect(model().hasNoErrors()) + .andExpect(model().attribute("bidList", bidList)); + + } + + @Test + @WithMockUser + void testUpdateBidHasError() throws Exception { + mockMvc.perform(post("/bidList/update/1").with(csrf().asHeader()).param("id", "1").param("account", "") + .param("type", "test").param("bidQuantity", "10.0")) + .andExpect(status().isOk()) + .andExpect(view().name("bidList/update")) + .andExpect(model().hasErrors()) + .andExpect(model().attributeHasFieldErrorCode("bidList", "account", "NotEmpty")); + + } + + @Test + @WithMockUser + void testUpdateBid() throws Exception { + BidList bidList = new BidList(); + when(bidListService.updateBidList(bidList, 0)).thenReturn(bidList); + mockMvc.perform(post("/bidList/update/0").with(csrf().asHeader()).param("id", "1").param("account", "test") + .param("type", "test").param("bidQuantity", "10.0")) + .andExpect(status().isFound()) + .andExpect(view().name("redirect:/bidList/list")) + .andExpect(model().hasNoErrors()); + + } + + @Test + @WithMockUser + void testUpdateBidListNotFound() throws Exception { + when(bidListService.updateBidList(Mockito.any(BidList.class), Mockito.anyInt())).thenThrow(EntityNotFoundException.class); + mockMvc.perform(post("/bidList/update/1").with(csrf().asHeader()).param("account", "test") + .param("type", "test").param("bidQuantity", "10.0")) + .andExpect(status().isFound()) + .andExpect(view().name("redirect:/bidList/list")) + .andExpect(model().hasNoErrors()); + } + + @Test + @WithMockUser + void testDeleteBid() throws Exception { + mockMvc.perform(get("/bidList/delete/0").with(csrf().asHeader())) + .andExpect(status().isFound()) + .andExpect(view().name("redirect:/bidList/list")); + } + +} diff --git a/Poseiden-skeleton/src/test/java/com/nnk/springboot/services/BidListServicesTest.java b/Poseiden-skeleton/src/test/java/com/nnk/springboot/services/BidListServicesTest.java new file mode 100644 index 0000000000..f9da9dfea8 --- /dev/null +++ b/Poseiden-skeleton/src/test/java/com/nnk/springboot/services/BidListServicesTest.java @@ -0,0 +1,119 @@ +package com.nnk.springboot.services; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +import javax.persistence.EntityNotFoundException; + +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.junit.jupiter.api.BeforeEach; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; + +import com.nnk.springboot.domain.BidList; +import com.nnk.springboot.repositories.BidListRepository; +import com.nnk.springboot.security.UserDetailsServiceImpl; + +import Exceptions.AlreadyExistException; + +@WebMvcTest(BidListService.class) +public class BidListServicesTest { + + @MockBean + private BidListRepository bidListRepository; + + @MockBean + private UserDetailsServiceImpl userDetailsServiceImpl; + + @Autowired + private BidListService bidListService; + + private static BidList bidList = new BidList(); + + @BeforeEach + private void init() { + bidList.setBidListId(1); + bidList.setAccount("Test"); + bidList.setType("Test"); + bidList.setBidQuantity(10.0); + } + + + @Test + final void testFindById() { + when(bidListRepository.findById(1)).thenReturn(Optional.of(bidList)); + BidList foundBidList = bidListService.findById(1); + assertThat(foundBidList).isEqualTo(bidList); + + } + + @Test + final void testFindByIdNotFound() throws EntityNotFoundException { + assertThrows(EntityNotFoundException.class, () -> bidListService.findById(0)); + } + + @Test + final void testDeleteById() { + when(bidListRepository.findById(1)).thenReturn(Optional.of(bidList)); + bidListService.deleteById(1); + verify(bidListRepository).deleteById(1); + } + + @Test + final void testFindAll() { + List findAll = new ArrayList<>(); + findAll.add(bidList); + when(bidListRepository.findAll()).thenReturn(findAll); + List foundBidList = bidListService.findAll(); + assertThat(foundBidList).isEqualTo(findAll); + } + + @Test + final void testCreateBidList() throws AlreadyExistException { + BidList createBidList = new BidList(); + createBidList.setBidListId(2); + createBidList.setAccount("Account"); + createBidList.setType("Type"); + createBidList.setBidQuantity(10.0); + when(bidListRepository.findByAccount(Mockito.anyString())).thenReturn(null); + when(bidListRepository.save(createBidList)).thenReturn(createBidList); + bidListService.createBidList(createBidList); + verify(bidListRepository).save(createBidList); + } + + @Test + final void testCreateBidListThrowAlreadyExistException() { + when(bidListRepository.findByAccount(Mockito.anyString())).thenReturn(bidList); + assertThrows(AlreadyExistException.class, () -> bidListService.createBidList(bidList)); + } + + @Test + final void testUpdateBidList() { + BidList toUpdateBidList = new BidList(); + toUpdateBidList.setAccount("Account"); + toUpdateBidList.setType("Type"); + toUpdateBidList.setBidQuantity(5.0); + when(bidListRepository.findById(1)).thenReturn(Optional.of(bidList)); + when(bidListRepository.getById(1)).thenReturn(bidList); + when(bidListRepository.save(toUpdateBidList)).thenReturn(toUpdateBidList); + bidListService.updateBidList(toUpdateBidList, 1); + assertThat(bidList.getAccount()).isEqualTo("Account"); + assertThat(bidList.getType()).isEqualTo("Type"); + assertThat(bidList.getBidQuantity()).isEqualTo(5.0); + } + + @Test + final void testUpdateBidListThrowEntityNotFoundException() { + when(bidListRepository.findById(1)).thenReturn(null); + assertThrows(EntityNotFoundException.class, () -> bidListService.updateBidList(bidList, 1)); + } + +} diff --git a/Poseiden-skeleton/target/classes/Exceptions/AlreadyExistException.class b/Poseiden-skeleton/target/classes/Exceptions/AlreadyExistException.class new file mode 100644 index 0000000000000000000000000000000000000000..68cf4bba66e66d4f06d3249419a8ca3f01ea5b18 GIT binary patch literal 471 zcmZ`$%T5A85UfUE%>sfTYDi4flds6d8-~OnCYsflpxlS014EWwGdmdk2EWFWi3dNx ztAAnq24jN;59(#QtERfTd*&>yxH&#bsTs;a5tL|NMtYbT)9V7{* zfx1=IK!v^P?1E5;*=QBC*~C(ReR@owGeWK*W>$r^t%4D!{5M|Pdwstrqz`qdZJkiw z@_r0k*66TT+inw*ji}2m=CF{3iwq&}>5wl*!w#D()d`qT^detcDrqeEn@rlijtQII zY`A}xsS%tZ$Fb^7t$qz5JDs!bN8L+h)R3)gMsQov$oPDsC;cmbKGOcg2^%1p9dcHX zLRz9DD1mv�DA3v%=IRCM2eJb{~;@m}>HJx>GhIwOJGdFMp}9h@v3Tql6`KDodV{ MPmw?(nzUH?1QR)N=l}o! literal 0 HcmV?d00001 diff --git a/Poseiden-skeleton/target/classes/META-INF/MANIFEST.MF b/Poseiden-skeleton/target/classes/META-INF/MANIFEST.MF index 478a5fde4e..799d79b41b 100644 --- a/Poseiden-skeleton/target/classes/META-INF/MANIFEST.MF +++ b/Poseiden-skeleton/target/classes/META-INF/MANIFEST.MF @@ -1,10 +1,6 @@ Manifest-Version: 1.0 -Built-By: Draflosword -Build-Jdk: 13.0.2 +Build-Jdk-Spec: 13 Implementation-Title: spring-boot-skeleton Implementation-Version: 0.0.1-SNAPSHOT -Implementation-Vendor-Id: net.guides.springboothelloworld -Implementation-URL: https://projects.spring.io/spring-boot/#/spring-boot - -starter-parent/spring-boot-skeleton Created-By: Maven Integration for Eclipse diff --git a/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.properties b/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.properties index 5bce0a2138..cb38bf6c15 100644 --- a/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.properties +++ b/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.properties @@ -1,5 +1,5 @@ #Generated by Maven Integration for Eclipse -#Fri Dec 03 13:58:21 CET 2021 +#Mon Dec 06 16:17:11 CET 2021 m2e.projectLocation=C\:\\Users\\Draflosword\\git\\JavaDA_PROJECT7_RESTAPI\\Poseiden-skeleton m2e.projectName=Poseiden-skeleton groupId=net.guides.springboothelloworld diff --git a/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.xml b/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.xml index da271353d0..94a159cbdd 100644 --- a/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.xml +++ b/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.xml @@ -15,7 +15,7 @@ org.springframework.boot spring-boot-starter-parent - 2.0.4.RELEASE + 2.5.2 @@ -47,6 +47,11 @@ org.springframework.boot spring-boot-starter-security + + org.springframework.security + spring-security-test + test + org.springframework.boot spring-boot-devtools @@ -78,6 +83,19 @@ jaxb-runtime 2.3.2 + + org.javassist + javassist + 3.23.1-GA + + + org.hibernate.validator + hibernate-validator + + + org.hibernate.validator + hibernate-validator-annotation-processor + @@ -86,6 +104,39 @@ org.springframework.boot spring-boot-maven-plugin + + org.apache.maven.plugins + maven-surefire-plugin + + + org.junit.platform + junit-platform-surefire-provider + 1.2.0 + + + + + **/*IT.java + + + + + integration-test + + test + + integration-test + + + none + + + **/*IT.java + + + + + diff --git a/Poseiden-skeleton/target/classes/application.properties b/Poseiden-skeleton/target/classes/application.properties index 28a89bb203..73bfc2fcac 100644 --- a/Poseiden-skeleton/target/classes/application.properties +++ b/Poseiden-skeleton/target/classes/application.properties @@ -3,12 +3,13 @@ logging.level.org.springframework=INFO ################### DataSource Configuration ########################## spring.datasource.driver-class-name=com.mysql.jdbc.Driver -spring.datasource.url=jdbc:mysql://localhost:3306/demo -spring.datasource.username=root -spring.datasource.password= +spring.datasource.url=jdbc:mysql://localhost:3306/demo?useSSL=false +spring.datasource.username=Draflo@localhost +spring.datasource.password=rootroot ################### Hibernate Configuration ########################## spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true - +spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl +spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl \ No newline at end of file diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/controllers/BidListController.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/controllers/BidListController.class index dbae23e602bd87f172d8f03309d66a3ee708db4c..a7b7ffc9c6a2acfe3e2907e5b3a72fbfcb5d20e6 100644 GIT binary patch literal 3891 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 delta 189 zcmX?LzLc5k)W2Q(7#J8#7(^#>*~_unWaed-*fBCNYiNcsGO#%3r=)T*Ff(xSFt9SP zO@722HaV7CW@5GsqtwKO!jpTsRm)lO5_3}-8Q7CDQ*ttkOBfUxfVzPuG5~2tkS-v} z4&>>B`3wxKTH6^oHUb5h7`T8WNSc9xmw_8d@_^Z_K$;gU&j%*?83cedKTy3OkQM@} J5iVvB0RW0k8Pfm& diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/domain/CurvePoint.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/domain/CurvePoint.class index 21dc29b7b1a8087ed49335211517128706907ec4..39ee1292a50bce0a262ee174d85e2bfd07c5a28d 100644 GIT binary patch literal 850 zcma)4U279T6g`uVrp9Q}*2Y>tYO6?E!F};bMUYx05Npv8@Nu$xNv9?=VRur@zfw>H zAN&FSDDljuP?be|xp(f~bM~J5@#E*W?*Ja+P7Ni6yRn-@*1nIjX=?0f=$wxdH_^sM z`?K^^j-0W+hKfS#M4#$ttnDazJv@=vE0ns4!dmY<(Y0Pil0H_r_GV_inaIFoW;m8- z);h1faW+$E=Zp{0RMO03UTiE;Hz8@KAn{VHq}od|(Bqj9w4C`6kLLfxvr>OP&GFsm z2Z#M`|DD3p6Jw2ks!;Ci4iqZ;E|EIQSZUxAE-N&9#>(MrGL*Ehsaj#R=VCn`=+uPx z>|@0r8@6$;_dm0v;_66znACb_w_sKmz-cv5#S)R(0@>~q0E6V#EAhuJInt?~i0Awi z>TlgFjpc<2dYk7JGog%-o$mH0{IbriGFGC{ugZgUAmRC+Y7{5=^$&-+70rmTnSnP+{_E#%KL3H N-eP>43b!-t`~vJdy*U5? delta 163 zcmcb_wvn0Z)W2Q(7#J8#7(^#>IZgZ{!N$qMz{AOZjmI~q6u diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/domain/Rating.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/domain/Rating.class index 3a205ec213b1c6cf31fe36f357afacddbff295b2..16b24ab99057aeb06be1ac9250a4f2bcc2f5ab14 100644 GIT binary patch literal 834 zcmah{%Wl&^6g}g-N}4ulOG7EIHf+*XsyD0vAt5NpQYffIkyuXbkvkt_pNb)qIZ*VCDLY)oqT zR%&vAe!+O}&sCP|+$s|)KZr;gR1}^oqcUk#G?BA~B4{PIE{~W0#Iw_QIWO?R)05M2 zFn%M@e5j4Kj|6JNgNZ=>NgAm(YS`#t4eJ8kkv8gdkxW%KmQ*dUIZ8u0o5)PN{PMDH z&o##wjQ-~v)iz>folD!pg9@LnfKGMLK$FP4MD~XjKqt5NLfP{)dL=WNC`<1I+ON|^ z7OH33XpAu{QS-5Sdld;8YgV_qB z8=$SQiVi`-xyZB2g3l-z8;4)e`^XOun>-yK=wXXzrv%_Cwwdv_z%`zKl0RYR1B<_t z*DA@oxIvU7-)Hm~n}*~zilWaed-*fBCNYiNcsGO#%3r=)T*Ff(xSFt9SP zO%`JeoqUo}dSbH7)@eB-%KnRoolI%c3^uc@v23D=@3>+JQ0!$2CKoTU)0Az6k hNggnp6-e`f<@vxQKZ5{}<_D@51kyr4HNwRVA^^&j6KMbd diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/domain/RuleName.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/domain/RuleName.class index 44c13aa5df7017f6894a29869b650afdbdd9301d..7a9eee0974c33986bc4a6dd7faf7c1552d25f953 100644 GIT binary patch literal 842 zcmah{U279j5Ir}aH6~5k+F0vnV;|BA?u$<Qj7edln>O78?|KzjNa5>NTy{AWm zVQ=_Gq4LmJ;~ps#y9XnM(vvup8j9Gcqk(mWX5UyDEM{X#hMKMwHv92JPe(d29-sd# zxf8=N_WS?e9Q~FfaehzR-GiJ>T>y7gM;R3|(-pJb%^`Zjtry}>;_#JDcofI&Db!xa zi)13tjCb4kd9b_wBnrDZ`#j=V+|pktr*m=+5 z@8Wu{co$d6^5Xl<1?I}(oln^LyLBT|w^xkw*51}?v}@Frc@DHlxSln>kxljNA delta 184 zcmX@bwvw6a)W2Q(7#J8#7(^#>ImofuWaed-*fBCNYiNcsGO#%3r=)T*Ff(xSFt9SP zO_pE`pL~{4R!TCcG_NExH#ID?I5R0H)iEzGza+6FGe56*@(ae0cm@VWAOvavlI%dk z^}&1w23D=@3>+JQ0!$2CKoTU)z`)7C4J3KMY*rx63zp{tll%+ HGl&2HNIe|y diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/domain/Trade.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/domain/Trade.class index 6e03c299842bbb7de3bfcc51f73246667b6bdce7..15f9865cf931c9d26f1246f4ef3372668d387d3e 100644 GIT binary patch literal 830 zcmah{+iuf95IyVMN=TcurJR=b3A9x`1_Bq-vHdjtp);x{b`zn*1iq%d1h=pNmCa_X`+n{ zN12YKfvQ61Ouy6NOxrkoF*%c|QwRo;!uIf2V_==clHFIh@@iq7Nn~ttGnvUFYg4D4 zNo}ssEg0{^xn#M?o!F^_gNUSqlEyQ!l4&Q=SkD$h&|2<%9WVch=cLhcUf>5$j!#B| z(Hn*O17nSQs8H!2juonp(@2`AV6%mFY$&vc#>&YenMgL$RIRWzOs9G_)|v73`OB(1 zHC&@N{EuxETZ_eclXm)tB{p3EjcTEWI+6Jb+3lAAz1q%mai?kYQfE35N9z=tuhT^~ zm8Zr_Z5F4x`o3XV5;1YIN@t?qD#y`oQu=|0{-^uHx z*~+omWaed-*fBCNYiNcsGO#%3r=)T*Ff(xSFt9SP zO%`Pgk>Co>FD*(=b<502Wn|zADN0O9)yqmOOPrV>H~Ar>e>?*NBM<^r14(wE$@*YE z0|Tqpb_R}(KmjHOE+7e#W&pCdfg}%@%?hM>!SZ}ylAl2UNb>{L3j%2&pc>&~1`z{mm3pa%WScIWoRc|wQk#$B zj32=nb*2uZo$-Y){Z2amcaxChSf-sbc8*VY#*0!bqX&+gt5`jA%{>3! zaj^@}6kXw!jEv)Qqlg`{+%ttG^=|9sK6b={Fs(!GO5xZC$#q8Tb4FLz99w#(?H!s{ zkw@kw`|+Q@e)ySDNMsrHr)nHY+v7RzE;1V4E83pO^FtxUvBl%I?Rch#T_vL-ZSm45 zC_mEUc7_|tEQ}@t7B;!fUDM-P?Hr;u>8Ww9^hP~A?UxE1`f&VUe+Opj)HVXbsIQJV z?Wy=ecDv&Hg=vYbCPlDtY!@;2q_ORIs|fWel+iqw(#&C_L3I~u&j}$X@}>8b{bSp*^bdyncO4xk6m_O$3zKQEmF>x}uc@y`Kab+^>Jr}sIiPW335iyD6 zxR+GNnVPN(ZZ#d+iP4=H#pnu@vaB4M3J@yTo-OV@ce1;t%3cpC!l)CwS3}KcputDw z0+ox8Vl+U5ki$hyK3MOlqE>#?rq$pp>yKkJQnjwmmsKkM>ME3KDMq7JRdpUIfxXl< zD8;8S8dr)aDAXLIF096jI21}yaGd8_^#nyvSjL)TS*TuQECSh{7CGDWiZ1MSE|4wF zrruuUn=T5LXRCfoi_42q+C;hPYSoV8u4|T3sK5?N(5)z;)K}lWu~|7u$w-TQ!Qy^L z9h9V$%Cmc&v`xEFLh*IgoGO1Y`hxb5oMu+1OkEiC%ERE?*z&c=}}he1E?9q zY^X7JQEip{P587+|1WL`nvn5K#=(=e?bsVH3&Q0fM{$9(uYL_Ar)ue{kZaIzyn&`A z>y6rl+^|)RLDi9Vif)D{gvye3m9ldxP>e=2c;gGXfxWyEjyoK%s1J;_aQVrI6tS12 zn@GnN{36tf+>TNk`tA6a2~h`rC`XLDFz&^u8*LB9y`1`}9}_4geARL%ribvmD(M;x zV*+;lRGSK^!fDoCZ`NLi3gy$R9c$K(L4`tU*4}8=-q7fH+CVu8Km#p98<{zycYZ}D zMDOC;swaEsJ@jK`0o|r4j2KPR48D!VuW0rcpYdd%@%uCf7s_}UZ3u1a%jV|R#n_9wDNTrSc@1l4lt~0 zrUA`#Kagp`&om#%^dOjN!OwIbObZtM114`y2NGbO;Zc>$BEopYvf&9q8uNQrgyL$sk&S%OU=Hf8 zR5ezfIYf`qWBL+bm6CV#7#!iBG)=8K({%v}omc14B`l8uEuUP%@@b&uSC_El0hS^9 WTA%3~{djgGzTaZ}6es>plKCH|R8=(q literal 2023 zcmaKrZBr955XU#Ar92b?q2)nAM1%s$A)q24ijF$WATaXq{@TV8XmiXZMfp}bqvMP( z`~ZF^$NyeiDA$7*cS$z?&Hi??`TOtpA0k?!jU>ecjpn_wqxFenPJN||InT3B!7IB; zI|oMkNs0^VId;!nr{wCQvy(fPc`GQU3WEB!E;lx{l||{V3L5%U(N>k^p)x90k{eok z*0svhMo=d3`0AWW-za0H&P!*r0H^VYjSo^w-?g%E=$0xHqBdiBT|B>0k4XFHr>u`} z9PIDFt%5|fTb6=uHxTbxP8hPOTI@5oqzVD4lLswgDQ%6j?b$cT{RGNnSsLROaZs9z z!)J~uGgfvr{5&6ABUh7WkShgfJ9Ulu;`yjvdbc(W9nto=QYuw()9*3eZjKW7y%HdL zKVb-Yx2`Fz?7E*1PsdAD@v`ij>z zW85Ao+}GIF&Fz7jB#P2*ayr@RhT_)Sp`8RhOi_Ybp)^%xCL1AS*q)El9(jdb*GI}0 zEh4BBr`Jm@sQ*fg+68imM=9!}TaY8fr99mjsHWyPd}zJ+?ENG~eRc1;y{h8+^Hs3w zX^PTyRo#x3z*&3^tay>40aheI!8So1dtSxQ%lC>G?MybuPe#yit>+pa!aF=0dybM0 zMQjH5g1vaPGZGb?W#~Slw%|1mP@aOGLn7i@y7$|SU z&_$w;E=@76MzglRS=$d4YSOIDG;1?Zp*qdl!Dj7Xz=(bY})}oQZUvq$#M_c^zX6W9!W9Pnx(4-4R%a zQS>{(37j1RRm1bFdL3C<6KH)5f~ILEf@wC)G#bhDnC1|piD@>>G>%{ou3_RH5L9F8 z3YeTorui__WF*r{`S_(7GMKV2$W?Bj}Er4n98Yb@P z3#N3y^gNPjIn4Adl4&KHX*tZa0;bh#nE35nFb#ky1}Xp7f=Atr*-Na~A$n!#^?#E$ BTEYMT diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/repositories/BidListRepository.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/repositories/BidListRepository.class index fbf9afb1a4fa62c5c083d540c078ef4db31b57ca..1f5f541b0204dfa29c0e704f06a24adb380a89f9 100644 GIT binary patch delta 142 zcmaFC^oUvD)W2Q(7#J8#82H&4m>3xhCkrwPPgE{cTn*AFf!%FIi*)|@QBs4UCKz@7+GCE%M{l98VhkXV$Mn_7}uR6KFgVKqh; epb`cS21W)hpiQid44goUiGdqT@-Xm%X+8iZ&>+zO delta 41 scmaFF{DO(=)W2Q(7#J8#7`P{Lbxr(zP?&*%iGdv`!oDJN=zmcnW_>+0R^vAd^Sl?Sj2_Xxg% zm4y#r?-TeQ;>3ux)iB@i{pOo_sy~O(``7Cm0PI7z2?4@hb&j3s*2|jCbZz;Z@2`bFYl%X^gNqR8n(aSh5}e)7DRJOvbdnXD%mp zb%pKC17a-{e+i-!;cw08j9Uuig>}=9?JC623Btyp&|YQYQaN>VGFLS{LA~#NXW6L;1K&U|g4QSF=uujLo67|c}1+W4wsttryDm7U9 R5u@(!bRF6xghc27d;@esU-19{ delta 72 zcmZ3?*3H6o>ff$?3=9k=47?M$&Q9)PROaFg&P>lsEGaEYoxGaysS+C_10w@70}}%) T13OS51CYfDCb<~6!88v5&DIUU diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/security/SpringSecurityConfig.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/security/SpringSecurityConfig.class new file mode 100644 index 0000000000000000000000000000000000000000..8d0612d395aabaff62dab5d8155bf95a7391fe6e GIT binary patch literal 4377 zcmcgvZF3V<6n<`7NV_aj3Zj%30YTDMSU}{(BGQ&3g%oN+TLDowo7;3D*$w;B7yRP* z!9U{{opHj9j1HguQI5~uylvVwnO26$B)j)y?{m(1?sLyQ`}aS8`~~15en_E5;GE@_ z4aa$A_!ZA~ih0)!3}0HIX9w#>F0$q7!ztHUvWqG72|RJVVtvMvXO`uv>k*+b&59m0 zOviBpGq7F9Se1FBW(~cXWl`qaaYIjf69uypNKar-#q@oG7N#A`Ehx+NOlOzgdL?j; z#x!HDeg3$>!EERRc3CdizMU`0iDq!Vz?DSsyfhu(STe1^_15FrOoV~EYJ0Lk*aM+2 zy_+&H?UJ99-imF>nR2Bha52+~+4;m-#5&Cud*=E`oI)<3E_zYp7 zv5o|vO(zo9MF{!OE^$qL<8}~K8X_21`DoK?maHhn_$eF|*r&KKN~TjZn*V4xgd-^& z7P#G65s4y9^sVD4J`mVzhQYGy*)L>PJ`bfIkfNW{Bil)_$q}=hUaNT0_nFkZSE6(x z7ttn|ib7PvKiPU{#^DZ7Eb!^9EZTnHt&gX0Twt)pMlMjBwI3e}2t&guoKE2*fuFX) z$Quq-M;apnyG$pTH3Msz>nw0O{Wy|!Z7FNPkB`Jm_w!Gs6)?>)f#+`{iN-p}0%_JT ziZeRSDiI7+q*u0si4v`+a8Ad0T%a&bXT2^8f&J7(YbolXD~yXeK2;dIm5?N>jb#S1 zpl~khxPq(Pwx&}MxU)S`#kb33Z4ZsB-7v1>8a`*}ORiVWxJBC$SlFJ6xEO9V&{{I3 zyDu=2!VQ7!|6HX6bj8u6z~t6LZxoR@D>rpa;}%P1$t}8JAduTSZv5C%1&ibos*R7^ zxRb(+!2SQp$3|!!cahH}d8SymQ~wgnEHMXX zCF@^d&QwhU>l|ytjjqem^=Lnn7$UVC$h9DTl1}nOXOYR#YiGV{F7uYU8k1A%vZ15U zkj0>YuD1G|=dRdMmonQenOJ2|eNn-5jhm*cs!_dO(At1wq+binbc}Q>cp4TlH~@ji zItHMr;S(L-;yZzNeHmSEHb}FBijsjF?LZ2H* z6`1Jeu!|T}7jZXH4$Y=yE0j^P%iSW{)MspP(A*2{t2}EuW>I>Lk~OlRktJKlJb3pE za`ChwajN#s~~VGF`$GR)i_`J{?VuW_h~&#Jf{-AoOg zsN&1Tmgiym1`adqBlN=;4}Q`(hRbXdRWt``e(KTCBW7`raop#BJNU}Qi(oKwe5}F5 zSG1{IFVLn^>3@an!il;Hsv?!L# wJhraJkhLaB8Y+0+BB{b~df`Rs`w>kFAmBLUcZJ^}jz_VIbxu0P>kI7t7X(sxJpcdz literal 0 HcmV?d00001 diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/security/UserDetailsServiceImpl.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/security/UserDetailsServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..c680ad8b5d6c42f6f538ee4f90d791c80fc5cf53 GIT binary patch literal 2326 zcmb_dT~i!I6g>?K1H%aGDj>#0j6@eO3_&!B8#O>6!E7M1WEDRidUqP=FgrapA0Yoq zt1Kv!Dl5;Hzsd6U%m6Dpg@xtAc29TTd+zOX?(O~KuNS`qn8yzWx)|n~s%3lLo*nvu z^mZCbMRq8faUi2Z`&lT02O{Fq4QnFUmrb$S@?8T3hT?O+&uy1`JNA0xxoAcPdKvDk zU?)S`4tPr(sDO}9;F>BBc1)N~ikXAYFsKbSgs(ywso;=dwwjY-aAF`un82KQR2arK zVlR>{QJ0}?xMIQcRKz2xypZ8eH8018;9h8N^QMkz^HT?VA&%6641`0lz4xRiqc0e` z%ae76!jf`?iEa#87=XnvRF$4si(3s5Y;uarP^zjXck4WmdYx?+qFqUe%;(+fl&gH| zDT$J+xT8-O5B2B~%M9z~>X{z3NGn;H%)RJofQ!VSFy``4P2ne;8F-7~VIFH2gXz@P zRJ5XE&pAcw2gBPI4D=1)9b7YTm0{*`0$X?&<5Vcy(sSBLDCd%p@DfMTwbzsDaJN#T z`oC`BeN2#)J0fDZ^)Ig5vDegG*tOXAT`7W!i4RaV@F5A(8NtFNrWgiPu+q*Brt-YmB(l~HM86t~H{ zrsAL}R;2FzD?0to*K9-^iB&u{@D;=L zGybHvul9spP2?j(o;_w3s(3=RNCKa1G5p!iOy-$_KjNO_ig2Q;)L!gYI@oI8`G?~s zCH>zH(~uYYwsW3^UE;1=laZ(l_2SWaU9t`;V%?+%XT!oQZjs&B439~_|Eq?J*krI) zJx>HnE)PQy8u*ssMu#eS+#2|f;o8NfRLrRmc#p2pO}`%cb?N7m=6-s|dTBOk)@Sr5 zMB{6;vT0^C_e>pQ@E7{%LXk#o3^IB>850AP@CL1jKMWJd2z?i5HJZTG$ghibMyGzo z*z|9>(uL_4lnRb;;}xcVrlS;ikX%7PCc%u*tOJasu2}#A!A;B%v`uF{)SN)k)Uwc) zPI)=G8gTU`Mz>yKZmTqZj8CVIaJTe14M+I$7)$3P4pXut7^Bp6M4f5@50bCtQ+8Hp b{g8f|n>EVwDQb9zI_>Dv_y$|}9%Fw4zQL*| literal 0 HcmV?d00001 diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/services/BidListService.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/services/BidListService.class new file mode 100644 index 0000000000000000000000000000000000000000..8965587695ad5511e3ab316acd93cbfbaa0c10e7 GIT binary patch literal 3460 zcmb7H`%~0b6#njl2G#&8zKU8wd~^XZTA%G&TR^C57f_bc(wDt#E)dBkYmxh#N&%EZgIrVOuW4>5T2ngjr5I zJTDe(XHJ_E+;X*Po|9oUUS6Q}6+L^waD+~7H=Z#p!#m4Rm+YEgs2{L(5l0=GR5T*a z(2_AMF;dJ=31^&BT!z++o#W;NcMSO)PS$&~1|@Q6J!tnS83k9S4NLDcO>&y-%J|hQ zdWNaV!qV%;tTAJ8ujo+JQ)>*)tQSkS^W3mX%}Je2HG*M>iVfJf32oS=U?;=T|6P9- zt=PiQlye04MA&+U^T`@==&HenAwGC5CklQ)6?8CkRGzgylfvqYgV(4m<>@#&v0uSH zhP~^+sjh>H12{-AW`x(5%h^OEhOMQ7`h3lLlHn;?qoj&1bQ4(Foc_h~f>X($Ls9!$ zur=Ti!>)1SM@Lw=4jusN5E79aM>`Hnx@ipC)(bMB;3!eV=ZAaM)W%5$uE+C*IF8|j zg5y=v%PzW}$g4PsQ>4FK(Q$<3$tA;vX-bk3(=Wtv1dqv>j}zyU7rG{7InStg0wjeN zS9k-m)1d+AQf^uvNK5Xhg$=~zM2@) zl=XOSZkQKB$t8w`H*4z`xfHx7975JqEa*{wrfcD6x|Sv?xWLdQJ8(@aP%P@3uyR5h zq&>-79I?G2VwD~tX9gn*hN%ISJuz*0Vn#SBMsbng&vUaVMyDCJCn<$BWKYRR3m zi?n~Hq!&ZQ70l5J@=~>;N)F+IfU87stHjkYF;9m=iK{V#s>IUdEntHlmOxUore3$w z5$LHXVxF`@7#P}1dxc-&>7tdB($KQSLcuhILl~~%H3f9G1tP6#go@Yk2E!)X88lrn zKI_;Ev;~Jmd=aN}{A(5O;3nC9 zmB38~HEmhK88Er)3Rl4o3*Cyho%)U-_Hz?&8&773JdX}(v1&_q=7n<&% zeX_M@8NGLV?%>GeEj+r6(@RMCb}M)?hCk6Mo7Kvti;62QN z;$Q&hDEgqklI_G0-E3eqE3rO}^N|eGeunobL+SgnjJ*36o>{@A82*+SrYBpUUB+{F zD{r3n(;DfONS5%T9A8-im!rOf+1@A=Q!eXW3#HTV+W|`XAVEo@hrV`>p&Kc>8^9r4 zLaz_4J4mYx?Q#f>QiY8I0q>z73RekkT{Yasm=D+XA!p%`rR2sijj|POGOt}Fpts=y zOIQf29p%f>NQK+VX|(ylS*fr=lXrfkC8rWQR-@L|s zA}&Qo-IE}?39S5!m%Fo?n?cqRXg%JgYYgv|1@k^Ve?b3I1D}(pFYyh&#dkC#1@t|B I#LsB^4{(lz$^ZZW literal 0 HcmV?d00001 diff --git a/Poseiden-skeleton/target/classes/templates/bidList/add.html b/Poseiden-skeleton/target/classes/templates/bidList/add.html index 8e9bcf1877..680f8b5d53 100644 --- a/Poseiden-skeleton/target/classes/templates/bidList/add.html +++ b/Poseiden-skeleton/target/classes/templates/bidList/add.html @@ -15,9 +15,32 @@

Add New Bid

- +
+ +
+ +

+
+
+
+ +
+ +

+
+
+
+ +
+ +
+
+
+
+ Cancel + +
+
diff --git a/Poseiden-skeleton/target/classes/templates/bidList/list.html b/Poseiden-skeleton/target/classes/templates/bidList/list.html index 4b67ad6d4e..37eaa742e8 100644 --- a/Poseiden-skeleton/target/classes/templates/bidList/list.html +++ b/Poseiden-skeleton/target/classes/templates/bidList/list.html @@ -37,7 +37,19 @@ - + + You don't have any bit list registered + + + Bid List Id + Account + Type + Bid Quantity + + Edit |  + Delete + + diff --git a/Poseiden-skeleton/target/classes/templates/bidList/update.html b/Poseiden-skeleton/target/classes/templates/bidList/update.html index bf034a02da..b328ad98f9 100644 --- a/Poseiden-skeleton/target/classes/templates/bidList/update.html +++ b/Poseiden-skeleton/target/classes/templates/bidList/update.html @@ -14,9 +14,34 @@

Update Bid

- +
+ +
+ +

+
+
+
+ +
+ +

+
+
+
+ +
+ +
+
+ +
+
+ Cancel + +
+
+
diff --git a/Poseiden-skeleton/target/test-classes/com/nnk/springboot/BidTests.class b/Poseiden-skeleton/target/test-classes/com/nnk/springboot/BidTests.class index 75becad04a4648a5640b0d3503b8cb50fae47b85..b1bdd73e5ab03c246082012cfbb3a3ae7da303b8 100644 GIT binary patch literal 2239 zcma)7+fx%)82_CRvJe*07^$dK@q!5#w^qDBtP+T{v>_;=vC``%IfMh7UEDnj;)~Cn z>8p?Rwa=aDAha``KKFlWr{CF4Aem+y^N_RWobU4ce&6N%{qOI80+_;{h6uy?ic>di zd&}^)U18VCjw6jZQC;Pp^fW{nPHvhzreT?O%~&pP@`_|QRTkB}@Z<{Lc03^+caPy# zzJnpRDImC~thOs<7=~7STZ%d_2~U(Qp0#a9no>Bn$8az2xU~kXb=R!(UB}%r%G|U) zW8JJMw}yG7U}Syi>hlWJH}4nphWhHLD^^G-3KuScdA!Odkq(tYMif2gP!9qvHuy zRCdJ65b>fyysG0%P-DeI#H+3fCz@JImz2k^bUagx#;V-nlB=Vyb$o+w8G00mxjmJq zR40Bz$^-Aq+iDJ&7Nzccm>PZ{;K$gSw>rwGP?rervCBPfQv*`ZuPKn!4C@MHUkGx6 zNL3+Fvoc)i)Y9$!NR1u0f+6SmR?yeS-UH4UBFfb1mNIEp8?oJ(2~-rFVqzF$Kfq$su>lBdh&$~dvMAq2Ja48AVXxJvtsZpwP}ZH zbM#y(Y#EHuFzTX4p{%HhM5{(Swf4{&p_L{-{rAz%pq0_uJ@yv*ufg>R`d7lhDGboR z9tz+j?Um64DMyY>o~AQ0#EPWTP2X?+K=N5)FmX1Ca|gKa7MJs5zv0^WA+AU87nQ*H zJ|+)vla{;t$dFVZ_;5Uld6M79qyLGAa`S<}Lv?$IMTVt`Lo6}8ffoG*(XIm&mE}T1 z`)LH~Yw{3l5zIt~qWk#n096%X6e_}*;QuT|bDkcG3%E`%$zA%&5`D|KOpSI80;70| zG+tp0KhkV|jS2jW$$*uqFxmzy3H*c_Hi#WTBUE6M7gOcprR%#E73CLkFo-iU&JE2gN-fUM zDN9XJNY2kK$jnJB$;{7FC@9KL%1O;Fwo>5Y49Q3Z%H0YpdL+y%wmPoyp+_m%)HbTi0<6fl8pNN6ovHE5~ya+6b)2`3TZ%- zOMo_&R2HPdtU&07YYr?;%qz((sU%r@eKFW_xPEM|rKKaBOETb|00keBA;85T!XU}R zz{w!R$RIjdkV%+HGiX6vOsycWCnQ#1qKEH_`;~W diff --git a/Poseiden-skeleton/target/test-classes/com/nnk/springboot/CurvePointTests.class b/Poseiden-skeleton/target/test-classes/com/nnk/springboot/CurvePointTests.class deleted file mode 100644 index 3b33357cbe5c39fcc89c45a3e9ca924c5259b882..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1241 zcmcgsOK%e~5FT%nrd>i)LJDnpZ4rkQA$*A{L=aM`KthTDH6ay8XV*!bX6?xKru0|v zTR2q$3GVzT#CY@Aw8{kzTs#`@eBV6$&HnoR?FRtVV6Olkfrp`rsg$SGjI@xwj#8E$ zC3?(1C?Rc&8*2)XBd|GOV@8Ke_UQZ0fQObqC7j0{^N}*bDt%7ips|Ef&jJKD3;Y?b zPGILakygaKEsW?4`Jt4`GAooc1fDgN?oDg#Y8LY|rB7*xGihj-g)TE?a{xU|tU42# zM@YN+LP%j>5?HD3w+ZBqRK$H)f$K$B2cJNxAtZm7#2v0%4D%8wH&n=mZKj3ur1D@uK6IVpo-7-B#2aku`|0L2ooeS;$3VtnxJED`zi{0 z+`f&fmji+>GFr@F&qsWL`YJF@`fq5%?F^0e{`d5M)wK^5*l}XnC9qX(WKY(#Ze{9D zRen^aS<__dJy$>;Y~D{tyUwkcU;Y1@xR)ZLV?gz@)~<$eecAOQFS>1t|U diff --git a/Poseiden-skeleton/target/test-classes/com/nnk/springboot/RatingTests.class b/Poseiden-skeleton/target/test-classes/com/nnk/springboot/RatingTests.class deleted file mode 100644 index 33e551dc2f6dbc30384e96ea29d6bd802c694069..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1213 zcmcIjO>fgc5S>kvrZs_t&_Y|FxVID`RzeX%1R)g!5>iB^BouLU>`Ahzy&LVWQ~DeD zHJmDe1b2QEV%82#T5^B`mmSY~-kXno^W*22ZvfDQy)qOS?1n1gQXX?N(LxUUN?G0s zEPeLSSW|`~gW5Ql20RYrkRSHP7+Sj0Sxg5f$_T6UDT7DtB~ij-p4>1J_tgWl?Uelevn#qA~Z%syZTH> zVV^TtY3v^{D85t?dawdlE3gh8gKAqye48eH)V+Z6GN`vz7{o_`7S5kt7VSt-A^x(? z7KTI#y?h>SW;C3v@Nr5daCg%x!zSgNPw|!3O0U5!#y-818jXsl82L25iHNiA{fSmo zMq-}&-g<9@^iLYAQ`fYgXKr+@d$0%oWh@e7DwCB&2Pq^ijc<90z>?}OJPNhW6N#XB>9g#>%(;!X>_jswWEh&Z5J6rr{c_yAF?`BI$ z3`9f(%YoU>UO?xt7qrWn{9q4g6KLrf6rcpFWXt3^yGFJ^mbQYu<@aO^9;7WlUIN_+tvb`H)AWn V?JVj}##g2IyTq~^!aeW-egT?(ULODe diff --git a/Poseiden-skeleton/target/test-classes/com/nnk/springboot/RuleTests.class b/Poseiden-skeleton/target/test-classes/com/nnk/springboot/RuleTests.class deleted file mode 100644 index 51f258b4fdf9dcf51706e435c2a77d7dfed10f95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1222 zcmbVLO>Yx15FKxmCS5{PLJMsvWqV5z!j}jkf{+RV2`MU45`s87yH4VC*N$v&O8*Ie zgHt7t;LeXij5i@4CuKM|0D=*GTvoWoxnje zl~yFYBaGQZPPA?@aK zA%%TGV5554A&`5eBJRTm+$_Ns_yo!gA^CZlbh&Ob)WxP6Dr9koY2ohE$DADqEaZ4q zZ?iF>T+vO$%?#(26+KK*p1PNM0rpUDKE>BsD_w-UgnWK4H8(0A^C-aKjYOPv9*nfY z5)$()@VD9nj^CuQI&}>PPSp*u+OqD4JqrFUo(94Msf>6J`;I2G3AY0k1$}PcM%Cqn zpodZxrR~*-&ouvrWp%6#G~6yUur?ga{Xg9``t)HJ4xCdC3G7uH^M5xPcHLRZZ>dy= z{Ecwt*`ArB1R7*E(e}B@J2BbjQNMxQ2LU6 z-p11<1Kff#o~20w?BLyzRuJsXC~xDNBdVdK!}#A|_haSGHSGVun+J2Y{RK9E%I3kn UEbA!aD`WnBWH}Du0R#ZQ0kEWB#sB~S diff --git a/Poseiden-skeleton/target/test-classes/com/nnk/springboot/TradeTests.class b/Poseiden-skeleton/target/test-classes/com/nnk/springboot/TradeTests.class deleted file mode 100644 index 2702b7860ac39edf8dfc48f226903038251b0920..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1189 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 literal 0 HcmV?d00001 diff --git a/Poseiden-skeleton/target/test-classes/com/nnk/springboot/services/BidListServicesTest.class b/Poseiden-skeleton/target/test-classes/com/nnk/springboot/services/BidListServicesTest.class new file mode 100644 index 0000000000000000000000000000000000000000..d3c89a1a046f2c0c8225a8f03afaad5e1b86230a GIT binary patch literal 6282 zcmb7I2YB4%8GdzkBIm3uJEVc8OlLSwA_4>gHV`{@8p9FHjO(^Nrh5~vWe*QJj<0*BJ89)jPw%n{Im`3=qUV0o^HtO4hE?>U zXnMydiVDt2bI~*NCD-z&^@FKW)VC~(HqxbFbGn{X94WseJq|kS=|e_d;M0vbaJ{qS zJ5!cx7AUGlrWKr#X0zao8cy~v(*w{(OMK8rOB0rFy1Fr8>0RcK{%*8ufSf2dJ;yj$M zVnT&u+^ubWKa3 zYv+MlVr&-%bZJwgL9?_2Df)7~^HalK>|;KrMoe451*uAtVxC_b9ArN9{r0fK&%WrHW}bip zDlQ|d1C~@dp`lOQ&p1PkIEVoi1hHiyYBgLg?qz+tcfj;Zt}S?8p`j647FXeF6;D*K zDFx4YsziXiM!|YvbBa`TK{F@=c@={SP7!Ynk6QgvP65{pim5YLkZ!A?09JH1+|oZ{ zkjCfDi{>0fVFE*Sv^oq+#Rz*&s@3FX4Wk%Su*C9ut}7YEen-Li3pd+2==m-?Xk?ho z9%2O+q9RtXDoONxj=x*pGRmGKc{AXbr(!}ut7QC$K4H2Z2cT)^O}!^5p|VK4zlo*F z-r|AqsOAxl4xgx9y)i8p^JLHq%Bppqnj0$Fc_F^u6DXIyN<1fVM8%YXQw7htJuwVF zOye}3L>R&Z^^dsD6x(oL646~nzHI+L%qP1}pfPZY?MA@uHjAcjN*@tAKUKri@N@!P zh?iNLCR$N z#q-%LDplO+y2i8|ZL+uls~hnmyhO!|89-%=yw&hhyo__xD3Bsmt+QZ1El=+(@^xXl=LjK)mm6?9v5rP-1KujLm);1U-mc*tcqf~OVNZusmK9&l zML?iv_Db5`t>Ha*uY#rF2#RNQRg){v>IK9kI`7nQmk_$%GbZWLRk%mP`!Pc!`DCC9 z_M|q58k82&&=s`J!7-@GRP35KYupI>gA;`c^ow_{3QipyL*4kGhWjN7b(qJWsE{Af z@L_y}fs~SB3VIh3$O1=GGd`x_>+Eo#PiOSIT+k^Ij{5qb8zouzF*F_3Kj)-1a`qLUWYxNCnolq z{)kiXviJplrQ(;oj0BS+@ZPc~oiS6-1;KHn5#8W4{2IUE92&1IDR?Bw;7Br5zQ?c& zMbm4^InG#VqCIibh=`t8sS*?}CbuvAWoYvFvdLK=Y2IZNi+#L)wJ%?cpRd5mESt(7 zG<+8;m#g?a7oxSlYWP90_Ls`qzclfK7u(Rq7O+ zeEh9ER)kpMG&)$v_EwLKTwD00@<~1$_?f{HUbbr2cpOixE#%-|&c6%)V)JT_PXpLmsy1a*GO+eMr1#oAhtwSkCuzzujD zP7V~DLg7s8`>9+L4-Cc@n7IpU>SuA<3^wpvQ`-!-M4#LExeDjZ;@lauS4^#@Y6&2V z%~Z679&g2ZUS7r9(Da7L^a@;DWqK!fi0SL-j)cE$(>>@E+efi0gIV;_;4JnZMSlhZ ze0R8h23O|VW^pZF%wTAs;zSd(!hc6$Ew=MkdoIqzj=+J{q2kDab#$mm^jVV_rz>@^ zDOJyBC&ptZSH!7yN(vrJo19I@=py|oB@AW*#T`_5VItC{aimX9jns~m?pQ#iPmw*d zc*XU>9%s-3dQ-#C|+4)sNfhhfw*v`)~v4_JUj+5j~0*hB$W~ z#mg1JzpVoO3~t`Lc^0oEA6^r{P!~}1B$5-@LoW9cwM&TorKCWP8Q2@Rb82WNa;Jf` zxCyrq*Da(=k>4_SBjqJa;k#SoceiqF1>RJZrQ7CY=|Soj>ex};*2T;?nr2X0907Vq3}`iw$HMX#caBr3(Yp_n5slpyx%r@Gb$@6e zsO*o<;z2R{$?);h^2kI+kDr^xmsa7}48EF3#96FF@J!SIldW|KtN6cylQDt|U@;Y= zOu!hXNV)6z?Piw!?JRleP+^0(BTmRI_*RsVZ>QlyU1366Y7vOI6m*O4r02t9-}Z3^ zN{M{5gqBxiWbjdUxgmWoXhLU4)|SxP;W~D|N&^UoLPtW?l2{ezD3!sFgF;?L9Y5jkPp^cMXa0W1 ochWF^%irJOkN8vY?a%ld{vLe$2mXym@gMHupyk-hDD^n;zf5w0C;$Ke literal 0 HcmV?d00001 From 26d825daaf584bfe3c60c81d008295141fd76182 Mon Sep 17 00:00:00 2001 From: Florent TRIMOREAU Date: Mon, 6 Dec 2021 18:25:01 +0100 Subject: [PATCH 03/12] Pom --- .../spring-boot-skeleton/pom.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.properties b/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.properties index cb38bf6c15..e6641de2ff 100644 --- a/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.properties +++ b/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.properties @@ -1,5 +1,5 @@ #Generated by Maven Integration for Eclipse -#Mon Dec 06 16:17:11 CET 2021 +#Mon Dec 06 18:23:45 CET 2021 m2e.projectLocation=C\:\\Users\\Draflosword\\git\\JavaDA_PROJECT7_RESTAPI\\Poseiden-skeleton m2e.projectName=Poseiden-skeleton groupId=net.guides.springboothelloworld From b5d9b1484185652632f65e1d9d8eb812a4d8a268 Mon Sep 17 00:00:00 2001 From: Florent TRIMOREAU Date: Wed, 8 Dec 2021 10:56:53 +0100 Subject: [PATCH 04/12] Finished CurvePoint functionality and tests --- .../controllers/CurveController.java | 52 +++++-- .../com/nnk/springboot/domain/CurvePoint.java | 50 +++++++ .../services/CurvePointService.java | 48 ++++++ .../src/main/resources/application.properties | 7 +- .../resources/templates/bidList/update.html | 6 +- .../resources/templates/curvePoint/add.html | 28 +++- .../resources/templates/curvePoint/list.html | 14 +- .../templates/curvePoint/update.html | 28 +++- .../com/nnk/springboot/CurvePointTests.java | 94 ++++++------ .../controllers/BidListControllerTests.java | 8 +- .../controllers/CurveControllerTest.java | 141 ++++++++++++++++++ .../services/CurvePointServiceTest.java | 109 ++++++++++++++ .../spring-boot-skeleton/pom.properties | 2 +- .../target/classes/application.properties | 7 +- .../controllers/CurveController.class | Bin 2525 -> 3824 bytes .../nnk/springboot/domain/CurvePoint.class | Bin 850 -> 3176 bytes .../services/CurvePointService.class | Bin 0 -> 3313 bytes .../classes/templates/bidList/update.html | 6 +- .../classes/templates/curvePoint/add.html | 28 +++- .../classes/templates/curvePoint/list.html | 14 +- .../classes/templates/curvePoint/update.html | 28 +++- .../com/nnk/springboot/CurvePointTests.class | Bin 0 -> 2269 bytes .../controllers/BidListControllerTests.class | Bin 8210 -> 8186 bytes .../controllers/CurveControllerTest.class | Bin 0 -> 7633 bytes .../services/CurvePointServiceTest.class | Bin 0 -> 5955 bytes 25 files changed, 574 insertions(+), 96 deletions(-) create mode 100644 Poseiden-skeleton/src/main/java/com/nnk/springboot/services/CurvePointService.java create mode 100644 Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/CurveControllerTest.java create mode 100644 Poseiden-skeleton/src/test/java/com/nnk/springboot/services/CurvePointServiceTest.java create mode 100644 Poseiden-skeleton/target/classes/com/nnk/springboot/services/CurvePointService.class create mode 100644 Poseiden-skeleton/target/test-classes/com/nnk/springboot/CurvePointTests.class create mode 100644 Poseiden-skeleton/target/test-classes/com/nnk/springboot/controllers/CurveControllerTest.class create mode 100644 Poseiden-skeleton/target/test-classes/com/nnk/springboot/services/CurvePointServiceTest.class diff --git a/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/CurveController.java b/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/CurveController.java index db69caf549..d69de03a20 100644 --- a/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/CurveController.java +++ b/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/CurveController.java @@ -1,54 +1,74 @@ package com.nnk.springboot.controllers; import com.nnk.springboot.domain.CurvePoint; +import com.nnk.springboot.services.CurvePointService; + +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; +import javax.persistence.EntityNotFoundException; import javax.validation.Valid; @Controller public class CurveController { - // TODO: Inject Curve Point service + + @Autowired + private CurvePointService curvePointService; @RequestMapping("/curvePoint/list") - public String home(Model model) - { - // TODO: find all Curve Point, add to model + public String home(Model model) { + model.addAttribute("curvePointList", curvePointService.findAll()); return "curvePoint/list"; } @GetMapping("/curvePoint/add") - public String addBidForm(CurvePoint bid) { + public String addCurveForm(Model model) { + model.addAttribute("curvePoint", new CurvePoint()); return "curvePoint/add"; } @PostMapping("/curvePoint/validate") - public String validate(@Valid CurvePoint curvePoint, BindingResult result, Model model) { - // TODO: check data valid and save to db, after saving return Curve list - return "curvePoint/add"; + public String validate(@Valid @ModelAttribute("curvePoint") CurvePoint curvePoint, BindingResult result, Model model) { + if (result.hasErrors()) { + return "curvePoint/add"; + } else { + curvePointService.createCurvePoint(curvePoint); + return "redirect:/curvePoint/list"; + } + } @GetMapping("/curvePoint/update/{id}") public String showUpdateForm(@PathVariable("id") Integer id, Model model) { - // TODO: get CurvePoint by Id and to model then show to the form + CurvePoint curvePoint = curvePointService.findById(id); + model.addAttribute("curvePoint", curvePoint); return "curvePoint/update"; } @PostMapping("/curvePoint/update/{id}") - public String updateBid(@PathVariable("id") Integer id, @Valid CurvePoint curvePoint, - BindingResult result, Model model) { - // TODO: check required fields, if valid call service to update Curve and return Curve list - return "redirect:/curvePoint/list"; + public String updateCurvePoint(@PathVariable("id") Integer id, @Valid CurvePoint curvePoint, BindingResult result, Model model) { + if (result.hasErrors()) { + return "curvePoint/update"; + } else { + try { + curvePointService.updateCurvePoint(curvePoint, id); + } catch (EntityNotFoundException e) { + model.addAttribute("message", e.getMessage()); + } + return "redirect:/curvePoint/list"; + } } @GetMapping("/curvePoint/delete/{id}") - public String deleteBid(@PathVariable("id") Integer id, Model model) { - // TODO: Find Curve by Id and delete the Curve, return to Curve list - return "redirect:/curvePoint/list"; + public String deleteCurvePoint(@PathVariable("id") Integer id, Model model) { + curvePointService.deleteById(id); + return "redirect:/curvePoint/list"; } } diff --git a/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/CurvePoint.java b/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/CurvePoint.java index 1c4f1cd179..edef0164fd 100644 --- a/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/CurvePoint.java +++ b/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/CurvePoint.java @@ -3,9 +3,11 @@ import org.hibernate.validator.constraints.Length; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.Setter; import javax.persistence.*; +import javax.validation.constraints.Min; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import java.sql.Timestamp; @@ -15,9 +17,57 @@ @Getter @Setter @Table(name = "curvepoint") +@NoArgsConstructor public class CurvePoint { + public CurvePoint(Integer CurveId, Double term, Double value) { + this.CurveId​ = CurveId; + this.term​ = term; + this.value​ = value; + } + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer Id; + + @NotNull + @Min(value = 0, message = "curveId must be positive") + @Column(name = "CurveId", nullable = false) + private Integer CurveId​; + + private Timestamp asOfDate​; + + @NotNull + @Min(value = 0, message = "term must be positive") + private Double term​; + + @NotNull + @Min(value = 0, message = "term must be positive") + private Double value​; + + private Timestamp creationDate​; + + public void setCurveId(Integer CurveId) { + this.CurveId​ = CurveId; + } + + public Integer getCurveId() { + return CurveId​; + } + + public void setTerm(Double term) { + this.term​ = term; + } + + public Double getTerm() { + return term​; + } + + public void setValue(Double value) { + this.value​ = value; + } + + public Double getValue() { + return value​; + } } diff --git a/Poseiden-skeleton/src/main/java/com/nnk/springboot/services/CurvePointService.java b/Poseiden-skeleton/src/main/java/com/nnk/springboot/services/CurvePointService.java new file mode 100644 index 0000000000..df5ea46e12 --- /dev/null +++ b/Poseiden-skeleton/src/main/java/com/nnk/springboot/services/CurvePointService.java @@ -0,0 +1,48 @@ +package com.nnk.springboot.services; + +import java.sql.Timestamp; +import java.util.List; + +import javax.persistence.EntityNotFoundException; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.nnk.springboot.domain.CurvePoint; +import com.nnk.springboot.repositories.CurvePointRepository; + +@Service +public class CurvePointService { + + @Autowired + private CurvePointRepository curvePointRepository; + + public List findAll() { + return curvePointRepository.findAll(); + } + + public CurvePoint createCurvePoint(CurvePoint curvePoint) { + curvePoint.setCreationDate​(new Timestamp(System.currentTimeMillis())); + return curvePointRepository.save(curvePoint); + } + + public CurvePoint updateCurvePoint(CurvePoint curvePoint, int id) throws EntityNotFoundException { + if (curvePointRepository.findById(id) == null) { + throw new EntityNotFoundException("CurvePoint does not exists"); + } + CurvePoint updatedCurvePoint = curvePointRepository.getById(id); + updatedCurvePoint.setCurveId(curvePoint.getCurveId​()); + updatedCurvePoint.setTerm(curvePoint.getTerm​()); + updatedCurvePoint.setValue(curvePoint.getValue​()); + return curvePointRepository.save(updatedCurvePoint); + } + + public CurvePoint findById(int id) { + return curvePointRepository.findById(id).orElseThrow(() -> new EntityNotFoundException("BidList does not exists")); + } + + public void deleteById(int id) { + curvePointRepository.deleteById(id); + } + +} diff --git a/Poseiden-skeleton/src/main/resources/application.properties b/Poseiden-skeleton/src/main/resources/application.properties index dd0e5e23ca..b4511230f5 100644 --- a/Poseiden-skeleton/src/main/resources/application.properties +++ b/Poseiden-skeleton/src/main/resources/application.properties @@ -2,8 +2,8 @@ logging.level.org.springframework=INFO ################### DataSource Configuration ########################## -spring.datasource.driver-class-name=com.mysql.jdbc.Driver -spring.datasource.url=jdbc:mysql://localhost:3306/demo?useSSL=false +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +spring.datasource.url=jdbc:mysql://localhost:3306/demo?allowPublicKeyRetrieval=true&useSSL=false spring.datasource.username=Draflo@localhost spring.datasource.password=rootroot @@ -12,4 +12,5 @@ spring.datasource.password=rootroot spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl -spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl \ No newline at end of file +spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl +spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL8Dialect \ No newline at end of file diff --git a/Poseiden-skeleton/src/main/resources/templates/bidList/update.html b/Poseiden-skeleton/src/main/resources/templates/bidList/update.html index 514b29c77c..51a55ca73b 100644 --- a/Poseiden-skeleton/src/main/resources/templates/bidList/update.html +++ b/Poseiden-skeleton/src/main/resources/templates/bidList/update.html @@ -8,13 +8,14 @@
+

Update Bid

-
+
@@ -33,8 +34,7 @@

Update Bid

-
- +
Cancel diff --git a/Poseiden-skeleton/src/main/resources/templates/curvePoint/add.html b/Poseiden-skeleton/src/main/resources/templates/curvePoint/add.html index 28d17cb645..c04c594f43 100644 --- a/Poseiden-skeleton/src/main/resources/templates/curvePoint/add.html +++ b/Poseiden-skeleton/src/main/resources/templates/curvePoint/add.html @@ -15,10 +15,30 @@

Add New Curve Point

- - +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ Cancel + +
+
diff --git a/Poseiden-skeleton/src/main/resources/templates/curvePoint/list.html b/Poseiden-skeleton/src/main/resources/templates/curvePoint/list.html index 469836149b..9041ee960f 100644 --- a/Poseiden-skeleton/src/main/resources/templates/curvePoint/list.html +++ b/Poseiden-skeleton/src/main/resources/templates/curvePoint/list.html @@ -37,7 +37,19 @@ - + + You don't have any Curve Point registered + + + Curve Point Id + Curve Id + Term + Value + + Edit |  + Delete + +
diff --git a/Poseiden-skeleton/src/main/resources/templates/curvePoint/update.html b/Poseiden-skeleton/src/main/resources/templates/curvePoint/update.html index e7f5a0d330..dc5fb295df 100644 --- a/Poseiden-skeleton/src/main/resources/templates/curvePoint/update.html +++ b/Poseiden-skeleton/src/main/resources/templates/curvePoint/update.html @@ -14,9 +14,31 @@

Update CurvePoint

- +
+ +
+ +

+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ Cancel + +
+
diff --git a/Poseiden-skeleton/src/test/java/com/nnk/springboot/CurvePointTests.java b/Poseiden-skeleton/src/test/java/com/nnk/springboot/CurvePointTests.java index dc083ce8c9..04eb6ba47e 100644 --- a/Poseiden-skeleton/src/test/java/com/nnk/springboot/CurvePointTests.java +++ b/Poseiden-skeleton/src/test/java/com/nnk/springboot/CurvePointTests.java @@ -1,47 +1,47 @@ -//package com.nnk.springboot; -// -//import com.nnk.springboot.domain.CurvePoint; -//import com.nnk.springboot.repositories.CurvePointRepository; -//import org.junit.Assert; -//import org.junit.Test; -//import org.junit.runner.RunWith; -//import org.springframework.beans.factory.annotation.Autowired; -//import org.springframework.boot.test.context.SpringBootTest; -//import org.springframework.test.context.junit4.SpringRunner; -// -//import java.util.List; -//import java.util.Optional; -// -//@RunWith(SpringRunner.class) -//@SpringBootTest -//public class CurvePointTests { -// -// @Autowired -// private CurvePointRepository curvePointRepository; -// -// @Test -// public void curvePointTest() { -// CurvePoint curvePoint = new CurvePoint(10, 10d, 30d); -// -// // Save -// curvePoint = curvePointRepository.save(curvePoint); -// Assert.assertNotNull(curvePoint.getId()); -// Assert.assertTrue(curvePoint.getCurveId() == 10); -// -// // Update -// curvePoint.setCurveId(20); -// curvePoint = curvePointRepository.save(curvePoint); -// Assert.assertTrue(curvePoint.getCurveId() == 20); -// -// // Find -// List listResult = curvePointRepository.findAll(); -// Assert.assertTrue(listResult.size() > 0); -// -// // Delete -// Integer id = curvePoint.getId(); -// curvePointRepository.delete(curvePoint); -// Optional curvePointList = curvePointRepository.findById(id); -// Assert.assertFalse(curvePointList.isPresent()); -// } -// -//} +package com.nnk.springboot; + +import com.nnk.springboot.domain.CurvePoint; +import com.nnk.springboot.repositories.CurvePointRepository; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.List; +import java.util.Optional; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class CurvePointTests { + + @Autowired + private CurvePointRepository curvePointRepository; + + @Test + public void curvePointTest() { + CurvePoint curvePoint = new CurvePoint(10, 10d, 30d); + + // Save + curvePoint = curvePointRepository.save(curvePoint); + Assert.assertNotNull(curvePoint.getId()); + Assert.assertTrue(curvePoint.getCurveId() == 10); + + // Update + curvePoint.setCurveId​(20); + curvePoint = curvePointRepository.save(curvePoint); + Assert.assertTrue(curvePoint.getCurveId() == 20); + + // Find + List listResult = curvePointRepository.findAll(); + Assert.assertTrue(listResult.size() > 0); + + // Delete + Integer id = curvePoint.getId(); + curvePointRepository.delete(curvePoint); + Optional curvePointList = curvePointRepository.findById(id); + Assert.assertFalse(curvePointList.isPresent()); + } + +} diff --git a/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/BidListControllerTests.java b/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/BidListControllerTests.java index 0eebc46ec6..361e437d8b 100644 --- a/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/BidListControllerTests.java +++ b/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/BidListControllerTests.java @@ -64,7 +64,7 @@ void testAddBidForm() throws Exception { @Test @WithMockUser - void testValidate() throws Exception { + void testValidateAlreadyExistException() throws Exception { when(bidListService.createBidList(Mockito.any(BidList.class))).thenThrow(AlreadyExistException.class); mockMvc.perform(post("/bidList/validate").with(csrf().asHeader()).param("account", "test").param("type", "test") .param("bidQuantity", "10.0")).andExpect(status().isFound()) @@ -73,7 +73,7 @@ void testValidate() throws Exception { @Test @WithMockUser - void testValidateAlreadyExistException() throws Exception { + void testValidate() throws Exception { mockMvc.perform(post("/bidList/validate").with(csrf().asHeader()).param("account", "test").param("type", "test") .param("bidQuantity", "10.0")).andExpect(status().isFound()) .andExpect(view().name("redirect:/bidList/list")); @@ -124,8 +124,8 @@ void testUpdateBidHasError() throws Exception { @WithMockUser void testUpdateBid() throws Exception { BidList bidList = new BidList(); - when(bidListService.updateBidList(bidList, 0)).thenReturn(bidList); - mockMvc.perform(post("/bidList/update/0").with(csrf().asHeader()).param("id", "1").param("account", "test") + when(bidListService.updateBidList(bidList, 1)).thenReturn(bidList); + mockMvc.perform(post("/bidList/update/1").with(csrf().asHeader()).param("id", "1").param("account", "test") .param("type", "test").param("bidQuantity", "10.0")) .andExpect(status().isFound()) .andExpect(view().name("redirect:/bidList/list")) diff --git a/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/CurveControllerTest.java b/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/CurveControllerTest.java new file mode 100644 index 0000000000..15eae65ef7 --- /dev/null +++ b/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/CurveControllerTest.java @@ -0,0 +1,141 @@ +package com.nnk.springboot.controllers; + +import static org.mockito.Mockito.when; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; +import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view; + +import javax.persistence.EntityNotFoundException; + +import org.junit.Before; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; + +import com.nnk.springboot.domain.CurvePoint; +import com.nnk.springboot.security.UserDetailsServiceImpl; +import com.nnk.springboot.services.CurvePointService; + +@WebMvcTest(controllers = CurveController.class) +class CurveControllerTest { + + @Autowired + private MockMvc mockMvc; + + @Autowired + private WebApplicationContext context; + + @MockBean + private CurvePointService curvePointService; + + @MockBean + private UserDetailsServiceImpl userDetailsServiceImpl; + + @Before + void setup() { + mockMvc = MockMvcBuilders.webAppContextSetup(context).apply(springSecurity()).build(); + } + + @Test + @WithMockUser + final void testCurvePointList() throws Exception { + mockMvc.perform(get("/curvePoint/list").with(csrf().asHeader())).andExpect(status().isOk()) + .andExpect(view().name("curvePoint/list")); + } + + @Test + @WithMockUser + final void testAddCurveForm() throws Exception { + mockMvc.perform(get("/curvePoint/add").with(csrf().asHeader())).andExpect(status().isOk()) + .andExpect(view().name("curvePoint/add")); + } + + @Test + @WithMockUser + final void testValidate() throws Exception { + mockMvc.perform(post("/curvePoint/validate").with(csrf().asHeader()).param("curveId", "1").param("term", "5.0") + .param("value", "10.0")).andExpect(status().isFound()) + .andExpect(view().name("redirect:/curvePoint/list")); + } + + @Test + @WithMockUser + final void testValidateHasError() throws Exception { + mockMvc.perform(post("/curvePoint/validate").with(csrf().asHeader()) + .param("curveId", " ").param("term", "5.0") + .param("value", "10.0")) + .andExpect(status().isOk()) + .andExpect(view().name("curvePoint/add")) + .andExpect(model().hasErrors()); + } + + @Test + @WithMockUser + final void testShowUpdateForm() throws Exception { + CurvePoint curvePoint = new CurvePoint(); + curvePoint.setId(1); + curvePoint.setCurveId(2); + curvePoint.setTerm​(5.0); + curvePoint.setValue​(10.0); + when(curvePointService.findById(1)).thenReturn(curvePoint); + mockMvc.perform(get("/curvePoint/update/1").with(csrf().asHeader())) + .andExpect(status().isOk()) + .andExpect(view().name("curvePoint/update")) + .andExpect(model().hasNoErrors()) + .andExpect(model().attribute("curvePoint", curvePoint)); + } + + @Test + @WithMockUser + final void testUpdateCurvePoint() throws Exception { + CurvePoint curvePoint = new CurvePoint(); + when(curvePointService.updateCurvePoint(curvePoint, 1)).thenReturn(curvePoint); + mockMvc.perform(post("/curvePoint/update/1").with(csrf().asHeader()).param("id", "1").param("curveId", "2") + .param("term", "5.0").param("value", "10.0")) + .andExpect(status().isFound()) + .andExpect(view().name("redirect:/curvePoint/list")) + .andExpect(model().hasNoErrors()); + } + + @Test + @WithMockUser + final void testUpdateCurvePointHasError() throws Exception { + mockMvc.perform(post("/curvePoint/update/1").with(csrf().asHeader()) + .param("curveId", " ").param("term", " ") + .param("value", "10.0")) + .andExpect(status().isOk()) + .andExpect(view().name("curvePoint/update")) + .andExpect(model().hasErrors()); + } + + @Test + @WithMockUser + final void testUpdateCurvePointNotFound() throws Exception { + when(curvePointService.updateCurvePoint(Mockito.any(CurvePoint.class), Mockito.anyInt())).thenThrow(EntityNotFoundException.class); + mockMvc.perform(post("/curvePoint/update/1").with(csrf().asHeader()) + .param("curveId", "1").param("term", "5.0") + .param("value", "10.0")) + .andExpect(status().isFound()) + .andExpect(view().name("redirect:/curvePoint/list")) + .andExpect(model().hasNoErrors()); + } + + @Test + @WithMockUser + final void testDeleteCurvePoint() throws Exception { + mockMvc.perform(get("/curvePoint/delete/0").with(csrf().asHeader())) + .andExpect(status().isFound()) + .andExpect(view().name("redirect:/curvePoint/list")); + } + +} diff --git a/Poseiden-skeleton/src/test/java/com/nnk/springboot/services/CurvePointServiceTest.java b/Poseiden-skeleton/src/test/java/com/nnk/springboot/services/CurvePointServiceTest.java new file mode 100644 index 0000000000..2166b04f9f --- /dev/null +++ b/Poseiden-skeleton/src/test/java/com/nnk/springboot/services/CurvePointServiceTest.java @@ -0,0 +1,109 @@ +package com.nnk.springboot.services; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +import javax.persistence.EntityNotFoundException; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; + +import com.nnk.springboot.domain.CurvePoint; +import com.nnk.springboot.repositories.CurvePointRepository; +import com.nnk.springboot.security.UserDetailsServiceImpl; + +@WebMvcTest(CurvePointService.class) +class CurvePointServiceTest { + + @MockBean + private CurvePointRepository curvePointRepository; + + @MockBean + private UserDetailsServiceImpl userDetailsServiceImpl; + + @Autowired + private CurvePointService curvePointService; + + private static CurvePoint curvePoint = new CurvePoint(); + + @BeforeEach + private void init() { + curvePoint.setId(1); + curvePoint.setCurveId​(1); + curvePoint.setTerm​(5.0); + curvePoint.setValue​(2.0); + + } + + @Test + final void testFindAll() { + List findAll = new ArrayList<>(); + findAll.add(curvePoint); + when(curvePointRepository.findAll()).thenReturn(findAll); + List foundList = curvePointService.findAll(); + assertThat(foundList).isEqualTo(findAll); + } + + @Test + final void testCreateCurvePoint() { + CurvePoint createCurvePoint = new CurvePoint(); + createCurvePoint.setId(2); + createCurvePoint.setCurveId​(1); + createCurvePoint.setTerm​(20.0); + createCurvePoint.setValue​(10.0); + when(curvePointRepository.save(createCurvePoint)).thenReturn(createCurvePoint); + curvePointService.createCurvePoint(createCurvePoint); + verify(curvePointRepository).save(createCurvePoint); + } + + @Test + final void testUpdateCurvePoint() { + CurvePoint toUpdateCurvePoint = new CurvePoint(); + toUpdateCurvePoint.setId(1); + toUpdateCurvePoint.setCurveId​(1); + toUpdateCurvePoint.setTerm​(10.5); + toUpdateCurvePoint.setValue​(5.0); + when(curvePointRepository.findById(1)).thenReturn(Optional.of(curvePoint)); + when(curvePointRepository.getById(1)).thenReturn(curvePoint); + when(curvePointRepository.save(toUpdateCurvePoint)).thenReturn(toUpdateCurvePoint); + curvePointService.updateCurvePoint(toUpdateCurvePoint, 1); + assertThat(curvePoint.getCurveId​()).isEqualTo(1); + assertThat(curvePoint.getTerm​()).isEqualTo(10.5); + assertThat(curvePoint.getValue​()).isEqualTo(5.0); + } + + @Test + final void testUpdateBidListThrowEntityNotFoundException() { + when(curvePointRepository.findById(1)).thenReturn(null); + assertThrows(EntityNotFoundException.class, () -> curvePointService.updateCurvePoint(curvePoint, 1)); + } + + @Test + final void testFindById() { + when(curvePointRepository.findById(1)).thenReturn(Optional.of(curvePoint)); + CurvePoint foudCurvePoint = curvePointService.findById(1); + assertThat(foudCurvePoint).isEqualTo(curvePoint); + } + + @Test + final void testFindByIdNotFound() throws EntityNotFoundException { + assertThrows(EntityNotFoundException.class, () -> curvePointService.findById(0)); + } + + @Test + final void testDeleteById() { + when(curvePointRepository.findById(1)).thenReturn(Optional.of(curvePoint)); + curvePointService.deleteById(1); + verify(curvePointRepository).deleteById(1); + } + +} diff --git a/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.properties b/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.properties index e6641de2ff..172893b2cb 100644 --- a/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.properties +++ b/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.properties @@ -1,5 +1,5 @@ #Generated by Maven Integration for Eclipse -#Mon Dec 06 18:23:45 CET 2021 +#Wed Dec 08 09:43:08 CET 2021 m2e.projectLocation=C\:\\Users\\Draflosword\\git\\JavaDA_PROJECT7_RESTAPI\\Poseiden-skeleton m2e.projectName=Poseiden-skeleton groupId=net.guides.springboothelloworld diff --git a/Poseiden-skeleton/target/classes/application.properties b/Poseiden-skeleton/target/classes/application.properties index 73bfc2fcac..da5362891f 100644 --- a/Poseiden-skeleton/target/classes/application.properties +++ b/Poseiden-skeleton/target/classes/application.properties @@ -2,8 +2,8 @@ logging.level.org.springframework=INFO ################### DataSource Configuration ########################## -spring.datasource.driver-class-name=com.mysql.jdbc.Driver -spring.datasource.url=jdbc:mysql://localhost:3306/demo?useSSL=false +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +spring.datasource.url=jdbc:mysql://localhost:3306/demo?allowPublicKeyRetrieval=true&useSSL=false spring.datasource.username=Draflo@localhost spring.datasource.password=rootroot @@ -12,4 +12,5 @@ spring.datasource.password=rootroot spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl -spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl \ No newline at end of file +spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl +spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL8Dialect \ No newline at end of file diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/controllers/CurveController.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/controllers/CurveController.class index 3d5ed6b7a15fe30eb1ce333f0c76ef6a7b3933c2..84c6d4627c23d16b24d089925a6b2bbf41e7fa48 100644 GIT binary patch literal 3824 zcmbVOYf}?f7=BI?NQfaIA`)*^Yn7{uidI3fh@dF9f<8G*o^#&!eJaJ;9Wr16BwzJ_^x$fvC zW5;$jwXC6AWo=#0xwf;X>9qygWW}|2OvlJGZ0jA@DyBBi zii+d?b9G`@Tqy_FhU4BbvRc-(@LsQM=P3TH-TP( zbp7KTzqLW&WC|^4P2x1p#&Jeq__G8|;R~D-h_AD*$zqW#_W6h^u36M%lJO(BfQxZ_ zDR4SW&MFlte1%H_DLtQ`bjd`v;u6P$zE24XeDS1OjId zUrjRS4Yy$Dmvretms`Xub4vPu#&${qqoEypi1`ofI-NwD!yG=3OvP3=DArr(y0a;4~o z&#uZE?(iF-8N&ElvV->S4iZ+!b)m6|)P!p2CcVlxyIKIps$}M~Hk{hEHGk6E6Zj^M zdjdmY4h*Dfpe%(++!tso=;dk0v8AEdr(Vci_#lO8%+PZ=$Dn4)V@hFxg(lVOZ%*U{ z93qtwk6%{ZM^AVf0(sgW5aO%k0DP4;a5}w?I$z;v%t+zOrciQ-9q*JAhw8^PvR+7 z<9Noyvfk$XDpOd)cif#kK50YQvuS}@X@M6hyu|k$l3n%w-YoZUf8T7=s{YV$G;1Ch zfn$NTStW`#^M->qdlyP+GfgO*_ygq+CHAnsA<4<5@ET-fvB}NQJa6kf$4W-ItZ(q9 zP{5lwOcF13+ts$%^tmStD`#laysx->3${CBSFHT>ZqC?}_mvbj!NVlE!3OU|5$LX- zhU(%}JKqJx9`w6W6OrkqP99V|d4e)EIMy3hj+G=iDU`t-ob^^R$noW^SnhwdA+3LoZGMhE|=yb0*UQU2nM0>>C$hD`HUH~)^mgeap&1$@G> z2*-{McAXgb9hrTc`iS#UtaV*}&(B`?q?&SyAy2CmJ>C*O1s9_q0}MRK6)n`94>t6M zyu-D;SNy!OYF_P6Tz&ol*ZsVs|IK@zc`h`c_a?q3ja9t2YI$#CjCFNOxZ`}eBL~VD z;VV={6%NGs-aGUWcLm;|wQKafq-1a(Q)^uhWm!?hc9)uWnX>ee?ExGoaLN3Dx4uS8 zFQd;g4P)Xlo+!M%imE8)R5X#oJYRT^?BPR}B`Iu=sN?s7=(u&Dj!QI+tRP+2 r@vUdY;LdzV_8uu*=e*f9T1+Q(|3&-MnLhLf^hb62?aHwwXTzj;M%w#1-}jxfNB-yEzy2nob$T>K9;3Cc>hm~$ z$J0R~}$?2FCO#1vH+&Akow10DtO9{;}cR&+I^Q;%dU_1BF2 z=E^Rk%BBiMoqU=;LsdG(Xtph5@jUByMDjA|M1oPHt-3+98zj<Yqb*Fb1 z;crEO>}-)Fz|`mpqnQFn%pp5E67O3lgU6@_1!Wj$i1_OXIXTe}%^;%u38IGZ?1(gr zbj!JWq_i_x?m5r6^x0O$Y*;7?H0E`^oO`2~mXh#-&DtM%fyb^<2Dw`wON?8XSX#K% zPLPG;Wf>S_b2o~@nW_RBC?BW?mPSd}e152F{e{Ysu6Qa<6<*jZ*Y`D39vR(sf=f|r zgwn_jKK>%KXo+yK@kt??LJ#F0?HTnbc~OybZzY8s`ar%*CE6qk55NFZqQAvpY}0v3mx+_N24C>AS4 z6lK9)VX11-+?zzRX3-eK#&e!nrZ+}oq_b&crL&|g!pcZGpgxptzG4BF<$G|9d=F0` Y-x0v;A10qiUxA@V8#avQQniTw1F1Jvu>b%7 diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/domain/CurvePoint.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/domain/CurvePoint.class index 39ee1292a50bce0a262ee174d85e2bfd07c5a28d..b9631b28ccfaaff663617484742c63809218f1ad 100644 GIT binary patch literal 3176 zcmbtW+fo}x5bY62!a`gOLVz7?j2$9m>`h{FGXzW!#&WpDR+LKK7HJ}{Bkd}?D=NI@ zJwKCFg-TT(@&Wmbd`K#%XP1>$43w(E!|u*Z_vv%Gds_Vc@1K7W(Heb|ri7peHK%3R z_78^Fb}hSc;yAuhcUq=p8#^8MR31B)?Wbv2(Bxb5)HIr=-7t<$-pZOUC{eBpn%?go zlx<%&q`NL?{#D2Jt(L4>o^{fc+qUiarf)g6Cn&Exelpt9^(@bqc1;@PI-Hg?2Yb?% zuIbBq)ogYoj7B`4*NwAl?GdSR)>iiA((YlUT=`Z|MoB8y|M~eBLCayVQ?qH+6*Z#< zdH{!F&p34a!%nl=!|Dpd1Iva{5~m%RL}t~Wpma-mp4pIs=4zbCa(%JY@%+UTx!86* z%ePK(bW0<6$7yz23^{C@E!d<((ok-Lkcn&#aSTBV@f@?>Se{2s@96sya;5a12_vlWK9yt7h;{vD?-Gc-iYSz4m^1Pv8dsyCo}B}-$J;;)BUTA(}p^(ae=bVty{ zzGch9PU}Rv6;73)sePwrHmjy<@jBcb_TO0O#O3`#+MjE|X}}#gkp3H|er&oZ4YmN0 z@uVMBD6iAYS~86utC_+|kK&88pcH_rs5mpdIAM|)CJmUtA{WDm$~6LrDt98f1-9X5 z5})Ndr|DUil9UoO*5#vWIF9vpZ@1(x@ZO}?B{c}nsPW(+``YQaHTm4)mY7flQ={!M z4=?>i+{FO%&rtk%Rjv5EQhkK8jJn)yo|4dp9>vW}QG&CKRT`_CSdHM#3CKtqr7Skk zzj*TT5?sddp1^wYC9J1C%Fzr~d5>mk?mL>NTR5Mi#5A!bo^jg*mjf0Fz6&904)1={ zyVv5}g$HiX|MEw1!6OHuOLQMd53p+DJ{{a!F3wC4D1#Ie|n!jz>4u_RdV_3L&ccCCh;{yPjEgq1OvhmVUy?N8hsR! z*~B}6y_6!-4WCiFPe5W#h0F(5QOHynlHrp=!3+ABJ^?suH1HODRQ#O^zv3f7EQ&jT zV8kM_fkB8U=u`R(R_q+(RP5)p4o(|aaANU7Nd_mDi-Ak)c=mHD_H)|Oa@x>y>M2u@ zryX!AUBQXV5OE69|GAdaYCoqvEvHRwlDGPuZ)%;lwa%9+q<8*;b~LFh4Ho&iR`aDg z=p*lGoi8O!@BBhbyF3`}FQc3C6x|u!l&x-820cA>MfHQJ7v7R2uAiWNJ!D}}NS>5Y zLyalO13C=vPK;$~P)Ht^5#((Jc@(vN46^4sUN4*{Zv?rZAdmHsJ-6w4NFK%!D+-n!!Yp)3twtBv_QO>W(BG0h|GMJ5)hc{U?O?d^o6c>S|fX0^j~5fJH3P2{f?G`M3Ol z=x(YU{9A6OSS4fJ-lIBH-QRvhG|djHdSjCKWsm>G8<5^&Pw^HA8E9AJ4rZtU{Tj8) IP_MxH4>Q6o2LJ#7 diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/services/CurvePointService.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/services/CurvePointService.class new file mode 100644 index 0000000000000000000000000000000000000000..5caec6fb19412565d914cff3567e130cfb7773d3 GIT binary patch literal 3313 zcmbVO`%~0b6#njl24X-&p#?3VqTPjJw6#`UYYQt>>;mdiTKf*03q-QXn%peVr+q){ z`!8u{I{2Dt`&(x^{VV#1bb4-*-3AHvhJ5X%UPUvU7`Ejt5`+u>$$+I@XM~{h(ffapqZiLx=}H7+i({3nfdFyC>Zt? zYnE4e+4U{qdTR`)^4p+$RRe2-hx)!OL(kQ~5mt%MS-v%I^HIlfg&{20@fl9%U2id_ zyWklmzT$ez`aCxrUtcha(z9;VHt3^)a91pkn*_V_oaI>JJVR4DGsn=Jb4{+I32ho$ zp)%~wTMnNNO7q;CHOMbRXWlIu_MG8aavm=>izSPQ=-Wm2VC~4ivS2ypsBIH&I+G7& z41{ItdCM2{xV2y{I)(^5a(s4+!MW|+nQqCjoJ69s=d-O~ctpbv?A(PO>{rmsaPt2o zLPIC^Qof5GHw3R21H*K>F*2FP%oOyKB%vPu4O^e3%=^M9l~o+XVFiaa)LdcB7rdll z5JwpHP~myp5pv6vW!o|@l-x@y`tZ2SYMRoVzLc3$F@z@+3^NRFBgGaOHH_dGaq_vy z$>^!{E|3QQ+`L8FrlZttpqkChNwtq_IDse0r*Bj!i$`PAM6+b$#3z>+)OrKauEta& zRi?ODa?Q(zYy-hP3ce#Ko12m~(_peD8_X859bYZ-a@daw&N5_V>Q?nKF`!E3PLb>5 z)W2eF+7%OS;FvXg73XkX!LyXP`YAH$2)@WY4bS0uYLbd!2YhCMp*u~KwwPt5&SM&K zxWLdNJ8Eog(qu?KSnIIKW_&@)n*Qp9*3KiJFaRdV3rh>g(lBX z8A*52Y1KL^;W-U2;}xgzYE z_l0Maqtk@y|0X_G@DanIdh=OM#a-rlJ`9Qsjrgk7@CiO8mFfJcE;0O_EZ}%&1b)$Q zOq=_IdDmSI%GpGB$IX>k*|2ezNGHu3e;B!Z_}*mRW8|D++XYMT?CzcTklt{rrIvICHIY{5D?rz5e7<$YOeAcpX#gxFW}w)^SaaZ>-~O zX*iPP+7v3;7mD9U-1>>_K@8&%5ju=4y`|)EB;-F7k*M*%67wfwD8i)ZhH(^}Vrs$y z(QN|j4TEbtNA!ARCMo;LxCS&Bq zgCBdDh`qGey@(X*H56rO1Z_B$fN!tCw{L;(P-VAJc4QDk6sG)B!(6OUF6sr4WGw@2 n#=G>L!h5w!f1l
+

Update Bid

-
+
@@ -33,8 +34,7 @@

Update Bid

-
- +
Cancel diff --git a/Poseiden-skeleton/target/classes/templates/curvePoint/add.html b/Poseiden-skeleton/target/classes/templates/curvePoint/add.html index df25715899..ef0a2eba7d 100644 --- a/Poseiden-skeleton/target/classes/templates/curvePoint/add.html +++ b/Poseiden-skeleton/target/classes/templates/curvePoint/add.html @@ -15,10 +15,30 @@

Add New Curve Point

- - +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ Cancel + +
+
diff --git a/Poseiden-skeleton/target/classes/templates/curvePoint/list.html b/Poseiden-skeleton/target/classes/templates/curvePoint/list.html index bec05b5d15..649c762ac7 100644 --- a/Poseiden-skeleton/target/classes/templates/curvePoint/list.html +++ b/Poseiden-skeleton/target/classes/templates/curvePoint/list.html @@ -37,7 +37,19 @@ - + + You don't have any Curve Point registered + + + Curve Point Id + Curve Id + Term + Value + + Edit |  + Delete + +
diff --git a/Poseiden-skeleton/target/classes/templates/curvePoint/update.html b/Poseiden-skeleton/target/classes/templates/curvePoint/update.html index dff83d36c1..84aad0d8b2 100644 --- a/Poseiden-skeleton/target/classes/templates/curvePoint/update.html +++ b/Poseiden-skeleton/target/classes/templates/curvePoint/update.html @@ -14,9 +14,31 @@

Update CurvePoint

- +
+ +
+ +

+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ Cancel + +
+
diff --git a/Poseiden-skeleton/target/test-classes/com/nnk/springboot/CurvePointTests.class b/Poseiden-skeleton/target/test-classes/com/nnk/springboot/CurvePointTests.class new file mode 100644 index 0000000000000000000000000000000000000000..60eec729afc00d29af8b675159121fcab4b3a691 GIT binary patch literal 2269 zcmb7FOH&+G6#nio(4lDpAp?daYQTid@JRc>hz#QJ5FH%`1e^#yduA@fg`V!QA0Vz= zT4iPB!kuMR7FooNRTcrQvRwN!{2eLFbGv7lCQOyui@x3Wp7Wh^zVo<${{8Fk04Cun zh%pS8?5b{Ad%9b5gjFfpwx=)n&OTqYh2?E<*K-xb8G3h(eM2`5tD>(IcX`QUNR&?H z)_Bc!g=ag540m%aAf1MQ;BExJsh4ILT=OkYRCz(TqG<9t%d$Pg6Sn0tOyz8+QulG& zF{=E)cJ}llH!N4*HcHa6Zk#IUbG~OE2#1#mwqr(E!kcAiOQs48@ddlgRkWd7Lnl;* zo}93F-mez9vtf{3hQ6F#GR%VE2>D;%jC(tR9J$#lx~B*uqZgapNDhg=Ab?$;T+!uD zT0uXdwV5j}z zN;*9%p2v`a8)q`QX!{hX#2RMkPcB9g!ZQMxZ2%-NBB{I0Fr92+Dza7AJ-?GGbb=wJ zp&cDv7{i2uafZnjZ2W8CXt)EN(&`%fl)90qM`59+qtVp2R3z|{hL`aQLwkjL*|Ll~ zDp=RU@rr<8|B`YvY;GFAn$I~!{*BQEv;4g1`dEYc8P9)xj3k7L0tzkx5RLNpc zGTE}s?W~43kzu$%4OftP3`#XCEzfIMz#?gcHZ~l27*B4c0=y*+Z{r>Ez&*wL>+5f2 z4MaR>1d=L9qTki<9&%JL+rlc(Nq74iVf&si^_-y6>_Q%^3Rb9$gGxF*(eS=>H13M8 zxI|mmupuevD07p0!B#=TJ$y*PNCWeSlGtR_odzMHhXL|RO*Xk<64zV!Siwi+RMT$b zRKq9ul%Z3&s}6U$MLk6gy(L-tT!SH5>Izv}GEA3fQkyMEb=j?bntTjf=R774P%=|Z}XUXlEh-!ne|DoQ! z?ir=MWusOfcIvwAJ0-p(QW&mACYs}07I$(5z z15hv7G{V00!j_uU*Ms|q5D16>S}O+E(;4khZJw^JV5(w>=1Ln)D$0}`F0?B2C)W$K z#%QIXPwy`J(`jY2wvRrB_H%H2k={}mxP%^hYoP#o>0g5Ok#g)5@-poa5EG=+PTxQM zhQwyCdW?Ytt{>yM1YV%`W8BJ({(|J#2}Wc1gUVv;2rnLEl9uTsywR)v2qpdy@wQ{k zjrAr-{RnTJ(+ETp5m6~|f-J-G_z9L7eu$uufqWfdEe82Dae@zGn2ry|kFa@+&t$xD z$atrN_Z1A{8gAn{&C_Qwj~g^7hOmiYRB;Oj7{ND4;XX$3J$3#AjN=g|0*)rb*y|h( z;yV;kBCZaoHOt_{*L}Klwo#$PJRtgaAjtAASstLXP->69!ZVZ3s&v+mjwhH^kjSu9 ehCPutU_K+WYSCc~c94V~`l^wsFG_IW0{;Nzv0LQ; literal 0 HcmV?d00001 diff --git a/Poseiden-skeleton/target/test-classes/com/nnk/springboot/controllers/BidListControllerTests.class b/Poseiden-skeleton/target/test-classes/com/nnk/springboot/controllers/BidListControllerTests.class index 10680c27c7fbc318ab2dfb0d053d472e3c59ccdf..97d330a96c4901f844e182f1b02918f36cc1b7d2 100644 GIT binary patch delta 307 zcmbQ_@XMa-)W2Q(7#J8#7)3X7De+D&5m4G}$!pEb%TtnCToRU;lbMoOlDc`Cz%&*M zMg~ccU}ynI$SE_$C$qT3FTcbszcep}i=mm3jfat)k%N(eEitdsGp~e^fmuV-lbw-k za) zck)TuBy(SeMutp=28JAlCWdl`W`-6ZoWRh=AOxd_V)382N!N iV_@K8U}O{kV!>zz#$-kzMq!{B7tmNQ1{X#V21x+)0Z3W^ delta 309 zcmexmKgogX)W2Q(7#J8#7{xboDe?01l%y7ygeB%=rX-f6ZuaA~W}d9WtF(EVz%&+d z4n|f+20{I#%oLx@;u8JR0+1SggULFg3KASVjGT;Ij0|jvd6k}dC5#Nr8k(N$j69Q5 zMC};)H!l|5%dY*5ft`T~XxF6O3=NUn8BY0VZDFX>X5Plgu!EsbdndzdCWdgJkg+f$ z%j7QEPIEtoMuseg28LXQCWZ=zW`SGsGY!F^Drr0C^k?T?~g9eljpJ zFfg)B4wO=!oGT~J#SSr9n2~#OpWJ#zUXX-976UU#8G{MLCcepq@^RV%KmjI3L7@8> h82A_%8HIpYIGTYmnNfsM6ez|8)Z)e9!YIZd2>^VXLKFZ1 diff --git a/Poseiden-skeleton/target/test-classes/com/nnk/springboot/controllers/CurveControllerTest.class b/Poseiden-skeleton/target/test-classes/com/nnk/springboot/controllers/CurveControllerTest.class new file mode 100644 index 0000000000000000000000000000000000000000..1bba895137d628bd4f00f7f98f52013640e888f1 GIT binary patch literal 7633 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 literal 0 HcmV?d00001 diff --git a/Poseiden-skeleton/target/test-classes/com/nnk/springboot/services/CurvePointServiceTest.class b/Poseiden-skeleton/target/test-classes/com/nnk/springboot/services/CurvePointServiceTest.class new file mode 100644 index 0000000000000000000000000000000000000000..c874f671da41a4bded0d05051532321c71ef1b3e GIT binary patch literal 5955 zcmbVQX?Wb!6+N0bRx(yL+oTCiAp|G2<0K+vAuuV4?Id8BBoG_BK%i)5WLx%F8Z;U^ zDP1UE=|*?D?=7V(U4Ya$(9(2oDc$$IrTf1B?bmakG&8a-r~Ybxv84CzyZ4@Rm-k*C z`_IFV0@#Uv>qu$Xp7+L0*BvvtGpuj~Y#e^SHlY=Q;9D&WkpQeT(Ru=ZHR4V-a% zz$rVqqTS`XUSI`|=ax0>%6k5A`O$4#E_JT1 z5ZeJeu$*E!g48=+Dr(r7b|CnwEnRhXLJ@4I++rEK~*rY+9u!8#h+d*$ZL=yx% z21Im=fvqCCjG{eK8oh-lZojK>e=DnxKWS{o4jmWIsHFp5h5U#^J2jlsejx5fIH$bW zZQv5@Vf3lG-}c9;SHxqkM8X{djr)}~vDbpV2A(GCnz(L2(5i(^QZk1ex6oB&C9Io= zOey`0jxG%?ikeE`6wNN*w@zlAa*)P;tZu>q9MW-6!}7X_%o?}?S2EYE0x6r}XV^S4 z9XCk+TxDP}8k>;C5gmtFlnJ@`KRbtkqqv6A9I66pZjV@09*aBV@EH1a^bw2n5$P7y zM!~0n>mW5TIbypSE{oGzbysmzT~-b%xg2|^dDI}+zB5gDI&RQ$J*z5iW|egTN6l`zfjW1p`atL;e2tyDpNEVHS??sRU%z# zK$@xn8_fN5DAGS-v9NYT*z3%7DCBe02&!Jq6z=T`sln>rov5Ng3 z`}(|OpUosoC`|pjpHw^KRosGDW0lTqKPO9J3zE(|Gg0>@wV^rfFLOD2Ppec-k8fLn zt*TpXla2d#hUM0{zb$-`Y@Rf50^AB4%GLy%;ig28^?nm2nS}f{1JA;39jZhk6vMvj$!&dQ;wzF!*u)igKW(mP*k;B|OC+c{mRw{vM{@g^N@Da4k;8>OV)q@gQLNL65-Lh8zu1D{)d zBvz}bx8Q9$-l}19aup}7lJa^xk0Y{~EqoO{Z^1haybJfR84zo2e`%cow6+`NaIfHe zkA{75oYf8J?50Dh8p`+K13KQXq2sLn#uo|54{F#ZTjhcmDU2U7@L|E&M2z*lusQH% z=Q~@jlzKSa?WmU0KjM3n2YEaVP9E`sL(*vup2*uOvvoW`1d`Dw%#!Vw*@0{~Z=3Uo zH?x>d8Tc5cnBMjY9ytT{h+7gfc>X@GcIS|Sx#ysvikp|3GY=~Das(p<(|B0NX$|Xz zx4DbLpoBZaBlx%mBW%G6I!|nU@o4uHIhj!rn5!wte7t6qM&%TZ2-R{HsaE+XrNNvb zp_0Z6EY=)8Eh+gK4VT27oUwU_U}8IAI2)oSJDS_+Is>r>=RmDAi@Q(@39J@$>c}M^5?Y)*%Jey3~Idu&sFmuq(9iGUm4CldHozmI$yLnTUURgS9 z2P0mgoW{@a3mre_b)deLI_`uwW}8`siGo&ioigwQe#zP&uMcT>JRZSlWvKj0%Pkb` za$DB(#ww*u?3~>f$gMd(GGk#sj~f5qWN7m2YvV-}neDNP#XequGAkPK)0J42W}5ug zz<01}g^u5FAR7CVf$yuaKXQO&*Xz2rud3KC>-f8djdMs$qC&?%HJo>LQJyD4-msp| zEMmKBKuQk!{L=X)&n0}Ou#}gS*<(EW#>SRWE-jZ#J`Jv-^PH6y+R63u)AR^hu73#U zJcu>-^D~8W`BzK;ZFsU8;UBrWMhi_oWp?rAhp=w;lC^4yct8O>1?TaZ!uedBs`Xc zT4sVHsAnqR(|FDqWJ4*1GE9n1%s1dN`k0|ld$ERh;|-*C3-+Oh*V!z(a1*)}V!=Ys zYKRATEMGxXEAhM}EZUj~%c&ZcC?jH6?x%4pOQc^deeAOEn3ms%c@XS zaHB}h%R$2wUO7m~DZFMHZ{XLP!>@NtW Date: Thu, 9 Dec 2021 10:16:27 +0100 Subject: [PATCH 05/12] CRUD functionality Rating implemented and tested --- .../controllers/CurveController.java | 3 +- .../controllers/RatingController.java | 53 ++++--- .../com/nnk/springboot/domain/Rating.java | 79 ++++++++-- .../services/CurvePointService.java | 2 +- .../springboot/services/RatingService.java | 47 ++++++ .../main/resources/templates/bidList/add.html | 2 +- .../main/resources/templates/rating/add.html | 37 ++++- .../main/resources/templates/rating/list.html | 15 +- .../resources/templates/rating/update.html | 36 ++++- .../controllers/RatingControllerTest.java | 142 ++++++++++++++++++ .../services/RatingServiceTest.java | 104 +++++++++++++ .../spring-boot-skeleton/pom.properties | 2 +- .../controllers/CurveController.class | Bin 3824 -> 3824 bytes .../controllers/RatingController.class | Bin 2475 -> 3724 bytes .../com/nnk/springboot/domain/Rating.class | Bin 834 -> 2303 bytes .../services/CurvePointService.class | Bin 3313 -> 3284 bytes .../springboot/services/RatingService.class | Bin 0 -> 3103 bytes .../target/classes/templates/bidList/add.html | 2 +- .../target/classes/templates/rating/add.html | 37 ++++- .../target/classes/templates/rating/list.html | 15 +- .../classes/templates/rating/update.html | 36 ++++- .../controllers/RatingControllerTest.class | Bin 0 -> 7825 bytes .../services/RatingServiceTest.class | Bin 0 -> 5743 bytes 23 files changed, 563 insertions(+), 49 deletions(-) create mode 100644 Poseiden-skeleton/src/main/java/com/nnk/springboot/services/RatingService.java create mode 100644 Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/RatingControllerTest.java create mode 100644 Poseiden-skeleton/src/test/java/com/nnk/springboot/services/RatingServiceTest.java create mode 100644 Poseiden-skeleton/target/classes/com/nnk/springboot/services/RatingService.class create mode 100644 Poseiden-skeleton/target/test-classes/com/nnk/springboot/controllers/RatingControllerTest.class create mode 100644 Poseiden-skeleton/target/test-classes/com/nnk/springboot/services/RatingServiceTest.class diff --git a/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/CurveController.java b/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/CurveController.java index d69de03a20..0869bb0272 100644 --- a/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/CurveController.java +++ b/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/CurveController.java @@ -41,8 +41,7 @@ public String validate(@Valid @ModelAttribute("curvePoint") CurvePoint curvePoin } else { curvePointService.createCurvePoint(curvePoint); return "redirect:/curvePoint/list"; - } - + } } @GetMapping("/curvePoint/update/{id}") diff --git a/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/RatingController.java b/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/RatingController.java index 5e15e68fbc..b1f2f674eb 100644 --- a/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/RatingController.java +++ b/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/RatingController.java @@ -1,54 +1,73 @@ package com.nnk.springboot.controllers; -import com.nnk.springboot.domain.Rating; +import javax.persistence.EntityNotFoundException; +import javax.validation.Valid; + +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; -import javax.validation.Valid; +import com.nnk.springboot.domain.Rating; +import com.nnk.springboot.services.RatingService; @Controller public class RatingController { - // TODO: Inject Rating service + + @Autowired + private RatingService ratingService; @RequestMapping("/rating/list") - public String home(Model model) - { - // TODO: find all Rating, add to model + public String home(Model model) { + model.addAttribute("ratingList", ratingService.findAll()); return "rating/list"; } @GetMapping("/rating/add") - public String addRatingForm(Rating rating) { + public String addRatingForm(Model model) { + model.addAttribute("rating", new Rating()); return "rating/add"; } @PostMapping("/rating/validate") - public String validate(@Valid Rating rating, BindingResult result, Model model) { - // TODO: check data valid and save to db, after saving return Rating list - return "rating/add"; + public String validate(@Valid @ModelAttribute("rating") Rating rating, BindingResult result, Model model) { + if (result.hasErrors()) { + return "rating/add"; + } else { + ratingService.createRating(rating); + return "redirect:/rating/list"; + } } @GetMapping("/rating/update/{id}") public String showUpdateForm(@PathVariable("id") Integer id, Model model) { - // TODO: get Rating by Id and to model then show to the form + Rating rating = ratingService.findById(id); + model.addAttribute("rating", rating); return "rating/update"; } @PostMapping("/rating/update/{id}") - public String updateRating(@PathVariable("id") Integer id, @Valid Rating rating, - BindingResult result, Model model) { - // TODO: check required fields, if valid call service to update Rating and return Rating list - return "redirect:/rating/list"; + public String updateRating(@PathVariable("id") Integer id, @Valid Rating rating, BindingResult result, Model model) { + if (result.hasErrors()) { + return "rating/update"; + } else { + try { + ratingService.updateRating(rating, id); + } catch (EntityNotFoundException e) { + model.addAttribute("message", e.getMessage()); + } + return "redirect:/rating/list"; + } } @GetMapping("/rating/delete/{id}") public String deleteRating(@PathVariable("id") Integer id, Model model) { - // TODO: Find Rating by Id and delete the Rating, return to Rating list - return "redirect:/rating/list"; + ratingService.deleteById(id); + return "redirect:/rating/list"; } } diff --git a/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/Rating.java b/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/Rating.java index a8988eb119..f71a56a10d 100644 --- a/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/Rating.java +++ b/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/Rating.java @@ -1,22 +1,81 @@ package com.nnk.springboot.domain; -import javax.persistence.*; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; -import lombok.Getter; -import lombok.Setter; - -import java.sql.Timestamp; +import lombok.NoArgsConstructor; @Entity -@Getter -@Setter @Table(name = "rating") +@NoArgsConstructor public class Rating { + public Rating(String moodysrating, String sandpRating, String fitchrating, int ordernumber) { + this.moodysRating​ = moodysrating; + this.sandPRating​ = sandpRating; + this.fitchRating​ = fitchrating; + this.orderNumber​ = ordernumber; + } + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "Id") private Integer Id; - // TODO: Map columns in data table RATING with corresponding java fields + + @Column(name = "moodysRating") + private String moodysRating​; + + @Column(name = "sandPRating") + private String sandPRating​; + + + @Column(name = "fitchRating") + private String fitchRating​; + + @Column(name = "orderNumber") + private Integer orderNumber​; + + public Integer getId() { + return Id; + } + + public void setId(Integer id) { + Id = id; + } + + public void setMoodysRating(String moodysRating) { + this.moodysRating​ = moodysRating; + } + + public String getMoodysRating() { + return moodysRating​; + } + + public String getSandPRating() { + return sandPRating​; + } + + public void setSandPRating(String sandPRating) { + this.sandPRating​ = sandPRating; + } + + public String getFitchRating() { + return fitchRating​; + } + + public void setFitchRating(String fitchRating) { + this.fitchRating​ = fitchRating; + } + + public Integer getOrderNumber() { + return orderNumber​; + } + + public void setOrderNumber(Integer orderNumber) { + this.orderNumber​ = orderNumber; + } } diff --git a/Poseiden-skeleton/src/main/java/com/nnk/springboot/services/CurvePointService.java b/Poseiden-skeleton/src/main/java/com/nnk/springboot/services/CurvePointService.java index df5ea46e12..60ae648652 100644 --- a/Poseiden-skeleton/src/main/java/com/nnk/springboot/services/CurvePointService.java +++ b/Poseiden-skeleton/src/main/java/com/nnk/springboot/services/CurvePointService.java @@ -38,7 +38,7 @@ public CurvePoint updateCurvePoint(CurvePoint curvePoint, int id) throws EntityN } public CurvePoint findById(int id) { - return curvePointRepository.findById(id).orElseThrow(() -> new EntityNotFoundException("BidList does not exists")); + return curvePointRepository.findById(id).orElseThrow(() -> new EntityNotFoundException("CurvePoint does not exists")); } public void deleteById(int id) { diff --git a/Poseiden-skeleton/src/main/java/com/nnk/springboot/services/RatingService.java b/Poseiden-skeleton/src/main/java/com/nnk/springboot/services/RatingService.java new file mode 100644 index 0000000000..d21da848b0 --- /dev/null +++ b/Poseiden-skeleton/src/main/java/com/nnk/springboot/services/RatingService.java @@ -0,0 +1,47 @@ +package com.nnk.springboot.services; + +import java.util.List; + +import javax.persistence.EntityNotFoundException; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.nnk.springboot.domain.Rating; +import com.nnk.springboot.repositories.RatingRepository; + +@Service +public class RatingService { + + @Autowired + private RatingRepository ratingRepository; + + public List findAll() { + return ratingRepository.findAll(); + } + + public Rating createRating(Rating rating) { + return ratingRepository.save(rating); + } + + public Rating updateRating(Rating rating, int id) throws EntityNotFoundException { + if (ratingRepository.findById(id) == null) { + throw new EntityNotFoundException("Rating does not exists"); + } + Rating updatedRating = ratingRepository.getById(id); + updatedRating.setMoodysRating(rating.getMoodysRating()); + updatedRating.setSandPRating(rating.getSandPRating()); + updatedRating.setFitchRating(rating.getFitchRating()); + updatedRating.setOrderNumber(rating.getOrderNumber()); + return ratingRepository.save(updatedRating); + } + + public Rating findById(int id) { + return ratingRepository.findById(id).orElseThrow(() -> new EntityNotFoundException("Rating does not exists")); + } + + public void deleteById(int id) { + ratingRepository.deleteById(id); + } + +} diff --git a/Poseiden-skeleton/src/main/resources/templates/bidList/add.html b/Poseiden-skeleton/src/main/resources/templates/bidList/add.html index 94e33a5e31..71ab66cd90 100644 --- a/Poseiden-skeleton/src/main/resources/templates/bidList/add.html +++ b/Poseiden-skeleton/src/main/resources/templates/bidList/add.html @@ -32,7 +32,7 @@

Add New Bid

- +
diff --git a/Poseiden-skeleton/src/main/resources/templates/rating/add.html b/Poseiden-skeleton/src/main/resources/templates/rating/add.html index 8090e5382e..8ec931d872 100644 --- a/Poseiden-skeleton/src/main/resources/templates/rating/add.html +++ b/Poseiden-skeleton/src/main/resources/templates/rating/add.html @@ -15,10 +15,39 @@

Add New Rating

- - +
+ +
+ +

+
+
+
+ +
+ +

+
+
+
+ +
+ +

+
+
+
+ +
+ +
+
+
+
+ Cancel + +
+
diff --git a/Poseiden-skeleton/src/main/resources/templates/rating/list.html b/Poseiden-skeleton/src/main/resources/templates/rating/list.html index bfbb403b84..0c3cd4e14f 100644 --- a/Poseiden-skeleton/src/main/resources/templates/rating/list.html +++ b/Poseiden-skeleton/src/main/resources/templates/rating/list.html @@ -38,7 +38,20 @@ - + + You don't have any rating registered + + + Rating Id + MoodysRating + SandPRating + FitchRating + Order + + Edit |  + Delete + +
diff --git a/Poseiden-skeleton/src/main/resources/templates/rating/update.html b/Poseiden-skeleton/src/main/resources/templates/rating/update.html index 1e1914100a..d43240671f 100644 --- a/Poseiden-skeleton/src/main/resources/templates/rating/update.html +++ b/Poseiden-skeleton/src/main/resources/templates/rating/update.html @@ -15,9 +15,39 @@

Update Rating

- +
+ +
+ +

+
+
+
+ +
+ +

+
+
+
+ +
+ +

+
+
+
+ +
+ +
+
+
+
+ Cancel + +
+
diff --git a/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/RatingControllerTest.java b/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/RatingControllerTest.java new file mode 100644 index 0000000000..f403de208c --- /dev/null +++ b/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/RatingControllerTest.java @@ -0,0 +1,142 @@ +package com.nnk.springboot.controllers; + +import static org.mockito.Mockito.when; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; +import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view; + +import javax.persistence.EntityNotFoundException; + +import org.junit.Before; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; + +import com.nnk.springboot.domain.Rating; +import com.nnk.springboot.security.UserDetailsServiceImpl; +import com.nnk.springboot.services.RatingService; + +@WebMvcTest(controllers = RatingController.class) +class RatingControllerTest { + + @Autowired + private MockMvc mockMvc; + + @Autowired + private WebApplicationContext context; + + @MockBean + private RatingService ratingService; + + @MockBean + private UserDetailsServiceImpl userDetailsServiceImpl; + + @Before + void setup() { + mockMvc = MockMvcBuilders.webAppContextSetup(context).apply(springSecurity()).build(); + } + + @Test + @WithMockUser + final void testRatingList() throws Exception { + mockMvc.perform(get("/rating/list").with(csrf().asHeader())).andExpect(status().isOk()) + .andExpect(view().name("rating/list")); + } + + @Test + @WithMockUser + final void testAddRatingForm() throws Exception { + mockMvc.perform(get("/rating/add").with(csrf().asHeader())).andExpect(status().isOk()) + .andExpect(view().name("rating/add")); + } + + @Test + @WithMockUser + final void testValidate() throws Exception { + mockMvc.perform(post("/rating/validate").with(csrf().asHeader()).param("moodysRating", "Mood") + .param("sandPRating", "Sand").param("fitchRating", "Fitch").param("orderNumber", "2")) + .andExpect(status().isFound()) + .andExpect(view().name("redirect:/rating/list")); + } + + @Test + @WithMockUser + void testValidateHasError() throws Exception { + mockMvc.perform(post("/rating/validate").with(csrf().asHeader()).param("moodysRating", "Mood") + .param("sandPRating", "Sand").param("fitchRating", "Fitch").param("orderNumber", "text")) + .andExpect(status().isOk()) + .andExpect(view().name("rating/add")) + .andExpect(model().hasErrors()) + .andExpect(model().attributeHasFieldErrorCode("rating", "orderNumber", "typeMismatch")); + } + + @Test + @WithMockUser + final void testShowUpdateForm() throws Exception { + Rating rating = new Rating(); + rating.setId(1); + rating.setMoodysRating("Mood"); + rating.setSandPRating("Sand"); + rating.setFitchRating("Fitch"); + rating.setOrderNumber(1); + when(ratingService.findById(1)).thenReturn(rating); + mockMvc.perform(get("/rating/update/1").with(csrf().asHeader())) + .andExpect(status().isOk()) + .andExpect(view().name("rating/update")) + .andExpect(model().hasNoErrors()) + .andExpect(model().attribute("rating", rating)); + } + + @Test + @WithMockUser + final void testUpdateRating() throws Exception { + Rating rating = new Rating(); + when(ratingService.updateRating(rating, 1)).thenReturn(rating); + mockMvc.perform(post("/rating/update/1").with(csrf().asHeader()).param("moodysRating", "Mood") + .param("sandPRating", "Sand").param("fitchRating", "Fitch").param("orderNumber", "1")) + .andExpect(status().isFound()) + .andExpect(view().name("redirect:/rating/list")) + .andExpect(model().hasNoErrors()); + } + + @Test + @WithMockUser + void testUpdateRatingHasError() throws Exception { + mockMvc.perform(post("/rating/update/1").with(csrf().asHeader()).param("moodysRating", "Mood") + .param("sandPRating", "Sand").param("fitchRating", "Fitch").param("orderNumber", "text")) + .andExpect(status().isOk()) + .andExpect(view().name("rating/update")) + .andExpect(model().hasErrors()) + .andExpect(model().attributeHasFieldErrorCode("rating", "orderNumber", "typeMismatch")); + } + + @Test + @WithMockUser + void testUpdateRatingThrowEntityNotFoundException() throws Exception { + when(ratingService.updateRating(Mockito.any(Rating.class), Mockito.anyInt())).thenThrow(EntityNotFoundException.class); + mockMvc.perform(post("/rating/update/1").with(csrf().asHeader()).param("moodysRating", "Mood") + .param("sandPRating", "Sand").param("fitchRating", "Fitch").param("orderNumber", "1")) + .andExpect(status().isFound()) + .andExpect(view().name("redirect:/rating/list")) + .andExpect(model().hasNoErrors()); + } + + @Test + @WithMockUser + final void testDeleteRating() throws Exception { + mockMvc.perform(get("/rating/delete/0").with(csrf().asHeader())) + .andExpect(status().isFound()) + .andExpect(view().name("redirect:/rating/list")); + } + +} diff --git a/Poseiden-skeleton/src/test/java/com/nnk/springboot/services/RatingServiceTest.java b/Poseiden-skeleton/src/test/java/com/nnk/springboot/services/RatingServiceTest.java new file mode 100644 index 0000000000..0398dc4de4 --- /dev/null +++ b/Poseiden-skeleton/src/test/java/com/nnk/springboot/services/RatingServiceTest.java @@ -0,0 +1,104 @@ +package com.nnk.springboot.services; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +import javax.persistence.EntityNotFoundException; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; + +import com.nnk.springboot.domain.Rating; +import com.nnk.springboot.repositories.RatingRepository; +import com.nnk.springboot.security.UserDetailsServiceImpl; + +@WebMvcTest(RatingService.class) +class RatingServiceTest { + + @MockBean + private RatingRepository ratingRepository; + + @MockBean + private UserDetailsServiceImpl userDetailsServiceImpl; + + @Autowired + private RatingService ratingService; + + private static Rating rating = new Rating(); + + @BeforeEach + private void init() { + rating.setId(1); + rating.setMoodysRating("Mood"); + rating.setSandPRating("Sand"); + rating.setFitchRating("Fitch"); + rating.setOrderNumber(1); + } + + @Test + final void testFindAll() { + List findAll = new ArrayList<>(); + findAll.add(rating); + when(ratingRepository.findAll()).thenReturn(findAll); + List foundList = ratingService.findAll(); + assertThat(foundList).isEqualTo(findAll); + } + + @Test + final void testCreateRating() { + when(ratingRepository.save(rating)).thenReturn(rating); + ratingService.createRating(rating); + verify(ratingRepository).save(rating); + } + + @Test + final void testUpdateRating() { + Rating toUpdateRating = new Rating(); + toUpdateRating.setMoodysRating("Moody"); + toUpdateRating.setSandPRating("Sandy"); + toUpdateRating.setFitchRating("Fitchy"); + toUpdateRating.setOrderNumber(2); + when(ratingRepository.findById(1)).thenReturn(Optional.of(rating)); + when(ratingRepository.getById(1)).thenReturn(rating); + when(ratingRepository.save(toUpdateRating)).thenReturn(toUpdateRating); + ratingService.updateRating(toUpdateRating, 1); + assertThat(rating.getMoodysRating()).isEqualTo("Moody"); + assertThat(rating.getSandPRating()).isEqualTo("Sandy"); + assertThat(rating.getFitchRating()).isEqualTo("Fitchy"); + assertThat(rating.getOrderNumber()).isEqualTo(2); + } + + @Test + final void testUpdateRatingThrowEntityNotFoundException() { + when(ratingRepository.findById(1)).thenReturn(null); + assertThrows(EntityNotFoundException.class, () -> ratingService.updateRating(rating, 1)); + } + + @Test + final void testFindById() { + when(ratingRepository.findById(1)).thenReturn(Optional.of(rating)); + Rating foundRating = ratingService.findById(1); + assertThat(foundRating).isEqualTo(rating); + } + + @Test + final void testFindByIdNotFound() throws EntityNotFoundException { + assertThrows(EntityNotFoundException.class, () -> ratingService.findById(0)); + } + + @Test + final void testDeleteById() { + ratingRepository.deleteById(1); + verify(ratingRepository).deleteById(1); + } + +} diff --git a/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.properties b/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.properties index 172893b2cb..54cef4d9d0 100644 --- a/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.properties +++ b/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.properties @@ -1,5 +1,5 @@ #Generated by Maven Integration for Eclipse -#Wed Dec 08 09:43:08 CET 2021 +#Thu Dec 09 09:39:15 CET 2021 m2e.projectLocation=C\:\\Users\\Draflosword\\git\\JavaDA_PROJECT7_RESTAPI\\Poseiden-skeleton m2e.projectName=Poseiden-skeleton groupId=net.guides.springboothelloworld diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/controllers/CurveController.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/controllers/CurveController.class index 84c6d4627c23d16b24d089925a6b2bbf41e7fa48..10be478f957a95b9f68abe72843fc0246f67aa11 100644 GIT binary patch delta 57 zcmew$`$2ZYV;)XJ1|9|@1~CTX$!~bhh*~gkGFSpdY#1aNY#HPj>=<+z944RTz0B&y Mz|G)3c`2Va0GtaAHUIzs delta 57 zcmew$`$2ZYV;)W;1|9}u1~CSc$!~bhh*~mmGFSmcY#AgO>=@)2>=|?!94DXUz0B&) Mz|G(>c`2Va0G&1sK>z>% diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/controllers/RatingController.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/controllers/RatingController.class index c5b6acc574ad48112ecc834d946f254d44ace62b..765872d073d422d1de33010815f845e32d8dd87c 100644 GIT binary patch literal 3724 zcmbVOYf}?f7=BI?41@(STuQuEX|3FJQPHYcD=JVFkb*+h+PX;=vXbn^&4$Z#`lbJ& zANmXW)y{NqY-jod`lC91&e=;syCCg{WOvWyJ@0cl?>T?|_1hl+#<877LO?G#72UQs z^jg)m?Df3kcxpFp zf+;XE7ZbSV_l8k}!4m?xrMm4|6?4U^S^2U#Y1@v+c#d5YxIX8&>p^;Ju2C_!9Ct&{ zn}%J}*NlSaxI4NLP0%Onp0j1SW|3i!+_G%TyDg9$99j`b-E)d&21#^iXhTNe=$vJn z3-wCgbRQdBS0Fp*6pZqU;ac)LXiRw}i-}x{gLDvA%pg^ADhzvhFcw7J(&w2{d17d; z!RWFlh2Y$H;9F*1&s%n}8S|3)x^C9Id81nOr?zYw zLEyNC797doBu=MsN?_>Fs%iKTX9Ut~%w@7%CUt`Win?c&b-BPqI|lG^8XpOqjMFfL zui+d%VX{WCIO!36zV0#i`-A@`rK!a?9+^8R@lDZ!T62z3j!04)u$-@7359 z;<#CKn!Vc>ZU=$YJR_ccsmnr1J!Cbja-Brtsl#fIK5YAe1F=wq%8Q*56E1 z%^QB!_RMwD{XfR*4q?|-aQ!>0_`SfjSUjR!aR$!*hJiE?FY)?#yzJo*SG!l#1U(2deIa5a@2IeIYrtk>4HK z=*L(J-&auLN#0lLSRxOq1(J+{hL<1%Glwwx;W%33;ZredHDjG;dI_)6uy}q+eYW)~ zt2I4u+67ae;?2U_S#Z2*r*0RgwhLxe-Yhh1fTuuaorT$tBG3~aVd`oV9mIm7js(@^ z5RvH_jVBC`j8K-yk$$ssq$I`FPy=^n#&7pMlA=d=S;;Irb+=$nTk=}c>qlx_!!Amk zGOM_PJhwN}V)Mbuyl34D(YhCdbyMNG`tP{( z^ewIg>yH0(-LqV0;PC5S!>6P%#Cttj_Xch^?^G-m5T~eXM$^d>BCv#9O)B_sY)=p z0KoDto-T}L^$P*XFB&9wawvFp(QuibxYC3q7a_@E3EwItIhB8cqdOG3q{_H0!2w~m zFJZ(A;Ah*HYR*_A>>zoM$gTbTqfT1+p z+Q`wJr9h(ND$aE>dxJf<*!LMu^U`nucNDmaH9VG5j7WPmbaeL7vAVC0i!_bQptGUlYu}2^J9C=s%_v-F e{LvAv&Ing$Ae=NH%pMMcihq|-mG2#bm$m940 zPe+N25Bo}Gn2NJRMUhBSz87SezE{r7QjO8d^WbH`qaZ%y-}Il0gN)J4=Q5Vr7mWPY z_CBN9Jr#<1@@a07>NLaXR8Pj@>+!HJlBYpG5{#NXbr3}RK_a!CPu8-5Oc`D4{ZCk3 zgdC_L++J_>RC1Wp`7Q~D;z%Vg_*n8?K#IECy$SdyndXeMXZOZ&CWm5QrV?Q8#<9vk zT*bh0+v)E}^m$*#ArH#Ed{2Bo7HPH{j7HXN{bdl1foYK^Mn)dVG;7crqlL-@qxw)o zV|2k8s)P>VcSSZ(;p0H_%8(yMOFn&5 z6x@KLK^GX!=hR@MEUdw3^Yy40HK3OagA9`W@&+`VfO8kf9sd&fK_d1a7+kjE!^tlMH`GeLC?wH4U;s(H@|H zCsALYpy2cRvR)ajI?&?E*=2h(82#$x|Et0pbc4}aB0`y@!&=PRR3kIc{b~;yc{)rkV2jYR$9d*s_oiyvVZgq^VI)SC=A3|j)2R=E`r42$4 z#~%dIEWXgY@t%dnF*1zxoj<7YJ3c&`$6GHGouUQ27wra&ORyL%W8S9~d@sW~ji>o7 zv6NPg!&|UDtohA%e#208w{G06+vVIHHqtu1i$iCyyUt+f7-#9dN{n-5jQ5YlIDb6G zxf5bsq)U?+7fp-}+Jq1Vj}OWiAJS#4FZh_af)D-EN^J#wUA7FwOLn;eu}#--NJG@XJcDG;GafC9>-4EpC5vLcRz)!_*fT8E4VunzG;M>X zW0#$1v~;G7jC6*SL0BuL1L{J$(=`KlTE3en$am`veW~sc F{R@qJLEiuX diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/domain/Rating.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/domain/Rating.class index 16b24ab99057aeb06be1ac9250a4f2bcc2f5ab14..f5dcab5e9d958621216bcafd251d43c1f66293a9 100644 GIT binary patch literal 2303 zcma)7-E!MR7(MIwr?rh8*L6Zd6H@c%IBiv$Knp4TAx(m4+GLuHXSh_Xt)pT~8AQ2AkHLd5oL#xGY|Fq!yu06b_Sa*gt+H+o3?pv<0er!-VOEvLpRX zfrS@+H*|WkRR?+@>Uz>YK+VqE2z3_Ma&_~-tIZBjAR~JbcO1z*S5MX%Xidz z5KM~PE(-{gmVPF~6VE=dd|rJ>Hwt7r zGE}avHKvLAtcZ*flL;c^T>Mhrs8$V6IjmDA>RHTDs&cGL13xKvnJ14Tua0oIuwIG4 z!=c@j`Nji8><>*BAw~lEL$B|*<&LASsStJamU2PzGuq~B56^fZ3tHXi zY5szHKXDTAQ3`=IeYO&&njM|Z&j>b&Qkx%e zR3~SZz?lc)axYc``# delta 381 zcmZusy-vbV7(HKGu38JU{ve7X)Ir3-#mN{JXA>9Mn{cBYEJbZBAIIETs9ZV@isp84ah>{*y2Bm26Zl_N CswQ>- diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/services/CurvePointService.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/services/CurvePointService.class index 5caec6fb19412565d914cff3567e130cfb7773d3..fb3fc9d49b5b4aad189352ea35521de752f54467 100644 GIT binary patch delta 174 zcmew;c}0@z)W2Q(7#J8#7$$7wn$A9XAA1^G9YX^Anufz;*(iiqL7lGTC9+lU!ss&0pu1> zUdW!t*1*uj&d@lSmqVSonW1H}ImZLmdPW8jjmeG7!h!+}ZCnhD44pg-&YJJo2X1K&zP;Y8cpoG#gN3Es(AQVjdv7 am4TU|ouP}No1q6N0y4Ijp`T$QgCqccy(^gj diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/services/RatingService.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/services/RatingService.class new file mode 100644 index 0000000000000000000000000000000000000000..4bdd71c874edf1aae6e112fdb83bf066ca3a7bf0 GIT binary patch literal 3103 zcmb7G`BU3Q6#mvY5h&saNodGP$WdcLl&fi4r)hygLSsUTDJ{L%)?yT7tt-hKz0&*d zX=gg5q%&=QYG*qAn>u|f$+iF|PO~2~d zZn-FBVEV#au}i`?XL&%hLbTP8X6SjySGehLw`|T7ABs{yBroKe6;oeTUORpTexajeUSe4$gSrpv$%|%{P zR!!azFh^^FT(v!6k=p&YY}XEMGqh!f<{8rC(h@q_&}pCpIzxBfcE$Z#r6{~PPIei3 z^RmR9dG6V29~0BTl1+{bw~DMaUSwNav|Ve|aY$!oC?7&s3v9>C+kQaD9R<7W@}TCC z(HlD$ZnZLH$qKjKI5D}~xehQqXJ8-pA3#5jYdFSm`Tv4%pcjW2jFKmKAflu*OlEd> zU}$$1<=1Hg12{wA`+S9By^x8pNR&}7h9^nVaF$`9MKD`HpbSR^$S}COH&m|EB3P2v z1Fp&_5FRDfs8y{*;CJ>A_|zUEXV53sN}?Lpu!do3HdO*^W|gc`1qin!%n7RbVEw)f zCS}dF8vHs&U~0I;aIo2NQ*I#2!ZUCgSE#sFxKk4|iwu1ka%TryP9cBIpiX~*p?sjzPR?;5Cd=-w|zEN^9M(7u?}`3xq`wD^eok23}W&y8W#p>TJ@$ z9i^^|)D^gEJ&3faqbUP#D6uXQ+jf*UFkP3Lw1d)8Q)W2U;8fr9znvH0?D{@(w`Os%#lj_}XrrChF6 zbBRumdn7^GA~;7*C)xLY7@2&wY%;B}=5g*g1v?PA?){*-y0xL>H1^C} z-{(DWX#`KXuJFbk?)$>m@D0QH9XPf^L&J9rr=HD9H$(&-&XD0YY6$8wb!F13(N3-H zv}&}{Ujlj_pq)u8qjg{QF^r$+C50|}DrV4IH$9Dr0X;ZKJL(r4BCf;qp2Cq($#tSC zem(m$`ZjTt;m7c_sp)V+litvD0w+m_a$}6v6s=uK!|*0frSJy^w`(~XYUztOV=cGgh29&Far5`) zNiOu@{>bnKZf{^rtrHu#tJZrP2>(#XmZ?AXd=Y$eQAWaVKB&FaxZA1Add New Bid
- +
diff --git a/Poseiden-skeleton/target/classes/templates/rating/add.html b/Poseiden-skeleton/target/classes/templates/rating/add.html index 51d002b641..c65cd90eb4 100644 --- a/Poseiden-skeleton/target/classes/templates/rating/add.html +++ b/Poseiden-skeleton/target/classes/templates/rating/add.html @@ -15,10 +15,39 @@

Add New Rating

- - +
+ +
+ +

+
+
+
+ +
+ +

+
+
+
+ +
+ +

+
+
+
+ +
+ +
+
+
+
+ Cancel + +
+
diff --git a/Poseiden-skeleton/target/classes/templates/rating/list.html b/Poseiden-skeleton/target/classes/templates/rating/list.html index f5b292673b..dfa96a757e 100644 --- a/Poseiden-skeleton/target/classes/templates/rating/list.html +++ b/Poseiden-skeleton/target/classes/templates/rating/list.html @@ -38,7 +38,20 @@ - + + You don't have any rating registered + + + Rating Id + MoodysRating + SandPRating + FitchRating + Order + + Edit |  + Delete + +
diff --git a/Poseiden-skeleton/target/classes/templates/rating/update.html b/Poseiden-skeleton/target/classes/templates/rating/update.html index 046e158891..a6b4570d14 100644 --- a/Poseiden-skeleton/target/classes/templates/rating/update.html +++ b/Poseiden-skeleton/target/classes/templates/rating/update.html @@ -15,9 +15,39 @@

Update Rating

- +
+ +
+ +

+
+
+
+ +
+ +

+
+
+
+ +
+ +

+
+
+
+ +
+ +
+
+
+
+ Cancel + +
+
diff --git a/Poseiden-skeleton/target/test-classes/com/nnk/springboot/controllers/RatingControllerTest.class b/Poseiden-skeleton/target/test-classes/com/nnk/springboot/controllers/RatingControllerTest.class new file mode 100644 index 0000000000000000000000000000000000000000..5dc8c7afcc97b4574f9c613a6dabf5ca6d5d8203 GIT binary patch literal 7825 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 PoojNC`~&~Of3WWVehLiu literal 0 HcmV?d00001 From c362eff57991ae36c942b3c27e5ebafd38952151 Mon Sep 17 00:00:00 2001 From: Florent TRIMOREAU Date: Thu, 9 Dec 2021 12:21:30 +0100 Subject: [PATCH 06/12] CRUD RuleName implemented and tested commit ed08676aac9862eb3569a00510ff05b57decb0d2 Author: Florent TRIMOREAU Date: Thu Dec 09 10:42:01 2021 +0100 Few fix on branches --- .../controllers/RuleNameController.java | 51 ++++-- .../com/nnk/springboot/domain/RuleName.java | 34 +++- .../springboot/services/RuleNameService.java | 49 ++++++ .../resources/templates/ruleName/add.html | 52 +++++- .../resources/templates/ruleName/list.html | 25 ++- .../resources/templates/ruleName/update.html | 52 +++++- .../java/com/nnk/springboot/RatingTests.java | 92 +++++------ .../java/com/nnk/springboot/RuleTests.java | 92 +++++------ .../controllers/RuleNameControllerTest.java | 150 ++++++++++++++++++ .../services/RatingServiceTest.java | 14 +- .../services/RuleNameServiceTest.java | 119 ++++++++++++++ .../spring-boot-skeleton/pom.properties | 2 +- .../controllers/RuleNameController.class | Bin 2517 -> 3780 bytes .../com/nnk/springboot/domain/RuleName.class | Bin 842 -> 2575 bytes .../springboot/services/RuleNameService.class | Bin 0 -> 3199 bytes .../classes/templates/ruleName/add.html | 52 +++++- .../classes/templates/ruleName/list.html | 25 ++- .../classes/templates/ruleName/update.html | 52 +++++- .../com/nnk/springboot/RatingTests.class | Bin 0 -> 2194 bytes .../com/nnk/springboot/RuleTests.class | Bin 0 -> 2256 bytes .../controllers/RuleNameControllerTest.class | Bin 0 -> 8132 bytes .../services/RatingServiceTest.class | Bin 5743 -> 5833 bytes .../services/RuleNameServiceTest.class | Bin 0 -> 5849 bytes 23 files changed, 718 insertions(+), 143 deletions(-) create mode 100644 Poseiden-skeleton/src/main/java/com/nnk/springboot/services/RuleNameService.java create mode 100644 Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/RuleNameControllerTest.java create mode 100644 Poseiden-skeleton/src/test/java/com/nnk/springboot/services/RuleNameServiceTest.java create mode 100644 Poseiden-skeleton/target/classes/com/nnk/springboot/services/RuleNameService.class create mode 100644 Poseiden-skeleton/target/test-classes/com/nnk/springboot/RatingTests.class create mode 100644 Poseiden-skeleton/target/test-classes/com/nnk/springboot/RuleTests.class create mode 100644 Poseiden-skeleton/target/test-classes/com/nnk/springboot/controllers/RuleNameControllerTest.class create mode 100644 Poseiden-skeleton/target/test-classes/com/nnk/springboot/services/RuleNameServiceTest.class diff --git a/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/RuleNameController.java b/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/RuleNameController.java index b9e72b1ba6..daea193a37 100644 --- a/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/RuleNameController.java +++ b/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/RuleNameController.java @@ -1,54 +1,73 @@ package com.nnk.springboot.controllers; -import com.nnk.springboot.domain.RuleName; +import javax.persistence.EntityNotFoundException; +import javax.validation.Valid; + +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; -import javax.validation.Valid; +import com.nnk.springboot.domain.RuleName; +import com.nnk.springboot.services.RuleNameService; @Controller public class RuleNameController { - // TODO: Inject RuleName service + + @Autowired + private RuleNameService ruleNameService; @RequestMapping("/ruleName/list") - public String home(Model model) - { - // TODO: find all RuleName, add to model + public String home(Model model) { + model.addAttribute("ruleNameList", ruleNameService.findAll()); return "ruleName/list"; } @GetMapping("/ruleName/add") - public String addRuleForm(RuleName bid) { + public String addRuleForm(Model model) { + model.addAttribute("ruleName", new RuleName()); return "ruleName/add"; } @PostMapping("/ruleName/validate") - public String validate(@Valid RuleName ruleName, BindingResult result, Model model) { - // TODO: check data valid and save to db, after saving return RuleName list - return "ruleName/add"; + public String validate(@Valid @ModelAttribute("ruleName") RuleName ruleName, BindingResult result, Model model) { + if (result.hasErrors()) { + return "ruleName/add"; + } else { + ruleNameService.createRuleName(ruleName); + return "redirect:/ruleName/list"; + } } @GetMapping("/ruleName/update/{id}") public String showUpdateForm(@PathVariable("id") Integer id, Model model) { - // TODO: get RuleName by Id and to model then show to the form + RuleName ruleName = ruleNameService.findById(id); + model.addAttribute("ruleName", ruleName); return "ruleName/update"; } @PostMapping("/ruleName/update/{id}") - public String updateRuleName(@PathVariable("id") Integer id, @Valid RuleName ruleName, - BindingResult result, Model model) { - // TODO: check required fields, if valid call service to update RuleName and return RuleName list - return "redirect:/ruleName/list"; + public String updateRuleName(@PathVariable("id") Integer id, @Valid RuleName ruleName, BindingResult result, Model model) { + if (result.hasErrors()) { + return "ruleName/update"; + } else { + try { + ruleNameService.updateRuleName(ruleName, id); + } catch (EntityNotFoundException e) { + model.addAttribute("message", e.getMessage()); + } + return "redirect:/ruleName/list"; + } } @GetMapping("/ruleName/delete/{id}") public String deleteRuleName(@PathVariable("id") Integer id, Model model) { - // TODO: Find RuleName by Id and delete the RuleName, return to Rule list + ruleNameService.deleteById(id); return "redirect:/ruleName/list"; } } diff --git a/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/RuleName.java b/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/RuleName.java index ceadf32a4c..c45075d6a9 100644 --- a/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/RuleName.java +++ b/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/RuleName.java @@ -1,21 +1,47 @@ package com.nnk.springboot.domain; -import javax.persistence.*; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; import javax.validation.constraints.NotBlank; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.Setter; -import java.sql.Timestamp; - @Entity @Getter @Setter +@NoArgsConstructor @Table(name = "rulename") public class RuleName { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer Id; - // TODO: Map columns in data table RULENAME with corresponding java fields + + @NotBlank + private String name; + + private String description; + private String json; + private String template; + + @Column(name = "sqlStr") + private String sqlStr; + + @Column(name = "sqlPart") + private String sqlPart; + + public RuleName(String name, String description, String json, String template, String sqlStr, String sqlPart) { + this.name = name; + this.description = description; + this.json = json; + this.template = template; + this.sqlStr = sqlStr; + this.sqlPart = sqlPart; + } } diff --git a/Poseiden-skeleton/src/main/java/com/nnk/springboot/services/RuleNameService.java b/Poseiden-skeleton/src/main/java/com/nnk/springboot/services/RuleNameService.java new file mode 100644 index 0000000000..b9b05e8e78 --- /dev/null +++ b/Poseiden-skeleton/src/main/java/com/nnk/springboot/services/RuleNameService.java @@ -0,0 +1,49 @@ +package com.nnk.springboot.services; + +import java.util.List; + +import javax.persistence.EntityNotFoundException; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.nnk.springboot.domain.RuleName; +import com.nnk.springboot.repositories.RuleNameRepository; + +@Service +public class RuleNameService { + + @Autowired + private RuleNameRepository ruleNameRepository; + + public List findAll() { + return ruleNameRepository.findAll(); + } + + public RuleName createRuleName(RuleName ruleName) { + return ruleNameRepository.save(ruleName); + } + + public RuleName updateRuleName(RuleName ruleName, int id) throws EntityNotFoundException { + if (ruleNameRepository.findById(id) == null) { + throw new EntityNotFoundException("RuleName does not exists"); + } + RuleName updatedRuleName = ruleNameRepository.getById(id); + updatedRuleName.setName(ruleName.getName()); + updatedRuleName.setDescription(ruleName.getDescription()); + updatedRuleName.setJson(ruleName.getJson()); + updatedRuleName.setTemplate(ruleName.getTemplate()); + updatedRuleName.setSqlStr(ruleName.getSqlStr()); + updatedRuleName.setSqlPart(ruleName.getSqlPart()); + return ruleNameRepository.save(updatedRuleName); + } + + public RuleName findById(int id) { + return ruleNameRepository.findById(id).orElseThrow(() -> new EntityNotFoundException("BidList does not exists")); + } + + public void deleteById(int id) { + ruleNameRepository.deleteById(id); + } + +} diff --git a/Poseiden-skeleton/src/main/resources/templates/ruleName/add.html b/Poseiden-skeleton/src/main/resources/templates/ruleName/add.html index afb0c2730b..6084d13538 100644 --- a/Poseiden-skeleton/src/main/resources/templates/ruleName/add.html +++ b/Poseiden-skeleton/src/main/resources/templates/ruleName/add.html @@ -15,10 +15,54 @@

Add New Rule

- - +
+ +
+ +

+
+
+
+ +
+ +

+
+
+
+ +
+ +

+
+
+
+ +
+ +

+
+
+
+ +
+ +

+
+
+
+ +
+ +

+
+
+
+
+ Cancel + +
+
diff --git a/Poseiden-skeleton/src/main/resources/templates/ruleName/list.html b/Poseiden-skeleton/src/main/resources/templates/ruleName/list.html index 2ad3868e82..938bd62a59 100644 --- a/Poseiden-skeleton/src/main/resources/templates/ruleName/list.html +++ b/Poseiden-skeleton/src/main/resources/templates/ruleName/list.html @@ -32,15 +32,30 @@ Id Name Description - json - template - sql - sqlPart + Json + Template + SqlStr + SqlPart Action - + + You don't have any rule name registered + + + Rule Name Id + Name + Description + Json + Template + SqlStr + SqlPart + + Edit |  + Delete + +
diff --git a/Poseiden-skeleton/src/main/resources/templates/ruleName/update.html b/Poseiden-skeleton/src/main/resources/templates/ruleName/update.html index 34e6c3cc60..1c46676d86 100644 --- a/Poseiden-skeleton/src/main/resources/templates/ruleName/update.html +++ b/Poseiden-skeleton/src/main/resources/templates/ruleName/update.html @@ -15,10 +15,54 @@

Update New Rule

- - +
+ +
+ +

+
+
+
+ +
+ +

+
+
+
+ +
+ +

+
+
+
+ +
+ +

+
+
+
+ +
+ +

+
+
+
+ +
+ +

+
+
+
+
+ Cancel + +
+
diff --git a/Poseiden-skeleton/src/test/java/com/nnk/springboot/RatingTests.java b/Poseiden-skeleton/src/test/java/com/nnk/springboot/RatingTests.java index 9671dab96a..6c3ebf0b08 100644 --- a/Poseiden-skeleton/src/test/java/com/nnk/springboot/RatingTests.java +++ b/Poseiden-skeleton/src/test/java/com/nnk/springboot/RatingTests.java @@ -1,46 +1,46 @@ -//package com.nnk.springboot; -// -//import com.nnk.springboot.domain.Rating; -//import com.nnk.springboot.repositories.RatingRepository; -//import org.junit.Assert; -//import org.junit.Test; -//import org.junit.runner.RunWith; -//import org.springframework.beans.factory.annotation.Autowired; -//import org.springframework.boot.test.context.SpringBootTest; -//import org.springframework.test.context.junit4.SpringRunner; -// -//import java.util.List; -//import java.util.Optional; -// -//@RunWith(SpringRunner.class) -//@SpringBootTest -//public class RatingTests { -// -// @Autowired -// private RatingRepository ratingRepository; -// -// @Test -// public void ratingTest() { -// Rating rating = new Rating("Moodys Rating", "Sand PRating", "Fitch Rating", 10); -// -// // Save -// rating = ratingRepository.save(rating); -// Assert.assertNotNull(rating.getId()); -// Assert.assertTrue(rating.getOrderNumber() == 10); -// -// // Update -// rating.setOrderNumber(20); -// rating = ratingRepository.save(rating); -// Assert.assertTrue(rating.getOrderNumber() == 20); -// -// // Find -// List listResult = ratingRepository.findAll(); -// Assert.assertTrue(listResult.size() > 0); -// -// // Delete -// Integer id = rating.getId(); -// ratingRepository.delete(rating); -// Optional ratingList = ratingRepository.findById(id); -// Assert.assertFalse(ratingList.isPresent()); -// } -//} +package com.nnk.springboot; + +import com.nnk.springboot.domain.Rating; +import com.nnk.springboot.repositories.RatingRepository; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.List; +import java.util.Optional; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class RatingTests { + + @Autowired + private RatingRepository ratingRepository; + + @Test + public void ratingTest() { + Rating rating = new Rating("Moodys Rating", "Sand PRating", "Fitch Rating", 10); + + // Save + rating = ratingRepository.save(rating); + Assert.assertNotNull(rating.getId()); + Assert.assertTrue(rating.getOrderNumber() == 10); + + // Update + rating.setOrderNumber(20); + rating = ratingRepository.save(rating); + Assert.assertTrue(rating.getOrderNumber() == 20); + + // Find + List listResult = ratingRepository.findAll(); + Assert.assertTrue(listResult.size() > 0); + + // Delete + Integer id = rating.getId(); + ratingRepository.delete(rating); + Optional ratingList = ratingRepository.findById(id); + Assert.assertFalse(ratingList.isPresent()); + } +} diff --git a/Poseiden-skeleton/src/test/java/com/nnk/springboot/RuleTests.java b/Poseiden-skeleton/src/test/java/com/nnk/springboot/RuleTests.java index 24c7ff53a2..541dab5412 100644 --- a/Poseiden-skeleton/src/test/java/com/nnk/springboot/RuleTests.java +++ b/Poseiden-skeleton/src/test/java/com/nnk/springboot/RuleTests.java @@ -1,46 +1,46 @@ -//package com.nnk.springboot; -// -//import com.nnk.springboot.domain.RuleName; -//import com.nnk.springboot.repositories.RuleNameRepository; -//import org.junit.Assert; -//import org.junit.Test; -//import org.junit.runner.RunWith; -//import org.springframework.beans.factory.annotation.Autowired; -//import org.springframework.boot.test.context.SpringBootTest; -//import org.springframework.test.context.junit4.SpringRunner; -// -//import java.util.List; -//import java.util.Optional; -// -//@RunWith(SpringRunner.class) -//@SpringBootTest -//public class RuleTests { -// -// @Autowired -// private RuleNameRepository ruleNameRepository; -// -// @Test -// public void ruleTest() { -// RuleName rule = new RuleName("Rule Name", "Description", "Json", "Template", "SQL", "SQL Part"); -// -// // Save -// rule = ruleNameRepository.save(rule); -// Assert.assertNotNull(rule.getId()); -// Assert.assertTrue(rule.getName().equals("Rule Name")); -// -// // Update -// rule.setName("Rule Name Update"); -// rule = ruleNameRepository.save(rule); -// Assert.assertTrue(rule.getName().equals("Rule Name Update")); -// -// // Find -// List listResult = ruleNameRepository.findAll(); -// Assert.assertTrue(listResult.size() > 0); -// -// // Delete -// Integer id = rule.getId(); -// ruleNameRepository.delete(rule); -// Optional ruleList = ruleNameRepository.findById(id); -// Assert.assertFalse(ruleList.isPresent()); -// } -//} +package com.nnk.springboot; + +import com.nnk.springboot.domain.RuleName; +import com.nnk.springboot.repositories.RuleNameRepository; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.List; +import java.util.Optional; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class RuleTests { + + @Autowired + private RuleNameRepository ruleNameRepository; + + @Test + public void ruleTest() { + RuleName rule = new RuleName("Rule Name", "Description", "Json", "Template", "SQL", "SQL Part"); + + // Save + rule = ruleNameRepository.save(rule); + Assert.assertNotNull(rule.getId()); + Assert.assertTrue(rule.getName().equals("Rule Name")); + + // Update + rule.setName("Rule Name Update"); + rule = ruleNameRepository.save(rule); + Assert.assertTrue(rule.getName().equals("Rule Name Update")); + + // Find + List listResult = ruleNameRepository.findAll(); + Assert.assertTrue(listResult.size() > 0); + + // Delete + Integer id = rule.getId(); + ruleNameRepository.delete(rule); + Optional ruleList = ruleNameRepository.findById(id); + Assert.assertFalse(ruleList.isPresent()); + } +} diff --git a/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/RuleNameControllerTest.java b/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/RuleNameControllerTest.java new file mode 100644 index 0000000000..b19edbf26a --- /dev/null +++ b/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/RuleNameControllerTest.java @@ -0,0 +1,150 @@ +package com.nnk.springboot.controllers; + +import static org.mockito.Mockito.when; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; +import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view; + +import javax.persistence.EntityNotFoundException; + +import org.junit.Before; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; + +import com.nnk.springboot.domain.RuleName; +import com.nnk.springboot.security.UserDetailsServiceImpl; +import com.nnk.springboot.services.RuleNameService; + +@WebMvcTest(controllers = RuleNameController.class) +class RuleNameControllerTest { + + @Autowired + private MockMvc mockMvc; + + @Autowired + private WebApplicationContext context; + + @MockBean + private RuleNameService ruleNameService; + + @MockBean + private UserDetailsServiceImpl userDetailsServiceImpl; + + @Before + void setup() { + mockMvc = MockMvcBuilders.webAppContextSetup(context).apply(springSecurity()).build(); + } + + @Test + @WithMockUser + final void testRuleNameList() throws Exception { + mockMvc.perform(get("/ruleName/list").with(csrf().asHeader())).andExpect(status().isOk()) + .andExpect(view().name("ruleName/list")); + } + + @Test + @WithMockUser + final void testAddRuleForm() throws Exception { + mockMvc.perform(get("/ruleName/add").with(csrf().asHeader())).andExpect(status().isOk()) + .andExpect(view().name("ruleName/add")); + } + + @Test + @WithMockUser + final void testValidate() throws Exception { + mockMvc.perform(post("/ruleName/validate").with(csrf().asHeader()).param("name", "Name") + .param("description", "Description").param("json", "Json").param("emplate", "Template") + .param("sqlStr", "SqlStr").param("sqlPart", "SqlPart")) + .andExpect(status().isFound()) + .andExpect(view().name("redirect:/ruleName/list")); + } + + @Test + @WithMockUser + void testValidateHasError() throws Exception { + mockMvc.perform(post("/ruleName/validate").with(csrf().asHeader()).param("name", "") + .param("description", "Description").param("json", "Json").param("emplate", "Template") + .param("sqlStr", "SqlStr").param("sqlPart", "SqlPart")) + .andExpect(status().isOk()) + .andExpect(view().name("ruleName/add")) + .andExpect(model().hasErrors()) + .andExpect(model().attributeHasFieldErrorCode("ruleName", "name", "NotBlank")); + } + + @Test + @WithMockUser + final void testShowUpdateForm() throws Exception { + RuleName ruleName = new RuleName(); + ruleName.setId(1); + ruleName.setName("Test"); + ruleName.setDescription("Test"); + ruleName.setJson("Test"); + ruleName.setTemplate("Test"); + ruleName.setSqlStr("Test"); + ruleName.setSqlPart("Test"); + when(ruleNameService.findById(1)).thenReturn(ruleName); + mockMvc.perform(get("/ruleName/update/1").with(csrf().asHeader())) + .andExpect(status().isOk()) + .andExpect(view().name("ruleName/update")) + .andExpect(model().hasNoErrors()) + .andExpect(model().attribute("ruleName", ruleName)); + } + + @Test + @WithMockUser + final void testUpdateRuleName() throws Exception { + RuleName ruleName = new RuleName(); + when(ruleNameService.updateRuleName(ruleName, 1)).thenReturn(ruleName); + mockMvc.perform(post("/ruleName/update/1").with(csrf().asHeader()).param("name", "Name") + .param("description", "Description").param("json", "Json").param("template", "Template") + .param("sqlStr", "SqlStr").param("sqlPart", "SqlPart")) + .andExpect(status().isFound()) + .andExpect(view().name("redirect:/ruleName/list")) + .andExpect(model().hasNoErrors()); + } + + @Test + @WithMockUser + void testUpdateRuleNameHasError() throws Exception { + mockMvc.perform(post("/ruleName/update/1").with(csrf().asHeader()).param("name", "") + .param("description", "Description").param("json", "Json").param("emplate", "Template") + .param("sqlStr", "SqlStr").param("sqlPart", "SqlPart")) + .andExpect(status().isOk()) + .andExpect(view().name("ruleName/update")) + .andExpect(model().hasErrors()) + .andExpect(model().attributeHasFieldErrorCode("ruleName", "name", "NotBlank")); + } + + @Test + @WithMockUser + void testUpdateRuleNameThrowEntityNotFoundException() throws Exception { + when(ruleNameService.updateRuleName(Mockito.any(RuleName.class), Mockito.anyInt())).thenThrow(EntityNotFoundException.class); + mockMvc.perform(post("/ruleName/update/1").with(csrf().asHeader()).param("name", "Name") + .param("description", "Description").param("json", "Json").param("emplate", "Template") + .param("sqlStr", "SqlStr").param("sqlPart", "SqlPart")) + .andExpect(status().isFound()) + .andExpect(view().name("redirect:/ruleName/list")) + .andExpect(model().hasNoErrors()); + } + + @Test + @WithMockUser + final void testDeleteRuleName() throws Exception { + mockMvc.perform(get("/ruleName/delete/0").with(csrf().asHeader())) + .andExpect(status().isFound()) + .andExpect(view().name("redirect:/ruleName/list")); + + } + +} diff --git a/Poseiden-skeleton/src/test/java/com/nnk/springboot/services/RatingServiceTest.java b/Poseiden-skeleton/src/test/java/com/nnk/springboot/services/RatingServiceTest.java index 0398dc4de4..43cdba225f 100644 --- a/Poseiden-skeleton/src/test/java/com/nnk/springboot/services/RatingServiceTest.java +++ b/Poseiden-skeleton/src/test/java/com/nnk/springboot/services/RatingServiceTest.java @@ -55,9 +55,15 @@ final void testFindAll() { @Test final void testCreateRating() { - when(ratingRepository.save(rating)).thenReturn(rating); - ratingService.createRating(rating); - verify(ratingRepository).save(rating); + Rating rating2 = new Rating(); + rating2.setId(1); + rating2.setMoodysRating("Mood"); + rating2.setSandPRating("Sand"); + rating2.setFitchRating("Fitch"); + rating2.setOrderNumber(1); + when(ratingRepository.save(rating2)).thenReturn(rating2); + ratingService.createRating(rating2); + verify(ratingRepository).save(rating2); } @Test @@ -97,7 +103,7 @@ final void testFindByIdNotFound() throws EntityNotFoundException { @Test final void testDeleteById() { - ratingRepository.deleteById(1); + ratingService.deleteById(1); verify(ratingRepository).deleteById(1); } diff --git a/Poseiden-skeleton/src/test/java/com/nnk/springboot/services/RuleNameServiceTest.java b/Poseiden-skeleton/src/test/java/com/nnk/springboot/services/RuleNameServiceTest.java new file mode 100644 index 0000000000..254edf24b6 --- /dev/null +++ b/Poseiden-skeleton/src/test/java/com/nnk/springboot/services/RuleNameServiceTest.java @@ -0,0 +1,119 @@ +package com.nnk.springboot.services; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +import javax.persistence.EntityNotFoundException; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; + +import com.nnk.springboot.domain.RuleName; +import com.nnk.springboot.repositories.RuleNameRepository; +import com.nnk.springboot.security.UserDetailsServiceImpl; + +@WebMvcTest(RuleNameService.class) +class RuleNameServiceTest { + + @MockBean + private RuleNameRepository ruleNameRepository; + + @MockBean + private UserDetailsServiceImpl userDetailsServiceImpl; + + @Autowired + private RuleNameService ruleNameService; + + private static RuleName ruleName = new RuleName(); + + @BeforeEach + private void init() { + ruleName.setId(1); + ruleName.setName("Name"); + ruleName.setDescription("Description"); + ruleName.setJson("Json"); + ruleName.setTemplate("Template"); + ruleName.setSqlStr("SqlStr"); + ruleName.setSqlPart("SqlPart"); + } + + @Test + final void testFindAll() { + List findAll = new ArrayList<>(); + findAll.add(ruleName); + when(ruleNameRepository.findAll()).thenReturn(findAll); + List foundList = ruleNameService.findAll(); + assertThat(foundList).isEqualTo(findAll); + } + + @Test + final void testCreateRuleName() { + RuleName ruleName = new RuleName(); + ruleName.setId(2); + ruleName.setName("Name"); + ruleName.setDescription("Description"); + ruleName.setJson("Json"); + ruleName.setTemplate("Template"); + ruleName.setSqlStr("SqlStr"); + ruleName.setSqlPart("SqlPart"); + when(ruleNameRepository.save(ruleName)).thenReturn(ruleName); + ruleNameService.createRuleName(ruleName); + verify(ruleNameRepository).save(ruleName); + } + + @Test + final void testUpdateRuleName() { + RuleName toUpdateruleName = new RuleName(); + toUpdateruleName.setId(2); + toUpdateruleName.setName("Test"); + toUpdateruleName.setDescription("Test"); + toUpdateruleName.setJson("Test"); + toUpdateruleName.setTemplate("Test"); + toUpdateruleName.setSqlStr("Test"); + toUpdateruleName.setSqlPart("Test"); + when(ruleNameRepository.findById(1)).thenReturn(Optional.of(RuleNameServiceTest.ruleName)); + when(ruleNameRepository.getById(1)).thenReturn(RuleNameServiceTest.ruleName); + when(ruleNameRepository.save(toUpdateruleName)).thenReturn(toUpdateruleName); + ruleNameService.updateRuleName(toUpdateruleName, 1); + assertThat(ruleName.getName()).isEqualTo("Test"); + assertThat(ruleName.getDescription()).isEqualTo("Test"); + assertThat(ruleName.getJson()).isEqualTo("Test"); + assertThat(ruleName.getTemplate()).isEqualTo("Test"); + assertThat(ruleName.getSqlStr()).isEqualTo("Test"); + assertThat(ruleName.getSqlPart()).isEqualTo("Test"); + } + + @Test + final void testUpdateRuleNameThrowEntityNotFoundException() { + when(ruleNameRepository.findById(1)).thenReturn(null); + assertThrows(EntityNotFoundException.class, () -> ruleNameService.updateRuleName(ruleName, 1)); + } + + @Test + final void testFindById() { + when(ruleNameRepository.findById(1)).thenReturn(Optional.of(ruleName)); + RuleName foundRuleName = ruleNameService.findById(1); + assertThat(foundRuleName).isEqualTo(ruleName); + } + + @Test + final void testFindByIdNotFound() throws EntityNotFoundException { + assertThrows(EntityNotFoundException.class, () -> ruleNameService.findById(0)); + } + + @Test + final void testDeleteById() { + ruleNameService.deleteById(1); + verify(ruleNameRepository).deleteById(1); + } + +} diff --git a/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.properties b/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.properties index 54cef4d9d0..4b67e7e9b0 100644 --- a/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.properties +++ b/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.properties @@ -1,5 +1,5 @@ #Generated by Maven Integration for Eclipse -#Thu Dec 09 09:39:15 CET 2021 +#Thu Dec 09 11:09:06 CET 2021 m2e.projectLocation=C\:\\Users\\Draflosword\\git\\JavaDA_PROJECT7_RESTAPI\\Poseiden-skeleton m2e.projectName=Poseiden-skeleton groupId=net.guides.springboothelloworld diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/controllers/RuleNameController.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/controllers/RuleNameController.class index 2fcbd6142357a9408892af41311fb7d137dca93d..6698cb0f40b9f68cbe196a1bf828f84f354484e9 100644 GIT binary patch literal 3780 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 diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/services/RuleNameService.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/services/RuleNameService.class new file mode 100644 index 0000000000000000000000000000000000000000..9a65e739d27982704d2abcdbc4290a80ddaf7713 GIT binary patch literal 3199 zcmb7G`%~Oh6#nkAZ6E|nDXpbX+R_#lY5G#DTT!53X&0z0qP4!l<^n0%WSeAp_)RB`{EMi@M`1 z>wd|zoW*(94Rl|6D^@}J`b^oDQ$|tdBY}dnK*vpE#n5fTS=6WJZ^}X-(CNjv8Ci0D zD{#Gaf%CadG<#KmmC#;4l@;ioDLa8xlyjDE&D(O=aooTNEZ6Y`F63NqF?MvpBfnN% zZ&{z0hU4oCMuF|>M(uz;Tn^k-%abOl-G0$>tYAo>sjq)dAU*1uQbiNmG_*h!*pagw zIaMysOK;X7yA)K;Eg1Hk;aR+oh3R0)B1Z-{i|u|{BkRh7<(R{^Or4A_d0;j&2fELplVS ztCSSz-HK1d>q!|bx#l&4i4{nX%G_QqnfD~&>Xwo)v85~ssAFpdSqizWU_hXsiLs`a z$TsmpIt8hZQ7;7RQ*JQsmL0Q(S1|}(!6|{A^=_PS0=XzX4X1I2D7RwRWjVbdu&0k4 z+5pRP70zii2OgnpF+WGvCrp99`&S~Q>~!d`VP~81n84mDL3&JA`aRUEJ#vkl_f=%@ zIQP~Q0=ttc^8t^UZ2uhFzo_9!W`VLO12(VXD4x>rG=?J?&mMuUYD2V|t7@;xW;Em( z*Gk%FWwB%vJsA6(hB?NzlIo=V1r663-$MBOEt`C2^bHL!F}j7&b?GY_US+HrVTp(V zgAEPy3|1pBiv>~^l}b#|+=?h_R_h?pmJf`=@}yCUN7hL$|9`hkwv#ReOT$ep(~u+= z1P)j89u|I~>=c-*dcIsL*_QOODvEFwI5gGjBdy904JF*7gt*?A?aSFE&s`Nb6EopH z3X?RA?iL!3swr*i$B3P23MOPuS%Zg_25!Y?c)&N?MseOWdQa1^j>FheXA!Mmr#U)e znLL{tSxw&L-LhAZ;}%~LUDd3|_v0x}1GUhm*A#WMC*5GZB=s0h!F7z#ed`CFQHrJy z_079@U%`7c=ISkLIVKS!!d2?_vT!8 zxm?O7WOkl`lk7ivVlaA{R& z$7?gK3a#`}LBFlE(`gm7Zp++;_9H!{&`!S$20iVdUo8Tl13PI)?Sx%~>Z0cqc85yN zla%pl<|pjAgS`Sjgm3Gbx)Peynx+FdNIKY!5n5BUwzGzTJ2;fW?>O41WpAiuPlSxM zu$R3!PWDgG`E7Ke(jssYeUyWKdQQ_W6B_xOBx#aZY~;Ytc=!&^rtk;aenIAX=cBiA z;kWvmZ0Nz%;6MdK6^!sYR>5UnuT~JspRHh)_s>`GBCju3@ER)^O#0sx<}*VH2M&<{&i-hF-PSVQx?PmY>S3|#xC7=R(lT>FCsqU`1(H$DEr8=_W!H=zs z$5z5BMpl9p>a0>jA5Ni-Xva}*tR%;lRNtX;|B#4-$WWO4r-t=fr+PIKB=VXAP2&yv jP2tTN_ur!Z+w{+L{)jYvg3s{Add New Rule
- - +
+ +
+ +

+
+
+
+ +
+ +

+
+
+
+ +
+ +

+
+
+
+ +
+ +

+
+
+
+ +
+ +

+
+
+
+ +
+ +

+
+
+
+
+ Cancel + +
+
diff --git a/Poseiden-skeleton/target/classes/templates/ruleName/list.html b/Poseiden-skeleton/target/classes/templates/ruleName/list.html index a9b94978d8..e4131f8ebc 100644 --- a/Poseiden-skeleton/target/classes/templates/ruleName/list.html +++ b/Poseiden-skeleton/target/classes/templates/ruleName/list.html @@ -32,15 +32,30 @@ Id Name Description - json - template - sql - sqlPart + Json + Template + SqlStr + SqlPart Action - + + You don't have any rule name registered + + + Rule Name Id + Name + Description + Json + Template + SqlStr + SqlPart + + Edit |  + Delete + +
diff --git a/Poseiden-skeleton/target/classes/templates/ruleName/update.html b/Poseiden-skeleton/target/classes/templates/ruleName/update.html index de0c103a80..1e58c0ceeb 100644 --- a/Poseiden-skeleton/target/classes/templates/ruleName/update.html +++ b/Poseiden-skeleton/target/classes/templates/ruleName/update.html @@ -15,10 +15,54 @@

Update New Rule

- - +
+ +
+ +

+
+
+
+ +
+ +

+
+
+
+ +
+ +

+
+
+
+ +
+ +

+
+
+
+ +
+ +

+
+
+
+ +
+ +

+
+
+
+
+ Cancel + +
+
diff --git a/Poseiden-skeleton/target/test-classes/com/nnk/springboot/RatingTests.class b/Poseiden-skeleton/target/test-classes/com/nnk/springboot/RatingTests.class new file mode 100644 index 0000000000000000000000000000000000000000..00d1706d2225267e22b13b56aca72cccc2434b9e GIT binary patch literal 2194 zcma)7-BTM?6#v~Mun?A#rU6SoD6NVKly0q1DM19PXl(e9U~2KJo8%HMY9a4s`QSME(C5xL6m-V%*}tjdc7GO1r!)N#y!E8@%p#LOSjN z!>xP=D7U2`xYxuzwaGFJZ!~NvYP={sQL^}=Z99^X9ou7=$vbYf8P~RJ*7zgG-7`wu zv^`_nEGw^ud17EJHl*`NxV%EJ-E+bga-JcY&J-D9cby84BZ__*n|?!z^_rr}kFn;k;_&x-1J9b?3|XYLcHW8r9mmy^we!fA?B0%;u? zj5Bmqxy)4<2Ge21oGp2kyV*Fd3Be=cp-f!PxMbo@Dqt2Bh7^mn4ls7XYtMklrQ&>EqY#y5TY=w#5! zXzdz*2K}jjeTKeD890jp`s#rK5_DFeNivR{K%OHR0kMZ<(?$DV|3KKH`1TAkKVk!~;8CvWKV$mbaP9#!Cm_NkQ3l_d=Dx|73 zjSK)KdraU*>Z)Hb=~FWmq}-$?fgkV{9uh@1%_|cnqUkZN zpiDSXvg-xMHhHd+=OMZaw03A0+zGndrMp3NKgYC&)B?*au;&=oaBo2sbB`_~uzc)LZX6!aXAYyT%bes?AbiOo57<7V!i@BRJ0$Nlr~Uw;QMiz5vYhS8E!HEjF9 z@M^BGD@DhV#)fb4P3}ogLzLm%zIkXGmT6avwcc38m$~{4WT)6onh+!aTttLlD9-FFY;u{K! z#xJ967IZvTi1w7Z#U)pyCpxzA8Fj33v;0ieDcK3%5c0tOS}+KvMWy=!I~u;E(9XO! zxH`UqNuwmZb(eeGrlF)T0_aLQ$_l!^5V{pYT4ATAm*GaIDgW1y(yYfV%724gJjEs70}sb%%KzHM`tmYe-p$UTaq`_Qyhqt10) z>XJ64QF3T9zn0-7&KmjPNg@kmhzxXA3|_1@?NDu*Ub0~Q;yNv(E_(8)GHN5ysnMT0 zV{}I7q!)p{ee`G0$>{8!d;$IEfIUE8B@DcVLHg>U0M60BGMXUeNYmtbqLCq%A>-Y2 z|KT?bJxL5FE+#G|MiW;PV=pkCo%{tir%v%^1bKDv4aWJh~r}t-_k;Uj%j?4nE;E~FvmI;L--CH zyM)OOS*c);aPe^s0{c{e=LGWsEb?3>&%?wErEI!|JcoES;`Jl)7c31!8rJWrsy!uQ S1a1KGAl*E2AxmWY5cmgJjaWAT literal 0 HcmV?d00001 diff --git a/Poseiden-skeleton/target/test-classes/com/nnk/springboot/controllers/RuleNameControllerTest.class b/Poseiden-skeleton/target/test-classes/com/nnk/springboot/controllers/RuleNameControllerTest.class new file mode 100644 index 0000000000000000000000000000000000000000..5ffe654ade7f9f02808268d2c24b3df1ceff56a0 GIT binary patch literal 8132 zcmcgwXJ8z~75+w&y{FS+o3k-CCWH_JvIJhhHcenqv11uoHkOcMOxwF#Nh_Uh&%1jn z)P!aTDc}&&3pgR9(E^8T0wFz+-g`*zq*syTm^8dE0a+wDUq| zQQq7$%&h6I6{u}o(I-&XZl#SlYOzSg0vt?ByUeW7ogYaWcCXG|5J+@cDLvDt+oo*$ zoptV@$!$3$ObH3*{>ei<<~W9%&w0|xlA%16(%OuE%Qjl-A#k{gdc@;60!J!%p}^^p zxa7$U7}b_HGief7#fxwh7ves1Z~Z;(DXxB5W9YWbPKgzv^QMuzs8EN|ujeza&vaj} zmN=H<7zIZQbcY$|82(nyAhgH-?n|Xz{pLX4_6$B2jRNzE{v3=GIJ@zHw4NrI8aLrM z1Ic!Y%XAol;_Jp!M$U_A3QiSRSPr12FC@Q5uA)y2<#VQM z*qWX*wO-1j>zp0Ry=uNlA7tp#oO~{4*{-(DbO)u5GA^{la0cn21u;#_P`5bN;%o(H z3A9JrTie)~m!aG@d~2~;_PJKHF~$rSG}>wGDx2Bk$|TdWqoS*rI$9#`VdcUbTsJ3! zBJ)VK0;FmO)+<;iaDJFM)nG|?CoWz(3d9F)Q*GZC%W=2Z7DK#a$;k2&Y+wvcId;Fm z*bH2GZq{1f&P9A9tF)l08_}iU90L9PnL6Y0DmF3#y*o<=(Y!TQPrp+{u z4)B&Z&$yi`wxWkXkCDX!w?qsUf#^`wo@2J1hiwX&Pmhaav`;D(FU58qP;!RN#5W=^ z9MLl0q9Bt*v}LQ|FblP&yzoQX?7)QzE)Zyqq_geKF8jNbwMlnVgI>nD2p98g;qbhc z=dqw;23H8#eJMuk@#Yov3uID39VrFLsM*F>Fie(;GkEqDPA_$|VF(%L!6$BsF zKF+Gb!(kfPDR9t~EaD)qfI)w4B#dShu3{9_vM$SegTRK6401rE_esU%IbU+HHJz4u zc|DyjhD&KgITz~bbPSgZs3p7D!={|pr)SKx?iw*%#q(r&&ZyrnbLh)eTrE>yU5=?D zhEWCARo#<{`7efD93pR3GG5-O;uW}wr;eP?d(!L))6bz15eUNIej_Y5^Hl;3X~Rj` zrguPz;Wg~&sO-3fIuAKkHip;oZKL=0I>s-97ZMMa*E13HmRfI=5n*SB+Q#r^zW4a= zZ{-yBZ_#Z6^maD*K{lkr->%{g>8gt9the%6?!`L=4&_CTm${UCdKq(hW)WCaxh)%X zXPs?ZTAYKd)u+?q3ZMS!+VY3UTbiqBtJKV+uYj zaB%sM*vZ4|fMKin2tGf*%Mp zhkz;%u3K4|f#sFU%rsubZ{@mim+Nlj z?cHV=`h8Ux&U*~hPK@D?6%`w;*e(6%&no^RJ+6Ts*KK(|8hA6p2WXZJcIv`iABqTPXgyOMv)th1Ti5< z9@h`%j5*TJt91$DElYjVKlTpV*4R4M^V|uBFfW#uZnz|vn4^lhLg5ur&+`6%bS2vD z8QpPs&?(0QA8k3WUKMfCz-+>KbZf7U)v1Vs1XjrL;~Eds4s(N%O&Qt@>yvq6zA6?7 z*1PH@pFCv+P7Bi_3O9o|*kSM{Y6Ke+6N{?&$y~y(+6g3akCnGm#(GoM*Omq2WofEd zHCnr5xo)Vl(#gwyvG!9{SY<7fbyz8i>NUuMfM1joSQW;TiV>v{T~>)Q z)Xr?yu)W{3(46 z>}Q#hy$QZ){AZ@eoTi7c@IG(KA$-b(z{=rbKBZ6&z@b>ee_$ym*Ob&bj6G7&da5hO zEoo|c0Lv!vf=Rr%fEACSsQ~RktSZZnb2hM&^0W&1OMLkYu!iz$aWco$QQ|4yN^;I= z>^Yr3xtigxwu+0bO0?8Ig4#)(If?cHIt%D7pm!4I7jVg5^w(e#nMAGt+iPqqD>BbR zcr|N?Yj6@5EE~J3q|EpMD>E^>GMCM$ObeAcgUXy4s>~G;lzE(Z$$i-6A#-I>nU|H2 zNnBI+2(H~;o4CHGfEyC8^joj?S~vTx-CpZfzjd3}dV}A3lh=BS-+G&D1!%vcg!Y~g z1CQ`FvW*6|qno9rA+%ux>o890T+b>{8U0-)s=X_M!B6=H@0rEmJ3YmpQ-jO&D(&bb z?keE@J`i^$?n_*g_+SAKPNm*4bYP&1U~D27-2|hHU~DEBTW}rD#m%hN+<~47Q1+B4 zxiT0f=#3KcKtU2+i0v`9CpYxty^qybwo?rK#-y)FTtt;UB zllV#VUi_*C+dOE0H#@Qa5bV1L!=K79G#BvKsTizfXadVOF>Gf*I-j=gz~Q(6N8v&= z;vzY@P0f^{x85kXGclQC3R#h zx;sEgTHZ|4{}pcff8$0AdCn_(-2dW76?j$zuqGw}V3-JIu#EgUi{*(SSahcm+=v`* z#ZKG~o5wS!0e0j7(MSbeM@?qq*)5q%2=TS37IL@aXKwfp$rmD%jQ@S1S@@DX(!PnI95hW z-KZ24yow--`-*^t`kEF+a0eBw`vQvlhTx9B9KZYWXfllRCNJN2zkAPj&bjx#W8?OP zJ^TM1*bU%p{G&pa5ayi@AMch+dM2({H8s(cYKbj5iw~-S;0g)(_3?OfyM`MmoYNE& z;Y|{hX)UQmSF{%(idz^~qKkX9DrFT`tLWwp+ORX%pi6=rUo2+a&af8CB&bV_)Rgu} zvl9z(2Ls2Qyj#0eS1X zokda)U*k+k&vLn-Lg`~jqn}q5wCcO?yo%=}oX&gXV)x`^(nzFQ;;|&dZoI$;3$9UK z6yjgvGuSxg7188X-pMBDuVcT8eGW~7W0cD&2* z9^RMWY#thx;20Abdyz2kLs9*RuPiK=KIK~rw#k1+LL~-{L#ol(ev11IMSz||OKmv=zVn(8_t%(FBRs1QToDaH3I7da}@z!Nms`z{7 z0e8Jz*$bH-VE!)n=Jp{F4LQ;%Gch{k4VegsyyHz&hP>yPsIn_HT=SJKHF0%guosau zuHA!Zs2>R#jXeY;qlDf;IO$yt4K?s!0*WyarI>^>P)oIQF`1t8F$MEbhf`^0afSp= z!wAYWT!`!7CZ!%+&)0g#)OJ{0IxQ|Y3NHB;%NjvJ5bnp#GHvOs9T=X*t^H^uHrd*3 z{J6KGV_hRvP282nMla#rn@JxKDFNH*!y=^)cKTQvPvx7~nj@_mE~0oIk(^FZ1bz}y zf(uAmlmyn}5;Wi{%)oNY#460fM$D!|ItL?7QkB)(H>7ntcGy~Xl2$)I_)vIXqm*BOVuH80KOmbrsNzECWW_&>rlu0PFq!j{mi1zQe@cXef=BEoWZK zLHEKzNDFAw7NQ)Np#n`g*!TOdo1V` zT6*3-S&!2?0tO*2&e2jhq~#r<<#IANgHlS{EBFs)PhsXDd>|ux4l^b#rOj$3(6$`l z(hRUi7FUTdPZ0lvZw?IaSeJzm8bBUr{bfT->Bi+Qg_mYl+5~k$FpmsA8Oq3k(rtMT z9HgZ(4q3Ljs;TGa^!s8Sq($V&VJeC%@;y2H1AfL4EBXb$;y3(GHStmS1ApN-PWcZW Cc1j2U delta 1526 zcmZuwYj6`)6#nie-OX-p(llw2qE;eS+k{N(;4qXDJG8YDEizEGDmXQgfYnZ0X<)1l z27DnPh+YA~H~2siX(_I0)mnT~1mACb;0xd4>xaJ_&)p4e2K}>h&bfEL^L^hrcQ|rn zqHo_n1A_q0z+V~^hKQK$j`T)1Xi;A(*_FDWGZ9ZE=fqR3?F(Hd25n(7Rofj)7-+#A9Ct#9^{z|R^&A_pQT*+SsGB&F*et?&y?!t5 z*Ki+0xmczai8cCI_hthDJjn47UGC9~f?GKr#zqD&!CC}u9rD(r9FJj}IIKt1CnV%{ zQEW8mJFrv3Qw$*sa;Z_Q_ApeG#l&>|Br(hIieaOc?H1f!shS+mAR}tsSLp+IPQ$Yd z<3+DBM(lTU$MYBz2i@0r_DC;YWGF3*l{bpz&VcCAe6Gv!vTXT^Sk0%YuVGljUU7hz zIrlMCiM2dLT3jORiI$s0T@Il>*_KQtr7_a1w>jRyy9`ERq%5|0O4$cuuV=gZISy&~ zLUemib9{-f#8&U2>d$;AFu-t_<2@AQYxtH5+1gJWA6m5^sldQv?d{1$b#3vku4I>n z-^5^k$oU6DiP)20(r5T4D(Oxrgau3u?M7@D#`a^8f*}Mlm~Cav3YzI?9wjE0$S{_{ zwL@q;dbhck{#G!KzJ53*5{^eTPQ^4-Axbg8?G88*C6xKF6b1B$MzJcwenU6{g*Dfk zh=l#iOiT*oR>k+M73<_q_7`1DX>XpaBDxZys~F&#D#&%^txt?sj*qX>1N0AWlva(`OHmq8h6BMNN@svXt@0u`&$HjTQpBEJuQ8 zM8ca=Lb{1=$vq5?4*V?zqw8kx0F_49&Gsh&552zeSdarAw84Ffd?5sUl=J(vqQGQQ zAzN`mmwQbftxJ!>s@7ps4jdnWqsR3hxJg;&x`cC(-^W6=189x#&d| s!za}D;9Riz$}_SpXDm6A#)(^6 zO6lIxeJ|Z;=|(q}8i%x$ZnRLkZ*-?Cbl>-$p5FH*&1h^5jnA<(`v3j+?z?aK|3CEK zd+!6V0sqM&qroV;JJA7EI-JiNkiM1 zIcXYY(-|@L42@aEKtsD1$?ml#T;C2{Z%V_4LW*`T7O)c*YOC@ZPTX5@0(;yVw0(Q1 zY;`-18<>IZI=+UD1=kyizz%!FcF6S(7z%bkc*eL}JfI$gVC?2ck7YX4xx7NJc36RF zm;K0{UE>qw1{i&-Sn=#&%Gj5>iu#ts{zl3)tWI;5%TuYOhAruy5Uy_wn?+&JFsrT` z-Ic&SWP4VLOPgck8amRfmfUgEcBF&4QgoG?v|`9j?-{jN{nVH zXu&cp*YPAQ)v#cz(z6hZla9q$LM{rnWA#!s zmZ`g(z#6eU9cSQ74cSSvT(R~HGc!7Obrt4_QO7cL>gd8M4fA~~*i{nI6v3{+W}HoQ zQYf-$jSd6n&;l39n10di@8>L?EWN>)0VO3n>$hHe)AY z^Y>+@7l_EkI(CUjODH14)G2kg({@VTWtPv12GLM4%VM{NWs2KMV3&<<&oieAwol~+ zEN{hS*qg=W^tL7rxW=|1=vN zSK}J`JRG~z-WlbB!Yg2y2-o3hSv-}VNb8XX6ZaOrb(k1pYz~cDj)wD+k&eMChT>&@ zP#GFx0vLOo5tr}&=sVwv5{9#2x^yJXG?LdbB6eE>+TCjf70(e$Y#pu8TW~-qVRUjS zlr*Zc7C4y5!qsq!05E+D24mbGJWJJAw;GTxtm7a&+73kqMonhL`pEMdZ(YjoIckK{ zP!*XCFquWAk;R&*jzc)iRJHxygB7zpK#&_7QvF0Gxp##nT*FDV!*0bXi8YpZedn5* z2)mbtO|#Z*P3vH@`euF`+g7{O%XZIVX~z4h%_OB#hfl+$$3zOZfRs|19Zuh2DtO5#<{`YLH~*qE?9pOtAjMayU)-p=#vQ5_${#~Bvu zFwbrQE9$z`z&GlCYQG9w*4(4TaK$Og4sG-*<#MKBzJ3Cq%;J6xD$IVs4 zaY+v1deb6u!pxi=`$0%tzgtG`7QVb9?#-2 z9V%1rx`hMWdz0eFJ{g*P;5?pd%YkU@ z&pLjj#{R?sR@^Sfu{>44mY>BxG@LPq#55|h_?L#0pIDTeZ^#=~63jgIxh7=f)XT3d zzvSJ_cLoa~aO=l-6ikdQqFjqy*!b4Dir_gby)(!4^4EG4%dWf!$KQn$?%-zzC-EsJ zfDSxajqoAYz-Xbtx6IC8bq`j|UUH&ZA_yper{HA1GdP8dGgX``IVK2h=Sw<-KVdTjZUe#`*HTa2h@G?w!U(HS?z_N;>Im7nQG~7dhSs z&*rbyScf&dI~fUR`3PDYE~$fdX$0*yLKEUQA4P%W^c8Zncm#Vg*uUy->^p+}8fI{9 z?g)zE(C9SAcAq_iaiaJ43#@sH$dgDVu%6&H5Y|RsLpKr7WbLre?(hl;X0ME>{)nGntxh}tjUVU=lb_zW>2o2&-LoLMLo|~ z&mQ%>Nc@v@JA#*HB#4ac3|>)fu z-(Uav!TQgS)PLSp{j8;VA5Uc>SBddN%GdThOK`np-r!9;|@4S+xiIeLeVyl5tyyYNvK*F5zvH32_S Date: Fri, 10 Dec 2021 11:38:57 +0100 Subject: [PATCH 07/12] CRUD Trade implemented and tested --- .../controllers/TradeController.java | 51 +++++-- .../java/com/nnk/springboot/domain/Trade.java | 143 ++++++++++++++++-- .../nnk/springboot/services/TradeService.java | 49 ++++++ .../templates/curvePoint/update.html | 2 +- .../resources/templates/rating/update.html | 2 +- .../resources/templates/ruleName/update.html | 2 +- .../main/resources/templates/trade/add.html | 30 +++- .../main/resources/templates/trade/list.html | 14 +- .../resources/templates/trade/update.html | 29 +++- .../java/com/nnk/springboot/TradeTests.java | 92 +++++------ .../controllers/RatingControllerTest.java | 4 +- .../controllers/TradeControllerTest.java | 139 +++++++++++++++++ .../springboot/services/TradeServiceTest.java | 106 +++++++++++++ .../spring-boot-skeleton/pom.properties | 2 +- .../controllers/TradeController.class | Bin 2456 -> 3694 bytes .../com/nnk/springboot/domain/Trade.class | Bin 830 -> 4677 bytes .../springboot/services/TradeService.class | Bin 0 -> 3209 bytes .../classes/templates/curvePoint/update.html | 2 +- .../classes/templates/rating/update.html | 2 +- .../classes/templates/ruleName/update.html | 2 +- .../target/classes/templates/trade/add.html | 30 +++- .../target/classes/templates/trade/list.html | 14 +- .../classes/templates/trade/update.html | 29 +++- .../com/nnk/springboot/TradeTests.class | Bin 0 -> 2225 bytes .../controllers/TradeControllerTest.class | Bin 0 -> 7518 bytes .../services/TradeServiceTest.class | Bin 0 -> 5742 bytes 26 files changed, 648 insertions(+), 96 deletions(-) create mode 100644 Poseiden-skeleton/src/main/java/com/nnk/springboot/services/TradeService.java create mode 100644 Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/TradeControllerTest.java create mode 100644 Poseiden-skeleton/src/test/java/com/nnk/springboot/services/TradeServiceTest.java create mode 100644 Poseiden-skeleton/target/classes/com/nnk/springboot/services/TradeService.class create mode 100644 Poseiden-skeleton/target/test-classes/com/nnk/springboot/TradeTests.class create mode 100644 Poseiden-skeleton/target/test-classes/com/nnk/springboot/controllers/TradeControllerTest.class create mode 100644 Poseiden-skeleton/target/test-classes/com/nnk/springboot/services/TradeServiceTest.class diff --git a/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/TradeController.java b/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/TradeController.java index 4e667eec22..fe68ea3a25 100644 --- a/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/TradeController.java +++ b/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/TradeController.java @@ -1,54 +1,73 @@ package com.nnk.springboot.controllers; import com.nnk.springboot.domain.Trade; +import com.nnk.springboot.services.TradeService; + +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; +import javax.persistence.EntityNotFoundException; import javax.validation.Valid; @Controller public class TradeController { - // TODO: Inject Trade service + @Autowired + private TradeService tradeService; + @RequestMapping("/trade/list") - public String home(Model model) - { - // TODO: find all Trade, add to model - return "trade/list"; + public String home(Model model) { + model.addAttribute("tradeList", tradeService.findAll()); + return "trade/list"; } @GetMapping("/trade/add") - public String addUser(Trade bid) { + public String addTradeForm(Model model) { + model.addAttribute("trade", new Trade()); return "trade/add"; } @PostMapping("/trade/validate") - public String validate(@Valid Trade trade, BindingResult result, Model model) { - // TODO: check data valid and save to db, after saving return Trade list - return "trade/add"; + public String validate(@Valid @ModelAttribute("trade") Trade trade, BindingResult result, Model model) { + if (result.hasErrors()) { + return "trade/add"; + } else { + tradeService.createTrade(trade); + return "redirect:/trade/list"; + } } @GetMapping("/trade/update/{id}") public String showUpdateForm(@PathVariable("id") Integer id, Model model) { - // TODO: get Trade by Id and to model then show to the form + Trade trade = tradeService.findById(id); + model.addAttribute("trade", trade); return "trade/update"; } @PostMapping("/trade/update/{id}") - public String updateTrade(@PathVariable("id") Integer id, @Valid Trade trade, - BindingResult result, Model model) { - // TODO: check required fields, if valid call service to update Trade and return Trade list - return "redirect:/trade/list"; + public String updateTrade(@PathVariable("id") Integer id, @Valid Trade trade, BindingResult result, Model model) { + if (result.hasErrors()) { + return "trade/update"; + } else { + try { + tradeService.updateTrade(trade, id); + } catch (EntityNotFoundException e) { + model.addAttribute("message", e.getMessage()); + } + return "redirect:/trade/list"; + } } @GetMapping("/trade/delete/{id}") public String deleteTrade(@PathVariable("id") Integer id, Model model) { - // TODO: Find Trade by Id and delete the Trade, return to Trade list - return "redirect:/trade/list"; + tradeService.deleteById(id); + return "redirect:/trade/list"; } } diff --git a/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/Trade.java b/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/Trade.java index 40de92d26a..a0a512ff00 100644 --- a/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/Trade.java +++ b/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/Trade.java @@ -1,22 +1,147 @@ package com.nnk.springboot.domain; -import javax.persistence.*; -import javax.validation.constraints.NotBlank; +import java.sql.Timestamp; -import lombok.Getter; -import lombok.Setter; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; -import java.sql.Timestamp; +import lombok.NoArgsConstructor; +import lombok.ToString; @Entity -@Getter -@Setter +@NoArgsConstructor @Table(name = "trade") +@ToString public class Trade { + public Trade(String account, String type, Double buyQuantity) { + this.account​ = account; + this.type​ = type; + this.buyQuantity​ = buyQuantity; + } + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - private Integer Id; - // TODO: Map columns in data table TRADE with corresponding java fields + @Column(name = "TradeId") + private Integer TradeId; + + @NotEmpty + @Column(name = "account") + private String account​; + + @NotEmpty + @Column(name = "type") + private String type​; + + @Column(name = "buyQuantity") + @NotNull + @Min(value = 0, message = "Buy Quantity must be positive") + private Double buyQuantity​; + + @Column(name = "sellQuantity") + private Double sellQuantity​; + + @Column(name = "buyPrice") + private Double buyPrice​; + + @Column(name = "sellPrice") + private Double sellPrice​; + + @Column(name = "benchmark") + private String benchmark​; + + @Column(name = "tradeDate") + private Timestamp tradeDate​; + + @Column(name = "security") + private String security​; + + @Column(name = "status") + private String status​; + + @Column(name = "trader") + private String trader​; + + @Column(name = "book") + private String book​; + + @Column(name = "creationName") + private String creationName​; + + @Column(name = "creationDate") + private Timestamp creationDate​; + + @Column(name = "revisionName") + private String revisionName​; + + @Column(name = "revisionDate") + private Timestamp revisionDate​; + + @Column(name = "dealName") + private String dealName​; + + @Column(name = "dealType") + private String dealType​; + + @Column(name = "sourceListId") + private String sourceListId​; + + @Column(name = "side") + private String side​; + + public Integer getTradeId() { + return TradeId; + } + + public void setTradeId(Integer tradeId) { + this.TradeId = tradeId; + } + + public String getAccount() { + return account​; + } + + public void setAccount(String account ) { + this.account​ = account; + } + + public String getType() { + return type​; + } + + public void setType(String type) { + this.type​ = type; + } + + public Double getBuyQuantity() { + return buyQuantity​; + } + + public void setBuyQuantity(Double buyQuantity) { + this.buyQuantity​ = buyQuantity ; + } + + public Timestamp getCreationDate() { + return creationDate​; + } + + public void setCreationDate(Timestamp creationDate) { + this.creationDate​ = creationDate; + } + + public Timestamp getRevisionDate() { + return creationDate​; + } + + public void setRevisionDate(Timestamp revisionDate) { + this.revisionDate​ = revisionDate; + } } diff --git a/Poseiden-skeleton/src/main/java/com/nnk/springboot/services/TradeService.java b/Poseiden-skeleton/src/main/java/com/nnk/springboot/services/TradeService.java new file mode 100644 index 0000000000..a88e82d4ee --- /dev/null +++ b/Poseiden-skeleton/src/main/java/com/nnk/springboot/services/TradeService.java @@ -0,0 +1,49 @@ +package com.nnk.springboot.services; + +import java.sql.Timestamp; +import java.util.List; + +import javax.persistence.EntityNotFoundException; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.nnk.springboot.domain.Trade; +import com.nnk.springboot.repositories.TradeRepository; + +@Service +public class TradeService { + + @Autowired + private TradeRepository tradeRepository; + + public List findAll() { + return tradeRepository.findAll(); + } + + public Trade createTrade(Trade trade) { + trade.setCreationDate(new Timestamp(System.currentTimeMillis())); + return tradeRepository.save(trade); + } + + public Trade updateTrade(Trade trade, int id) throws EntityNotFoundException { + if (tradeRepository.findById(id) == null) { + throw new EntityNotFoundException("Trade does not exists"); + } + Trade updatedTrade = tradeRepository.getById(id); + updatedTrade.setAccount(trade.getAccount()); + updatedTrade.setType(trade.getType()); + updatedTrade.setBuyQuantity(trade.getBuyQuantity()); + updatedTrade.setRevisionDate(new Timestamp(System.currentTimeMillis())); + return tradeRepository.save(updatedTrade); + } + + public Trade findById(int id) { + return tradeRepository.findById(id).orElseThrow(() -> new EntityNotFoundException("Trade does not exists")); + } + + public void deleteById(int id) { + tradeRepository.deleteById(id); + } + +} diff --git a/Poseiden-skeleton/src/main/resources/templates/curvePoint/update.html b/Poseiden-skeleton/src/main/resources/templates/curvePoint/update.html index dc5fb295df..20b041c971 100644 --- a/Poseiden-skeleton/src/main/resources/templates/curvePoint/update.html +++ b/Poseiden-skeleton/src/main/resources/templates/curvePoint/update.html @@ -36,7 +36,7 @@

Update CurvePoint

Cancel - +
diff --git a/Poseiden-skeleton/src/main/resources/templates/rating/update.html b/Poseiden-skeleton/src/main/resources/templates/rating/update.html index d43240671f..199a5b549c 100644 --- a/Poseiden-skeleton/src/main/resources/templates/rating/update.html +++ b/Poseiden-skeleton/src/main/resources/templates/rating/update.html @@ -45,7 +45,7 @@

Update Rating

Cancel - +
diff --git a/Poseiden-skeleton/src/main/resources/templates/ruleName/update.html b/Poseiden-skeleton/src/main/resources/templates/ruleName/update.html index 1c46676d86..0b0b5051e4 100644 --- a/Poseiden-skeleton/src/main/resources/templates/ruleName/update.html +++ b/Poseiden-skeleton/src/main/resources/templates/ruleName/update.html @@ -60,7 +60,7 @@

Update New Rule

Cancel - +
diff --git a/Poseiden-skeleton/src/main/resources/templates/trade/add.html b/Poseiden-skeleton/src/main/resources/templates/trade/add.html index 6fafa08c01..a6830b6e26 100644 --- a/Poseiden-skeleton/src/main/resources/templates/trade/add.html +++ b/Poseiden-skeleton/src/main/resources/templates/trade/add.html @@ -15,10 +15,32 @@

Add New Trade

- - +
+ +
+ +

+
+
+
+ +
+ +

+
+
+
+ +
+ +
+
+
+
+ Cancel + +
+
diff --git a/Poseiden-skeleton/src/main/resources/templates/trade/list.html b/Poseiden-skeleton/src/main/resources/templates/trade/list.html index 2a247fa7da..a4af213f93 100644 --- a/Poseiden-skeleton/src/main/resources/templates/trade/list.html +++ b/Poseiden-skeleton/src/main/resources/templates/trade/list.html @@ -37,7 +37,19 @@ - + + You don't have any bit list registered + + + Trade Id + Account + Type + Buy Quantity + + Edit |  + Delete + +
diff --git a/Poseiden-skeleton/src/main/resources/templates/trade/update.html b/Poseiden-skeleton/src/main/resources/templates/trade/update.html index f4bbc52592..5e0ee6ae55 100644 --- a/Poseiden-skeleton/src/main/resources/templates/trade/update.html +++ b/Poseiden-skeleton/src/main/resources/templates/trade/update.html @@ -14,9 +14,32 @@

Update Trade

- +
+ +
+ +

+
+
+
+ +
+ +

+
+
+
+ +
+ +
+
+
+
+ Cancel + +
+
diff --git a/Poseiden-skeleton/src/test/java/com/nnk/springboot/TradeTests.java b/Poseiden-skeleton/src/test/java/com/nnk/springboot/TradeTests.java index 414fd53a07..728156c9f5 100644 --- a/Poseiden-skeleton/src/test/java/com/nnk/springboot/TradeTests.java +++ b/Poseiden-skeleton/src/test/java/com/nnk/springboot/TradeTests.java @@ -1,46 +1,46 @@ -//package com.nnk.springboot; -// -//import com.nnk.springboot.domain.Trade; -//import com.nnk.springboot.repositories.TradeRepository; -//import org.junit.Assert; -//import org.junit.Test; -//import org.junit.runner.RunWith; -//import org.springframework.beans.factory.annotation.Autowired; -//import org.springframework.boot.test.context.SpringBootTest; -//import org.springframework.test.context.junit4.SpringRunner; -// -//import java.util.List; -//import java.util.Optional; -// -//@RunWith(SpringRunner.class) -//@SpringBootTest -//public class TradeTests { -// -// @Autowired -// private TradeRepository tradeRepository; -// -// @Test -// public void tradeTest() { -// Trade trade = new Trade("Trade Account", "Type"); -// -// // Save -// trade = tradeRepository.save(trade); -// Assert.assertNotNull(trade.getTradeId()); -// Assert.assertTrue(trade.getAccount().equals("Trade Account")); -// -// // Update -// trade.setAccount("Trade Account Update"); -// trade = tradeRepository.save(trade); -// Assert.assertTrue(trade.getAccount().equals("Trade Account Update")); -// -// // Find -// List listResult = tradeRepository.findAll(); -// Assert.assertTrue(listResult.size() > 0); -// -// // Delete -// Integer id = trade.getTradeId(); -// tradeRepository.delete(trade); -// Optional tradeList = tradeRepository.findById(id); -// Assert.assertFalse(tradeList.isPresent()); -// } -//} +package com.nnk.springboot; + +import com.nnk.springboot.domain.Trade; +import com.nnk.springboot.repositories.TradeRepository; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.List; +import java.util.Optional; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class TradeTests { + + @Autowired + private TradeRepository tradeRepository; + + @Test + public void tradeTest() { + Trade trade = new Trade("Trade Account", "Type", 10.0); + + // Save + trade = tradeRepository.save(trade); + Assert.assertNotNull(trade.getTradeId()); + Assert.assertTrue(trade.getAccount().equals("Trade Account")); + + // Update + trade.setAccount("Trade Account Update"); + trade = tradeRepository.save(trade); + Assert.assertTrue(trade.getAccount().equals("Trade Account Update")); + + // Find + List listResult = tradeRepository.findAll(); + Assert.assertTrue(listResult.size() > 0); + + // Delete + Integer id = trade.getTradeId(); + tradeRepository.delete(trade); + Optional tradeList = tradeRepository.findById(id); + Assert.assertFalse(tradeList.isPresent()); + } +} diff --git a/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/RatingControllerTest.java b/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/RatingControllerTest.java index f403de208c..f59874ceb6 100644 --- a/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/RatingControllerTest.java +++ b/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/RatingControllerTest.java @@ -135,8 +135,8 @@ void testUpdateRatingThrowEntityNotFoundException() throws Exception { @WithMockUser final void testDeleteRating() throws Exception { mockMvc.perform(get("/rating/delete/0").with(csrf().asHeader())) - .andExpect(status().isFound()) - .andExpect(view().name("redirect:/rating/list")); + .andExpect(status().isFound()) + .andExpect(view().name("redirect:/rating/list")); } } diff --git a/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/TradeControllerTest.java b/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/TradeControllerTest.java new file mode 100644 index 0000000000..ddbc461393 --- /dev/null +++ b/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/TradeControllerTest.java @@ -0,0 +1,139 @@ +package com.nnk.springboot.controllers; + +import static org.mockito.Mockito.when; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; +import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view; + +import javax.persistence.EntityNotFoundException; + +import org.junit.Before; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; + +import com.nnk.springboot.domain.Trade; +import com.nnk.springboot.security.UserDetailsServiceImpl; +import com.nnk.springboot.services.TradeService; + +@WebMvcTest(controllers = TradeController.class) +class TradeControllerTest { + + @Autowired + private MockMvc mockMvc; + + @Autowired + private WebApplicationContext context; + + @MockBean + private TradeService tradeService; + + @MockBean + private UserDetailsServiceImpl userDetailsServiceImpl; + + @Before + void setup() { + mockMvc = MockMvcBuilders.webAppContextSetup(context).apply(springSecurity()).build(); + } + + @Test + @WithMockUser + final void testTradeList() throws Exception { + mockMvc.perform(get("/trade/list").with(csrf().asHeader())).andExpect(status().isOk()) + .andExpect(view().name("trade/list")); + } + + @Test + @WithMockUser + final void testAddTradeForm() throws Exception { + mockMvc.perform(get("/trade/add").with(csrf().asHeader())).andExpect(status().isOk()) + .andExpect(view().name("trade/add")); + } + + @Test + @WithMockUser + final void testValidate() throws Exception { + mockMvc.perform(post("/trade/validate").with(csrf().asHeader()).param("account", "Account") + .param("type", "Type").param("buyQuantity", "5.0")) + .andExpect(status().isFound()) + .andExpect(view().name("redirect:/trade/list")); + } + + @Test + @WithMockUser + void testValidateHasError() throws Exception { + mockMvc.perform(post("/trade/validate").with(csrf().asHeader()).param("account", "") + .param("type", "Type").param("buyQuantity", "5.0")) + .andExpect(status().isOk()) + .andExpect(view().name("trade/add")) + .andExpect(model().hasErrors()); + } + + @Test + @WithMockUser + final void testShowUpdateForm() throws Exception { + Trade trade = new Trade(); + trade.setTradeId(1); + trade.setAccount("Account"); + trade.setType("Type"); + trade.setBuyQuantity(10.0); + when(tradeService.findById(1)).thenReturn(trade); + mockMvc.perform(get("/trade/update/1").with(csrf().asHeader())) + .andExpect(status().isOk()) + .andExpect(view().name("trade/update")) + .andExpect(model().hasNoErrors()) + .andExpect(model().attribute("trade", trade)); + } + + @Test + @WithMockUser + final void testUpdateTrade() throws Exception { + Trade trade = new Trade(); + when(tradeService.updateTrade(trade, 1)).thenReturn(trade); + mockMvc.perform(post("/trade/update/1").with(csrf().asHeader()).param("account", "Account") + .param("type", "Type").param("buyQuantity", "5.0")) + .andExpect(status().isFound()) + .andExpect(view().name("redirect:/trade/list")) + .andExpect(model().hasNoErrors()); + } + + @Test + @WithMockUser + void testUpdateRatingHasError() throws Exception { + mockMvc.perform(post("/trade/update/1").with(csrf().asHeader()).param("account", "") + .param("type", "Type").param("buyQuantity", "5.0")) + .andExpect(status().isOk()) + .andExpect(view().name("trade/update")) + .andExpect(model().hasErrors()); + } + + @Test + @WithMockUser + void testUpdateRatingThrowEntityNotFoundException() throws Exception { + when(tradeService.updateTrade(Mockito.any(Trade.class), Mockito.anyInt())).thenThrow(EntityNotFoundException.class); + mockMvc.perform(post("/trade/update/1").with(csrf().asHeader()).param("account", "Account") + .param("type", "Type").param("buyQuantity", "5.0")) + .andExpect(status().isFound()) + .andExpect(view().name("redirect:/trade/list")) + .andExpect(model().hasNoErrors()); + } + + @Test + @WithMockUser + final void testDeleteTrade() throws Exception { + mockMvc.perform(get("/trade/delete/0").with(csrf().asHeader())) + .andExpect(status().isFound()) + .andExpect(view().name("redirect:/trade/list")); + } + +} diff --git a/Poseiden-skeleton/src/test/java/com/nnk/springboot/services/TradeServiceTest.java b/Poseiden-skeleton/src/test/java/com/nnk/springboot/services/TradeServiceTest.java new file mode 100644 index 0000000000..a330e2d7f7 --- /dev/null +++ b/Poseiden-skeleton/src/test/java/com/nnk/springboot/services/TradeServiceTest.java @@ -0,0 +1,106 @@ +package com.nnk.springboot.services; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +import javax.persistence.EntityNotFoundException; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; + +import com.nnk.springboot.domain.Trade; +import com.nnk.springboot.repositories.TradeRepository; +import com.nnk.springboot.security.UserDetailsServiceImpl; + +@WebMvcTest(TradeService.class) +class TradeServiceTest { + + @MockBean + private TradeRepository tradeRepository; + + @MockBean + private UserDetailsServiceImpl userDetailsServiceImpl; + + @Autowired + private TradeService tradeService; + + private static Trade trade = new Trade(); + + @BeforeEach + private void init() { + trade.setTradeId(1); + trade.setAccount("Test"); + trade.setType("Test"); + trade.setBuyQuantity(10.0); + } + + @Test + final void testFindAll() { + List findAll = new ArrayList<>(); + findAll.add(trade); + when(tradeRepository.findAll()).thenReturn(findAll); + List foundList = tradeService.findAll(); + assertThat(foundList).isEqualTo(findAll); + } + + @Test + final void testCreateTrade() { + Trade trade = new Trade(); + trade.setTradeId(1); + trade.setAccount("Test"); + trade.setType("Test"); + trade.setBuyQuantity(10.0); + when(tradeRepository.save(trade)).thenReturn(trade); + tradeService.createTrade(trade); + verify(tradeRepository).save(trade); + } + + @Test + final void testUpdateTrade() { + Trade toUpdateTrade = new Trade(); + toUpdateTrade.setAccount("Account"); + toUpdateTrade.setType("Type"); + toUpdateTrade.setBuyQuantity(5.0); + when(tradeRepository.findById(1)).thenReturn(Optional.of(trade)); + when(tradeRepository.getById(1)).thenReturn(trade); + when(tradeRepository.save(toUpdateTrade)).thenReturn(toUpdateTrade); + tradeService.updateTrade(toUpdateTrade, 1); + assertThat(trade.getAccount()).isEqualTo("Account"); + assertThat(trade.getType()).isEqualTo("Type"); + assertThat(trade.getBuyQuantity()).isEqualTo(5.0); + } + + @Test + final void testUpdateTradeThrowEntityNotFoundException() { + when(tradeRepository.findById(1)).thenReturn(null); + assertThrows(EntityNotFoundException.class, () -> tradeService.updateTrade(trade, 1)); + } + + @Test + final void testFindById() { + when(tradeRepository.findById(1)).thenReturn(Optional.of(trade)); + Trade foundTrade = tradeService.findById(1); + assertThat(foundTrade).isEqualTo(trade); + } + + @Test + final void testFindByIdNotFound() throws EntityNotFoundException { + assertThrows(EntityNotFoundException.class, () -> tradeService.findById(0)); + } + + @Test + final void testDeleteById() { + tradeService.deleteById(1); + verify(tradeRepository).deleteById(1); + } + +} diff --git a/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.properties b/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.properties index 4b67e7e9b0..06e430b581 100644 --- a/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.properties +++ b/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.properties @@ -1,5 +1,5 @@ #Generated by Maven Integration for Eclipse -#Thu Dec 09 11:09:06 CET 2021 +#Fri Dec 10 09:41:15 CET 2021 m2e.projectLocation=C\:\\Users\\Draflosword\\git\\JavaDA_PROJECT7_RESTAPI\\Poseiden-skeleton m2e.projectName=Poseiden-skeleton groupId=net.guides.springboothelloworld diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/controllers/TradeController.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/controllers/TradeController.class index 2066a4328ae45da96bc04ebac59e86e1431ceaa1..1e12b6a87b5c5bc533d4fc37f0783d05932ffdf2 100644 GIT binary patch literal 3694 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 QK7+!5?z(NXhpJ8V525-vIRF3v diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/domain/Trade.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/domain/Trade.class index 15f9865cf931c9d26f1246f4ef3372668d387d3e..9a50d0cba484a58dcd58493946705b0dc6345ffa 100644 GIT binary patch literal 4677 zcma)9iGLf_5uPU>lI@LS9NRe{MF}mjjf2`IO-n*(b0cCqAu)zfNV}F^l})5wWevocBPee4bAVD-FfrP%=_NFnOXUh|DHWh zM4Rc~S;`2yxa8Cdwtb@D)m_W3%sGxCklTEZ}`?4b4ZGu)G3T)r1$yv*@=BjdsZ9Bf{TaN7s8c`m%7V6UVEYFvA zNfwG_IIT|s_DNg1rZ3C0W;Kv7%6UGoD+`}$kDX=~>dL;jd(ZStaps7iH7W6TIn|(M zBW|Z{)})|bvs7}x{Xcg8*%nHb@-5D(8BX;>(;Q9GEnXfyZmwU2Wjc~=@ zh-)oRiU6EeQVyyYGDQ? z==o-?jsx{HtU$n%rNE7Hn~PR3g0&xbDo(eSBTrW=RTLNLK(A;joh;$hC0D9)m_{Kf zTO+QC88nzS3|IpLSI(nf9J?7Iu8A2mBSZ!|LSI>$)rNO2TH(Mfa@i?j3g8t&dQRY$ z?;b zF*-KeLxQd`XgLkAG-=R~mZl9Fp_Sk|Y1wi*sLe@t#zY5jgE}R%I%~QXuR~?0f6T&| zSvUC^vkf&dFeUwCPWhne;?8``BMg9w^k=x9c(@IZj>S$CjW=d@y+K{n4RbGMJ`&GJ zWX;FTs;c3L9Dau$F@lC#!Z#)i$86XP$76;jDkSq%SD0lAdTKz2-i%tWeS^l_=!Zv( zUCSo1Yg&$gyTY>86*dx4Zf!44$uWbzLStM~?M^GhGqn2fDR_fJVbzCC0PnblBijaD z!I5*mqcf1DlY&+@KRjByGq9><>E;O6*stzzG`z{}y;P@wOYLYc;@x7<3|+^%1%qy* z+fmeJy)JFs&&GJV_1A7&yarl!+Log`1udJ%H$NI`r@J`n-EG05yNeZ6d$4;^9}{_B zx9RpAeP7T86M2ls=tj|?P~VTjpUB5YD(g8>4;qxGl{tDC2~dvFELG^E2CZlGapYb5 zx4=&t^m&G#QgCCwMzMcj(4{nxqaP_)6?8a;RPbjF8l|xu{X}gYP1MNwX9iuy&cDF4 z#@5l0Ri3{xXd`3KDNF_CS*x%Y3@R}884nYw|r)lbKRZ0i&96|l@wRhsu zd+0*yM@_7twR8~LaqUmn(jlx6i3ZiiEDb}-DBUVtbq5`WysQHTT=+z*@L%w!0#7DW zz+2$mHU1vWz6BveygPRXkyN`G+92Fb&<%7XJPGH5_v+?T%r?3ADy@YR99I!Wv{i#| zH{GaqU~XLk3+D7qx(UyAPQ`XkwNy?w(^2ff&MlmZ?VL`6le+{box_k5=S$GHQaSB! z=MKcwYHSbj{)Pq2JS%TMDq_(Lr}!}=d< z`KPS^xt4#)@~^f0Jj*X?`L`^;tmRi(eqGBIj`OCL-)8;0TCTDFw3g4X{`Xow$MXAH w{($8_YWdGBe}u;({k6T&Mw$r}J>l5N(BE+f8TzF0IsXUN|3o73t^e2m01O!V1^@s6 delta 411 zcmZus%}T>S7@SSB(Z;k%TU+a2v?@~LK?F~tUOagycu?C!&g{(hwlj0w_s{7Jz!A15?y0aQy@${_=@0t)OrX@=yAiO@hlz4g zLd`=3)of~C+45HDERtb;*@J{5AXB9;5`k7XJCu#4@dZ7l?}o``Jc{p?R--igC|{55 z0U7mr6ekKDFop2~midP`M^+=7Czi=wg#~yN2@}rg^WlIfh%$Ob@Wg|KI;Zgi0UDfM zA;2P ZA-Oy|T3FAM!+c|(e1m+G9Xlzuz5wjXE5-l- diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/services/TradeService.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/services/TradeService.class new file mode 100644 index 0000000000000000000000000000000000000000..8839de33acf1486fe69ad56edfacead3c32594e3 GIT binary patch literal 3209 zcmb7G`BM}}7=68f1IvJjM}itfM6)cx(ZnR0H73XrF$*Y5NX%uLnFdB?XV#e>4s+l4 z`IjVBDZHwZ{FbVee^V-7&&=))f?{fGx3_z~e&6xl*FFFId;1RnC-IAh3`5TJ%7*JM z8bQUk-T7J1lSUx?CEFB%G3|3pl;W9&Muv{7e2E(lcjt}C*{i~o4BMqLni3T+u%+j( zGMp%Gg6UTc>?&@3OM#(lDs-h?7BhBW&pKkzbv?(+Zo%n?JqXk(CzG%B*A}r4e zf0~nDhR&jAa%YD7wwfo4jdH=JK=PXfq8f|~x!_qBxstUMKBd|k zR;)S~BU^JZwlx_H*^w1fRHBB`@Ek**VrIptkW12|a7|&1Py@=<2~UoCp=;Ibvp9pZ z8lER&>dimqN--~d9WUTTlKK*NLNPhVuqQ{+Y%nXRa-P#Mgkgqe)feYh$1FN~?qAZV zRVJf=xl?GyD8ueZp52xwf^Iq;y2T1b9%OME=ankP$RdqblIlE5xO`bhQE{ow3#oi7 z=}hRD#6>C%tqqzcB~7Qe?GR-o#rB?J9t9^-{>AYTxT{*bC{@DJYaHI^F@N9fY!O$GR+&4RJG=I;^VB zr^FH+rB$70Y$`XSnDkg(R?_NiCCSajab8Idx?aWK7R^-Xr0Zi*hl4UTCgnr@SFKt^ z+g#|HN@+$ZtW+FZ_>_-_YZ@xm6JZ^@I(#VId;W+Mi0K92Tc$fCq4GX}X_3Vj5gn;n zOE}a-v9=m1lc;aC*GUj5(=K8 zcS(AOA;cy|6BYI|c$TViivBm!>~!SzF1c-_l`G28{+lS=!e9n}qwNk(U+x^aftUWQ zKe-S^F)`4;hVeCAQseX*URC4kYj}Gg9r>)s}x@D8Iu zuNgx)f=f6WWt5M@s%3N~$%sOQz#Qe3Km*v`DBYG!l&*+U9)eAls=nhi zs`_@Rxb{^Oy^X8D8r*fojj7M43fol+qbqV=D{SmVB22uDCSKa>UY0Vbt19O07}`j7 zN?9>)?KSxJ4e%XV)j!0SN+KVrnq*dEr!I+f)GEUpdate CurvePoint
Cancel - +
diff --git a/Poseiden-skeleton/target/classes/templates/rating/update.html b/Poseiden-skeleton/target/classes/templates/rating/update.html index a6b4570d14..2cf8494245 100644 --- a/Poseiden-skeleton/target/classes/templates/rating/update.html +++ b/Poseiden-skeleton/target/classes/templates/rating/update.html @@ -45,7 +45,7 @@

Update Rating

Cancel - +
diff --git a/Poseiden-skeleton/target/classes/templates/ruleName/update.html b/Poseiden-skeleton/target/classes/templates/ruleName/update.html index 1e58c0ceeb..16eaa07371 100644 --- a/Poseiden-skeleton/target/classes/templates/ruleName/update.html +++ b/Poseiden-skeleton/target/classes/templates/ruleName/update.html @@ -60,7 +60,7 @@

Update New Rule

Cancel - +
diff --git a/Poseiden-skeleton/target/classes/templates/trade/add.html b/Poseiden-skeleton/target/classes/templates/trade/add.html index 75f774f4ba..6614fd2023 100644 --- a/Poseiden-skeleton/target/classes/templates/trade/add.html +++ b/Poseiden-skeleton/target/classes/templates/trade/add.html @@ -15,10 +15,32 @@

Add New Trade

- - +
+ +
+ +

+
+
+
+ +
+ +

+
+
+
+ +
+ +
+
+
+
+ Cancel + +
+
diff --git a/Poseiden-skeleton/target/classes/templates/trade/list.html b/Poseiden-skeleton/target/classes/templates/trade/list.html index 9f0408afa3..652274a996 100644 --- a/Poseiden-skeleton/target/classes/templates/trade/list.html +++ b/Poseiden-skeleton/target/classes/templates/trade/list.html @@ -37,7 +37,19 @@ - + + You don't have any bit list registered + + + Trade Id + Account + Type + Buy Quantity + + Edit |  + Delete + +
diff --git a/Poseiden-skeleton/target/classes/templates/trade/update.html b/Poseiden-skeleton/target/classes/templates/trade/update.html index 411dfc9e26..911e2b72c6 100644 --- a/Poseiden-skeleton/target/classes/templates/trade/update.html +++ b/Poseiden-skeleton/target/classes/templates/trade/update.html @@ -14,9 +14,32 @@

Update Trade

- +
+ +
+ +

+
+
+
+ +
+ +

+
+
+
+ +
+ +
+
+
+
+ Cancel + +
+
diff --git a/Poseiden-skeleton/target/test-classes/com/nnk/springboot/TradeTests.class b/Poseiden-skeleton/target/test-classes/com/nnk/springboot/TradeTests.class new file mode 100644 index 0000000000000000000000000000000000000000..3f3b07f65733f91b327f091f895401148e177f1c GIT binary patch literal 2225 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 literal 0 HcmV?d00001 diff --git a/Poseiden-skeleton/target/test-classes/com/nnk/springboot/services/TradeServiceTest.class b/Poseiden-skeleton/target/test-classes/com/nnk/springboot/services/TradeServiceTest.class new file mode 100644 index 0000000000000000000000000000000000000000..22b635c5f89f136f068de9b4a1801b2b99a2fbdc GIT binary patch literal 5742 zcma)AXLuCX6+N>Oj1WT;f*6MYwgpxJ1_1`c5`#d(mc0Uugs{OR8SRdwL8}=tJ1e2| z@}>9UG$&3qX->f=LO|k>o;XhLz4zY!=F7QnW_L%@2+a3+NAu>rd(Szyy!ZU*|1LfP zU@QKsBc)+|)*CimcgQS^_>Mc!=Xrryu>DadYZuHO-^$tD;aiVg2y|3ySbWkNwamQb z4wwh~PTJW(!=gYY9=1okf)jZDxQ5nDf?dBf!716UEJmz z&f$@~hOJ2e3wE~XJHfblBykn(8H#CSNken8l?3^?_U2>`1X?irt*i)VT4mB^TQTs) z9N*4y=^W)&!*xmia^A4zxM8q3w`Ny1@3>BIi-xMkrd|!z`@Ed3qh7=6grLM%*J3G_ z8+ZbiXqdZ88JPzL#=t@>Vwf|IYab{M_t}1r#RzGr%XnEU-)s4fysN=lRAD)t27?ac zwlN7X#ZAsHqOTUO8m?Dboh_=H zZeS1CzJaw^r$HaJ@-xWQcVqiXuT0BkkurxF#=#f}Cwa9|?O|e&tcdNiz!AZ*L+p1>T)PVF+ z1N|7F<8VsPpv8RM649=R)}%0-dM3yTM_Fk>QP&!t=pBCHdfLD^p3dUSRxE00Z@em$rmN176o00HX9=*mqqgt# zv-lPIBO|#I`Wif!l@j%+8a!W`nCd|FVFwa+FEa3AyoCFQ6x7~v>4J^3GgM(XI3nA# zm1jb{46o4fa_$I~UQqgK;FV%G<@Jl3R~vYZVATiMu;@kPd7XjR;|-LjSb?mez1$~|-(}$40$F5|P|4VP4LpD|?6)Fayw^{qQr;c1c)w8j zz%(kQ&EU#Z!dYc1AHs)qJa{!K@kK)ABRm1f)^$bx@kOk>1%VgKTn#N!iLsHMLEjte zP`lg#FW4^~pyPDbR;j4tAwrZCJZ+BHeu16AcC)rQ%k(;C|2YF6#{`A8PxJH_u&$3M z=3QdzRoi4pZ{}I0zvyPAKFkhfSx!hSlu2CFaY4fx(PZYLQ1Gx>U&1GN;tac@V$B0p zcRVTg<@qtK)SYQ5$$k6~p)4v;a;%LG1*MAolr)3O+|T6PboCO;;xm$IpVhEEj&I5? z8uEzkOX1g$FopR%zNq61JmV%NOMJ3q)|WKwc>JzP^%*&1Cr~?w>g*coMRW19#aL3y4Eeo*?_$X!9lzs1H1-z*KTu6hR+n{@yaoM zjAzf-*aFV0m0KU523HY0ze>Ms;d=Qu{}PtoeICmm#x-a8n!>gG6&FAQo~TCnBX`MY zp~zDHxemhnEc8X(*;U~g>kX9vn zcSW(wv_$%~DD~8DYfD)mikQ>^yjO5({l^#NteuMcs24`sYKEbr{fzejeGJC@tPK4uPRV{jnG`x^rN cE&hN%s=xk(zv6HBJHN^1@(=tA|G|p?1ICa1lK=n! literal 0 HcmV?d00001 From 9f76a4ef37128ef2835c9ede284a049fcbd957a3 Mon Sep 17 00:00:00 2001 From: Florent TRIMOREAU Date: Sat, 11 Dec 2021 16:35:55 +0100 Subject: [PATCH 08/12] User Class tested. Oauth2 login implemented --- Poseiden-skeleton/pom.xml | 4 + .../controllers/UserController.java | 3 +- .../java/com/nnk/springboot/domain/User.java | 15 +- .../security/SpringSecurityConfig.java | 11 +- .../src/main/resources/application.properties | 6 +- .../springboot/PoseidonApplicationTest.java | 13 ++ .../controllers/HomeControllerTest.java | 51 +++++++ .../controllers/UserControllerTest.java | 134 ++++++++++++++++++ .../spring-boot-skeleton/pom.properties | 2 +- .../spring-boot-skeleton/pom.xml | 4 + .../target/classes/application.properties | 6 +- .../controllers/UserController.class | Bin 5003 -> 5003 bytes .../com/nnk/springboot/domain/User.class | Bin 3049 -> 3261 bytes .../security/SpringSecurityConfig.class | Bin 4377 -> 5390 bytes .../springboot/PoseidonApplicationTest.class | Bin 0 -> 597 bytes .../controllers/HomeControllerTest.class | Bin 0 -> 4097 bytes .../controllers/UserControllerTest.class | Bin 0 -> 7309 bytes 17 files changed, 238 insertions(+), 11 deletions(-) create mode 100644 Poseiden-skeleton/src/test/java/com/nnk/springboot/PoseidonApplicationTest.java create mode 100644 Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/HomeControllerTest.java create mode 100644 Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/UserControllerTest.java create mode 100644 Poseiden-skeleton/target/test-classes/com/nnk/springboot/PoseidonApplicationTest.class create mode 100644 Poseiden-skeleton/target/test-classes/com/nnk/springboot/controllers/HomeControllerTest.class create mode 100644 Poseiden-skeleton/target/test-classes/com/nnk/springboot/controllers/UserControllerTest.class diff --git a/Poseiden-skeleton/pom.xml b/Poseiden-skeleton/pom.xml index 70cca3c4ba..61f071fb23 100644 --- a/Poseiden-skeleton/pom.xml +++ b/Poseiden-skeleton/pom.xml @@ -96,6 +96,10 @@ org.hibernate.validator hibernate-validator-annotation-processor + + org.springframework.boot + spring-boot-starter-oauth2-client + diff --git a/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/UserController.java b/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/UserController.java index 29e30be3d6..4e5fea7186 100644 --- a/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/UserController.java +++ b/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/UserController.java @@ -20,8 +20,7 @@ public class UserController { private UserRepository userRepository; @RequestMapping("/user/list") - public String home(Model model) - { + public String home(Model model) { model.addAttribute("users", userRepository.findAll()); return "user/list"; } diff --git a/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/User.java b/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/User.java index 13ebc7c066..61a0d4b7ed 100644 --- a/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/User.java +++ b/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/User.java @@ -11,13 +11,23 @@ import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; +import lombok.NoArgsConstructor; + @Entity @Table(name = "users") +@NoArgsConstructor public class User implements UserDetails { /** * */ private static final long serialVersionUID = 3635251098002037167L; + + public User(String username, String fullName, String role) { + this.username = username; + this.fullname = fullName; + this.role = role; + } + @Id @GeneratedValue(strategy= GenerationType.AUTO) private Integer id; @@ -38,10 +48,11 @@ public void setId(Integer id) { this.id = id; } + @Override public String getUsername() { - return username; + return this.username; } - + public void setUsername(String username) { this.username = username; } diff --git a/Poseiden-skeleton/src/main/java/com/nnk/springboot/security/SpringSecurityConfig.java b/Poseiden-skeleton/src/main/java/com/nnk/springboot/security/SpringSecurityConfig.java index 43e1d80e78..c6f87b9e9e 100644 --- a/Poseiden-skeleton/src/main/java/com/nnk/springboot/security/SpringSecurityConfig.java +++ b/Poseiden-skeleton/src/main/java/com/nnk/springboot/security/SpringSecurityConfig.java @@ -7,14 +7,17 @@ import org.springframework.context.annotation.Configuration; import org.springframework.security.authentication.dao.DaoAuthenticationProvider; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.util.matcher.AntPathRequestMatcher; @Configuration @EnableWebSecurity +@EnableGlobalMethodSecurity(prePostEnabled = true) public class SpringSecurityConfig extends WebSecurityConfigurerAdapter { @Autowired @@ -26,12 +29,12 @@ public class SpringSecurityConfig extends WebSecurityConfigurerAdapter { @Override public void configure(HttpSecurity http) throws Exception { http.authorizeRequests() - .antMatchers("/").permitAll() + .antMatchers("/", "/user/list", "/user/validate", "/user/add", "/css/*").permitAll() + .antMatchers("/admin/home").hasAuthority("ADMIN") .anyRequest().authenticated() .and().formLogin() - .and().logout().logoutSuccessUrl("/") - - + .and().oauth2Login() + .and().logout().logoutRequestMatcher(new AntPathRequestMatcher("/app-logout")).logoutSuccessUrl("/") ; } diff --git a/Poseiden-skeleton/src/main/resources/application.properties b/Poseiden-skeleton/src/main/resources/application.properties index b4511230f5..c2420f46a4 100644 --- a/Poseiden-skeleton/src/main/resources/application.properties +++ b/Poseiden-skeleton/src/main/resources/application.properties @@ -13,4 +13,8 @@ spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl -spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL8Dialect \ No newline at end of file +spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL8Dialect + +########## OAuth2 ######### +spring.security.oauth2.client.registration.github.client-id=998214a3cbc67a2fba64 +spring.security.oauth2.client.registration.github.client-secret=adcb854516fbaefb576a50bc907819e8f1923052 \ No newline at end of file diff --git a/Poseiden-skeleton/src/test/java/com/nnk/springboot/PoseidonApplicationTest.java b/Poseiden-skeleton/src/test/java/com/nnk/springboot/PoseidonApplicationTest.java new file mode 100644 index 0000000000..051ab5cadb --- /dev/null +++ b/Poseiden-skeleton/src/test/java/com/nnk/springboot/PoseidonApplicationTest.java @@ -0,0 +1,13 @@ +package com.nnk.springboot; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest(classes = Application.class) +class PoseidonApplicationTest { + + @Test + void contextLoads() { + } + +} diff --git a/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/HomeControllerTest.java b/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/HomeControllerTest.java new file mode 100644 index 0000000000..e6e9a2a36e --- /dev/null +++ b/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/HomeControllerTest.java @@ -0,0 +1,51 @@ +package com.nnk.springboot.controllers; + +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; +import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view; + +import org.junit.Before; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; + +import com.nnk.springboot.security.UserDetailsServiceImpl; + +@WebMvcTest(controllers = HomeController.class) +class HomeControllerTest { + + @Autowired + private MockMvc mockMvc; + + @Autowired + private WebApplicationContext context; + + @MockBean + private UserDetailsServiceImpl userDetailsServiceImpl; + + @Before + void setup() { + mockMvc = MockMvcBuilders.webAppContextSetup(context).apply(springSecurity()).build(); + } + + @Test + @WithMockUser + final void testHome() throws Exception { + mockMvc.perform(get("/").with(csrf().asHeader())).andExpect(status().isOk()) + .andExpect(view().name("home")); + } + + @Test@WithMockUser(roles = "admin") + final void testAdminHome() throws Exception { + mockMvc.perform(get("/admin/home").with(csrf().asHeader())).andExpect(status().isFound()) + .andExpect(view().name("redirect:/bidList/list")); + } + +} diff --git a/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/UserControllerTest.java b/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/UserControllerTest.java new file mode 100644 index 0000000000..f42bf9b56f --- /dev/null +++ b/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/UserControllerTest.java @@ -0,0 +1,134 @@ +package com.nnk.springboot.controllers; + +import static org.mockito.Mockito.when; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; +import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view; + +import java.util.Optional; + +import org.junit.Before; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; + +import com.nnk.springboot.domain.User; +import com.nnk.springboot.repositories.UserRepository; +import com.nnk.springboot.security.UserDetailsServiceImpl; + +@WebMvcTest(controllers = UserController.class) +class UserControllerTest { + + @Autowired + private MockMvc mockMvc; + + @MockBean + private UserRepository userRepository; + + @Autowired + private WebApplicationContext context; + + @MockBean + private UserDetailsServiceImpl userDetailsServiceImpl; + + @Before + void setup() { + mockMvc = MockMvcBuilders.webAppContextSetup(context).apply(springSecurity()).build(); + } + + @Test + final void testHome() throws Exception { + mockMvc.perform(get("/user/list")).andExpect(status().isOk()) + .andExpect(view().name("user/list")); + } + + @Test + final void testAddUser() throws Exception { + mockMvc.perform(get("/user/add")).andExpect(status().isOk()) + .andExpect(view().name("user/add")); + } + + @Test + @WithMockUser + final void testValidate() throws Exception { + mockMvc.perform(post("/user/validate").with(csrf().asHeader()).param("fullname", "Fullname") + .param("username", "username").param("password", "Password@1") + .param("role", "user")) + .andExpect(status().isFound()) + .andExpect(view().name("redirect:/user/list")); + } + + @Test + void testValidateHasError() throws Exception { + mockMvc.perform(post("/user/validate").with(csrf().asHeader()).param("fullname", "") + .param("username", "username").param("password", "Password@1") + .param("role", "user")) + .andExpect(status().isOk()) + .andExpect(view().name("user/add")) + .andExpect(model().hasErrors()) + .andExpect(model().attributeHasFieldErrorCode("user", "fullname", "NotBlank")); + } + + @Test + @WithMockUser + final void testShowUpdateForm() throws Exception { + User user = new User(); + user.setId(1); + user.setFullname("Fullname"); + user.setUsername("Username"); + user.setPassword("Password@1"); + user.setRole("user"); + when(userRepository.findById(1)).thenReturn(Optional.of(user)); + mockMvc.perform(get("/user/update/1").with(csrf().asHeader())) + .andExpect(status().isOk()) + .andExpect(view().name("user/update")) + .andExpect(model().hasNoErrors()) + .andExpect(model().attribute("user", user)); + } + + @Test + @WithMockUser + final void testUpdateUser() throws Exception { + User user = new User(); + when(userRepository.save(user)).thenReturn(user); + mockMvc.perform(post("/user/update/4").with(csrf().asHeader()).param("fullname", "Fullname") + .param("username", "username").param("password", "Password@1") + .param("role", "user")) + .andExpect(status().isFound()) + .andExpect(view().name("redirect:/user/list")) + .andExpect(model().hasNoErrors()); + } + + @Test + @WithMockUser + final void testUpdateUserHasError() throws Exception { + mockMvc.perform(post("/user/update/1").with(csrf().asHeader()).param("fullname", "") + .param("username", "username").param("password", "Password@1") + .param("role", "user")) + .andExpect(status().isOk()) + .andExpect(view().name("user/update")) + .andExpect(model().hasErrors()) + .andExpect(model().attributeHasFieldErrorCode("user", "fullname", "NotBlank")); + } + + @Test + @WithMockUser + final void testDeleteUser() throws Exception { + User user = new User(); + user.setId(1); + when(userRepository.findById(1)).thenReturn(Optional.of(user)); + mockMvc.perform(get("/user/delete/1").with(csrf().asHeader())) + .andExpect(status().isFound()) + .andExpect(view().name("redirect:/user/list")); + } + +} diff --git a/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.properties b/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.properties index 06e430b581..c87ad21df4 100644 --- a/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.properties +++ b/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.properties @@ -1,5 +1,5 @@ #Generated by Maven Integration for Eclipse -#Fri Dec 10 09:41:15 CET 2021 +#Sat Dec 11 15:31:45 CET 2021 m2e.projectLocation=C\:\\Users\\Draflosword\\git\\JavaDA_PROJECT7_RESTAPI\\Poseiden-skeleton m2e.projectName=Poseiden-skeleton groupId=net.guides.springboothelloworld diff --git a/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.xml b/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.xml index 94a159cbdd..01cfec6a1b 100644 --- a/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.xml +++ b/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.xml @@ -96,6 +96,10 @@ org.hibernate.validator hibernate-validator-annotation-processor + + org.springframework.boot + spring-boot-starter-oauth2-client + diff --git a/Poseiden-skeleton/target/classes/application.properties b/Poseiden-skeleton/target/classes/application.properties index da5362891f..8846ea04fd 100644 --- a/Poseiden-skeleton/target/classes/application.properties +++ b/Poseiden-skeleton/target/classes/application.properties @@ -13,4 +13,8 @@ spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl -spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL8Dialect \ No newline at end of file +spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL8Dialect + +########## OAuth2 ######### +spring.security.oauth2.client.registration.github.client-id=998214a3cbc67a2fba64 +spring.security.oauth2.client.registration.github.client-secret=adcb854516fbaefb576a50bc907819e8f1923052 \ No newline at end of file diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/controllers/UserController.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/controllers/UserController.class index 309b04d02c14d02ac4a83bd7f5aa6cd750d1cb5d..ca690c96069c223a9a1fcb2914ae2b41f8cc4aed 100644 GIT binary patch delta 135 zcmeBH?^fTC!pADXAjBX!Ig>A$QEu{CzRi-#44e!qKrvMYc?LBGEe3T48wL#qdj_q^ zGx_iE>NAKl7%<2(7y`wOCN~M(k+lG-w`AY}suE?eWl&ju>0&Y;NP!C=hbIk`@#hEad=Zy{Gkx5 delta 135 zcmeBH?^fTC!pADfAjBXwIg>A$QGW7SzRi*<44e$AKruB2c?NX`Ed~t+8wO1Vdj{>v zGx_iE8Zd}67&6E*7y;#sCpQV)k+lS>w_@O7uw@WsuwzgHs#Iri0LnWuxH33Rt`_{p h>kic8!Jx?C$zaUjHMvfxhS6a1Zy{Gk_sNdJUI3i}8KVFI diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/domain/User.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/domain/User.class index 9a4a539bee6e47c59c71e41b966f066c202ee5d7..bc029cf6f9450b737e4b97062d0f542945ffd842 100644 GIT binary patch literal 3261 zcmbVOSyS6q6h7D3n8iR?vq3`BGzCMVG$m~bgx0Kq7)aQ%v`s7Q8|Q*7c_cZFe@bWi z6FSp&CQPQyOdtB#|I|*uBgqT0NSHoIy7%0(eCOQn9Q*Ho|M-)LrYN7Jn4n8JtEidg zq2`oqWft}=%hmE$QCFt6>qt9EaY1Je^q0D3=w?CN+&_>xH%YC6rY*Y=SUtD(qWr4kF z#4Shs^v_>E{vs%*@`C!absVdvD+|(|5p;g5Y`Ur__mrdd4Vf`b%hg?Ybp#E07O%7t z$8lU~=A^cohtZXYgB58?TX$vN3l60=$K`#Y@=kq3+NqQz^y8V`olTf=)+P!fsILL> zw#)T}+Q&icm%5?y9#RwwY1^o|>u4L6JC9NyLNi&Ej-wagXprxMeU2(;w5Xe~vuxlR zIi5TNIaYwSlI}RT7*ucYL9h(DXnS5Z3?J^`GL{?7QR22`07UN=J|XMYS!F7B4r~}} z&h<2s@jVo7!OF`HYN4ws8l{f}wTzALwG&E}q5&G@)p&}A{nbQ@F43T%o~$zEM!C2z z?HwH#&(*ea;FJz#VIK(N?h6GbjAq}>bG~ja1ZNL=u1oiYm4Bc!uU(KwP@*8+RW9S$ zctcuM8ZyM&DN0cnG#y`asIekdMNYR9uB!JbXyBN`8cRCirLHvC=qu2vx~kqQW0*_P z1uhO-SLJ>{zFPm5`K-Q60u0|P*ao@3>V_;+Mg`ExN+S7lRg7g<8QOwn7#IQ|KC0Hf ztqP{@mTh?0JV9-CBK!VXv0|g|Wxg7>GBY=mq*Zji*YsZCjBV?cEE>6k?$OmGWd+T@ z-?1KKQqi_mv1G__pbolE8%(^JPI^FFNqQ)#yB?I|rD&UWKubOEF`$6}{ydx+e~ODN zgfd`DaLL#95?~2xHgue*Xxf0R%OTy_|5rB@O*xrd&cbBeu*{`bC1pz>M_U1BU*j2& z9P-gws3 zhhD-si~F2Rl;O*v4?y7-JPB$AkCW7fbvu5nV$^{L-GzNO_PyBk;Clx9UP*n_4*@0x z-hA8%@erP~4xOX(5WudV>Y^AoNwe<7X5EX>!rW=r9ck7bffgoHv+m_)-OES;LkS7T z=n4QD_{Q-aNWY;E(-TK@Ej@WeW9jQhl>QC!7)|0mgu)P<#eu(_E+W@qWIjUIAx-=C zbb~bP;K{3p@K!fHR4ikBE%XVbT`kxW-NbVVkDy!hDc%f5!DM&%D;9qAR!=zT zMN9b#K{P?1(dR)XbNI$!)5=*))v@yha<~MdGu|OztA@8VxL(GV5ZExLFK8O?Fs5r^ zOt&L3-Ju!8VB=$$u7xp81Jj)oFfpfuS1(}VdI_41#B?`|>24&ZFQYNt4P(jx)BFjT zn7cJh7d%W~MPeEYV_J&Dl!?YP7RIy+Olv1#;vT7C8ul>FM`B8cF|9{pT8PHf&~0GzE7qh~Y#JivVrh}p3Y42v0b79_MbfJnCWYBVL4T2}2nxlRRFU#3l2XM)U6JxC#z>KB zq6jxC!a^}ARZMvmlTyX)x?;+!m?1^FiGnKAeT#@t%t#e!uVPlJxLa4Gy^0JevP~4! z5U!$IC}uH7bWr;O zOK3$7VdNV!M@}oUm72AHHOjnBkxqNmPBv)8u!%>!(jMw{+o;g+#mfISDxQlgO5?W9 k#cfOD9@pZg-MqFWPQerLG*9U}fs6Do&uHEz_wy30e;Q?UZ~y=R diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/security/SpringSecurityConfig.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/security/SpringSecurityConfig.class index 8d0612d395aabaff62dab5d8155bf95a7391fe6e..94d63a8a3646c7235ada871825e244f13e6fc997 100644 GIT binary patch delta 1414 zcma)6Yj4|R7(Fk!*m1p*I%|tM=#6glvf?%!1KKhcy3)1ljb*H)gKci?CLWH{#ZF5Z zqcAQTw~g-QvT-YXM~JD&lc+!y5)$GU>U*D2`3r&dF%OI&`$0(_m>9`^uVyF%3Wz8~m%{4@HF~kB)({&L&3{f@f zIBK_qUZ?^dX1K(^k(&8zNRPk*V=%2}umgcmjtQ^_kI9(C6u%S6#b)q~fLVs))!=Qs zE1ID2M+w=8jyIl=@hnbK%AzlroGj){n_-c!i*3|qn;O7s)-uUVo$*r!q>-Y%Xy(c# zqeLN}^Ib9w3p*~o|KmLgdvHp|^LT;(89fsfaE4)oYq1CP6=OjyyQZZUG&h^4Jxkf{ ztmfvA8|TZ0<4y&r2(7ZZOG~|0F;^_R5>6v4Lx#>!-#K|sTh>%dvvX?NEtz(1sOzMJ zMdStK7-n{o@?jy~BE!TvhTVbA-8KyCyuYTU^RG7;vy^=1=yS43Ue%6 zW;je<9lR&j%v?SZ%d(gGcd_ZlRm5XpxF{nANx~}DWW0vgc|y|TZ^(!s>Vt2|cpH~D zFG~%q?mZbRcuB$sxF+B#L$=yO9si@|pztBq85%UM$@QD6e21~Kyg$@;s$kH$($#Er zyENA<+UlsSEm+2wRb0@lsR|)&WXt~P8=`x$R5E6ZjvJ8l5Zxn2XLQ`QjnasvIga57 z`0^k7QGT)Z8ms5K?(JIpm2%%hFO+*cG>Jcj&y$-|pHzI>prAWZXq>M)5o25=vJ=Bm9k`4Uwtk-!yPA^R}u@eaQd zZ*F?m!~3*MJ4#Z;bC3?;FyD?h9=i@s^lI@uD#H9;e zyp?PBMp7ISiG-zb;o7(`vU1_tt?^FVfD1Eu@7{Cg+jWYC8pI7{-mPL$v*@#%? z3F#&y;!22U2$3Q#<4S>Ue3gKe5dr}#t`Se6Tqbm#qJvfk)fh$F z21a7*7<)%~S=D3#fsz6*b1DkVH0M9FCa7lK*t3CXtgw#Qa45Kj2?Mvyc-O$a(C&C0 z5>eY=Ll{o9qn`eu-OG3?QZ}lMW18e8)L{k|?4>S=aDD0cgB3|FM4rwXxW8lDG{`UW zG+p%7d;S@%?f9f&9*<~L#in^8Td+WT6>=q`%mI1Ai?o(#>4bxLj3?C8MDZzHe*s+76@CW## zjMJ3^F`9UonNDZs_08+Y=i57gW9*dSF?2&S=UUHr8YfCm0%I({F{xBzqx*3jsZdyD z^iZa@j3PsGDjo%ogr4y0U@Ak)P&!pw*)xX1-u{T8cwxq}f&$iRSV4)Q;VUh#vUwnr zp$H<$(DF?vqLE0H%NLhL`=C;WL;wGbdJMJDXe*zsZ^W3UcW*Oo)m)BLstCHTwXyjE zRBQVtneb^wWXZ?M%7lwpakm>GRR$(YLV2ki!}cE<9J%!wPI9Pk$?g*|mro{{@mxGh zXnaA64{}k@Nz}z7_5>@1X;dl)eh^$Vf`c%XH!tnY-z}V)Z32SIE0E zsG&-}_T4~noidJkV^oP&7SpjHp99Hvf#n`B#eU?H}@ E0KaFFS^xk5 literal 0 HcmV?d00001 diff --git a/Poseiden-skeleton/target/test-classes/com/nnk/springboot/controllers/HomeControllerTest.class b/Poseiden-skeleton/target/test-classes/com/nnk/springboot/controllers/HomeControllerTest.class new file mode 100644 index 0000000000000000000000000000000000000000..ac11b0b2b58873622afe87d50a47c391ff2d3312 GIT binary patch literal 4097 zcmcIn{c{sV7=E^Cy^N%tDxfLvTe6b?vA^?eu&@r z@w0!5Ga9QiI{xe*<@oO9k~GuHc%8w_p`KAMhEsCMH|Y^CD0NdKnI`TI&|CTFx@RRbCagVlZm1y*9gU zGn_8E{&EbsgnI64u+(ZCBO@zayO(eDgo1k;o)6dt@MOM6NGVxsin? zNK=w~;<9w4y26mjjVv(qPP!G5MFvAA262GlKv6p4W>_l=f8HV+G7J@6+o~>DzSPh0 zVy{|}WYqB_^4b*L-A)|(0--`LLMH#NhD3-@h$Yt-`F&t`#>75kvp9z54LrwiDOD6i zn9W$22xYZGVQ1n69H))QL*$j%8>PnX4|9no{BLKDB+Bgy%Lbt-v1El+6~}1IE1$(n zIBDPn!_6e+TJG-xT8hIXMkT$Lb70pf8kbFNbF)*IRWn3}v7Q^(k8Kz9V|%I8Qd^% zoecf|soHgW6Ypvp^jpDO&;m4G9 zp$VO6wZ|N7CEPJE&u}W0(s59kSimAp5uWg=$JH3tQfd}!)NC3lb(s?ZHJpMSRU8VN z4{*=GU4}v`&VD4_&UcM9YbkprYAzq*BN`zB8mdC-{!?92A;J3^hL<9_2EQgI5xft} zz$a-NOH42c%S0J8HulQk)*8e4wCp+v6KRbQn{|PtI_wcp=Wq#bg?d>Q4-gpe8Lp%< zO;=143L$|yG}AN8Bs7ja#d;h|)F$`q&?{7G(rNVGKAJ-XMQWd=*ZT1(!vK$d^M*qA z@tKLwb<`L#n07;_(vL4`TBpIEhJRaK;$>MWO6q`Bx==GOxuI{1X{jgUBYG1(R5qqv z-KtOP7D$Z95=Lb6bXed%=K)3XGlxE<28@5T_yzV%{pR8Iz zpsg_6t-0VhjoleK&1KM|=NEc1=tE5H~@m*^JFn6r&r}uj4ONR(rJxISe-5K5c zMt{YVKhcjK9HOfR1rFmWx@rJ=0Z-Gj{v09Up4QgGw4#BgiI#qEcy#n<9NosV+jy~# zSN}q;j@N&|SQ|S_(!dGAIk^LWIL1GSal+5gkyTTrBUH4LmbpMH7wM~a6Y*~2wAt9u zo0&h5*+zaFg*x7;qgcn>Hr}t}i_@% literal 0 HcmV?d00001 diff --git a/Poseiden-skeleton/target/test-classes/com/nnk/springboot/controllers/UserControllerTest.class b/Poseiden-skeleton/target/test-classes/com/nnk/springboot/controllers/UserControllerTest.class new file mode 100644 index 0000000000000000000000000000000000000000..08c71042958ed513355de01110268beba3ebfbdb GIT binary patch literal 7309 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 Date: Sat, 11 Dec 2021 16:36:52 +0100 Subject: [PATCH 09/12] Pom --- .../spring-boot-skeleton/pom.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.properties b/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.properties index c87ad21df4..64957e5a17 100644 --- a/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.properties +++ b/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.properties @@ -1,5 +1,5 @@ #Generated by Maven Integration for Eclipse -#Sat Dec 11 15:31:45 CET 2021 +#Sat Dec 11 16:35:52 CET 2021 m2e.projectLocation=C\:\\Users\\Draflosword\\git\\JavaDA_PROJECT7_RESTAPI\\Poseiden-skeleton m2e.projectName=Poseiden-skeleton groupId=net.guides.springboothelloworld From 915782a60fd0cccc6f0746cf4e3c1a2cb806dce8 Mon Sep 17 00:00:00 2001 From: Florent TRIMOREAU Date: Fri, 24 Dec 2021 10:45:33 +0100 Subject: [PATCH 10/12] Log Added --- .../controllers/BidListController.java | 14 ++++++++++++ .../controllers/CurveController.java | 21 ++++++++++++++---- .../controllers/RatingController.java | 13 +++++++++++ .../controllers/RuleNameController.java | 13 +++++++++++ .../controllers/TradeController.java | 21 ++++++++++++++---- .../controllers/UserController.java | 14 +++++++++++- .../controllers/HomeControllerTest.java | 3 ++- .../controllers/BidListController.class | Bin 3891 -> 4711 bytes .../controllers/CurveController.class | Bin 3824 -> 4617 bytes .../controllers/RatingController.class | Bin 3724 -> 4489 bytes .../controllers/RuleNameController.class | Bin 3780 -> 4560 bytes .../controllers/TradeController.class | Bin 3694 -> 4452 bytes .../controllers/UserController.class | Bin 5003 -> 5530 bytes .../controllers/HomeControllerTest.class | Bin 4097 -> 4103 bytes 14 files changed, 89 insertions(+), 10 deletions(-) diff --git a/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/BidListController.java b/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/BidListController.java index 8c8f40c624..f47b8b0fe5 100644 --- a/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/BidListController.java +++ b/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/BidListController.java @@ -3,6 +3,8 @@ import javax.persistence.EntityNotFoundException; import javax.validation.Valid; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; @@ -23,28 +25,35 @@ public class BidListController { @Autowired private BidListService bidListService; + + private static final Logger LOGGER = LoggerFactory.getLogger(BidListController.class); @RequestMapping("/bidList/list") public String home(Model model) { model.addAttribute("bidLists", bidListService.findAll()); + LOGGER.info("BidLists List"); return "bidList/list"; } @GetMapping("/bidList/add") public String addBidForm(Model model) { model.addAttribute("bidList", new BidList()); + LOGGER.info("BidList add form"); return "bidList/add"; } @PostMapping("/bidList/validate") public String validate(@Valid @ModelAttribute("bidList") BidList bid, BindingResult result, Model model) { if (result.hasErrors()) { + LOGGER.debug("Invalid fields provided"); return "bidList/add"; } else { try { bidListService.createBidList(bid); + LOGGER.info("Bidlist added"); } catch (AlreadyExistException e) { model.addAttribute("message", e.getMessage()); + LOGGER.error("This bidlist already exists"); } return "redirect:/bidList/list"; } @@ -53,6 +62,7 @@ public String validate(@Valid @ModelAttribute("bidList") BidList bid, BindingRes @GetMapping("/bidList/update/{id}") public String showUpdateForm(@PathVariable("id") Integer id, Model model) { BidList bidList = bidListService.findById(id); + LOGGER.info("Bidlist to update found"); model.addAttribute("bidList", bidList); return "bidList/update"; } @@ -60,12 +70,15 @@ public String showUpdateForm(@PathVariable("id") Integer id, Model model) { @PostMapping("/bidList/update/{id}") public String updateBid(@PathVariable("id") Integer id, @Valid BidList bidList, BindingResult result, Model model) { if (result.hasErrors()) { + LOGGER.debug("Invalid fields provided"); return "bidList/update"; } else { try { bidListService.updateBidList(bidList, id); + LOGGER.info("Bidlist updated"); } catch (EntityNotFoundException e) { model.addAttribute("message", e.getMessage()); + LOGGER.error("This bidlist doesn't exist"); } return "redirect:/bidList/list"; } @@ -73,6 +86,7 @@ public String updateBid(@PathVariable("id") Integer id, @Valid BidList bidList, @GetMapping("/bidList/delete/{id}") public String deleteBid(@PathVariable("id") Integer id, Model model) { + LOGGER.info("Deleting Bidlist with id:" + id); bidListService.deleteById(id); return "redirect:/bidList/list"; } diff --git a/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/CurveController.java b/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/CurveController.java index 0869bb0272..9fbbeed625 100644 --- a/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/CurveController.java +++ b/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/CurveController.java @@ -1,8 +1,10 @@ package com.nnk.springboot.controllers; -import com.nnk.springboot.domain.CurvePoint; -import com.nnk.springboot.services.CurvePointService; +import javax.persistence.EntityNotFoundException; +import javax.validation.Valid; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; @@ -13,33 +15,39 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; -import javax.persistence.EntityNotFoundException; -import javax.validation.Valid; +import com.nnk.springboot.domain.CurvePoint; +import com.nnk.springboot.services.CurvePointService; @Controller public class CurveController { @Autowired private CurvePointService curvePointService; + + private static final Logger LOGGER = LoggerFactory.getLogger(CurveController.class); @RequestMapping("/curvePoint/list") public String home(Model model) { model.addAttribute("curvePointList", curvePointService.findAll()); + LOGGER.info("Curvepoint List"); return "curvePoint/list"; } @GetMapping("/curvePoint/add") public String addCurveForm(Model model) { model.addAttribute("curvePoint", new CurvePoint()); + LOGGER.info("CurvePoint add form"); return "curvePoint/add"; } @PostMapping("/curvePoint/validate") public String validate(@Valid @ModelAttribute("curvePoint") CurvePoint curvePoint, BindingResult result, Model model) { if (result.hasErrors()) { + LOGGER.debug("Invalid fields provided"); return "curvePoint/add"; } else { curvePointService.createCurvePoint(curvePoint); + LOGGER.info("CurvePoint added"); return "redirect:/curvePoint/list"; } } @@ -47,6 +55,7 @@ public String validate(@Valid @ModelAttribute("curvePoint") CurvePoint curvePoin @GetMapping("/curvePoint/update/{id}") public String showUpdateForm(@PathVariable("id") Integer id, Model model) { CurvePoint curvePoint = curvePointService.findById(id); + LOGGER.info("CurvePoint to update found"); model.addAttribute("curvePoint", curvePoint); return "curvePoint/update"; } @@ -54,12 +63,15 @@ public String showUpdateForm(@PathVariable("id") Integer id, Model model) { @PostMapping("/curvePoint/update/{id}") public String updateCurvePoint(@PathVariable("id") Integer id, @Valid CurvePoint curvePoint, BindingResult result, Model model) { if (result.hasErrors()) { + LOGGER.debug("Invalid fields provided"); return "curvePoint/update"; } else { try { curvePointService.updateCurvePoint(curvePoint, id); + LOGGER.info("CurvePoint updated"); } catch (EntityNotFoundException e) { model.addAttribute("message", e.getMessage()); + LOGGER.error("This curvepoint doesn't exist"); } return "redirect:/curvePoint/list"; } @@ -67,6 +79,7 @@ public String updateCurvePoint(@PathVariable("id") Integer id, @Valid CurvePoint @GetMapping("/curvePoint/delete/{id}") public String deleteCurvePoint(@PathVariable("id") Integer id, Model model) { + LOGGER.info("Deleting Curvepoint with id:" + id); curvePointService.deleteById(id); return "redirect:/curvePoint/list"; } diff --git a/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/RatingController.java b/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/RatingController.java index b1f2f674eb..42a0276bb5 100644 --- a/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/RatingController.java +++ b/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/RatingController.java @@ -3,6 +3,8 @@ import javax.persistence.EntityNotFoundException; import javax.validation.Valid; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; @@ -21,25 +23,31 @@ public class RatingController { @Autowired private RatingService ratingService; + + private static final Logger LOGGER = LoggerFactory.getLogger(RatingController.class); @RequestMapping("/rating/list") public String home(Model model) { model.addAttribute("ratingList", ratingService.findAll()); + LOGGER.info("Rating List"); return "rating/list"; } @GetMapping("/rating/add") public String addRatingForm(Model model) { model.addAttribute("rating", new Rating()); + LOGGER.info("Rating add form"); return "rating/add"; } @PostMapping("/rating/validate") public String validate(@Valid @ModelAttribute("rating") Rating rating, BindingResult result, Model model) { if (result.hasErrors()) { + LOGGER.debug("Invalid fields provided"); return "rating/add"; } else { ratingService.createRating(rating); + LOGGER.info("Rating added"); return "redirect:/rating/list"; } } @@ -47,6 +55,7 @@ public String validate(@Valid @ModelAttribute("rating") Rating rating, BindingRe @GetMapping("/rating/update/{id}") public String showUpdateForm(@PathVariable("id") Integer id, Model model) { Rating rating = ratingService.findById(id); + LOGGER.info("Rating to update found"); model.addAttribute("rating", rating); return "rating/update"; } @@ -54,12 +63,15 @@ public String showUpdateForm(@PathVariable("id") Integer id, Model model) { @PostMapping("/rating/update/{id}") public String updateRating(@PathVariable("id") Integer id, @Valid Rating rating, BindingResult result, Model model) { if (result.hasErrors()) { + LOGGER.debug("Invalid fields provided"); return "rating/update"; } else { try { ratingService.updateRating(rating, id); + LOGGER.info("Rating updated"); } catch (EntityNotFoundException e) { model.addAttribute("message", e.getMessage()); + LOGGER.error("This rating doesn't exist"); } return "redirect:/rating/list"; } @@ -67,6 +79,7 @@ public String updateRating(@PathVariable("id") Integer id, @Valid Rating rating, @GetMapping("/rating/delete/{id}") public String deleteRating(@PathVariable("id") Integer id, Model model) { + LOGGER.info("Deleting Rating with id:" + id); ratingService.deleteById(id); return "redirect:/rating/list"; } diff --git a/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/RuleNameController.java b/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/RuleNameController.java index daea193a37..3d1e31bb8c 100644 --- a/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/RuleNameController.java +++ b/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/RuleNameController.java @@ -3,6 +3,8 @@ import javax.persistence.EntityNotFoundException; import javax.validation.Valid; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; @@ -21,25 +23,31 @@ public class RuleNameController { @Autowired private RuleNameService ruleNameService; + + private static final Logger LOGGER = LoggerFactory.getLogger(RuleNameController.class); @RequestMapping("/ruleName/list") public String home(Model model) { model.addAttribute("ruleNameList", ruleNameService.findAll()); + LOGGER.info("Rule Name List"); return "ruleName/list"; } @GetMapping("/ruleName/add") public String addRuleForm(Model model) { model.addAttribute("ruleName", new RuleName()); + LOGGER.info("RuleName add form"); return "ruleName/add"; } @PostMapping("/ruleName/validate") public String validate(@Valid @ModelAttribute("ruleName") RuleName ruleName, BindingResult result, Model model) { if (result.hasErrors()) { + LOGGER.debug("Invalid fields provided"); return "ruleName/add"; } else { ruleNameService.createRuleName(ruleName); + LOGGER.info("RuleName added"); return "redirect:/ruleName/list"; } } @@ -47,6 +55,7 @@ public String validate(@Valid @ModelAttribute("ruleName") RuleName ruleName, Bin @GetMapping("/ruleName/update/{id}") public String showUpdateForm(@PathVariable("id") Integer id, Model model) { RuleName ruleName = ruleNameService.findById(id); + LOGGER.info("RuleName to update found"); model.addAttribute("ruleName", ruleName); return "ruleName/update"; } @@ -54,12 +63,15 @@ public String showUpdateForm(@PathVariable("id") Integer id, Model model) { @PostMapping("/ruleName/update/{id}") public String updateRuleName(@PathVariable("id") Integer id, @Valid RuleName ruleName, BindingResult result, Model model) { if (result.hasErrors()) { + LOGGER.debug("Invalid fields provided"); return "ruleName/update"; } else { try { ruleNameService.updateRuleName(ruleName, id); + LOGGER.info("RuleName updated"); } catch (EntityNotFoundException e) { model.addAttribute("message", e.getMessage()); + LOGGER.error("This RuleName doesn't exist"); } return "redirect:/ruleName/list"; } @@ -67,6 +79,7 @@ public String updateRuleName(@PathVariable("id") Integer id, @Valid RuleName rul @GetMapping("/ruleName/delete/{id}") public String deleteRuleName(@PathVariable("id") Integer id, Model model) { + LOGGER.info("Deleting RuleName with id:" + id); ruleNameService.deleteById(id); return "redirect:/ruleName/list"; } diff --git a/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/TradeController.java b/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/TradeController.java index fe68ea3a25..2d55c32c27 100644 --- a/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/TradeController.java +++ b/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/TradeController.java @@ -1,8 +1,10 @@ package com.nnk.springboot.controllers; -import com.nnk.springboot.domain.Trade; -import com.nnk.springboot.services.TradeService; +import javax.persistence.EntityNotFoundException; +import javax.validation.Valid; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; @@ -13,8 +15,8 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; -import javax.persistence.EntityNotFoundException; -import javax.validation.Valid; +import com.nnk.springboot.domain.Trade; +import com.nnk.springboot.services.TradeService; @Controller public class TradeController { @@ -22,24 +24,30 @@ public class TradeController { @Autowired private TradeService tradeService; + private static final Logger LOGGER = LoggerFactory.getLogger(TradeController.class); + @RequestMapping("/trade/list") public String home(Model model) { model.addAttribute("tradeList", tradeService.findAll()); + LOGGER.info("Trade List"); return "trade/list"; } @GetMapping("/trade/add") public String addTradeForm(Model model) { model.addAttribute("trade", new Trade()); + LOGGER.info("Trade add form"); return "trade/add"; } @PostMapping("/trade/validate") public String validate(@Valid @ModelAttribute("trade") Trade trade, BindingResult result, Model model) { if (result.hasErrors()) { + LOGGER.debug("Invalid fields provided"); return "trade/add"; } else { tradeService.createTrade(trade); + LOGGER.info("Trade added"); return "redirect:/trade/list"; } } @@ -47,6 +55,7 @@ public String validate(@Valid @ModelAttribute("trade") Trade trade, BindingResul @GetMapping("/trade/update/{id}") public String showUpdateForm(@PathVariable("id") Integer id, Model model) { Trade trade = tradeService.findById(id); + LOGGER.info("Trade to update found"); model.addAttribute("trade", trade); return "trade/update"; } @@ -54,12 +63,15 @@ public String showUpdateForm(@PathVariable("id") Integer id, Model model) { @PostMapping("/trade/update/{id}") public String updateTrade(@PathVariable("id") Integer id, @Valid Trade trade, BindingResult result, Model model) { if (result.hasErrors()) { + LOGGER.debug("Invalid fields provided"); return "trade/update"; } else { try { tradeService.updateTrade(trade, id); + LOGGER.info("Trade updated"); } catch (EntityNotFoundException e) { model.addAttribute("message", e.getMessage()); + LOGGER.error("This Trade doesn't exist"); } return "redirect:/trade/list"; } @@ -67,6 +79,7 @@ public String updateTrade(@PathVariable("id") Integer id, @Valid Trade trade, Bi @GetMapping("/trade/delete/{id}") public String deleteTrade(@PathVariable("id") Integer id, Model model) { + LOGGER.info("Deleting Trade with id:" + id); tradeService.deleteById(id); return "redirect:/trade/list"; } diff --git a/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/UserController.java b/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/UserController.java index 4e5fea7186..bdbc80a9b4 100644 --- a/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/UserController.java +++ b/Poseiden-skeleton/src/main/java/com/nnk/springboot/controllers/UserController.java @@ -2,6 +2,9 @@ import com.nnk.springboot.domain.User; import com.nnk.springboot.repositories.UserRepository; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Controller; @@ -18,15 +21,19 @@ public class UserController { @Autowired private UserRepository userRepository; + + private static final Logger LOGGER = LoggerFactory.getLogger(UserController.class); @RequestMapping("/user/list") public String home(Model model) { - model.addAttribute("users", userRepository.findAll()); + model.addAttribute("users", userRepository.findAll()); + LOGGER.info("User List"); return "user/list"; } @GetMapping("/user/add") public String addUser(User bid) { + LOGGER.info("User add form"); return "user/add"; } @@ -36,6 +43,7 @@ public String validate(@Valid User user, BindingResult result, Model model) { BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(); user.setPassword(encoder.encode(user.getPassword())); userRepository.save(user); + LOGGER.info("User added"); model.addAttribute("users", userRepository.findAll()); return "redirect:/user/list"; } @@ -46,6 +54,7 @@ public String validate(@Valid User user, BindingResult result, Model model) { public String showUpdateForm(@PathVariable("id") Integer id, Model model) { User user = userRepository.findById(id).orElseThrow(() -> new IllegalArgumentException("Invalid user Id:" + id)); user.setPassword(""); + LOGGER.info("User to update found"); model.addAttribute("user", user); return "user/update"; } @@ -54,6 +63,7 @@ public String showUpdateForm(@PathVariable("id") Integer id, Model model) { public String updateUser(@PathVariable("id") Integer id, @Valid User user, BindingResult result, Model model) { if (result.hasErrors()) { + LOGGER.debug("Invalid fields provided"); return "user/update"; } @@ -61,12 +71,14 @@ public String updateUser(@PathVariable("id") Integer id, @Valid User user, user.setPassword(encoder.encode(user.getPassword())); user.setId(id); userRepository.save(user); + LOGGER.info("User updated"); model.addAttribute("users", userRepository.findAll()); return "redirect:/user/list"; } @GetMapping("/user/delete/{id}") public String deleteUser(@PathVariable("id") Integer id, Model model) { + LOGGER.info("Deleting User with id:" + id); User user = userRepository.findById(id).orElseThrow(() -> new IllegalArgumentException("Invalid user Id:" + id)); userRepository.delete(user); model.addAttribute("users", userRepository.findAll()); diff --git a/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/HomeControllerTest.java b/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/HomeControllerTest.java index e6e9a2a36e..d5929fd84c 100644 --- a/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/HomeControllerTest.java +++ b/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/HomeControllerTest.java @@ -42,7 +42,8 @@ final void testHome() throws Exception { .andExpect(view().name("home")); } - @Test@WithMockUser(roles = "admin") + @Test + @WithMockUser(authorities = "ADMIN") final void testAdminHome() throws Exception { mockMvc.perform(get("/admin/home").with(csrf().asHeader())).andExpect(status().isFound()) .andExpect(view().name("redirect:/bidList/list")); diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/controllers/BidListController.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/controllers/BidListController.class index a7b7ffc9c6a2acfe3e2907e5b3a72fbfcb5d20e6..d8b819264866f71dfd919921ee38fec3fbd63f93 100644 GIT binary patch literal 4711 zcmb7HYgZfB72Q_|OW-lFWr_`nUD-4QFnAmnI}W&R0E4YW$gXinvHKcH1B@-rkeLyW zrb!=ZleX#m5jTCL@22m%X%{ZdTKxh2)_>4n($#(Mj7E|(xD*zQX6D{=_t|@&bFcpS zpTGYDz!=_6At7+8fTV}}@=qd&y=S_FbDwzT!`IyjN@HUDYj-C+cy;ie*t7i=vleX>n zhHp8xCvYzBxXU5JCD*8$>yCR{FPet!=}Sh*cic_gh$iThHQ!mcT(iuud-7Kq|Z(``(OLjouJsLXDDezFXxZgv39gyX*G$i!GgeoFsqJeBM6g zN?}l7c=smKFpLudsU>2WtW-$nV3 zXZFRKPwW?)B@RhxqA93^y6UQ&8fL9Wo=D^UWFagoFDp^)#Th)2!dceU{eIJM4o^}v z%U*KmoEQK@3u#aqt(jJV_Nr7-;OK)@=8AKszv7gy8nUc>R=hwbvnIY-$E^yC#RiCz z{F2!uw-(9FU};QKmJnbHGXlqAR4qGI!?NoQrxO>^m&Rox47tiOQg(@;(s){6Z#`c= zrG@A&t87S-ULK6Aiq_y0u}Ot7*m4NMF4MQyOs`h)<3~q=##YLi*cIYvyXrKT$$^Ns zMn=b5J7XkOON%_LjJTmUC9xnm`M;`Gm40M+7Rx-IP2oCwd0eqHE!D!8h6Oyw=D1>b zGp_4MOR>4$NMn%=HD{}7*(J-Yl)db#>#SL2vn)&CriPD5v$vPcVr^NrfRAbTI6lF0 zDY+)a4UHghc{dsl?ZO9X6oX=v%}5%|q*>{wRMqr6W0^a_5>`@J7Rb(Ql+0DNAL)}7 z!YOagY;aQaSc8RIEFNwNbHQYR?s@}KJ7w50(qLUae4QOUOAiMN2LZFDjOa-&Yz>a$ z!jufA@w`9}H#BZ)C4W5fh@4Dv8AhOg7wK|4bd{wAPR1H^CrRld!P+{WkJ9zxS>V8Z z^S)8K&CVb0Uq@Q)dwp}Yb#w3XR-E-`S7r4EEoY{=%jIm}lzVk7+y~cScf?aoMb}@j z$}b9>jSUrBnufnp-;9}9!YX&-Gx%HzpA|UJ*d9ZO8eYcd*@`UNXXVMgj;_y18^5CA zReX`J<0aV9F|jN^NHEFNH#K|<-=>EmxOrvq+-?efmyCXwC$BoA!7`Nfjx6)< z2@FYDH}q9*gk0FPOQt@ud|#lirHspt>DiC@K^Y622wUz2QgwaVk2coRRD zhsP)7r(bIL72aYq;OWe?>4?#0M?}Y%9hRDqA%3Ibx3b-(eJ8*n)%(4MKj4q-fnh4j z=}9`B2kXvxr{+9wa$yr%iP7aE`LdhefdSWS^bIRFpi5ncrY9VI%6sEc>+)_TxAc>sJf*1OdVYCGzw50GGMIS?z*1 z62%8wP&^f(m<&-Q>nNt)!NtXUm~EiA6rjl6k7AH0hKOQ#_b8r0p3Ky_n2S&paD^zl zB^6is;Y0F;hiQIG|+BZjhebT}j-DEqqjwW+=FC;mCM$ zG*jwLZozEia(f$9PFcOn6?%w%g!_7%Qhk6n0d)R9g@bsU&&DX$8IC!NlX!wOp2IB0 zRjy+Jn27NlTzHH~fbdaMROXZlZJc`;Ygk7T8+@NeTMtiCOTF0S9lz&D!^xDTSo_)- z2aJGFv`^v%&a2ba5baZnuC4@^d@-QvB{`jc>&zy}Ykx?|r?>Ehg5>H;ij|Sf)M!9P z=Cy{L88zi8ntYOJPa#X@rTK@0P*IxwcnM!sY4)q+5}a{}V?8b^@pmLRppN}(_MY~^{-GeiC}=5zk@dyGe5b9 zpOLIzY~k06riL$mC##^fuPoB5H^{+Fm2) CG{$fM delta 1607 zcma)6-*XdH7(I7))6H(Sp-Dq*Y6*>0Y?HJ}v7!_#3KT636j3O@ss@QouoTG#6o2J` z7hmy?5576$15eIW>!gFu_~wf<`sSnKoBkC#o_n)wDT6aU?B2cE?>px^=iJR-BkNiB z=YPKc5x^8ax#RvR4#3*i*UFSC)T^&$0so(MyfXm4@H)9S971 zh@i*C5VAIQ$gho(xf8?k46eLpwdVWP<(i9QsMwen9Bd{!%rTDRgj}+Bi<9dc_NQX{4ODHsDUi5Q zy;&`-R9BZvbE~b|a;@p%65gWZ#%k+Kb>&7)Q_U%=nuoWsEN?k`MMM7L{2Cp?s)uWM zSAOMQq=u%V^yN^jXbBW5a%XHzejXcfRqy*AZs7x2^{%%C3}qmlw3&fgqg-vS4qV=2 z+?BWru95r(yl?nmAkMog2GZEZyVos19}?UNB+(C3L&mvF@!Ea?!e_MtoaZ}(Yk#4g zd@TPRG95gA4>=Qy$*0!%dl%o;H9Lrz)g0+=Pr$)$j3H0t0y`pt8%12)LOdQ4PXxqP zK%6Z7fXQ3moiodbHS(!YXtGI9RoaArp{uJX@C|u zbi~6r-%VhU!Hx1Pt9+)q6rpzoyn<6iA%6j{;x+9`K^tnaF^0civ<-2CB^P~vjR$h;o5{pk3L5Rv;57DWY58t*C@n+eE2JQx)?=``mxiBWuNv7gG5laD8id8GeRMnC%DB zo1wV}IqV@0ewb(e2y;BDCC+q-LW$*2Vp$7Q-%?q}sO%|g*_QrlPNPM6_hVeJ(d-Lj zq(%Fc|H_nvrA<-Cax=>t|B>a*M`y|2lRQUig!pEZ?$U`gdFl8=mc!hsxri XvUm{QLy;NyP@{dM&zSlP`WW~Zq&d3< diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/controllers/CurveController.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/controllers/CurveController.class index 10be478f957a95b9f68abe72843fc0246f67aa11..6d581e1676ee64011a119d8e6f7c7ed14443c925 100644 GIT binary patch literal 4617 zcmb7H`&S#s8NDNfCGZ+!nc_fWM+pfA8@!3*q%pW|0Rtfg*#$yM($`8FU~Oqv*Hu_{V9DMT$*$G2lTJ#U((Y%vyyhP7asx#R=czF&He7Z-#4TG{O@1? z25@1(CD#c&w^EUwZ%);{O*z$ikU?6Y`?|GhnH9@f zH?J12%Tge4tfbz%=GsoMB)v_$Bn8a*gxG#K+6Ww`4(kX7^o>i4wu6M&MO3U%hHLDc3-c8eLO)w|wfxBgUvdplD=C97qPA>}N z!Wfmc3)jtgcYR%Y9L-)TRcyx&E(^2`4X+5Kr`)pa#8Di}pj+UCUN<&pCS1)x4#x#L z)@2aJ5_n>0KB8u-V)_2~@cm16K;Q!gI?yR_bl!GkpR;A8$yUoZeX2te{ECvL+qKET*rZ{@SKsyd~;xvXc z7!nwLUv@HZ24@8_Ys58CsgT&AMn?6(u9#|(@xvH}nZY@Mhm*|Jq{6_HcuK&q%H@fG zOcd(@^SBZhyFpNlvam9m`s?C~Y}<@Hp2gENfiAL|DxSQ;br{d!Lm50vuI}}of#-0M z657t1OBW?T7+%SOLLH6x)FcbESCy;+ryeXj7hRCShFiX7sVWQD1j5uc$QjqG3S3AG zk>r9|8FRqVxbh@3iz$K52xtb=0*@!CTz0FL?S#EZw~S6)L4Ov{3mn(5^us(u=GO=? zix>77%H#m+oc^=RmXhwxp`@z0ZqmCQ+ci{@UGe!UVTzui(gv7DYsTp@|b zYi_)jdg4q*c|Eqbf3_6d(?}oECfzn;d8{aA-dA<&7SSpO7Sa-4%wSnyB&m>MOYNb| zzzSYs3*E5%Y0q<&)7XMv&SI5qch1q%@@uxNl>L0ob2sg>EUV&p#lR<38MK#WvA(W4 z#HS5>2A`#OOP-{}ktqZU2NZkwV4ldL$Yr7hl3{(S=+m#cKI9b){8Y&5@A_S$J@!A6G*i| zCZc$-t53w!uj>WOTXy+1foBt=CHmb8Hkz9tb4%IfPSoIK@G1`*(Z^8oU!PhC6(tF#iaVugiNv9;uX`T~HZZ~$}?-_VYHyWwhlYpSJ z&Nlkz0pQTM-Q07ziAK4yv&G9J9M1A<;r<5xy7qp~GYaLGZS#4Z}_>FdF@w6XkN4YJq&|SkMM4oSM}486aPfl-_i3|-lWjW|7s%e zL7dP}z&oC#8`Df))oA;fyXd=jO0S-xUgZl6@G!5m4^9!CLe#~(NBEb21;Qt4g=3Xt zDPB*W%{_MJA9#ERgS!}M!%KfdPwxCKE~JnfdzUYS*t&G0kDwcQCibXaus00QSdgJ` z2_NP%mpQ9l@J6Bd$Q~3QZK0TGph!1SOumOJt9LOIp_mO(%-xG(kSIXgI=aG?J@C(` zlqSsz;g%HKHZ5pBB?Zs$9XN;MF!}5$>TsSOcv?e06UJ^4IKq`BA#gpcVO=vbqDgJT zhK?$FVeD*WQ+IR4^$bH}5#dj$(iBYqs6|DgMMXgqph~cy#a4}^py^37N*}(DACLzndlqfIs~OzxZ)s19G_^mL*4!z} zM*9D7AN_x{ul^NEsSpfO^Y`%fYVId@@l%rZ^Bw$J(-isQcZ!p}ePNNEYKa^y>zwmp cq*l&@t(*rN@+;HEL{H%z9q>=B{`qI%|B(T@0ssI2 delta 1542 zcma)6PjC}e9RA+!CYvmq&~8FVN~jd8ZPPSOp=t{yf>;o!w4k(<@~=RkQD|(oMQ=Ge z9+`LY;*2Lf!oY+$>I5^`W``+94-tYVO+kDpl_wKHr zo__NkfN^|c!w@LRUqtC%rInqkt=85n0_Nb*ynuDIexvHZL_&TlO7chX^FUT0d3~dC zw>np^t*+11{Pj2ldR#;hb&yA|joktxte3ji?1{K|347#UMqhj{`fa={ke6#_p6_45 zt8&6TF9ziw=GWb20jE>e#ye2-lOSmZiiA{>jayI^JB9H4XuHuHk?BI<2((0E>&T#6cfPJUx`^&dz%?duSQIijx zlKCNS%io=Td2rhmN0n>1@UbqZ-Fj2NQ2x*;o2IKV#?j^&hr{PKu0}Zuj*-G+xDPln zkmOSx2GZEhryCqV7rMC;@Q`9Qs$`O@G=DpmAbezW!BgBbxR)AkdOHh`kZWPr6ZDx_ z@CNSleNf-gXLhk>USni}J0S*dV+aLS9_EdR;6ecxp93Cg1D8TzD+KmNzs1<%<0kfp zz~lc0?jz9N{}22+-k_12iYMB@lQ=+PX(jj|CsS&}N10QQQWMzVj>Sc`_ymUpK1b9W zzpqRgZsF*HcUy)WlA58n}5Hv#h--s^jLI7L_yzawZUTmUmRI)W}t-$%P8uYhm$p z(Hk8JZNAj8Imx5cKSnM4*ckh_Xvwv;Ow3eJ!VDNN8>oYawxWNOPbgyFhg&72N zGuBqRLaQczz`I2)=d1Q(bPc#CF`lD)p%dV=&!W z8!KI5jv~XjH)HI!v?r>^I#JeN7-iGPNB^1S96Lu*NOrPZ3;J>E2YQUTAJ@wE1gG2C dCELQ1VRov?wj^dCwZS(A?&=;>e<&XV&j4(}vONF* diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/controllers/RatingController.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/controllers/RatingController.class index 765872d073d422d1de33010815f845e32d8dd87c..03533e0f5fd0420b9a116900b3d7f00bb24a9b63 100644 GIT binary patch literal 4489 zcmb7H`&%4W8Gg^QWEYrFvPnq5Cfx=@AdpOxrnP|>3j`0HGDr(_+_cs$)3MwY z^LpW?EQSIHef{FR^w;g86d0IJ2pmMC)u{2y!vbA%6*siYa?uX#f+I&<*9#fXa|3}V zragZphPUinWx3(`x6FdH+`wG6ilOIknO1FrIZ_F|4cnI`hCMKSeR6VqP9PV>aF#FK zG^f3l73p&{d!^{ut{q+#XzJ@<6iAPGCE1Dxa43Tgfn$2zhB*__Y6fyREYPwd!zh-( z>AvYYC1Z{i1jGFwU9trNM-8-~Rp5bX+m*AGazXkF7E{(3itc%s9R3mATTzzC=nZwmCxr973-rGao8jaBi{;8?s;)Y`4^? zz?^)cB7<j6|Fx-Z7Ff%wW@L-aos_7ee1Q!U_DwRe;W?!g;#D1+& z;h2;LnxZnOimpqk?$v7K;Vd2%Xp2fJuQ0XYF?=F}$5~Q$o6W!zxJ=1xciE$D5|-~@ z%!0zSHIORMTvieaoV>ThTyRE)t6u4brAjJfsk4Teas+O|^UDI45@RGuJ}DdIZmY`7 za9ND83?qaYj0@xwBrSPm%XZ^d(~4{8&f+PSNK6#NGUjG5L@cOk>$4OX>4! zUs65niaeZ{P8@>0#vG-2=-4?KRGcvR?V6N{HS$>E3Q2_B@EQxGqsmx4pHsU#Voj!9 zt?{^a;HKG-!=hs3|0-8q^EIclO6KuQ1`7g%NmbIY)GoRVEaF)<#Z@a9_kB;m| zhrs>!_dpf}hORqH(xPYL+RSMOk1Ww&QqVl(PjKKLs{r94bDjl2;t>P_q z%DCO1*sc1)*4pm9usvAyHlA5imXAtwys9Y>1Xkt!0~G;2zQBm%+-b+uIBC1P%GZWPt_6avikIM1HZs8*&28V zk}h3*uF*-g)50Dr4XY5pHt-w8UN-b17)tiv8TdW^KuROfQH7*gAw0ge&U+QVC?{-n znmii8s~_CYtF;tmNnM>X`qB&8Zp`|OVLZ$;Srfl3r1;B&8SgT@Q`ao7-RdOEYnH!l zF!=N!@A`RFKP@@&548UcNB+W_6gv4|O$0uMWBLhr#{+FV&E!>$HlMwNuDhpn>M80~ zzQ6zv@+xowCy7oWYUkZU{L4QN5fHV)vBa?yuO|j_r_TNzAKymr4hEa>>|b#tcX0=o zQpgQ`z!xHH?K;ti(1AP?dsr{n83l+JWGGz0C%Md3&T1CCQ7AsO3&oQ)6eBT;bQQ(u zhq$(M2NQJ^lM#xkyHWHK#TlaL+dqm=W17rVxtOV;n8kIXJff($!4IEN0|CbP5gOmy z97yx?;NTAUJ?TAkD0)7-gXc)k)CY>Vfo*(VlV(M5iwbU&7POm^f~V>hoX269e0G64 zT%-pc)zHsIv1&`lHv@VTvM5!X|o#{sGLQ}x0I*0!- z2SxZSp?*ZH+ghwas>Rg4ss;O+PVIf19BS@L=U(e--o`iT?t5zo-=)ZulN%>Re1r`? zlC_uo10(!DN?FG^I)NTc@|~wB?i5F!hBBP0-zt25B=ZSQ-6n2Dg?dM{6oCEl>6}= z{DfrvY#YDQG}V3aTgA!lzA(p5HBSx}bk6xGQZ47+TF$+({K~WqqNnh_4*17f|NIm1 EKQu{$xBvhE delta 1511 zcma)6O>Yxd6g_Wd>=_SZ6DG#k5JD2Zg5x9(gcfKp;UiEW1xjfQp?sL)CT<}K9;fXF znQbLD=&e{*s)WP}1TuoEl`2)0iiG$9Ecp*zRz2^{#7QeEvGBb2=G}YGJ?Gr<51a39 zbYK4c;#UBp`2L>zHak|Et2IgjX8(>U0qgMm^{NXKNqI*M$=}4EJy`*_UTM_kW+rPv zBLRW+9%6{Q=t8%Rjq;%}WNt!_d}H(``mn{uW`Qm#ytFLEoS28L*e17`=S9DKZT^@n z3dF;5Hg?L}*4Fq4k`8u1`NgV=L){{{2_$AK!9=}2Uk`Mv(+d5F zhY1{&58~6}<0ol*O2p4$%Esq%!O3)&abCcw%{8VfHx{cp>9|Uo_HYqj$e*0u;e2fWrixu;%gfUBrK2>Kq6T2ed(f|msOBl0 zX6+?X%W9s{q*4Y!J`D+-WsaJa8hcf2auI{iTDWkk;13T*GGAJjImJ-&A0d~W9E@En zxa8VgayW}CnoCYIFc_WG{7l_)!eGEsyH`*k#P0sSlbm-O_$CuuY|!X z0l0`i=a3ONS8;2)EJa6cSPB1f-}3UtrcoxrM@OO|hyZF9_V+`tGd z*YO3OnRUI@2;_=KK%1_2OD~&-bO<}DFUxn51+Vrqmm z?WfHq-47*tGh7}MthyLu4wC|>QnanQHN$cm{ihvQ(UZrs0!JhsMHqt>R|qVRYfT2y z`IrmPYgW~eV!hsH8H zEDNXNnUps+gTS?Y$vm(hFXT~|-N}{{VbtJ*1m`U$pnK*1LFdd! zD{N@k#1@BSpC8|zp+KkmXZES^=LC+&<|zhlG0cVir0!7b&o`ZC^l(VvXj6-i38YWL z;W(DSTd73<{}z`n#-5f)rTanBNy@&c;Z=M|;JJMj%YM0hoqI=|e?%lX{3>_gn(6z- zDvwil@Qob4E-)bV-O|^&yRdFdr()`pJoE+IB{!Io+)r**%yoI_)9_7vOQ4+xthq3X zz_EBAS0~SC}{?dNN}akMlU!!tWdz{_;%6 zyBzQ2HP360JPPxg=kGyie0qp?1H8(gwu1NvI{t=Zf8k9Ao%}B+0*|0eJpu1{B95l% zyvotmGk4K_|CCNOMZU@x7~oM}1y0~3(Md!dynBp)#g`y_qLw(8IhNt|#9-mnnZM(S z9rWG9Pzzr8D~=V;-^0ZW3M23Gg%DeZO7t-tMv;jXAwF=%y z6d&D%;$saIV-bpMjAHyfTwT74sRYGzh+^h`6n#W-nkf4BkK#GZl9`x`xdw_7t`p@k zNyQC*__!SKF~N^e_}<_^mY;`)?tx#l-o{}`&nNETMbb0#t|V@72cJ@;86n(?gxjJ7 z?V+ULal8#@aTGeAoudxt>46Ih`k63xgTNuKY!U+3!wOavGee5h7ObhLq7xQB@Oy+b zjD#%7KGdQhukd3?`c2$o=s4YkbX%p{k>MJ(FjYrR=ieqF%S3yll-wQEOETAOmDNyT zd^i-Qa66Hspr%}+Nk^F5D6Mh1DX-o}UcGSeipr~3Ws~8IE|qJG!rzwR3o-Ur@mi`> zA@1k+Bi^SR=$tv!oWfT2>xQG5f+Eag< zQc47U)cifXxm@`1UHpV({cH!nQZyyL_^sq*cVC!ir&=Hfiz?@07^#tSUnA$fNPcPB RCebr^M+N+2qksMh_#bi}oPq!V literal 3780 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 sA$SwslHZg7IZN{?dc^(r0qOV=KEbCl`V3#<{9 From 33a4fd900a594ea2658d1c8eb7c77a899d19c7c7 Mon Sep 17 00:00:00 2001 From: Florent TRIMOREAU Date: Mon, 9 May 2022 15:10:05 +0200 Subject: [PATCH 11/12] Correction on Tests. Mvn test successfull --- .../com/nnk/springboot/domain/BidList.java | 6 ++-- .../com/nnk/springboot/domain/CurvePoint.java | 29 ++++++++++-------- .../security/SpringSecurityConfig.java | 4 +-- .../java/com/nnk/springboot/BidTests.java | 15 +++++---- .../com/nnk/springboot/CurvePointTests.java | 17 +++++----- .../java/com/nnk/springboot/RatingTests.java | 14 ++++----- .../java/com/nnk/springboot/RuleTests.java | 14 ++++----- .../java/com/nnk/springboot/TradeTests.java | 14 ++++----- .../controllers/BidListControllerTests.java | 4 +-- .../controllers/CurveControllerTest.java | 8 ++--- .../controllers/RatingControllerTest.java | 4 +-- .../controllers/RuleNameControllerTest.java | 4 +-- .../controllers/TradeControllerTest.java | 4 +-- .../controllers/UserControllerTest.java | 4 +-- .../Exceptions/AlreadyExistException.class | Bin 471 -> 471 bytes .../spring-boot-skeleton/pom.properties | 2 +- .../controllers/RatingController.class | Bin 4489 -> 4541 bytes .../controllers/RuleNameController.class | Bin 4560 -> 4612 bytes .../controllers/TradeController.class | Bin 4452 -> 4504 bytes .../controllers/UserController.class | Bin 5530 -> 5629 bytes .../com/nnk/springboot/domain/BidList.class | Bin 7104 -> 7179 bytes .../nnk/springboot/domain/CurvePoint.class | Bin 3176 -> 3186 bytes .../com/nnk/springboot/domain/Rating.class | Bin 2303 -> 2234 bytes .../com/nnk/springboot/domain/RuleName.class | Bin 2575 -> 2575 bytes .../com/nnk/springboot/domain/Trade.class | Bin 4677 -> 4372 bytes .../com/nnk/springboot/domain/User.class | Bin 3261 -> 3261 bytes .../repositories/RatingRepository.class | Bin 357 -> 357 bytes .../repositories/RuleNameRepository.class | Bin 363 -> 363 bytes .../repositories/TradeRepository.class | Bin 354 -> 354 bytes .../repositories/UserRepository.class | Bin 803 -> 803 bytes .../security/SpringSecurityConfig.class | Bin 5390 -> 5586 bytes .../security/UserDetailsServiceImpl.class | Bin 2326 -> 2350 bytes .../springboot/services/RatingService.class | Bin 3103 -> 3104 bytes .../springboot/services/RuleNameService.class | Bin 3199 -> 3200 bytes .../springboot/services/TradeService.class | Bin 3209 -> 3210 bytes .../com/nnk/springboot/BidTests.class | Bin 2239 -> 2148 bytes .../com/nnk/springboot/CurvePointTests.class | Bin 2269 -> 2175 bytes .../com/nnk/springboot/RatingTests.class | Bin 2194 -> 2103 bytes .../com/nnk/springboot/RuleTests.class | Bin 2256 -> 2165 bytes .../com/nnk/springboot/TradeTests.class | Bin 2225 -> 2134 bytes .../controllers/BidListControllerTests.class | Bin 8186 -> 8202 bytes .../controllers/CurveControllerTest.class | Bin 7633 -> 7643 bytes .../controllers/RatingControllerTest.class | Bin 7825 -> 7841 bytes .../controllers/RuleNameControllerTest.class | Bin 8132 -> 8148 bytes .../controllers/TradeControllerTest.class | Bin 7518 -> 7534 bytes .../controllers/UserControllerTest.class | Bin 7309 -> 7325 bytes 46 files changed, 70 insertions(+), 73 deletions(-) diff --git a/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/BidList.java b/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/BidList.java index 8170ab5954..3540519bd0 100644 --- a/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/BidList.java +++ b/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/BidList.java @@ -8,8 +8,8 @@ import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; -import javax.validation.constraints.Digits; import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; @@ -35,12 +35,14 @@ public BidList(String account, String type, Double bidQuantity) { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "BidListId") - private Integer BidListId; + private Integer bidListId; @NotEmpty(message = "Account is mandatory") + @NotBlank private String account; @NotEmpty(message = "Type is mandatory") + @NotBlank private String type; @NotNull(message = "Bid quantity is mandatory") diff --git a/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/CurvePoint.java b/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/CurvePoint.java index edef0164fd..c2be783c65 100644 --- a/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/CurvePoint.java +++ b/Poseiden-skeleton/src/main/java/com/nnk/springboot/domain/CurvePoint.java @@ -1,17 +1,20 @@ package com.nnk.springboot.domain; -import org.hibernate.validator.constraints.Length; +import java.sql.Timestamp; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; -import javax.persistence.*; -import javax.validation.constraints.Min; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; -import java.sql.Timestamp; - @Entity @Getter @@ -20,8 +23,8 @@ @NoArgsConstructor public class CurvePoint { - public CurvePoint(Integer CurveId, Double term, Double value) { - this.CurveId​ = CurveId; + public CurvePoint(Integer curveId, Double term, Double value) { + this.curveId​ = curveId; this.term​ = term; this.value​ = value; } @@ -33,7 +36,7 @@ public CurvePoint(Integer CurveId, Double term, Double value) { @NotNull @Min(value = 0, message = "curveId must be positive") @Column(name = "CurveId", nullable = false) - private Integer CurveId​; + private Integer curveId​; private Timestamp asOfDate​; @@ -47,12 +50,12 @@ public CurvePoint(Integer CurveId, Double term, Double value) { private Timestamp creationDate​; - public void setCurveId(Integer CurveId) { - this.CurveId​ = CurveId; + public void setCurveId(Integer curveId) { + this.curveId​ = curveId; } public Integer getCurveId() { - return CurveId​; + return curveId​; } public void setTerm(Double term) { diff --git a/Poseiden-skeleton/src/main/java/com/nnk/springboot/security/SpringSecurityConfig.java b/Poseiden-skeleton/src/main/java/com/nnk/springboot/security/SpringSecurityConfig.java index c6f87b9e9e..6016ea677f 100644 --- a/Poseiden-skeleton/src/main/java/com/nnk/springboot/security/SpringSecurityConfig.java +++ b/Poseiden-skeleton/src/main/java/com/nnk/springboot/security/SpringSecurityConfig.java @@ -32,8 +32,8 @@ public void configure(HttpSecurity http) throws Exception { .antMatchers("/", "/user/list", "/user/validate", "/user/add", "/css/*").permitAll() .antMatchers("/admin/home").hasAuthority("ADMIN") .anyRequest().authenticated() - .and().formLogin() - .and().oauth2Login() + .and().formLogin().defaultSuccessUrl("/bidList/list") + .and().oauth2Login().defaultSuccessUrl("/bidList/list") .and().logout().logoutRequestMatcher(new AntPathRequestMatcher("/app-logout")).logoutSuccessUrl("/") ; diff --git a/Poseiden-skeleton/src/test/java/com/nnk/springboot/BidTests.java b/Poseiden-skeleton/src/test/java/com/nnk/springboot/BidTests.java index f1a4f40316..3a8233b0d2 100644 --- a/Poseiden-skeleton/src/test/java/com/nnk/springboot/BidTests.java +++ b/Poseiden-skeleton/src/test/java/com/nnk/springboot/BidTests.java @@ -1,18 +1,17 @@ package com.nnk.springboot; -import com.nnk.springboot.domain.BidList; -import com.nnk.springboot.repositories.BidListRepository; +import java.util.List; +import java.util.Optional; + import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; -import java.util.List; -import java.util.Optional; +import com.nnk.springboot.domain.BidList; +import com.nnk.springboot.repositories.BidListRepository; + -@RunWith(SpringRunner.class) @SpringBootTest public class BidTests { diff --git a/Poseiden-skeleton/src/test/java/com/nnk/springboot/CurvePointTests.java b/Poseiden-skeleton/src/test/java/com/nnk/springboot/CurvePointTests.java index 04eb6ba47e..c45a39599e 100644 --- a/Poseiden-skeleton/src/test/java/com/nnk/springboot/CurvePointTests.java +++ b/Poseiden-skeleton/src/test/java/com/nnk/springboot/CurvePointTests.java @@ -1,18 +1,17 @@ package com.nnk.springboot; -import com.nnk.springboot.domain.CurvePoint; -import com.nnk.springboot.repositories.CurvePointRepository; +import java.util.List; +import java.util.Optional; + import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; -import java.util.List; -import java.util.Optional; +import com.nnk.springboot.domain.CurvePoint; +import com.nnk.springboot.repositories.CurvePointRepository; + -@RunWith(SpringRunner.class) @SpringBootTest public class CurvePointTests { @@ -29,7 +28,7 @@ public void curvePointTest() { Assert.assertTrue(curvePoint.getCurveId() == 10); // Update - curvePoint.setCurveId​(20); + curvePoint.setCurveId(20); curvePoint = curvePointRepository.save(curvePoint); Assert.assertTrue(curvePoint.getCurveId() == 20); diff --git a/Poseiden-skeleton/src/test/java/com/nnk/springboot/RatingTests.java b/Poseiden-skeleton/src/test/java/com/nnk/springboot/RatingTests.java index 6c3ebf0b08..5d7b5ec05a 100644 --- a/Poseiden-skeleton/src/test/java/com/nnk/springboot/RatingTests.java +++ b/Poseiden-skeleton/src/test/java/com/nnk/springboot/RatingTests.java @@ -1,18 +1,16 @@ package com.nnk.springboot; -import com.nnk.springboot.domain.Rating; -import com.nnk.springboot.repositories.RatingRepository; +import java.util.List; +import java.util.Optional; + import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; -import java.util.List; -import java.util.Optional; +import com.nnk.springboot.domain.Rating; +import com.nnk.springboot.repositories.RatingRepository; -@RunWith(SpringRunner.class) @SpringBootTest public class RatingTests { diff --git a/Poseiden-skeleton/src/test/java/com/nnk/springboot/RuleTests.java b/Poseiden-skeleton/src/test/java/com/nnk/springboot/RuleTests.java index 541dab5412..6f154d59e3 100644 --- a/Poseiden-skeleton/src/test/java/com/nnk/springboot/RuleTests.java +++ b/Poseiden-skeleton/src/test/java/com/nnk/springboot/RuleTests.java @@ -1,18 +1,16 @@ package com.nnk.springboot; -import com.nnk.springboot.domain.RuleName; -import com.nnk.springboot.repositories.RuleNameRepository; +import java.util.List; +import java.util.Optional; + import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; -import java.util.List; -import java.util.Optional; +import com.nnk.springboot.domain.RuleName; +import com.nnk.springboot.repositories.RuleNameRepository; -@RunWith(SpringRunner.class) @SpringBootTest public class RuleTests { diff --git a/Poseiden-skeleton/src/test/java/com/nnk/springboot/TradeTests.java b/Poseiden-skeleton/src/test/java/com/nnk/springboot/TradeTests.java index 728156c9f5..de9bfeed76 100644 --- a/Poseiden-skeleton/src/test/java/com/nnk/springboot/TradeTests.java +++ b/Poseiden-skeleton/src/test/java/com/nnk/springboot/TradeTests.java @@ -1,18 +1,16 @@ package com.nnk.springboot; -import com.nnk.springboot.domain.Trade; -import com.nnk.springboot.repositories.TradeRepository; +import java.util.List; +import java.util.Optional; + import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; -import java.util.List; -import java.util.Optional; +import com.nnk.springboot.domain.Trade; +import com.nnk.springboot.repositories.TradeRepository; -@RunWith(SpringRunner.class) @SpringBootTest public class TradeTests { diff --git a/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/BidListControllerTests.java b/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/BidListControllerTests.java index 361e437d8b..27b62d4ebd 100644 --- a/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/BidListControllerTests.java +++ b/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/BidListControllerTests.java @@ -11,7 +11,7 @@ import javax.persistence.EntityNotFoundException; -import org.junit.Before; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; @@ -43,7 +43,7 @@ class BidListControllerTests { @MockBean private UserDetailsServiceImpl userDetailsServiceImpl; - @Before + @BeforeEach void setup() { mockMvc = MockMvcBuilders.webAppContextSetup(context).apply(springSecurity()).build(); } diff --git a/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/CurveControllerTest.java b/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/CurveControllerTest.java index 15eae65ef7..5d1ec16769 100644 --- a/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/CurveControllerTest.java +++ b/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/CurveControllerTest.java @@ -11,7 +11,7 @@ import javax.persistence.EntityNotFoundException; -import org.junit.Before; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; @@ -41,7 +41,7 @@ class CurveControllerTest { @MockBean private UserDetailsServiceImpl userDetailsServiceImpl; - @Before + @BeforeEach void setup() { mockMvc = MockMvcBuilders.webAppContextSetup(context).apply(springSecurity()).build(); } @@ -85,8 +85,8 @@ final void testShowUpdateForm() throws Exception { CurvePoint curvePoint = new CurvePoint(); curvePoint.setId(1); curvePoint.setCurveId(2); - curvePoint.setTerm​(5.0); - curvePoint.setValue​(10.0); + curvePoint.setTerm(5.0); + curvePoint.setValue(10.0); when(curvePointService.findById(1)).thenReturn(curvePoint); mockMvc.perform(get("/curvePoint/update/1").with(csrf().asHeader())) .andExpect(status().isOk()) diff --git a/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/RatingControllerTest.java b/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/RatingControllerTest.java index f59874ceb6..2e3623c301 100644 --- a/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/RatingControllerTest.java +++ b/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/RatingControllerTest.java @@ -11,7 +11,7 @@ import javax.persistence.EntityNotFoundException; -import org.junit.Before; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; @@ -41,7 +41,7 @@ class RatingControllerTest { @MockBean private UserDetailsServiceImpl userDetailsServiceImpl; - @Before + @BeforeEach void setup() { mockMvc = MockMvcBuilders.webAppContextSetup(context).apply(springSecurity()).build(); } diff --git a/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/RuleNameControllerTest.java b/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/RuleNameControllerTest.java index b19edbf26a..8d7e689975 100644 --- a/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/RuleNameControllerTest.java +++ b/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/RuleNameControllerTest.java @@ -11,7 +11,7 @@ import javax.persistence.EntityNotFoundException; -import org.junit.Before; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; @@ -41,7 +41,7 @@ class RuleNameControllerTest { @MockBean private UserDetailsServiceImpl userDetailsServiceImpl; - @Before + @BeforeEach void setup() { mockMvc = MockMvcBuilders.webAppContextSetup(context).apply(springSecurity()).build(); } diff --git a/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/TradeControllerTest.java b/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/TradeControllerTest.java index ddbc461393..5fff1011ca 100644 --- a/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/TradeControllerTest.java +++ b/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/TradeControllerTest.java @@ -11,7 +11,7 @@ import javax.persistence.EntityNotFoundException; -import org.junit.Before; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; @@ -41,7 +41,7 @@ class TradeControllerTest { @MockBean private UserDetailsServiceImpl userDetailsServiceImpl; - @Before + @BeforeEach void setup() { mockMvc = MockMvcBuilders.webAppContextSetup(context).apply(springSecurity()).build(); } diff --git a/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/UserControllerTest.java b/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/UserControllerTest.java index f42bf9b56f..078d3c4916 100644 --- a/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/UserControllerTest.java +++ b/Poseiden-skeleton/src/test/java/com/nnk/springboot/controllers/UserControllerTest.java @@ -11,7 +11,7 @@ import java.util.Optional; -import org.junit.Before; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; @@ -40,7 +40,7 @@ class UserControllerTest { @MockBean private UserDetailsServiceImpl userDetailsServiceImpl; - @Before + @BeforeEach void setup() { mockMvc = MockMvcBuilders.webAppContextSetup(context).apply(springSecurity()).build(); } diff --git a/Poseiden-skeleton/target/classes/Exceptions/AlreadyExistException.class b/Poseiden-skeleton/target/classes/Exceptions/AlreadyExistException.class index 68cf4bba66e66d4f06d3249419a8ca3f01ea5b18..c227d3984b0f4f2c7b4780146fab1eaaaac11e7e 100644 GIT binary patch delta 129 zcmcc4e4SbM)W2Q(7#J8#7$mqDm>8JZ8CZB2SQ*$D8HBSE%M$f-67$maT`Q7P3raHc z^Cng*0#$HKcA!oM21W)c22KVpAk7WrF){D}S&SgFfNVaX Uh#imysbka9-p;@{c_O1503(rc$Ko~SP`$jHFr zoS%})#lXzK$HTzIz&&yGCKE;=kAZ=aL5hKufelEr19?mg96%N$NC}Y50~E0X(o8^_ OO-p+_1MlRCjBWt?853Us diff --git a/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.properties b/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.properties index 64957e5a17..3fa3a1fbc3 100644 --- a/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.properties +++ b/Poseiden-skeleton/target/classes/META-INF/maven/net.guides.springboothelloworld/spring-boot-skeleton/pom.properties @@ -1,5 +1,5 @@ #Generated by Maven Integration for Eclipse -#Sat Dec 11 16:35:52 CET 2021 +#Mon May 09 10:45:56 CEST 2022 m2e.projectLocation=C\:\\Users\\Draflosword\\git\\JavaDA_PROJECT7_RESTAPI\\Poseiden-skeleton m2e.projectName=Poseiden-skeleton groupId=net.guides.springboothelloworld diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/controllers/RatingController.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/controllers/RatingController.class index 03533e0f5fd0420b9a116900b3d7f00bb24a9b63..0179175e6b76ded39b74d7ee801221a89f2415cf 100644 GIT binary patch literal 4541 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 EKQu{$xBvhE diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/controllers/RuleNameController.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/controllers/RuleNameController.class index 4ca44d5b824f768390cb646490e445a7fe3f3692..af13081bcee29f7c7a4d29516c0aa87fbd8eddc2 100644 GIT binary patch literal 4612 zcmbVP`CA*;6+KS~ONcSC6$jf8JF-b^#Nx3XCryy+7BCQOkR2eTB;5w-A;uOnWM;(D zG+ooAdz)_Q-lki+{g5snDb4rw59r^~zoTEzd!v<%DG7YiXx_Yc@44sPd*7RX|M#E& z0&oR?P9cW21mXtTaY*3E9c#lf%a&6zZ!O=Eg+SoYRok(HYXWWk*~KK10)|&9%e=KF zXKX*{Knk4+7zPfbOW;z$T{9i$uIaCPwo_Vm-M}okPT;xavh;j&uDW!*J|=Kq&ECB9 zHtd2F7@mnR6(EL;lpIJ;7KcxHOK-t`lHfvPp}m9|1(0l#;S7F*pS5}t`n*!i?+wY8!>A% zYvxm!#8d)L8JNZm64|KJX(y1(0P12p!J<{JF!flf(<+o11GC8UkxKHh?dhVx`Tpqx zBD^hdq85B6a5I&4QZA`l#UWOvVZCn6@R9PkVBi@nGPZE2wqD@ofyg^3wvRBKYqqPv ziU~X?kX6KNnd|H|%vb3Yq&eXPcCejygGq&aVyht6Rpun|QC9z&^nI%&Q&_^s4SWKh z6iAh1FdGgF9IG{j<|+8~?n!{0*+tg%Q+^|uu zU|pGbVb98XFS-Xnz0x-jD1MTG8=6&mZy4Cb7D;0Vlz|L$EY2KTOyN^_F@aATcnP0j z?0dVI=-#O5kp?|LV$ax)%vaWyrMF-~5^Zf$Vf1??;oA1KaKkyh|610_tPED&;%!UqRsn0` zUhHhjWpkN5qM4XE`9ekd!7Ou4ZC!NBCaStiS8Hn$=w#bgg)qs6E^s9hRg{M*7Fyl< z;f7V3W13Z)JRQD#pxzPbwrb>EJ4G&X_Wra#93}ML_Rr$0$^P1#6-(L9rdES}43SQd>-iG)Kf5h+weyhjeasG?^Ho^&b8DHX^z$zGemPn8}AMcRE^UV zzKpNX$yYhEUGN4v2o=oN`1$(t5I(-aU*Bv(5wD@hzJtM~w=vv6aUn!;aW9H+U>I&gunWhR-wM4~Pu%j3P$U?8+zr)h{I-=%;0!}sug9siJ~t_?rXRzljZQV-=EcIxjj>a`n z`)9x#^$cJ>)iR(v-prrS<8;Nr-_>)#Wt_@?mb$-#6&BuV+TOuka_8>A)2ubpqoOEk zZ3T1a#XQboL5H6Sjn#wB)`QMgvp_Y4eYJlxQu`!+uN#`m+cS(n{dJ^M|G@U&(5rf$ VXzF>r%=|xaEQUYU+vlHv{{i40&4d5| literal 4560 zcmb7H`B&W58NF{9JOh@AJ$As5*qN9Fg8{2vlE&b=1q=iS#x4+2l5UzA0kSm`ku)rI zlXOX2cW=5RP4_)*e@d5w>*k#P0sSlbm-O_$CuuY|!X z0l0`i=a3ONS8;2)EJa6cSPB1f-}3UtrcoxrM@OO|hyZF9_V+`tGd z*YO3OnRUI@2;_=KK%1_2OD~&-bO<}DFUxn51+Vrqmm z?WfHq-47*tGh7}MthyLu4wC|>QnanQHN$cm{ihvQ(UZrs0!JhsMHqt>R|qVRYfT2y z`IrmPYgW~eV!hsH8H zEDNXNnUps+gTS?Y$vm(hFXT~|-N}{{VbtJ*1m`U$pnK*1LFdd! zD{N@k#1@BSpC8|zp+KkmXZES^=LC+&<|zhlG0cVir0!7b&o`ZC^l(VvXj6-i38YWL z;W(DSTd73<{}z`n#-5f)rTanBNy@&c;Z=M|;JJMj%YM0hoqI=|e?%lX{3>_gn(6z- zDvwil@Qob4E-)bV-O|^&yRdFdr()`pJoE+IB{!Io+)r**%yoI_)9_7vOQ4+xthq3X zz_EBAS0~SC}{?dNN}akMlU!!tWdz{_;%6 zyBzQ2HP360JPPxg=kGyie0qp?1H8(gwu1NvI{t=Zf8k9Ao%}B+0*|0eJpu1{B95l% zyvotmGk4K_|CCNOMZU@x7~oM}1y0~3(Md!dynBp)#g`y_qLw(8IhNt|#9-mnnZM(S z9rWG9Pzzr8D~=V;-^0ZW3M23Gg%DeZO7t-tMv;jXAwF=%y z6d&D%;$saIV-bpMjAHyfTwT74sRYGzh+^h`6n#W-nkf4BkK#GZl9`x`xdw_7t`p@k zNyQC*__!SKF~N^e_}<_^mY;`)?tx#l-o{}`&nNETMbb0#t|V@72cJ@;86n(?gxjJ7 z?V+ULal8#@aTGeAoudxt>46Ih`k63xgTNuKY!U+3!wOavGee5h7ObhLq7xQB@Oy+b zjD#%7KGdQhukd3?`c2$o=s4YkbX%p{k>MJ(FjYrR=ieqF%S3yll-wQEOETAOmDNyT zd^i-Qa66Hspr%}+Nk^F5D6Mh1DX-o}UcGSeipr~3Ws~8IE|qJG!rzwR3o-Ur@mi`> zA@1k+Bi^SR=$tv!oWfT2>xQG5f+Eag< zQc47U)cifXxm@`1UHpV({cH!nQZyyL_^sq*cVC!ir&=Hfiz?@07^#tSUnA$fNPcPB RCebr^M+N+2qksMh_#bi}oPq!V diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/controllers/TradeController.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/controllers/TradeController.class index de629689ed764db74c5f22b1b0b190d7dcfc32b6..06ca58ecec3ffdd62d1d46218f97a44cb6185846 100644 GIT binary patch literal 4504 zcmbVPX;&P_6}<(6W*A!ASVo&A4Z@b#M9Yfo*o>kC5MXRTGGH9+Y(3L8(9%pd?(SiU z<2X)YXJ4E+`|51Y_Q6>W4)Hnp0r?&I9XYvG-OLPf3y7ryP1jVty6@imUe)~jzyJIf zfUEd(7AQ|&^t{k4d2Z-?m5THOb6%|*tq%woI?|lyN_KUy;| z1r9}+NKL-%`PB>_-gb=1u?~CySJQaJz@zw}z(5igt5(IatO z9VK5{q10ftbbBO7-S(Q1!3g8l)0cJzHw2FP(sq27(vYd?)bwUCj)^p$FffTH1&%h# zZqf}U^%clCZn$7oYBUxrZ&G2OGBAx9exxisvN353JlHe2A7Hnrdju@>^0gJRE2&P+ zB}CdQDnm0GR~yY6cm@khCK`%K8td7Uf_;JcsKCJpOcdTu<2iv|#lgC{!bU;=Nw*}; zF*kI=jTtW-S5U{+OL9fIB7={yjH@yTtR6G3 zF~95t`3QmS$-uoB=H+@^L$(2_9V3;`(paLw8tOzT zFAA&FT{W0e}jccrlUqA@KAF; zqZKO%wtHMt`zZ*VoUKvMs$6gar&y80uIq)m%2~{hB{s#PwA{cfN1K{feStY#3%xZK zmCdlJQ8r_N!&8ncXKK}=^ye*x*G;ozRTeDYQSb3!Dx~%Tmy?{l%TcBFS@x=odZi~3 z>h__))bG}VYul>PfpK>CwQSqdGFqbLndNNJ(3t8iNIT4vpR=k1{>U+*;yg; z8!J1jTu# zLYmNQtSF$17t|Jhd1&E(-ufZ%GT#pH`8hsMshcaG8NTxy1%JQ7HuDyfX?A2WKdJ8DHThU**g;!58QxR5D-V&)1)a2=ER5 z_01*}scjU!@1lS49b9Ul7>rO{z8l2_qPR#DJ^wF?Z`DzJn}5BI?~qJIWC$F?v;5-z{3=;`0Yhcq?A5vWlGs#WuSii`u7(2hZVZ8FLH!zAhodU+{V z8uUf6>og5;{FpyK z;ml6)C6Cil zL(H&18(eG3uDhOHH-3R%>g>98PAyzlWK3_gq;aBWO-9(aHxgre-)uua|N%> zzmBE)53wt{X9)2=atWN1IoE>UAnaVwXvTYL|Z#c}_LWvSnOu?is z;WDqik*IyFM_`!bj!@K5emahBOmNOqob?3do#dxa@@-1faGj{G@ayew@LM7!zB(Z@ zbwXw|4XWs7wD78;W;97DEqn&8or`HKp3+1eO=+Tbcfgx<2hdO34(LoZ^C$E;x8mUM z>K^czr`o@ly1$Du3vW5+Y~l{N^ETmY)*AMxDT;Qsf?1r#94=s9r=O34)syb6C*2#n zKsAM3wSOy7`wV`s8=CTM7c)@*+H=`|VB>E%t$Lnl>UpQ>{6BE41%Ir!&p!eG13;0Z Ai~s-t literal 4452 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 diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/domain/CurvePoint.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/domain/CurvePoint.class index b9631b28ccfaaff663617484742c63809218f1ad..d83995a10a71c2f10787bdf05fac9922d1e1af30 100644 GIT binary patch delta 680 zcmZuuyG{Z@6g{)cGO(h8yo?B9lvrs2$ji5g2tM)MX@dTMMmrO0J9EFoL}R6eAK+iu zS!-gc-kn{6!eaK$&YstteeeJ1H($S>UjSrrcx!%&=EHYE^T_7K+2v{NgtGdpSfC%h zES9P4DvH&|E7y<~7=Q~gcrl0`#1TY-?%dII8g2-d3L%38G_~{dPG@nTTSuBlhL@k0 zz$9|?1vZ2N3*=FtHyNa384x9Ec*A-TCAyI*W0q-iie|Y9<-s&d zUtkK;OdA!8iZa8LgePSzGo@-#=*Z*tJ3e-pSw#ralQ$shiZo|CYxDOs<{M$<#dZ|R z`9geB#*!6ItNcN#wypDdrLF0l)Eq+nkFdraB+XFY`~%0cJDZIwP{RRTw?N5G rP*Q=m9q;A&iYDP&-97NyLG0_71O34kd& zQ96QJ&s+xV+Mug0%v(D9SH8CyMgb?)A-~bZN!ql@&9~L{*qly##k4 zN>vw_M_ImGIZ?&KlzuOWLNoIU{usu;C4^Xs2$Orgp%${3^T(wY&?hV@5uQ;@#Doe+Ij0+;mhg z)uh!6Y-nxXOY0;eJenpVOl)F{t2exf6b7iQCQ?jnqofE~49A4B;KW@r;2z-oidCie2|SqnMj1?FEn zZydYhsJ4B0`dYRkf&2qcdC|7ORBgREjVqWgV8%ibmcX@^-?f$c!4A&@Pqj~dKeAoF z>v+n3=|r>$SY6+DFT%IW@h`asA8VPY;@SiuL3=?AV1Ui7-Bdh6l@ z^oJHc(&$XX6LFk2%R4r*Y+%18%6vw_) zGH@d4Hnm`au7r_Zw=ez`&qya1=LX++y8Gg!aq_*uati;B-|2M~d9%vtN`d>ef%KB| z|38+-dXpSGzDthMfv04ATqh2*7bqY2EvM6T0#C0KV>UYTcpPg7|J5T@moy18H$7vz z;5@E2>tkyF&S$Enl4^+td-l1E&V2XC37BHUQy0j!Wu)s=sihU4{xJ4e2an@zZ|GDr z9(R|BdOp;>l|g)Rd>US2ykX?kp~wkTV2;4!ev8w<7{dl4_WI2pBZdt`91gau<`^=} z9Q(bXCHFjCoML>AxAiqiZ<1a1a&*BmETwdisV05-xB&Q=w=%=GBgZc<1o#MWwTvlx zfHkf^k@ytXaf8#(LSi!dtw?Z1j)|j42k-p2qeKTU{kWq{2XE}SW5u9zs1dME6+dyz zaa^tc22tO*M4^8360`MNmzb|tvcF^T5=*}jkU^c_W#su?K$c;rv4}Z7FpH=#QWYEY zY{q1`iCbKe7Pn16J+nE}$FYjfIh!)GJNSZJcR63k5(&ZIJUr7xJQ)Uyv^tZR+OP(al?_o43;w znjKB(ArpEuA)&ZClY~kpp@*rO=0`Q{q-uJUu4#T$(>^slo1iJa7>TB`(eyaApO!{7 zeV3}~NqRpG+>W@P4yoyAf~NRRCYn}^CjOZiD?IOFKhwC!=TbCfutSOro|=b6KL)#8 K?~#tL$^JiW35gv5 literal 2303 zcma)7-E!MR7(MIwr?rh8*L6Zd6H@c%IBiv$Knp4TAx(m4+GLuHXSh_Xt)pT~8AQ2AkHLd5oL#xGY|Fq!yu06b_Sa*gt+H+o3?pv<0er!-VOEvLpRX zfrS@+H*|WkRR?+@>Uz>YK+VqE2z3_Ma&_~-tIZBjAR~JbcO1z*S5MX%Xidz z5KM~PE(-{gmVPF~6VE=dd|rJ>Hwt7r zGE}avHKvLAtcZ*flL;c^T>Mhrs8$V6IjmDA>RHTDs&cGL13xKvnJ14Tua0oIuwIG4 z!=c@j`Nji8><>*BAw~lEL$B|*<&LASsStJamU2PzGuq~B56^fZ3tHXi zY5szHKXDTAQ3`=IeYO&&njM|Z&j>b&Qkx%e zR3~SZz?lc)axYc``# diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/domain/RuleName.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/domain/RuleName.class index abe6d75a0831f56fad1d1f49a3f3d95f3434c054..68d64c5005face917286bb6beca77feb0ce14731 100644 GIT binary patch literal 2575 zcmcIk-*eMO5Z+U4%ZZ)D*u-E$ptukc2O`?ipP^7l0(B>Z4)J)VkBWU`6lBSj&P?+k z^|76)r!#%%AJ9Ll({E2oV!JogFMW`1Z?)g2-Mer1ufPBJlZYPDiv_Z1&ZbO}vXm24 zI&t5*j_(FN=hg9v>?lFGM_%Bm$AacIHrw-*r+J$eid3MYpn50lJ3;W)i3gDv^p3+& zIo+`DdV%wL=*vU5F9l@+y_63wxQ`Tv?=ag^k(QaN(3No~@&?Ka1NL7kQkngklQ?l) zF477+@=EpxzN;ihT`AI4cIM(AeUP&2T9H=SWyAHo8!7g!73l`u6l68Kf+}N)Gy^4j zGTISTdp!)4*OzTC_Ktn|GzdcFax$@?sz&_e3}h60v64YYI?XOXb;E}jGLR9{>$Y8g zC=ry874Lhe?~TWwTBidY-`v|jY&Bay2)di{zjJ-BtFv)B$OwF1pkn7RRL^i%Z}F40 z$@H0OqJ(RPOm{H}u!!-qXAJ|2&&*-0E)Fg*28Ayg(if`^PeBxj1z}<%6)} z`fWGzc%M2m>WznMxP9>7azizxmr}h6ySRJkPT|S~WqVTb)vs)9j@5N>`8K{MV!b>O zk)DO1B?RnU2o&mq<2xu5!iCjJB`IhgyCbbdK?{k^B18&tl0tR-tj{vwBe4;X~3MLWB;L~+jIvG%n!Wza}MrxtatI`NmNMh zEFKH+SUd*witg7d8a^d1VBNq|h%p5$Zu@_KSfvu2S=vNE1Nfh@+E~{czmsTejmU1? z8_{Cp{)kGAT4qF*MlCy{YNM7LQSDd#$1S|;$c=N%;E(fQTLN2!wx~w;Q0RTsv<-{s z+k_pSZS1%fu2g7?E8^o>*EP*)i>u0Li|fj2iwnt-1G|<3oNyEb2w?ycDkW4(pnO0d z;mt)kSos&(#&2}}7Z?^YOHP&noL7=VHqA@W$MlH-Y)^w%jo^ny@ZvOh%?SR~2rf;7 zZy3R!8Nrol@J%E5b0fGq4Xzu(Ul_r)Y49B*_)GdK)gP~{fgEe^`h~u@3%FJIuBu7I zxrTCSGqEDF0vnd}4m~na+Otw7vP>xpn(}Ki<>IWAtZ$)pi!7HlC&MhIJR4#Rne2BAvFRks Z1_fI54BD}1S5Mq!SbNy-gATLv`9ERlp$h;2 literal 2575 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 literal 4677 zcma)9iGLf_5uPU>lI@LS9NRe{MF}mjjf2`IO-n*(b0cCqAu)zfNV}F^l})5wWevocBPee4bAVD-FfrP%=_NFnOXUh|DHWh zM4Rc~S;`2yxa8Cdwtb@D)m_W3%sGxCklTEZ}`?4b4ZGu)G3T)r1$yv*@=BjdsZ9Bf{TaN7s8c`m%7V6UVEYFvA zNfwG_IIT|s_DNg1rZ3C0W;Kv7%6UGoD+`}$kDX=~>dL;jd(ZStaps7iH7W6TIn|(M zBW|Z{)})|bvs7}x{Xcg8*%nHb@-5D(8BX;>(;Q9GEnXfyZmwU2Wjc~=@ zh-)oRiU6EeQVyyYGDQ? z==o-?jsx{HtU$n%rNE7Hn~PR3g0&xbDo(eSBTrW=RTLNLK(A;joh;$hC0D9)m_{Kf zTO+QC88nzS3|IpLSI(nf9J?7Iu8A2mBSZ!|LSI>$)rNO2TH(Mfa@i?j3g8t&dQRY$ z?;b zF*-KeLxQd`XgLkAG-=R~mZl9Fp_Sk|Y1wi*sLe@t#zY5jgE}R%I%~QXuR~?0f6T&| zSvUC^vkf&dFeUwCPWhne;?8``BMg9w^k=x9c(@IZj>S$CjW=d@y+K{n4RbGMJ`&GJ zWX;FTs;c3L9Dau$F@lC#!Z#)i$86XP$76;jDkSq%SD0lAdTKz2-i%tWeS^l_=!Zv( zUCSo1Yg&$gyTY>86*dx4Zf!44$uWbzLStM~?M^GhGqn2fDR_fJVbzCC0PnblBijaD z!I5*mqcf1DlY&+@KRjByGq9><>E;O6*stzzG`z{}y;P@wOYLYc;@x7<3|+^%1%qy* z+fmeJy)JFs&&GJV_1A7&yarl!+Log`1udJ%H$NI`r@J`n-EG05yNeZ6d$4;^9}{_B zx9RpAeP7T86M2ls=tj|?P~VTjpUB5YD(g8>4;qxGl{tDC2~dvFELG^E2CZlGapYb5 zx4=&t^m&G#QgCCwMzMcj(4{nxqaP_)6?8a;RPbjF8l|xu{X}gYP1MNwX9iuy&cDF4 z#@5l0Ri3{xXd`3KDNF_CS*x%Y3@R}884nYw|r)lbKRZ0i&96|l@wRhsu zd+0*yM@_7twR8~LaqUmn(jlx6i3ZiiEDb}-DBUVtbq5`WysQHTT=+z*@L%w!0#7DW zz+2$mHU1vWz6BveygPRXkyN`G+92Fb&<%7XJPGH5_v+?T%r?3ADy@YR99I!Wv{i#| zH{GaqU~XLk3+D7qx(UyAPQ`XkwNy?w(^2ff&MlmZ?VL`6le+{box_k5=S$GHQaSB! z=MKcwYHSbj{)Pq2JS%TMDq_(Lr}!}=d< z`KPS^xt4#)@~^f0Jj*X?`L`^;tmRi(eqGBIj`OCL-)8;0TCTDFw3g4X{`Xow$MXAH w{($8_YWdGBe}u;({k6T&Mw$r}J>l5N(BE+f8TzF0IsXUN|3o73t^e2m01O!V1^@s6 diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/domain/User.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/domain/User.class index bc029cf6f9450b737e4b97062d0f542945ffd842..17ff008959f38bb4b6b374dea5bd5a9949b8e3df 100644 GIT binary patch literal 3261 zcmbVPZF3V<6h3#GG<`{5=o=IY7JQ*ii>oMVX{n~A#bRioFR87HZj(#6WwV>v-5~ub z&iE6YQD0&o^QFn%VveZjiK^IDH)pVRkreE`v zQ#o+mz%08}OF8C_FFiqBbu5lmm4b!}&DdK3o6mE!{wxh}sICWf+h$7^p32e?3satJ zYr#mCMrlltp~`}WTOzGFfviYRhdPs`aUH5=`TqB=SI*EmSnFf!fwIlK=UGPuL(BPwxQEWuB-ihv zpwX!oY*Cie#a?=o-pbJ1S$c;q3+itoVlb$zRYqFJe8cL`Pw!`FTF~69QF5WnGO(2G z>)PK8-_cSilw}vC=PTFQS-UAn+!oZg>^gpcOp2CWm+7m%`0<~=e)w6?_-5S+R85cxmKPRbSXh`OFGiCP$_)^jJo`Q_m!iU+T*0{ zqnd<$D!;S6A?R`x`>|!KvPOcw0J{g81-`lN21_99BRFKL()XV4Hf3j*h z@N+$!d;WNGe9*B3NAE_|iTRDLf}QK_@lI`mpfTII1P-*bqFpjwM9Rx<8Sn=R%8~2! z>VfpOEi{3r$1S0W7FvmYBuoVl6}mE6c=;G|>3O;sKlpG*g3sl<7SlaIBL$@^GFa0L zoNj^D7%k}iP(Rk1SwqdRdl8^faX}+ftzn`mfDxiJjo778>`>RTgN_T%4GeY7T?RTX zI=YQ`;afjsjd4^G37u&m&||;s+BU8-5DS$Usl>)N9Kpdbac$2MSdJYpIj9nqeKlsg zPjsh%3pDqc(Cf(a_e46t}5<9H#hWMzRv`m)nz$;IjkU7aD-IH z6O_7~(51pYr|XF2(?#6>1__#?PTbNtn!)=lK2`=@!4F>n>`m-XVfP-^_p!e!=>vSt z4E`$N$?9H+ui^KRPao4K5cH84rl!c?Z$-Q9T)XWYtni6yx4qtOdmUEza<$vex7*Gm z1_dMWD%_+nEK+F)`02u37B|BUSJx~m^KnI4aPCuNyKzF z8B@zFgnYUOOq(ZQVy?fy6mt9?j6+HsVqBPz6VK`F-ZPpg%si*_dm#MaGkW89x@6Gq z3`6bEgV&FhsEFHX7o+!O%YhRSfx9qVTeOV>cVNi}hms=Rb|Ep~C1{WK@nk;FV&xe# zQa@=ek9Rm=_ge~LM9~F(^%|b#M9;5Z!}BoF^PAW3tR;Hl|A{Ei=3Rn|t;wh`)u9&W abd;(=_jN(O)i?P73iloM7Q!9)RQeCS#DHc1 literal 3261 zcmbVOSyS6q6h7D3n8iR?vq3`BGzCMVG$m~bgx0Kq7)aQ%v`s7Q8|Q*7c_cZFe@bWi z6FSp&CQPQyOdtB#|I|*uBgqT0NSHoIy7%0(eCOQn9Q*Ho|M-)LrYN7Jn4n8JtEidg zq2`oqWft}=%hmE$QCFt6>qt9EaY1Je^q0D3=w?CN+&_>xH%YC6rY*Y=SUtD(qWr4kF z#4Shs^v_>E{vs%*@`C!absVdvD+|(|5p;g5Y`Ur__mrdd4Vf`b%hg?Ybp#E07O%7t z$8lU~=A^cohtZXYgB58?TX$vN3l60=$K`#Y@=kq3+NqQz^y8V`olTf=)+P!fsILL> zw#)T}+Q&icm%5?y9#RwwY1^o|>u4L6JC9NyLNi&Ej-wagXprxMeU2(;w5Xe~vuxlR zIi5TNIaYwSlI}RT7*ucYL9h(DXnS5Z3?J^`GL{?7QR22`07UN=J|XMYS!F7B4r~}} z&h<2s@jVo7!OF`HYN4ws8l{f}wTzALwG&E}q5&G@)p&}A{nbQ@F43T%o~$zEM!C2z z?HwH#&(*ea;FJz#VIK(N?h6GbjAq}>bG~ja1ZNL=u1oiYm4Bc!uU(KwP@*8+RW9S$ zctcuM8ZyM&DN0cnG#y`asIekdMNYR9uB!JbXyBN`8cRCirLHvC=qu2vx~kqQW0*_P z1uhO-SLJ>{zFPm5`K-Q60u0|P*ao@3>V_;+Mg`ExN+S7lRg7g<8QOwn7#IQ|KC0Hf ztqP{@mTh?0JV9-CBK!VXv0|g|Wxg7>GBY=mq*Zji*YsZCjBV?cEE>6k?$OmGWd+T@ z-?1KKQqi_mv1G__pbolE8%(^JPI^FFNqQ)#yB?I|rD&UWKubOEF`$6}{ydx+e~ODN zgfd`DaLL#95?~2xHgue*Xxf0R%OTy_|5rB@O*xrd&cbBeu*{`bC1pz>M_U1BU*j2& z9P-gws3 zhhD-si~F2Rl;O*v4?y7-JPB$AkCW7fbvu5nV$^{L-GzNO_PyBk;Clx9UP*n_4*@0x z-hA8%@erP~4xOX(5WudV>Y^AoNwe<7X5EX>!rW=r9ck7bffgoHv+m_)-OES;LkS7T z=n4QD_{Q-aNWY;E(-TK@Ej@WeW9jQhl>QC!7)|0mgu)P<#eu(_E+W@qWIjUIAx-=C zbb~bP;K{3p@K!fHR4ikBE%XVbT`kxW-NbVVkDy!hDc%f5!DM&%D;9qAR!=zT zMN9b#K{P?1(dR)XbNI$!)5=*))v@yha<~MdGu|OztA@8VxL(GV5ZExLFK8O?Fs5r^ zOt&L3-Ju!8VB=$$u7xp81Jj)oFfpfuS1(}VdI_41#B?`|>24&ZFQYNt4P(jx)BFjT zn7cJh7d%W~MPeEYV_J&Dl!?YP7RIy+Olv1#;vT7C8ul>FM`B8cF|9{pT8PHf&MB07MK22mk;8 delta 17 ZcmaFL^pt7B0;lCQeXMU}I!pWMBqjRt6AYVqgc891NUbnhOB+%?4Zm delta 46 rcmaFF^oVJ~q{#}5N)spaDX=jzFfuR$F)ITIFfp)$Ne%{1FwF%3;#~#F diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/repositories/UserRepository.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/repositories/UserRepository.class index 362a6988d50783f1b10dd5e4b2c6fba64cc0933e..eabf8d298d11f607f228e874fecbe1ebeb43eb36 100644 GIT binary patch delta 97 zcmZ3?wwP^$Fr$osZ)!kULqBF?#Y^#;23J7?mea oVoKFvWn|!CU|`?{VkQPY24*OWpFsdDBFG>Fq}do48H5=a01uTC-v9sr delta 82 zcmZ3?wwP^$FymxH#z;<%(&E&jyu{qp$%2fclk=IBCwDPEoji#tRfmazhk=iQfq|8g effqr)$56#rea$!<1FfTa`~Efo5qr0vQ>tx#zLwDfHywlrv4mt=v(ki=wzeQ4=h zZIz1GSAA8*$2g;%R_k_@v4daz;0I^?qBD;DePy*zKwRub~+h6jcfL+P~exLY6w7M z*hWsR{7y*~uklSj5ZDT;{krbw@*>9LBm66=YRUFh2=ykuL9VQ3s7P2tWDI-^W*~Un&E5QiDnHe^rnBWF#0i6Te#iN5IEpTCG1WhH01)oZHe; zZUoorDu&?kV-!!xNNN~EYO1uA?`C^dv6Ip8G_pKWI;f1o(U8aZ)O574bwtBa9OK`V z#z-B-vl^bm34TmFT(06IPRTf};SA0)#JL%aOAL!meyOaAA1u2z^>;tN!fL%zcRFG5 z-`Ed|G~zfJh8?`w(V`3Nf6bZ;9lqc#XcijLd>~egd!42~oEelA=V)4C1kyu&&W} z3Fb?;c0uWsV*I}{UX(4kio(bQLPW9Ib7|=`v zTTo8qYUn)`U7Dj3DyE`0kOucng19iLM6G+P*t)J_QZ?M<;<$^61?3aZGtdq{HZF** z;^LuVom5=L+Z6nNb-GOFJa~uJ61-c;T}k?Tq`y!9D|F<80epy$NYTk9glT+&3hLA} HJ_Y+1pkY2l delta 1534 zcmZuw-%}e^6#g#RWH*})B#VH81W0Lxq_`#EFN(C3R%lCsHb5JyttknxH6$TfXenyi zs`Ym(z5f1D^xZl*I?IfVPW#}CKGgBaC;bncaeVQq*n1`J}^zc!~mr@({ zD(J;NE(tq=5$soRz~b`8=Z%?U+R!ISY{HV%uV4TN`G_zk)#0#$K^);Xg``KuFpi2C zVK`ROrSQ8#rDUZaV?;bBM)(PrO1DN8jA5MTT#K#~)}0vt%Qa2-Nd-^SM3Z7%IL*+< zzfkJ=Z<3$?Bi3}s?MAZMwp3<1GjGT^g-L6K35Kec!T(NRck8%}Da?qNW*FYkb4~J* zg*wji73rolg_MF>r1_|ONv2n0#xSxBhj^1Wz<+U8^FPb0`NfJW^rFo(>?Jh;{}3X=QTyg=AtZmtqL;KOBJqnuyauA5R(mNC8D6Mb<9aD2d&Ic?fe- zOrHm>x;Pb2R2ucSK_@wIv!8)lk&L&Rd9>=oE@skChPh2@|_b?6DvAnRx0J z>P#FmF=QVo>$rWGSjVZD`s^Ccm?$LGpo!;>Zwe3EeK%0ojr2V=p$9?qV;e@$j2O1V zK#Sc}by01pDbkG$veeBS_26U_Se-hNqqKX5<_WVbix6hHBdw!g#MZE|Ngg%HfcSH%z>>#Xi{<(?#!i_ZDV(!zLNm!HKD4Q_po0 qr7uM3MT5!o? zxQpht87rCP$FcNA(aO~rltiIis7*461B2^raG*_vro#!n?i#PZO1Ye9M~4cxj!t-Z zT^Qycgek?V!v{Zii3w*A-6~G#=)p;z7Ja-RrdTiE6%&dIgJGWUi6guy_{coX5a3J> z^lIpX=s-V1+uD{@Et{K`Vf)VM7{DO^D#e3Q2F)l}YR03=vvS@JUeIw7F+M7X9U%F|9g&8&TWmho6#|i88_DWv9iL`YH`OwCt?^S5$vrKj??WF z!b^lAA)Su&WwK&~j8Km3gYD5nz!lPV7?e8E)XfjLia1#e30xx*J2^wY1;Rk&4b5@86}=_NCA!>!pv zlG84`*bD>4AwtM)^E+@`)3}bS*UeMa~E0MNB2)ze1W$B delta 806 zcmZ8e&rcIk5dPk7x34Sh*y87 z8rltE?DtcjG+su|pbBQlq0tLCM$9hx*CutVJMx+1^(83%QkYB=LhhIbsWJkL$}8_1;hDtC=?4yHqwhPC2@>lv;!Se zR=MRw(a>-lCz3d+<7u2?IMfRFg5!&daEae0x9eiL%rKl@h#QI|0*<3P&R~q8S2;7Y zvtTl$AI&rHZ@K1M(&2VCiE+xDvb=57gzJ&t!YK)3&hagOXG!|=vhJ93+a(cb^x`~G z36nW$O5u$<(jOJuq~>Wji?k}848xJQ{k*U0A)6_vd`;?jRs}R!5x(N8;V3TXFmRD! zkk%HZGj}(R)Xk8KuYDZj^~u2L9bm!?LDvKs)8FJxIA~vJ0Y6dx~Ahrr8Yon zd$zJVt~a#iEx)wh(z>DJm4?=yt!W)ImeZsk+>tisjdUpvb2{d6Gvv^w zG8_+DLnBidqQkkM<8|DoV@EDAoNizTxh&V6lFFu$uh(j}CETorMJy$;tm6*epwe#D zbtCT#2csZB`44Nry;ft{J+EO10X9^4>D|M== zswh~VRkX#lLzP2KKsp}7wVZS-QQs)LyehV&yI~XscRZuaOR7N_ys2PJ*L}HVxx&oS z!JL&Q9n8U;<%lr$tDNA;>zpicyTDyb&7;L`f88Q`lbw1^=Uzo7`tnxA;eOpE)T?cw zS8d{YC#<$}p1naJddU^s7mdQ6Pd`~L^JEd~$ZpU{8OHV_omv$Bx-{=_6=a{zI}xkb z%owqo`yfW0=t;eeJWg2Dh}Z%{e`vvM_}-uQd1+&j*P^6o&Gtfc&Z$1P5A<%5qpCV& z^J>xL3~v#TC;!Ry&+Nx z4cwv*XA5sUC*?-HmW|y{QM-(-v?;C<@woW@H$#(;*NwM~2zi#k@=*9XMIwps7*0K2l#WjrHo8E2>G1?it>z#4tkHt2?XhrSAc1n@52qmjxK zLnNh?uh2~GX%jyqc^~}@Khi9Ya5#pbMF{T)G9QrUhxjN$nxRoq9#BY=_wiH$f8gj| zv||CArL7)5uBlmGSfxpoIE6%PBox6u; zesAqe1a_CECU-Hli%V*}vWpkg_|h(3R^zL?cugrx#aVU*Q5&Pc11FK9N6>Mc#w14R zWp4PosWJ#oz~;@BA+T6srYRDV))J^SYx`rG byY#Qh)gy#Y@EN|uSG1zh%GdZ7-(%!I(YhxV literal 3103 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 literal 3199 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 af7!+#62cew3g6;8lBgv49zWt|bpHo#K|_-O delta 1508 zcmY*Y+fN)-9RAMiWtQn-xwN3OP}o*!cW29Pt+f`Z)ly2OmQu?WMXWgNPS?e~05c${ zE%n-q8nd1UAAR&eA2cybp^3Mcm>B}`0X(ltjIcL7}ec$ggcl6tO z>+k<<{{Y}9K3Abs#uD8s{0!|2=Bk-0n5A55a(=hnMTzp!CfkP@1 z4E^HEKtHJrA}PLN$&il29FO6MxX%uY?%)?4+L^VCwdmx_C0oT)3~>=tJA&fC}rI*dD70s3{J6b9`QEM%4JGO=) zJSY8)6C!rL!8qkC=S#Wa__VCb^Bm`Kgh9<&&dBx5*CnTzbpxR>Ue91hmRH~xqkDwxIjtSO>uC8Xg7-c#|e_(dI{e!Y(m z#NX=uLv2B9FzkuNo2upw;cz=X(rB!1bFAYn!rc=8go*_Aky!>s4jV<4Rx*YtsuXE3 z>A8zmDT<6@z}N);j$Ram=_$cL8(jeR0BA=CttesaCe$8!SJ35>9Hm`}*NpGcy@iKK z|6BKSgQ}~EN~=@#VlR!(ZAo?0H;SOBUh zJy5(2uenB3<@CA_-Bqs_&XaMlvLiFLBNJ}OtSV^Cjn|kYT4}IknqFhVb^0*TU%%RD z4Dq*Xa&&1+reU~)OOsSDf1~Nmwq>e*yiHF9@6^Zp8m+I>EhqLvV!DYt_!ytijvV(- J@fj-6{|6JX`9=T$ diff --git a/Poseiden-skeleton/target/test-classes/com/nnk/springboot/BidTests.class b/Poseiden-skeleton/target/test-classes/com/nnk/springboot/BidTests.class index b1bdd73e5ab03c246082012cfbb3a3ae7da303b8..d3456df6a434a184bda0537688f9f47c0d724bef 100644 GIT binary patch delta 124 zcmdll_(Xu~)W2Q(7#J8#7|J$sg)xfD_~aL*>t~hbWtITRg3OZCBK^dI%+1-1*H|Xc zXKQ2>n5@YD&{Uj3h(U@$fkB!t~hbWtMC%XS~J|BZUyqFDlK;OD)n5 zD$NVeEXlBDWMC~z%qdM}WH19ODlRC>%u7!zO3Y0y&o9c>FG(#f(NE6LD@m;=ff#9` z9}HFlGy!Ok^<;0hW=6ru=h+^bN-zj9NHZuf$S|lg$TFA%S&j^f4E_vC4Dk%A44DjS u3{?!84D}3J44n+x3{x3&80IqQPJYT>A;8bT#8Aq>$WWHdP|i@nzyJWiusxvw diff --git a/Poseiden-skeleton/target/test-classes/com/nnk/springboot/CurvePointTests.class b/Poseiden-skeleton/target/test-classes/com/nnk/springboot/CurvePointTests.class index 60eec729afc00d29af8b675159121fcab4b3a691..4258d3e2e8290efbae53cd86810a5bd1b7d7e980 100644 GIT binary patch delta 175 zcmcaB_+LQa)W2Q(7#J8#7z)`Lm>3z9COa}JZ8UOaRF?6{FG|^)W2Q(7#J8#7)sa~m>3z9COa}JZ8UOax~ze!ni&NrUtxQ1D#0MhAkCo8Aj6=?Aj{yy zpuphGpvVx(pu~{Npvq9rpvKU_pvln7pv5qqL7QPQgAT)L2HnX&*c$}+8JHLf7#JA} LlNpK_iWwLHfNDR< diff --git a/Poseiden-skeleton/target/test-classes/com/nnk/springboot/RatingTests.class b/Poseiden-skeleton/target/test-classes/com/nnk/springboot/RatingTests.class index 00d1706d2225267e22b13b56aca72cccc2434b9e..dcb3ca6d3c74a03603a6021e6180abcd9f676954 100644 GIT binary patch delta 124 zcmbOvxLttj)W2Q(7#J8#81go9MKX%Z_~aL*>t~hbWtITRg3OZCBK^dI%*}a>Gg&65 zvNbaDPkzq!%v6j)fI*T$jzNk+l|h=p63B95kY@;BP+&-5P-e(uP+_QNP-kdi&|v6e a&}5j!pvAC=L3=V2M*}+>10zE&0|Nl77#%tQ delta 195 zcmdlkFiDW>)W2Q(7#J8#7z#IXMKW>=_~aL*>t~hbWtMENVw}mMEQJuzFDlK;OD)n5 zD$NVeEXlBDWMC~z%qdNsEXXFISdv;?qMw|fSCU#$0?}`xA6!tBnU@Y!4%B50RMpHV zIC(1DGgAo$0S0LXIR+U9RR&oGO9ll7Ck91^00t$76re~RgBn9UgC;`@gBC*{gEqq~ g1|5b)47!syur~t~hbWtITRg3OZCBK^dI%*{EBA6OJy1nAgBHVN2JOin92M+r42%rL3=9B<1|F~g delta 214 zcmew=a6ypk)W2Q(7#J8#7|J(tg)?#s_~aL*>t~hbWtMENVEn)mBZUyqFDlK;OD)n5 zD$NVeEXlBDWMC~z%qdM}WH19ODlRC>%u7!zO3Y0y&o9c>FG(#f(NE6LD@m;=ff#9` z9}HFlGy!Ok_2e|RW=6ruuh_1eN-&5pNHZug$S`O!$TFBRC@@$vC^C2gMM4==8R8k# s7z%(gr3_jO^$gk!-3&SmlNod;e`Bu@;AdcBC}v<}C`krNmoYE^0P`n3!~g&Q diff --git a/Poseiden-skeleton/target/test-classes/com/nnk/springboot/TradeTests.class b/Poseiden-skeleton/target/test-classes/com/nnk/springboot/TradeTests.class index 3f3b07f65733f91b327f091f895401148e177f1c..68d0dabf2e9001909b7142cba0c995d239753d52 100644 GIT binary patch delta 124 zcmdlecuj!o)W2Q(7#J8#7)myBg)oZC_~aL*>t~hbWtITRg3OZCBK^dI%*~mM*H|Xc zWou;QpDfRQ)l`f@h(VG;fkBEvok5zxm_d%gl0lxq9Vimapv(}3ykCpR(*Z&bEs?ET9%kon##yv23AyDP?VXMo>r8Yn_8YcT2TTq(nLQPtOjTT&>-u{o@~vGf|Jj(T{V?p5Mq#KP+*W@P-l>3Fb1+L859}Z z8I%};8B`f!8Ppi^7&IA*8MGK`8MGNX8FUyXGU!ge&R!wF&%gu}XJjZzW+-JSV_*OP D)loi1 diff --git a/Poseiden-skeleton/target/test-classes/com/nnk/springboot/controllers/BidListControllerTests.class b/Poseiden-skeleton/target/test-classes/com/nnk/springboot/controllers/BidListControllerTests.class index 97d330a96c4901f844e182f1b02918f36cc1b7d2..732279718d0fa5c3359f374da203a557a164e2f1 100644 GIT binary patch delta 29 kcmexm-{r8On~70r@_bftE~nJA{GwFX#N>?4bD3gg0ik&cOaK4? delta 31 mcmeBj_+`JLn@LE>C%-6NKdUq^vqax1H7&m=b@N)LSXltTI}5M? diff --git a/Poseiden-skeleton/target/test-classes/com/nnk/springboot/controllers/CurveControllerTest.class b/Poseiden-skeleton/target/test-classes/com/nnk/springboot/controllers/CurveControllerTest.class index 1bba895137d628bd4f00f7f98f52013640e888f1..e1c14bdc5d08edc5edd761e66ff5dc9d077006cb 100644 GIT binary patch delta 75 zcmca;ecO6NHgKgfXL-4~ic?EMQj2mQHFQsI642%0 T2J*uab4pWz0-JXTDDwgUL=G8W diff --git a/Poseiden-skeleton/target/test-classes/com/nnk/springboot/controllers/RatingControllerTest.class b/Poseiden-skeleton/target/test-classes/com/nnk/springboot/controllers/RatingControllerTest.class index 5dc8c7afcc97b4574f9c613a6dabf5ca6d5d8203..08ce7a0a5ea87a4498bcee5b50b3e9bb2cb74c26 100644 GIT binary patch delta 47 zcmbPeyU=z+E0dCvPkvFlepYE-W(kli$Sg@M(oZbN)OSiv%P&fGO-#<%Je}#6GytZ` B5(EGM delta 31 mcmZ2zJJEJSE0d6rPkvFlepYE-W{JL2YFd6#>gMH4zoY@T5ew)5 diff --git a/Poseiden-skeleton/target/test-classes/com/nnk/springboot/controllers/RuleNameControllerTest.class b/Poseiden-skeleton/target/test-classes/com/nnk/springboot/controllers/RuleNameControllerTest.class index 5ffe654ade7f9f02808268d2c24b3df1ceff56a0..2ae1f520b9e9fd4346eaf0f76df4588de6a523cc 100644 GIT binary patch delta 47 zcmX?Nf5m=7FO!mzPkvFlepYE-W(kli$Sg@M(oZbN)OSiv%P&fGO-#<%JfBHb767@L B5vu?I delta 31 mcmca&f5d)6FO!gvPkvFlepYE-W{JL2YFd6#>gM%KsgL5vr=Z_C%-6NKdUq^vjj*MWR|2B=_eLs>N};Tok>W@C%-6NKdUq^vqax1H7&m=b@NK5FOmSYXA9H- From 6e855dd2b835819159e71ba4ccb1aa001b1848d1 Mon Sep 17 00:00:00 2001 From: Florent TRIMOREAU Date: Mon, 9 May 2022 15:29:20 +0200 Subject: [PATCH 12/12] Merge branch 'release/V1.2/MavenTests' --- .../controllers/UserController.class | Bin 5629 -> 5530 bytes .../com/nnk/springboot/domain/User.class | Bin 3261 -> 3261 bytes .../repositories/UserRepository.class | Bin 803 -> 803 bytes .../security/SpringSecurityConfig.class | Bin 5586 -> 5586 bytes .../security/UserDetailsServiceImpl.class | Bin 2350 -> 2326 bytes 5 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/controllers/UserController.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/controllers/UserController.class index f485cdd34e3370c7d9e37a272b9897af33311e29..c6aeebd28f8b74965aa46c5576a532e983e06a61 100644 GIT binary patch literal 5530 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 abd;(=_jN(O)i?P73iloM7Q!9)RQeCS#DHc1 diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/repositories/UserRepository.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/repositories/UserRepository.class index eabf8d298d11f607f228e874fecbe1ebeb43eb36..362a6988d50783f1b10dd5e4b2c6fba64cc0933e 100644 GIT binary patch delta 82 zcmZ3?wwP^$FymxH#z;<%(&E&jyu{qp$%2fclk=IBCwDPEoji#tRfmazhk=iQfq|8g effqkULqBF?#Y^#;23J7?mea oVoKFvWn|!CU|`?{VkQPY24*OWpFsdDBFG>Fq}do48H5=a01uTC-v9sr diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/security/SpringSecurityConfig.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/security/SpringSecurityConfig.class index dd01c77a83ed39b7b61435baa5eba9b9026d7984..9781c7791496c8599494b20a97b76e2beaab2857 100644 GIT binary patch delta 1570 zcmZ8gT~ixn6n@@hlU+6&NEQJLB|u6mkm5?fFN$p`t_D*cL5V zYwLH#w|>-*Vs+FT>)_}tGcr2#Rxj#w#u=~lA2{Q9<5kDAOZd>qWZyl{p7%NDdCvRZ z4c!fSf4cYmj{utRr3eR~ksIA21cnpbU(m?Ec1rw?-#vdkzzt6i|JfVmi*gqa=2r&X zEqY2fb~89@YWo?4wsbrp!wH`P1zz5se_N9eoE=SM3_YEi6tRV&@N{fCrX^#kF>U>e zj53sq*vimB6+2uC0;rh(eIZfB;M>TL7+F0vCSe-`(}clZJ!`81h%+ z=~z;a$Bcx8T86w;EEbPT2r;;|(aA}zPDVX65f3t4%!%x#vJatw>yBojk>N}ZZr~ng zL30=nD|iGIM3+fqCv>AVnUwGtgGY&3%Nv_A#uF(+AEjpFR!i*)I&hF575bzy99GbYBm9;ywzZp* zwGlnuNlIx%RS~D#(*`05e1`&^Mn`^PBFCcn@TzVP4e@9#FCbATWcm$pG=RXrwkbh zoVKR?3`0>(=l_SatF~Xp1kxf>4BhJ;UX^^*VTR0IkZws6m{ee3iudNt$aH$f4I{&F zh*x<7{1;a-|1-as&lOyzv-ljtUg{>m|IVv+&cMgR%1MG>VC0q6zWO@7A{but{Lg7vh$oJV{~Ri^!KE4YAJ z8Q1WxhgN;jzHE{q!2fUtW>G~X zPP$MI`cX-WM2f6cvQg@86XqezMKN6&dgfE4(aJ2eZV3h7*jxPcvtm`aw=yD&@P{Wj09#OomFrI3kI=?7FsooX-=71ZiT)TQo-MBQplBr2+P5feLC z5H`^ytY$r$L)6Dj>@u;({@7;X$rY5DIHY!&IJ$x!6a6+2wSW^V7&h_r%B+G8c3eV@EwXsE`dulT z7o)&Z?!q}rTQm4PFl%cM6KL5bEn_CSgy$FO-GL1ocW$y#TDOtr{$DbiYltw*$I@lY z5!c1eP~CTU(Ij7KeZ|CUp$&EwvjU|yki;;2XrxgzZ4y(ODXjWdL17SRnDjD)Q=M%+6H`NJ5@;W#}wb7 b{{kg`GK8D>lmeBg!}tuJ6If5{7x4cJiOwUJ delta 1471 zcmYjRTTEMJ9RGd2oO62kO3Pv3?6xu(n~aVfH}J-g4aS7YWs{DvqPUf|z+t7uw%{&m z=iEi7;_#c7d1Fe{n9M|@IV2Jtd(;<`B|aDv6Q6wY(PU54|2gdjY5M)Y|Lym`e&<%` zRw(exogaPz(1b5lIN+4w;&4M^7#4rIc8Oohq`8a14N{AdGIFg9&bqCKRVeVtP&rD# z8M?@@QQUD^0YQed6gDo-xPoHA)yy`EKV37; zRjA?EWF_U9N@OODTw5}!U^7FB9*s{LDSbRWNg*C!aJO~z?(b7kg{>U*2#HzubtQlX zj_uGzyR@aI3OhJZYa|lIgMZbWTM-2CWeuVW<$-+-u5c zUPE|V#xoqlc$VRS4f>DAFMe0QR)%nlBTA8GOHNBN;tYF89~82;R*G5sFeWa0`~0JD zdN6_GGLjsVNX>a0MK3$3su;x-$8*Stf4w8h1achHn3-D$+o}^BCvi#`r4eE$@B+t+ zcu8#c9`&m@gO_ET<#+|>7-AGu7dL!O;5^zwh{WH~i}yENHDtp61g=!%Sz4Q;GOM zCW&gw%0c_@pdaN8hV#TpL@(Gv$tiEW?|ah12%_jgYM9=R+oBy`5VH5W+ zqsm0Jt6)`IlxSN_)S1|3D<3q`xD3U_Bib$#k1wOu#9mwQge7=#Igf4=y|$!p3H=f6 z&>{|-h-f|&M+aBZuc1W)y^U&YL?fN8s6i(^tRtv}fz3FFI=i&WLiSc^WKVVAEnKDw z=jiSt`Zli6&CN(`6+WHEJLF;YZ6{HyMamLlkwqlFp}PYst=qP$bxINc?quGz!Dx|+ zSVKguE(Vq`N?7APq5AJ(m`GbRYvTFPU39@JD)ZJ%3W*1b!1Q6Fy?l=nS{=eggL=O> zsP-V-KE-FmXk-$=0zO9>&1C^!fc+0Pup>|a diff --git a/Poseiden-skeleton/target/classes/com/nnk/springboot/security/UserDetailsServiceImpl.class b/Poseiden-skeleton/target/classes/com/nnk/springboot/security/UserDetailsServiceImpl.class index 5eac5a1917bb2bb6dfc6f5c474db0ee4fa3586de..c680ad8b5d6c42f6f538ee4f90d791c80fc5cf53 100644 GIT binary patch delta 806 zcmZ8e&rcIk5dPk7x34Sh*y87 z8rltE?DtcjG+su|pbBQlq0tLCM$9hx*Cur7uM3MT5!o? zxQpht87rCP$FcNA(aO~rltiIis7*461B2^raG*_vro#!n?i#PZO1Ye9M~4cxj!t-Z zT^Qycgek?V!v{Zii3w*A-6~G#=)p;z7Ja-RrdTiE6%&dIgJGWUi6guy_{coX5a3J> z^lIpX=s-V1+uD{@Et{K`Vf)VM7{DO^D#e3Q2F)l}YR03=vvS@JUeIw7F+M7X9U%F|9g&8&TWmho6#|i88_DWv9iL`YH`OwCt?^S5$vrKj??WF z!b^lAA)Su&WwK&~j8Km3gYD5nz!lPV7?e8E)XfjLia1#e30xx*J2^wY1;Rk&4b5@86}=_NCA!>!pv zlG84`*bD>4AwtM)^E+@`)3}bS*UeMa~E0MNB2)ze1W$B