From d31e51f428cf8ab01a3cb0cdfad7f39419b57cdf Mon Sep 17 00:00:00 2001 From: engrashed008 Date: Sun, 1 Mar 2020 10:27:57 +0900 Subject: [PATCH] Feature/Ticket-1 Sample Environment setup --- sampleApplication/pom.xml | 92 +++++++++++++++ .../sampleApplication/SampleApplication.java | 15 +++ .../sampleApplication/common/CommonPage.java | 26 +++++ .../common/CommonResponse.java | 109 ++++++++++++++++++ .../controller/UserController.java | 27 +++++ .../sampleApplication/dto/ProductDto.java | 13 +++ .../sampleApplication/dto/UserInfoDto.java | 12 ++ .../sampleApplication/entity/LoginEntity.java | 17 +++ .../entity/ProductEntity.java | 17 +++ .../sampleApplication/entity/UserEntity.java | 21 ++++ .../sampleApplication/enums/ErrorStatus.java | 14 +++ .../exception/ServiceException.java | 18 +++ .../sampleApplication/mapper/UserMapper.java | 11 ++ .../service/UserService.java | 85 ++++++++++++++ .../src/main/resources/application.properties | 9 ++ .../src/main/resources/mappers/UserMapper.xml | 10 ++ .../SampleApplicationTests.java | 13 +++ 17 files changed, 509 insertions(+) create mode 100644 sampleApplication/pom.xml create mode 100644 sampleApplication/src/main/java/com/codingChallenge/sampleApplication/SampleApplication.java create mode 100644 sampleApplication/src/main/java/com/codingChallenge/sampleApplication/common/CommonPage.java create mode 100644 sampleApplication/src/main/java/com/codingChallenge/sampleApplication/common/CommonResponse.java create mode 100644 sampleApplication/src/main/java/com/codingChallenge/sampleApplication/controller/UserController.java create mode 100644 sampleApplication/src/main/java/com/codingChallenge/sampleApplication/dto/ProductDto.java create mode 100644 sampleApplication/src/main/java/com/codingChallenge/sampleApplication/dto/UserInfoDto.java create mode 100644 sampleApplication/src/main/java/com/codingChallenge/sampleApplication/entity/LoginEntity.java create mode 100644 sampleApplication/src/main/java/com/codingChallenge/sampleApplication/entity/ProductEntity.java create mode 100644 sampleApplication/src/main/java/com/codingChallenge/sampleApplication/entity/UserEntity.java create mode 100644 sampleApplication/src/main/java/com/codingChallenge/sampleApplication/enums/ErrorStatus.java create mode 100644 sampleApplication/src/main/java/com/codingChallenge/sampleApplication/exception/ServiceException.java create mode 100644 sampleApplication/src/main/java/com/codingChallenge/sampleApplication/mapper/UserMapper.java create mode 100644 sampleApplication/src/main/java/com/codingChallenge/sampleApplication/service/UserService.java create mode 100644 sampleApplication/src/main/resources/application.properties create mode 100644 sampleApplication/src/main/resources/mappers/UserMapper.xml create mode 100644 sampleApplication/src/test/java/com/codingChallenge/sampleApplication/SampleApplicationTests.java 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() { + } + +}