diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..2d513a0
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+/.idea/
+/target/
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/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
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/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/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/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/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/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/model/PersonalInformationEntity.java b/src/main/java/com/codejam/demo/model/PersonalInformationEntity.java
new file mode 100644
index 0000000..b5cc497
--- /dev/null
+++ b/src/main/java/com/codejam/demo/model/PersonalInformationEntity.java
@@ -0,0 +1,37 @@
+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.*;
+
+@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 = "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/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/ScheduleEntity.java b/src/main/java/com/codejam/demo/model/ScheduleEntity.java
new file mode 100644
index 0000000..2ff5af9
--- /dev/null
+++ b/src/main/java/com/codejam/demo/model/ScheduleEntity.java
@@ -0,0 +1,28 @@
+package com.codejam.demo.model;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.persistence.*;
+import java.util.Set;
+
+@Entity
+@Getter
+@Setter
+@Table(name = "SCHEDULE", schema = "testdb")
+public class ScheduleEntity {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Integer id;
+
+ @Column(name = "venue")
+ private String venue;
+
+ @Column(name = "event_name")
+ private String eventName;
+
+ @Column(name = "country")
+ private String country;
+
+}
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
new file mode 100644
index 0000000..82acdf5
--- /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..d0a2574
--- /dev/null
+++ b/src/main/java/com/codejam/demo/repository/ScheduleRepository.java
@@ -0,0 +1,9 @@
+package com.codejam.demo.repository;
+
+import com.codejam.demo.model.ScheduleEntity;
+import org.springframework.data.repository.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..2a43396
--- /dev/null
+++ b/src/main/java/com/codejam/demo/service/PersonalInformationServiceImpl.java
@@ -0,0 +1,150 @@
+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.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;
+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)
+ .orElseThrow(() -> new DataNotFoundException("Record can not be found", String.valueOf(id)));
+
+ 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())
+ .orElseThrow(() -> new DataNotFoundException("Record can not be found", String.valueOf(dto.getId())));
+
+ entity.setDateTime(dto.getDateTime());
+ entity.setId(dto.getId());
+ entity.setIdolName(dto.getIdolName());
+ entity.setIdolStatus(dto.getIdolStatus());
+ entity.setRealName(dto.getRealName());
+
+ 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");
+
+ 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;
+
+ // 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");
+ throw new ExternalCallException("Error occurred while getting data", url);
+ }
+ return todoDto;
+ }
+
+}
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 9deaf3e..fca9a3a 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -1,10 +1,13 @@
#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.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/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..596099b
--- /dev/null
+++ b/src/main/resources/schema.sql
@@ -0,0 +1,10 @@
+CREATE SCHEMA IF NOT EXISTS testdb;
+
+DROP TABLE IF EXISTS testdb.PERSONAL_INFORMATION;
+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 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 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/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());
+ }
+
+}
diff --git a/target/classes/application.properties b/target/classes/application.properties
new file mode 100644
index 0000000..fca9a3a
--- /dev/null
+++ b/target/classes/application.properties
@@ -0,0 +1,13 @@
+
+#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=none
+spring.jpa.show-sql=true
+spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
+
+#logging level
+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/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..596099b
--- /dev/null
+++ b/target/classes/schema.sql
@@ -0,0 +1,10 @@
+CREATE SCHEMA IF NOT EXISTS testdb;
+
+DROP TABLE IF EXISTS testdb.PERSONAL_INFORMATION;
+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 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 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