From 9001d7a724bd7af2e863e2c926330aed220f7aa1 Mon Sep 17 00:00:00 2001 From: pongkorn Date: Sat, 17 Feb 2024 17:45:20 +0700 Subject: [PATCH 01/11] Create API --- .idea/.gitignore | 3 ++ .idea/assessment.iml | 9 ++++ .idea/compiler.xml | 14 ++++++ .idea/gradle.xml | 17 +++++++ .idea/jarRepositories.xml | 20 ++++++++ .idea/misc.xml | 7 +++ .idea/modules.xml | 9 ++++ .idea/modules/posttest.main.iml | 8 +++ .idea/vcs.xml | 6 +++ .../posttest/PosttestApplication.java | 1 + .../controller/LotteryController.java | 46 +++++++++++++++++ .../posttest/entity/LotteryEntity.java | 50 +++++++++++++++++++ .../repository/LotteryRepository.java | 12 +++++ .../posttest/service/ILotteryService.java | 43 ++++++++++++++++ .../posttest/service/LotteryService.java | 16 ++++++ .../src/main/resources/application.properties | 18 ++++--- 16 files changed, 273 insertions(+), 6 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/assessment.iml create mode 100644 .idea/compiler.xml create mode 100644 .idea/gradle.xml create mode 100644 .idea/jarRepositories.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/modules/posttest.main.iml create mode 100644 .idea/vcs.xml create mode 100644 posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/LotteryController.java create mode 100644 posttest/src/main/java/com/kbtg/bootcamp/posttest/entity/LotteryEntity.java create mode 100644 posttest/src/main/java/com/kbtg/bootcamp/posttest/repository/LotteryRepository.java create mode 100644 posttest/src/main/java/com/kbtg/bootcamp/posttest/service/ILotteryService.java create mode 100644 posttest/src/main/java/com/kbtg/bootcamp/posttest/service/LotteryService.java diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 00000000..26d33521 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/assessment.iml b/.idea/assessment.iml new file mode 100644 index 00000000..d6ebd480 --- /dev/null +++ b/.idea/assessment.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 00000000..710a15b9 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 00000000..d14dfbb0 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,17 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 00000000..fdc392fe --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 00000000..3c4c43a4 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 00000000..6b70da65 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/posttest.main.iml b/.idea/modules/posttest.main.iml new file mode 100644 index 00000000..878162a3 --- /dev/null +++ b/.idea/modules/posttest.main.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 00000000..35eb1ddf --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/PosttestApplication.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/PosttestApplication.java index 630c3b8d..c5aa6555 100644 --- a/posttest/src/main/java/com/kbtg/bootcamp/posttest/PosttestApplication.java +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/PosttestApplication.java @@ -8,6 +8,7 @@ public class PosttestApplication { public static void main(String[] args) { SpringApplication.run(PosttestApplication.class, args); + System.out.println("START API SUCCESS!!!"); } } diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/LotteryController.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/LotteryController.java new file mode 100644 index 00000000..d7f6f9c0 --- /dev/null +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/LotteryController.java @@ -0,0 +1,46 @@ +package com.kbtg.bootcamp.posttest.controller; + +import com.kbtg.bootcamp.posttest.entity.LotteryEntity; +import com.kbtg.bootcamp.posttest.service.LotteryService; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Optional; + +@RestController +@RequestMapping("/lottery") +public class LotteryController { + + private final LotteryService lotteryService; + + public LotteryController(LotteryService lotteryService) { + this.lotteryService = lotteryService; + } + + @GetMapping("") + public List findAllLottery() { + return lotteryService.findAllLottery(); + } + + @GetMapping("/{id}") + public Optional findLotteryById(@PathVariable("id") Long id) { + return lotteryService.findLotteryById(id); + + } + @PostMapping("") + public LotteryEntity saveLottery(@RequestBody LotteryEntity lotteryEntity) { + return lotteryService.saveLottery(lotteryEntity); + } + + + @PutMapping("") + public LotteryEntity updateLottery(@RequestBody LotteryEntity lotteryEntity) { + return lotteryService.updateLottery(lotteryEntity); + } + + + @DeleteMapping("/{id}") + public void deleteLotteryById(@PathVariable("id")Long id) { + lotteryService.deleteLottery(id); + } +} diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/entity/LotteryEntity.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/entity/LotteryEntity.java new file mode 100644 index 00000000..cf84539f --- /dev/null +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/entity/LotteryEntity.java @@ -0,0 +1,50 @@ +package com.kbtg.bootcamp.posttest.entity; + +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; + +@Entity +@Table(name = "lottery") +public class LotteryEntity { + + // properties + @Id + private String ticket; + private int price; + private int amount; + + public LotteryEntity() { + + } + + public LotteryEntity(String ticket, int price, int amount) { + this.ticket = ticket; + this.price = price; + this.amount = amount; + } + + public String getTicket() { + return ticket; + } + + public void setTicket(String ticket) { + this.ticket = ticket; + } + + public int getPrice() { + return price; + } + + public void setPrice(int price) { + this.price = price; + } + + public int getAmount() { + return amount; + } + + public void setAmount(int amount) { + this.amount = amount; + } +} diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/repository/LotteryRepository.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/repository/LotteryRepository.java new file mode 100644 index 00000000..a5de7346 --- /dev/null +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/repository/LotteryRepository.java @@ -0,0 +1,12 @@ +package com.kbtg.bootcamp.posttest.repository; + +import com.kbtg.bootcamp.posttest.entity.LotteryEntity; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + + +@Repository +public interface LotteryRepository extends JpaRepository { + + +} diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/ILotteryService.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/ILotteryService.java new file mode 100644 index 00000000..dade03b4 --- /dev/null +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/ILotteryService.java @@ -0,0 +1,43 @@ +package com.kbtg.bootcamp.posttest.service; + +import com.kbtg.bootcamp.posttest.entity.LotteryEntity; +import com.kbtg.bootcamp.posttest.repository.LotteryRepository; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; + +@Service +public class ILotteryService implements LotteryService{ + + private final LotteryRepository lotteryRepository; + + public ILotteryService(LotteryRepository lotteryRepository) { + this.lotteryRepository = lotteryRepository; + } + + @Override + public List findAllLottery() { + return lotteryRepository.findAll(); + } + + @Override + public Optional findLotteryById(Long id) { + return lotteryRepository.findById(id); + } + + @Override + public LotteryEntity saveLottery(LotteryEntity lotteryEntity) { + return lotteryRepository.save(lotteryEntity); + } + + @Override + public LotteryEntity updateLottery(LotteryEntity lotteryEntity) { + return lotteryRepository.save(lotteryEntity); + } + + @Override + public void deleteLottery(Long id) { + lotteryRepository.deleteById(id); + } +} diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/LotteryService.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/LotteryService.java new file mode 100644 index 00000000..da929967 --- /dev/null +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/LotteryService.java @@ -0,0 +1,16 @@ +package com.kbtg.bootcamp.posttest.service; + + +import com.kbtg.bootcamp.posttest.entity.LotteryEntity; + +import java.util.List; +import java.util.Optional; + +public interface LotteryService { + List findAllLottery(); + Optional findLotteryById(Long id); + LotteryEntity saveLottery(LotteryEntity lotteryEntity); + LotteryEntity updateLottery(LotteryEntity lotteryEntity); + void deleteLottery(Long id); + +} diff --git a/posttest/src/main/resources/application.properties b/posttest/src/main/resources/application.properties index 8d3eb44e..03968775 100644 --- a/posttest/src/main/resources/application.properties +++ b/posttest/src/main/resources/application.properties @@ -1,6 +1,12 @@ -server.port=8081 -spring.datasource.url=jdbc:postgresql://localhost:5432/ -spring.datasource.username= -spring.datasource.password= -spring.jpa.hibernate.ddl-auto= -spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect \ No newline at end of file +server.port=8888 +spring.datasource.url=jdbc:postgresql://localhost:5432/lottery +spring.datasource.username=postgres +spring.datasource.password=Watermal0n +spring.jpa.hibernate.ddl-auto=validate +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect + +# DataSource Configuration +#spring.datasource.driver-class-name=org.postgresql.Driver + +# JPA & Hibernate Configuration +#spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect From d7b8e74e30be72b2ba14ffd015b9f9cb553463bd Mon Sep 17 00:00:00 2001 From: pongkorn Date: Tue, 20 Feb 2024 23:09:47 +0700 Subject: [PATCH 02/11] admin add, list ok, user not finish --- .idea/uiDesigner.xml | 124 ++++++++++++++++++ BUINESS SOLUTION.docx | Bin 0 -> 14940 bytes posttest/build.gradle | 5 + .../posttest/PosttestApplication.java | 10 +- .../bootcamp/posttest/SecurityConfig.java | 60 +++++++++ .../controller/AdminLotteryController.java | 47 +++++++ .../controller/LotteryController.java | 46 ------- .../controller/UserLotteryController.java | 58 ++++++++ .../posttest/entity/LotteryEntity.java | 13 +- .../posttest/entity/UserLoginEntity.java | 46 +++++++ .../posttest/entity/UserTicketEntity.java | 71 ++++++++++ .../repository/LotteryRepository.java | 11 ++ .../repository/UserLoginRepository.java | 13 ++ .../repository/UserTicketRepository.java | 12 ++ .../posttest/service/ILotteryService.java | 43 ------ .../posttest/service/LotteryService.java | 43 +++++- .../posttest/service/TicketService.java | 27 ++++ .../service/impl/ImpLotteryService.java | 18 +++ .../service/impl/ImpTicketService.java | 13 ++ .../src/main/resources/application.properties | 7 +- 20 files changed, 564 insertions(+), 103 deletions(-) create mode 100644 .idea/uiDesigner.xml create mode 100644 BUINESS SOLUTION.docx create mode 100644 posttest/src/main/java/com/kbtg/bootcamp/posttest/SecurityConfig.java create mode 100644 posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/AdminLotteryController.java delete mode 100644 posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/LotteryController.java create mode 100644 posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/UserLotteryController.java create mode 100644 posttest/src/main/java/com/kbtg/bootcamp/posttest/entity/UserLoginEntity.java create mode 100644 posttest/src/main/java/com/kbtg/bootcamp/posttest/entity/UserTicketEntity.java create mode 100644 posttest/src/main/java/com/kbtg/bootcamp/posttest/repository/UserLoginRepository.java create mode 100644 posttest/src/main/java/com/kbtg/bootcamp/posttest/repository/UserTicketRepository.java delete mode 100644 posttest/src/main/java/com/kbtg/bootcamp/posttest/service/ILotteryService.java create mode 100644 posttest/src/main/java/com/kbtg/bootcamp/posttest/service/TicketService.java create mode 100644 posttest/src/main/java/com/kbtg/bootcamp/posttest/service/impl/ImpLotteryService.java create mode 100644 posttest/src/main/java/com/kbtg/bootcamp/posttest/service/impl/ImpTicketService.java diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 00000000..2b63946d --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/BUINESS SOLUTION.docx b/BUINESS SOLUTION.docx new file mode 100644 index 0000000000000000000000000000000000000000..0ce70f6e67aa570e69c95555648a036c5a0d19e3 GIT binary patch literal 14940 zcmeIZgL`Gm@;|(j%)~Y)wkMo$V%xTDCllLtCbrFqZ9AFRwthLd_nbTTyzf8oy=yHU2RKqU~a2!c8Zg zO|Z^FFk!gjg_Qjuj?Hk*DTOHddI-}kl{39cTomQ4>dLaH1s1T@kHu4nsvak(*@@qT zoh&6L6-y^9$GzgZsgIEf$Z6rGRGoOWm(YIOX#m>zAwI$Z8A%p=sA+KdK1g&i(uetBH~EP3#Rk0FB}UCz#0cSLc>$j zu@kO#X@U+LaT@2C2?{VFZ4h%0n%!zot1XFmh1J}^ia7<^18|zh zFgzg*xvLTxsG}mg)~Ypn!&j-*+O)z-)8M&!U!?w9Kh9Tbdp^FeWW7QF0K)sEI9b{1 z)9PF4Ias`}VZSY2$LhnD%Yw+OX#3pos$ae#wUf&Rp-3a5pj#sm+RpVR#$ar z9m^sMhg$lgQa6kETFUBAq6!>zY!=uD(8jtZC!~jn8laOfb$@BC_;NQEb=fV179o+I zOjpTqm(|IojTv`vn4!~@!R@G!3b_#EucUOds+ZF zz}k1NsREa=5Bz~T1@^k?;M<0`-oXS^E52)%8|(>8V1nh;-X})m2%Y5nk-!W~P@r}# zv_>O5<6P@U0VYNeA3KgD0Awu}D10)S68dpC55Ma79Tz-H7`#&a{xQA_mVg*zf?4dS zN>um+Q&Hdzs z5-!TYbP+X0S6pyN``b>tG9Lj4g^;!LRv);;(gpPNZa8!=yRmrIvS|PMct6sl+Ti_l zRQNZAYpH;1S=%6{g6}4JYR;B)_0R4B>_^#~V>Y0+^`gNH{bS|qcZ(s@1{j<-h;o`h ziU{0w9eSiO6@vQ7ke~43AA%?d;?9yqer}MpHeaablcOh=3FBb^SitZO39&!5 z=PC@zI;$uo!=XtpAUmtdp@$W>t5kF#0p8wW7va*4Bjt=3Q1Ix!cyRVU#%tna^ns~t zAF&>CmL>f9CsOZ~jOR`!U@MGI(vZZ&e!}-WziTM?P z`4gsvaDILL`4vC#ex@~OIkUO~I7~J}StMrTDacsKg*$cR4XCeKY704}+Q(nM;YBF0kTLD^ypjvDO1wJy z-lMmUoOTV0c%4^^ecNKzB(Sh|Rbxwpp_#FtzD#fUxm1sG|Fz#{gO7o3GkMY2DFc^l z5)>pvJvin_OcfrdS);tDFjPYsq<6`;KxkYFHj|6|;48;x+{V_GvmtESIFLjcV*jnD zblHvS)|vPoj56YQx!Tw49}-)w@Ocd^Vx90Kt@ttZW`uMo4;_g?tiBp3N;^%OAU0@H z2$1LzJLPHkHxqtg#o5xxo=E<0{F`7DkY2%E!~2&lWY27nZ(&_p4PQsiZc;b46r0Ve zjM_;hwzv5{`k0x9EGW5@iCc4YGbD|=68oqL9}Pp$v~jfWL~JO6;x#ZnnvO$T<(!{2 zi)eMOP1KB@Fu5`xG>o2>AnBcqzEVKG1$AYbncuR;D`HzoUihHxOC=JEPR&Zy#+H4+0!cSjYi4Rqgnt5_DUl=kWAYa9phFo!B_a9Ox_@8~QyE z6?!6CfSFrZtaN$IR}6fgD-RRYzzsavT2y3tIHyBs(~3U6J%q-F!i_IP!S<55`I#B= z;!F!;zP*TH{**e_Vk-uR8z=2p50owb2MT<=|=pyP>jfc zN?RcknsWQt?)ej?K>=a%{Bpry#V*b~U}mnF%8`tW(aVvBjj_Bbq4%JsGPab(mq zi`sMtVNM$?CR?a_CnEdH-K(dvE9afe?c&ZZUM#i#qzNAg_Q@5tT|9^>9MTA&JR2S7 zcj!FW$yhk>Uu?>9Ho$PHciqWrDbze0^Su!x9X^_GiBGbhFY_rYkt#3IX&7WUQm9J3 z6L*7C3V4!Nozh=MxGT=(P@GY&DzP6v?l;cPhrDn!z~2#xk#-I*Ou7{1TpsddN|C?f zSGr5S;>xdRfCv`YgzE*{cB&ZZFQ`aab|WXZ=&3zv)2F?*|Ey7kCVE&!ORa|yjySiG zl3i?GY)o~$FxOoipFow~K8GYw%}RdWurQxeJVo8XmWat>M$t~JbQt{5vJtFt(_EtI zG<#I;`r^DuSfQC{?rI@eI(BVsQeEsjd#IBKncN22S6qvVC?IkmO6Ahh+K4n0z1==R z*^zruv^N#*d=RS!MGWm$~crygBAaX+e=K=W`8$7vn_b~gD--K->H4k?ESbh4o7emsD4kFtD z+gt-zS7>P8nJ{ynr^yX5#|OC+G;Od`f6!GCNsvfF@s0EON9I6ml2OTEe$J4nl`0{& zl~^%%e$*3gS6ZvKQN~ph#@(xuFiHrLilt4QR(kU)c%gmw2>#n=sA&(y`S|Wl)Pn#3 z*Z^>#-+hKZ9P7V(4*znpf!_DN@2&rDU!}35zwQ0}&ivbb7u=}XE%+d!?Z~~=)$V}w z-Cp=^^l~LsJ3ItL5d%S|eIpojjoSTZU9ZYe*t4$Mn1HK^J_h7hJ6Nd#;r8BceoP`Y zF)b?P0U~r=*uHZ*Vv&#OiaLAjtclWX{T5-YY;#%yTX!9dGvSxm$3{&qJb%ffm{~2* zE<8=_Gz~pa@p-Wvb;I$7uu>QMoO`j}>G6t)S9(phhQ3WcYIbgJNV%wcx1y1VC%RJL+1W-?AY&B0gx)i5dDiO zzRn>K7ydg>nXzd}r0||M%a^$SC`R?yMoCkk0Kgy~0D$t|;&(B!H#V>^p#A+$|GWFC zA{L4z1m6yJi5t)~>^i!yQ_3_Yd}%h%yjJHM*(Ph2UzTAqxw=$G7oeSK3-KW>iVwPJ z2c8$2zGpiISFche4LADmlL!O#O;4nTFGP!v0(X1yYjbgPGo#(+&zB@Np(LoTmp_%1OtfEMkuP4Q1(nON1*gXgorAT%V5?>HcO(NWA`R1 zLAtP>FU;K#BNFJ5(S9^=!+H@BJXYevb)tDP5eOpcq&)P6ZS=`e2#&CEqE1G6?q4^x z2>db8W!fv`_4s)8`lpK@5up&IPqFcrY;@A;*|~n)##^qN zVLHQvkcs50?T4%vf|ab6<0A>us%=`VV=C2S%?tj|i0~qfSh#(5l z7&`k1euIK14oqWhAqvAgHzd;m4xp?Xs+0|UJKQ=*xFutYl#yh^!3-|L@9jq*lr*f~ z()?Iv343|i8=4rI(cymmG~6Gl#r5dWbX&h-5a;L8#KP@yH9k$7-r@ChF&b-i;vC)I z@w!to@Adqkb(qI<)M8YT$?bOYGVk^B+yi`OYo8Q|8-)(F$HwJoS%uDQtOCHjyo+TG zf*%yKkCo2)K#l?Bibn|I;o(hIz2Ul0yM+UL&;{Dc*kJ^}7J09Z2z9QCjP--F&p6WN zD5Jcn?ou&{^t*=**Z7ttzP-L0`@;F9HkWTBDRVrJA501hc_X$zYv+`Voq0%=z%dPe zfX3ZG5JM-)RFhcRCj!M->?l6Ml+WLXi9kE3%s+Il2Uy&mvT_Pq96sF-@OLeKoykX( z>kdntP|sc%LhogaToL$O9lfG;9<5`I-#Lw+KY|ff1<#y}<*qZ)25QoGddt}yBtev@ zZ_0N{(04h&l?sXwVx%}m6nwcrsSAl8l9np2DnfVVSIBh_MC^as&R4m4+K_p&92Ia3 zlx?`X;z&ftFuvs@313fscDW#2r6E~5Ihh(LXndwCK1q+Mcf8WB+g+2aa}{ zY}f4fy4Xg1T|F;(aLQS3En-gWA$IY&M4zSC4qcU z2%ui|3EF%W=f@$XW^Ndg7~xB8`rayY-9zMJ_OVvx=^nS@)*Etb7EX$KVYg90iiYoDKz^a`4ld3GX58BnGTPf`q2{(=-1L+FcRgGVwOi+33n$o28Kk;>p1dy z6Gk=M?s;HDID>iLxru5<8lyaj zvXS!(re6B_bx)-c`AYXzzs82C)y>JfJ@XINQD$cBTq~^&I)CmYRH2J;(4kS#P3Oc{ zc38j`J`>u~+lv}|p#BhWnW|v$gC4=wVw8TfX=ALkF}gfKXwrE-21kb92tjp?>_I=H z%fU^8v;l6^-cHHTt0}o#`pZF2!|AgB3_pztsyg1`T0v<$(*kAq?F6+z!$};QrG`$!nPMni1*OBaxljv7XE=fm zxY@%r(eFiF6{rzDvy_93Nc)otj!m@bUr2H8czVxVc}C$x;}f{aTpTK7O&?ZWi;kXd z4u4cAKDI6K(S?NlEY2+F^uv9!uX4Al=xSQTOL;wYVB&=CnE_as5(Ku5L@-7Za~EfA{e9K7E?Ylvr7{ zNDmS89z0Qn3DGaiuQ}!b)Cm2zw!{Uy-D}v+4U`Huc*IO9O{5I^!rXyiS!rL3p!Da* z@U_meceQ@v#7cjF5@F=N70xJK+3sxd#<&mwUt`ZjiT=Vk)B~beVFeJcFEn)Zt*%2w zDLh8_knBgDh9;b?j?`2x4a>xVl$YT1g_G(P(G`?|pEtMx)iFB>shGmCHU0yq&t^di zfwF71Ti-Ih-Ro@N5CKnBJwo1n!v7mCKz_p4PDc=Oy&vGp*IdkQdE zn3PWUM1EXFuw9dM!Art0OZc618NC)NTtctwB;tb87ng{LQr#Cn31WI|kV(*@T|T!R z8?}Dp;pp%aFX*1U%pNsICD}S4*0;eK-D(_FO{L68Nq=szC!MzDTvHx_A14xMi(g#w z$cY~8S5sx?oETEOl|NH%B zj{zu2w3n!i5{zq9p(*BI(Fd6s)hStS>C^4vvAMBgKOIldS>o5mL}n=sSJ>#0@-okI5 zUhQFrxL0?yF(*}?^5;dD96bQY=wdb-nW!%v7_f2{^!scDhg6N4UDU=Gwbp9jb8* zphRFH*OP9eu1xM@88AEED)nZTw2Oi^pq5)4EugOWbNwpNZtn^LO9txW1UUrcty?Sa zloxR=*Iq6?v95fmtNi>?=^8^CT&gP>%B~h{3Dc+N!U#|u^IkUIc9_0M?Az>U z!G#AN*SrnwXcB$wR!?MiBFfM5-=H9LN!>K3f+48^t$vs!VGd(Hs&ATS(0HxjSXGk! z^v$EI;>M^piX1NdC?1-pwRd#wj}lq-yI+%QHEzUHxwg33G#D)rwJgn!Om3bhP!R+gSdZ7>qT z+&Q{J+^j(s@XU(7GL8(au4lsO11P3T_luN|LG7vq*cLic1>?@E3)kktBjg5tWLcq* z`r+OsK+pGpawgjH#cX&6{Rvc+uvT6*o8OB%$>H({;gqCS`D-X~K)WcW-mJiCIb#AY zvEaC2@ONv23?wUfjfH8I4=C=pgN`H6l!YW(=b+OC9ucWbi=N~nk1feLhUKayDw3%v zPIo-4kz4|^(5p!hzB7=?_8>JXo|mUL zo0fGDhll@EXk&fjOYyd@5zz|}dNRPq_<2+flo7|)H6XRm`nGM+*xY*x0Sn&9^R7?N!R?6F*vmnC$F zjS(P%)Ec8>MKih)27*JwwpIMx+!_W&LMZmCW~A=?9fQR|DB-eUxN%XyaK)avTJbG6 zER=?Et4muSf}49QEmpH}tx&-;rLS>nD_70ZafW{&T#ZRl<7(9FA9v$EJ*BZfp#XqS z_5c9fzpQ|ry^FcQ?`}wIx|-c`GeZA5`}En5Nx7$}0VmSrExSIOpG(uM7r|+}7zFrG zOu~h&J&xQSKv8jcv^+MQWmo+*^VeUUMGdY)_xz<77xmvx)`)(plp;p2 zW=eRjXtcYq1c$^JK*UmP8O0iDiof2!RCqm{T=2WYv+#sUB7vp{hQ(cw8 zgi_^Z{)nTQ3(UK;6nfDuxcR%}p+$Am7)8#hE&){Y*V$#O*BY-&(x>)CzrnL5sNfLp zi;pGxDoKeC7Hh5Mnu~8V3W}(cTVRSkyekK=hl;Y_v0B;2A?YVGtrg?;{I%0@X-09= zGkXLMT3=*{bU!muqrT1JzUp3@+geYw+v&JUcifeGN>v}Xdqf&pd5)}Puv(2W-I>eM ztgmP!|1hc1xp^DgE!S+XhN)1dGG{lJv9-8*iRA=|@6wO=-MTvoJ&VV1SBx(<=>a}` zn_nPDw>j}lhca{!oyxrIMML2}*H=7*8zZTwe%XyYT2?PqFG#N$bX(5%wCj_zA&&7g z8bhne6TTlO9`{7%SZsaU%agzv#i}a){BpN>5S;$8T9}Kw*WCay`jt^nFt&o^Yl@YU z?sOx}n-tWtRos4vmaSp6P3;?^PD>;&c2ZE+;*zD|jqdVEgES0IyCR=Z#q7j|8I%2` zDopzO9yJrm$AKA(YvZeJk>FdWYs7vwPG>+}jV(x?=uS?aa9gL6dpawti|k=7 z>?&JLH?ow?bIij-lQe2%3WmkoGJ~0Y)5`fO_5698$?2cQMVMm%az^!rLL4cm3{S3i z&{ZTb>zRr9Q=u~iszFZ_d%gP+SI20HroDs-L@7exBQ7dC83+)`(_ggC(~Rf~(iZHc zRF%cSBZVtDF{!0;EGcJQoCVd+Ky`#k>B3ZD3%INNk8a1Jvd^6UO zB}09BB!x@FDcP-w8RBg7nq)Lo+blszAKX4__>j8Ur|7mh4g%jYmn~|?oWwyxZ$|;S z@sVPeMH5vqO#LN{ScSGMoHJ&{h)f+U5cQB&yc!;s1Z_|+rePIAQi0v&Yg_kz=F*FL z*W`HNmU%n~S8|2tudx9Y8A=@U28-RsQ+YA6oR@wPtdw>N<4p6HV2Uw332$lT38nD$ zic7rE>$44sg#0Y#Os>9`#7G$7mYM6h;sZgJA8j0*u85oEDCG=OyuSl^${Q5Pem1lt zI=A9}cs^sq;g}b&z7?;n+v5)md|$fZkM&JsM1zD~lgU5xRKwM^dR^`{>ALXpwT!xW ze3Tvx4q`|sKNJA-Zm`#MpLqz>X3}?g(`};b_b(K85CXP?#X_BZUg!9fdDvbYv^_A< zP+Z%Odm=k8IKA0Ni&SsDl?bjV(dI^Xm8h-PV7Q?uWEevjBlbS|7q}anZb>h%yUDR%Y9$r8*6rTgiw?jmCJYT`^*$ z47d70+>)am6%Vz(;nQVHXtv`Affd?e<9c=66DN97H+I5h9}h}%CtnRc HIDGbMM zB$+%5q0Lcb(!g%tldv^Nt|gpS6%liRPjF#=78%D8E2S|F1X5svUChhu0geKynU(^# z51UBCxNM|dChN~C^UfKAPD?DIbDim~$zAIN<@c7(1mj@jRcM>23?87q?Vc2IR=bWPWC4c|h=ujl=aGQ?!o! zHmpeZDX~o3UAW#SF3Oxq7iB{TS`+pj!8nKa!%`ukBBbYsp+Y>4fx;*sW(xkSaL9K` z*GKfRLb^{z^60p_^1=}G6uE!A{|y1}{d+Ua#`?PeFbovg2|<7GS{Zy`3;7mJY#n*@ zNCt{9xOapf`rm0mU$IaKerp;h!{Zz!ga6S&{?AusR!q<=6k+`sD1CwN5Z*9I@;`?5 zXGgz{hxfmSxD@M87zVjzBj|sDFX$f!pTi6J@3H*>`R(yD1vuR2e~+Gj{n=bn=8>jm zy&w1HTC09`^z1rsC zxl3Ra>CurG(03~~Ha|J;?^de3WlQ$Z;q>y1+&YD>o?X%yFCXGEG@&(>xgpCcaZyN^ zYB3ZKt#ckBl#B53g-yRfBw}X!CSiT~p}P)F960)v`~ zNINg!!+VRr^UIvMB^yeZA@fhSULhEP=sAf>|Eg~52n*Z6 zl>Gp~H+zK?Ftksab$zXS-t{PB?EmsUR-0Mb#FC9vtzzPenMTthB~$gf8A_&d z)l0GPl7!~mJ_Rui*+5bw?)P8$C*?36Q;GT^?{~^paURVdYzUnOG{qbL#bP`0y^Vv& zUo8HA`Txl!=HH$F-o@%ZJkL3Jp~}$Z=WI946%@(@VyrjoE?ku{C}OV*qU_Zf+QPCl zF3Xqac%9|--RX7Oo1|pY_f#+?@ePtTR@Tc;hw9g43M6w^L?&+VxmFAIm9+9YuRZ_r zqSUkF6P&b9nH?SGkGj#7NEfnq1eO`5I|uw%_DeS>3b%{3v@P2%eq|?fhNkuFmY{A7 zF*kSheN_$Xc~!hpnPm#DLKTj&6~1Sw*OeuK&D?e>Z%HYyTWk#7Zwt>+%B$1c!Lwv9 z4<8dR17_D1Dc_Wcwc>6Hp4@JAKxw%$=f`)h`u3Q;-GHV~#%5?!aqX|doL+KYcZYz_ z^qEwO^%_qMX!L}Z)*Gk^%iQ#qR#p)1tL2z8ExF2t;tvwqG3G&HJ1udUm0<2qoE{IZ zTiXz`AKEx|_5x+*)mNvF*>tZe{R^sftDDYR))sEjZd1Z7-zYra{y8~!21za{`JT1) zd=Ct~#|8dK&N&(A%Ka@gnKrFu)N{0j?umfc<$wzbh zRkx|JEty3Ho7;Z7p?f5T z=9X`1lRyx|tlPS<7!JsRkyDo2$Fy_@U}3c1iUKsa^&IJlgfiIk_xHr5BFM+m-iYl$ zr4d4l6F+mUm6+=($j4_Ns{470NJy@%)j4h3-_~BB&n#8d8Cx-$5C} z_tJ8C9bI#S--0r&@ynJ!>EHv-l$M-=Y}a>tiVAD9k#j{AXdTr~>O`QcnCl6bk)5A# zmLWvM$Y7R#2Eq5;M(%}jzTKPz7>-e*##l4k`iiYP(1p72F4(@;9*om~mJ_1rLJYBX z6FP;)9}3JM-9nZlqIHSDu%~Iv67H0$x+X*PQhE>= zF^NDm=#}uQi4_2$* zXnW{79)Zs{i7q`@Nb}^4EWI+;b9@10Bknzw81rPE3ob5nt6y~0e*y$sv(2}8Nt`^< zPSbxPJw_iLc-w^d^{5WPURyYOlMU7z$d?Dl)f19ZNDkjqBJx+PI*L^LMZ~8)5jtT% zGz*l6e^6blCqPUQmJa2&>hBTk5A!YwnsM0R<{Z|E?Ehe(Pcs07$iT;|g~L5{XGKi! zUl*{oSV}PIJ>Xm&s*Kp2OvQ}{M0i|^N^~y@PnAa6%Jnq|4!Rr~riFWHB8#KbhiOAO z3PuvPGHFgl9B&HOe#k?%s`1ekb=*(4NQAY6Rp1y9IdKLQO%pZ2k*&z#H~G@BY9mSD z^~0<7Y)BAwRW{pnl&Xsa)i}?Y68R>V3Q`WISlIt(cMQEV)&o(_MLwe5=$4$wR;pAiv7? zHd5v9J21hKl2t|s3yKo!ghXghQgyTq7D^UNBe4Yw6yu6)oSIg)u%R5b(r$^`@!_)Wf1YVy)*`#|0MQ(+TO1;xlYSvI_NgI1#a|a7SScDWnh8cDBXP>HIN>Q z@f7jpE`5=xg{;N-$a*ZPMb~1fv*?*EB=XRsy)jglDHdK=40?+jp4hq9-2o00!*$Ck@`|4Dt+k}sb+u4Jd8XX15;dfe}27g4-G6B z7ENx4jVP_LJxbVd@N%C+0&yR6d3D_Lvh4WzwvKD*Pap>(GQ4P|yiwebv5M#9c%qR* z3HcyR&%zhM!Re-WgZ>+Y@R3}KBA%L%Tm)4X3i6mH&X?V`G|qj!iSVV9kS3*E8yxCdNS zW2YKe*?!pb2f^Tg=W=4P7j|M=h0&sK85o8ABv_K1zOq=<&t0sx{&B~+-JO?lL+gMm z?ls>Fla_%4&QQ&ZapBZ=sy23ZR-yfkitrZMKLnNSL?1Fpt(m8`jVs*&M!q2B4e2G+ z75z=FNqKbl8b)d#IVX_rf_A(Yr~TJ?h+pCVSq%9X7y!6}{S*HGQ5yLxr(f&g{^G^< zelp`9tK)uU@oP1~Uo5!M|77v^+Jax^33k?AH(*pqi requests +// .requestMatchers("/user/lotteries/**").permitAll() +// .requestMatchers(HttpMethod.POST, "/admin/lotteries").hasAuthority("ADMIN_CREATE") +// .requestMatchers(HttpMethod.GET, "/admin/lotteries").hasAuthority("ADMIN_READ") +// .anyRequest().authenticated() +// ) +// .httpBasic(withDefaults()) +// .build(); +// } +// +// @Bean +// public PasswordEncoder passwordEncoder() { +// return new BCryptPasswordEncoder(); +// } +// +// @Bean +// public UserDetailsService userDetailsService() { +// BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(); +// +// UserDetails user = User.withUsername("admin") +// .password(encoder.encode("password")) +// .authorities("ADMIN_CREATE", "ADMIN_READ") +// .build(); +// +// return new InMemoryUserDetailsManager(user); +// } +// +//} diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/AdminLotteryController.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/AdminLotteryController.java new file mode 100644 index 00000000..71b8a77d --- /dev/null +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/AdminLotteryController.java @@ -0,0 +1,47 @@ +package com.kbtg.bootcamp.posttest.controller; + +import com.kbtg.bootcamp.posttest.entity.LotteryEntity; +import com.kbtg.bootcamp.posttest.service.impl.ImpLotteryService; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/admin/lotteries") +public class AdminLotteryController { + + private final ImpLotteryService impLotteryService; + + public AdminLotteryController(ImpLotteryService ImpLotteryService) { + this.impLotteryService = ImpLotteryService; + } + + @GetMapping("") + public List findAllLottery() { + return impLotteryService.findAllLottery(); + } + + // @GetMapping("/{id}") +// public Optional findLotteryById(@PathVariable("id") Long id) { +// return ILotteryService.findLotteryById(id); +// } + + @PostMapping("") + public LotteryEntity addLottery(@RequestBody LotteryEntity lotteryEntity) { + + impLotteryService.saveLottery(lotteryEntity); + return lotteryEntity; + } + + +// @PutMapping("") +// public LotteryEntity updateLottery(@RequestBody LotteryEntity lotteryEntity) { +// return ILotteryService.updateLottery(lotteryEntity); +// } + + + @DeleteMapping("/{id}") + public void deleteLotteryById(@PathVariable("id") Long id) { + impLotteryService.deleteLottery(id); + } +} diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/LotteryController.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/LotteryController.java deleted file mode 100644 index d7f6f9c0..00000000 --- a/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/LotteryController.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.kbtg.bootcamp.posttest.controller; - -import com.kbtg.bootcamp.posttest.entity.LotteryEntity; -import com.kbtg.bootcamp.posttest.service.LotteryService; -import org.springframework.web.bind.annotation.*; - -import java.util.List; -import java.util.Optional; - -@RestController -@RequestMapping("/lottery") -public class LotteryController { - - private final LotteryService lotteryService; - - public LotteryController(LotteryService lotteryService) { - this.lotteryService = lotteryService; - } - - @GetMapping("") - public List findAllLottery() { - return lotteryService.findAllLottery(); - } - - @GetMapping("/{id}") - public Optional findLotteryById(@PathVariable("id") Long id) { - return lotteryService.findLotteryById(id); - - } - @PostMapping("") - public LotteryEntity saveLottery(@RequestBody LotteryEntity lotteryEntity) { - return lotteryService.saveLottery(lotteryEntity); - } - - - @PutMapping("") - public LotteryEntity updateLottery(@RequestBody LotteryEntity lotteryEntity) { - return lotteryService.updateLottery(lotteryEntity); - } - - - @DeleteMapping("/{id}") - public void deleteLotteryById(@PathVariable("id")Long id) { - lotteryService.deleteLottery(id); - } -} diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/UserLotteryController.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/UserLotteryController.java new file mode 100644 index 00000000..429526ec --- /dev/null +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/UserLotteryController.java @@ -0,0 +1,58 @@ +package com.kbtg.bootcamp.posttest.controller; + +import com.kbtg.bootcamp.posttest.entity.LotteryEntity; +import com.kbtg.bootcamp.posttest.entity.UserTicketEntity; +import com.kbtg.bootcamp.posttest.repository.UserTicketRepository; +import com.kbtg.bootcamp.posttest.service.impl.ImpLotteryService; +import com.kbtg.bootcamp.posttest.service.impl.ImpTicketService; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Optional; + +@RestController +@RequestMapping("/user/lotteries") +public class UserLotteryController { + + private final ImpLotteryService impLotteryService; + private final ImpTicketService impTicketService; + + public UserLotteryController(ImpLotteryService ImpLotteryService, ImpTicketService impTicketService) { + this.impLotteryService = ImpLotteryService; + this.impTicketService = impTicketService; + } + + @GetMapping("") + public List findAllLottery() { + return impLotteryService.findAllLottery(); + } + + @GetMapping("/{id}") + public Optional findLotteryById(@PathVariable("id") Long id) { + return impLotteryService.findLotteryById(id); + } + + @PostMapping("") + public void buyLottery(@RequestBody UserTicketEntity userTicketEntity) { + // update true/false +// impLotteryService.updateLottery(userTicketEntity.getTicket(), true); + + // insert ticket to table user ticket + impTicketService.buyLottery(userTicketEntity); + + + + return; + } + + +// @PutMapping("") +// public LotteryEntity updateLottery(@RequestBody LotteryEntity lotteryEntity) { +// return ILotteryService.updateLottery(lotteryEntity); +// } + + @DeleteMapping("/{id}") + public void deleteLotteryById(@PathVariable("id")Long id) { + impLotteryService.deleteLottery(id); + } +} diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/entity/LotteryEntity.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/entity/LotteryEntity.java index cf84539f..74692ac9 100644 --- a/posttest/src/main/java/com/kbtg/bootcamp/posttest/entity/LotteryEntity.java +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/entity/LotteryEntity.java @@ -13,15 +13,16 @@ public class LotteryEntity { private String ticket; private int price; private int amount; - + private boolean status; public LotteryEntity() { } - public LotteryEntity(String ticket, int price, int amount) { + public LotteryEntity(String ticket, int price, int amount, boolean status) { this.ticket = ticket; this.price = price; this.amount = amount; + this.status = status; } public String getTicket() { @@ -47,4 +48,12 @@ public int getAmount() { public void setAmount(int amount) { this.amount = amount; } + + public boolean isStatus() { + return status; + } + + public void setStatus(boolean status) { + this.status = status; + } } diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/entity/UserLoginEntity.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/entity/UserLoginEntity.java new file mode 100644 index 00000000..152b6c2a --- /dev/null +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/entity/UserLoginEntity.java @@ -0,0 +1,46 @@ +package com.kbtg.bootcamp.posttest.entity; + + +import jakarta.persistence.*; + +import java.util.List; + +@Entity +@Table(name = "user_login") +public class UserLoginEntity { + + @Id + private String User_Id; + private String Name; + + +// @OneToMany(mappedBy = "User_Id") +// private List userTickets; + + + public UserLoginEntity() { + } + + public UserLoginEntity(String user_Id, String name) { + User_Id = user_Id; + Name = name; + } + + public String getUser_Id() { + return User_Id; + } + + public void setUser_Id(String user_Id) { + User_Id = user_Id; + } + + public String getName() { + return Name; + } + + public void setName(String name) { + Name = name; + } +} + + diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/entity/UserTicketEntity.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/entity/UserTicketEntity.java new file mode 100644 index 00000000..13e86c91 --- /dev/null +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/entity/UserTicketEntity.java @@ -0,0 +1,71 @@ +package com.kbtg.bootcamp.posttest.entity; + +import jakarta.persistence.*; + +@Entity +@Table(name = "user_ticket") +public class UserTicketEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + @Column(name = "User_Id", insertable = false, updatable = false) + private String User_Id; + private String ticket; + private int price; + private int amount; + +// @ManyToOne +// @JoinColumn(name = "User_Id") +// private UserLoginEntity userLoginEntity; + + public UserTicketEntity() { + } + + public UserTicketEntity(int id, String user_Id, String ticket, int price, int amount) { + this.id = id; + User_Id = user_Id; + this.ticket = ticket; + this.price = price; + this.amount = amount; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getUser_Id() { + return User_Id; + } + + public void setUser_Id(String user_Id) { + User_Id = user_Id; + } + + public String getTicket() { + return ticket; + } + + public void setTicket(String ticket) { + this.ticket = ticket; + } + + public int getPrice() { + return price; + } + + public void setPrice(int price) { + this.price = price; + } + + public int getAmount() { + return amount; + } + + public void setAmount(int amount) { + this.amount = amount; + } +} diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/repository/LotteryRepository.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/repository/LotteryRepository.java index a5de7346..89be8634 100644 --- a/posttest/src/main/java/com/kbtg/bootcamp/posttest/repository/LotteryRepository.java +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/repository/LotteryRepository.java @@ -2,11 +2,22 @@ import com.kbtg.bootcamp.posttest.entity.LotteryEntity; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @Repository +//@EnableJpaRepositories public interface LotteryRepository extends JpaRepository { + @Query(value = "update lottery set status = :active where ticket = :ticket", nativeQuery = true) + void updateLottery(String ticket, boolean active); + + +// void updateLottery(@Param("ticketId") Long id, @Param("status") boolean active); + } diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/repository/UserLoginRepository.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/repository/UserLoginRepository.java new file mode 100644 index 00000000..a64037bb --- /dev/null +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/repository/UserLoginRepository.java @@ -0,0 +1,13 @@ +package com.kbtg.bootcamp.posttest.repository; + +import com.kbtg.bootcamp.posttest.entity.UserLoginEntity; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + + +@Repository +public interface UserLoginRepository extends JpaRepository { + +// @Query("update Customer c set c.name = :name WHERE c.id = :customerId") +// void setCustomerName(@Param("customerId") Long id, @Param("name") String name); +} diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/repository/UserTicketRepository.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/repository/UserTicketRepository.java new file mode 100644 index 00000000..33447899 --- /dev/null +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/repository/UserTicketRepository.java @@ -0,0 +1,12 @@ +package com.kbtg.bootcamp.posttest.repository; + +import com.kbtg.bootcamp.posttest.entity.UserTicketEntity; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + + +@Repository +public interface UserTicketRepository extends JpaRepository { + + +} diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/ILotteryService.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/ILotteryService.java deleted file mode 100644 index dade03b4..00000000 --- a/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/ILotteryService.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.kbtg.bootcamp.posttest.service; - -import com.kbtg.bootcamp.posttest.entity.LotteryEntity; -import com.kbtg.bootcamp.posttest.repository.LotteryRepository; -import org.springframework.stereotype.Service; - -import java.util.List; -import java.util.Optional; - -@Service -public class ILotteryService implements LotteryService{ - - private final LotteryRepository lotteryRepository; - - public ILotteryService(LotteryRepository lotteryRepository) { - this.lotteryRepository = lotteryRepository; - } - - @Override - public List findAllLottery() { - return lotteryRepository.findAll(); - } - - @Override - public Optional findLotteryById(Long id) { - return lotteryRepository.findById(id); - } - - @Override - public LotteryEntity saveLottery(LotteryEntity lotteryEntity) { - return lotteryRepository.save(lotteryEntity); - } - - @Override - public LotteryEntity updateLottery(LotteryEntity lotteryEntity) { - return lotteryRepository.save(lotteryEntity); - } - - @Override - public void deleteLottery(Long id) { - lotteryRepository.deleteById(id); - } -} diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/LotteryService.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/LotteryService.java index da929967..045ce854 100644 --- a/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/LotteryService.java +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/LotteryService.java @@ -1,16 +1,45 @@ package com.kbtg.bootcamp.posttest.service; - import com.kbtg.bootcamp.posttest.entity.LotteryEntity; +import com.kbtg.bootcamp.posttest.repository.LotteryRepository; +import com.kbtg.bootcamp.posttest.service.impl.ImpLotteryService; +import org.springframework.stereotype.Service; import java.util.List; import java.util.Optional; -public interface LotteryService { - List findAllLottery(); - Optional findLotteryById(Long id); - LotteryEntity saveLottery(LotteryEntity lotteryEntity); - LotteryEntity updateLottery(LotteryEntity lotteryEntity); - void deleteLottery(Long id); +@Service +public class LotteryService implements ImpLotteryService { + + private final LotteryRepository lotteryRepository; + + public LotteryService(LotteryRepository lotteryRepository) { + this.lotteryRepository = lotteryRepository; + } + + @Override + public List findAllLottery() { + return lotteryRepository.findAll(); + } + + @Override + public Optional findLotteryById(Long id) { + return lotteryRepository.findById(id); + } + + @Override + public LotteryEntity saveLottery(LotteryEntity lotteryEntity) { + return lotteryRepository.save(lotteryEntity); + } + + @Override + public void deleteLottery(Long id) { + lotteryRepository.deleteById(id); + } + + @Override + public void updateLottery(String ticketId, boolean active) { + lotteryRepository.updateLottery(ticketId, active); + } } diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/TicketService.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/TicketService.java new file mode 100644 index 00000000..95c85185 --- /dev/null +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/TicketService.java @@ -0,0 +1,27 @@ +package com.kbtg.bootcamp.posttest.service; + +import com.kbtg.bootcamp.posttest.entity.UserTicketEntity; +import com.kbtg.bootcamp.posttest.repository.UserTicketRepository; +import com.kbtg.bootcamp.posttest.service.impl.ImpTicketService; +import org.springframework.stereotype.Service; + +@Service +public class TicketService implements ImpTicketService { + + private final UserTicketRepository userTicketRepository; + + public TicketService(UserTicketRepository userTicketRepository) { + this.userTicketRepository = userTicketRepository; + } + + @Override + public UserTicketEntity buyLottery(UserTicketEntity userTicketEntity) { + return userTicketRepository.save(userTicketEntity); + + } + +// @Override +// public String refundLottery(String ticket,String UserId) { +// return userTicketRepository.deleteById(ticket); +// } +} diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/impl/ImpLotteryService.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/impl/ImpLotteryService.java new file mode 100644 index 00000000..bd8c6d29 --- /dev/null +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/impl/ImpLotteryService.java @@ -0,0 +1,18 @@ +package com.kbtg.bootcamp.posttest.service.impl; + + +import com.kbtg.bootcamp.posttest.entity.LotteryEntity; + +import java.util.List; +import java.util.Optional; + +public interface ImpLotteryService { + List findAllLottery(); + Optional findLotteryById(Long id); + LotteryEntity saveLottery(LotteryEntity lotteryEntity); +// LotteryEntity updateLottery(LotteryEntity lotteryEntity); + void deleteLottery(Long id); + + void updateLottery(String ticketId, boolean active); + +} diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/impl/ImpTicketService.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/impl/ImpTicketService.java new file mode 100644 index 00000000..597db584 --- /dev/null +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/impl/ImpTicketService.java @@ -0,0 +1,13 @@ +package com.kbtg.bootcamp.posttest.service.impl; + + +import com.kbtg.bootcamp.posttest.entity.UserTicketEntity; + +public interface ImpTicketService { + + UserTicketEntity buyLottery(UserTicketEntity userTicketEntity); + +// void refundLottery(Long id); + + +} diff --git a/posttest/src/main/resources/application.properties b/posttest/src/main/resources/application.properties index 03968775..b09091c2 100644 --- a/posttest/src/main/resources/application.properties +++ b/posttest/src/main/resources/application.properties @@ -1,5 +1,5 @@ server.port=8888 -spring.datasource.url=jdbc:postgresql://localhost:5432/lottery +spring.datasource.url=jdbc:postgresql://localhost:5432/lotteryDB spring.datasource.username=postgres spring.datasource.password=Watermal0n spring.jpa.hibernate.ddl-auto=validate @@ -10,3 +10,8 @@ spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect # JPA & Hibernate Configuration #spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect + + +# Security Configuration +#spring.security.user.name=admin +#spring.security.user.password=password \ No newline at end of file From b83ee739c817116ac836c214a90062f9bf2aba92 Mon Sep 17 00:00:00 2001 From: pongkorn Date: Thu, 22 Feb 2024 23:31:42 +0700 Subject: [PATCH 03/11] authentication finished --- posttest/build.gradle | 5 +- .../posttest/PosttestApplication.java | 1 + .../bootcamp/posttest/SecurityConfig.java | 119 +++++++++--------- .../controller/AdminLotteryController.java | 29 ++--- .../controller/UserLotteryController.java | 105 +++++++++++----- .../posttest/entity/LotteryEntity.java | 4 +- .../posttest/entity/UserLoginEntity.java | 46 ------- .../posttest/entity/UserTicketEntity.java | 20 ++- .../repository/LotteryRepository.java | 13 +- .../repository/UserLoginRepository.java | 13 -- .../repository/UserTicketRepository.java | 31 +++++ .../posttest/service/LotteryService.java | 33 ++--- .../posttest/service/TicketService.java | 27 ---- .../posttest/service/UserTicketService.java | 38 ++++++ .../service/impl/ImpLotteryService.java | 14 ++- .../service/impl/ImpTicketService.java | 13 -- .../service/impl/ImpUserTicketService.java | 16 +++ .../src/main/resources/application.properties | 2 +- 18 files changed, 283 insertions(+), 246 deletions(-) delete mode 100644 posttest/src/main/java/com/kbtg/bootcamp/posttest/entity/UserLoginEntity.java delete mode 100644 posttest/src/main/java/com/kbtg/bootcamp/posttest/repository/UserLoginRepository.java delete mode 100644 posttest/src/main/java/com/kbtg/bootcamp/posttest/service/TicketService.java create mode 100644 posttest/src/main/java/com/kbtg/bootcamp/posttest/service/UserTicketService.java delete mode 100644 posttest/src/main/java/com/kbtg/bootcamp/posttest/service/impl/ImpTicketService.java create mode 100644 posttest/src/main/java/com/kbtg/bootcamp/posttest/service/impl/ImpUserTicketService.java diff --git a/posttest/build.gradle b/posttest/build.gradle index e6f7444d..5d2b6d70 100644 --- a/posttest/build.gradle +++ b/posttest/build.gradle @@ -29,9 +29,8 @@ dependencies { annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' -// implementation 'org.springframework.boot:spring-boot-starter-security' -// testImplementation 'org.springframework.security:spring-security-test' - + implementation 'org.springframework.boot:spring-boot-starter-security' + testImplementation 'org.springframework.security:spring-security-test' } diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/PosttestApplication.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/PosttestApplication.java index 5e8f2f6c..74c47678 100644 --- a/posttest/src/main/java/com/kbtg/bootcamp/posttest/PosttestApplication.java +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/PosttestApplication.java @@ -10,6 +10,7 @@ public static void main(String[] args) { SpringApplication.run(PosttestApplication.class, args); System.out.println("START API SUCCESS!!!"); System.out.println("START API SUCCESS!!!"); + System.out.println("START API SUCCESS!!!"); } diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/SecurityConfig.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/SecurityConfig.java index eaf436e5..fcbff840 100644 --- a/posttest/src/main/java/com/kbtg/bootcamp/posttest/SecurityConfig.java +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/SecurityConfig.java @@ -1,60 +1,59 @@ -//package com.kbtg.bootcamp.posttest; -// -//import org.springframework.boot.autoconfigure.security.SecurityProperties; -//import org.springframework.context.annotation.Bean; -//import org.springframework.context.annotation.Configuration; -//import org.springframework.core.annotation.Order; -//import org.springframework.http.HttpMethod; -//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.WebSecurityConfiguration; -//import org.springframework.security.core.userdetails.User; -//import org.springframework.security.core.userdetails.UserDetails; -//import org.springframework.security.core.userdetails.UserDetailsService; -//import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; -//import org.springframework.security.crypto.password.PasswordEncoder; -//import org.springframework.security.provisioning.InMemoryUserDetailsManager; -//import org.springframework.security.web.SecurityFilterChain; -//import org.springframework.stereotype.Component; -// -// -//import static org.springframework.security.config.Customizer.withDefaults; -// -//@Component -//@EnableWebSecurity -////@Configuration -//public class SecurityConfig { -// -// -// @Bean -// SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception { -// return http -// .authorizeHttpRequests((requests) -> requests -// .requestMatchers("/user/lotteries/**").permitAll() -// .requestMatchers(HttpMethod.POST, "/admin/lotteries").hasAuthority("ADMIN_CREATE") -// .requestMatchers(HttpMethod.GET, "/admin/lotteries").hasAuthority("ADMIN_READ") -// .anyRequest().authenticated() -// ) -// .httpBasic(withDefaults()) -// .build(); -// } -// -// @Bean -// public PasswordEncoder passwordEncoder() { -// return new BCryptPasswordEncoder(); -// } -// -// @Bean -// public UserDetailsService userDetailsService() { -// BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(); -// -// UserDetails user = User.withUsername("admin") -// .password(encoder.encode("password")) -// .authorities("ADMIN_CREATE", "ADMIN_READ") -// .build(); -// -// return new InMemoryUserDetailsManager(user); -// } -// -//} +package com.kbtg.bootcamp.posttest; + +import org.springframework.boot.autoconfigure.security.SecurityProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +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.WebSecurityConfiguration; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.provisioning.InMemoryUserDetailsManager; +import org.springframework.security.web.SecurityFilterChain; +import org.springframework.stereotype.Component; +import static org.springframework.security.config.Customizer.withDefaults; + +@Component +@EnableWebSecurity +@Configuration +public class SecurityConfig { + + @Bean + SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception { + return http + .csrf(httpSecurityCsrfConfigurer -> httpSecurityCsrfConfigurer.disable()) + .authorizeHttpRequests((requests) -> requests +// .requestMatchers("/users/lotteries/**").permitAll() + .requestMatchers("/users/**").permitAll() + .requestMatchers(HttpMethod.POST, "/admin/lotteries").hasAuthority("ADMIN_CREATE") + .requestMatchers(HttpMethod.GET, "/admin/lotteries").hasAuthority("ADMIN_READ") + .anyRequest().authenticated() + ) + .httpBasic(withDefaults()) + .build(); + } + + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } + + @Bean + public UserDetailsService userDetailsService() { + BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(); + + UserDetails user = User.withUsername("admin") + .password(encoder.encode("password")) + .authorities("ADMIN_CREATE", "ADMIN_READ") + .build(); + + return new InMemoryUserDetailsManager(user); + } + +} diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/AdminLotteryController.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/AdminLotteryController.java index 71b8a77d..fc3968d4 100644 --- a/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/AdminLotteryController.java +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/AdminLotteryController.java @@ -12,36 +12,33 @@ public class AdminLotteryController { private final ImpLotteryService impLotteryService; - public AdminLotteryController(ImpLotteryService ImpLotteryService) { - this.impLotteryService = ImpLotteryService; + public AdminLotteryController(ImpLotteryService impLotteryService) { + this.impLotteryService = impLotteryService; } @GetMapping("") public List findAllLottery() { - return impLotteryService.findAllLottery(); + return impLotteryService.getAllLottery(); } - // @GetMapping("/{id}") -// public Optional findLotteryById(@PathVariable("id") Long id) { -// return ILotteryService.findLotteryById(id); -// } - @PostMapping("") - public LotteryEntity addLottery(@RequestBody LotteryEntity lotteryEntity) { - - impLotteryService.saveLottery(lotteryEntity); + public LotteryEntity addLotteryToStore(@RequestBody LotteryEntity lotteryEntity) { + impLotteryService.addLotteryToStore(lotteryEntity); return lotteryEntity; } +// @GetMapping("/{id}") +// public Optional findLotteryById(@PathVariable("id") Long id) { +// return ILotteryService.findLotteryById(id); +// } // @PutMapping("") // public LotteryEntity updateLottery(@RequestBody LotteryEntity lotteryEntity) { // return ILotteryService.updateLottery(lotteryEntity); // } - - @DeleteMapping("/{id}") - public void deleteLotteryById(@PathVariable("id") Long id) { - impLotteryService.deleteLottery(id); - } +// @DeleteMapping("/{id}") +// public void deleteLotteryById(@PathVariable("id") Long id) { +// impLotteryService.deleteLottery(id); +// } } diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/UserLotteryController.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/UserLotteryController.java index 429526ec..b0fb60b5 100644 --- a/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/UserLotteryController.java +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/UserLotteryController.java @@ -2,57 +2,104 @@ import com.kbtg.bootcamp.posttest.entity.LotteryEntity; import com.kbtg.bootcamp.posttest.entity.UserTicketEntity; -import com.kbtg.bootcamp.posttest.repository.UserTicketRepository; +import com.kbtg.bootcamp.posttest.service.UserTicketService; import com.kbtg.bootcamp.posttest.service.impl.ImpLotteryService; -import com.kbtg.bootcamp.posttest.service.impl.ImpTicketService; +import com.kbtg.bootcamp.posttest.service.impl.ImpUserTicketService; import org.springframework.web.bind.annotation.*; +import java.util.Collections; import java.util.List; -import java.util.Optional; @RestController -@RequestMapping("/user/lotteries") public class UserLotteryController { private final ImpLotteryService impLotteryService; - private final ImpTicketService impTicketService; + private final ImpUserTicketService impUserTicketService; - public UserLotteryController(ImpLotteryService ImpLotteryService, ImpTicketService impTicketService) { - this.impLotteryService = ImpLotteryService; - this.impTicketService = impTicketService; - } - @GetMapping("") - public List findAllLottery() { - return impLotteryService.findAllLottery(); + public UserLotteryController(ImpLotteryService impLotteryService, ImpUserTicketService impUserTicketService) { + this.impLotteryService = impLotteryService; + this.impUserTicketService = impUserTicketService; } - @GetMapping("/{id}") - public Optional findLotteryById(@PathVariable("id") Long id) { - return impLotteryService.findLotteryById(id); + @GetMapping("/users/lotteries") + public List getRemainLotteryFromStore() { + + try { + List lotteryRemain = impLotteryService.getRemainLotteryFromStore(); + if (lotteryRemain == null) { + + return Collections.emptyList(); + + } else { + + return lotteryRemain; + } + + } catch (Exception e) { + + throw new RuntimeException(e); + } + } - @PostMapping("") - public void buyLottery(@RequestBody UserTicketEntity userTicketEntity) { - // update true/false -// impLotteryService.updateLottery(userTicketEntity.getTicket(), true); + @GetMapping("/users/lotteries/{id}") + public List getAllOwnLotteryFromUser(@PathVariable("id") String user_Id) { + + try { + + List ownLottery = impUserTicketService.getAllOwnLotteryFromUser(user_Id); + if (ownLottery == null) { - // insert ticket to table user ticket - impTicketService.buyLottery(userTicketEntity); + return Collections.emptyList(); + } else { + return ownLottery; + } + } catch (Exception e) { + throw new RuntimeException(e); + + } - return; } + @PostMapping("/users/lotteries") + public UserTicketEntity buyLotteryFromStore(@RequestBody UserTicketEntity userTicketEntity) { + +// impLotteryService.updateStatusLottery(userTicketEntity.getTicket(), true); // error wait for fix -// @PutMapping("") -// public LotteryEntity updateLottery(@RequestBody LotteryEntity lotteryEntity) { -// return ILotteryService.updateLottery(lotteryEntity); -// } + UserTicketEntity userTicketEntity1 = impUserTicketService.buyLotteryFromStore(userTicketEntity); - @DeleteMapping("/{id}") - public void deleteLotteryById(@PathVariable("id")Long id) { - impLotteryService.deleteLottery(id); + return userTicketEntity1; + } + + + @DeleteMapping("/users/{userid}/lotteries/{ticket}") + public void refundLotteryToStore(@PathVariable String userid, @PathVariable String ticket) { + + + impUserTicketService.refundLotteryToStore(userid, ticket); } } + + +// public String getRemainLotteryAsJson() { +// List lotteryList = getRemainLottery(); +// Map result = new HashMap<>(); +// if (lotteryList == null) { +// // If lotteryList is null, create a JSON object with specific key-value pairs +// result.put("Id", 1); +// result.put("userid", "mo"); +// } else { +// // If lotteryList is not null, serialize it to JSON +// result.put("lotteryList", lotteryList); +// } +// try { +// ObjectMapper objectMapper = new ObjectMapper(); +// return objectMapper.writeValueAsString(result); +// } catch (JsonProcessingException e) { +// // Handle the exception if JSON serialization fails +// e.printStackTrace(); +// return "Error occurred while converting to JSON"; +// } \ No newline at end of file diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/entity/LotteryEntity.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/entity/LotteryEntity.java index 74692ac9..bf661e1b 100644 --- a/posttest/src/main/java/com/kbtg/bootcamp/posttest/entity/LotteryEntity.java +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/entity/LotteryEntity.java @@ -8,14 +8,14 @@ @Table(name = "lottery") public class LotteryEntity { - // properties + @Id private String ticket; private int price; private int amount; private boolean status; - public LotteryEntity() { + public LotteryEntity() { } public LotteryEntity(String ticket, int price, int amount, boolean status) { diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/entity/UserLoginEntity.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/entity/UserLoginEntity.java deleted file mode 100644 index 152b6c2a..00000000 --- a/posttest/src/main/java/com/kbtg/bootcamp/posttest/entity/UserLoginEntity.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.kbtg.bootcamp.posttest.entity; - - -import jakarta.persistence.*; - -import java.util.List; - -@Entity -@Table(name = "user_login") -public class UserLoginEntity { - - @Id - private String User_Id; - private String Name; - - -// @OneToMany(mappedBy = "User_Id") -// private List userTickets; - - - public UserLoginEntity() { - } - - public UserLoginEntity(String user_Id, String name) { - User_Id = user_Id; - Name = name; - } - - public String getUser_Id() { - return User_Id; - } - - public void setUser_Id(String user_Id) { - User_Id = user_Id; - } - - public String getName() { - return Name; - } - - public void setName(String name) { - Name = name; - } -} - - diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/entity/UserTicketEntity.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/entity/UserTicketEntity.java index 13e86c91..99b9dfa8 100644 --- a/posttest/src/main/java/com/kbtg/bootcamp/posttest/entity/UserTicketEntity.java +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/entity/UserTicketEntity.java @@ -1,5 +1,6 @@ package com.kbtg.bootcamp.posttest.entity; + import jakarta.persistence.*; @Entity @@ -8,22 +9,19 @@ public class UserTicketEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; - @Column(name = "User_Id", insertable = false, updatable = false) - private String User_Id; +// @Column(name = "user_Id", insertable = false, updatable = false) + private String userid; private String ticket; private int price; private int amount; -// @ManyToOne -// @JoinColumn(name = "User_Id") -// private UserLoginEntity userLoginEntity; public UserTicketEntity() { } - public UserTicketEntity(int id, String user_Id, String ticket, int price, int amount) { + public UserTicketEntity(int id, String userid, String ticket, int price, int amount) { this.id = id; - User_Id = user_Id; + this.userid = userid; this.ticket = ticket; this.price = price; this.amount = amount; @@ -37,12 +35,12 @@ public void setId(int id) { this.id = id; } - public String getUser_Id() { - return User_Id; + public String getUserid() { + return userid; } - public void setUser_Id(String user_Id) { - User_Id = user_Id; + public void setUserid(String userid) { + this.userid = userid; } public String getTicket() { diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/repository/LotteryRepository.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/repository/LotteryRepository.java index 89be8634..7ec20a29 100644 --- a/posttest/src/main/java/com/kbtg/bootcamp/posttest/repository/LotteryRepository.java +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/repository/LotteryRepository.java @@ -1,6 +1,7 @@ package com.kbtg.bootcamp.posttest.repository; import com.kbtg.bootcamp.posttest.entity.LotteryEntity; +import com.kbtg.bootcamp.posttest.entity.UserTicketEntity; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; @@ -8,16 +9,20 @@ import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; +import java.util.List; + @Repository //@EnableJpaRepositories public interface LotteryRepository extends JpaRepository { - - @Query(value = "update lottery set status = :active where ticket = :ticket", nativeQuery = true) - void updateLottery(String ticket, boolean active); + //todo USE FOR USER to get remain lottery from store + @Query(value = "SELECT * FROM lottery where status = false", nativeQuery = true) + List getRemainLotteryFromStore(); -// void updateLottery(@Param("ticketId") Long id, @Param("status") boolean active); + //todo USE FOR UPDATE STATUS THAT ALREADY BOUGHT OR NOT + @Query(value = "update lottery set status = true where ticket = '3'", nativeQuery = true) + void updateStatusLottery(String ticket, boolean status); } diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/repository/UserLoginRepository.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/repository/UserLoginRepository.java deleted file mode 100644 index a64037bb..00000000 --- a/posttest/src/main/java/com/kbtg/bootcamp/posttest/repository/UserLoginRepository.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.kbtg.bootcamp.posttest.repository; - -import com.kbtg.bootcamp.posttest.entity.UserLoginEntity; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - - -@Repository -public interface UserLoginRepository extends JpaRepository { - -// @Query("update Customer c set c.name = :name WHERE c.id = :customerId") -// void setCustomerName(@Param("customerId") Long id, @Param("name") String name); -} diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/repository/UserTicketRepository.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/repository/UserTicketRepository.java index 33447899..74eef39c 100644 --- a/posttest/src/main/java/com/kbtg/bootcamp/posttest/repository/UserTicketRepository.java +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/repository/UserTicketRepository.java @@ -1,12 +1,43 @@ package com.kbtg.bootcamp.posttest.repository; import com.kbtg.bootcamp.posttest.entity.UserTicketEntity; +import jakarta.transaction.Transactional; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; +import java.util.List; + @Repository public interface UserTicketRepository extends JpaRepository { + @Query(value = "SELECT * FROM user_ticket WHERE userid = :user_Id", nativeQuery = true) + List getAllOwnLotteryFromUser(String user_Id); + + +// @Transactional +// @Modifying +// @Query(value = "DELETE * FROM user_ticket WHERE userid = :userId", nativeQuery = true) +// void refundLotteryToStore(String userId); + +// @Modifying +// @Query(value = "DELETE * FROM user_ticket WHERE userid = :userId AND ticket = :ticketId") +// void refundLotteryToStore(String userId, String ticketId); + + @Transactional + @Modifying + @Query("DELETE FROM UserTicketEntity ut WHERE ut.userid = :userid AND ut.ticket = :ticket") + void refundLotteryToStore(@Param("userid") String userid, @Param("ticket") String ticket); + + +// @Modifying +// @Query(value = "DELETE FROM UserTicketEntity ut WHERE ut.user_Id = :userId AND ut.ticket = :ticketId") +// void refundLotteryToStore(@Param("userId") String userId, @Param("ticketId") String ticketId); + +// @Query(value = "DELETE FROM user_ticket WHERE userid = :user_Id", nativeQuery = true) +// void refundLotteryToStore(@Param("user_Id") String user_Id); } diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/LotteryService.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/LotteryService.java index 045ce854..f96f28e9 100644 --- a/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/LotteryService.java +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/LotteryService.java @@ -3,6 +3,7 @@ import com.kbtg.bootcamp.posttest.entity.LotteryEntity; import com.kbtg.bootcamp.posttest.repository.LotteryRepository; import com.kbtg.bootcamp.posttest.service.impl.ImpLotteryService; +import org.apache.tomcat.util.net.openssl.ciphers.Authentication; import org.springframework.stereotype.Service; import java.util.List; @@ -18,28 +19,30 @@ public LotteryService(LotteryRepository lotteryRepository) { this.lotteryRepository = lotteryRepository; } - @Override - public List findAllLottery() { + @Override //todo USE BY ADMIN for list all lottery that exist, no consider where is it now + public List getAllLottery() { return lotteryRepository.findAll(); } - @Override - public Optional findLotteryById(Long id) { - return lotteryRepository.findById(id); - } - - @Override - public LotteryEntity saveLottery(LotteryEntity lotteryEntity) { + @Override //todo USE BY ADMIN for add lottery to the store + public LotteryEntity addLotteryToStore(LotteryEntity lotteryEntity) { return lotteryRepository.save(lotteryEntity); } - @Override - public void deleteLottery(Long id) { - lotteryRepository.deleteById(id); + @Override //todo USE BY ADMIN for list all lottery that still available in the shop + public List getRemainLotteryFromStore() { + return lotteryRepository.getRemainLotteryFromStore(); } - @Override - public void updateLottery(String ticketId, boolean active) { - lotteryRepository.updateLottery(ticketId, active); +// @Override //todo USE BY USER refund lottery to store +// public void refundLotteryToStore(Long id) { +// lotteryRepository.deleteById(id); +// } + + @Override //todo USE FOR STATUS CHECK THAT IS ALREADY BOUGHT OR NOT + public void updateStatusLottery(String ticketId, boolean status) { + lotteryRepository.updateStatusLottery(ticketId, status); } +// public int updateStatusLottery(String ticketId, boolean status) +// return lotteryRepository.updateLottery(ticketId, status); } diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/TicketService.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/TicketService.java deleted file mode 100644 index 95c85185..00000000 --- a/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/TicketService.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.kbtg.bootcamp.posttest.service; - -import com.kbtg.bootcamp.posttest.entity.UserTicketEntity; -import com.kbtg.bootcamp.posttest.repository.UserTicketRepository; -import com.kbtg.bootcamp.posttest.service.impl.ImpTicketService; -import org.springframework.stereotype.Service; - -@Service -public class TicketService implements ImpTicketService { - - private final UserTicketRepository userTicketRepository; - - public TicketService(UserTicketRepository userTicketRepository) { - this.userTicketRepository = userTicketRepository; - } - - @Override - public UserTicketEntity buyLottery(UserTicketEntity userTicketEntity) { - return userTicketRepository.save(userTicketEntity); - - } - -// @Override -// public String refundLottery(String ticket,String UserId) { -// return userTicketRepository.deleteById(ticket); -// } -} diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/UserTicketService.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/UserTicketService.java new file mode 100644 index 00000000..2853fb2b --- /dev/null +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/UserTicketService.java @@ -0,0 +1,38 @@ +package com.kbtg.bootcamp.posttest.service; + +import com.kbtg.bootcamp.posttest.entity.UserTicketEntity; +import com.kbtg.bootcamp.posttest.repository.UserTicketRepository; +import com.kbtg.bootcamp.posttest.service.impl.ImpUserTicketService; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class UserTicketService implements ImpUserTicketService { + + private final UserTicketRepository userTicketRepository; + + public UserTicketService(UserTicketRepository userTicketRepository) { + this.userTicketRepository = userTicketRepository; + + } + + @Override //todo USE BY USER for buy lottery + public UserTicketEntity buyLotteryFromStore(UserTicketEntity userTicketEntity) { + return userTicketRepository.save(userTicketEntity); + } + + @Override //todo USE BY USER to list all lottery that already bought + public List getAllOwnLotteryFromUser(String user_id) { + return userTicketRepository.getAllOwnLotteryFromUser(user_id); + } + + @Override //todo USE BY USER refund lottery to store + public void refundLotteryToStore(String userid, String ticket) { + userTicketRepository.refundLotteryToStore(userid, ticket); // รอ database มาใส่ + } + + + + +} diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/impl/ImpLotteryService.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/impl/ImpLotteryService.java index bd8c6d29..023ec588 100644 --- a/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/impl/ImpLotteryService.java +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/impl/ImpLotteryService.java @@ -7,12 +7,14 @@ import java.util.Optional; public interface ImpLotteryService { - List findAllLottery(); - Optional findLotteryById(Long id); - LotteryEntity saveLottery(LotteryEntity lotteryEntity); -// LotteryEntity updateLottery(LotteryEntity lotteryEntity); - void deleteLottery(Long id); + List getAllLottery(); - void updateLottery(String ticketId, boolean active); + List getRemainLotteryFromStore(); + + LotteryEntity addLotteryToStore(LotteryEntity lotteryEntity); + +// void refundLotteryToStore(Long id); + + void updateStatusLottery(String ticketId, boolean status); } diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/impl/ImpTicketService.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/impl/ImpTicketService.java deleted file mode 100644 index 597db584..00000000 --- a/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/impl/ImpTicketService.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.kbtg.bootcamp.posttest.service.impl; - - -import com.kbtg.bootcamp.posttest.entity.UserTicketEntity; - -public interface ImpTicketService { - - UserTicketEntity buyLottery(UserTicketEntity userTicketEntity); - -// void refundLottery(Long id); - - -} diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/impl/ImpUserTicketService.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/impl/ImpUserTicketService.java new file mode 100644 index 00000000..69c5d7c4 --- /dev/null +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/impl/ImpUserTicketService.java @@ -0,0 +1,16 @@ +package com.kbtg.bootcamp.posttest.service.impl; + + +import com.kbtg.bootcamp.posttest.entity.UserTicketEntity; + +import java.util.List; + +public interface ImpUserTicketService { + + UserTicketEntity buyLotteryFromStore(UserTicketEntity userTicketEntity); + + List getAllOwnLotteryFromUser(String user_id); + + void refundLotteryToStore(String userid, String ticket); + +} diff --git a/posttest/src/main/resources/application.properties b/posttest/src/main/resources/application.properties index b09091c2..70977ebd 100644 --- a/posttest/src/main/resources/application.properties +++ b/posttest/src/main/resources/application.properties @@ -1,3 +1,4 @@ + server.port=8888 spring.datasource.url=jdbc:postgresql://localhost:5432/lotteryDB spring.datasource.username=postgres @@ -11,7 +12,6 @@ spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect # JPA & Hibernate Configuration #spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect - # Security Configuration #spring.security.user.name=admin #spring.security.user.password=password \ No newline at end of file From 6cf332043f95f666f3c9100bcb605211fd3579af Mon Sep 17 00:00:00 2001 From: pongkorn Date: Fri, 23 Feb 2024 16:54:45 +0700 Subject: [PATCH 04/11] add function buy and refund success --- BUINESS SOLUTION.docx | Bin 14940 -> 0 bytes BUISNESS SOLUTION.docx | Bin 0 -> 164857 bytes .../posttest/PosttestApplication.java | 6 +- .../bootcamp/posttest/SecurityConfig.java | 2 +- .../controller/AdminLotteryController.java | 18 ++--- .../controller/UserLotteryController.java | 65 ++++++------------ .../repository/LotteryRepository.java | 11 +-- .../repository/UserTicketRepository.java | 19 +---- .../posttest/service/LotteryService.java | 33 ++++++--- .../posttest/service/UserTicketService.java | 6 +- .../service/impl/ImpLotteryService.java | 2 - 11 files changed, 64 insertions(+), 98 deletions(-) delete mode 100644 BUINESS SOLUTION.docx create mode 100644 BUISNESS SOLUTION.docx diff --git a/BUINESS SOLUTION.docx b/BUINESS SOLUTION.docx deleted file mode 100644 index 0ce70f6e67aa570e69c95555648a036c5a0d19e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14940 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 HIDGbMM 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 cf9rA;q#;4gAgD httpSecurityCsrfConfigurer.disable()) .authorizeHttpRequests((requests) -> requests -// .requestMatchers("/users/lotteries/**").permitAll() + .requestMatchers("/users/lotteries/**").permitAll() .requestMatchers("/users/**").permitAll() .requestMatchers(HttpMethod.POST, "/admin/lotteries").hasAuthority("ADMIN_CREATE") .requestMatchers(HttpMethod.GET, "/admin/lotteries").hasAuthority("ADMIN_READ") diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/AdminLotteryController.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/AdminLotteryController.java index fc3968d4..6db262af 100644 --- a/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/AdminLotteryController.java +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/AdminLotteryController.java @@ -2,6 +2,7 @@ import com.kbtg.bootcamp.posttest.entity.LotteryEntity; import com.kbtg.bootcamp.posttest.service.impl.ImpLotteryService; +import jdk.jfr.Description; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -16,29 +17,18 @@ public AdminLotteryController(ImpLotteryService impLotteryService) { this.impLotteryService = impLotteryService; } + @Description("USE BY ADMIN FOR LIST ALL LOTTERY WHETHER SOLD OR NOT SOLD YET") @GetMapping("") public List findAllLottery() { return impLotteryService.getAllLottery(); } + + @Description("USE BY ADMIN FOR ADDING LOTTERY TO THE STORE") @PostMapping("") public LotteryEntity addLotteryToStore(@RequestBody LotteryEntity lotteryEntity) { impLotteryService.addLotteryToStore(lotteryEntity); return lotteryEntity; } -// @GetMapping("/{id}") -// public Optional findLotteryById(@PathVariable("id") Long id) { -// return ILotteryService.findLotteryById(id); -// } - -// @PutMapping("") -// public LotteryEntity updateLottery(@RequestBody LotteryEntity lotteryEntity) { -// return ILotteryService.updateLottery(lotteryEntity); -// } - -// @DeleteMapping("/{id}") -// public void deleteLotteryById(@PathVariable("id") Long id) { -// impLotteryService.deleteLottery(id); -// } } diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/UserLotteryController.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/UserLotteryController.java index b0fb60b5..80ac0c3e 100644 --- a/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/UserLotteryController.java +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/UserLotteryController.java @@ -5,6 +5,8 @@ import com.kbtg.bootcamp.posttest.service.UserTicketService; import com.kbtg.bootcamp.posttest.service.impl.ImpLotteryService; import com.kbtg.bootcamp.posttest.service.impl.ImpUserTicketService; +import jdk.jfr.Description; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.util.Collections; @@ -22,6 +24,7 @@ public UserLotteryController(ImpLotteryService impLotteryService, ImpUserTicketS this.impUserTicketService = impUserTicketService; } + @Description("USE BY USER FOR GET ALL LOTTERY THAT STILL REMAIN IN STORE") @GetMapping("/users/lotteries") public List getRemainLotteryFromStore() { @@ -30,12 +33,9 @@ public List getRemainLotteryFromStore() { if (lotteryRemain == null) { return Collections.emptyList(); - } else { - return lotteryRemain; } - } catch (Exception e) { throw new RuntimeException(e); @@ -43,63 +43,42 @@ public List getRemainLotteryFromStore() { } + @Description("USE BY USER FOR GET ALL LOTTERY THAT ALREADY BOUGHT ") @GetMapping("/users/lotteries/{id}") public List getAllOwnLotteryFromUser(@PathVariable("id") String user_Id) { - try { - - List ownLottery = impUserTicketService.getAllOwnLotteryFromUser(user_Id); - if (ownLottery == null) { - - return Collections.emptyList(); - } else { - return ownLottery; - } - - } catch (Exception e) { - - throw new RuntimeException(e); + List ownLottery = impUserTicketService.getAllOwnLotteryFromUser(user_Id); + if (ownLottery == null) { + return Collections.emptyList(); + } else { + return ownLottery; } - } + @Description("USE BY USER FOR BUY LOTTERY FROM STORE") @PostMapping("/users/lotteries") - public UserTicketEntity buyLotteryFromStore(@RequestBody UserTicketEntity userTicketEntity) { + public ResponseEntity buyLotteryFromStore(@RequestBody UserTicketEntity userTicketEntity) { -// impLotteryService.updateStatusLottery(userTicketEntity.getTicket(), true); // error wait for fix + boolean status = true; + impLotteryService.updateStatusLottery(userTicketEntity.getTicket(), status); - UserTicketEntity userTicketEntity1 = impUserTicketService.buyLotteryFromStore(userTicketEntity); + UserTicketEntity savedUserTicket = impUserTicketService.buyLotteryFromStore(userTicketEntity); + return ResponseEntity.ok(savedUserTicket); - return userTicketEntity1; } - + @Description("USE BY USER FOR REFUND LOTTERY TO STORE") @DeleteMapping("/users/{userid}/lotteries/{ticket}") public void refundLotteryToStore(@PathVariable String userid, @PathVariable String ticket) { - + // Remove record from user_ticket table impUserTicketService.refundLotteryToStore(userid, ticket); + + // Update status to false in lottery table + boolean status = false; + impLotteryService.updateStatusLottery(ticket, status); } -} -// public String getRemainLotteryAsJson() { -// List lotteryList = getRemainLottery(); -// Map result = new HashMap<>(); -// if (lotteryList == null) { -// // If lotteryList is null, create a JSON object with specific key-value pairs -// result.put("Id", 1); -// result.put("userid", "mo"); -// } else { -// // If lotteryList is not null, serialize it to JSON -// result.put("lotteryList", lotteryList); -// } -// try { -// ObjectMapper objectMapper = new ObjectMapper(); -// return objectMapper.writeValueAsString(result); -// } catch (JsonProcessingException e) { -// // Handle the exception if JSON serialization fails -// e.printStackTrace(); -// return "Error occurred while converting to JSON"; -// } \ No newline at end of file +} diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/repository/LotteryRepository.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/repository/LotteryRepository.java index 7ec20a29..b9eb06bc 100644 --- a/posttest/src/main/java/com/kbtg/bootcamp/posttest/repository/LotteryRepository.java +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/repository/LotteryRepository.java @@ -13,16 +13,17 @@ @Repository -//@EnableJpaRepositories public interface LotteryRepository extends JpaRepository { - //todo USE FOR USER to get remain lottery from store + //TODO USE BY USER TO GET REMAIN LOTTERY FROM STORE @Query(value = "SELECT * FROM lottery where status = false", nativeQuery = true) List getRemainLotteryFromStore(); - //todo USE FOR UPDATE STATUS THAT ALREADY BOUGHT OR NOT - @Query(value = "update lottery set status = true where ticket = '3'", nativeQuery = true) - void updateStatusLottery(String ticket, boolean status); + //TODO USE FOR UPDATE STATUS THAT ALREADY BOUGHT OR NOT -> CHECK BY TRUE/FALSE + @Modifying + @Query(value = "UPDATE lottery SET status = true WHERE ticket = :ticket", nativeQuery = true) + void updateStatusLottery(@Param("ticket") String ticket); + } diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/repository/UserTicketRepository.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/repository/UserTicketRepository.java index 74eef39c..3d1ceb58 100644 --- a/posttest/src/main/java/com/kbtg/bootcamp/posttest/repository/UserTicketRepository.java +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/repository/UserTicketRepository.java @@ -14,30 +14,17 @@ @Repository public interface UserTicketRepository extends JpaRepository { + + //TODO USE BY USER FOR GET ALL LOTTERY THAT ALREADY BOUGHT @Query(value = "SELECT * FROM user_ticket WHERE userid = :user_Id", nativeQuery = true) List getAllOwnLotteryFromUser(String user_Id); -// @Transactional -// @Modifying -// @Query(value = "DELETE * FROM user_ticket WHERE userid = :userId", nativeQuery = true) -// void refundLotteryToStore(String userId); - -// @Modifying -// @Query(value = "DELETE * FROM user_ticket WHERE userid = :userId AND ticket = :ticketId") -// void refundLotteryToStore(String userId, String ticketId); - + //TODO USE BY USER TO REFUND LOTTERY TO STORE @Transactional @Modifying @Query("DELETE FROM UserTicketEntity ut WHERE ut.userid = :userid AND ut.ticket = :ticket") void refundLotteryToStore(@Param("userid") String userid, @Param("ticket") String ticket); -// @Modifying -// @Query(value = "DELETE FROM UserTicketEntity ut WHERE ut.user_Id = :userId AND ut.ticket = :ticketId") -// void refundLotteryToStore(@Param("userId") String userId, @Param("ticketId") String ticketId); - - -// @Query(value = "DELETE FROM user_ticket WHERE userid = :user_Id", nativeQuery = true) -// void refundLotteryToStore(@Param("user_Id") String user_Id); } diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/LotteryService.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/LotteryService.java index f96f28e9..043ea947 100644 --- a/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/LotteryService.java +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/LotteryService.java @@ -3,6 +3,7 @@ import com.kbtg.bootcamp.posttest.entity.LotteryEntity; import com.kbtg.bootcamp.posttest.repository.LotteryRepository; import com.kbtg.bootcamp.posttest.service.impl.ImpLotteryService; +import jdk.jfr.Description; import org.apache.tomcat.util.net.openssl.ciphers.Authentication; import org.springframework.stereotype.Service; @@ -16,33 +17,43 @@ public class LotteryService implements ImpLotteryService { private final LotteryRepository lotteryRepository; public LotteryService(LotteryRepository lotteryRepository) { + this.lotteryRepository = lotteryRepository; } - @Override //todo USE BY ADMIN for list all lottery that exist, no consider where is it now + @Override public List getAllLottery() { + return lotteryRepository.findAll(); } - @Override //todo USE BY ADMIN for add lottery to the store + @Override public LotteryEntity addLotteryToStore(LotteryEntity lotteryEntity) { + return lotteryRepository.save(lotteryEntity); } - @Override //todo USE BY ADMIN for list all lottery that still available in the shop + @Override public List getRemainLotteryFromStore() { + return lotteryRepository.getRemainLotteryFromStore(); } -// @Override //todo USE BY USER refund lottery to store -// public void refundLotteryToStore(Long id) { -// lotteryRepository.deleteById(id); -// } - @Override //todo USE FOR STATUS CHECK THAT IS ALREADY BOUGHT OR NOT + @Override public void updateStatusLottery(String ticketId, boolean status) { - lotteryRepository.updateStatusLottery(ticketId, status); + Long ticketIdLong = Long.parseLong(ticketId); // Convert ticketId from String to Long + + Optional optionalLottery = lotteryRepository.findById(ticketIdLong); + if (optionalLottery.isPresent()) { + LotteryEntity lottery = optionalLottery.get(); + lottery.setStatus(status); // Set status to true + lotteryRepository.save(lottery); // Save the updated lottery entity + } else { + // Handle if the lottery ticket is not found + } + + } -// public int updateStatusLottery(String ticketId, boolean status) -// return lotteryRepository.updateLottery(ticketId, status); + } diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/UserTicketService.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/UserTicketService.java index 2853fb2b..01ef358f 100644 --- a/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/UserTicketService.java +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/UserTicketService.java @@ -17,17 +17,17 @@ public UserTicketService(UserTicketRepository userTicketRepository) { } - @Override //todo USE BY USER for buy lottery + @Override public UserTicketEntity buyLotteryFromStore(UserTicketEntity userTicketEntity) { return userTicketRepository.save(userTicketEntity); } - @Override //todo USE BY USER to list all lottery that already bought + @Override public List getAllOwnLotteryFromUser(String user_id) { return userTicketRepository.getAllOwnLotteryFromUser(user_id); } - @Override //todo USE BY USER refund lottery to store + @Override public void refundLotteryToStore(String userid, String ticket) { userTicketRepository.refundLotteryToStore(userid, ticket); // รอ database มาใส่ } diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/impl/ImpLotteryService.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/impl/ImpLotteryService.java index 023ec588..38a19820 100644 --- a/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/impl/ImpLotteryService.java +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/impl/ImpLotteryService.java @@ -13,8 +13,6 @@ public interface ImpLotteryService { LotteryEntity addLotteryToStore(LotteryEntity lotteryEntity); -// void refundLotteryToStore(Long id); - void updateStatusLottery(String ticketId, boolean status); } From c6eadf075982973092173cbe769919e2dbb8bc08 Mon Sep 17 00:00:00 2001 From: pongkorn Date: Fri, 23 Feb 2024 23:32:11 +0700 Subject: [PATCH 05/11] change request format --- .../controller/AdminLotteryController.java | 10 ++- .../controller/UserLotteryController.java | 83 ++++++++++++++----- .../repository/LotteryRepository.java | 3 + .../repository/UserTicketRepository.java | 3 +- .../posttest/service/LotteryService.java | 7 +- .../posttest/service/UserTicketService.java | 2 + .../service/impl/ImpLotteryService.java | 5 +- .../service/impl/ImpUserTicketService.java | 2 + 8 files changed, 87 insertions(+), 28 deletions(-) diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/AdminLotteryController.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/AdminLotteryController.java index 6db262af..d6efa9fc 100644 --- a/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/AdminLotteryController.java +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/AdminLotteryController.java @@ -26,9 +26,13 @@ public List findAllLottery() { @Description("USE BY ADMIN FOR ADDING LOTTERY TO THE STORE") @PostMapping("") - public LotteryEntity addLotteryToStore(@RequestBody LotteryEntity lotteryEntity) { - impLotteryService.addLotteryToStore(lotteryEntity); - return lotteryEntity; + public String addLotteryToStore(@RequestBody LotteryEntity lotteryEntity) { +// public LotteryEntity addLotteryToStore(@RequestBody LotteryEntity lotteryEntity) { + + impLotteryService.addLotteryToStore(lotteryEntity); +// return lotteryEntity; + + return "\"ticket\": " + "\"" + lotteryEntity.getTicket() + "\""; } } diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/UserLotteryController.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/UserLotteryController.java index 80ac0c3e..90fe6402 100644 --- a/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/UserLotteryController.java +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/UserLotteryController.java @@ -2,7 +2,6 @@ import com.kbtg.bootcamp.posttest.entity.LotteryEntity; import com.kbtg.bootcamp.posttest.entity.UserTicketEntity; -import com.kbtg.bootcamp.posttest.service.UserTicketService; import com.kbtg.bootcamp.posttest.service.impl.ImpLotteryService; import com.kbtg.bootcamp.posttest.service.impl.ImpUserTicketService; import jdk.jfr.Description; @@ -26,51 +25,86 @@ public UserLotteryController(ImpLotteryService impLotteryService, ImpUserTicketS @Description("USE BY USER FOR GET ALL LOTTERY THAT STILL REMAIN IN STORE") @GetMapping("/users/lotteries") - public List getRemainLotteryFromStore() { - + public String getRemainLotteryFromStore() { + //"tickets": ["000001","000002","123456"] try { List lotteryRemain = impLotteryService.getRemainLotteryFromStore(); - if (lotteryRemain == null) { - return Collections.emptyList(); + String listTicket = "\"tickets\": ["; + String tmp = ""; + if (lotteryRemain != null) { + for (LotteryEntity lotteryEntity : lotteryRemain) { + tmp = tmp + "\"" + lotteryEntity.getTicket() + "\","; + } + return listTicket + tmp.substring(0, tmp.length() - 1) + "]"; } else { - return lotteryRemain; + return "don't have lottery in store"; } } catch (Exception e) { - - throw new RuntimeException(e); + return "don't have lottery in store"; } - } @Description("USE BY USER FOR GET ALL LOTTERY THAT ALREADY BOUGHT ") @GetMapping("/users/lotteries/{id}") - public List getAllOwnLotteryFromUser(@PathVariable("id") String user_Id) { + public String getAllOwnLotteryFromUser(@PathVariable("id") String user_Id) { + String msg = ""; + int count = 0; + int cost = 0; + // return JSON body +// tickets = list of ticket e.g. ["000001","000002","123456"] +// count = number +// cost = number List ownLottery = impUserTicketService.getAllOwnLotteryFromUser(user_Id); - if (ownLottery == null) { - return Collections.emptyList(); - } else { - return ownLottery; + try { + + String listTicket = "\"tickets\": ["; + String tmp = ""; + if (ownLottery != null) { + for (UserTicketEntity userTicketEntity : ownLottery) { + tmp = tmp + "\"" + userTicketEntity.getTicket() + "\","; + + count = count + 1; + cost = cost + (userTicketEntity.getAmount() * userTicketEntity.getPrice()); + + + } + msg = listTicket + tmp.substring(0, tmp.length() - 1) + "], count = " + count + ", cost = " + cost; + } + } catch (Exception e) { + msg = "don't have lottery in my pocket"; } + return msg; } @Description("USE BY USER FOR BUY LOTTERY FROM STORE") - @PostMapping("/users/lotteries") - public ResponseEntity buyLotteryFromStore(@RequestBody UserTicketEntity userTicketEntity) { - + @PostMapping("/users/{userid}/lotteries/{ticket}") + public String buyLotteryFromStore(@PathVariable String userid, @PathVariable String ticket) { boolean status = true; - impLotteryService.updateStatusLottery(userTicketEntity.getTicket(), status); - - UserTicketEntity savedUserTicket = impUserTicketService.buyLotteryFromStore(userTicketEntity); - return ResponseEntity.ok(savedUserTicket); + impLotteryService.updateStatusLottery(ticket, status); + // get lottery details + List lotteryEntity = impLotteryService.getLotteryEntity(ticket); + LotteryEntity lotteryEnt = lotteryEntity.get(0); + + // set TicketEntity + UserTicketEntity userTicketEntity = new UserTicketEntity(); + userTicketEntity.setUserid(userid); + userTicketEntity.setTicket(lotteryEnt.getTicket()); + userTicketEntity.setPrice(lotteryEnt.getPrice()); + userTicketEntity.setAmount(lotteryEnt.getAmount()); + UserTicketEntity addUserTicket = impUserTicketService.buyLotteryFromStore(userTicketEntity); + + //todo ผมไม่เเน่ใจว่าต้องให้เเสดงเป็นหมายเลขลอตเตอรี่หรือ id ของ record ใน database +// return "\"ticket\": " + "\"" + userTicketEntity.getTicket() + "\""; + return "\"id\": " + "\"" + userTicketEntity.getId() + "\""; } @Description("USE BY USER FOR REFUND LOTTERY TO STORE") @DeleteMapping("/users/{userid}/lotteries/{ticket}") - public void refundLotteryToStore(@PathVariable String userid, @PathVariable String ticket) { + public String refundLotteryToStore(@PathVariable String userid, @PathVariable String ticket) { // Remove record from user_ticket table impUserTicketService.refundLotteryToStore(userid, ticket); @@ -78,6 +112,11 @@ public void refundLotteryToStore(@PathVariable String userid, @PathVariable Stri // Update status to false in lottery table boolean status = false; impLotteryService.updateStatusLottery(ticket, status); + +// "ticket": "000001", + + return "\"ticket\": " + "\"" + ticket + "\""; + } diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/repository/LotteryRepository.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/repository/LotteryRepository.java index b9eb06bc..6d153e50 100644 --- a/posttest/src/main/java/com/kbtg/bootcamp/posttest/repository/LotteryRepository.java +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/repository/LotteryRepository.java @@ -25,5 +25,8 @@ public interface LotteryRepository extends JpaRepository { @Query(value = "UPDATE lottery SET status = true WHERE ticket = :ticket", nativeQuery = true) void updateStatusLottery(@Param("ticket") String ticket); + @Modifying + @Query(value = "SELECT * FROM lottery WHERE ticket = :ticket", nativeQuery = true) + List getTicketEntity(@Param("ticket") String ticket); } diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/repository/UserTicketRepository.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/repository/UserTicketRepository.java index 3d1ceb58..3b0b50f7 100644 --- a/posttest/src/main/java/com/kbtg/bootcamp/posttest/repository/UserTicketRepository.java +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/repository/UserTicketRepository.java @@ -1,5 +1,6 @@ package com.kbtg.bootcamp.posttest.repository; +import com.kbtg.bootcamp.posttest.entity.LotteryEntity; import com.kbtg.bootcamp.posttest.entity.UserTicketEntity; import jakarta.transaction.Transactional; import org.springframework.data.jpa.repository.JpaRepository; @@ -14,7 +15,6 @@ @Repository public interface UserTicketRepository extends JpaRepository { - //TODO USE BY USER FOR GET ALL LOTTERY THAT ALREADY BOUGHT @Query(value = "SELECT * FROM user_ticket WHERE userid = :user_Id", nativeQuery = true) List getAllOwnLotteryFromUser(String user_Id); @@ -27,4 +27,5 @@ public interface UserTicketRepository extends JpaRepository getRemainLotteryFromStore() { - return lotteryRepository.getRemainLotteryFromStore(); } @@ -56,4 +55,10 @@ public void updateStatusLottery(String ticketId, boolean status) { } + @Override + public List getLotteryEntity(String ticket) { + return lotteryRepository.getTicketEntity(ticket); + } + + } diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/UserTicketService.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/UserTicketService.java index 01ef358f..090cdac9 100644 --- a/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/UserTicketService.java +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/UserTicketService.java @@ -1,5 +1,6 @@ package com.kbtg.bootcamp.posttest.service; +import com.kbtg.bootcamp.posttest.entity.LotteryEntity; import com.kbtg.bootcamp.posttest.entity.UserTicketEntity; import com.kbtg.bootcamp.posttest.repository.UserTicketRepository; import com.kbtg.bootcamp.posttest.service.impl.ImpUserTicketService; @@ -35,4 +36,5 @@ public void refundLotteryToStore(String userid, String ticket) { + } diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/impl/ImpLotteryService.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/impl/ImpLotteryService.java index 38a19820..b348b6fb 100644 --- a/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/impl/ImpLotteryService.java +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/impl/ImpLotteryService.java @@ -2,6 +2,7 @@ import com.kbtg.bootcamp.posttest.entity.LotteryEntity; +import com.kbtg.bootcamp.posttest.entity.UserTicketEntity; import java.util.List; import java.util.Optional; @@ -15,4 +16,6 @@ public interface ImpLotteryService { void updateStatusLottery(String ticketId, boolean status); -} + List getLotteryEntity(String ticket); + +} \ No newline at end of file diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/impl/ImpUserTicketService.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/impl/ImpUserTicketService.java index 69c5d7c4..2e2d7403 100644 --- a/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/impl/ImpUserTicketService.java +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/impl/ImpUserTicketService.java @@ -13,4 +13,6 @@ public interface ImpUserTicketService { void refundLotteryToStore(String userid, String ticket); + + } From 015f58d0f80487694b483c9dac0a68256a8d46e9 Mon Sep 17 00:00:00 2001 From: pongkorn Date: Fri, 23 Feb 2024 23:37:43 +0700 Subject: [PATCH 06/11] minors edit --- .../controller/UserLotteryController.java | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/UserLotteryController.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/UserLotteryController.java index 90fe6402..ec8265bf 100644 --- a/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/UserLotteryController.java +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/UserLotteryController.java @@ -26,7 +26,7 @@ public UserLotteryController(ImpLotteryService impLotteryService, ImpUserTicketS @Description("USE BY USER FOR GET ALL LOTTERY THAT STILL REMAIN IN STORE") @GetMapping("/users/lotteries") public String getRemainLotteryFromStore() { - //"tickets": ["000001","000002","123456"] + String msg = ""; try { List lotteryRemain = impLotteryService.getRemainLotteryFromStore(); @@ -36,13 +36,12 @@ public String getRemainLotteryFromStore() { for (LotteryEntity lotteryEntity : lotteryRemain) { tmp = tmp + "\"" + lotteryEntity.getTicket() + "\","; } - return listTicket + tmp.substring(0, tmp.length() - 1) + "]"; - } else { - return "don't have lottery in store"; + msg = listTicket + tmp.substring(0, tmp.length() - 1) + "]"; } } catch (Exception e) { - return "don't have lottery in store"; + msg = "don't have lottery in store"; } + return msg; } @Description("USE BY USER FOR GET ALL LOTTERY THAT ALREADY BOUGHT ") @@ -51,10 +50,6 @@ public String getAllOwnLotteryFromUser(@PathVariable("id") String user_Id) { String msg = ""; int count = 0; int cost = 0; - // return JSON body -// tickets = list of ticket e.g. ["000001","000002","123456"] -// count = number -// cost = number List ownLottery = impUserTicketService.getAllOwnLotteryFromUser(user_Id); @@ -65,11 +60,8 @@ public String getAllOwnLotteryFromUser(@PathVariable("id") String user_Id) { if (ownLottery != null) { for (UserTicketEntity userTicketEntity : ownLottery) { tmp = tmp + "\"" + userTicketEntity.getTicket() + "\","; - count = count + 1; cost = cost + (userTicketEntity.getAmount() * userTicketEntity.getPrice()); - - } msg = listTicket + tmp.substring(0, tmp.length() - 1) + "], count = " + count + ", cost = " + cost; } @@ -113,8 +105,6 @@ public String refundLotteryToStore(@PathVariable String userid, @PathVariable St boolean status = false; impLotteryService.updateStatusLottery(ticket, status); -// "ticket": "000001", - return "\"ticket\": " + "\"" + ticket + "\""; } From 631cc5f78cee546ae8557cb77837abc3bd46bba9 Mon Sep 17 00:00:00 2001 From: pongkorn Date: Sat, 24 Feb 2024 00:13:29 +0700 Subject: [PATCH 07/11] add dockerfile but error --- Dockerfile | 7 +++++++ posttest/docker-compose.yml | 0 2 files changed, 7 insertions(+) create mode 100644 Dockerfile create mode 100644 posttest/docker-compose.yml diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..c1ce6732 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,7 @@ +FROM amazoncorretto:21.0.2-alpine3.18 + +WORKDIR /app +ADD . . +RUN ["./gradlew","bootJar"] + +ENTRYPOINT ["java", "-jar", "build/libs/posttest-0.0.1-SNAPSHOT.jar"] \ No newline at end of file diff --git a/posttest/docker-compose.yml b/posttest/docker-compose.yml new file mode 100644 index 00000000..e69de29b From 8a671e807a9c0c1085f03f78b20eca37c52c3542 Mon Sep 17 00:00:00 2001 From: pongkorn Date: Sat, 24 Feb 2024 10:19:33 +0700 Subject: [PATCH 08/11] minors change --- Dockerfile | 5 ++++- posttest/docker-compose.yml => docker-compose.yml | 0 .../posttest/controller/AdminLotteryController.java | 3 +-- .../bootcamp/posttest/controller/UserLotteryController.java | 5 ++--- .../com/kbtg/bootcamp/posttest/service/LotteryService.java | 6 +----- .../kbtg/bootcamp/posttest/service/UserTicketService.java | 2 +- .../bootcamp/posttest/service/impl/ImpLotteryService.java | 4 ++++ 7 files changed, 13 insertions(+), 12 deletions(-) rename posttest/docker-compose.yml => docker-compose.yml (100%) diff --git a/Dockerfile b/Dockerfile index c1ce6732..f76e1751 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,10 @@ + FROM amazoncorretto:21.0.2-alpine3.18 WORKDIR /app -ADD . . + +COPY . . + RUN ["./gradlew","bootJar"] ENTRYPOINT ["java", "-jar", "build/libs/posttest-0.0.1-SNAPSHOT.jar"] \ No newline at end of file diff --git a/posttest/docker-compose.yml b/docker-compose.yml similarity index 100% rename from posttest/docker-compose.yml rename to docker-compose.yml diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/AdminLotteryController.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/AdminLotteryController.java index d6efa9fc..1d6b1355 100644 --- a/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/AdminLotteryController.java +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/AdminLotteryController.java @@ -27,10 +27,9 @@ public List findAllLottery() { @Description("USE BY ADMIN FOR ADDING LOTTERY TO THE STORE") @PostMapping("") public String addLotteryToStore(@RequestBody LotteryEntity lotteryEntity) { -// public LotteryEntity addLotteryToStore(@RequestBody LotteryEntity lotteryEntity) { impLotteryService.addLotteryToStore(lotteryEntity); -// return lotteryEntity; + return "\"ticket\": " + "\"" + lotteryEntity.getTicket() + "\""; } diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/UserLotteryController.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/UserLotteryController.java index ec8265bf..fd9e299f 100644 --- a/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/UserLotteryController.java +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/UserLotteryController.java @@ -90,8 +90,8 @@ public String buyLotteryFromStore(@PathVariable String userid, @PathVariable Str UserTicketEntity addUserTicket = impUserTicketService.buyLotteryFromStore(userTicketEntity); //todo ผมไม่เเน่ใจว่าต้องให้เเสดงเป็นหมายเลขลอตเตอรี่หรือ id ของ record ใน database -// return "\"ticket\": " + "\"" + userTicketEntity.getTicket() + "\""; - return "\"id\": " + "\"" + userTicketEntity.getId() + "\""; + // return "\"ticket\": " + "\"" + userTicketEntity.getTicket() + "\""; + return "\"id\": " + "\"" + userTicketEntity.getId() + "\""; } @Description("USE BY USER FOR REFUND LOTTERY TO STORE") @@ -109,5 +109,4 @@ public String refundLotteryToStore(@PathVariable String userid, @PathVariable St } - } diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/LotteryService.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/LotteryService.java index 1a9a3b93..a414f6bb 100644 --- a/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/LotteryService.java +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/LotteryService.java @@ -17,19 +17,16 @@ public class LotteryService implements ImpLotteryService { private final LotteryRepository lotteryRepository; public LotteryService(LotteryRepository lotteryRepository) { - this.lotteryRepository = lotteryRepository; } @Override public List getAllLottery() { - return lotteryRepository.findAll(); } @Override public LotteryEntity addLotteryToStore(LotteryEntity lotteryEntity) { - return lotteryRepository.save(lotteryEntity); } @@ -49,7 +46,7 @@ public void updateStatusLottery(String ticketId, boolean status) { lottery.setStatus(status); // Set status to true lotteryRepository.save(lottery); // Save the updated lottery entity } else { - // Handle if the lottery ticket is not found + } @@ -60,5 +57,4 @@ public List getLotteryEntity(String ticket) { return lotteryRepository.getTicketEntity(ticket); } - } diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/UserTicketService.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/UserTicketService.java index 090cdac9..d2c6e6e7 100644 --- a/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/UserTicketService.java +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/UserTicketService.java @@ -30,7 +30,7 @@ public List getAllOwnLotteryFromUser(String user_id) { @Override public void refundLotteryToStore(String userid, String ticket) { - userTicketRepository.refundLotteryToStore(userid, ticket); // รอ database มาใส่ + userTicketRepository.refundLotteryToStore(userid, ticket); } diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/impl/ImpLotteryService.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/impl/ImpLotteryService.java index b348b6fb..fbb69395 100644 --- a/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/impl/ImpLotteryService.java +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/impl/ImpLotteryService.java @@ -3,6 +3,7 @@ import com.kbtg.bootcamp.posttest.entity.LotteryEntity; import com.kbtg.bootcamp.posttest.entity.UserTicketEntity; +import jdk.jfr.Description; import java.util.List; import java.util.Optional; @@ -14,8 +15,11 @@ public interface ImpLotteryService { LotteryEntity addLotteryToStore(LotteryEntity lotteryEntity); + + @Description("use for update status true/false") void updateStatusLottery(String ticketId, boolean status); + @Description("use for @PostMapping(\"/users/{userid}/lotteries/{ticket}\")") List getLotteryEntity(String ticket); } \ No newline at end of file From 2db9c4339234a99b1689c92e1b785fb1bd7ea5e2 Mon Sep 17 00:00:00 2001 From: pongkorn Date: Sat, 24 Feb 2024 10:38:00 +0700 Subject: [PATCH 09/11] minors change --- posttest/gradlew | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 posttest/gradlew diff --git a/posttest/gradlew b/posttest/gradlew old mode 100755 new mode 100644 From 62e9aa6f99e3fff005e360ce5f4ef318ccbd3764 Mon Sep 17 00:00:00 2001 From: pongkorn Date: Sat, 24 Feb 2024 12:54:19 +0700 Subject: [PATCH 10/11] add LotteryResponse --- .../controller/UserLotteryController.java | 24 +++++++++- .../LotteryOwnershipResponse.java | 48 +++++++++++++++++++ .../src/main/resources/application.properties | 3 ++ 3 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 posttest/src/main/java/com/kbtg/bootcamp/posttest/lotteryResponse/LotteryOwnershipResponse.java diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/UserLotteryController.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/UserLotteryController.java index fd9e299f..310364b3 100644 --- a/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/UserLotteryController.java +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/UserLotteryController.java @@ -2,13 +2,13 @@ import com.kbtg.bootcamp.posttest.entity.LotteryEntity; import com.kbtg.bootcamp.posttest.entity.UserTicketEntity; +import com.kbtg.bootcamp.posttest.lotteryResponse.LotteryOwnershipResponse; import com.kbtg.bootcamp.posttest.service.impl.ImpLotteryService; import com.kbtg.bootcamp.posttest.service.impl.ImpUserTicketService; import jdk.jfr.Description; -import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import java.util.Collections; +import java.util.ArrayList; import java.util.List; @RestController @@ -18,11 +18,13 @@ public class UserLotteryController { private final ImpUserTicketService impUserTicketService; + public UserLotteryController(ImpLotteryService impLotteryService, ImpUserTicketService impUserTicketService) { this.impLotteryService = impLotteryService; this.impUserTicketService = impUserTicketService; } + @Description("USE BY USER FOR GET ALL LOTTERY THAT STILL REMAIN IN STORE") @GetMapping("/users/lotteries") public String getRemainLotteryFromStore() { @@ -44,6 +46,24 @@ public String getRemainLotteryFromStore() { return msg; } +// @GetMapping("/users/lotteries/{id}") +// public LotteryOwnershipResponse getAllOwnLotteryFromUser(@PathVariable("id") String userId) { +// List ownLottery = impUserTicketService.getAllOwnLotteryFromUser(userId); +// +// List ticket = new ArrayList<>(); +// int count = 0; +// int cost = 0; +// +// for (UserTicketEntity userTicketEntity : ownLottery) { +// ticket.add(userTicketEntity.getTicket()); +// count++; +// cost += userTicketEntity.getAmount() * userTicketEntity.getPrice(); +// } +// +// return new LotteryOwnershipResponse(ticket, count, cost); +// } + + @Description("USE BY USER FOR GET ALL LOTTERY THAT ALREADY BOUGHT ") @GetMapping("/users/lotteries/{id}") public String getAllOwnLotteryFromUser(@PathVariable("id") String user_Id) { diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/lotteryResponse/LotteryOwnershipResponse.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/lotteryResponse/LotteryOwnershipResponse.java new file mode 100644 index 00000000..283e876d --- /dev/null +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/lotteryResponse/LotteryOwnershipResponse.java @@ -0,0 +1,48 @@ +package com.kbtg.bootcamp.posttest.lotteryResponse; + +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + + +public class LotteryOwnershipResponse { + private List ticket; + private int count; + private int cost; + + public LotteryOwnershipResponse() { + } + + public LotteryOwnershipResponse(List ticket, int count, int cost) { + this.ticket = ticket; + this.count = count; + this.cost = cost; + } + + public List getTicket() { + return ticket; + } + + public void setTicket(List ticket) { + this.ticket = ticket; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + + public int getCost() { + return cost; + } + + public void setCost(int cost) { + this.cost = cost; + } +} + + diff --git a/posttest/src/main/resources/application.properties b/posttest/src/main/resources/application.properties index 70977ebd..c8a2421b 100644 --- a/posttest/src/main/resources/application.properties +++ b/posttest/src/main/resources/application.properties @@ -6,6 +6,9 @@ spring.datasource.password=Watermal0n spring.jpa.hibernate.ddl-auto=validate spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect +#spring.jackson.mapper.default_use_wrapping=false + + # DataSource Configuration #spring.datasource.driver-class-name=org.postgresql.Driver From 3023e6731fa2ff175fbb51c0f4dd110cdb991bbc Mon Sep 17 00:00:00 2001 From: pongkorn Date: Mon, 26 Feb 2024 14:42:31 +0700 Subject: [PATCH 11/11] minors change and add request/response --- docker-compose.yml | 27 +++++++ posttest/build.gradle | 3 + .../posttest/PosttestApplication.java | 3 +- .../controller/UserLotteryController.java | 37 ++++----- .../posttest/request/LotteryRequest.java | 18 +++++ .../LotteryOwnershipResponse.java | 5 +- .../posttest/service/LotteryService.java | 1 - .../posttest/service/UserTicketService.java | 2 - .../service/impl/ImpUserTicketService.java | 5 ++ .../posttest/AdminLotteryControllerTest.java | 75 +++++++++++++++++++ 10 files changed, 143 insertions(+), 33 deletions(-) create mode 100644 posttest/src/main/java/com/kbtg/bootcamp/posttest/request/LotteryRequest.java rename posttest/src/main/java/com/kbtg/bootcamp/posttest/{lotteryResponse => response}/LotteryOwnershipResponse.java (88%) create mode 100644 posttest/src/test/java/com/kbtg/bootcamp/posttest/AdminLotteryControllerTest.java diff --git a/docker-compose.yml b/docker-compose.yml index e69de29b..473c1868 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -0,0 +1,27 @@ +version: '3.8' + +services: + web: + image: assessment_con:latest + ports: + - "8888:8888" + environment: + - ENV_VARIABLE=value + depends_on: + - database + volumes: + - ./path/to/local/directory:/app/data + + database: + image: postgres:latest + environment: + - POSTGRES_USER=postgres + - POSTGRES_PASSWORD=password + - POSTGRES_DB=lottery + ports: + - "5432:5432" + volumes: + - pgdata:/var/lib/postgresql/data + +volumes: + pgdata: \ No newline at end of file diff --git a/posttest/build.gradle b/posttest/build.gradle index 5d2b6d70..8139cff6 100644 --- a/posttest/build.gradle +++ b/posttest/build.gradle @@ -29,6 +29,9 @@ dependencies { annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' + implementation 'org.hibernate.validator:hibernate-validator:6.2.0.Final' + + implementation 'org.springframework.boot:spring-boot-starter-security' testImplementation 'org.springframework.security:spring-security-test' diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/PosttestApplication.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/PosttestApplication.java index d03dff3f..b695b97e 100644 --- a/posttest/src/main/java/com/kbtg/bootcamp/posttest/PosttestApplication.java +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/PosttestApplication.java @@ -9,8 +9,7 @@ public class PosttestApplication { public static void main(String[] args) { SpringApplication.run(PosttestApplication.class, args); System.out.println("START OK! START OK!"); - System.out.println("START OK! START OK!"); - System.out.println("START OK! START OK!"); + } diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/UserLotteryController.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/UserLotteryController.java index 310364b3..e976713c 100644 --- a/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/UserLotteryController.java +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/controller/UserLotteryController.java @@ -2,23 +2,24 @@ import com.kbtg.bootcamp.posttest.entity.LotteryEntity; import com.kbtg.bootcamp.posttest.entity.UserTicketEntity; -import com.kbtg.bootcamp.posttest.lotteryResponse.LotteryOwnershipResponse; +import com.kbtg.bootcamp.posttest.request.LotteryRequest; import com.kbtg.bootcamp.posttest.service.impl.ImpLotteryService; import com.kbtg.bootcamp.posttest.service.impl.ImpUserTicketService; import jdk.jfr.Description; +import org.springframework.validation.BindingResult; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import java.util.ArrayList; import java.util.List; @RestController +@Validated public class UserLotteryController { private final ImpLotteryService impLotteryService; private final ImpUserTicketService impUserTicketService; - public UserLotteryController(ImpLotteryService impLotteryService, ImpUserTicketService impUserTicketService) { this.impLotteryService = impLotteryService; this.impUserTicketService = impUserTicketService; @@ -27,8 +28,9 @@ public UserLotteryController(ImpLotteryService impLotteryService, ImpUserTicketS @Description("USE BY USER FOR GET ALL LOTTERY THAT STILL REMAIN IN STORE") @GetMapping("/users/lotteries") + @Validated public String getRemainLotteryFromStore() { - String msg = ""; + String message = ""; try { List lotteryRemain = impLotteryService.getRemainLotteryFromStore(); @@ -38,31 +40,14 @@ public String getRemainLotteryFromStore() { for (LotteryEntity lotteryEntity : lotteryRemain) { tmp = tmp + "\"" + lotteryEntity.getTicket() + "\","; } - msg = listTicket + tmp.substring(0, tmp.length() - 1) + "]"; + message = listTicket + tmp.substring(0, tmp.length() - 1) + "]"; } } catch (Exception e) { - msg = "don't have lottery in store"; + message = "don't have lottery in store"; } - return msg; + return message; } -// @GetMapping("/users/lotteries/{id}") -// public LotteryOwnershipResponse getAllOwnLotteryFromUser(@PathVariable("id") String userId) { -// List ownLottery = impUserTicketService.getAllOwnLotteryFromUser(userId); -// -// List ticket = new ArrayList<>(); -// int count = 0; -// int cost = 0; -// -// for (UserTicketEntity userTicketEntity : ownLottery) { -// ticket.add(userTicketEntity.getTicket()); -// count++; -// cost += userTicketEntity.getAmount() * userTicketEntity.getPrice(); -// } -// -// return new LotteryOwnershipResponse(ticket, count, cost); -// } - @Description("USE BY USER FOR GET ALL LOTTERY THAT ALREADY BOUGHT ") @GetMapping("/users/lotteries/{id}") @@ -114,6 +99,7 @@ public String buyLotteryFromStore(@PathVariable String userid, @PathVariable Str return "\"id\": " + "\"" + userTicketEntity.getId() + "\""; } + @Description("USE BY USER FOR REFUND LOTTERY TO STORE") @DeleteMapping("/users/{userid}/lotteries/{ticket}") public String refundLotteryToStore(@PathVariable String userid, @PathVariable String ticket) { @@ -129,4 +115,7 @@ public String refundLotteryToStore(@PathVariable String userid, @PathVariable St } + + + } diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/request/LotteryRequest.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/request/LotteryRequest.java new file mode 100644 index 00000000..4243f55b --- /dev/null +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/request/LotteryRequest.java @@ -0,0 +1,18 @@ +package com.kbtg.bootcamp.posttest.request; + +import jakarta.validation.constraints.NotBlank; + + +public class LotteryRequest { + + @NotBlank(message = "Wrong userId") + private String name; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} \ No newline at end of file diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/lotteryResponse/LotteryOwnershipResponse.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/response/LotteryOwnershipResponse.java similarity index 88% rename from posttest/src/main/java/com/kbtg/bootcamp/posttest/lotteryResponse/LotteryOwnershipResponse.java rename to posttest/src/main/java/com/kbtg/bootcamp/posttest/response/LotteryOwnershipResponse.java index 283e876d..2f76391b 100644 --- a/posttest/src/main/java/com/kbtg/bootcamp/posttest/lotteryResponse/LotteryOwnershipResponse.java +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/response/LotteryOwnershipResponse.java @@ -1,7 +1,4 @@ -package com.kbtg.bootcamp.posttest.lotteryResponse; - -import lombok.Getter; -import lombok.Setter; +package com.kbtg.bootcamp.posttest.response; import java.util.List; diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/LotteryService.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/LotteryService.java index a414f6bb..e6371796 100644 --- a/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/LotteryService.java +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/LotteryService.java @@ -49,7 +49,6 @@ public void updateStatusLottery(String ticketId, boolean status) { } - } @Override diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/UserTicketService.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/UserTicketService.java index d2c6e6e7..e614182d 100644 --- a/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/UserTicketService.java +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/UserTicketService.java @@ -35,6 +35,4 @@ public void refundLotteryToStore(String userid, String ticket) { - - } diff --git a/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/impl/ImpUserTicketService.java b/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/impl/ImpUserTicketService.java index 2e2d7403..daa55262 100644 --- a/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/impl/ImpUserTicketService.java +++ b/posttest/src/main/java/com/kbtg/bootcamp/posttest/service/impl/ImpUserTicketService.java @@ -15,4 +15,9 @@ public interface ImpUserTicketService { + + + + + } diff --git a/posttest/src/test/java/com/kbtg/bootcamp/posttest/AdminLotteryControllerTest.java b/posttest/src/test/java/com/kbtg/bootcamp/posttest/AdminLotteryControllerTest.java new file mode 100644 index 00000000..a034a863 --- /dev/null +++ b/posttest/src/test/java/com/kbtg/bootcamp/posttest/AdminLotteryControllerTest.java @@ -0,0 +1,75 @@ +//package com.kbtg.bootcamp.posttest.controller; +// +//import com.kbtg.bootcamp.posttest.entity.LotteryEntity; +//import com.kbtg.bootcamp.posttest.service.impl.ImpLotteryService; +//import org.junit.jupiter.api.BeforeEach; +//import org.junit.jupiter.api.Test; +//import org.mockito.InjectMocks; +//import org.mockito.Mock; +//import org.mockito.MockitoAnnotations; +//import org.springframework.http.MediaType; +//import org.springframework.test.web.servlet.MockMvc; +//import org.springframework.test.web.servlet.setup.MockMvcBuilders; +// +//import java.util.Arrays; +//import java.util.List; +// +//import static org.mockito.Mockito.*; +//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.*; +// +//public class AdminLotteryControllerTest { +// +// private MockMvc mockMvc; +// +// @Mock +// private ImpLotteryService impLotteryService; +// +// @InjectMocks +// private AdminLotteryController adminLotteryController; +// +// @BeforeEach +// public void setUp() { +// MockitoAnnotations.initMocks(this); +// mockMvc = MockMvcBuilders.standaloneSetup(adminLotteryController).build(); +// } +// +// @Test +// public void testFindAllLottery() throws Exception { +// // Mocking the service behavior +// LotteryEntity lottery1 = new LotteryEntity(/* */); +// LotteryEntity lottery2 = new LotteryEntity(/* */); +// List lotteryList = Arrays.asList(lottery1, lottery2); +// when(impLotteryService.getAllLottery()).thenReturn(lotteryList); +// +// // Performing the MockMvc request +// mockMvc.perform(get("/admin/lotteries")) +// .andExpect(status().isOk()) +// .andExpect(content().contentType(MediaType.APPLICATION_JSON)) +// .andExpect(jsonPath("$[0].ticket").value(/* expected value of ticket property for lottery1 */)) +// .andExpect(jsonPath("$[1].ticket").value(/* expected value of ticket property for lottery2 */)); +// +// // Verifying that the service method was called once +// verify(impLotteryService, times(1)).getAllLottery(); +// verifyNoMoreInteractions(impLotteryService); +// } +// +// @Test +// public void testAddLotteryToStore() throws Exception { +// // Creating a LotteryEntity object for request body +// LotteryEntity lotteryEntity = new LotteryEntity(/* provide necessary constructor arguments */); +// +// // Performing the MockMvc request +// mockMvc.perform(post("/admin/lotteries") +// .contentType(MediaType.APPLICATION_JSON) +// .content(/* JSON representation of lotteryEntity */)) +// .andExpect(status().isOk()) +// .andExpect(content().string("\"ticket\": \"" + lotteryEntity.getTicket() + "\"")); +// +// // Verifying that the service method was called once with the correct argument +// verify(impLotteryService, times(1)).addLotteryToStore(lotteryEntity); +// verifyNoMoreInteractions(impLotteryService); +// } +//} +//