diff --git a/.gitignore b/.gitignore
index 177b7288a..6ae810620 100644
--- a/.gitignore
+++ b/.gitignore
@@ -367,4 +367,8 @@ jdk_8_maven/em/external/rest/spring-batch-rest/target
/jdk_11_maven/cs/rest/http-patch-spring/target
/jdk_11_maven/em/embedded/rest/http-patch-spring/target
-/jdk_11_maven/em/external/rest/http-patch-spring/target
\ No newline at end of file
+/jdk_11_maven/em/external/rest/http-patch-spring/target
+
+/jdk_8_maven/cs/rest/original/angular-ecommerce/target
+/jdk_8_maven/em/embedded/rest/angular-ecommerce/target
+/jdk_8_maven/em/external/rest/angular-ecommerce/target
\ No newline at end of file
diff --git a/README.md b/README.md
index 285ae9102..841357a4e 100644
--- a/README.md
+++ b/README.md
@@ -70,7 +70,9 @@ For simplicity, all schemas are also available as JSON/YML files under the folde
> **IMPORTANT**: More details (e.g., #LOCs and used databases) on these APIs can be found [in this table](statistics/table_emb.md).
-### REST: Java/Kotlin (33)
+### REST: Java/Kotlin (34)
+
+* **Angular ECommerce** (not-known license), [jdk_8_maven/cs/rest/original/angular-ecommerce](jdk_8_maven/cs/rest/original/angular-ecommerce), from [https://github.com/SaiUpadhyayula/SpringAngularEcommerce](https://github.com/SaiUpadhyayula/SpringAngularEcommerce)
* **Bibliothek** (MIT), [jdk_17_gradle/cs/rest/bibliothek](jdk_17_gradle/cs/rest/bibliothek), from [https://github.com/PaperMC/bibliothek](https://github.com/PaperMC/bibliothek)
diff --git a/dockerfiles/angular-ecommerce.dockerfile b/dockerfiles/angular-ecommerce.dockerfile
new file mode 100644
index 000000000..66f4da708
--- /dev/null
+++ b/dockerfiles/angular-ecommerce.dockerfile
@@ -0,0 +1,17 @@
+FROM amazoncorretto:8-alpine-jdk
+
+COPY ./dist/angular-ecommerce-sut.jar .
+COPY ./dist/jacocoagent.jar .
+
+
+
+#ENV TOOL="undefined"
+#ENV RUN="0"
+
+ENTRYPOINT \
+ java \
+# unfortunately dumponexit is completely unreliable in Docker :(
+# -javaagent:jacocoagent.jar=destfile=./jacoco/angular-ecommerce__${TOOL}__${RUN}__jacoco.exec,append=false,dumponexit=true \
+ -javaagent:jacocoagent.jar=output=tcpserver,address=*,port=6300,append=false,dumponexit=false \
+ -Dfile.encoding=ISO-8859-1 -jar angular-ecommerce-sut.jar \
+ --server.port=8080 --spring.datasource.host=mongodb --spring.datasource.port=27017 --spring.datasource.database=test --spring.data.mongodb.uri=mongodb://mongodb:27017/test --spring.redis.host=redis --spring.redis.port=6379 --spring.data.elasticsearch.cluster-name=elasticsearch --spring.data.elsticsearch.cluster-nodes=elastic:9300 --spring.cache.type=NONE
\ No newline at end of file
diff --git a/dockerfiles/angular-ecommerce.yaml b/dockerfiles/angular-ecommerce.yaml
new file mode 100644
index 000000000..0a32a587e
--- /dev/null
+++ b/dockerfiles/angular-ecommerce.yaml
@@ -0,0 +1,60 @@
+services:
+ sut-angular-ecommerce:
+ build:
+ dockerfile: ./dockerfiles/angular-ecommerce.dockerfile
+ context: ..
+# environment:
+# TOOL: ${TOOL:-undefined}
+# RUN: ${RUN:-0}
+ ports:
+ - "${HOST_PORT:-8080}:8080"
+ - "${JACOCO_PORT:-6300}:6300"
+# volumes:
+ # default env does not work on volumes
+# - ${JACOCODIR}:/jacoco
+
+ mongodb:
+ image: mongo:7.0
+ tmpfs:
+ - '/data/db'
+
+
+ environment:
+ MONGODB_REPLICA_SET_MODE: primary
+ ALLOW_EMPTY_PASSWORD: yes
+
+
+
+ volumes:
+ - ../scripts/dockerize/data/additional_files/angular-ecommerce/mongo_import.sh:/docker-entrypoint-initdb.d/mongo_import.sh
+ - ../scripts/dockerize/data/additional_files/angular-ecommerce/init.json:/fixtures/init.json
+
+
+
+
+
+ redis:
+ image: redis:7.0.11
+
+
+
+
+
+
+ elasticsearch:
+ image: docker.elastic.co/elasticsearch/elasticsearch:6.8.23
+ tmpfs:
+ - '/usr/share/elasticsearch/data'
+
+
+ environment:
+ - discovery.type=single-node
+ - cluster.name=elasticsearch
+ - ES_JAVA_OPTS=-Xms512m -Xmx512m
+ - xpack.security.enabled=false
+
+
+
+
+
+
diff --git a/jdk_8_maven/cs/rest/original/angular-ecommerce/README.md b/jdk_8_maven/cs/rest/original/angular-ecommerce/README.md
new file mode 100644
index 000000000..4b3645853
--- /dev/null
+++ b/jdk_8_maven/cs/rest/original/angular-ecommerce/README.md
@@ -0,0 +1,51 @@
+# SpringAngularEcommerce
+SpringAngularEcommerce is a shopping cart application developed as a pet project to get to know about different technologies.
+
+This project is still in development.
+
+Code for Angular app: https://github.com/SaiUpadhyayula/NgSpringShoppingStore-frontend
+
+#Features
+- Token Based User Authentication(JWT)
+- Product Search
+- Product Catalog
+- Payment Gateway (using Stripe) - TODO
+- Wishlist - TODO
+- Admin Console - TODO
+- Order Management - TODO
+- User Management - TODO
+- PDF Report Generation (Order Acknowledgment) - TODO
+
+
+#Technologies:
+- Spring Boot
+- Mongo DB
+- Angular
+- Redis for Caching
+- Elastic Search
+
+#Images of Application:
+1. Home Page
+
+
+
+2. Category Page
+
+
+
+3. Category Page With Filters
+
+
+
+4. Product Page
+
+
+
+5. Product Page - Review Section
+
+
+
+6. Search Page
+
+
+
diff --git a/jdk_8_maven/cs/rest/original/angular-ecommerce/pom.xml b/jdk_8_maven/cs/rest/original/angular-ecommerce/pom.xml
new file mode 100644
index 000000000..f06c2bcd8
--- /dev/null
+++ b/jdk_8_maven/cs/rest/original/angular-ecommerce/pom.xml
@@ -0,0 +1,165 @@
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.1.1.RELEASE
+
+
+ com.techie.shoppingstore
+ NGSpringShoppingStore
+ 0.0.1-SNAPSHOT
+ NGSpringShoppingStore
+ Demo project for Spring Boot
+
+
+ 1.8
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
+
+ org.springframework.boot
+ spring-boot-starter-cache
+
+
+ org.springframework.data
+ spring-data-mongodb
+
+
+ org.springframework.boot
+ spring-boot-starter-mail
+
+
+ org.springframework.boot
+ spring-boot-starter-security
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.security.oauth
+ spring-security-oauth2
+ 2.3.5.RELEASE
+
+
+ org.springframework.security
+ spring-security-jwt
+ 1.0.9.RELEASE
+
+
+ org.projectlombok
+ lombok
+ 1.18.4
+ provided
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.springframework.security
+ spring-security-test
+ test
+
+
+ io.jsonwebtoken
+ jjwt-api
+ 0.10.5
+
+
+ io.jsonwebtoken
+ jjwt-impl
+ runtime
+ 0.10.5
+
+
+ io.jsonwebtoken
+ jjwt-jackson
+ runtime
+ 0.10.5
+
+
+ org.springframework.boot
+ spring-boot-starter-thymeleaf
+
+
+ org.springframework.boot
+ spring-boot-starter-data-elasticsearch
+
+
+ com.mashape.unirest
+ unirest-java
+ 1.4.9
+
+
+ org.elasticsearch.client
+ elasticsearch-rest-high-level-client
+
+
+ org.springframework.boot
+ spring-boot-starter-data-redis
+
+
+ org.mapstruct
+ mapstruct
+ 1.3.0.Final
+
+
+
+ io.springfox
+ springfox-swagger2
+ 2.9.2
+
+
+ io.springfox
+ springfox-swagger-ui
+ 2.9.2
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+ angular-ecommerce
+ sut
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.5.1
+
+ 1.8
+ 1.8
+
+
+ org.mapstruct
+ mapstruct-processor
+ 1.3.0.Final
+
+
+ org.projectlombok
+ lombok
+ 1.18.4
+
+
+
+
+
+
+
+
diff --git a/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/NgSpringShoppingStoreApplication.java b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/NgSpringShoppingStoreApplication.java
new file mode 100644
index 000000000..e29884856
--- /dev/null
+++ b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/NgSpringShoppingStoreApplication.java
@@ -0,0 +1,20 @@
+package com.techie.shoppingstore;
+
+import com.techie.shoppingstore.config.AppSecurityConfig;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.context.annotation.Import;
+import org.springframework.scheduling.annotation.EnableAsync;
+
+@SpringBootApplication
+@EnableCaching
+@EnableAsync
+@Import(AppSecurityConfig.class)
+public class NgSpringShoppingStoreApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(NgSpringShoppingStoreApplication.class, args);
+ }
+
+}
\ No newline at end of file
diff --git a/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/config/AppSecurityConfig.java b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/config/AppSecurityConfig.java
new file mode 100644
index 000000000..810faefd2
--- /dev/null
+++ b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/config/AppSecurityConfig.java
@@ -0,0 +1,86 @@
+package com.techie.shoppingstore.config;
+
+import com.techie.shoppingstore.repository.UserRepository;
+import com.techie.shoppingstore.service.JWTAuthenticationFilter;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.http.HttpMethod;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.config.BeanIds;
+import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.builders.WebSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+import org.springframework.security.config.http.SessionCreationPolicy;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
+
+@EnableWebSecurity
+public class AppSecurityConfig extends WebSecurityConfigurerAdapter {
+
+ @Autowired
+ private UserRepository userRepository;
+ @Autowired
+ private UserDetailsService userDetailsService;
+ @Autowired
+ private UnauthorizedEntryPoint unauthorizedEntryPoint;
+ @Autowired
+ private CustomAccessDeniedHandler customAccessDeniedHandler;
+
+ @Bean
+ public JWTAuthenticationFilter jwtAuthenticationFilter() {
+ return new JWTAuthenticationFilter();
+ }
+
+ @Bean(BeanIds.AUTHENTICATION_MANAGER)
+ @Override
+ public AuthenticationManager authenticationManagerBean() throws Exception {
+ return super.authenticationManagerBean();
+ }
+
+ @Override
+ public void configure(WebSecurity web) {
+ web.ignoring()
+ .antMatchers(HttpMethod.OPTIONS, "/**");
+ }
+
+ @Override
+ public void configure(HttpSecurity httpSecurity) throws Exception {
+ httpSecurity
+ .cors()
+ .and()
+ .csrf()
+ .disable()
+ .exceptionHandling()
+ .authenticationEntryPoint(unauthorizedEntryPoint)
+ .and()
+ .sessionManagement()
+ .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
+ .and()
+ .authorizeRequests()
+ .antMatchers("/api/auth/**")
+ .permitAll()
+ .antMatchers("/api/store/catalog/**",
+// MODIFIED
+ "/v2/api-docs/**")
+ .permitAll()
+ .anyRequest().authenticated();
+
+
+ // Add our custom JWT security filter
+ httpSecurity.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
+ }
+
+ @Autowired
+ public void configureGlobal(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception {
+ authenticationManagerBuilder.userDetailsService(userDetailsService).passwordEncoder(encoder());
+ }
+
+ @Bean
+ PasswordEncoder encoder() {
+ return new BCryptPasswordEncoder(12);
+ }
+}
diff --git a/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/config/CustomAccessDeniedHandler.java b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/config/CustomAccessDeniedHandler.java
new file mode 100644
index 000000000..d4395062d
--- /dev/null
+++ b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/config/CustomAccessDeniedHandler.java
@@ -0,0 +1,20 @@
+package com.techie.shoppingstore.config;
+
+import org.springframework.security.access.AccessDeniedException;
+import org.springframework.security.web.access.AccessDeniedHandler;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+@Component
+public class CustomAccessDeniedHandler implements AccessDeniedHandler {
+ @Override
+ public void handle(HttpServletRequest httpServletRequest,
+ HttpServletResponse httpServletResponse,
+ AccessDeniedException accessDeniedException) throws IOException, ServletException {
+ httpServletResponse.setStatus(403);
+ }
+}
diff --git a/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/config/ElasticSearchConfig.java b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/config/ElasticSearchConfig.java
new file mode 100644
index 000000000..d7583d884
--- /dev/null
+++ b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/config/ElasticSearchConfig.java
@@ -0,0 +1,30 @@
+package com.techie.shoppingstore.config;
+
+import com.techie.shoppingstore.exceptions.SpringStoreException;
+import org.elasticsearch.client.Client;
+import org.elasticsearch.common.settings.Settings;
+import org.elasticsearch.common.transport.TransportAddress;
+import org.elasticsearch.transport.client.PreBuiltTransportClient;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+@Configuration
+@EnableElasticsearchRepositories
+public class ElasticSearchConfig {
+
+ @Bean
+ public Client client() {
+ System.setProperty("es.set.netty.runtime.available.processors", "false");
+ try {
+ return new PreBuiltTransportClient(Settings.EMPTY)
+ .addTransportAddress(new TransportAddress(InetAddress.getByName("localhost"), 9300));
+
+ } catch (UnknownHostException e) {
+ throw new SpringStoreException("An error occured when configuring Elastic Search");
+ }
+ }
+}
diff --git a/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/config/MailConfig.java b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/config/MailConfig.java
new file mode 100644
index 000000000..25c996110
--- /dev/null
+++ b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/config/MailConfig.java
@@ -0,0 +1,20 @@
+package com.techie.shoppingstore.config;
+
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@Data
+public class MailConfig {
+
+ @Value("${spring.mail.host}")
+ private String host;
+ @Value("${spring.mail.port}")
+ private int port;
+ @Value("${spring.mail.username}")
+ private String username;
+ @Value("${spring.mail.password}")
+ private String password;
+
+}
diff --git a/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/config/SwaggerConfig.java b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/config/SwaggerConfig.java
new file mode 100644
index 000000000..6a0f8fca7
--- /dev/null
+++ b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/config/SwaggerConfig.java
@@ -0,0 +1,17 @@
+package com.techie.shoppingstore.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+@Configuration
+@EnableSwagger2
+public class SwaggerConfig {
+
+ @Bean
+ public Docket api() {
+ return new Docket(DocumentationType.SWAGGER_2);
+ }
+}
\ No newline at end of file
diff --git a/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/config/UnauthorizedEntryPoint.java b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/config/UnauthorizedEntryPoint.java
new file mode 100644
index 000000000..f5a6c3654
--- /dev/null
+++ b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/config/UnauthorizedEntryPoint.java
@@ -0,0 +1,21 @@
+ package com.techie.shoppingstore.config;
+
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.web.AuthenticationEntryPoint;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+@Component
+public class UnauthorizedEntryPoint implements AuthenticationEntryPoint {
+
+ @Override
+ public void commence(HttpServletRequest httpServletRequest,
+ HttpServletResponse httpServletResponse,
+ AuthenticationException authenticationException) throws IOException, ServletException {
+ httpServletResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized");
+ }
+}
diff --git a/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/config/WebConfig.java b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/config/WebConfig.java
new file mode 100644
index 000000000..f9ca943f2
--- /dev/null
+++ b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/config/WebConfig.java
@@ -0,0 +1,44 @@
+package com.techie.shoppingstore.config;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+import com.techie.shoppingstore.service.ResponseSerializer;
+import org.elasticsearch.client.Response;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
+import org.springframework.web.servlet.config.annotation.EnableWebMvc;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+import java.util.List;
+
+@Configuration
+@EnableWebMvc
+public class WebConfig implements WebMvcConfigurer {
+
+ @Override
+ public void addCorsMappings(CorsRegistry corsRegistry) {
+ corsRegistry.addMapping("/**")
+ .allowedOrigins("*")
+ .allowedMethods("*")
+ .maxAge(3600L)
+ .allowedHeaders("*")
+ .exposedHeaders("Authorization")
+ .allowCredentials(true);
+ }
+
+ @Override
+ public void configureMessageConverters(List> converters) {
+ final MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
+ final ObjectMapper objectMapper = new ObjectMapper();
+ objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
+ SimpleModule simpleModule = new SimpleModule();
+ simpleModule.addSerializer(Response.class, new ResponseSerializer());
+ objectMapper.registerModule(simpleModule);
+ converter.setObjectMapper(objectMapper);
+ converters.add(converter);
+ WebMvcConfigurer.super.configureMessageConverters(converters);
+ }
+}
diff --git a/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/controller/AdminController.java b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/controller/AdminController.java
new file mode 100644
index 000000000..0c1039d3f
--- /dev/null
+++ b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/controller/AdminController.java
@@ -0,0 +1,9 @@
+package com.techie.shoppingstore.controller;
+
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class AdminController {
+
+
+}
diff --git a/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/controller/AuthController.java b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/controller/AuthController.java
new file mode 100644
index 000000000..6585a462a
--- /dev/null
+++ b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/controller/AuthController.java
@@ -0,0 +1,47 @@
+package com.techie.shoppingstore.controller;
+
+import com.techie.shoppingstore.dto.AuthenticationResponse;
+import com.techie.shoppingstore.dto.LoginRequestDto;
+import com.techie.shoppingstore.dto.RegisterRequestDto;
+import com.techie.shoppingstore.exceptions.ApiResponse;
+import com.techie.shoppingstore.service.AuthService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+
+@RestController
+@RequestMapping("/api/auth/")
+@Slf4j
+public class AuthController {
+
+ private final AuthService authService;
+
+ @Autowired
+ public AuthController(AuthService authService) {
+ this.authService = authService;
+ }
+
+ @PostMapping("login")
+ public ResponseEntity login(@Valid @RequestBody LoginRequestDto loginRequestDto) {
+ return new ResponseEntity<>(authService.authenticate(loginRequestDto), HttpStatus.OK);
+ }
+
+ @PostMapping("register")
+ public ResponseEntity register(@Valid @RequestBody RegisterRequestDto registerRequestDto) {
+ if (authService.existsByUserName(registerRequestDto)) {
+ return new ResponseEntity<>(new ApiResponse(400, "Username already exists"), HttpStatus.BAD_REQUEST);
+ }
+
+ authService.createUser(registerRequestDto);
+ return new ResponseEntity<>(new ApiResponse(200, "User Registration Completed Successfully!!"), HttpStatus.OK);
+ }
+
+ @GetMapping("accountVerification/{token}")
+ public ApiResponse verifyAccount(@PathVariable String token) {
+ return authService.verifyAccount(token);
+ }
+}
diff --git a/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/controller/CartController.java b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/controller/CartController.java
new file mode 100644
index 000000000..1303b2743
--- /dev/null
+++ b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/controller/CartController.java
@@ -0,0 +1,26 @@
+package com.techie.shoppingstore.controller;
+
+import com.techie.shoppingstore.service.CartService;
+import lombok.AllArgsConstructor;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/api/cart/")
+@AllArgsConstructor
+public class CartController {
+
+ private final CartService cartService;
+
+ @PostMapping("/add/{sku}")
+ public ResponseEntity addToCart(@PathVariable String sku) {
+ cartService.addToCart(sku);
+ return new ResponseEntity(HttpStatus.OK);
+ }
+
+
+}
diff --git a/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/controller/CatalogController.java b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/controller/CatalogController.java
new file mode 100644
index 000000000..cac5e0b8d
--- /dev/null
+++ b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/controller/CatalogController.java
@@ -0,0 +1,74 @@
+package com.techie.shoppingstore.controller;
+
+import com.techie.shoppingstore.dto.CategoryDto;
+import com.techie.shoppingstore.dto.ProductDto;
+import com.techie.shoppingstore.dto.ProductSearchResponseDto;
+import com.techie.shoppingstore.dto.SearchQueryDto;
+import com.techie.shoppingstore.service.CategoryService;
+import com.techie.shoppingstore.service.ProductService;
+import com.techie.shoppingstore.service.SearchService;
+import lombok.AllArgsConstructor;
+import org.springframework.http.ResponseEntity;
+import org.springframework.util.StopWatch;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static org.springframework.http.HttpStatus.OK;
+
+@RestController
+@RequestMapping("/api/store/catalog/")
+@AllArgsConstructor
+public class CatalogController {
+ private final CategoryService categoryService;
+ private final ProductService productService;
+ private final SearchService searchService;
+
+ @GetMapping("categories")
+ public ResponseEntity> readAllCategories() {
+ return new ResponseEntity<>(categoryService.findAll(), OK);
+ }
+
+ @GetMapping("products")
+ public ResponseEntity> readAllProducts() {
+ StopWatch stopWatch = new StopWatch();
+ stopWatch.start();
+ List productDtos = productService.findAll();
+ stopWatch.stop();
+ return new ResponseEntity<>(productDtos, OK);
+ }
+
+ @GetMapping("products/featured")
+ public ResponseEntity> readFeaturedProducts() {
+ StopWatch stopWatch = new StopWatch();
+ stopWatch.start();
+ List productDtos = productService.findAll().stream().filter(ProductDto::isFeatured).collect(Collectors.toList());
+ stopWatch.stop();
+ return new ResponseEntity<>(productDtos, OK);
+ }
+
+ @GetMapping("products/{sku}")
+ public ResponseEntity readOneProduct(@PathVariable String sku) {
+ ProductDto productDto = productService.readOneProduct(sku);
+ return new ResponseEntity<>(productDto, OK);
+ }
+
+ @GetMapping("products/category/{categoryName}")
+ public ResponseEntity> readProductByCategory(@PathVariable String categoryName) {
+ List productDtos = productService.findByCategoryName(categoryName);
+ return new ResponseEntity<>(productDtos, OK);
+ }
+
+ @PostMapping("{categoryName}/facets/filter")
+ public ProductSearchResponseDto filterForFacets(@RequestBody SearchQueryDto searchQueryDto, @PathVariable String categoryName) throws IOException {
+ return searchService.searchWithFilters(searchQueryDto, categoryName);
+ }
+
+ @PostMapping("/search")
+ public ProductSearchResponseDto search(@RequestBody SearchQueryDto searchQueryDto) throws IOException {
+ return searchService.search(searchQueryDto);
+ }
+
+}
\ No newline at end of file
diff --git a/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/controller/ProductRatingController.java b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/controller/ProductRatingController.java
new file mode 100644
index 000000000..806fcffed
--- /dev/null
+++ b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/controller/ProductRatingController.java
@@ -0,0 +1,40 @@
+package com.techie.shoppingstore.controller;
+
+import com.techie.shoppingstore.dto.ProductRatingDto;
+import com.techie.shoppingstore.service.ProductService;
+import lombok.AllArgsConstructor;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.List;
+
+import static org.springframework.http.HttpStatus.OK;
+
+@RestController
+@RequestMapping("/api/products/ratings")
+@AllArgsConstructor
+public class ProductRatingController {
+
+ private final ProductService productService;
+
+ @PostMapping("/submit")
+ public void postRating(@Valid @RequestBody ProductRatingDto productRatingDto) {
+ productService.postProductRating(productRatingDto);
+ }
+
+ @PutMapping("/edit")
+ public void editRating(@Valid @RequestBody ProductRatingDto productRatingDto) {
+ productService.editProductRating(productRatingDto);
+ }
+
+ @DeleteMapping("/delete/{ratingId}")
+ public void deleteRating(@Valid @RequestBody ProductRatingDto productRatingDto, @PathVariable String ratingId) {
+ productService.deleteProductRating(productRatingDto);
+ }
+
+ @GetMapping("/get/{sku}")
+ public ResponseEntity> getRating(@PathVariable String sku) {
+ return new ResponseEntity<>(productService.getProductRating(sku), OK);
+ }
+}
diff --git a/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/dto/AuthenticationResponse.java b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/dto/AuthenticationResponse.java
new file mode 100644
index 000000000..4d1c1a534
--- /dev/null
+++ b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/dto/AuthenticationResponse.java
@@ -0,0 +1,11 @@
+package com.techie.shoppingstore.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class AuthenticationResponse {
+ private String accessToken;
+ private String username;
+}
diff --git a/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/dto/CategoryDto.java b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/dto/CategoryDto.java
new file mode 100644
index 000000000..e4cc7fb25
--- /dev/null
+++ b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/dto/CategoryDto.java
@@ -0,0 +1,14 @@
+package com.techie.shoppingstore.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class CategoryDto implements Serializable {
+ private String categoryNames;
+
+ public CategoryDto(String categoryNames) {
+ this.categoryNames = categoryNames;
+ }
+}
diff --git a/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/dto/FacetDto.java b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/dto/FacetDto.java
new file mode 100644
index 000000000..6817df368
--- /dev/null
+++ b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/dto/FacetDto.java
@@ -0,0 +1,15 @@
+package com.techie.shoppingstore.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class FacetDto {
+ private String facetName;
+ private List facetValueDto;
+}
diff --git a/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/dto/FacetValueDto.java b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/dto/FacetValueDto.java
new file mode 100644
index 000000000..8844ae82f
--- /dev/null
+++ b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/dto/FacetValueDto.java
@@ -0,0 +1,13 @@
+package com.techie.shoppingstore.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class FacetValueDto {
+ private String facetValueName;
+ private Integer count;
+}
diff --git a/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/dto/LoginRequestDto.java b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/dto/LoginRequestDto.java
new file mode 100644
index 000000000..ac8c43069
--- /dev/null
+++ b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/dto/LoginRequestDto.java
@@ -0,0 +1,13 @@
+package com.techie.shoppingstore.dto;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+@Data
+public class LoginRequestDto {
+ @NotBlank
+ private String username;
+ @NotBlank
+ private String password;
+}
diff --git a/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/dto/ProductAvailability.java b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/dto/ProductAvailability.java
new file mode 100644
index 000000000..7e98e7da0
--- /dev/null
+++ b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/dto/ProductAvailability.java
@@ -0,0 +1,15 @@
+package com.techie.shoppingstore.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ProductAvailability implements Serializable {
+ private String availability;
+ private String color;
+}
diff --git a/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/dto/ProductDto.java b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/dto/ProductDto.java
new file mode 100644
index 000000000..59a10e91b
--- /dev/null
+++ b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/dto/ProductDto.java
@@ -0,0 +1,28 @@
+package com.techie.shoppingstore.dto;
+
+import com.techie.shoppingstore.model.ProductAttribute;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class ProductDto implements Serializable {
+ private static final long serialVersionUID = 6529685098267757690L;
+
+ private String productName;
+ private String imageUrl;
+ private String sku;
+ private BigDecimal price;
+ private String description;
+ private String manufacturer;
+ private ProductAvailability availability;
+ private List attributeList;
+ private boolean featured;
+ private List productRatingDtoList;
+}
diff --git a/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/dto/ProductRatingDto.java b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/dto/ProductRatingDto.java
new file mode 100644
index 000000000..2ab5f017d
--- /dev/null
+++ b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/dto/ProductRatingDto.java
@@ -0,0 +1,23 @@
+package com.techie.shoppingstore.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ProductRatingDto implements Serializable {
+ private String ratingId;
+ @Min(1)
+ @Max(5)
+ private BigDecimal ratingStars;
+ private String review;
+ private String userName;
+ private String sku;
+}
\ No newline at end of file
diff --git a/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/dto/ProductSearchResponseDto.java b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/dto/ProductSearchResponseDto.java
new file mode 100644
index 000000000..9ba613614
--- /dev/null
+++ b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/dto/ProductSearchResponseDto.java
@@ -0,0 +1,18 @@
+package com.techie.shoppingstore.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ProductSearchResponseDto {
+ private List products;
+ private BigDecimal minPrice;
+ private BigDecimal maxPrice;
+ private List facetDtos;
+}
\ No newline at end of file
diff --git a/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/dto/RegisterRequestDto.java b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/dto/RegisterRequestDto.java
new file mode 100644
index 000000000..ef5bdc8a2
--- /dev/null
+++ b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/dto/RegisterRequestDto.java
@@ -0,0 +1,23 @@
+package com.techie.shoppingstore.dto;
+
+import lombok.Data;
+
+import javax.validation.constraints.Email;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+
+@Data
+public class RegisterRequestDto {
+ @NotBlank
+ private String username;
+ @NotBlank
+ private String name;
+ @NotBlank
+ @Email
+ private String email;
+ @NotBlank
+ @Size(min = 8, max = 20)
+ private String password;
+ @NotBlank
+ private String confirmPassword;
+}
diff --git a/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/dto/SearchQueryDto.java b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/dto/SearchQueryDto.java
new file mode 100644
index 000000000..9ddbe0253
--- /dev/null
+++ b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/dto/SearchQueryDto.java
@@ -0,0 +1,20 @@
+package com.techie.shoppingstore.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+public class SearchQueryDto {
+ private String textQuery;
+ private List filters;
+
+ @Data
+ public static class Filter implements Serializable {
+ private String key;
+ private String value;
+ private String from;
+ private String to;
+ }
+}
diff --git a/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/exceptions/ApiResponse.java b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/exceptions/ApiResponse.java
new file mode 100644
index 000000000..16f4d7001
--- /dev/null
+++ b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/exceptions/ApiResponse.java
@@ -0,0 +1,14 @@
+package com.techie.shoppingstore.exceptions;
+
+import lombok.Data;
+
+@Data
+public class ApiResponse {
+ private Integer status;
+ private String message;
+
+ public ApiResponse(Integer status, String message) {
+ this.status = status;
+ this.message = message;
+ }
+}
\ No newline at end of file
diff --git a/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/exceptions/SpringShoppingStoreExceptionHandler.java b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/exceptions/SpringShoppingStoreExceptionHandler.java
new file mode 100644
index 000000000..9b6892198
--- /dev/null
+++ b/jdk_8_maven/cs/rest/original/angular-ecommerce/src/main/java/com/techie/shoppingstore/exceptions/SpringShoppingStoreExceptionHandler.java
@@ -0,0 +1,27 @@
+package com.techie.shoppingstore.exceptions;
+
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.http.converter.HttpMessageNotReadableException;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.context.request.WebRequest;
+import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
+
+@ControllerAdvice
+public class SpringShoppingStoreExceptionHandler extends ResponseEntityExceptionHandler {
+
+ public SpringShoppingStoreExceptionHandler() {
+ super();
+ }
+
+ @Override
+ protected final ResponseEntity