diff --git a/sampleApplication/pom.xml b/sampleApplication/pom.xml
new file mode 100644
index 0000000..cb55615
--- /dev/null
+++ b/sampleApplication/pom.xml
@@ -0,0 +1,92 @@
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.2.5.RELEASE
+
+
+ com.codingChallenge
+ sampleApplication
+ 0.0.1-SNAPSHOT
+ sampleApplication
+ Demo project for Spring Boot
+
+
+ 1.8
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-security
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.mybatis.spring.boot
+ mybatis-spring-boot-starter
+ 2.1.1
+
+
+ mysql
+ mysql-connector-java
+ 8.0.18
+
+
+ org.postgresql
+ postgresql
+ 42.2.10
+
+
+ org.springframework.boot
+ spring-boot-starter-jdbc
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.junit.vintage
+ junit-vintage-engine
+
+
+
+
+ org.slf4j
+ slf4j-api
+ 1.7.26
+
+
+ org.projectlombok
+ lombok
+ provided
+ true
+
+
+ com.github.pagehelper
+ pagehelper-spring-boot-starter
+ 1.2.12
+
+
+ org.springframework.security
+ spring-security-test
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
diff --git a/sampleApplication/src/main/java/com/codingChallenge/sampleApplication/SampleApplication.java b/sampleApplication/src/main/java/com/codingChallenge/sampleApplication/SampleApplication.java
new file mode 100644
index 0000000..2a7aaf1
--- /dev/null
+++ b/sampleApplication/src/main/java/com/codingChallenge/sampleApplication/SampleApplication.java
@@ -0,0 +1,15 @@
+package com.codingChallenge.sampleApplication;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
+
+@SpringBootApplication(exclude={SecurityAutoConfiguration.class})
+public class SampleApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(SampleApplication.class, args);
+ }
+
+}
diff --git a/sampleApplication/src/main/java/com/codingChallenge/sampleApplication/common/CommonPage.java b/sampleApplication/src/main/java/com/codingChallenge/sampleApplication/common/CommonPage.java
new file mode 100644
index 0000000..806abc4
--- /dev/null
+++ b/sampleApplication/src/main/java/com/codingChallenge/sampleApplication/common/CommonPage.java
@@ -0,0 +1,26 @@
+package com.codingChallenge.sampleApplication.common;
+
+import com.github.pagehelper.PageInfo;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class CommonPage {
+ private Integer page;
+ private Integer perPage;
+ private Integer totalPages;
+ private Long total;
+ private List list;
+
+ public static CommonPage restPage(List list) {
+ CommonPage result = new CommonPage();
+ PageInfo pageInfo = new PageInfo(list);
+ result.setTotalPages(pageInfo.getPages());
+ result.setPage(pageInfo.getPageNum());
+ result.setPerPage(pageInfo.getPageSize());
+ result.setTotal(pageInfo.getTotal());
+ result.setList(pageInfo.getList());
+ return result;
+ }
+}
diff --git a/sampleApplication/src/main/java/com/codingChallenge/sampleApplication/common/CommonResponse.java b/sampleApplication/src/main/java/com/codingChallenge/sampleApplication/common/CommonResponse.java
new file mode 100644
index 0000000..57f56b0
--- /dev/null
+++ b/sampleApplication/src/main/java/com/codingChallenge/sampleApplication/common/CommonResponse.java
@@ -0,0 +1,109 @@
+package com.codingChallenge.sampleApplication.common;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.http.HttpStatus;
+
+import java.util.List;
+
+@NoArgsConstructor
+@Data
+public class CommonResponse {
+ private long code;
+ private String[] messages;
+ private List errItems;
+ private T result;
+
+ protected CommonResponse(long code, String message, T data) {
+ this.code = code;
+ if (messages == null) {
+ messages = new String[]{message};
+ }
+ result = data;
+ }
+
+ protected CommonResponse(long code, String[] messages, List errItems) {
+ this.code = code;
+ this.messages = messages;
+ this.errItems = errItems;
+ }
+
+ /**
+ * @param data
+ * @param message
+ * @param
+ * @return
+ */
+ public static CommonResponse success(T data, String message) {
+ return new CommonResponse(HttpStatus.OK.value(), message, data);
+ }
+
+ /**
+ * @param message
+ * @param
+ * @return
+ */
+ public static CommonResponse success(String message) {
+ return new CommonResponse(HttpStatus.OK.value(), message, null);
+ }
+
+ public static CommonResponse success(T data) {
+ return new CommonResponse(HttpStatus.OK.value(), HttpStatus.OK.getReasonPhrase(), data);
+ }
+
+ /**
+ * @param errorCode
+ * @param
+ * @return
+ */
+ public static CommonResponse failed(HttpStatus errorCode) {
+ return new CommonResponse(errorCode.value(), errorCode.getReasonPhrase(), null);
+ }
+
+ /**
+ * @param errorCode
+ * @param message
+ * @param
+ * @return
+ */
+ public static CommonResponse failed(HttpStatus errorCode, String message) {
+ return new CommonResponse(errorCode.value(), message, null);
+ }
+
+ /**
+ * @param errorCode
+ * @param messages
+ * @param errItems
+ * @param
+ * @return
+ */
+ public static CommonResponse failed(HttpStatus errorCode, String[] messages, List errItems) {
+ return new CommonResponse(errorCode.value(), messages, errItems);
+ }
+
+ /**
+ * @param messages
+ * @param
+ * @return
+ */
+ public static CommonResponse failed(String messages) {
+ return new CommonResponse(HttpStatus.INTERNAL_SERVER_ERROR.value(), messages, null);
+ }
+
+ /**
+ * @param
+ * @return
+ */
+ public static CommonResponse failed() {
+ return failed(HttpStatus.INTERNAL_SERVER_ERROR);
+ }
+
+ /**
+ * @param data
+ * @param
+ * @return
+ */
+ public static CommonResponse unauthorized(T data) {
+ return new CommonResponse(HttpStatus.UNAUTHORIZED.value(), HttpStatus.UNAUTHORIZED.getReasonPhrase(), data);
+ }
+}
diff --git a/sampleApplication/src/main/java/com/codingChallenge/sampleApplication/controller/UserController.java b/sampleApplication/src/main/java/com/codingChallenge/sampleApplication/controller/UserController.java
new file mode 100644
index 0000000..6454177
--- /dev/null
+++ b/sampleApplication/src/main/java/com/codingChallenge/sampleApplication/controller/UserController.java
@@ -0,0 +1,27 @@
+package com.codingChallenge.sampleApplication.controller;
+
+import com.codingChallenge.sampleApplication.common.CommonPage;
+import com.codingChallenge.sampleApplication.common.CommonResponse;
+import com.codingChallenge.sampleApplication.dto.UserInfoDto;
+import com.codingChallenge.sampleApplication.service.UserService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/api")
+public class UserController {
+
+ @Autowired
+ UserService userService;
+
+ @GetMapping("/users")
+ public CommonResponse> userList(@RequestParam(defaultValue = "1") int page,
+ @RequestParam(defaultValue = "12") int limit) {
+ List userList = userService.getUserList(page, limit);
+ return CommonResponse.success(CommonPage.restPage(userList));
+ }
+}
diff --git a/sampleApplication/src/main/java/com/codingChallenge/sampleApplication/dto/ProductDto.java b/sampleApplication/src/main/java/com/codingChallenge/sampleApplication/dto/ProductDto.java
new file mode 100644
index 0000000..99d3e29
--- /dev/null
+++ b/sampleApplication/src/main/java/com/codingChallenge/sampleApplication/dto/ProductDto.java
@@ -0,0 +1,13 @@
+package com.codingChallenge.sampleApplication.dto;
+
+import lombok.Data;
+
+@Data
+public class ProductDto {
+ private Long id;
+ private String name;
+ private Integer year;
+ private String color;
+ private String pantone_value;
+}
+
diff --git a/sampleApplication/src/main/java/com/codingChallenge/sampleApplication/dto/UserInfoDto.java b/sampleApplication/src/main/java/com/codingChallenge/sampleApplication/dto/UserInfoDto.java
new file mode 100644
index 0000000..e376d96
--- /dev/null
+++ b/sampleApplication/src/main/java/com/codingChallenge/sampleApplication/dto/UserInfoDto.java
@@ -0,0 +1,12 @@
+package com.codingChallenge.sampleApplication.dto;
+
+import lombok.Data;
+
+@Data
+public class UserInfoDto {
+ private Long id;
+ private String email;
+ private String first_name;
+ private String last_name;
+ private String avatar;
+}
diff --git a/sampleApplication/src/main/java/com/codingChallenge/sampleApplication/entity/LoginEntity.java b/sampleApplication/src/main/java/com/codingChallenge/sampleApplication/entity/LoginEntity.java
new file mode 100644
index 0000000..7870fdf
--- /dev/null
+++ b/sampleApplication/src/main/java/com/codingChallenge/sampleApplication/entity/LoginEntity.java
@@ -0,0 +1,17 @@
+package com.codingChallenge.sampleApplication.entity;
+
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+public class LoginEntity {
+ private Long id;
+ private String name;
+ private String email;
+ private String password;
+ private Boolean active;
+ private Integer previlige;
+ private LocalDateTime created_at;
+ private LocalDateTime updated_at;
+}
diff --git a/sampleApplication/src/main/java/com/codingChallenge/sampleApplication/entity/ProductEntity.java b/sampleApplication/src/main/java/com/codingChallenge/sampleApplication/entity/ProductEntity.java
new file mode 100644
index 0000000..fef10d9
--- /dev/null
+++ b/sampleApplication/src/main/java/com/codingChallenge/sampleApplication/entity/ProductEntity.java
@@ -0,0 +1,17 @@
+package com.codingChallenge.sampleApplication.entity;
+
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+public class ProductEntity {
+ private Long id;
+ private String name;
+ private String color;
+ private String pantone_value;
+ private String code;
+ private Integer year;
+ private LocalDateTime created_at;
+ private LocalDateTime updated_at;
+ }
diff --git a/sampleApplication/src/main/java/com/codingChallenge/sampleApplication/entity/UserEntity.java b/sampleApplication/src/main/java/com/codingChallenge/sampleApplication/entity/UserEntity.java
new file mode 100644
index 0000000..d908ba5
--- /dev/null
+++ b/sampleApplication/src/main/java/com/codingChallenge/sampleApplication/entity/UserEntity.java
@@ -0,0 +1,21 @@
+package com.codingChallenge.sampleApplication.entity;
+
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+public class UserEntity {
+ private Long id;
+ private String first_name;
+ private String last_name;
+ private String email;
+ private Integer age;
+ private String address;
+ private String city;
+ private String postCode;
+ private LocalDateTime dob;
+ private String avatar;
+ private LocalDateTime created_at;
+ private LocalDateTime updated_at;
+}
diff --git a/sampleApplication/src/main/java/com/codingChallenge/sampleApplication/enums/ErrorStatus.java b/sampleApplication/src/main/java/com/codingChallenge/sampleApplication/enums/ErrorStatus.java
new file mode 100644
index 0000000..65bc62e
--- /dev/null
+++ b/sampleApplication/src/main/java/com/codingChallenge/sampleApplication/enums/ErrorStatus.java
@@ -0,0 +1,14 @@
+package com.codingChallenge.sampleApplication.enums;
+
+public enum ErrorStatus {
+ DATA_NOT_FOUND("Data not found");
+ private final String errMsg;
+
+ ErrorStatus(String errMsg) {
+ this.errMsg = errMsg;
+ }
+
+ public String getErrorMessage() {
+ return errMsg;
+ }
+}
diff --git a/sampleApplication/src/main/java/com/codingChallenge/sampleApplication/exception/ServiceException.java b/sampleApplication/src/main/java/com/codingChallenge/sampleApplication/exception/ServiceException.java
new file mode 100644
index 0000000..846a4bb
--- /dev/null
+++ b/sampleApplication/src/main/java/com/codingChallenge/sampleApplication/exception/ServiceException.java
@@ -0,0 +1,18 @@
+package com.codingChallenge.sampleApplication.exception;
+
+import com.codingChallenge.sampleApplication.enums.ErrorStatus;
+import lombok.Data;
+
+import java.text.MessageFormat;
+
+@Data
+public class ServiceException extends RuntimeException{
+ private static final long serialVersionUID = 123456789098L;
+ public ServiceException(ErrorStatus errorStatus){
+ super(errorStatus.getErrorMessage());
+ }
+
+ public ServiceException(ErrorStatus errorStatus, Object... params){
+ super(MessageFormat.format(errorStatus.getErrorMessage(), params));
+ }
+}
diff --git a/sampleApplication/src/main/java/com/codingChallenge/sampleApplication/mapper/UserMapper.java b/sampleApplication/src/main/java/com/codingChallenge/sampleApplication/mapper/UserMapper.java
new file mode 100644
index 0000000..ee61b19
--- /dev/null
+++ b/sampleApplication/src/main/java/com/codingChallenge/sampleApplication/mapper/UserMapper.java
@@ -0,0 +1,11 @@
+package com.codingChallenge.sampleApplication.mapper;
+
+import com.codingChallenge.sampleApplication.dto.UserInfoDto;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+@Mapper
+public interface UserMapper {
+ List getList();
+}
diff --git a/sampleApplication/src/main/java/com/codingChallenge/sampleApplication/service/UserService.java b/sampleApplication/src/main/java/com/codingChallenge/sampleApplication/service/UserService.java
new file mode 100644
index 0000000..3e20a74
--- /dev/null
+++ b/sampleApplication/src/main/java/com/codingChallenge/sampleApplication/service/UserService.java
@@ -0,0 +1,85 @@
+package com.codingChallenge.sampleApplication.service;
+
+import com.codingChallenge.sampleApplication.dto.UserInfoDto;
+import com.codingChallenge.sampleApplication.enums.ErrorStatus;
+import com.codingChallenge.sampleApplication.exception.ServiceException;
+import com.codingChallenge.sampleApplication.mapper.UserMapper;
+import com.github.pagehelper.PageHelper;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+@RequiredArgsConstructor
+public class UserService {
+ private final UserMapper userMapper;
+
+ public List getUserList(int page, int limit) {
+ PageHelper.startPage(page, limit);
+ // Following Mapper call fetch the usr list from DB
+ //List userList = userMapper.getList();
+ // Sample output
+ List userList = getUserSampleList();
+ if (userList.size() == 0) {
+ throw new ServiceException(ErrorStatus.DATA_NOT_FOUND);
+ }
+ return userList;
+
+ }
+
+
+ private List getUserSampleList() {
+ List list = new ArrayList<>();
+ UserInfoDto usr1 = new UserInfoDto();
+ usr1.setId(7L);
+ usr1.setEmail("michael.lawson@reqres.in");
+ usr1.setFirst_name("Michael");
+ usr1.setLast_name("Lawson");
+ usr1.setAvatar("https://s3.amazonaws.com/uifaces/faces/twitter/follettkyle/128.jpg");
+ list.add(usr1);
+
+ UserInfoDto usr2 = new UserInfoDto();
+ usr2.setId(8L);
+ usr2.setEmail("lindsay.ferguson@reqres.in");
+ usr2.setFirst_name("Lindsay");
+ usr2.setLast_name("Ferguson");
+ usr2.setAvatar("https://s3.amazonaws.com/uifaces/faces/twitter/araa3185/128.jpg");
+ list.add(usr2);
+
+ UserInfoDto usr3 = new UserInfoDto();
+ usr3.setId(9L);
+ usr3.setEmail("tobias.funke@reqres.in");
+ usr3.setFirst_name("Tobias");
+ usr3.setLast_name("Funke");
+ usr3.setAvatar("https://s3.amazonaws.com/uifaces/faces/twitter/vivekprvr/128.jpg");
+ list.add(usr3);
+
+ UserInfoDto usr4 = new UserInfoDto();
+ usr4.setId(10L);
+ usr4.setEmail("byron.fields@reqres.in");
+ usr4.setFirst_name("Byron");
+ usr4.setLast_name("Fields");
+ usr4.setAvatar("https://s3.amazonaws.com/uifaces/faces/twitter/russoedu/128.jpg");
+ list.add(usr4);
+
+ UserInfoDto usr5 = new UserInfoDto();
+ usr5.setId(11L);
+ usr5.setEmail("byron.fields@reqres.in");
+ usr5.setFirst_name("Byron");
+ usr5.setLast_name("Fields");
+ usr5.setAvatar("https://s3.amazonaws.com/uifaces/faces/twitter/russoedu/128.jpg");
+ list.add(usr5);
+
+ UserInfoDto usr6 = new UserInfoDto();
+ usr6.setId(12L);
+ usr6.setEmail("rachel.howell@reqres.in");
+ usr6.setFirst_name("Rachel");
+ usr6.setLast_name("Howell");
+ usr6.setAvatar("https://s3.amazonaws.com/uifaces/faces/twitter/hebertialmeida/128.jpg");
+ list.add(usr6);
+
+ return list;
+ }
+}
diff --git a/sampleApplication/src/main/resources/application.properties b/sampleApplication/src/main/resources/application.properties
new file mode 100644
index 0000000..2770ab8
--- /dev/null
+++ b/sampleApplication/src/main/resources/application.properties
@@ -0,0 +1,9 @@
+#Sampel DB commection
+spring.datasource.url=jdbd:postgresql://localhost:5432/testDb
+spring.datasource.username=postgres
+spring.datasource.password=testtest
+spring.datasource.driver-class-name=org.postgresql.Driver
+#Sample mybatis setting
+mybatis.configuration.map-underscore-to-camel-case=true
+mybatis.mapper-location=classpath*:/mappers/*.xml
+
diff --git a/sampleApplication/src/main/resources/mappers/UserMapper.xml b/sampleApplication/src/main/resources/mappers/UserMapper.xml
new file mode 100644
index 0000000..51d5c0c
--- /dev/null
+++ b/sampleApplication/src/main/resources/mappers/UserMapper.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
diff --git a/sampleApplication/src/test/java/com/codingChallenge/sampleApplication/SampleApplicationTests.java b/sampleApplication/src/test/java/com/codingChallenge/sampleApplication/SampleApplicationTests.java
new file mode 100644
index 0000000..867f810
--- /dev/null
+++ b/sampleApplication/src/test/java/com/codingChallenge/sampleApplication/SampleApplicationTests.java
@@ -0,0 +1,13 @@
+package com.codingChallenge.sampleApplication;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class SampleApplicationTests {
+
+ @Test
+ void contextLoads() {
+ }
+
+}