From 9738c07b13afb57099361fb8ef001fd9162ae9f1 Mon Sep 17 00:00:00 2001 From: rajithabhanuka Date: Thu, 13 Jan 2022 10:23:57 +0530 Subject: [PATCH 1/8] database connectivity established --- .idea/.gitignore | 3 ++ .../com/codejam/demo/model/IdolEntity.java | 34 +++++++++++++++++++ .../com/codejam/demo/model/UserEntity.java | 31 +++++++++++++++++ .../demo/repository/IdolRepository.java | 7 ++++ .../demo/repository/UserRepository.java | 7 ++++ src/main/resources/application.properties | 4 +-- target/classes/Data.sql | 10 ++++++ target/classes/application.properties | 10 ++++++ 8 files changed, 104 insertions(+), 2 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 src/main/java/com/codejam/demo/model/IdolEntity.java create mode 100644 src/main/java/com/codejam/demo/model/UserEntity.java create mode 100644 src/main/java/com/codejam/demo/repository/IdolRepository.java create mode 100644 src/main/java/com/codejam/demo/repository/UserRepository.java create mode 100644 target/classes/Data.sql create mode 100644 target/classes/application.properties diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/src/main/java/com/codejam/demo/model/IdolEntity.java b/src/main/java/com/codejam/demo/model/IdolEntity.java new file mode 100644 index 0000000..f27cde0 --- /dev/null +++ b/src/main/java/com/codejam/demo/model/IdolEntity.java @@ -0,0 +1,34 @@ +package com.codejam.demo.model; + +import lombok.Getter; +import lombok.Setter; + +import javax.persistence.*; +import java.time.LocalDateTime; + +@Entity +@Getter +@Setter +@Table(name = "idol", schema = "testdb") +public class IdolEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne + @JoinColumn(name="user_id") + private UserEntity user; + + @Column(name = "title") + private String title; + + @Column(name = "schedule") + private LocalDateTime schedule; + + @Column(name = "revenues") + private Double revenues; + + @Column(name = "status") + private boolean status; +} diff --git a/src/main/java/com/codejam/demo/model/UserEntity.java b/src/main/java/com/codejam/demo/model/UserEntity.java new file mode 100644 index 0000000..c5810a8 --- /dev/null +++ b/src/main/java/com/codejam/demo/model/UserEntity.java @@ -0,0 +1,31 @@ +package com.codejam.demo.model; + +import lombok.Getter; +import lombok.Setter; + +import javax.persistence.*; +import java.util.Set; + +@Entity +@Getter +@Setter +@Table(name = "user", schema = "testdb") +public class UserEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "name") + private String name; + + @Column(name = "age") + private Integer age; + + @Column(name = "country") + private String country; + + @OneToMany(mappedBy="user") + private Set idols; + +} diff --git a/src/main/java/com/codejam/demo/repository/IdolRepository.java b/src/main/java/com/codejam/demo/repository/IdolRepository.java new file mode 100644 index 0000000..6e45f01 --- /dev/null +++ b/src/main/java/com/codejam/demo/repository/IdolRepository.java @@ -0,0 +1,7 @@ +package com.codejam.demo.repository; + +import com.codejam.demo.model.IdolEntity; +import org.springframework.data.repository.CrudRepository; + +public interface IdolRepository extends CrudRepository { +} diff --git a/src/main/java/com/codejam/demo/repository/UserRepository.java b/src/main/java/com/codejam/demo/repository/UserRepository.java new file mode 100644 index 0000000..64a885f --- /dev/null +++ b/src/main/java/com/codejam/demo/repository/UserRepository.java @@ -0,0 +1,7 @@ +package com.codejam.demo.repository; + +import com.codejam.demo.model.UserEntity; +import org.springframework.data.repository.CrudRepository; + +public interface UserRepository extends CrudRepository { +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 9deaf3e..aadd395 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,8 +1,8 @@ #Database H2 config -spring.datasource.url=jdbc:h2:mem:testdb +spring.datasource.url=jdbc:h2:mem:testdb;INIT=CREATE SCHEMA IF NOT EXISTS testdb spring.h2.console.enabled=true -spring.jpa.hibernate.ddl-auto=none +spring.jpa.hibernate.ddl-auto=create spring.jpa.show-sql=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect diff --git a/target/classes/Data.sql b/target/classes/Data.sql new file mode 100644 index 0000000..4156517 --- /dev/null +++ b/target/classes/Data.sql @@ -0,0 +1,10 @@ +DROP TABLE IF EXISTS PERSONAL_INFORMATION; +CREATE TABLE PERSONAL_INFORMATION (id int,real_name varchar(50),idol_name varchar(60),address varchar(255),idol_status varchar(25)); +DROP TABLE IF EXISTS SCHEDULE; +CREATE TABLE SCHEDULE (id int,venue varchar(50),event_name varchar(60),date_time varchar(50)); +DROP TABLE IF EXISTS REVENUE; +CREATE TABLE REVENUE (id int,monthly_rate varchar(50),event_name varchar(60),date_time varchar(50)); + +INSERT INTO PERSONAL_INFORMATION (id, real_name, idol_name, address, idol_status) VALUES ('1', 'rahimi', 'remy', 'Malaysia', 'ACTIVE'); +INSERT INTO SCHEDULE (id, venue, event_name, date_time) VALUES ('1', 'Stadium Bukit Jalil', 'World Tour-2025', '27/05/2025 08:47:59.751000000'); +INSERT INTO REVENUE (id, monthly_rate, date_time) VALUES ('1', '1000000', '27/05/2025 08:47:59.751000000'); \ No newline at end of file diff --git a/target/classes/application.properties b/target/classes/application.properties new file mode 100644 index 0000000..aadd395 --- /dev/null +++ b/target/classes/application.properties @@ -0,0 +1,10 @@ + +#Database H2 config +spring.datasource.url=jdbc:h2:mem:testdb;INIT=CREATE SCHEMA IF NOT EXISTS testdb +spring.h2.console.enabled=true +spring.jpa.hibernate.ddl-auto=create +spring.jpa.show-sql=true +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect + +#logging level +logging.level.org.springframework.web=DEBUG \ No newline at end of file From ddc346b28e8b07fce9227e0dd241e32b6166de96 Mon Sep 17 00:00:00 2001 From: rajithabhanuka Date: Thu, 13 Jan 2022 10:51:51 +0530 Subject: [PATCH 2/8] database model created --- .../com/codejam/demo/model/IdolEntity.java | 34 ------------------- .../demo/model/PersonalInformationEntity.java | 27 +++++++++++++++ .../com/codejam/demo/model/RevenueEntity.java | 25 ++++++++++++++ .../{UserEntity.java => ScheduleEntity.java} | 17 ++++------ .../demo/repository/IdolRepository.java | 7 ---- .../PersonalInformationRepository.java | 7 ++++ .../demo/repository/RevenueRepository.java | 6 ++++ .../demo/repository/ScheduleRepository.java | 7 ++++ .../demo/repository/UserRepository.java | 7 ---- src/main/resources/Data.sql | 10 ------ src/main/resources/application.properties | 2 +- src/main/resources/data.sql | 3 ++ src/main/resources/schema.sql | 8 +++++ target/classes/Data.sql | 10 ------ target/classes/application.properties | 2 +- 15 files changed, 92 insertions(+), 80 deletions(-) delete mode 100644 src/main/java/com/codejam/demo/model/IdolEntity.java create mode 100644 src/main/java/com/codejam/demo/model/PersonalInformationEntity.java create mode 100644 src/main/java/com/codejam/demo/model/RevenueEntity.java rename src/main/java/com/codejam/demo/model/{UserEntity.java => ScheduleEntity.java} (52%) delete mode 100644 src/main/java/com/codejam/demo/repository/IdolRepository.java create mode 100644 src/main/java/com/codejam/demo/repository/PersonalInformationRepository.java create mode 100644 src/main/java/com/codejam/demo/repository/RevenueRepository.java create mode 100644 src/main/java/com/codejam/demo/repository/ScheduleRepository.java delete mode 100644 src/main/java/com/codejam/demo/repository/UserRepository.java delete mode 100644 src/main/resources/Data.sql create mode 100644 src/main/resources/data.sql create mode 100644 src/main/resources/schema.sql delete mode 100644 target/classes/Data.sql diff --git a/src/main/java/com/codejam/demo/model/IdolEntity.java b/src/main/java/com/codejam/demo/model/IdolEntity.java deleted file mode 100644 index f27cde0..0000000 --- a/src/main/java/com/codejam/demo/model/IdolEntity.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.codejam.demo.model; - -import lombok.Getter; -import lombok.Setter; - -import javax.persistence.*; -import java.time.LocalDateTime; - -@Entity -@Getter -@Setter -@Table(name = "idol", schema = "testdb") -public class IdolEntity { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @ManyToOne - @JoinColumn(name="user_id") - private UserEntity user; - - @Column(name = "title") - private String title; - - @Column(name = "schedule") - private LocalDateTime schedule; - - @Column(name = "revenues") - private Double revenues; - - @Column(name = "status") - private boolean status; -} diff --git a/src/main/java/com/codejam/demo/model/PersonalInformationEntity.java b/src/main/java/com/codejam/demo/model/PersonalInformationEntity.java new file mode 100644 index 0000000..49a0952 --- /dev/null +++ b/src/main/java/com/codejam/demo/model/PersonalInformationEntity.java @@ -0,0 +1,27 @@ +package com.codejam.demo.model; + +import lombok.Getter; +import lombok.Setter; + +import javax.persistence.*; + +@Entity +@Getter +@Setter +@Table(name = "PERSONAL_INFORMATION", schema = "testdb") +public class PersonalInformationEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Integer id; + + @Column(name = "real_name") + private String realName; + + @Column(name = "idol_name") + private String idolName; + + @Column(name = "date_time") + private String dateTime; + +} diff --git a/src/main/java/com/codejam/demo/model/RevenueEntity.java b/src/main/java/com/codejam/demo/model/RevenueEntity.java new file mode 100644 index 0000000..c014f09 --- /dev/null +++ b/src/main/java/com/codejam/demo/model/RevenueEntity.java @@ -0,0 +1,25 @@ +package com.codejam.demo.model; + +import lombok.Getter; +import lombok.Setter; + +import javax.persistence.*; + +@Entity +@Getter +@Setter +@Table(name = "REVENUE", schema = "testdb") +public class RevenueEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Integer id; + + @Column(name = "monthly_rate") + private String monthlyRate; + + @Column(name = "date_time") + private String dateTime; + + +} diff --git a/src/main/java/com/codejam/demo/model/UserEntity.java b/src/main/java/com/codejam/demo/model/ScheduleEntity.java similarity index 52% rename from src/main/java/com/codejam/demo/model/UserEntity.java rename to src/main/java/com/codejam/demo/model/ScheduleEntity.java index c5810a8..2ff5af9 100644 --- a/src/main/java/com/codejam/demo/model/UserEntity.java +++ b/src/main/java/com/codejam/demo/model/ScheduleEntity.java @@ -9,23 +9,20 @@ @Entity @Getter @Setter -@Table(name = "user", schema = "testdb") -public class UserEntity { +@Table(name = "SCHEDULE", schema = "testdb") +public class ScheduleEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; + private Integer id; - @Column(name = "name") - private String name; + @Column(name = "venue") + private String venue; - @Column(name = "age") - private Integer age; + @Column(name = "event_name") + private String eventName; @Column(name = "country") private String country; - @OneToMany(mappedBy="user") - private Set idols; - } diff --git a/src/main/java/com/codejam/demo/repository/IdolRepository.java b/src/main/java/com/codejam/demo/repository/IdolRepository.java deleted file mode 100644 index 6e45f01..0000000 --- a/src/main/java/com/codejam/demo/repository/IdolRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.codejam.demo.repository; - -import com.codejam.demo.model.IdolEntity; -import org.springframework.data.repository.CrudRepository; - -public interface IdolRepository extends CrudRepository { -} diff --git a/src/main/java/com/codejam/demo/repository/PersonalInformationRepository.java b/src/main/java/com/codejam/demo/repository/PersonalInformationRepository.java new file mode 100644 index 0000000..cf59330 --- /dev/null +++ b/src/main/java/com/codejam/demo/repository/PersonalInformationRepository.java @@ -0,0 +1,7 @@ +package com.codejam.demo.repository; + +import com.codejam.demo.model.PersonalInformationEntity; +import org.springframework.data.repository.CrudRepository; + +public interface PersonalInformationRepository extends CrudRepository { +} diff --git a/src/main/java/com/codejam/demo/repository/RevenueRepository.java b/src/main/java/com/codejam/demo/repository/RevenueRepository.java new file mode 100644 index 0000000..5a3c1d4 --- /dev/null +++ b/src/main/java/com/codejam/demo/repository/RevenueRepository.java @@ -0,0 +1,6 @@ +package com.codejam.demo.repository; + +import org.springframework.data.repository.CrudRepository; + +public interface RevenueRepository extends CrudRepository { +} diff --git a/src/main/java/com/codejam/demo/repository/ScheduleRepository.java b/src/main/java/com/codejam/demo/repository/ScheduleRepository.java new file mode 100644 index 0000000..8f3ffc6 --- /dev/null +++ b/src/main/java/com/codejam/demo/repository/ScheduleRepository.java @@ -0,0 +1,7 @@ +package com.codejam.demo.repository; + +import com.codejam.demo.model.ScheduleEntity; +import org.springframework.data.repository.CrudRepository; + +public interface ScheduleRepository extends CrudRepository { +} diff --git a/src/main/java/com/codejam/demo/repository/UserRepository.java b/src/main/java/com/codejam/demo/repository/UserRepository.java deleted file mode 100644 index 64a885f..0000000 --- a/src/main/java/com/codejam/demo/repository/UserRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.codejam.demo.repository; - -import com.codejam.demo.model.UserEntity; -import org.springframework.data.repository.CrudRepository; - -public interface UserRepository extends CrudRepository { -} diff --git a/src/main/resources/Data.sql b/src/main/resources/Data.sql deleted file mode 100644 index 4156517..0000000 --- a/src/main/resources/Data.sql +++ /dev/null @@ -1,10 +0,0 @@ -DROP TABLE IF EXISTS PERSONAL_INFORMATION; -CREATE TABLE PERSONAL_INFORMATION (id int,real_name varchar(50),idol_name varchar(60),address varchar(255),idol_status varchar(25)); -DROP TABLE IF EXISTS SCHEDULE; -CREATE TABLE SCHEDULE (id int,venue varchar(50),event_name varchar(60),date_time varchar(50)); -DROP TABLE IF EXISTS REVENUE; -CREATE TABLE REVENUE (id int,monthly_rate varchar(50),event_name varchar(60),date_time varchar(50)); - -INSERT INTO PERSONAL_INFORMATION (id, real_name, idol_name, address, idol_status) VALUES ('1', 'rahimi', 'remy', 'Malaysia', 'ACTIVE'); -INSERT INTO SCHEDULE (id, venue, event_name, date_time) VALUES ('1', 'Stadium Bukit Jalil', 'World Tour-2025', '27/05/2025 08:47:59.751000000'); -INSERT INTO REVENUE (id, monthly_rate, date_time) VALUES ('1', '1000000', '27/05/2025 08:47:59.751000000'); \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index aadd395..f21726e 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -2,7 +2,7 @@ #Database H2 config spring.datasource.url=jdbc:h2:mem:testdb;INIT=CREATE SCHEMA IF NOT EXISTS testdb spring.h2.console.enabled=true -spring.jpa.hibernate.ddl-auto=create +spring.jpa.hibernate.ddl-auto=none spring.jpa.show-sql=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect diff --git a/src/main/resources/data.sql b/src/main/resources/data.sql new file mode 100644 index 0000000..5c2267c --- /dev/null +++ b/src/main/resources/data.sql @@ -0,0 +1,3 @@ +INSERT INTO testdb.PERSONAL_INFORMATION (id, real_name, idol_name, address, idol_status) VALUES ('1', 'rahimi', 'remy', 'Malaysia', 'ACTIVE'); +INSERT INTO testdb.SCHEDULE (id, venue, event_name, date_time) VALUES ('1', 'Stadium Bukit Jalil', 'World Tour-2025', '27/05/2025 08:47:59.751000000'); +INSERT INTO testdb.REVENUE (id, monthly_rate, date_time) VALUES ('1', '1000000', '27/05/2025 08:47:59.751000000'); \ No newline at end of file diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql new file mode 100644 index 0000000..7dd4b0f --- /dev/null +++ b/src/main/resources/schema.sql @@ -0,0 +1,8 @@ +CREATE SCHEMA IF NOT EXISTS testdb; + +DROP TABLE IF EXISTS testdb.PERSONAL_INFORMATION; +CREATE TABLE testdb.PERSONAL_INFORMATION (id int,real_name varchar(50),idol_name varchar(60),address varchar(255),idol_status varchar(25)); +DROP TABLE IF EXISTS testdb.SCHEDULE; +CREATE TABLE testdb.SCHEDULE (id int,venue varchar(50),event_name varchar(60),date_time varchar(50)); +DROP TABLE IF EXISTS testdb.REVENUE; +CREATE TABLE testdb.REVENUE (id int,monthly_rate varchar(50),date_time varchar(50)); diff --git a/target/classes/Data.sql b/target/classes/Data.sql deleted file mode 100644 index 4156517..0000000 --- a/target/classes/Data.sql +++ /dev/null @@ -1,10 +0,0 @@ -DROP TABLE IF EXISTS PERSONAL_INFORMATION; -CREATE TABLE PERSONAL_INFORMATION (id int,real_name varchar(50),idol_name varchar(60),address varchar(255),idol_status varchar(25)); -DROP TABLE IF EXISTS SCHEDULE; -CREATE TABLE SCHEDULE (id int,venue varchar(50),event_name varchar(60),date_time varchar(50)); -DROP TABLE IF EXISTS REVENUE; -CREATE TABLE REVENUE (id int,monthly_rate varchar(50),event_name varchar(60),date_time varchar(50)); - -INSERT INTO PERSONAL_INFORMATION (id, real_name, idol_name, address, idol_status) VALUES ('1', 'rahimi', 'remy', 'Malaysia', 'ACTIVE'); -INSERT INTO SCHEDULE (id, venue, event_name, date_time) VALUES ('1', 'Stadium Bukit Jalil', 'World Tour-2025', '27/05/2025 08:47:59.751000000'); -INSERT INTO REVENUE (id, monthly_rate, date_time) VALUES ('1', '1000000', '27/05/2025 08:47:59.751000000'); \ No newline at end of file diff --git a/target/classes/application.properties b/target/classes/application.properties index aadd395..f21726e 100644 --- a/target/classes/application.properties +++ b/target/classes/application.properties @@ -2,7 +2,7 @@ #Database H2 config spring.datasource.url=jdbc:h2:mem:testdb;INIT=CREATE SCHEMA IF NOT EXISTS testdb spring.h2.console.enabled=true -spring.jpa.hibernate.ddl-auto=create +spring.jpa.hibernate.ddl-auto=none spring.jpa.show-sql=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect From fa66936a7f19d08fdb5a0420763c417417d1bf68 Mon Sep 17 00:00:00 2001 From: rajithabhanuka Date: Thu, 13 Jan 2022 10:52:42 +0530 Subject: [PATCH 3/8] data and schema creation queries added --- target/classes/data.sql | 3 +++ target/classes/schema.sql | 8 ++++++++ 2 files changed, 11 insertions(+) create mode 100644 target/classes/data.sql create mode 100644 target/classes/schema.sql diff --git a/target/classes/data.sql b/target/classes/data.sql new file mode 100644 index 0000000..5c2267c --- /dev/null +++ b/target/classes/data.sql @@ -0,0 +1,3 @@ +INSERT INTO testdb.PERSONAL_INFORMATION (id, real_name, idol_name, address, idol_status) VALUES ('1', 'rahimi', 'remy', 'Malaysia', 'ACTIVE'); +INSERT INTO testdb.SCHEDULE (id, venue, event_name, date_time) VALUES ('1', 'Stadium Bukit Jalil', 'World Tour-2025', '27/05/2025 08:47:59.751000000'); +INSERT INTO testdb.REVENUE (id, monthly_rate, date_time) VALUES ('1', '1000000', '27/05/2025 08:47:59.751000000'); \ No newline at end of file diff --git a/target/classes/schema.sql b/target/classes/schema.sql new file mode 100644 index 0000000..7dd4b0f --- /dev/null +++ b/target/classes/schema.sql @@ -0,0 +1,8 @@ +CREATE SCHEMA IF NOT EXISTS testdb; + +DROP TABLE IF EXISTS testdb.PERSONAL_INFORMATION; +CREATE TABLE testdb.PERSONAL_INFORMATION (id int,real_name varchar(50),idol_name varchar(60),address varchar(255),idol_status varchar(25)); +DROP TABLE IF EXISTS testdb.SCHEDULE; +CREATE TABLE testdb.SCHEDULE (id int,venue varchar(50),event_name varchar(60),date_time varchar(50)); +DROP TABLE IF EXISTS testdb.REVENUE; +CREATE TABLE testdb.REVENUE (id int,monthly_rate varchar(50),date_time varchar(50)); From 0acb52c2976ff0891864fc71530087183f7ab460 Mon Sep 17 00:00:00 2001 From: rajithabhanuka Date: Thu, 13 Jan 2022 10:54:40 +0530 Subject: [PATCH 4/8] git ignore added --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2d513a0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/.idea/ +/target/ From 46f85ff238f5a50e7a99d24d91902f1792f9145d Mon Sep 17 00:00:00 2001 From: rajithabhanuka Date: Thu, 13 Jan 2022 13:32:37 +0530 Subject: [PATCH 5/8] crud operations completed --- pom.xml | 5 + .../demo/controller/IdolController.java | 54 +++++++ .../demo/dto/PersonalInformationDto.java | 51 +++++++ .../com/codejam/demo/dto/ResponseDto.java | 13 ++ .../java/com/codejam/demo/dto/RevenueDto.java | 17 +++ .../com/codejam/demo/dto/ScheduleDto.java | 19 +++ .../java/com/codejam/demo/dto/TodoDto.java | 25 +++ .../demo/model/PersonalInformationEntity.java | 12 +- .../com/codejam/demo/model/TodoEntity.java | 34 +++++ .../PersonalInformationRepository.java | 2 +- .../demo/repository/ScheduleRepository.java | 4 +- .../demo/repository/TodoRepository.java | 7 + .../service/PersonalInformationService.java | 17 +++ .../PersonalInformationServiceImpl.java | 142 ++++++++++++++++++ src/main/resources/application.properties | 5 +- src/main/resources/schema.sql | 8 +- target/classes/application.properties | 5 +- target/classes/schema.sql | 8 +- 18 files changed, 417 insertions(+), 11 deletions(-) create mode 100644 src/main/java/com/codejam/demo/controller/IdolController.java create mode 100644 src/main/java/com/codejam/demo/dto/PersonalInformationDto.java create mode 100644 src/main/java/com/codejam/demo/dto/ResponseDto.java create mode 100644 src/main/java/com/codejam/demo/dto/RevenueDto.java create mode 100644 src/main/java/com/codejam/demo/dto/ScheduleDto.java create mode 100644 src/main/java/com/codejam/demo/dto/TodoDto.java create mode 100644 src/main/java/com/codejam/demo/model/TodoEntity.java create mode 100644 src/main/java/com/codejam/demo/repository/TodoRepository.java create mode 100644 src/main/java/com/codejam/demo/service/PersonalInformationService.java create mode 100644 src/main/java/com/codejam/demo/service/PersonalInformationServiceImpl.java diff --git a/pom.xml b/pom.xml index 4cea3b2..0015760 100644 --- a/pom.xml +++ b/pom.xml @@ -71,6 +71,11 @@ reactor-test test + + org.springframework.boot + spring-boot-starter-validation + + diff --git a/src/main/java/com/codejam/demo/controller/IdolController.java b/src/main/java/com/codejam/demo/controller/IdolController.java new file mode 100644 index 0000000..b5c5aa0 --- /dev/null +++ b/src/main/java/com/codejam/demo/controller/IdolController.java @@ -0,0 +1,54 @@ +package com.codejam.demo.controller; + +import com.codejam.demo.dto.PersonalInformationDto; +import com.codejam.demo.dto.ResponseDto; +import com.codejam.demo.service.PersonalInformationService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; + +@RestController +@RequestMapping("/idol") +public class IdolController { + + private final PersonalInformationService personalInformationService; + + @Autowired + public IdolController(PersonalInformationService personalInformationService) { + this.personalInformationService = personalInformationService; + } + + @PostMapping(path = "/users", consumes = MediaType.APPLICATION_JSON_VALUE, + produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity save(@Valid @RequestBody PersonalInformationDto dto) { + + return personalInformationService.save(dto); + + } + + @GetMapping(path = "users/{id}") + public ResponseEntity get( + @PathVariable(value = "id") Integer id + ) { + return personalInformationService.get(id); + } + + @PutMapping(path = "/users", consumes = MediaType.APPLICATION_JSON_VALUE, + produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity updateById(@Valid @RequestBody PersonalInformationDto dto) { + + return personalInformationService.update(dto); + + } + + @DeleteMapping(path = "users/{id}") + public ResponseEntity deleteById( + @PathVariable(value = "id") Integer id + ) { + return personalInformationService.delete(id); + } + +} diff --git a/src/main/java/com/codejam/demo/dto/PersonalInformationDto.java b/src/main/java/com/codejam/demo/dto/PersonalInformationDto.java new file mode 100644 index 0000000..35a0b83 --- /dev/null +++ b/src/main/java/com/codejam/demo/dto/PersonalInformationDto.java @@ -0,0 +1,51 @@ +package com.codejam.demo.dto; + +import com.codejam.demo.model.PersonalInformationEntity; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; +import lombok.Setter; +import org.springframework.beans.BeanUtils; + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; + + +@Getter +@Setter +public class PersonalInformationDto { + + private Integer id; + + @Min(value = 1, message = "todo id should not be less than 1") + @JsonProperty("todo_id") + @JsonInclude(JsonInclude.Include.NON_NULL) + private Integer todoId; + + @Pattern(regexp = "^[^<>%$@#]*$", message = "Real Name should not be contains special characters") + @NotEmpty(message = "Real Name should not be empty") + @NotNull(message = "Real Name should not be null") + @JsonProperty("real_name") + private String realName; + + @Pattern(regexp = "^[^<>%$@#]*$", message = "Idol Name should not be contains special characters") + @NotEmpty(message = "Idol Name should not be empty") + @NotNull(message = "Idol Name should not be null") + @JsonProperty("idol_name") + private String idolName; + + @JsonProperty(value = "address") + private String dateTime; + + @JsonProperty(value = "idol_status") + private String idolStatus; + + public PersonalInformationEntity toEntity() { + PersonalInformationEntity entity = new PersonalInformationEntity(); + BeanUtils.copyProperties(this, entity); + return entity; + } + +} diff --git a/src/main/java/com/codejam/demo/dto/ResponseDto.java b/src/main/java/com/codejam/demo/dto/ResponseDto.java new file mode 100644 index 0000000..6acd2fe --- /dev/null +++ b/src/main/java/com/codejam/demo/dto/ResponseDto.java @@ -0,0 +1,13 @@ +package com.codejam.demo.dto; + +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class ResponseDto { + + private String message; + +} diff --git a/src/main/java/com/codejam/demo/dto/RevenueDto.java b/src/main/java/com/codejam/demo/dto/RevenueDto.java new file mode 100644 index 0000000..b684769 --- /dev/null +++ b/src/main/java/com/codejam/demo/dto/RevenueDto.java @@ -0,0 +1,17 @@ +package com.codejam.demo.dto; + +import lombok.Getter; +import lombok.Setter; + + +@Getter +@Setter +public class RevenueDto { + + private Integer id; + + private String monthlyRate; + + private String dateTime; + +} diff --git a/src/main/java/com/codejam/demo/dto/ScheduleDto.java b/src/main/java/com/codejam/demo/dto/ScheduleDto.java new file mode 100644 index 0000000..0661b2f --- /dev/null +++ b/src/main/java/com/codejam/demo/dto/ScheduleDto.java @@ -0,0 +1,19 @@ +package com.codejam.demo.dto; + +import lombok.Getter; +import lombok.Setter; + + +@Getter +@Setter +public class ScheduleDto { + + private Integer id; + + private String venue; + + private String eventName; + + private String country; + +} diff --git a/src/main/java/com/codejam/demo/dto/TodoDto.java b/src/main/java/com/codejam/demo/dto/TodoDto.java new file mode 100644 index 0000000..88d0ebb --- /dev/null +++ b/src/main/java/com/codejam/demo/dto/TodoDto.java @@ -0,0 +1,25 @@ +package com.codejam.demo.dto; + +import com.codejam.demo.model.TodoEntity; +import lombok.Getter; +import lombok.Setter; +import org.springframework.beans.BeanUtils; + +@Getter +@Setter +public class TodoDto { + + private Integer userId; + + private Integer id; + + private String title; + + private boolean completed; + + public TodoEntity toEntity() { + TodoEntity entity = new TodoEntity(); + BeanUtils.copyProperties(this, entity); + return entity; + } +} diff --git a/src/main/java/com/codejam/demo/model/PersonalInformationEntity.java b/src/main/java/com/codejam/demo/model/PersonalInformationEntity.java index 49a0952..b5cc497 100644 --- a/src/main/java/com/codejam/demo/model/PersonalInformationEntity.java +++ b/src/main/java/com/codejam/demo/model/PersonalInformationEntity.java @@ -1,7 +1,9 @@ package com.codejam.demo.model; +import com.codejam.demo.dto.PersonalInformationDto; import lombok.Getter; import lombok.Setter; +import org.springframework.beans.BeanUtils; import javax.persistence.*; @@ -21,7 +23,15 @@ public class PersonalInformationEntity { @Column(name = "idol_name") private String idolName; - @Column(name = "date_time") + @Column(name = "address") private String dateTime; + @Column(name = "idol_status") + private String idolStatus; + + public PersonalInformationDto toDto() { + PersonalInformationDto dto = new PersonalInformationDto(); + BeanUtils.copyProperties(this, dto); + return dto; + } } diff --git a/src/main/java/com/codejam/demo/model/TodoEntity.java b/src/main/java/com/codejam/demo/model/TodoEntity.java new file mode 100644 index 0000000..163de80 --- /dev/null +++ b/src/main/java/com/codejam/demo/model/TodoEntity.java @@ -0,0 +1,34 @@ +package com.codejam.demo.model; + +import com.codejam.demo.dto.TodoDto; +import lombok.Getter; +import lombok.Setter; +import org.springframework.beans.BeanUtils; + +import javax.persistence.*; + +@Entity +@Getter +@Setter +@Table(name = "TODO", schema = "testdb") +public class TodoEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Integer id; + + @Column(name = "user_id") + private Integer userId; + + @Column(name = "title") + private String title; + + @Column(name = "completed") + private boolean completed; + + public TodoDto toEntity() { + TodoDto entity = new TodoDto(); + BeanUtils.copyProperties(this, entity); + return entity; + } +} diff --git a/src/main/java/com/codejam/demo/repository/PersonalInformationRepository.java b/src/main/java/com/codejam/demo/repository/PersonalInformationRepository.java index cf59330..82acdf5 100644 --- a/src/main/java/com/codejam/demo/repository/PersonalInformationRepository.java +++ b/src/main/java/com/codejam/demo/repository/PersonalInformationRepository.java @@ -3,5 +3,5 @@ import com.codejam.demo.model.PersonalInformationEntity; import org.springframework.data.repository.CrudRepository; -public interface PersonalInformationRepository extends CrudRepository { +public interface PersonalInformationRepository extends CrudRepository { } diff --git a/src/main/java/com/codejam/demo/repository/ScheduleRepository.java b/src/main/java/com/codejam/demo/repository/ScheduleRepository.java index 8f3ffc6..d0a2574 100644 --- a/src/main/java/com/codejam/demo/repository/ScheduleRepository.java +++ b/src/main/java/com/codejam/demo/repository/ScheduleRepository.java @@ -3,5 +3,7 @@ import com.codejam.demo.model.ScheduleEntity; import org.springframework.data.repository.CrudRepository; -public interface ScheduleRepository extends CrudRepository { +import javax.persistence.criteria.CriteriaBuilder; + +public interface ScheduleRepository extends CrudRepository { } diff --git a/src/main/java/com/codejam/demo/repository/TodoRepository.java b/src/main/java/com/codejam/demo/repository/TodoRepository.java new file mode 100644 index 0000000..8a62a78 --- /dev/null +++ b/src/main/java/com/codejam/demo/repository/TodoRepository.java @@ -0,0 +1,7 @@ +package com.codejam.demo.repository; + +import com.codejam.demo.model.TodoEntity; +import org.springframework.data.repository.CrudRepository; + +public interface TodoRepository extends CrudRepository { +} diff --git a/src/main/java/com/codejam/demo/service/PersonalInformationService.java b/src/main/java/com/codejam/demo/service/PersonalInformationService.java new file mode 100644 index 0000000..b617f66 --- /dev/null +++ b/src/main/java/com/codejam/demo/service/PersonalInformationService.java @@ -0,0 +1,17 @@ +package com.codejam.demo.service; + +import com.codejam.demo.dto.PersonalInformationDto; +import com.codejam.demo.dto.ResponseDto; +import org.springframework.http.ResponseEntity; + +public interface PersonalInformationService { + + ResponseEntity save(PersonalInformationDto dto); + + ResponseEntity get(Integer id); + + ResponseEntity update(PersonalInformationDto dto); + + ResponseEntity delete(Integer id); + +} diff --git a/src/main/java/com/codejam/demo/service/PersonalInformationServiceImpl.java b/src/main/java/com/codejam/demo/service/PersonalInformationServiceImpl.java new file mode 100644 index 0000000..1d6688b --- /dev/null +++ b/src/main/java/com/codejam/demo/service/PersonalInformationServiceImpl.java @@ -0,0 +1,142 @@ +package com.codejam.demo.service; + +import com.codejam.demo.dto.PersonalInformationDto; +import com.codejam.demo.dto.ResponseDto; +import com.codejam.demo.dto.TodoDto; +import com.codejam.demo.model.PersonalInformationEntity; +import com.codejam.demo.model.TodoEntity; +import com.codejam.demo.repository.PersonalInformationRepository; +import com.codejam.demo.repository.TodoRepository; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.client.RestTemplate; + +@Slf4j +@Service +public class PersonalInformationServiceImpl implements PersonalInformationService { + + @Value("${external.url.todo}") + private String url; + + private final PersonalInformationRepository personalInformationRepository; + private final TodoRepository todoRepository; + + @Autowired + public PersonalInformationServiceImpl(PersonalInformationRepository personalInformationRepository, + TodoRepository todoRepository) { + this.personalInformationRepository = personalInformationRepository; + this.todoRepository = todoRepository; + } + + /** + * + * @param dto json object for personal details + * @return a success response object with status message + */ + @Transactional + @Override + public ResponseEntity save(PersonalInformationDto dto) { + + log.info("INVOKED PERSONAL DETAILS SAVING METHOD"); + + TodoDto todoDto = getTodoDto(dto); + + PersonalInformationEntity personalInformationEntity = dto.toEntity(); + + TodoEntity todoEntity = todoDto.toEntity(); + + personalInformationRepository.save(personalInformationEntity); + todoRepository.save(todoEntity); + + log.info("COMPLETED PERSONAL DETAILS SAVING METHOD"); + + ResponseDto response = new ResponseDto(); + response.setMessage("Data saved successfully"); + + return ResponseEntity.status(HttpStatus.OK).body(response); + } + + @Override + public ResponseEntity get(Integer id) { + + log.info("INVOKED PERSONAL DETAILS GET METHOD"); + + PersonalInformationEntity entity = personalInformationRepository.findById(id).get(); + + log.info("COMPLETED PERSONAL DETAILS GET METHOD"); + + return ResponseEntity.status(HttpStatus.OK).body(entity.toDto()); + } + + /** + * + * @param dto json object for personal details + * @return a success response object with status message + */ + @Transactional + @Override + public ResponseEntity update(PersonalInformationDto dto) { + + log.info("INVOKED PERSONAL DETAILS UPDATING METHOD"); + + PersonalInformationEntity entity = personalInformationRepository.findById(dto.getId()).get(); + + TodoDto todoDto = getTodoDto(dto); + entity = dto.toEntity(); + + TodoEntity todoEntity = todoDto.toEntity(); + + personalInformationRepository.save(entity); + todoRepository.save(todoEntity); + + log.info("COMPLETED PERSONAL DETAILS UPDATING METHOD"); + + ResponseDto response = new ResponseDto(); + response.setMessage("Data updated successfully"); + + return ResponseEntity.status(HttpStatus.OK).body(response); + } + + @Override + public ResponseEntity delete(Integer id) { + + log.info("INVOKED PERSONAL DETAILS DELETING METHOD"); + + personalInformationRepository.deleteById(id); + + ResponseDto response = new ResponseDto(); + response.setMessage("Data deleted successfully"); + + log.info("COMPLETED PERSONAL DETAILS DELETING METHOD"); + + return ResponseEntity.status(HttpStatus.OK).body(response); + + } + + /** + * + * @param dto json object for personal details + * @return a todo object with status message + */ + private TodoDto getTodoDto(PersonalInformationDto dto) { + TodoDto todoDto = null; + + // From java 11 we can use webclient instead of rest template + RestTemplate restTemplate = new RestTemplate(); + + try { + todoDto = restTemplate + .getForObject(url.concat("/".concat(String.valueOf(dto.getTodoId()))), TodoDto.class); + + }catch (Exception e){ + log.error("ERROR WHILE PERSONAL DETAILS SAVING METHOD"); + } + return todoDto; + } + +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index f21726e..fca9a3a 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -7,4 +7,7 @@ spring.jpa.show-sql=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect #logging level -logging.level.org.springframework.web=DEBUG \ No newline at end of file +logging.level.org.springframework.web=DEBUG + +#external urls +external.url.todo=https://jsonplaceholder.typicode.com/todos \ No newline at end of file diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql index 7dd4b0f..596099b 100644 --- a/src/main/resources/schema.sql +++ b/src/main/resources/schema.sql @@ -1,8 +1,10 @@ CREATE SCHEMA IF NOT EXISTS testdb; DROP TABLE IF EXISTS testdb.PERSONAL_INFORMATION; -CREATE TABLE testdb.PERSONAL_INFORMATION (id int,real_name varchar(50),idol_name varchar(60),address varchar(255),idol_status varchar(25)); +CREATE TABLE testdb.PERSONAL_INFORMATION (id int PRIMARY KEY AUTO_INCREMENT,real_name varchar(50),idol_name varchar(60),address varchar(255),idol_status varchar(25)); DROP TABLE IF EXISTS testdb.SCHEDULE; -CREATE TABLE testdb.SCHEDULE (id int,venue varchar(50),event_name varchar(60),date_time varchar(50)); +CREATE TABLE testdb.SCHEDULE (id int PRIMARY KEY AUTO_INCREMENT,venue varchar(50),event_name varchar(60),date_time varchar(50)); DROP TABLE IF EXISTS testdb.REVENUE; -CREATE TABLE testdb.REVENUE (id int,monthly_rate varchar(50),date_time varchar(50)); +CREATE TABLE testdb.REVENUE (id int PRIMARY KEY AUTO_INCREMENT,monthly_rate varchar(50),date_time varchar(50)); +DROP TABLE IF EXISTS testdb.TODO; +CREATE TABLE testdb.TODO (id int PRIMARY KEY AUTO_INCREMENT, user_id int, title varchar(50), completed boolean); \ No newline at end of file diff --git a/target/classes/application.properties b/target/classes/application.properties index f21726e..fca9a3a 100644 --- a/target/classes/application.properties +++ b/target/classes/application.properties @@ -7,4 +7,7 @@ spring.jpa.show-sql=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect #logging level -logging.level.org.springframework.web=DEBUG \ No newline at end of file +logging.level.org.springframework.web=DEBUG + +#external urls +external.url.todo=https://jsonplaceholder.typicode.com/todos \ No newline at end of file diff --git a/target/classes/schema.sql b/target/classes/schema.sql index 7dd4b0f..596099b 100644 --- a/target/classes/schema.sql +++ b/target/classes/schema.sql @@ -1,8 +1,10 @@ CREATE SCHEMA IF NOT EXISTS testdb; DROP TABLE IF EXISTS testdb.PERSONAL_INFORMATION; -CREATE TABLE testdb.PERSONAL_INFORMATION (id int,real_name varchar(50),idol_name varchar(60),address varchar(255),idol_status varchar(25)); +CREATE TABLE testdb.PERSONAL_INFORMATION (id int PRIMARY KEY AUTO_INCREMENT,real_name varchar(50),idol_name varchar(60),address varchar(255),idol_status varchar(25)); DROP TABLE IF EXISTS testdb.SCHEDULE; -CREATE TABLE testdb.SCHEDULE (id int,venue varchar(50),event_name varchar(60),date_time varchar(50)); +CREATE TABLE testdb.SCHEDULE (id int PRIMARY KEY AUTO_INCREMENT,venue varchar(50),event_name varchar(60),date_time varchar(50)); DROP TABLE IF EXISTS testdb.REVENUE; -CREATE TABLE testdb.REVENUE (id int,monthly_rate varchar(50),date_time varchar(50)); +CREATE TABLE testdb.REVENUE (id int PRIMARY KEY AUTO_INCREMENT,monthly_rate varchar(50),date_time varchar(50)); +DROP TABLE IF EXISTS testdb.TODO; +CREATE TABLE testdb.TODO (id int PRIMARY KEY AUTO_INCREMENT, user_id int, title varchar(50), completed boolean); \ No newline at end of file From 5de8b315de16882d9a020126a3251398324afcac Mon Sep 17 00:00:00 2001 From: rajithabhanuka Date: Thu, 13 Jan 2022 13:45:12 +0530 Subject: [PATCH 6/8] error handling completed --- .../com/codejam/demo/constant/ErrorCodes.java | 11 ++++ .../codejam/demo/dto/ErrorResponseDto.java | 20 ++++++++ .../demo/exception/DataNotFoundException.java | 16 ++++++ .../DuplicateDataFoundException.java | 15 ++++++ .../codejam/demo/exception/ErrorAdvice.java | 50 +++++++++++++++++++ .../demo/exception/ExternalCallException.java | 16 ++++++ .../demo/exception/GeneralException.java | 16 ++++++ .../PersonalInformationServiceImpl.java | 28 +++++++---- 8 files changed, 162 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/codejam/demo/constant/ErrorCodes.java create mode 100644 src/main/java/com/codejam/demo/dto/ErrorResponseDto.java create mode 100644 src/main/java/com/codejam/demo/exception/DataNotFoundException.java create mode 100644 src/main/java/com/codejam/demo/exception/DuplicateDataFoundException.java create mode 100644 src/main/java/com/codejam/demo/exception/ErrorAdvice.java create mode 100644 src/main/java/com/codejam/demo/exception/ExternalCallException.java create mode 100644 src/main/java/com/codejam/demo/exception/GeneralException.java diff --git a/src/main/java/com/codejam/demo/constant/ErrorCodes.java b/src/main/java/com/codejam/demo/constant/ErrorCodes.java new file mode 100644 index 0000000..57a383e --- /dev/null +++ b/src/main/java/com/codejam/demo/constant/ErrorCodes.java @@ -0,0 +1,11 @@ +package com.codejam.demo.constant; + +public interface ErrorCodes { + + String LS001 = "LS001"; // Error code for data not found + + String LS002 = "LS002"; // Error code for external call failure + + String LS003 = "LS003"; // Error code for general error + +} diff --git a/src/main/java/com/codejam/demo/dto/ErrorResponseDto.java b/src/main/java/com/codejam/demo/dto/ErrorResponseDto.java new file mode 100644 index 0000000..c02f1b6 --- /dev/null +++ b/src/main/java/com/codejam/demo/dto/ErrorResponseDto.java @@ -0,0 +1,20 @@ +package com.codejam.demo.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@Builder +public class ErrorResponseDto { + + private final String message; + + private final String variable; + + @JsonProperty(value = "error_code") + private final String errorCode; + +} diff --git a/src/main/java/com/codejam/demo/exception/DataNotFoundException.java b/src/main/java/com/codejam/demo/exception/DataNotFoundException.java new file mode 100644 index 0000000..6734c97 --- /dev/null +++ b/src/main/java/com/codejam/demo/exception/DataNotFoundException.java @@ -0,0 +1,16 @@ +package com.codejam.demo.exception; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@AllArgsConstructor +public class DataNotFoundException extends RuntimeException { + + private final String message; + + private final String variable; + +} diff --git a/src/main/java/com/codejam/demo/exception/DuplicateDataFoundException.java b/src/main/java/com/codejam/demo/exception/DuplicateDataFoundException.java new file mode 100644 index 0000000..fdf7aaf --- /dev/null +++ b/src/main/java/com/codejam/demo/exception/DuplicateDataFoundException.java @@ -0,0 +1,15 @@ +package com.codejam.demo.exception; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@AllArgsConstructor +public class DuplicateDataFoundException extends RuntimeException{ + + private final String message; + + private final String variable; +} diff --git a/src/main/java/com/codejam/demo/exception/ErrorAdvice.java b/src/main/java/com/codejam/demo/exception/ErrorAdvice.java new file mode 100644 index 0000000..bccb0b2 --- /dev/null +++ b/src/main/java/com/codejam/demo/exception/ErrorAdvice.java @@ -0,0 +1,50 @@ +package com.codejam.demo.exception; + +import com.codejam.demo.constant.ErrorCodes; +import com.codejam.demo.dto.ErrorResponseDto; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; + +@ControllerAdvice +public class ErrorAdvice extends ResponseEntityExceptionHandler { + + @ExceptionHandler(DataNotFoundException.class) + public ResponseEntity handleDataNotFoundException(DataNotFoundException ex) { + + ErrorResponseDto errorResponseDto = ErrorResponseDto.builder() + .errorCode(ErrorCodes.LS001) + .message(ex.getMessage()) + .variable(ex.getVariable()).build(); + + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(errorResponseDto); + + } + + @ExceptionHandler(ExternalCallException.class) + public ResponseEntity handleExternalCallException(ExternalCallException ex) { + + ErrorResponseDto errorResponseDto = ErrorResponseDto.builder() + .errorCode(ErrorCodes.LS002) + .message(ex.getMessage()) + .variable(ex.getVariable()).build(); + + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(errorResponseDto); + + } + + @ExceptionHandler(GeneralException.class) + public ResponseEntity handleGeneralException(GeneralException ex) { + + ErrorResponseDto errorResponseDto = ErrorResponseDto.builder() + .errorCode(ErrorCodes.LS003) + .message(ex.getMessage()) + .variable(ex.getVariable()).build(); + + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(errorResponseDto); + + } + +} diff --git a/src/main/java/com/codejam/demo/exception/ExternalCallException.java b/src/main/java/com/codejam/demo/exception/ExternalCallException.java new file mode 100644 index 0000000..9615949 --- /dev/null +++ b/src/main/java/com/codejam/demo/exception/ExternalCallException.java @@ -0,0 +1,16 @@ +package com.codejam.demo.exception; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@AllArgsConstructor +public class ExternalCallException extends RuntimeException { + + private final String message; + + private final String variable; + +} diff --git a/src/main/java/com/codejam/demo/exception/GeneralException.java b/src/main/java/com/codejam/demo/exception/GeneralException.java new file mode 100644 index 0000000..7ff6586 --- /dev/null +++ b/src/main/java/com/codejam/demo/exception/GeneralException.java @@ -0,0 +1,16 @@ +package com.codejam.demo.exception; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@AllArgsConstructor +public class GeneralException extends RuntimeException { + + private final String message; + + private final String variable; + +} diff --git a/src/main/java/com/codejam/demo/service/PersonalInformationServiceImpl.java b/src/main/java/com/codejam/demo/service/PersonalInformationServiceImpl.java index 1d6688b..2a43396 100644 --- a/src/main/java/com/codejam/demo/service/PersonalInformationServiceImpl.java +++ b/src/main/java/com/codejam/demo/service/PersonalInformationServiceImpl.java @@ -3,6 +3,8 @@ import com.codejam.demo.dto.PersonalInformationDto; import com.codejam.demo.dto.ResponseDto; import com.codejam.demo.dto.TodoDto; +import com.codejam.demo.exception.DataNotFoundException; +import com.codejam.demo.exception.ExternalCallException; import com.codejam.demo.model.PersonalInformationEntity; import com.codejam.demo.model.TodoEntity; import com.codejam.demo.repository.PersonalInformationRepository; @@ -34,7 +36,6 @@ public PersonalInformationServiceImpl(PersonalInformationRepository personalInfo } /** - * * @param dto json object for personal details * @return a success response object with status message */ @@ -66,7 +67,8 @@ public ResponseEntity get(Integer id) { log.info("INVOKED PERSONAL DETAILS GET METHOD"); - PersonalInformationEntity entity = personalInformationRepository.findById(id).get(); + PersonalInformationEntity entity = personalInformationRepository.findById(id) + .orElseThrow(() -> new DataNotFoundException("Record can not be found", String.valueOf(id))); log.info("COMPLETED PERSONAL DETAILS GET METHOD"); @@ -74,7 +76,6 @@ public ResponseEntity get(Integer id) { } /** - * * @param dto json object for personal details * @return a success response object with status message */ @@ -84,14 +85,20 @@ public ResponseEntity update(PersonalInformationDto dto) { log.info("INVOKED PERSONAL DETAILS UPDATING METHOD"); - PersonalInformationEntity entity = personalInformationRepository.findById(dto.getId()).get(); + PersonalInformationEntity entity = personalInformationRepository.findById(dto.getId()) + .orElseThrow(() -> new DataNotFoundException("Record can not be found", String.valueOf(dto.getId()))); - TodoDto todoDto = getTodoDto(dto); - entity = dto.toEntity(); + entity.setDateTime(dto.getDateTime()); + entity.setId(dto.getId()); + entity.setIdolName(dto.getIdolName()); + entity.setIdolStatus(dto.getIdolStatus()); + entity.setRealName(dto.getRealName()); - TodoEntity todoEntity = todoDto.toEntity(); + TodoDto todoDto = getTodoDto(dto); + TodoEntity todoEntity = todoDto != null ? todoDto.toEntity() : null; personalInformationRepository.save(entity); + assert todoEntity != null; todoRepository.save(todoEntity); log.info("COMPLETED PERSONAL DETAILS UPDATING METHOD"); @@ -119,12 +126,12 @@ public ResponseEntity delete(Integer id) { } /** - * * @param dto json object for personal details * @return a todo object with status message */ private TodoDto getTodoDto(PersonalInformationDto dto) { - TodoDto todoDto = null; + + TodoDto todoDto; // From java 11 we can use webclient instead of rest template RestTemplate restTemplate = new RestTemplate(); @@ -133,8 +140,9 @@ private TodoDto getTodoDto(PersonalInformationDto dto) { todoDto = restTemplate .getForObject(url.concat("/".concat(String.valueOf(dto.getTodoId()))), TodoDto.class); - }catch (Exception e){ + } catch (Exception e) { log.error("ERROR WHILE PERSONAL DETAILS SAVING METHOD"); + throw new ExternalCallException("Error occurred while getting data", url); } return todoDto; } From e7aa502592fab2241a4772deebac3e6f64d07cb3 Mon Sep 17 00:00:00 2001 From: rajithabhanuka Date: Thu, 13 Jan 2022 14:06:46 +0530 Subject: [PATCH 7/8] unit tests added --- .../demo/service/PersonalInformationTest.java | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/test/java/com/codejam/demo/service/PersonalInformationTest.java diff --git a/src/test/java/com/codejam/demo/service/PersonalInformationTest.java b/src/test/java/com/codejam/demo/service/PersonalInformationTest.java new file mode 100644 index 0000000..8cc980d --- /dev/null +++ b/src/test/java/com/codejam/demo/service/PersonalInformationTest.java @@ -0,0 +1,46 @@ +package com.codejam.demo.service; + +import com.codejam.demo.DemoApplication; +import com.codejam.demo.model.PersonalInformationEntity; +import com.codejam.demo.repository.PersonalInformationRepository; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.Optional; + +@SpringBootTest(classes = DemoApplication.class) +public class PersonalInformationTest { + + + @Autowired + private PersonalInformationRepository repository; + + @Test + public void randomPersonalInfoTest(){ + + Optional optional = repository.findById(1); + PersonalInformationEntity entity = null; + + if (optional.isPresent()){ + entity = optional.get(); + } + + Assertions.assertEquals("remy", entity.getIdolName()); + } + + @Test + public void IdolStatusTest(){ + + Optional optional = repository.findById(1); + PersonalInformationEntity entity = null; + + if (optional.isPresent()){ + entity = optional.get(); + } + + Assertions.assertEquals("ACTIVE", entity.getIdolStatus()); + } + +} From fdb07471712218dc2dfc9722f2918448b2c2d634 Mon Sep 17 00:00:00 2001 From: rajithabhanuka Date: Thu, 13 Jan 2022 14:25:30 +0530 Subject: [PATCH 8/8] red me added --- ReadMe.Md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 ReadMe.Md diff --git a/ReadMe.Md b/ReadMe.Md new file mode 100644 index 0000000..fb0e7c6 --- /dev/null +++ b/ReadMe.Md @@ -0,0 +1,32 @@ +``` +curl --location --request POST 'http://localhost:8080/idol/users' \ +--header 'Content-Type: application/json' \ +--data-raw '{ + "todo_id": 1, + "real_name": "Real Name 1", + "idol_name": "Idol Name 1", + "address": "Sri Lanka", + "idol_status": "Completed" +}' +``` + +``` +curl --location --request GET 'http://localhost:8080/idol/users/1' +``` + +``` +curl --location --request PUT 'http://localhost:8080/idol/users' \ +--header 'Content-Type: application/json' \ +--data-raw '{ + "id" : 1, + "todo_id": 1, + "real_name": "Real Name 1", + "idol_name": "Idol Name 1", + "address": "Sri Lanka", + "idol_status": "Completed" +}' +``` + +``` +curl --location --request DELETE 'http://localhost:8080/idol/users/1' +``` \ No newline at end of file