From 3f3b62ae2886c6ef8d65ec82dbf9624ba337da12 Mon Sep 17 00:00:00 2001 From: Abhishekdawer Date: Fri, 24 Apr 2020 19:01:09 +0530 Subject: [PATCH 1/3] login implementation --- .idea/encodings.xml | 3 - .../api/controller/AddressController.java | 81 ++++++++ .../api/controller/CustomerController.java | 108 +++++++++++ .../src/main/resources/application.properties | 1 + .../src/main/resources/application.yaml | 2 +- .../FoodOrderingApp-api-1.0-SNAPSHOT.jar | Bin 65173 -> 70056 bytes .../target/classes/.swagger-codegen-ignore | 23 +++ .../target/classes/.swagger-codegen/VERSION | 1 + FoodOrderingApp-api/target/classes/README.md | 18 ++ .../target/classes/application.properties | 1 + .../target/classes/application.yaml | 2 +- .../api/controller/AddressController.class | Bin 0 -> 6698 bytes .../api/controller/CustomerController.class | Bin 0 -> 6280 bytes .../api/model/AddressList.class | Bin 4930 -> 4933 bytes .../api/model/AddressListState.class | Bin 2935 -> 2938 bytes .../api/model/CategoryDetailsResponse.class | Bin 4460 -> 4463 bytes .../api/model/CategoryList.class | Bin 4350 -> 4353 bytes .../api/model/CategoryListResponse.class | Bin 2984 -> 2987 bytes .../api/model/DeleteAddressResponse.class | Bin 3043 -> 3046 bytes .../api/model/ErrorResponse.class | Bin 3274 -> 3277 bytes .../FoodOrderingApp/api/model/ItemList.class | Bin 4269 -> 4272 bytes .../api/model/LoginResponse.class | Bin 4811 -> 4814 bytes .../api/model/LogoutResponse.class | Bin 2840 -> 2843 bytes .../api/model/RestaurantDetailsResponse.class | Bin 7678 -> 7681 bytes .../RestaurantDetailsResponseAddress.class | Bin 5182 -> 5185 bytes ...estaurantDetailsResponseAddressState.class | Bin 3082 -> 3085 bytes .../api/model/RestaurantList.class | Bin 6435 -> 6438 bytes .../api/model/SaveAddressRequest.class | Bin 4257 -> 4260 bytes .../api/model/SaveAddressResponse.class | Bin 2847 -> 2850 bytes .../api/model/SignupCustomerRequest.class | Bin 4350 -> 4353 bytes .../api/model/SignupCustomerResponse.class | Bin 2875 -> 2878 bytes .../api/model/UpdatePasswordRequest.class | Bin 2795 -> 2798 bytes .../api/model/UpdatePasswordResponse.class | Bin 2877 -> 2880 bytes .../io/swagger/api/ApiResponseMessage.class | Bin 1725 -> 1728 bytes FoodOrderingApp-api/target/classes/pom.xml | 66 +++++++ .../src/main/resources/application.properties | 5 + .../api/model/AddressList.java | 2 +- .../api/model/AddressListResponse.java | 2 +- .../api/model/AddressListState.java | 2 +- .../api/model/CategoriesListResponse.java | 2 +- .../api/model/CategoryDetailsResponse.java | 2 +- .../api/model/CategoryList.java | 2 +- .../api/model/CategoryListResponse.java | 2 +- .../api/model/DeleteAddressResponse.java | 2 +- .../api/model/ErrorResponse.java | 2 +- .../FoodOrderingApp/api/model/ItemList.java | 2 +- .../api/model/LoginResponse.java | 2 +- .../api/model/LogoutResponse.java | 2 +- .../api/model/RestaurantDetailsResponse.java | 2 +- .../RestaurantDetailsResponseAddress.java | 2 +- ...RestaurantDetailsResponseAddressState.java | 2 +- .../api/model/RestaurantList.java | 2 +- .../api/model/RestaurantListResponse.java | 2 +- .../api/model/SaveAddressRequest.java | 2 +- .../api/model/SaveAddressResponse.java | 2 +- .../api/model/SignupCustomerRequest.java | 2 +- .../api/model/SignupCustomerResponse.java | 2 +- .../api/model/UpdatePasswordRequest.java | 2 +- .../api/model/UpdatePasswordResponse.java | 2 +- .../io/swagger/api/ApiException.java | 2 +- .../io/swagger/api/ApiOriginFilter.java | 2 +- .../io/swagger/api/ApiResponseMessage.java | 2 +- .../io/swagger/api/NotFoundException.java | 2 +- .../SwaggerDocumentationConfig.java | 2 +- .../target/maven-archiver/pom.properties | 2 +- .../compile/default-compile/createdFiles.lst | 2 + .../compile/default-compile/inputFiles.lst | 68 +++---- .../default-testCompile/inputFiles.lst | 0 .../resources/config/localhost.properties | 2 +- .../target/FoodOrderingApp-db.jar | Bin 8742 -> 8765 bytes .../classes/config/localhost.properties | 2 +- .../target/maven-archiver/pom.properties | 2 +- .../compile/default-compile/inputFiles.lst | 0 .../default-testCompile/inputFiles.lst | 0 .../service/businness/AddressService.java | 26 +++ .../service/businness/AddressServiceImpl.java | 68 +++++++ .../service/businness/CustomerService.java | 13 ++ .../businness/CustomerServiceImpl.java | 177 ++++++++++++++++++ .../service/dao/AddressDao.java | 23 +++ .../service/dao/AddressDaoImpl.java | 79 ++++++++ .../service/dao/CustomerDao.java | 19 ++ .../service/dao/CustomerDaoImpl.java | 65 +++++++ .../service/entity/AddressEntity.java | 112 +++++++++++ .../service/entity/CustomerAddressEntity.java | 63 +++++++ .../service/entity/CustomerAuthEntity.java | 111 +++++++++++ .../service/entity/CustomerEntity.java | 97 ++++++++++ .../service/entity/StateEntity.java | 59 ++++++ .../FoodOrderingApp-service-1.0-SNAPSHOT.jar | Bin 18129 -> 32925 bytes .../service/businness/AddressService.class | Bin 0 -> 1306 bytes .../businness/AddressServiceImpl.class | Bin 0 -> 3442 bytes .../service/businness/CustomerService.class | Bin 0 -> 829 bytes .../businness/CustomerServiceImpl.class | Bin 0 -> 6614 bytes .../service/businness/JwtTokenProvider.class | Bin 2581 -> 2590 bytes .../service/dao/AddressDao.class | Bin 0 -> 1226 bytes .../service/dao/AddressDaoImpl.class | Bin 0 -> 3463 bytes .../service/dao/CustomerDao.class | Bin 0 -> 643 bytes .../service/dao/CustomerDaoImpl.class | Bin 0 -> 2755 bytes .../service/entity/AddressEntity.class | Bin 0 -> 3407 bytes .../entity/CustomerAddressEntity.class | Bin 0 -> 2291 bytes .../service/entity/CustomerAuthEntity.class | Bin 0 -> 3495 bytes .../service/entity/CustomerEntity.class | Bin 0 -> 2673 bytes .../service/entity/StateEntity.class | Bin 0 -> 1908 bytes .../target/maven-archiver/pom.properties | 2 +- .../compile/default-compile/createdFiles.lst | 27 ++- .../compile/default-compile/inputFiles.lst | 47 +++-- 105 files changed, 1338 insertions(+), 95 deletions(-) create mode 100644 FoodOrderingApp-api/src/main/java/com/upgrad/FoodOrderingApp/api/controller/AddressController.java create mode 100644 FoodOrderingApp-api/src/main/java/com/upgrad/FoodOrderingApp/api/controller/CustomerController.java create mode 100644 FoodOrderingApp-api/src/main/resources/application.properties create mode 100644 FoodOrderingApp-api/target/classes/.swagger-codegen-ignore create mode 100644 FoodOrderingApp-api/target/classes/.swagger-codegen/VERSION create mode 100644 FoodOrderingApp-api/target/classes/README.md create mode 100644 FoodOrderingApp-api/target/classes/application.properties create mode 100644 FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/controller/AddressController.class create mode 100644 FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/controller/CustomerController.class create mode 100644 FoodOrderingApp-api/target/classes/pom.xml create mode 100644 FoodOrderingApp-api/target/classes/src/main/resources/application.properties delete mode 100644 FoodOrderingApp-api/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst delete mode 100644 FoodOrderingApp-db/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst delete mode 100644 FoodOrderingApp-db/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst create mode 100644 FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/AddressService.java create mode 100644 FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/AddressServiceImpl.java create mode 100644 FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/CustomerService.java create mode 100644 FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/CustomerServiceImpl.java create mode 100644 FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/AddressDao.java create mode 100644 FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/AddressDaoImpl.java create mode 100644 FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/CustomerDao.java create mode 100644 FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/CustomerDaoImpl.java create mode 100644 FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/AddressEntity.java create mode 100644 FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/CustomerAddressEntity.java create mode 100644 FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/CustomerAuthEntity.java create mode 100644 FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/CustomerEntity.java create mode 100644 FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/StateEntity.java create mode 100644 FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/businness/AddressService.class create mode 100644 FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/businness/AddressServiceImpl.class create mode 100644 FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/businness/CustomerService.class create mode 100644 FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/businness/CustomerServiceImpl.class create mode 100644 FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/dao/AddressDao.class create mode 100644 FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/dao/AddressDaoImpl.class create mode 100644 FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/dao/CustomerDao.class create mode 100644 FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/dao/CustomerDaoImpl.class create mode 100644 FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/entity/AddressEntity.class create mode 100644 FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/entity/CustomerAddressEntity.class create mode 100644 FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/entity/CustomerAuthEntity.class create mode 100644 FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/entity/CustomerEntity.class create mode 100644 FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/entity/StateEntity.class diff --git a/.idea/encodings.xml b/.idea/encodings.xml index 38b4106..bf5e6f7 100644 --- a/.idea/encodings.xml +++ b/.idea/encodings.xml @@ -5,10 +5,7 @@ - - - \ No newline at end of file diff --git a/FoodOrderingApp-api/src/main/java/com/upgrad/FoodOrderingApp/api/controller/AddressController.java b/FoodOrderingApp-api/src/main/java/com/upgrad/FoodOrderingApp/api/controller/AddressController.java new file mode 100644 index 0000000..f52fc6b --- /dev/null +++ b/FoodOrderingApp-api/src/main/java/com/upgrad/FoodOrderingApp/api/controller/AddressController.java @@ -0,0 +1,81 @@ +package com.upgrad.FoodOrderingApp.api.controller; + +import com.upgrad.FoodOrderingApp.service.businness.AddressService; +import com.upgrad.FoodOrderingApp.service.businness.CustomerService; +import com.upgrad.FoodOrderingApp.service.entity.AddressEntity; +import com.upgrad.FoodOrderingApp.service.entity.CustomerAddressEntity; +import com.upgrad.FoodOrderingApp.service.entity.CustomerEntity; +import com.upgrad.FoodOrderingApp.service.exception.AddressNotFoundException; +import com.upgrad.FoodOrderingApp.service.exception.AuthorizationFailedException; +import com.upgrad.FoodOrderingApp.service.exception.SaveAddressException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import com.upgrad.FoodOrderingApp.api.model.*; + +import java.util.List; +import java.util.UUID; + + +@RestController +public class AddressController { + + @Autowired + private CustomerService customerService; + + @Autowired + private AddressService addressService; + + @RequestMapping(method = RequestMethod.POST, path = "/address", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResponseEntity saveAddress(@RequestBody(required = false) final SaveAddressRequest saveAddressRequest, @RequestHeader("authorization") final String randomString) throws + AuthorizationFailedException, SaveAddressException, AddressNotFoundException { + String authorization = null; + String access_token = authorization.split("Bearer ")[1]; + + //validate the user first using this + CustomerEntity customerEntity = customerService.getCustomer(randomString); + + final AddressEntity addressEntity = new AddressEntity(); + + addressEntity.setFlatBuilNo(saveAddressRequest.getFlatBuildingName()); + addressEntity.setLocality(saveAddressRequest.getLocality()); + addressEntity.setCity(saveAddressRequest.getCity()); + addressEntity.setPincode(saveAddressRequest.getPincode()); + // addressEntity.setState(addressService.getStateByUUID(saveAddressRequest.getStateUuid())); + addressEntity.setUuid(UUID.randomUUID().toString()); + + final CustomerAddressEntity customerAddressEntity = new CustomerAddressEntity(); + customerAddressEntity.setAddress(addressEntity); + customerAddressEntity.setCustomer(customerEntity); + + final AddressEntity createdAddressEntity = addressService.saveAddress(addressEntity,customerAddressEntity); + SaveAddressResponse saveAddressResponse = new SaveAddressResponse().id(createdAddressEntity.getUuid()).status("ADDRESS SUCCESSFULLY REGISTERED"); + return new ResponseEntity(saveAddressResponse, HttpStatus.CREATED); + } + + @RequestMapping(method = RequestMethod.GET, path = "/address/customer", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResponseEntity getAllAddresses(@RequestHeader("authorization") final String authorization) throws AuthorizationFailedException { + String access_token = authorization.split("Bearer ")[1]; + CustomerEntity customerEntity = customerService.getCustomer(access_token); + List addressEntityList = addressService.getAllAddress(customerEntity); + AddressListResponse addressListResponse = new AddressListResponse(); + for (AddressEntity addressEntity : addressEntityList){ + AddressList addressList = new AddressList(); + addressList.setId(UUID.fromString(addressEntity.getUuid())); + addressList.setLocality(addressEntity.getLocality()); + addressList.setCity(addressEntity.getCity()); + addressList.setFlatBuildingName(addressEntity.getFlatBuilNo()); + addressList.setPincode(addressEntity.getPincode()); + AddressListState addressListState = new AddressListState(); + addressListState.setId(UUID.fromString(addressEntity.getState().getUuid())); + addressListState.setStateName(addressEntity.getState().getStateName()); + addressList.setState(addressListState); + addressListResponse.addAddressesItem(addressList); + } + return new ResponseEntity(addressListResponse, HttpStatus.OK); + } + + +} diff --git a/FoodOrderingApp-api/src/main/java/com/upgrad/FoodOrderingApp/api/controller/CustomerController.java b/FoodOrderingApp-api/src/main/java/com/upgrad/FoodOrderingApp/api/controller/CustomerController.java new file mode 100644 index 0000000..e2b1967 --- /dev/null +++ b/FoodOrderingApp-api/src/main/java/com/upgrad/FoodOrderingApp/api/controller/CustomerController.java @@ -0,0 +1,108 @@ +package com.upgrad.FoodOrderingApp.api.controller; + + +import com.upgrad.FoodOrderingApp.service.businness.CustomerService; +import com.upgrad.FoodOrderingApp.service.businness.CustomerServiceImpl; +import com.upgrad.FoodOrderingApp.service.entity.CustomerAuthEntity; +import com.upgrad.FoodOrderingApp.service.entity.CustomerEntity; +import com.upgrad.FoodOrderingApp.service.exception.AuthenticationFailedException; +import com.upgrad.FoodOrderingApp.service.exception.SignUpRestrictedException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import com.upgrad.FoodOrderingApp.api.model.*; + +import java.util.ArrayList; +import java.util.Base64; +import java.util.List; +import java.util.UUID; + + +@RestController +@RequestMapping("/customer") +public class CustomerController { + + + @Autowired + private CustomerService customerService; + + @RequestMapping(method = RequestMethod.POST, path = "/signup", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResponseEntity signUp(@RequestBody final SignupCustomerRequest signupCustomerRequest) + throws SignUpRestrictedException { + + //validate this request. + + if(signupCustomerRequest.getLastName().isEmpty()) { + throw new SignUpRestrictedException("SGR -005", "Last name cannot be empty"); + } + + CustomerEntity customerEntity = new CustomerEntity(); + customerEntity.setContactNumber("12345cds6237890"); + customerEntity.setEmailAddress("testing@teasst.com"); + customerEntity.setLastname("lsatname"); + customerEntity.setFirstName("first"); + customerEntity.setPassword("password"); + customerEntity.setSalt("salt"); + customerEntity.setUuid(UUID.randomUUID().toString()); + + final CustomerEntity responseCustomer = customerService.saveCustomer(customerEntity); + SignupCustomerResponse signupCustomerResponse = new SignupCustomerResponse(); + signupCustomerResponse.setId(responseCustomer.getUuid()); + signupCustomerResponse.setStatus("Customer Registered"); + return new ResponseEntity(signupCustomerResponse, HttpStatus.CREATED); + } + + + @RequestMapping(method = RequestMethod.POST, path = "/login", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResponseEntity login(@RequestHeader("authorization") final String auth) throws AuthenticationFailedException { + + //call to service to login + + //Use https://www.base64encode.org/ to create the encoded string + + //pass that encoded string in request header. + + //decode that string and get the password and contact number(On upgrad's portal there is a seperate lecture for this, see that one). + + // After decoding it check if that contact number exist in database if not then throw exception otherwise encrypt the decoded + // password and check with password if matched then create a random string + + // create one more table customerAuthEntity and store this string and current time inside that table and customer also. + + //set that random string in response headers and return it in response. + + byte[] dc= Base64.getDecoder().decode(auth.split("basic")[1]); + String dt = new String(dc); + String[] decodearr = dt.split(":"); + CustomerServiceImpl obj = new CustomerServiceImpl(); + if(CustomerServiceImpl.validAuthFormat(auth)== true) + { + final CustomerAuthEntity custAuthToken =obj.verifyAuthenticate(decodearr[0],decodearr[1]); + CustomerEntity customerentity = custAuthToken.getCustomer(); + LoginResponse loginresponse =new LoginResponse() + .firstName(customerentity.getFirstName()) + .lastName(customerentity.getLastname()) + .contactNumber((customerentity.getContactNumber())) + .emailAddress(customerentity.getEmailAddress()) + .id(customerentity.getUuid()) + .message("LOGGED IN SUCCESSFULLY"); + + HttpHeaders headers =new HttpHeaders(); + List header =new ArrayList<>(); + header.add("access-token"); + headers.setAccessControlExposeHeaders(header); + headers.add("access-token",custAuthToken.getAccessToken()); + return new ResponseEntity(loginresponse,headers,HttpStatus.OK); + } + else + { + throw new AuthenticationFailedException("ATH-003","Incorrect form of decoded customer name and password"); + } + // LoginResponse loginResponse = new LoginResponse(); + //return new ResponseEntity(loginResponse, HttpStatus.OK); + + } +} diff --git a/FoodOrderingApp-api/src/main/resources/application.properties b/FoodOrderingApp-api/src/main/resources/application.properties new file mode 100644 index 0000000..65f96cf --- /dev/null +++ b/FoodOrderingApp-api/src/main/resources/application.properties @@ -0,0 +1 @@ +server.port= 8080 \ No newline at end of file diff --git a/FoodOrderingApp-api/src/main/resources/application.yaml b/FoodOrderingApp-api/src/main/resources/application.yaml index 2f2674b..2f23aad 100644 --- a/FoodOrderingApp-api/src/main/resources/application.yaml +++ b/FoodOrderingApp-api/src/main/resources/application.yaml @@ -13,7 +13,7 @@ spring: driverClassName: org.postgresql.Driver url: jdbc:postgresql://localhost:5432/restaurantdb username: postgres - password: password + password: abhishek jpa: properties: diff --git a/FoodOrderingApp-api/target/FoodOrderingApp-api-1.0-SNAPSHOT.jar b/FoodOrderingApp-api/target/FoodOrderingApp-api-1.0-SNAPSHOT.jar index 17ce93778fa08fcd0bfa5b4d4590365e3b36c5c1..3de6b0d19f1eac55cb0da5f0cba4cd70dfdac89d 100644 GIT binary patch delta 43691 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 E1F;&LegFUf diff --git a/FoodOrderingApp-api/target/classes/.swagger-codegen-ignore b/FoodOrderingApp-api/target/classes/.swagger-codegen-ignore new file mode 100644 index 0000000..c5fa491 --- /dev/null +++ b/FoodOrderingApp-api/target/classes/.swagger-codegen-ignore @@ -0,0 +1,23 @@ +# Swagger Codegen Ignore +# Generated by swagger-codegen https://github.com/swagger-api/swagger-codegen + +# Use this file to prevent files from being overwritten by the generator. +# The patterns follow closely to .gitignore or .dockerignore. + +# As an example, the C# client generator defines ApiClient.cs. +# You can make changes and tell Swagger Codgen to ignore just this file by uncommenting the following line: +#ApiClient.cs + +# You can match any string of characters against a directory, file or extension with a single asterisk (*): +#foo/*/qux +# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux + +# You can recursively match patterns against a directory, file or extension with a double asterisk (**): +#foo/**/qux +# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux + +# You can also negate patterns with an exclamation (!). +# For example, you can ignore all files in a docs folder with the file extension .md: +#docs/*.md +# Then explicitly reverse the ignore rule for a single file: +#!docs/README.md diff --git a/FoodOrderingApp-api/target/classes/.swagger-codegen/VERSION b/FoodOrderingApp-api/target/classes/.swagger-codegen/VERSION new file mode 100644 index 0000000..a625450 --- /dev/null +++ b/FoodOrderingApp-api/target/classes/.swagger-codegen/VERSION @@ -0,0 +1 @@ +2.3.1 \ No newline at end of file diff --git a/FoodOrderingApp-api/target/classes/README.md b/FoodOrderingApp-api/target/classes/README.md new file mode 100644 index 0000000..a2e8a9f --- /dev/null +++ b/FoodOrderingApp-api/target/classes/README.md @@ -0,0 +1,18 @@ +# Swagger generated server + +Spring Boot Server + + +## Overview +This server was generated by the [swagger-codegen](https://github.com/swagger-api/swagger-codegen) project. +By using the [OpenAPI-Spec](https://github.com/swagger-api/swagger-core), you can easily generate a server stub. +This is an example of building a swagger-enabled server in Java using the SpringBoot framework. + +The underlying library integrating swagger to SpringBoot is [springfox](https://github.com/springfox/springfox) + +Start your server as an simple java application + +You can view the api documentation in swagger-ui by pointing to +http://localhost:8080/ + +Change default port value in application.properties \ No newline at end of file diff --git a/FoodOrderingApp-api/target/classes/application.properties b/FoodOrderingApp-api/target/classes/application.properties new file mode 100644 index 0000000..65f96cf --- /dev/null +++ b/FoodOrderingApp-api/target/classes/application.properties @@ -0,0 +1 @@ +server.port= 8080 \ No newline at end of file diff --git a/FoodOrderingApp-api/target/classes/application.yaml b/FoodOrderingApp-api/target/classes/application.yaml index 2f2674b..2f23aad 100644 --- a/FoodOrderingApp-api/target/classes/application.yaml +++ b/FoodOrderingApp-api/target/classes/application.yaml @@ -13,7 +13,7 @@ spring: driverClassName: org.postgresql.Driver url: jdbc:postgresql://localhost:5432/restaurantdb username: postgres - password: password + password: abhishek jpa: properties: diff --git a/FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/controller/AddressController.class b/FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/controller/AddressController.class new file mode 100644 index 0000000000000000000000000000000000000000..fa4c1e06ad9d920cf0f83717fb4a10c3e7ca3d60 GIT binary patch literal 6698 zcmc&&d3+Sr9sj<~W@odR2qqkE4*~H=I9x>#-EcI7M9>g0OR#{|PIiZ6V6(H%%m%QB zwXHp+_O`ZFTYK16+bZe;rbSC{=zZDyzAt+pw$*;$9DCrhX6YaO1a^M!&HMe{@A&?H z@Au~D;}0GNuvE0fup0ZKcufp9;k7MTh1a#>^>~AVH^vabz8KzwH%sbfNxelRPZT* zY3YLPnB%&Y(ya+2tqZIgNSot{LVncJGKqfE%xttWx@F`>d-C~&?X60T6l^1x(``G^ zTg~4s5FaY!9AjMHV%Ww=R`1E>Oh@rf5$UI|W8o7&*gPCD7E_wM8J@Yi4Nv zv;iZh4;IEpbZfIl^#$4o%(Rx>qFII<`;%d3%%DAWbc)3%oZ%&npcNNvNqU-ah)zcof~G2w3`Ttowk|lPLFAptvf4+ zH}@~Th->qfnJF+m1kR`~ucb&;)!Ai@s=LO_$U+dcSWjfZZQ?14lQ4UouJN>>q~-}N zTafj1RCju^Ss%~RfR&w3t_F=1t5)BG1BUGgESVZM{QV^lm7886BE`drdM|}4 zr~1OY`rv6b-7~S^7}?m}3RkEf@N(x_)hE;5d~iBlcHH)L6R2*rlljv| zOVhiU6zT)wlNAmFR=H2329yB%Gq7Z1yZ}FOZu2zrv`bI2#PZ+T*@q1 zX}#Z&r}!+NzkK|jE6=3Hs)Oy6*}GNr;}QX7jjma`HCMq=6<@#?RXhtl3cjS`%lHa$ zHHB_U_YN&zLk~v^zN+GD__~U3;1Lzyl+?E*^=(OgM^fLF)c5d+g72&N0e-0BM{?%J zctl|J)VB>fxT@_{`~*K$@iY8f#ai?!_=SoM_$A#{M{qeQ zM#U2Znh>f8QIcq4^hH=St0E#4RYdWqK=)G!=3#TfMwA7y+@Eb6*{P>lSl8DPSSlGo z3n4r8axd4fG37F){(_xRL$WHsQz4_TAsK!k22H2mEaWP6sW3HYPwQd2WNNL(l3l9n zxKf>Gt6QE}&;Ci{m4=6*&EuUuJ*QTk-2UX_P+-LrtUci+jQ0wjxk&SYz&(i85y!g-I1ac+~5OS>1o7^h2vif|4OuV2eE#Jk9NgZ4m8H{NoNzKA+z zfFrrXaKT`^D24hEWGw48&ByuL=khNb@?t9ODaVrC(-ffLpC|!ag|vEgB2c9aEMJ>c z@NwXQMs}|@|hNLw!A)`-rczYBuWb8CPZ?%954P_eym4lvpK#+Gu^b2NxJElMZ%=&rQ%rsfg z*mn5K%Q+gjpt6*7aCI;)*P$pK!%>9KUU!yl=W%mQ9JA-eqX@G1CgUT^^7UYBJ(f29CmHZJ9_ z>Mg)!7~n{-gB|31GK*n^5#!t~VsLSLsEDTUl4N+n{Rl5Qgys;E&69|1Jpd&ciANR| z5iO#{C1ORix`bLpn@gNh#I$(iAf^{_Y7y;|=pf&Wq!L%+ks@aD(OkqVik=;h#Faxh ztqIBKB;s84v^eEHy@+SDKeLF_lP!~&vo+qbA9D|2-aS+<1ZmJJOylnv9L=XeXX7+} z$(@G<{9A|%um~%#n4U^t6VAt0EWvX*JBnqPz=gOG%Uwt8@Qn2xL9?-u>!qV^!Q~io zV{kK4q?)+LK5Qlx=1$jR7+cWH{r2DrJe$tj%2;j1HYk)oAKN(>mZ665>|Vxyf{-ISe7=hPjiQ>)c|;b_kv7j=>;hV<&dG&n(9MXO3L6LtJk1 ze|{UT;ltv8+orw(4hnuqkN6=yw$KmghH^XyrT-Tn!Wj&0coOsJ{4#cX1X z58-STSCUe2w9?FL%mnqwun9CM+;Pk}h%LL)>S4!F>0q9%9YT0D== z@4_A2`vru{3&|~W&wFWjzlY8O9YGG6Us tr&(~{05>mpaWj`MbpkBF%`1G|ys`=}s;mqpkc99m?jEA}pupS+{1*q*9{2zN literal 0 HcmV?d00001 diff --git a/FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/controller/CustomerController.class b/FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/controller/CustomerController.class new file mode 100644 index 0000000000000000000000000000000000000000..f5db4f0b7db5de3aa536e577ab65d5f0688ab437 GIT binary patch literal 6280 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 literal 0 HcmV?d00001 diff --git a/FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/model/AddressList.class b/FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/model/AddressList.class index ce4f34886dd997c15983ffd0c539300ccc5b8923..db15bc27c7b395e8502a4901a13d6982258b650a 100644 GIT binary patch delta 329 zcmW-cOD{uF6h_x6x99Zs3ROwNs3PgK9T=GqQv)IfDC+jzy6V-|tJI_3X7`s!jSM6t zCVq-JLvfBhSS#84%a`o;#7Cn2`TOz;jPqy{CKn<^-k@MmG$o>2C8n;O?qyvl$_003%R<(71x58-ye+mb8vHY^;Gf`afdZB zeoJOX(o70^YYop6Shl%K?i}uU=zh!T(9q(P(BFe4SkMwIvFy)8$|Bu;js!$_g;l)_ V{P(>L)}re=6u@OvJE$*N_yhKKJv;ya delta 278 zcmW-cOD{uF6otQYxjp-y-VScdgh@N;xCs*`#1AkK3F=WA5#_39y{SjNM{<6NbRaP> z5GMYMsThfKt;x5t*UC!vNAazg{rr7-1^Rg~q^Sl3kD17*1(EwU&JQ<$tHnI9HTxsr9M~?(u!LV|# qfUg*LP)ssqN26s`Za+t!N>4N6j^6*?d$yjdxRS>_1;><27T^!cRx|+s diff --git a/FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/model/AddressListState.class b/FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/model/AddressListState.class index 543cbcd09c7435d4b0452db42f451ef619aba66f..b00b096d7f180654b0c0417dac71bcba9a6d06b9 100644 GIT binary patch delta 317 zcmWlUyG{a85Qe|Q?z)HLCYq=ubaa*^#u$PZP*Fq>uj~D`3Myu$5$p`L^+|jVjh%(1 zg)d@jrHO^{oGIqZ{PWLD<|p-=>V5pZz5(N0DSXOFJeF*#*mBvYs;IHzQ@338SyLn_ zOV%wnB%8{Zww=N8F0bn%YzrY!&61UsCnBHT+V}FrZqb2MW T{jJ(VCF4o3K-#d+bQa+skCisx delta 334 zcmW-dyG{a85Qe`4EV~>w(L_T+x1A-45kpWB6}bqCHx%zKuoB2h<6>uc0lQ6n4`XLx zuP@>w7%hzFIK_OKfBrv{%unhoHTn2`eFGNgOH9fM3@W-+^;k36lGJIKY-{eAG$jej z7Q32z7W-0}4=fHXS{6rIJ+^4;wBm{6lruqO&=X8IhVH$a83zMD(`wa9OM>+Cq!JC^ zqo46}E(F=IDzc8rrOhH&D)Ari-BCZ&>OPMeI@*sqnQomiBKY~7+0H3_yhC^I+Oqa diff --git a/FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/model/CategoryDetailsResponse.class b/FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/model/CategoryDetailsResponse.class index 0b4f78a41e3f1c20bd83669b55574b5e5c6ea930..2a9434c8e94f023d788131ab60257a60dd43da3c 100644 GIT binary patch delta 319 zcmW-cyG{a86h+rXVeZ@+BMDZ<5JGDKiB`r${Q}ge_{QNOg5&rCe2Z^Oi>dhtLTBLz z_zgDJn)nCCdp*To$=Unt?Q_?a8nkR}=&IFNKS#;Z-SfB3fjaasD z&Rs5;b-Cm!%*vVMwM&k+AYS)cUdH!=Y9?2#S4s_+8*alFIhDBMULaF?YUPQP%PMQ( zr_2uLnH2N~P2U$pmGLbeTpoGqjoO{q(89D}Og|nK%xMS~SqeV}=S4ou#JkQiD|#3C UultGziFKWcut8EYrkzdr1LUte`v3p{ delta 324 zcmW-c%Sr-a7>1vJQ0Jds8%7=9avFzw#GxIjnhf(oSoOvtc7kt+_mTe zx`{R|qwXO3|Gvfh!1uo23*S%jE7^MgeSHHad9;a=v#{9IvZci}$=igLXR9CIQtDn-$0wIkhO(-OU> z4rk0doO2;a2QQ(K;K>+Bm|Qw!xDv#wZqrS9u3t`N^3_tI?$F{oc$U-g8*T+Mp{7!t zN;s^r8hpyJ!7OP($ZvR_AZ%;ju=$jYWU_91| ZF0rh3#(&*+%#W|BjKMlXiV@{(z#k|qJnsMi diff --git a/FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/model/CategoryList.class b/FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/model/CategoryList.class index d4a168a3087b3beeaacda4f06dd22847da3917cd..772591c9b22575bfb1a10274ce80f47e941143b9 100644 GIT binary patch delta 323 zcmW-c$xZ@66h%+9(p?m-kl@ONLDwcoWMy3V2cS`Lh87UPwjCH85pn#0Ui%TmorxxH z-S|huD&OLsncmOv;|s|0s)$jH5~XCsGqUecRzxVqs8BV51BaU8kh(*| z@W{bej8T*v8wQdSr7uq6PBz@%Hhr>M^BJwcpWe8dqFLo+iz6MEth-x;jGLiA9xhVl%9HJA?32gcG#42 zlLZz9qe0vE1rcR@hbNb3Ufw_Dn?13*B$(IFM+D0nf;HB|Aig3B;dgux+h9}gtpB=h RB1rD&jKwZfnznZK;19HRJedFh delta 319 zcmW-cyG{a86h+sa$js$33JF#g2K@mfQW*>X05pnkWO#_+IEupf7Vz~0Q~MFb&caw& zS^7c5dp*To$=UntbN!$3$0v~IRgs_^C(eP9iV@GDs)$ieP@`@F4TnQTlOuFqq*+RA5sC8ZX45F;er-wWWWJXV`zLasvWeL+ka-{HySnV0u3`DRbYR|Jdt@t9y$L$J<9)Jd+1QuLi1B{td8JL|u0kP6bf OI%BcNtfsA>N~gq diff --git a/FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/model/CategoryListResponse.class b/FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/model/CategoryListResponse.class index 8912ef47183f36371ba2d9bcd909373e66eb4483..268b174159a1bea1b7cde42d0e567869afcc975b 100644 GIT binary patch delta 308 zcmW-cxlY4C5QhJ?v-W0VBqSqQsfeIR=>{PZt^k1$ViGQMU(P{rWTgtU5e+Y}5SwzyC&G0OoKnVWW};$F@#YUGCVZNd(xnQP*tP z*po=3BCxM{AaE#2d?XMG91EQ2?y10;b`#GfE^x_U#BGMjpcg$x{=*CWS)xUgE#M!Knl@|z delta 344 zcmW-dO-lk%6o%h3I?nYv3#njmC$$LL3`9g)nw43mXJ?7y1oB zt7sS059qJ>AEJ9Zi}P^a^S&H7Z_cYT{Q3R-1~7+!!$Ktq6C1j1>al8Ji=&3Rg>B7- zg(gQ56^0$nU4}ib%=-)n3@wI3tsXHP>$Ktt$0^PTM%W>w>s|36+(AE#+*YevUL<7R zhha>PVxz=4E(kft zpS7`qRRVFsnASYe_k+9p$A-A|^I5fcvQfk=A>JEA5y9lzWuark$IZu=8O0~e5@A|> q#3U>z5SCDo1zw|~eC98yWt5a==tFWQ)f-<^9s^}$6ccK*4*UTbjyzoe diff --git a/FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/model/DeleteAddressResponse.class b/FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/model/DeleteAddressResponse.class index 85d31a1352d4d55993412a60d93083def507885b..c7571eec6c3c0c95679a52ef58c188db2c0503c1 100644 GIT binary patch delta 309 zcmW-cyG{a85Qe`4yYAtzg$X7E3qxf~Lt!uqC|(d0Z+O4$0^*Vl71$DAflaJ@31eqr zVr%0=m{^(k2F7!kV!q5j|IB2*(%_WNOxJtfy_Xvff-u)?Rx68w%=73W z9@kgK)=&JJo9Ndn&Ur2i_}V|QhhD#%YxuoRYv9tN9o6lnREJxE%<2f*g{(`3wdl#t z%$CUuto|?z1-3GMhpx*V!ON#Twq}+~f_eR}EhuORij<g~G>oz>qoN+FQ_#MGiz3<(6xzW%Ma?NJ7JTJ(+jPIji zH1-?6;8IWsA4DPRaOECnR2z&sNH)sxfUeUr4)jZFHe-a{xC&AHXvN zSGw>30q@|}ONj3UtVMlL_3;<=mFlEgo!^g7V2WFXq|if>b<;f4Hq30(rl{Cr+ooi= zW3#JJ6eN3w`;r5tX(a01lLB0Cma!DilPD~G8aV=13T_!D?c3EOM8n-5g@=WL( z&BrhlSY5*=aJeCTySLu0fn-iFroXiWvl@aN^U<7B68Y%GX*&xn>RGHC=ef=P745`W LWmq$*H*4?*ld3nk diff --git a/FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/model/ItemList.class b/FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/model/ItemList.class index 93b0740733029b3413f7109aa8922125c1794af2..b6eaceb1c12f2a8492e786a73579503cfcf586cc 100644 GIT binary patch delta 337 zcmW-c%T5A85JhiKoav@#q9huLie?CFG7DX?Fl=175f>=p3kMhx9L5(Q;sc*w(BEOA zap%GhFno#rfGcCQmDD|zx;K^7bLu5E`22nU0I+~3i5SW;aO`REwN$iJwNc{;B=%9~ zIM8fxG$m}51r9YsftI9jByc2fEN~)lDsZN~wm?VUAa*6r(c`#aaF*LatMEGLn+Ava zF~6)nE*Ub)Gcsw8D+epMW{5ZauJ46@RQK|gW>9TAxWRxSq2{cF%Ja$bTih`Sm#R_A zx(+t6rFuL&UBn{8NYn{K22*OELu{?8@jQF@y)26o^QEpm2=v(%F28Tve#oB9LZHatcE delta 318 zcmW-c$x1^(5JgW1-|J52p@Ktj!WUcz7rM$qveb=;#AqDil&FbGoDzpbjng0WcL<6* z7k+>Ueuo>sK*Vkf>Yk$RrJ$Y?kBRpC@9P^d$%7_JK8j@B$%d0nCtJ?gmJ~Eab|kxw zdy2B0u|aS6;fe9j%Cx5slhB$f{t3FQW1FC z`I6g!JMLdTWlZ+Uv|z&i=?Ug61Q{00cV|vy&2-mCY>_3qi~OG(?XHcj*i3{~LQCH| QYnCInwVj9To5SgWKMjXAbpQYW diff --git a/FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/model/LoginResponse.class b/FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/model/LoginResponse.class index 62b28c67bd923200ea5d3146099302d8158090e7..0f3ef52e215853ff223ed73fc7525e2e11d5792d 100644 GIT binary patch delta 322 zcmW-cxk>|36o$V$CNp;?BSd2%R^TfmkObQMk^@JD4<$#EV@XrelC&i!l2e^HlXP^G@_E$Zg3GsFCo-gZ!$IWN zyrL_}gu=)qEv{X1+z8?gukEFMFQ}$-#YUynbh+g&TrjhV9`^#7R8ud{Bwg0o2w%+F zM4o9uBxw1*AnNG5#e>TuPyKQ0)gD`#6J*uvQNf~;V40QhCtefz{_Kb$VympFrSac4 SKN=)9RmfnANo7-Aw&4#JNINJ1 delta 294 zcmW-cxlY4S6hzOnV*A-~q>xaN#uTX|MMOwc`2iHAfUrkqi(`!0vOw4&EG=@yAJC$7 z6np?kwEPMc;+bjA=+0=Q`&Ilb=01Mk-hn9|ZPGL?tfx$&k@#(smW@x_BuKbp653>F zN_G=Ql06%XeaV63P;w;cNV<}qq@Og7B`3*};=tyVv)ADu6$|~xIOjr8j)hisO)ed3 zTnVy)*YirD7qv>Y^8|9i8!D8Hgg8mmky8Y)?X EKZe{lI{*Lx diff --git a/FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/model/LogoutResponse.class b/FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/model/LogoutResponse.class index 3616176574ed40f94aa5c4443d5b34cf2fa7f110..19c12773451c30b5198264094e850f831fc6376b 100644 GIT binary patch delta 310 zcmYL^yGjF55Qe|A*>%sZi-?hcDI|?prtpF$QKQCdqEX{5-ZvLQLfAs0ZCYDdP{B8_ z6FUnZz}m{*SFjY%v2lv|n1BA6VIE?SvF`iN>l-jm-Nh#7V6mjrvMyI_R$bOux5;Z3 zY&KjRa*|EWqGZce=55K2q$JtZ>Yij@Pb(g{98wk-&6;4K(DJYSWZMrK$x`RC88p)3 zx%**6)RnLl`HCEI9Hz~w;S-NBP6hq{{$iz7uXa4nI1g{l$>;^XKqgc)YpI0C9NF;G zjK?#K3e4cD-4p S-VLJj%44v=kYbPOEW$6BDL4WE delta 313 zcmYL^yG{a85Qe|A?7A1XP%#jR1s2AVLQRxaMDY%aisJpUfFTgFg+W_d`%R3|XV8S$ zS@;0fww6AGjqw~CrujEr^Sm zONS>d)hn!f#RDUXN1p7Mr@8D|G0cm=7YYsr1L0t#JJ8x5>gtFpQoIWMc9rtmzn+Tx zH{J!ZR8LQ5eW_xa8N1fIT{uCTAUiS;4h!6-qZ_0ZAABZ%ypO6N)+A`r1-J#H8iFy# q?dPH)F_Ek;t`pWIQ~K!o&x@8sif6US#T=EIxq6$|>Owz@EWsbi8BW>& delta 309 zcmW-c%PvDv6o$XusB`S@9!)W+N;;94b79-cna4 WyrYLa?9!vzs=GaH_vbj^5dHuZW=E$0 diff --git a/FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/model/RestaurantDetailsResponseAddress.class b/FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/model/RestaurantDetailsResponseAddress.class index 493755d0445ee4c604d68a51f9af8371eafc0a98..e76fc4a2c8a857c9286e1964742dd8b81d782004 100644 GIT binary patch delta 330 zcmW-cxk>|36o$VWotZn65hM`;R*^KRv=IawMF^IHSg29sWHF25xFs>Jaf!PiG7n*^ zq!SF-`Zm6Rc(14UJ~-#+hto@crQ6@XA3b24Cx<8n8=Im=Nn=B!tWnXZ>PXFE)4^xU zBGBHp*l`%3AlcR4lk7VxT$eN?P04|zB{`HFNse{mL~^Q|l+O%@Hs|l1l-Z|xyRT+c zm=|0MGU2n4Nm*RE%+nDJ*1V=S=6gYTY%X6b73wb6+z1lki=7B36wD delta 295 zcmW-cJ4?f07=@p&*yK%`f+SA5L|nRcadJ_Fg187GsP$4)6>W|2*49hCTknHN{)L-l zb11s{dz{5Dp5-~b=WyWtDs&6(_wPp+80Og~N7cf5%@53`zGhOl*&;OAP8pf(*yO1S zyD9gCeH)7dp&>MdmT)K>3CF@o+Gq=>>5}G|%{dqEogpK6GjhtfL>9wk_DP?6Rn+P<2_dTz07` zqLe&VELT0&lnJkUY*eCOApO#L z4C}tgPk5gLosl)?FwO`^`bzdV$20^<{oy3_vm8pCa4PV!ru^nuHqJCN`b%bd^9%|i zt#%Lyq_VzCGtL?3ul-IC>6Qh-fO%00MhyfLOzJ095qbTs9%54zj28MocNc3VW=$qU Lk+h*>oH_UdK~gg4 diff --git a/FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/model/RestaurantList.class b/FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/model/RestaurantList.class index 9f58b3a8a310ae0d8ecb5fcaa31d16ce6f715903..8e99cee3dd607275d0c349bb8d64613dd3dad738 100644 GIT binary patch delta 305 zcmW-cOD{uF6h_x+wRbzW4N*Zb=%gcqCas7Vb#CA%NUI{6n+B~ahTd;=>rK&8rqaZ~ zfVm%H?hlA_?aA8N-^!QlMxvPrfBn9H0K>d!!j-OArX8C#v$Jloq1j~1V%y`6#jd7< zRbkKLzHp$8d?*|V$3jIo5nQ1voC;^cx#wL7mtLRYmFAk8*Xoe?O?m56{3>`$O_6ke z0?DYwU5Fg_iq2fRl#V;;{7ifzlbfC@hIpXv4(O3cgGYr#&CF)Uq9IBwxmjK7FEFlX z%P%^PBA~t8;weOv=hmS8W_Qn}6e;s*K;alD=2>vRd&;WNn(Q4_c9BJM^!@kM`|^>p Ok$fx@GYpz!1^xhC%0Wi} delta 301 zcmW-cyG{a86h+rnVUBl(XvCn*{OmLNkm_#7&VTrf5KHMq)} X{tNxj#bf@+rtXB;Vp2P*lWq6|B8)xl delta 303 zcmWlUyG{Z@6o$WHS#}&ZN}`n(LVN(!n2=c6c}W!SctPC-5yf@A0p8^W?54Ib@db>X zg{6g+wJ+c+P#I@V@qNkp|D5E!WS_I`ufO*XV4MeqqS%FG-D1OH(_+h_WYcYr9mOtz zM`&I4s3?4jl0ECHWM7$bO>!VPl+-0hl1OrF<5+TH&lsO7&NvsOU)!IKo=$dB7c>NU z{V4JokEYKQEfd$nR+x*zxRxuF>(xrb=aMV^50%L+?+>9cD zt1@OhZhh{!e=DT|*)JyrBj!<8Fk>W`V_tvv1frlvdw;tZSTwr?_S|qf?praP1gi`g Ir%bX2|28l;!Tn5}K;lRE2N3U7Ofg4u=U$C8 MG|MU0#1Hdd=92UwpOsuL_QRAA0b&d^eTBs^| z7PdHSlo_@aYYaPFns*uY80rlBNui1m?;LgS_it z0gD9U1V?Gz#7}zNyep-92SrR1jJOv?1e2@1g@%JBg0~6t!5GiU=#+egNtlx$VzB$-HKsGyU(s&o5w#royG{;jn1hk{K&5%Ze3NUDgb%E;WTm zS+Z`pA*m}J-jr-fwj~Xt?nrjcw&tEx5A&*NAW0Q7aH{{U0l- zr+!n193=(2m_GKI4?QVW14C0EWkhbVl+Dd diff --git a/FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/model/SignupCustomerRequest.class b/FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/model/SignupCustomerRequest.class index d7034f1408bebaaa6cbdeabbf826a7682ccf26f3..c1f8d9bc13964bbe919f3304d49b84005271591d 100644 GIT binary patch delta 329 zcmW-dyG{Z@7)H+^><;TDkZ3|e14^d_iJ_vhB_^VHK@pV&0l{TeZe9_oE%z<#jGcuK zU}Ag>AHqnSaf)-2`M!L`KV6tCjz6Yv??8r$g+(chmajesdiDOZvW^$rk zH)&Ydlq5~NBa&432Mi6Z~LnrMzUNfDqw(GUN%`JC=nEw@w`3WNxzh@+fB-LxQy1o9o)2U~Z zHaqP4Wuq7`kP!sEf$IuFmadsR*o=96{WNlNKEEnhQ6~rq)|3PrZ2C))iYWL`k?+|p Yw$)$Ye{K}@=8CElV2^~dp^|<01If%ip8x;= delta 304 zcmW-cyG{Z@6o$V+c6S&z!9)!SjfkbOF;q6%5)&0~h&Mn5MHWOZ-gWT>Z00eHg|V~n z0jzurTYD4YjHmd%QT-DA9qMtRpPhO4 z(kIK6{&B|LYiul(vn@{G*2%^ni5C|M) zYaaJL4}@=DZdQ)T1;MQO)DbKi36@#WGx3th>8JSj@G5I&7x_QeA8C$mnofi~6UMGd Gw%`w1|2I$o diff --git a/FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/model/SignupCustomerResponse.class b/FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/model/SignupCustomerResponse.class index 303436d232e6e1a08f4f24247fafd19584cea054..605bbccd26b824d5b6b6b94688c0fbcc64031bf7 100644 GIT binary patch delta 317 zcmYL^yG{a85Qe|A?7GWw3nK=C6($->V$?!FMa3&9D&Fvh%OwOtwlHW*Yrl!_VeBxW zH8HX94SWG#fq0IMQ_Pq7=bxF(TXYcZeGK~pV1b6jCKtwHQ>QImZrkigcGvBs)5DUJnSnzI6NABYUDF61?EDr)1w{} zLM*uLbOc*RzJu>lqyCb!A7UeRQ5ZK5+rpHAFik%EOq9h7$Moai46{bF{?5JYAXzj! M7W1SHjgZ7#v>Tt+gOYGQh)tbmHLYR#9JS~ZyjKYs)tR^#bQaPWnHe=ta_}mZnL4eX_NPG z$vG4>w;Z-TWiC3D9CjRbwYul9ucs9cJPtV$L>ob^vdhqVh7G+(IBO6z zjh>)aD0+lw?@4R0KGwhff5G~Rf5qGHzb~)A7*&Zw&ckNTw0ScwI4nw*Saw)3Ty+q$b%j>b~T_Olux0jyM)rou**4-1Tq$RL>9EsapTK6STA9Y4B}D z^p((${6tPT4Xbux^2{U6xnShqU#WLnjlRbPm*JzGk6qylWKu_`nMryqP`Gyz<2j}U zc5u_{2^?kGE_IIv&F8dpXOGPl1XKE5M=+})$dC=cq9u_FC)C66JbA5IW?T5Gg4m+= NSS*py9MYX-_yeFoH*Np` delta 331 zcmYL_yGjF55Qe|AX0w~)7NQcck!{2>g%>cZF&d4RM5D(0eUp`t5VkNI!9vp7FZdp6 zCwQqXeFS@7K|H5&iusuTpPzyGNWZ3gpT93}z$AghqL9L5Nw;M^7A;mJtE^e9YnCj^ zk`x7-4b4rPid4&6HrqBkHdU?e+U)7H;=bg7LxIr@1cT+4f8%G`e%Q!Vqw8ka@Wf;9 z+lYg{pX3q80x!N5o@;U9Fu|!{;6G5QwXW)s!x`uCQzBQq;8I|_s+vL8b;vO<5K`c1 ztrPiCx07|1bm!nPE=Yvkc3WUd?OXT`HR{jP=6zz=%nQcU6HLLBf?$Sh{FN#RFCLW- a{j8alfG diff --git a/FoodOrderingApp-api/target/classes/io/swagger/api/ApiResponseMessage.class b/FoodOrderingApp-api/target/classes/io/swagger/api/ApiResponseMessage.class index 35f04338ac697494b28b1281532243a7b7f62c05..65c12f001339846e3450daf42496edd101d4d768 100644 GIT binary patch delta 239 zcmYLCNeaSH41K@jZ?T{|2Ly5BRO?i=whndd1;iV9f-XFVbSEg{(tCIfF~2AVl9%M= zy1G!Xpp-hp-51sWN4xlzZ5TL)1=YdPPYy^v7<&=ajvrToS}c7BpWT5_!;~%2z3#NEoGcjNcOv_y8V|8`l5; delta 236 zcmYL?Ne+TQ5Ji7C0u6ygcg7(xZk%vHQ4t()Sx6NbPP8Zt~7W(;$N1w$m+QkIpDwT{g>%oDOr_9P;T zi+*yV4y{^5M-5;yRMdsFK~WG=7D>=RlfN>4t|dB6^iDc$qr+V_&dPO_r0WD-^!QN? iq&0v1VKKcJ2w2hr#S`$L#g*@+d_ply>j=LmW8ed^O&eYS diff --git a/FoodOrderingApp-api/target/classes/pom.xml b/FoodOrderingApp-api/target/classes/pom.xml new file mode 100644 index 0000000..8830596 --- /dev/null +++ b/FoodOrderingApp-api/target/classes/pom.xml @@ -0,0 +1,66 @@ + + 4.0.0 + io.swagger + swagger-spring + jar + swagger-spring + 1.0.0 + + 1.8 + ${java.version} + ${java.version} + 2.7.0 + + + org.springframework.boot + spring-boot-starter-parent + 1.5.9.RELEASE + + + src/main/java + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + + + io.springfox + springfox-swagger2 + ${springfox-version} + + + io.springfox + springfox-swagger-ui + ${springfox-version} + + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + + + + javax.validation + validation-api + + + diff --git a/FoodOrderingApp-api/target/classes/src/main/resources/application.properties b/FoodOrderingApp-api/target/classes/src/main/resources/application.properties new file mode 100644 index 0000000..94aed44 --- /dev/null +++ b/FoodOrderingApp-api/target/classes/src/main/resources/application.properties @@ -0,0 +1,5 @@ +springfox.documentation.swagger.v2.path=/api-docs +server.contextPath=/api +server.port=8080 +spring.jackson.date-format=io.swagger.RFC3339DateFormat +spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false \ No newline at end of file diff --git a/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/AddressList.java b/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/AddressList.java index 73e063e..1964c64 100644 --- a/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/AddressList.java +++ b/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/AddressList.java @@ -15,7 +15,7 @@ * AddressList */ @Validated -@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-21T16:13:47.040+05:30") +@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-23T20:02:26.125+05:30") public class AddressList { @JsonProperty("id") diff --git a/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/AddressListResponse.java b/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/AddressListResponse.java index 4d2b9e4..96f76f8 100644 --- a/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/AddressListResponse.java +++ b/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/AddressListResponse.java @@ -16,7 +16,7 @@ * AddressListResponse */ @Validated -@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-21T16:13:47.040+05:30") +@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-23T20:02:26.125+05:30") public class AddressListResponse { @JsonProperty("addresses") diff --git a/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/AddressListState.java b/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/AddressListState.java index dfb31ae..5e985f1 100644 --- a/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/AddressListState.java +++ b/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/AddressListState.java @@ -14,7 +14,7 @@ * AddressListState */ @Validated -@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-21T16:13:47.040+05:30") +@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-23T20:02:26.125+05:30") public class AddressListState { @JsonProperty("id") diff --git a/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/CategoriesListResponse.java b/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/CategoriesListResponse.java index 692f08a..fd4ffd8 100644 --- a/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/CategoriesListResponse.java +++ b/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/CategoriesListResponse.java @@ -16,7 +16,7 @@ * CategoriesListResponse */ @Validated -@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-21T16:13:47.677+05:30") +@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-23T20:02:26.570+05:30") public class CategoriesListResponse { @JsonProperty("categories") diff --git a/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/CategoryDetailsResponse.java b/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/CategoryDetailsResponse.java index d804263..e55841e 100644 --- a/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/CategoryDetailsResponse.java +++ b/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/CategoryDetailsResponse.java @@ -17,7 +17,7 @@ * CategoryDetailsResponse */ @Validated -@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-21T16:13:47.677+05:30") +@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-23T20:02:26.570+05:30") public class CategoryDetailsResponse { @JsonProperty("id") diff --git a/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/CategoryList.java b/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/CategoryList.java index 36f505d..ba4d7f3 100644 --- a/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/CategoryList.java +++ b/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/CategoryList.java @@ -17,7 +17,7 @@ * CategoryList */ @Validated -@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-21T16:13:46.406+05:30") +@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-23T20:02:25.583+05:30") public class CategoryList { @JsonProperty("id") diff --git a/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/CategoryListResponse.java b/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/CategoryListResponse.java index a6cd42d..63fb14a 100644 --- a/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/CategoryListResponse.java +++ b/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/CategoryListResponse.java @@ -14,7 +14,7 @@ * CategoryListResponse */ @Validated -@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-21T16:13:47.677+05:30") +@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-23T20:02:26.570+05:30") public class CategoryListResponse { @JsonProperty("id") diff --git a/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/DeleteAddressResponse.java b/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/DeleteAddressResponse.java index 289515f..8d822e4 100644 --- a/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/DeleteAddressResponse.java +++ b/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/DeleteAddressResponse.java @@ -14,7 +14,7 @@ * DeleteAddressResponse */ @Validated -@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-21T16:13:47.040+05:30") +@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-23T20:02:26.125+05:30") public class DeleteAddressResponse { @JsonProperty("id") diff --git a/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/ErrorResponse.java b/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/ErrorResponse.java index 938d127..2bb41e2 100644 --- a/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/ErrorResponse.java +++ b/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/ErrorResponse.java @@ -13,7 +13,7 @@ * ErrorResponse */ @Validated -@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-21T16:13:47.677+05:30") +@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-23T20:02:26.570+05:30") public class ErrorResponse { @JsonProperty("code") diff --git a/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/ItemList.java b/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/ItemList.java index 8882bc6..e006d60 100644 --- a/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/ItemList.java +++ b/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/ItemList.java @@ -15,7 +15,7 @@ * ItemList */ @Validated -@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-21T16:13:47.677+05:30") +@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-23T20:02:26.570+05:30") public class ItemList { @JsonProperty("id") diff --git a/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/LoginResponse.java b/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/LoginResponse.java index 79c0948..9b3a022 100644 --- a/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/LoginResponse.java +++ b/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/LoginResponse.java @@ -13,7 +13,7 @@ * LoginResponse */ @Validated -@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-21T16:13:44.861+05:30") +@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-23T20:02:24.911+05:30") public class LoginResponse { @JsonProperty("id") diff --git a/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/LogoutResponse.java b/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/LogoutResponse.java index 60ccf88..ef5cbfc 100644 --- a/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/LogoutResponse.java +++ b/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/LogoutResponse.java @@ -13,7 +13,7 @@ * LogoutResponse */ @Validated -@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-21T16:13:44.861+05:30") +@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-23T20:02:24.911+05:30") public class LogoutResponse { @JsonProperty("id") diff --git a/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/RestaurantDetailsResponse.java b/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/RestaurantDetailsResponse.java index 68bb75d..6ab9045 100644 --- a/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/RestaurantDetailsResponse.java +++ b/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/RestaurantDetailsResponse.java @@ -20,7 +20,7 @@ */ @ApiModel(description = "Restaurant details") @Validated -@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-21T16:13:46.406+05:30") +@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-23T20:02:25.583+05:30") public class RestaurantDetailsResponse { @JsonProperty("id") diff --git a/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/RestaurantDetailsResponseAddress.java b/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/RestaurantDetailsResponseAddress.java index 5e5f899..9520a5c 100644 --- a/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/RestaurantDetailsResponseAddress.java +++ b/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/RestaurantDetailsResponseAddress.java @@ -15,7 +15,7 @@ * RestaurantDetailsResponseAddress */ @Validated -@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-21T16:13:46.406+05:30") +@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-23T20:02:25.583+05:30") public class RestaurantDetailsResponseAddress { @JsonProperty("id") diff --git a/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/RestaurantDetailsResponseAddressState.java b/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/RestaurantDetailsResponseAddressState.java index 55669ca..0112756 100644 --- a/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/RestaurantDetailsResponseAddressState.java +++ b/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/RestaurantDetailsResponseAddressState.java @@ -14,7 +14,7 @@ * RestaurantDetailsResponseAddressState */ @Validated -@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-21T16:13:46.406+05:30") +@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-23T20:02:25.583+05:30") public class RestaurantDetailsResponseAddressState { @JsonProperty("id") diff --git a/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/RestaurantList.java b/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/RestaurantList.java index 77a4945..21214b8 100644 --- a/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/RestaurantList.java +++ b/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/RestaurantList.java @@ -16,7 +16,7 @@ * RestaurantList */ @Validated -@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-21T16:13:46.406+05:30") +@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-23T20:02:25.583+05:30") public class RestaurantList { @JsonProperty("id") diff --git a/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/RestaurantListResponse.java b/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/RestaurantListResponse.java index e808aed..addf8b4 100644 --- a/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/RestaurantListResponse.java +++ b/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/RestaurantListResponse.java @@ -16,7 +16,7 @@ * RestaurantListResponse */ @Validated -@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-21T16:13:46.406+05:30") +@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-23T20:02:25.583+05:30") public class RestaurantListResponse { @JsonProperty("restaurants") diff --git a/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/SaveAddressRequest.java b/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/SaveAddressRequest.java index aa03713..d034bff 100644 --- a/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/SaveAddressRequest.java +++ b/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/SaveAddressRequest.java @@ -13,7 +13,7 @@ * SaveAddressRequest */ @Validated -@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-21T16:13:47.040+05:30") +@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-23T20:02:26.125+05:30") public class SaveAddressRequest { @JsonProperty("flat_building_name") diff --git a/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/SaveAddressResponse.java b/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/SaveAddressResponse.java index 26489db..ed7d9ec 100644 --- a/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/SaveAddressResponse.java +++ b/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/SaveAddressResponse.java @@ -13,7 +13,7 @@ * SaveAddressResponse */ @Validated -@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-21T16:13:47.040+05:30") +@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-23T20:02:26.125+05:30") public class SaveAddressResponse { @JsonProperty("id") diff --git a/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/SignupCustomerRequest.java b/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/SignupCustomerRequest.java index cbb4a1d..347df03 100644 --- a/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/SignupCustomerRequest.java +++ b/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/SignupCustomerRequest.java @@ -13,7 +13,7 @@ * SignupCustomerRequest */ @Validated -@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-21T16:13:44.861+05:30") +@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-23T20:02:24.911+05:30") public class SignupCustomerRequest { @JsonProperty("first_name") diff --git a/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/SignupCustomerResponse.java b/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/SignupCustomerResponse.java index 116bdd6..e1d8236 100644 --- a/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/SignupCustomerResponse.java +++ b/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/SignupCustomerResponse.java @@ -13,7 +13,7 @@ * SignupCustomerResponse */ @Validated -@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-21T16:13:44.861+05:30") +@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-23T20:02:24.911+05:30") public class SignupCustomerResponse { @JsonProperty("id") diff --git a/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/UpdatePasswordRequest.java b/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/UpdatePasswordRequest.java index 300fd9e..a2eebb8 100644 --- a/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/UpdatePasswordRequest.java +++ b/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/UpdatePasswordRequest.java @@ -13,7 +13,7 @@ * UpdatePasswordRequest */ @Validated -@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-21T16:13:44.861+05:30") +@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-23T20:02:24.911+05:30") public class UpdatePasswordRequest { @JsonProperty("old_password") diff --git a/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/UpdatePasswordResponse.java b/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/UpdatePasswordResponse.java index d10f150..82fabc1 100644 --- a/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/UpdatePasswordResponse.java +++ b/FoodOrderingApp-api/target/generated-sources/com/upgrad/FoodOrderingApp/api/model/UpdatePasswordResponse.java @@ -13,7 +13,7 @@ * UpdatePasswordResponse */ @Validated -@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-21T16:13:44.861+05:30") +@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-23T20:02:24.911+05:30") public class UpdatePasswordResponse { @JsonProperty("id") diff --git a/FoodOrderingApp-api/target/generated-sources/io/swagger/api/ApiException.java b/FoodOrderingApp-api/target/generated-sources/io/swagger/api/ApiException.java index c266a73..bdcc762 100644 --- a/FoodOrderingApp-api/target/generated-sources/io/swagger/api/ApiException.java +++ b/FoodOrderingApp-api/target/generated-sources/io/swagger/api/ApiException.java @@ -1,6 +1,6 @@ package io.swagger.api; -@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-21T16:13:47.677+05:30") +@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-23T20:02:26.570+05:30") public class ApiException extends Exception{ private int code; diff --git a/FoodOrderingApp-api/target/generated-sources/io/swagger/api/ApiOriginFilter.java b/FoodOrderingApp-api/target/generated-sources/io/swagger/api/ApiOriginFilter.java index 7114c9f..b9b0b8a 100644 --- a/FoodOrderingApp-api/target/generated-sources/io/swagger/api/ApiOriginFilter.java +++ b/FoodOrderingApp-api/target/generated-sources/io/swagger/api/ApiOriginFilter.java @@ -5,7 +5,7 @@ import javax.servlet.*; import javax.servlet.http.HttpServletResponse; -@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-21T16:13:47.677+05:30") +@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-23T20:02:26.570+05:30") public class ApiOriginFilter implements javax.servlet.Filter { @Override diff --git a/FoodOrderingApp-api/target/generated-sources/io/swagger/api/ApiResponseMessage.java b/FoodOrderingApp-api/target/generated-sources/io/swagger/api/ApiResponseMessage.java index a069da7..cf88ea6 100644 --- a/FoodOrderingApp-api/target/generated-sources/io/swagger/api/ApiResponseMessage.java +++ b/FoodOrderingApp-api/target/generated-sources/io/swagger/api/ApiResponseMessage.java @@ -2,7 +2,7 @@ import javax.xml.bind.annotation.XmlTransient; -@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-21T16:13:47.677+05:30") +@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-23T20:02:26.570+05:30") @javax.xml.bind.annotation.XmlRootElement public class ApiResponseMessage { diff --git a/FoodOrderingApp-api/target/generated-sources/io/swagger/api/NotFoundException.java b/FoodOrderingApp-api/target/generated-sources/io/swagger/api/NotFoundException.java index 34ef324..98a0889 100644 --- a/FoodOrderingApp-api/target/generated-sources/io/swagger/api/NotFoundException.java +++ b/FoodOrderingApp-api/target/generated-sources/io/swagger/api/NotFoundException.java @@ -1,6 +1,6 @@ package io.swagger.api; -@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-21T16:13:47.677+05:30") +@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-23T20:02:26.570+05:30") public class NotFoundException extends ApiException { private int code; diff --git a/FoodOrderingApp-api/target/generated-sources/io/swagger/configuration/SwaggerDocumentationConfig.java b/FoodOrderingApp-api/target/generated-sources/io/swagger/configuration/SwaggerDocumentationConfig.java index ec71e8c..5f445fa 100644 --- a/FoodOrderingApp-api/target/generated-sources/io/swagger/configuration/SwaggerDocumentationConfig.java +++ b/FoodOrderingApp-api/target/generated-sources/io/swagger/configuration/SwaggerDocumentationConfig.java @@ -10,7 +10,7 @@ import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket; -@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-21T16:13:47.677+05:30") +@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-04-23T20:02:26.570+05:30") @Configuration public class SwaggerDocumentationConfig { diff --git a/FoodOrderingApp-api/target/maven-archiver/pom.properties b/FoodOrderingApp-api/target/maven-archiver/pom.properties index e4de0a3..8d3bd2c 100644 --- a/FoodOrderingApp-api/target/maven-archiver/pom.properties +++ b/FoodOrderingApp-api/target/maven-archiver/pom.properties @@ -1,4 +1,4 @@ #Created by Apache Maven 3.6.3 +version=1.0-SNAPSHOT groupId=FoodOrderingApp-Backend artifactId=FoodOrderingApp-api -version=1.0-SNAPSHOT diff --git a/FoodOrderingApp-api/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/FoodOrderingApp-api/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst index 1a3fbb3..3d0191b 100644 --- a/FoodOrderingApp-api/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ b/FoodOrderingApp-api/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -5,6 +5,7 @@ com\upgrad\FoodOrderingApp\api\model\DeleteAddressResponse.class io\swagger\configuration\HomeController.class com\upgrad\FoodOrderingApp\api\model\ItemList$ItemTypeEnum.class com\upgrad\FoodOrderingApp\api\model\UpdatePasswordRequest.class +com\upgrad\FoodOrderingApp\api\controller\AddressController.class io\swagger\api\ApiResponseMessage.class com\upgrad\FoodOrderingApp\api\model\RestaurantDetailsResponseAddress.class com\upgrad\FoodOrderingApp\api\model\CategoryDetailsResponse.class @@ -33,3 +34,4 @@ com\upgrad\FoodOrderingApp\api\model\CategoryList.class com\upgrad\FoodOrderingApp\api\model\CategoryListResponse.class com\upgrad\FoodOrderingApp\api\model\UpdatePasswordResponse.class com\upgrad\FoodOrderingApp\api\model\AddressListState.class +com\upgrad\FoodOrderingApp\api\controller\CustomerController.class diff --git a/FoodOrderingApp-api/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/FoodOrderingApp-api/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst index e1b2ca8..80aa796 100644 --- a/FoodOrderingApp-api/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ b/FoodOrderingApp-api/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -1,33 +1,35 @@ -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-api\target\generated-sources\.\com\upgrad\FoodOrderingApp\api\model\LoginResponse.java -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-api\src\main\java\com\upgrad\FoodOrderingApp\api\FoodOrderingAppApiApplication.java -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-api\target\generated-sources\.\com\upgrad\FoodOrderingApp\api\model\AddressListState.java -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-api\target\generated-sources\.\com\upgrad\FoodOrderingApp\api\model\UpdatePasswordResponse.java -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-api\target\generated-sources\.\com\upgrad\FoodOrderingApp\api\model\SignupCustomerRequest.java -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-api\target\generated-sources\.\com\upgrad\FoodOrderingApp\api\model\DeleteAddressResponse.java -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-api\target\generated-sources\.\com\upgrad\FoodOrderingApp\api\model\SaveAddressResponse.java -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-api\target\generated-sources\.\io\swagger\configuration\SwaggerDocumentationConfig.java -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-api\target\generated-sources\.\io\swagger\RFC3339DateFormat.java -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-api\target\generated-sources\.\com\upgrad\FoodOrderingApp\api\model\CategoryListResponse.java -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-api\target\generated-sources\.\com\upgrad\FoodOrderingApp\api\model\SaveAddressRequest.java -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-api\target\generated-sources\.\com\upgrad\FoodOrderingApp\api\model\RestaurantDetailsResponseAddress.java -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-api\target\generated-sources\.\io\swagger\Swagger2SpringBoot.java -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-api\target\generated-sources\.\com\upgrad\FoodOrderingApp\api\model\RestaurantDetailsResponseAddressState.java -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-api\target\generated-sources\.\io\swagger\api\ApiResponseMessage.java -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-api\target\generated-sources\.\com\upgrad\FoodOrderingApp\api\model\LogoutResponse.java -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-api\target\generated-sources\.\io\swagger\configuration\HomeController.java -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-api\target\generated-sources\.\com\upgrad\FoodOrderingApp\api\model\RestaurantListResponse.java -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-api\target\generated-sources\.\com\upgrad\FoodOrderingApp\api\model\AddressList.java -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-api\target\generated-sources\.\com\upgrad\FoodOrderingApp\api\model\UpdatePasswordRequest.java -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-api\target\generated-sources\.\com\upgrad\FoodOrderingApp\api\model\RestaurantDetailsResponse.java -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-api\target\generated-sources\.\io\swagger\api\ApiOriginFilter.java -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-api\target\generated-sources\.\com\upgrad\FoodOrderingApp\api\model\CategoriesListResponse.java -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-api\target\generated-sources\.\com\upgrad\FoodOrderingApp\api\model\ItemList.java -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-api\target\generated-sources\.\com\upgrad\FoodOrderingApp\api\model\RestaurantList.java -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-api\target\generated-sources\.\com\upgrad\FoodOrderingApp\api\model\CategoryDetailsResponse.java -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-api\target\generated-sources\.\com\upgrad\FoodOrderingApp\api\model\CategoryList.java -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-api\target\generated-sources\.\io\swagger\api\ApiException.java -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-api\target\generated-sources\.\io\swagger\api\NotFoundException.java -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-api\target\generated-sources\.\com\upgrad\FoodOrderingApp\api\model\SignupCustomerResponse.java -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-api\target\generated-sources\.\com\upgrad\FoodOrderingApp\api\model\AddressListResponse.java -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-api\target\generated-sources\.\com\upgrad\FoodOrderingApp\api\model\ErrorResponse.java -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-api\src\main\java\com\upgrad\FoodOrderingApp\api\config\SwaggerConfiguration.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-api\target\generated-sources\.\com\upgrad\FoodOrderingApp\api\model\RestaurantList.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-api\target\generated-sources\.\com\upgrad\FoodOrderingApp\api\model\RestaurantDetailsResponse.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-api\target\generated-sources\.\com\upgrad\FoodOrderingApp\api\model\DeleteAddressResponse.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-api\target\generated-sources\.\com\upgrad\FoodOrderingApp\api\model\CategoryList.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-api\target\generated-sources\.\com\upgrad\FoodOrderingApp\api\model\LogoutResponse.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-api\src\main\java\com\upgrad\FoodOrderingApp\api\FoodOrderingAppApiApplication.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-api\target\generated-sources\.\com\upgrad\FoodOrderingApp\api\model\CategoryListResponse.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-api\target\generated-sources\.\com\upgrad\FoodOrderingApp\api\model\LoginResponse.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-api\target\generated-sources\.\io\swagger\api\NotFoundException.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-api\target\generated-sources\.\io\swagger\RFC3339DateFormat.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-api\target\generated-sources\.\com\upgrad\FoodOrderingApp\api\model\UpdatePasswordResponse.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-api\target\generated-sources\.\io\swagger\api\ApiException.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-api\src\main\java\com\upgrad\FoodOrderingApp\api\config\SwaggerConfiguration.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-api\target\generated-sources\.\io\swagger\Swagger2SpringBoot.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-api\target\generated-sources\.\com\upgrad\FoodOrderingApp\api\model\AddressListState.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-api\target\generated-sources\.\com\upgrad\FoodOrderingApp\api\model\CategoriesListResponse.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-api\target\generated-sources\.\com\upgrad\FoodOrderingApp\api\model\SignupCustomerResponse.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-api\target\generated-sources\.\io\swagger\configuration\HomeController.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-api\target\generated-sources\.\com\upgrad\FoodOrderingApp\api\model\RestaurantDetailsResponseAddressState.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-api\target\generated-sources\.\com\upgrad\FoodOrderingApp\api\model\RestaurantListResponse.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-api\target\generated-sources\.\com\upgrad\FoodOrderingApp\api\model\SaveAddressRequest.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-api\target\generated-sources\.\com\upgrad\FoodOrderingApp\api\model\AddressList.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-api\target\generated-sources\.\com\upgrad\FoodOrderingApp\api\model\SaveAddressResponse.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-api\target\generated-sources\.\com\upgrad\FoodOrderingApp\api\model\UpdatePasswordRequest.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-api\target\generated-sources\.\io\swagger\configuration\SwaggerDocumentationConfig.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-api\src\main\java\com\upgrad\FoodOrderingApp\api\controller\CustomerController.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-api\target\generated-sources\.\com\upgrad\FoodOrderingApp\api\model\AddressListResponse.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-api\target\generated-sources\.\io\swagger\api\ApiOriginFilter.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-api\target\generated-sources\.\com\upgrad\FoodOrderingApp\api\model\RestaurantDetailsResponseAddress.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-api\src\main\java\com\upgrad\FoodOrderingApp\api\controller\AddressController.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-api\target\generated-sources\.\com\upgrad\FoodOrderingApp\api\model\ItemList.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-api\target\generated-sources\.\io\swagger\api\ApiResponseMessage.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-api\target\generated-sources\.\com\upgrad\FoodOrderingApp\api\model\CategoryDetailsResponse.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-api\target\generated-sources\.\com\upgrad\FoodOrderingApp\api\model\ErrorResponse.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-api\target\generated-sources\.\com\upgrad\FoodOrderingApp\api\model\SignupCustomerRequest.java diff --git a/FoodOrderingApp-api/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/FoodOrderingApp-api/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst deleted file mode 100644 index e69de29..0000000 diff --git a/FoodOrderingApp-db/src/main/resources/config/localhost.properties b/FoodOrderingApp-db/src/main/resources/config/localhost.properties index 5c0b5c7..9c00d68 100644 --- a/FoodOrderingApp-db/src/main/resources/config/localhost.properties +++ b/FoodOrderingApp-db/src/main/resources/config/localhost.properties @@ -2,5 +2,5 @@ server.port=5432 server.host=localhost database.name=restaurantdb database.username=postgres -database.password=root +database.password=abhishek diff --git a/FoodOrderingApp-db/target/FoodOrderingApp-db.jar b/FoodOrderingApp-db/target/FoodOrderingApp-db.jar index accabae188136e5090e4caa52838527c4a189fa9..2f4bc0dbaa6cdb010fdfe9fb8425b6e47d5f6be8 100644 GIT binary patch delta 2142 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 GclS3+{Ba`y diff --git a/FoodOrderingApp-db/target/classes/config/localhost.properties b/FoodOrderingApp-db/target/classes/config/localhost.properties index 5c0b5c7..9c00d68 100644 --- a/FoodOrderingApp-db/target/classes/config/localhost.properties +++ b/FoodOrderingApp-db/target/classes/config/localhost.properties @@ -2,5 +2,5 @@ server.port=5432 server.host=localhost database.name=restaurantdb database.username=postgres -database.password=root +database.password=abhishek diff --git a/FoodOrderingApp-db/target/maven-archiver/pom.properties b/FoodOrderingApp-db/target/maven-archiver/pom.properties index 7d95f6d..6a6ece1 100644 --- a/FoodOrderingApp-db/target/maven-archiver/pom.properties +++ b/FoodOrderingApp-db/target/maven-archiver/pom.properties @@ -1,4 +1,4 @@ #Created by Apache Maven 3.6.3 +version=1.0-SNAPSHOT groupId=FoodOrderingApp-Backend artifactId=FoodOrderingApp-db -version=1.0-SNAPSHOT diff --git a/FoodOrderingApp-db/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/FoodOrderingApp-db/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst deleted file mode 100644 index e69de29..0000000 diff --git a/FoodOrderingApp-db/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/FoodOrderingApp-db/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst deleted file mode 100644 index e69de29..0000000 diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/AddressService.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/AddressService.java new file mode 100644 index 0000000..a6039e5 --- /dev/null +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/AddressService.java @@ -0,0 +1,26 @@ +package com.upgrad.FoodOrderingApp.service.businness; + +import com.upgrad.FoodOrderingApp.service.entity.AddressEntity; +import com.upgrad.FoodOrderingApp.service.entity.CustomerAddressEntity; +import com.upgrad.FoodOrderingApp.service.entity.CustomerEntity; +import com.upgrad.FoodOrderingApp.service.entity.StateEntity; +import com.upgrad.FoodOrderingApp.service.exception.AddressNotFoundException; +import com.upgrad.FoodOrderingApp.service.exception.AuthorizationFailedException; +import com.upgrad.FoodOrderingApp.service.exception.SaveAddressException; + +import java.util.List; + +/* + * This AddressService interface gives the list of all the service that exist in the address service implementation class. + * Controller class will be calling the service methods by this interface. + */ +public interface AddressService { + + AddressEntity saveAddress(AddressEntity addressEntity, CustomerAddressEntity customerAddressEntity) throws + SaveAddressException; + AddressEntity getAddressByUUID(String addressId, CustomerEntity customerEntity) throws AuthorizationFailedException, + AddressNotFoundException; + List getAllAddress(CustomerEntity customer); + StateEntity getState(String stateUUID); + +} diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/AddressServiceImpl.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/AddressServiceImpl.java new file mode 100644 index 0000000..2cf89b5 --- /dev/null +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/AddressServiceImpl.java @@ -0,0 +1,68 @@ +package com.upgrad.FoodOrderingApp.service.businness; + +import com.upgrad.FoodOrderingApp.service.dao.AddressDao; +import com.upgrad.FoodOrderingApp.service.entity.AddressEntity; +import com.upgrad.FoodOrderingApp.service.entity.CustomerAddressEntity; +import com.upgrad.FoodOrderingApp.service.entity.CustomerEntity; +import com.upgrad.FoodOrderingApp.service.entity.StateEntity; +import com.upgrad.FoodOrderingApp.service.exception.AddressNotFoundException; +import com.upgrad.FoodOrderingApp.service.exception.AuthorizationFailedException; +import com.upgrad.FoodOrderingApp.service.exception.SaveAddressException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +public class AddressServiceImpl implements AddressService { + + @Autowired + private AddressDao addressDao; + + + @Override + @Transactional(propagation = Propagation.REQUIRED) + public AddressEntity saveAddress(AddressEntity addressEntity, CustomerAddressEntity customerAddressEntity) throws + SaveAddressException { + //validations + + if(addressEntity.getPincode().isEmpty() || addressEntity.getFlatBuilNo().isEmpty()) { + throw new SaveAddressException("SAR-001", "No Fiels Can be empty"); + } + + addressDao.saveAddress(addressEntity); + saveCustomerAddress(customerAddressEntity); + return addressEntity; + } + + + @Override + public AddressEntity getAddressByUUID(String addressId, CustomerEntity customerEntity) throws + AuthorizationFailedException, AddressNotFoundException { + // if(addressDao.getAddressByUUID(addressId) == null) throw new AddressNotFoundException("ANF-003", "No address by this id"); + // else if(addressDao.getCustomerByAddress(addressId).getCustomer() != customerEntity) throw new AuthorizationFailedException("ATHR-004", "You are not authorized to view/update/delete any one else's address"); + return addressDao.getAddressByUUID(addressId); + } + + + + @Transactional(propagation = Propagation.REQUIRED) + public CustomerAddressEntity saveCustomerAddress(CustomerAddressEntity customerAddressEntity) { + return addressDao.saveCustomerAddress(customerAddressEntity); + } + + + @Override + public List getAllAddress(CustomerEntity customer) { + return addressDao.getAllAddress(customer); + } + + @Override + public StateEntity getState(String stateUUID) { + return addressDao.getStateByUUID(stateUUID); + } + + +} diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/CustomerService.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/CustomerService.java new file mode 100644 index 0000000..6677257 --- /dev/null +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/CustomerService.java @@ -0,0 +1,13 @@ +package com.upgrad.FoodOrderingApp.service.businness; + +import com.upgrad.FoodOrderingApp.service.entity.CustomerAuthEntity; +import com.upgrad.FoodOrderingApp.service.entity.CustomerEntity; +import com.upgrad.FoodOrderingApp.service.exception.AuthenticationFailedException; +import com.upgrad.FoodOrderingApp.service.exception.AuthorizationFailedException; + +public interface CustomerService { + + CustomerEntity saveCustomer(CustomerEntity customerEntity); + CustomerAuthEntity login(String contactNumber, String password) throws AuthenticationFailedException; + CustomerEntity getCustomer(String access_token) throws AuthorizationFailedException; +} diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/CustomerServiceImpl.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/CustomerServiceImpl.java new file mode 100644 index 0000000..738518f --- /dev/null +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/CustomerServiceImpl.java @@ -0,0 +1,177 @@ +package com.upgrad.FoodOrderingApp.service.businness; + +import com.upgrad.FoodOrderingApp.service.dao.CustomerDao; +import com.upgrad.FoodOrderingApp.service.dao.CustomerDaoImpl; +import com.upgrad.FoodOrderingApp.service.entity.CustomerAuthEntity; +import com.upgrad.FoodOrderingApp.service.entity.CustomerEntity; +import com.upgrad.FoodOrderingApp.service.exception.AuthenticationFailedException; +import com.upgrad.FoodOrderingApp.service.exception.AuthorizationFailedException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.time.ZonedDateTime; +import java.util.Base64; +import java.util.UUID; + +@Service +public class CustomerServiceImpl implements CustomerService { + + + @Autowired + private CustomerDao customerDao; + + @Autowired + private PasswordCryptographyProvider passwordCryptographyProvider; + + @Override + @Transactional(propagation = Propagation.REQUIRED) + public CustomerEntity saveCustomer(CustomerEntity customerEntity) { + //handle the validations +//signup validations here + +// if(customerDao.getCustomer(customerEntity.getContactNumber() != null) { +// //throw exception +// } + + + //if validations are okay then save the customer in db; + + + + + String[] encryptPassoword = passwordCryptographyProvider.encrypt(customerEntity.getPassword()); + + customerEntity.setSalt(encryptPassoword[0]); + customerEntity.setPassword(encryptPassoword[1]); + + return customerDao.saveCustomer(customerEntity); + + } + + @Override + @Transactional(propagation = Propagation.REQUIRED) + public CustomerAuthEntity login(String contactNumber, String password) throws AuthenticationFailedException { + + CustomerEntity customerEntity = null; + // CustomerEntity customerEntity = customerDao.getCustomerByContactNumber(contactNumber); + + if (customerEntity == null) { + throw new AuthenticationFailedException("ATH-001", "This contact number has not been registered!"); + } + + final String encryptedPassword = PasswordCryptographyProvider.encrypt(password, customerEntity.getSalt()); + + if (encryptedPassword.equals(customerEntity.getPassword())) { + JwtTokenProvider jwtTokenProvider = new JwtTokenProvider(encryptedPassword); + CustomerAuthEntity customerAuthEntity = new CustomerAuthEntity(); + customerAuthEntity.setUuid(UUID.randomUUID().toString()); + customerAuthEntity.setCustomer(customerEntity); + ZonedDateTime now = ZonedDateTime.now(); + ZonedDateTime expiresAt = now.plusHours(8); + + customerAuthEntity.setLoginAt(ZonedDateTime.now()); + customerAuthEntity.setExpiresAt(expiresAt); + customerAuthEntity.setAccessToken(jwtTokenProvider.generateToken(customerEntity.getUuid(), now, expiresAt)); + + // return customerDao.createCustomerAuth(customerAuthEntity); + return null; + } else { + throw new AuthenticationFailedException("ATH-002", "Invalid Credentials"); + } + } + + public void authorization(String access_token) throws AuthorizationFailedException { + + CustomerAuthEntity customerAuthEntity = customerDao.getCustomerAuthByAccesstoken(access_token); + + if (customerAuthEntity == null) { + throw new AuthorizationFailedException("ATHR-001", "Customer is not Logged in."); + } + + if (customerAuthEntity.getLogoutAt() != null) { + throw new AuthorizationFailedException("ATHR-002", "Customer is logged out. Log in again to access this endpoint."); + } + + if (ZonedDateTime.now().isAfter(customerAuthEntity.getExpiresAt())) { + throw new AuthorizationFailedException("ATHR-003", "Your session is expired. Log in again to access this endpoint."); + } + } + + public CustomerAuthEntity verifyAuthenticate(final String cno, final String pswd)throws AuthenticationFailedException + { + CustomerDaoImpl obj= new CustomerDaoImpl(); + CustomerEntity centity = obj.getCustomerByCno(cno); + if(centity== null) + { +throw new AuthenticationFailedException("ATH-001","This contact number has not been registered!"); + } + + final String encPswd = passwordCryptographyProvider.encrypt(pswd,centity.getSalt()); + if(encPswd.equals(centity.getPassword())) + { + JwtTokenProvider jtp = new JwtTokenProvider(encPswd); + CustomerAuthEntity cat = new CustomerAuthEntity(); + cat.setCustomer(centity); + final ZonedDateTime now =ZonedDateTime.now(); + final ZonedDateTime expAt = now.plusHours(8); + cat.setAccessToken(jtp.generateToken(centity.getUuid(),now,expAt)); + cat.setLoginAt(now); + cat.setExpiresAt(expAt); + cat.setUuid(centity.getUuid()); + obj.createAuthToken(cat); + obj.updateCustomer(centity); + return cat; + } + else + { + throw new AuthenticationFailedException("ATH-002","Invalid Credentials"); + } + } + + public static boolean validAuthFormat(String auth) + { + String regexStr ="^[0-9]{10}$"; + byte[] dc= Base64.getDecoder().decode(auth.split("Basic")[1]); + String dt= new String(dc); + String[] decodedarr= dt.split(":"); + + String bas= auth.split("Basic")[1]; + if(contactNumberVerified(decodedarr[0]) && passwordVerified(decodedarr[1])) + return true; + else + return false; + } + + public static boolean contactNumberVerified(String cno) + { + String regexStr= "^[0-9]{10}$"; + if(cno.matches(regexStr)) + { + return true; + } + else + { + return false; + } + } + + public static boolean passwordVerified(String pswd) + { + if(pswd.length()<8 || !pswd.matches("(?=.*[0-9]).*")) + { + return false; + } + return true; + } + + + @Override + public CustomerEntity getCustomer(String access_token) throws AuthorizationFailedException { + + authorization(access_token); + CustomerAuthEntity customerAuthEntity = customerDao.getCustomerAuthByAccesstoken(access_token); + return customerAuthEntity.getCustomer(); + } +} diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/AddressDao.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/AddressDao.java new file mode 100644 index 0000000..06f39c4 --- /dev/null +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/AddressDao.java @@ -0,0 +1,23 @@ +package com.upgrad.FoodOrderingApp.service.dao; + +import com.upgrad.FoodOrderingApp.service.entity.AddressEntity; +import com.upgrad.FoodOrderingApp.service.entity.CustomerAddressEntity; +import com.upgrad.FoodOrderingApp.service.entity.CustomerEntity; +import com.upgrad.FoodOrderingApp.service.entity.StateEntity; + +import java.util.List; + +/* + * This AddressDao interface gives the list of all the dao methods that exist in the address dao implementation class. + * Service class will be calling the dao methods by this interface. + */ +public interface AddressDao { + + AddressEntity saveAddress(AddressEntity addressEntity); + AddressEntity getAddressByUUID(String addressId); + CustomerAddressEntity getCustomerByAddress(String addressId); + CustomerAddressEntity saveCustomerAddress(CustomerAddressEntity customerAddressEntity); + AddressEntity deleteAddress(AddressEntity addressEntity); + List getAllAddress(CustomerEntity customer); + StateEntity getStateByUUID(String uuid); +} diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/AddressDaoImpl.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/AddressDaoImpl.java new file mode 100644 index 0000000..1708c10 --- /dev/null +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/AddressDaoImpl.java @@ -0,0 +1,79 @@ +package com.upgrad.FoodOrderingApp.service.dao; + +import com.upgrad.FoodOrderingApp.service.entity.AddressEntity; +import com.upgrad.FoodOrderingApp.service.entity.CustomerAddressEntity; +import com.upgrad.FoodOrderingApp.service.entity.CustomerEntity; +import com.upgrad.FoodOrderingApp.service.entity.StateEntity; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; + +import javax.persistence.EntityManager; +import javax.persistence.NoResultException; +import javax.persistence.PersistenceContext; +import java.util.List; + +/** + * AddressDao class provides the database access for all the endpoints in address controller. + */ +@Repository +@Transactional +public class AddressDaoImpl implements AddressDao{ + + //When a container of the application(be it a Java EE container or any other custom container like Spring) manages the lifecycle of the Entity Manager, the Entity Manager is said to be Container Managed. The most common way of acquiring a Container Managed EntityManager is to use @PersistenceContext annotation on an EntityManager attribute. + @PersistenceContext + private EntityManager entityManager; + + @Override + public AddressEntity saveAddress(AddressEntity addressEntity) { + entityManager.persist(addressEntity); + return addressEntity; + } + + @Override + public AddressEntity getAddressByUUID(String addressId) { + try { + return entityManager.createNamedQuery("getAddressByUUID", AddressEntity.class).setParameter("uuid", addressId).getSingleResult(); + } catch (NoResultException nre) { + return null; + } + } + + @Override + public CustomerAddressEntity getCustomerByAddress(String addressId) { + try { + return entityManager.createNamedQuery("userByAddress", CustomerAddressEntity.class).setParameter("uuid", addressId).getSingleResult(); + } catch (NoResultException nre) { + return null; + } + } + + @Override + public CustomerAddressEntity saveCustomerAddress(CustomerAddressEntity customerAddressEntity) { + entityManager.persist(customerAddressEntity); + return customerAddressEntity; + } + + @Override + public AddressEntity deleteAddress(AddressEntity addressEntity) { + entityManager.remove(addressEntity); + return addressEntity; + } + + @Override + public List getAllAddress(CustomerEntity customer){ + try { + return entityManager.createNamedQuery("getAllAddress", AddressEntity.class).setParameter("customer", customer).getResultList(); + } catch (NoResultException nre) { + return null; + } + } + + @Override + public StateEntity getStateByUUID(String uuid) { + try { + return entityManager.createNamedQuery("getStateByUUID", StateEntity.class).setParameter("uuid",uuid).getSingleResult(); + } catch (NoResultException nre) { + return null; + } + } +} diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/CustomerDao.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/CustomerDao.java new file mode 100644 index 0000000..1b2e6a8 --- /dev/null +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/CustomerDao.java @@ -0,0 +1,19 @@ +package com.upgrad.FoodOrderingApp.service.dao; + +import com.upgrad.FoodOrderingApp.service.entity.CustomerAuthEntity; +import com.upgrad.FoodOrderingApp.service.entity.CustomerEntity; + +public interface CustomerDao { + + CustomerEntity saveCustomer(CustomerEntity customerEntity); + + + CustomerEntity getCustomer(String contactNumber); + + boolean getCustomer(boolean b); + + CustomerAuthEntity getCustomerAuthByAccesstoken(String access_token); + + + //boolean getCustomer(boolean b); +} diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/CustomerDaoImpl.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/CustomerDaoImpl.java new file mode 100644 index 0000000..6d255da --- /dev/null +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/CustomerDaoImpl.java @@ -0,0 +1,65 @@ +package com.upgrad.FoodOrderingApp.service.dao; + +import com.upgrad.FoodOrderingApp.service.entity.CustomerAuthEntity; +import com.upgrad.FoodOrderingApp.service.entity.CustomerEntity; +import org.springframework.stereotype.Repository; + +import javax.persistence.EntityManager; +import javax.persistence.NoResultException; +import javax.persistence.PersistenceContext; + +@Repository +public class CustomerDaoImpl implements CustomerDao { + + + @PersistenceContext + private EntityManager entityManager; + + @Override + public CustomerEntity saveCustomer(CustomerEntity customerEntity) { + entityManager.persist(customerEntity); + return customerEntity; + } + + @Override + public CustomerEntity getCustomer(String contactNumber) { + return null; + } + + @Override + public boolean getCustomer(boolean b) { + return false; + } + + @Override + public CustomerAuthEntity getCustomerAuthByAccesstoken(String access_token) { + return null; + } + + public CustomerEntity getCustomerByCno(final String cno) + { + try + { + return entityManager.createNamedQuery("customerByContactNumber",CustomerEntity.class).setParameter("contact_number",cno).getSingleResult(); + } + catch(NoResultException e) + { + return null; + } + } + + public CustomerAuthEntity createAuthToken(CustomerAuthEntity cat) + { + this.entityManager.persist(cat); + return cat; + } + + public void updateCustomer(CustomerEntity uct) + { + this.entityManager.merge(uct); + } + /* @Override + public boolean getCustomer(boolean b) { + return false; + }*/ +} diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/AddressEntity.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/AddressEntity.java new file mode 100644 index 0000000..57deca5 --- /dev/null +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/AddressEntity.java @@ -0,0 +1,112 @@ +package com.upgrad.FoodOrderingApp.service.entity; + +import javax.persistence.*; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * AddressEntity class contains all the attributes to be mapped to all the fields in address table in the database. + * All the annotations which are used to specify all the constraints to the columns in the database must be correctly implemented. + */ +@Entity +@Table(name = "address") +@NamedQueries({ + @NamedQuery(name = "getAllAddress", query = "select b from CustomerAddressEntity a inner join a.address b where " + + "a.customer = :customer order by b.id desc"), + @NamedQuery(name = "getAddressByUUID", query = "select b from CustomerAddressEntity a inner join a.address b where " + + "b.uuid = :uuid") +}) +public class AddressEntity implements Serializable { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Integer id; + + @Column(name = "UUID", length = 64, nullable = false) + private String uuid; + + @Column(name = "flat_buil_number", nullable = false) + private String flatBuilNo; + + @Column(nullable = false) + private String locality; + + @Column(nullable = false) + private String city; + + @Column(nullable = false) + private String pincode; + + @OneToOne + @NotNull + private StateEntity state; + + public AddressEntity(String uuid, String flatBuilNo, String locality, String city, String pincode, StateEntity state) { + this.uuid = uuid; + this.flatBuilNo = flatBuilNo; + this.locality = locality; + this.city = city; + this.pincode = pincode; + this.state = state; + } + + public AddressEntity() { + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getFlatBuilNo() { + return flatBuilNo; + } + + public void setFlatBuilNo(String flatBuilNo) { + this.flatBuilNo = flatBuilNo; + } + + public String getLocality() { + return locality; + } + + public void setLocality(String locality) { + this.locality = locality; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getPincode() { + return pincode; + } + + public void setPincode(String pincode) { + this.pincode = pincode; + } + + public StateEntity getState() { + return state; + } + + public void setState(StateEntity state) { + this.state = state; + } + +} diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/CustomerAddressEntity.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/CustomerAddressEntity.java new file mode 100644 index 0000000..723714d --- /dev/null +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/CustomerAddressEntity.java @@ -0,0 +1,63 @@ +package com.upgrad.FoodOrderingApp.service.entity; + +import org.hibernate.annotations.OnDelete; +import org.hibernate.annotations.OnDeleteAction; + +import javax.persistence.*; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * CustomerAddressEntity class contains all the attributes to be mapped to all the fields in customer_address table in the database. + * All the annotations which are used to specify all the constraints to the columns in the database must be correctly implemented. + */ +@Entity +@Table(name = "customer_address") +@NamedQuery(name = "userByAddress", query = "select a from CustomerAddressEntity a inner join a.address b where " + + "b.uuid = :uuid") +public class CustomerAddressEntity implements Serializable { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Integer id; + + @ManyToOne + @OnDelete(action = OnDeleteAction.CASCADE) + @JoinColumn(name = "customer_id") + @NotNull + private CustomerEntity customer; + + @OneToOne + @OnDelete(action = OnDeleteAction.CASCADE) + @JoinColumn(name = "address_id") + @NotNull + private AddressEntity address; + + public CustomerAddressEntity() { + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public CustomerEntity getCustomer() { + return customer; + } + + public void setCustomer(CustomerEntity customer) { + this.customer = customer; + } + + public AddressEntity getAddress() { + return address; + } + + public void setAddress(AddressEntity address) { + this.address = address; + } + +} diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/CustomerAuthEntity.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/CustomerAuthEntity.java new file mode 100644 index 0000000..c37e658 --- /dev/null +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/CustomerAuthEntity.java @@ -0,0 +1,111 @@ +package com.upgrad.FoodOrderingApp.service.entity; + +import javax.persistence.*; +import java.io.Serializable; +import java.time.ZonedDateTime; + +/** + * CustomerAuthEntity class contains all the attributes to be mapped to all the fields in customer_auth table in the database. + * All the annotations which are used to specify all the constraints to the columns in the database must be correctly implemented. + */ +@Entity +@Table(name = "customer_auth") +@NamedQueries({ + @NamedQuery(name = "customerByuuid", query = "select c from CustomerAuthEntity c where c.uuid = :uuid"), + @NamedQuery(name = "customerAuthByAccesstoken", query = "select c from CustomerAuthEntity c where c.accessToken = :accesstoken") +}) +public class CustomerAuthEntity implements Serializable { + + @Id + @Column(name = "id") + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + @Column(name = "UUID", length = 64, nullable = false) + private String uuid; + + @ManyToOne + @JoinColumn(name = "customer_id") + private CustomerEntity customer; + + @Column(name = "access_token",length = 500, nullable = false) + private String accessToken; + + @Column(name = "EXPIRES_AT", nullable = false) + private ZonedDateTime expiresAt; + + @Column(name = "login_at", nullable = false) + private ZonedDateTime loginAt; + + @Column(name = "logout_at") + private ZonedDateTime logoutAt; + + public CustomerAuthEntity() { + } + + public CustomerAuthEntity(String uuid, CustomerEntity customer, String accessToken,ZonedDateTime expiresAt, ZonedDateTime loginAt, ZonedDateTime + logoutAt) { + this.uuid = uuid; + this.customer = customer; + this.accessToken = accessToken; + this.expiresAt = expiresAt; + this.loginAt = loginAt; + this.logoutAt = logoutAt; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public CustomerEntity getCustomer() { + return customer; + } + + public void setCustomer(CustomerEntity customer) { + this.customer = customer; + } + + public String getAccessToken() { + return accessToken; + } + + public void setAccessToken(String accessToken) { + this.accessToken = accessToken; + } + + public ZonedDateTime getExpiresAt() { + return expiresAt; + } + + public void setExpiresAt(ZonedDateTime expiresAt) { + this.expiresAt = expiresAt; + } + + public ZonedDateTime getLoginAt() { + return loginAt; + } + + public void setLoginAt(ZonedDateTime loginAt) { + this.loginAt = loginAt; + } + + public ZonedDateTime getLogoutAt() { + return logoutAt; + } + + public void setLogoutAt(ZonedDateTime logoutAt) { + this.logoutAt = logoutAt; + } +} diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/CustomerEntity.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/CustomerEntity.java new file mode 100644 index 0000000..dba07cf --- /dev/null +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/CustomerEntity.java @@ -0,0 +1,97 @@ +package com.upgrad.FoodOrderingApp.service.entity; + +import javax.persistence.*; +import java.io.Serializable; + +@Entity @Table(name = "CUSTOMER") +//name query will come here +public class CustomerEntity implements Serializable { + + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; + + @Column(name = "firstname", nullable = false) private String firstName; + + @Column(name = "uuid", nullable = false) + private String uuid; + + @Column(name = "lastname", nullable = false) private String lastname; + + @Column(name = "email", nullable = false) private String emailAddress; + + @Column(name = "password", nullable = false) private String password; + + @Column(name = "contact_number", nullable = false) private String contactNumber; + + @Column(name = "salt", nullable = false) private String salt; + + public CustomerEntity() { + + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastname() { + return lastname; + } + + public void setLastname(String lastname) { + this.lastname = lastname; + } + + public String getEmailAddress() { + return emailAddress; + } + + public void setEmailAddress(String emailAddress) { + this.emailAddress = emailAddress; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getContactNumber() { + return contactNumber; + } + + public void setContactNumber(String contactNumber) { + this.contactNumber = contactNumber; + } + + public String getSalt() { + return salt; + } + + public void setSalt(String salt) { + this.salt = salt; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } +} + + + diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/StateEntity.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/StateEntity.java new file mode 100644 index 0000000..1d20d1c --- /dev/null +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/StateEntity.java @@ -0,0 +1,59 @@ +package com.upgrad.FoodOrderingApp.service.entity; + +import javax.persistence.*; +import java.io.Serializable; + +/** + * StateEntity class contains all the attributes to be mapped to all the fields in state table in the database. + * All the annotations which are used to specify all the constraints to the columns in the database must be correctly implemented. + */ +@Entity +@Table(name = "state") +@NamedQueries({ + @NamedQuery(name = "getStateByUUID", query = "select s from StateEntity s where s.uuid =:uuid"), + @NamedQuery(name = "getAllStates", query = "select s from StateEntity s") +}) +public class StateEntity implements Serializable { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Integer id; + + @Column(name = "UUID", length = 64, nullable = false) + private String uuid; + + @Column(name = "state_name", nullable = false) + private String stateName; + + public StateEntity() { + } + + public StateEntity(String uuid, String stateName) { + this.uuid = uuid; + this.stateName = stateName; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getStateName() { + return stateName; + } + + public void setStateName(String stateName) { + this.stateName = stateName; + } +} diff --git a/FoodOrderingApp-service/target/FoodOrderingApp-service-1.0-SNAPSHOT.jar b/FoodOrderingApp-service/target/FoodOrderingApp-service-1.0-SNAPSHOT.jar index 5ec73dc59c1841c89853659637b95e603cadc1bb..688fa38d610423aa93fccea48e4d078b4bb95d15 100644 GIT binary patch delta 17413 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 G{rVqvGcdpa delta 3425 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 !kPw;1l}wGuPb#_Ey{m^YcpoYURIOU|X^z pHcl1t%n=U1GZ>HbQG=_ciHU=kV8RIb1pva(Pm2xeAnNqDe*oWGN*w?I diff --git a/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/businness/AddressService.class b/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/businness/AddressService.class new file mode 100644 index 0000000000000000000000000000000000000000..c0d9ef470b48824a040e4cae35b8c5ce529527c1 GIT binary patch literal 1306 zcmbVM%We}f6g^JUOdq5aN_juFWrH{Df{+3vQbeFgqke!pV-2n*6tQ#u4zj*9wx%e}Qxzk&%;5MAq0>yFrob!ieg zRyiGW5VVeKd%W?QF$`AF^!2`-Z#6yA&TaRd&;c>P3q)qkZN?S_W4&r_gJ3(X^LOh?hh2yMq zi(x*Uvr2lUT(EgwPg+)f%gzhiFbnZ=S$BkeWaNaN=awF?E5#VD?o>=^l*GQ_7}=tT zo2DhXG%V9$xSh7_g6@L{@8f3HL45f#O=lkyc6AzF8k&q637}nhXQn z+cFP|;m!rH#&XT*wHa+cG|fFEo*Bt=Pd9kk-^ftno17^7*)+T%n!?IiB+rFIhQ48sK>{ot=w z_x4gW^?fw`gdcIe$jySDk*XHXlMMeu7WDgBkjksNIYWwJu(q|eJX!1@PilMW6AfZF zh&_hOs(@<0`JrL>u9HG~N&6g;XpTVnrnakCtkX)LhgO}B8_|k1ih9~`q)LpOUn&g! z8KYowS+S{SQAV`UX@%ECYSdd;S?U1Fchg5&Rs_j^Dmh7{?lno%PFju&<3p3XjzaYc zAe6Bxc1|P>)vvGkBpSNxjEWmWv}r9nROrHz)w0lim6(PrcqNE^4F`A-#6t~_@R^3s z@qn68JAtkB6g_j&+v|;nA()BpOwZ2FF^p|mk)$DtPGpUnk*tV_Qdw4&{Vz0J#%K^< zYIqZ0X_&`N4O949!!3NMfrEm((gv6RI(?{{oYd%6_KCLPf9wa(!kbGSyg%}bzjg`R+_4I0Pj(%MVoxIa?a(%V&f(`jTh_DsG2`mQ^yD#qw6OOkkn1mj~My`Jr75EM}jZV_t)ev z=%4xxp#TmhZyY0hF!h|&x?EG^bXf*Ljv_*zcc^yX#T?#qO-DR<-!vJb71vxk^LU%q z252paL|`;b8cJe>_C87d0a^-L1lRci`r$e~QGp3ek}!oEgsmcwA{6CB*e9t4pvX1G zVWxphxK1XFY0MB5sZtncNkdWSrEv}))JROzlui#_>gjKTXK{s=1eBU@ap0`QTdu`% zZ&`yy23Ae^L*CTxS$gnmDqZ@^ds69DqY1oHhX@ zx`1vX&3NYd<$HerczpwKjQs#R0Xl@Xl@mV8t-oPF?JtMYYzOmM4dcuM#$|*xl>!RvMYGV`B;Hs;(a5<6_ zDaJC5#K0BqPJVY5vD3}nefc+pX75RH=3<@N0K0@WrBf%ByUvqg!D=Ow);?+z5?T?v ziU#3&j=x3RluiQd`JALuZ0()X59|>%2Rb*3`|+3wo$BhrET5x-4&n3PhI z3bWMkiF`A@8ID*v!o?pHxq>DNnCzd1k_E%Q^j^a+q=fT-i)jUOTJzTA!<-av-e*!?Y1lj-q literal 0 HcmV?d00001 diff --git a/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/businness/CustomerServiceImpl.class b/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/businness/CustomerServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..726cdaa463001502ad58ae683d93e34cc33a5b45 GIT binary patch literal 6614 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 F{vWhu8OQ(t literal 0 HcmV?d00001 diff --git a/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/businness/JwtTokenProvider.class b/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/businness/JwtTokenProvider.class index fb93475325243887ad87ee0ba4e968fab925db13..0a585e7530213d4410a62f2cbf033fc52d2f2561 100644 GIT binary patch delta 441 zcmW-d+fGwK6o$XqZ5j4tgkF$9B%$0HMcJjunNmSe4uw+6Nl;*`Pzt3SEO-tNvEwDa z1L*|`7d`+lz@=|uT)P+RTmPC_^H1{sYWdxAdH3)35Ad9y2F;*hh+&r|Ml_?Ew96P7 z%?m?}am|FwOC}9dyfV1FHcT_4nQdgwkY(PmKrX~$IOa7=VK0PO4zUtqRbiKNb5jf3 zGllERLFI~pY|4kV8JLqt) zHas56goKf#2dA!5q9U?2Mz2I3rIT*@M8)bB48@f=875C4dAm5)&a&ARyroLdb;x@g!U}6l<0# zms-Apm7NRAwNK(xSkB4LMSuPOGd(?3-Cv`hqqo2R{`d)ubEA+BCB~;A#5U6@}fu-FUe~TaQ&)7NkMZ&sr@aGUo2}XR3$adDRs>m=b8(u|9z418s&OP)8LcF zqp4~6xa6u63nndb-MN2oXZ409QG_J;h#@n(kYJDqf?=Mt2kkGp5gr={DMopU)m4sB s0aF#@8Dj()F#fqwp>B(Z0Y=Q_s0qh}#S8PuGFv$|S(#=DPAFpk1IAECoB#j- diff --git a/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/dao/AddressDao.class b/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/dao/AddressDao.class new file mode 100644 index 0000000000000000000000000000000000000000..b7422e3ab3b7338f91955c6490aebfcff325edef GIT binary patch literal 1226 zcmb_c%T5A85UfTJP!S*a_5<|d#>AV(1XL0uL=(aXj60Kc$-hLE z%K#BQD0tXI_e@vSban6h$Lkw_GaP2IpTz-TITAfpmQt%IBABC^8@8Re>uDjKY8c9U zEtU2=Ub)+KBBgu2s~puazUe!*>L!WKk7uqVtksoy3gv^)qOFY5tfU}@nuh3n#Z$%- zR{G86?KPo(RBMTza01csoQ4^woJ&RCQr=2JiRrH5$b@aBD}75$XwFGFg0z6Pb%f1< z3sZ-L=fAiyRXu|%KO+#fT-%5*s@Wo`0(NWMoWj7OAQ;EBS>%s(C)UQs51g7GnR7yJ zB!iG|_+CetSS!NIKeAlRJj0hPaFyTRFv6(OfZokHEeY6oM$&QY^JFeH!dSbi>IeMz zqHXrI2u}tLBb@$Xf29aV%gcqlTaz`qe{3n&ED{JQ{!swgG+_a0jx!u(2#WxxvdB$R u`6RW3<>}N43X{}oa;x|qYYpp6X5lxOWs|=YN=&nb?FqmRrwO~s;oc{hA$~#t literal 0 HcmV?d00001 diff --git a/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/dao/AddressDaoImpl.class b/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/dao/AddressDaoImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..02a8e19f2b89ec3caaf1a1018c4c0f4832edc4e2 GIT binary patch literal 3463 zcmb_eYf~Fl7=BIyY=BTOV6}=+q*N{~Yb%H)Kn($uk^trArCL2C$8_6dH?w;d$@tY7 z{|?SLdl2a|2`g+a#V zGC8ZHyXAt-^ZJ@)<+tp-unn`2DwlOf*hdDj&vQ#p<@2_1oE2`Zm&!%5-tF)s5zI2k z@m7F*PgSverz9t?e3E?6eOf*g!=r0p^<{;8Vdb~E%}YX(!x{PtLIzh{uI%rxuP|iC zJ$dvZHw*f%RIa+#4Wgz^5{)&{eAC(yj$4$g$2n0}u|ZDn4DP$0SF)-&t0O`V*_Ax^ zD$C2B%oM~719XYB>qx64?BzKQ636biBGRT$>4z&_Ng zbJr-CT)HX@fB7FNE?k0Cof^p{y4?+O9)+?L)x6udX1ID_;icPL*Ps;Y+O=FeC)NyA zCi?>xL5Z7I9%q=!Sav~o$|})+P?h0F%YLO(S+|8HD`lbYh_dAv(y}W=d%o#zX>-%z zIhDgY4@p^;BPKqtrK=RK2+`XA27EO^ToVQ&-p(hIH-Lppn#6^mLIs z4t17B<9if!J_rTe;6>{UaYx9op)ssnY_m%Ezl`>(6@*C##=PTXrvUO=ODf5G%_07 zCw~X~m3~C<9zE4&5X=xgV)2Xj4p3& z5M6|*aBlj01001riaUfiMr-YqSTxXA8$O_I3j8NT=?@rD;EA?G`zbo2NN8jy7R4z# z8U8~1NtT^>{FIF@I-uC!@D7gB%pI~e=2^c@bHfBZjtP&)NXTOZlb9lmdvucS{anNS zDyK=BVwff`HRIHsh&SUDzkt&{;&PuXPhXeQhjp1_mmfHzTi79W!oO5tM~mBK@w!Z)f4_f{3|V+dWTBDP-M6wNFXPC9hu zV2!*(p}a$w!zX9*KC6*;j*LH|{|M%3LlO&3Wqu=(XeM(al0?MDLTOR;6PGa1-!XH)$Ms{q>Fuf^7+9A_v6JCvl58y)?r&z2@ zqi&kqlbn0be7A4!+gAWrIIH8Nj#EM_ks05niPaGsLe?889f@=u80m|l*8ar!Y{EDg ztk)u8lZA=}$2PPZvA5mt#_Rs?t%U9a+lBTYrI8U^HVL7lidvuh3C)1*K9ex+jg~T# zVkP51Ol{urZxz}~$5tvkPNR9w!t2fYGXl*C=iibCsa@P`21;?_sJ(DZc>1R*`RW3u zyNujLJQo>_sZNdJVYp&PYmebh>WiEL;qnJ}^QHbensd56CBeyj$;#H;dr@(}2;g~y m19)z(x~WR2IgL=qVJRIIQlpfbJE?_sDRrEmaO}PnbUy$J&%jLp literal 0 HcmV?d00001 diff --git a/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/dao/CustomerDaoImpl.class b/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/dao/CustomerDaoImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..e3e294e061d576f0c13d675d8167137812251cd9 GIT binary patch literal 2755 zcmb_eZBrXn6n^do2qnvlk+!x{DVAb@wri^(HWUp3w3-AO5NGWniEesKKkk8(VBcatn{6;mgZd$V`%ea>^vdCs}{>+j$H0Pr!s8Nx6=y#gJN zGst6k5Kq!rQ9nN$#OE0lu&Rb)8f$8CJ&lbtzDVOshGAh#OSa0~=5^sQOqE{pLw;nq z!t*U(3fmOMdU8vi;YKx}m8RIWd~2^E3byS?E-lCQ8D`EoztzPmI<^!?l0XKQE!&bS z45{4gE<<0@sR@SBl4XlZ(A*Q=4kv7eY{@ZsW0!lDdX5+S z?fodjh#6Chz!)CC3EEg$$bF}_#Xa5>lETiAsSDZlvyuz*V>Gy3H@2mU)tm7jHYuar zlu^!9x|DuS;8SvQ&u5=Aus!7xZ=ts!%7dbIsr2hxHa;uE2SsBIMyy1s`yl360f0cC-6+MVX0al zZ==U``ao%kVZP*eb;Ea+TEADy{=xAM3~ElEaAeCBMpd|uZ%M~%<#oJ`aUG)=OXI1I zukba)^>&R>rcbJM=@R`zgx&8{(d#Iotg1J{dtrwyD~*bdO>F6ShAP9Iv#s=um~?Do zhhgy&M9yhs3}fAL+uVC8R7fBFcPxgVMP`ORK?!D^eLUvjn!`ka@wh8~6(NSs<+oZUL zi0Yr@nTwc4-7Usp=%2vOjOPBi-@tyM9~!RFs5XOuu7_i|0q@`jJu%$GyR=IkUZYu4JLZ0cHh+wihWS_Y z9AONF@5V7idlk;LXm5<8&?j(<@ZO_${gefoNGP~X+Z6aBJt=UFbs-~KHxqDL2Tmi; z-|xar#c+2{!=-*!pb0N0FMylI-7eg82seWdPQ#sHH+=zIF3Bzz!p(M^{Shhp08=WG z*}iQ5F$Pk|rYWd{DIDVp!=LDXRVHgH8Mi2CLv%o;Y9u^3Pb>E+dPZpdHmyw((>cu3 zNU)tKP2pb1<36oYG`~yZK|2BWLa7+|Fm~}W*fosG=jh}SHz6AUO;S0o% literal 0 HcmV?d00001 diff --git a/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/entity/AddressEntity.class b/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/entity/AddressEntity.class new file mode 100644 index 0000000000000000000000000000000000000000..fef4f1c433f80dd4f778e55521fbc83add06f693 GIT binary patch literal 3407 zcmb`IZC4vr5XWcp2q9Qn9yGPBD=LMwu=YVJv>@TBjY5DDqO@wyCVL6X+3d!BK=E_< zA$+OlnBzIV@B{dvJpN~Q2}#`aD5o!S@6MgMbAK~;?&Pn(|M-)L9@5tt%Fx~*4bpQS z_IW7taKJ-_hc9{fDouxJdXc7=62){)qS37r^;A_1)vPN;(-n1LKb9!>+%sLhAu76~ zR}E1xP0LkX-7+1CCj1>gC{1BIy5kD7CX}LvO_LFdr@|Dr>I$u*8lHgBfa9`UKYOh` zPAZ=@ef#42MyXsZA4-()JSM)@LA>wUx><+Y>k((KS%%jzp-h-+Ltr{MD6UJCGK5)o zkK@SO3V2MPVSDg55J^pSNuI-yppa5yp-w z$`%Hwr$Y592sHmblp5{?8P!eKQA(CuLNqYE*?oVU%dR_2J<(0wU6$yl>3?VQjjdcR z3o{j@cFj-dl`Y*AB|r0Jz9YVTPJczUb(X`$gnO)`Fcv?$CkFM z+9(wll`T89Z!Fc|Oj z5$f5+FkEbQl;tpXbjm}}`+4!}aR}NAiH~0k>J;n2R|adl=S7>ra$6XH#;-_Z6SSAR zKz`(HH;dDk^umE>_ASq@iA~+V`mQ^hcm88Yhe`S%OIaF5Km6}?)Rhqga`ET1Q$0Zj zB^vXWbW7RC?Vu0-$c+Fe4&o0`q9ICCj8Db)TWIK4Azi^d0{N<-Ycz@lActz6Cn!#D zJM<3aigcaceL**1f`CF3-Z_C4nA|$oBGOPh%pc)5 zh2H>4qk+T-w`m&s8La<|In6ft-$}~fX;CbHw?*;%Y>N{4T%twEd@k9dR6dt#QTkU{ z#wd?*5*~@}Qi5iYtT~*iAR8Z3j_%>=?&I7CbO#pC0`IV#g~TjDzW9sN67$zM1^kye z#WxP0{KY{g{V$Fxg)@k9DQqWfBpgC8CYUh{|JkB|Fmg~2FiV(|9MlCf=Y;4J_@DRL zvVl>^CV~E5=ztvs4t}G7U$7|%I^{1eL~g#1Q-hQ)W9EZWoX&yXQEnkmuCbO5GGAEw|HhfG|Y5eVBp<5;Dm?({dzJs+UQPWcnp)z;x7yDd=4x6F**wR;YlH zA8u!jr+b<7NTyXmRCRuw$^2AIq~Ox$23zro<$O@bpv>;Aam_tJUvrcKCCVT8v0 bjEea9{3XR!=nI%)X^XZUDz(KO7I*&vd~u_W literal 0 HcmV?d00001 diff --git a/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/entity/CustomerAddressEntity.class b/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/entity/CustomerAddressEntity.class new file mode 100644 index 0000000000000000000000000000000000000000..8d00a95ffbeb96aba7a09eece7aacc186e385e8d GIT binary patch literal 2291 zcmbuBTXWM!6vxjxz68gVKp<^s62zs{2{fWDw2(Lf;{?WxaZ2OKOrMywv~@NkuUu)B z*8NoNOgo+7fe+9R)#-m_*})#cV0iGZR_C(6bJ>;u{qNOlBDzbvMat9m8OqU)86KM9 zQGu!jdR(9yql|PJEi{h#3Aa72I(A)Y(GkHGqop4srDazf%22jFQB}&jd1jpZLDJAGjirs#ERt>`(+J5>Nsm=)PS`toGt15LQw+pL5l3 z`TNRjd86S69s5YOMWBFc^V8_HH*55_4v(M);m5aHE)7vY_2NF|z47ujxc z^ctfJ4d3D3ArGWkCoi-5NP@LG1?#Zzlgzn}&~>EpQh6<=pKShIIFK)vQ^baR{<+Xc zzWW0YP#}$CfFi-?a6d*Bc>ah6oddwBv+eSS`!cjepd~3_v^5pkWaf$h8@Z}X!!_4MxRfG{TLwp9-bs%BOFr!Nv_scK72Ow+2>P%& z8{ztR+#f}m`^5+ty$Esc9c^*z=fLk;sk{(Mh5ODr#xb_|MzX8bwthVlfw0;eQ6yb! z+uAg9i7dKWqFFjqqIo)BqGeiP^lKE2TQ+s9yLbTNJZa{-(_2_P4R&SFwl1 zfmX6T^pmvSf^808FiebYLwOL?n@ls4Om|Y5Hpot6nwey}3#NN-VKTL3lrYW5On2z( z6sGJX)BRMYZ&00-JY^@DDqz}v3zO-R5z{i5GWZ8$#(Qzot)NH0!}@zDq0{cu1Bmdj JNn0UR{s+S|HIM)R literal 0 HcmV?d00001 diff --git a/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/entity/CustomerAuthEntity.class b/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/entity/CustomerAuthEntity.class new file mode 100644 index 0000000000000000000000000000000000000000..b5e6e75e77f778bd6910aea05e609fae85e55d84 GIT binary patch literal 3495 zcmbtWS#uLd5blw6*s?GVXT&K;;uvu(M}S~#2Vo14;{&kla0HySG{{S&U1tx1@{972 zRD~*3smeosKz>i2Q~7#!S2FS_RgjmN>6t#h{-&pQ|N7^TKZ)oIs%0rlk49*O9`o>o zho?Mz%fmAsp7XGgq3<$eW@uAT!m0}r3xe_w1KYP+a^3Q*&895bw&R<=<=CE}LyIrX zSLSPDTe_a*`O>aQqf);q=!oWE&S?fM8;42TY)L_^>wouNazlGKFf{v zf9eBGwY{zMEA!>$YNh%ZVS<2j*r&o6P19}|tG;X54Ti9`R+$%+Zc4l1Zw-N^TZm-` z&8CSQStiJ}!1JA!bOlW<)|{3RY&Tr9ZrpL4`ifhZ?5niBZFtgsWg&A3p8U2k7g?2+ zh+xMxi7uITyXvgijQND-e8I8oE@7iFkPS{~)U4H{=T)8Wr7b8IN*g|l051L(G$LPb zTdwp4HN8Q6fWXw6f_Mt|D%dW5w7QKX7a;*F|;v2 zEA6b~F}QzcBL|Igua1w#Bxo)KuK?CNl#fM(XmmMv7OofLYR|&7D==daqLSy7ds24Q z3EY~zV{v64j;ZLC~E~ua`{axK<)K2|DfYu{D zn515Do78uZu4)^KW3lhs?XWARet;7+)$5*Y%9>xO6<)YbtFSvOocy>YU0JAIV9UZx zVJh^Hk6khYx7*>}sV*d_{2pGz{-wGZI}b(WCr9V#e2xy$;T#>O6FEA~tIud6N0U4h zdC1Wol=l1Ab?@HrG}TL2Ux<~>m!Lz?0kvg0#wxfro7PXV5?zKQuzLj>?BHk28O#&xpm?@JiQ>5q4HeIK zC|S%WJMf%ObtqlTr#qDCML12vurd(gBFMi4x-Zjyc+KO#<|JK3Ib2hb?}gr@$cPis z&MRh@aZV^I`RhKxWdxtRVs=t$#Z08(mnffxIl+)%LQp2C5h{+8x{8n?D+b(#th}Y+ zUvU_+l2)5Hw2WM*FQLVZ%%Tt&OS*WnL&Lp{Lr!OaX;yhSq_C&EnWdw`W1K0pK1_mc z&{P*wd{b{J@f!|zVk&7d-K6O*rbHM`-B3TKGBDj4fGI5U2orNBXa)(yJoPXQ^<%1N zF?~h1beM+vF)abp@&HWXtBNr3T?#5`c}n(UdZ5L0ThCLnAJZBztq;HyKIRA$*Os6; zn%D4@>c{k0i>ZtoiR)>{-KF|5Jp-oa12Bc%Bf`YBF6gcnQ@S6Msl{|pk15@cNdnW0 z0hq#`6=CAHC#a&ulO~Lga!iC374fMKnfv{Iu00|ORjZIY&FN0?{A zJQt=e%nM;&3eyl~H%EIp+RxE}K`F;JXr}STdTW`k<#o)u$61F3j|`fB6?xq0vLh#S zj$O9pc|Nze<9ne&WjW&)v&Vwa2|4rH%&gm(bVVaPV;&1E&g>)0jTnORAs6G$$$R6m zQ|qKBJ5A0YT#+xNKD=6g~1m<0x% zkHiL$cLqh79a{RdECsB5CTi~N262#Be;SK5 zPBTA^NrO=lT5YHlMd-sGG5_GSE@J**RDxC=E>sBt30DqLO5Fw4R$P}!jM54{>F?BEC3KYqj7xUI9&<@jb3_sepfU&Up_mg1{H*(pycL56-2 zFXsYACE4QsGMb@TIKUjsCA1&I^GQhabn$!o6n!v{stbJ;M;%oc`zmrUs(#j2k(^O= zsjnhyqw1Buigb>u%Sycf1r>q4j-%d1YoN`n{zb;`=%na#*eSGx1Ex`}3VH<Su|WmL=1smT5A{^sScZiJoaP$@Bx5ejLN3{@|Et0Zb`+D(#m1 R)r%N^jd2yf1HSI<{{g*4sAT{E literal 0 HcmV?d00001 diff --git a/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/entity/StateEntity.class b/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/entity/StateEntity.class new file mode 100644 index 0000000000000000000000000000000000000000..96866a782245a3cc2ce77c1da60fbd901f30bad2 GIT binary patch literal 1908 zcmbVMSyR(c6h1fIXszs^h+@SBT7|gb0*WAu(-{O6=nVScgy!0YNt2odt-nfVbe!?Q zAK;I2{7w>R#lV9v_uO;ucfR|bCHeLH$4?@f;BuCCg)zTxPSGgxdkRaZLu25Ko$d9S5zvW}Htj}#^*|IPZ}6BgF{TzYj|f1x?Z z!9$M(rE1bEqjE!&#g3SEw^MF-Kiv7q!8LPcK(HMYfABAg!}4dq5CVoeIih=}$b%wC zDJ*Rs0Ud5`)ApUJTs63Yy&b7f^K{0y_pml2F})A!j=H5>E~B7A42G5HFMTvXx(wat z5fwCc60`+i_dzO8Tj4~d-h%`KjTV}+>J{9=JI8JmI?}+=hq`oR!JXzIEWm!}b4x+p7X=D!9CHEw_P8@qcDEod+}GHi7d712!N6VESQ z!cQZO?;=A9Qus~mbNEvF;GKfa!#^#ln|g2nanbbZM4PG~Bm|Nqg0l$kMkrGj!mx-E1W{tVWBm$U1}e+>5)Sy)D|8hr zzpBCt*i`8&B|l>m%H|ppKyi|<(L^M99+uNfv)p7`X_#~oX_f+p;ShDGFdcPGm<2!f}W+ajgX1h}D!hs%a)x(^R~sj*f

Q=Ivk#@4g{rfo1^3(LK8F(t|_yA-l7G E0J+nG2mk;8 literal 0 HcmV?d00001 diff --git a/FoodOrderingApp-service/target/maven-archiver/pom.properties b/FoodOrderingApp-service/target/maven-archiver/pom.properties index a6f5d8f..5f7326f 100644 --- a/FoodOrderingApp-service/target/maven-archiver/pom.properties +++ b/FoodOrderingApp-service/target/maven-archiver/pom.properties @@ -1,4 +1,4 @@ #Created by Apache Maven 3.6.3 +version=1.0-SNAPSHOT groupId=FoodOrderingApp-Backend artifactId=FoodOrderingApp-service -version=1.0-SNAPSHOT diff --git a/FoodOrderingApp-service/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/FoodOrderingApp-service/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst index eb7c2a0..8e07cdf 100644 --- a/FoodOrderingApp-service/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ b/FoodOrderingApp-service/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -1,17 +1,30 @@ -com\upgrad\FoodOrderingApp\service\exception\CustomerNotFoundException.class +com\upgrad\FoodOrderingApp\service\businness\CustomerServiceImpl.class com\upgrad\FoodOrderingApp\service\exception\ItemNotFoundException.class com\upgrad\FoodOrderingApp\service\exception\AuthenticationFailedException.class -com\upgrad\FoodOrderingApp\service\businness\JwtTokenProvider.class +com\upgrad\FoodOrderingApp\service\entity\AddressEntity.class +com\upgrad\FoodOrderingApp\service\dao\CustomerDao.class com\upgrad\FoodOrderingApp\service\businness\PasswordCryptographyProvider.class +com\upgrad\FoodOrderingApp\service\dao\AddressDao.class +com\upgrad\FoodOrderingApp\service\dao\AddressDaoImpl.class +com\upgrad\FoodOrderingApp\service\entity\CustomerEntity.class +com\upgrad\FoodOrderingApp\service\exception\UpdateCustomerException.class +com\upgrad\FoodOrderingApp\service\exception\SignUpRestrictedException.class +com\upgrad\FoodOrderingApp\service\exception\SaveAddressException.class +com\upgrad\FoodOrderingApp\service\dao\CustomerDaoImpl.class +com\upgrad\FoodOrderingApp\service\exception\AuthorizationFailedException.class +com\upgrad\FoodOrderingApp\service\businness\AddressServiceImpl.class +com\upgrad\FoodOrderingApp\service\exception\CategoryNotFoundException.class +com\upgrad\FoodOrderingApp\service\entity\StateEntity.class +com\upgrad\FoodOrderingApp\service\exception\CustomerNotFoundException.class +com\upgrad\FoodOrderingApp\service\businness\AddressService.class +com\upgrad\FoodOrderingApp\service\entity\CustomerAddressEntity.class +com\upgrad\FoodOrderingApp\service\businness\JwtTokenProvider.class com\upgrad\FoodOrderingApp\service\common\ErrorCode.class com\upgrad\FoodOrderingApp\service\ServiceConfiguration.class com\upgrad\FoodOrderingApp\service\common\GenericErrorCode.class com\upgrad\FoodOrderingApp\service\exception\RestaurantNotFoundException.class com\upgrad\FoodOrderingApp\service\common\ItemType.class -com\upgrad\FoodOrderingApp\service\exception\UpdateCustomerException.class -com\upgrad\FoodOrderingApp\service\exception\SignUpRestrictedException.class -com\upgrad\FoodOrderingApp\service\exception\SaveAddressException.class -com\upgrad\FoodOrderingApp\service\exception\AuthorizationFailedException.class +com\upgrad\FoodOrderingApp\service\businness\CustomerService.class com\upgrad\FoodOrderingApp\service\exception\AddressNotFoundException.class com\upgrad\FoodOrderingApp\service\common\UnexpectedException.class -com\upgrad\FoodOrderingApp\service\exception\CategoryNotFoundException.class +com\upgrad\FoodOrderingApp\service\entity\CustomerAuthEntity.class diff --git a/FoodOrderingApp-service/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/FoodOrderingApp-service/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst index 011df30..18f9d41 100644 --- a/FoodOrderingApp-service/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ b/FoodOrderingApp-service/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -1,17 +1,30 @@ -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-service\src\main\java\com\upgrad\FoodOrderingApp\service\businness\JwtTokenProvider.java -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-service\src\main\java\com\upgrad\FoodOrderingApp\service\ServiceConfiguration.java -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-service\src\main\java\com\upgrad\FoodOrderingApp\service\exception\SaveAddressException.java -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-service\src\main\java\com\upgrad\FoodOrderingApp\service\common\ErrorCode.java -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-service\src\main\java\com\upgrad\FoodOrderingApp\service\common\GenericErrorCode.java -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-service\src\main\java\com\upgrad\FoodOrderingApp\service\exception\AuthorizationFailedException.java -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-service\src\main\java\com\upgrad\FoodOrderingApp\service\exception\AuthenticationFailedException.java -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-service\src\main\java\com\upgrad\FoodOrderingApp\service\exception\SignUpRestrictedException.java -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-service\src\main\java\com\upgrad\FoodOrderingApp\service\common\ItemType.java -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-service\src\main\java\com\upgrad\FoodOrderingApp\service\exception\CustomerNotFoundException.java -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-service\src\main\java\com\upgrad\FoodOrderingApp\service\exception\ItemNotFoundException.java -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-service\src\main\java\com\upgrad\FoodOrderingApp\service\exception\CategoryNotFoundException.java -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-service\src\main\java\com\upgrad\FoodOrderingApp\service\businness\PasswordCryptographyProvider.java -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-service\src\main\java\com\upgrad\FoodOrderingApp\service\exception\UpdateCustomerException.java -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-service\src\main\java\com\upgrad\FoodOrderingApp\service\exception\RestaurantNotFoundException.java -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-service\src\main\java\com\upgrad\FoodOrderingApp\service\common\UnexpectedException.java -G:\SEM 6\Backend\FoodOrderingAppBackend -College-STUB\FoodOrderingApp-service\src\main\java\com\upgrad\FoodOrderingApp\service\exception\AddressNotFoundException.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-service\src\main\java\com\upgrad\FoodOrderingApp\service\entity\CustomerEntity.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-service\src\main\java\com\upgrad\FoodOrderingApp\service\exception\UpdateCustomerException.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-service\src\main\java\com\upgrad\FoodOrderingApp\service\businness\CustomerServiceImpl.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-service\src\main\java\com\upgrad\FoodOrderingApp\service\exception\AuthenticationFailedException.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-service\src\main\java\com\upgrad\FoodOrderingApp\service\common\UnexpectedException.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-service\src\main\java\com\upgrad\FoodOrderingApp\service\businness\JwtTokenProvider.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-service\src\main\java\com\upgrad\FoodOrderingApp\service\ServiceConfiguration.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-service\src\main\java\com\upgrad\FoodOrderingApp\service\dao\AddressDaoImpl.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-service\src\main\java\com\upgrad\FoodOrderingApp\service\common\GenericErrorCode.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-service\src\main\java\com\upgrad\FoodOrderingApp\service\exception\CustomerNotFoundException.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-service\src\main\java\com\upgrad\FoodOrderingApp\service\exception\SignUpRestrictedException.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-service\src\main\java\com\upgrad\FoodOrderingApp\service\common\ErrorCode.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-service\src\main\java\com\upgrad\FoodOrderingApp\service\entity\CustomerAddressEntity.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-service\src\main\java\com\upgrad\FoodOrderingApp\service\entity\CustomerAuthEntity.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-service\src\main\java\com\upgrad\FoodOrderingApp\service\entity\AddressEntity.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-service\src\main\java\com\upgrad\FoodOrderingApp\service\exception\SaveAddressException.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-service\src\main\java\com\upgrad\FoodOrderingApp\service\entity\StateEntity.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-service\src\main\java\com\upgrad\FoodOrderingApp\service\businness\CustomerService.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-service\src\main\java\com\upgrad\FoodOrderingApp\service\businness\PasswordCryptographyProvider.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-service\src\main\java\com\upgrad\FoodOrderingApp\service\exception\ItemNotFoundException.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-service\src\main\java\com\upgrad\FoodOrderingApp\service\businness\AddressServiceImpl.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-service\src\main\java\com\upgrad\FoodOrderingApp\service\exception\CategoryNotFoundException.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-service\src\main\java\com\upgrad\FoodOrderingApp\service\businness\AddressService.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-service\src\main\java\com\upgrad\FoodOrderingApp\service\exception\AuthorizationFailedException.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-service\src\main\java\com\upgrad\FoodOrderingApp\service\dao\CustomerDao.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-service\src\main\java\com\upgrad\FoodOrderingApp\service\exception\AddressNotFoundException.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-service\src\main\java\com\upgrad\FoodOrderingApp\service\exception\RestaurantNotFoundException.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-service\src\main\java\com\upgrad\FoodOrderingApp\service\dao\CustomerDaoImpl.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-service\src\main\java\com\upgrad\FoodOrderingApp\service\common\ItemType.java +K:\ZomatoApp\FoodOrderApp\FoodOrderingApp-service\src\main\java\com\upgrad\FoodOrderingApp\service\dao\AddressDao.java From 22a119562ee250001ad84d5b518cd4a6f916110d Mon Sep 17 00:00:00 2001 From: Abhishekdawer Date: Mon, 27 Apr 2020 21:26:02 +0530 Subject: [PATCH 2/3] Complete customer controller with comments --- .../api/controller/AddressController.java | 67 +++- .../api/controller/CustomerController.java | 161 ++++---- .../api/controller/AddressController.class | Bin 6698 -> 0 bytes .../api/controller/CustomerController.class | Bin 6280 -> 8064 bytes .../service/businness/AddressServiceImpl.java | 31 ++ .../service/businness/CustomerService.java | 15 +- .../businness/CustomerServiceImpl.java | 355 +++++++++++++----- .../service/dao/AddressDaoImpl.java | 1 + .../service/dao/CustomerDao.java | 14 +- .../service/dao/CustomerDaoImpl.java | 82 ++-- .../service/entity/CustomerAddressEntity.java | 11 +- .../service/entity/CustomerAuthEntity.java | 11 +- .../service/entity/CustomerEntity.java | 79 ++-- .../service/entity/StateEntity.java | 4 - .../businness/AddressServiceImpl.class | Bin 3442 -> 0 bytes .../service/businness/CustomerService.class | Bin 829 -> 1448 bytes .../businness/CustomerServiceImpl.class | Bin 6614 -> 9897 bytes .../service/dao/AddressDaoImpl.class | Bin 3463 -> 3463 bytes .../service/dao/CustomerDao.class | Bin 643 -> 625 bytes .../service/dao/CustomerDaoImpl.class | Bin 2755 -> 3260 bytes .../entity/CustomerAddressEntity.class | Bin 2291 -> 2291 bytes .../service/entity/CustomerAuthEntity.class | Bin 3495 -> 3405 bytes .../service/entity/CustomerEntity.class | Bin 2673 -> 3468 bytes .../service/entity/StateEntity.class | Bin 1908 -> 1908 bytes 24 files changed, 563 insertions(+), 268 deletions(-) delete mode 100644 FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/controller/AddressController.class delete mode 100644 FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/businness/AddressServiceImpl.class diff --git a/FoodOrderingApp-api/src/main/java/com/upgrad/FoodOrderingApp/api/controller/AddressController.java b/FoodOrderingApp-api/src/main/java/com/upgrad/FoodOrderingApp/api/controller/AddressController.java index f52fc6b..0882460 100644 --- a/FoodOrderingApp-api/src/main/java/com/upgrad/FoodOrderingApp/api/controller/AddressController.java +++ b/FoodOrderingApp-api/src/main/java/com/upgrad/FoodOrderingApp/api/controller/AddressController.java @@ -1,9 +1,10 @@ +/* package com.upgrad.FoodOrderingApp.api.controller; import com.upgrad.FoodOrderingApp.service.businness.AddressService; import com.upgrad.FoodOrderingApp.service.businness.CustomerService; +import com.upgrad.FoodOrderingApp.service.businness.CustomerServiceImpl; import com.upgrad.FoodOrderingApp.service.entity.AddressEntity; -import com.upgrad.FoodOrderingApp.service.entity.CustomerAddressEntity; import com.upgrad.FoodOrderingApp.service.entity.CustomerEntity; import com.upgrad.FoodOrderingApp.service.exception.AddressNotFoundException; import com.upgrad.FoodOrderingApp.service.exception.AuthorizationFailedException; @@ -25,13 +26,17 @@ public class AddressController { @Autowired private CustomerService customerService; + @Autowired + private CustomerServiceImpl customerServiceImpl; + @Autowired private AddressService addressService; @RequestMapping(method = RequestMethod.POST, path = "/address", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) - public ResponseEntity saveAddress(@RequestBody(required = false) final SaveAddressRequest saveAddressRequest, @RequestHeader("authorization") final String randomString) throws + public ResponseEntity saveAddress(@RequestBody(required = false) final SaveAddressRequest saveAddressRequest, @RequestHeader("authorization") final String randomString) throws AuthorizationFailedException, SaveAddressException, AddressNotFoundException { - String authorization = null; + */ +/* String authorization = null; String access_token = authorization.split("Bearer ")[1]; //validate the user first using this @@ -52,7 +57,60 @@ public ResponseEntity saveAddress(@RequestBody(required = f final AddressEntity createdAddressEntity = addressService.saveAddress(addressEntity,customerAddressEntity); SaveAddressResponse saveAddressResponse = new SaveAddressResponse().id(createdAddressEntity.getUuid()).status("ADDRESS SUCCESSFULLY REGISTERED"); - return new ResponseEntity(saveAddressResponse, HttpStatus.CREATED); + return new ResponseEntity(saveAddressResponse, HttpStatus.CREATED);*//* + + + try + { + CustomerEntity customerEntity = CustomerServiceImpl.getCustomer(randomString); + if(customerEntity == null) { + throw new AuthorizationFailedException("ATHR-001", "Customer is not logged in."); + } + if(!customerServiceImpl.checkIsCustomerLoggedIn(randomString)) + { + throw new AuthorizationFailedException("ATHR-002","Customer is logged out.Log in again to access this endpoint."); + } + if(customerServiceImpl.verifyTokenExpiry(randomString)) + { + throw new AuthorizationFailedException("ATHR-002","Log in again to access this endpoint.") + } + + AddressEntity addressEntity = new AddressEntity(); + addressEntity.setUuid(UUID.randomUUID().toString()); + addressEntity.setFlatBuilNo(saveAddressRequest.getFlatBuildingName()); + addressEntity.setLocality(saveAddressRequest.getLocality()); + addressEntity.setCity(saveAddressRequest.getCity()); + addressEntity.setPincode(saveAddressRequest.getPincode()); + + String stateUuid =saveAddressRequest.getStateUuid(); + addressServiceImpl.saveAddress(addressEntity,stateUuid,customerEntity); + + SaveAddressResponse saveAddressResponse =new SaveAddressResponse() + .id(addressEntity.getUuid()) + .status("ADDRESS SUCCESSFULLY REGISTERED"); + return new ResponseEntity(saveAddressResponse,HttpStatus.CREATED); + } + catch (AuthorizationFailedException afe) + { + SaveAddressResponse saveAddressResponse =new SaveAddressResponse() + .id(afe.getCode()) + .status(afe.getErrorMessage()); + return new ResponseEntity(saveAddressResponse,HttpStatus.BAD_REQUEST); + } + catch (SaveAddressException sae) + { + SaveAddressResponse saveAddressResponse = new SaveAddressResponse(). + id(sae.getCode()) + .status(sae.getErrorMessage()); + return new ResponseEntity(saveAddressResponse,HttpStatus.BAD_REQUEST); + } + catch (AddressNotFoundException e) + { + SaveAddressResponse saveAddressResponse = new SaveAddressResponse() + .id(e.getCode()) + .status(e.getErrorMessage()); + return new ResponseEntity(saveAddressResponse,HttpStatus.BAD_REQUEST); + } } @RequestMapping(method = RequestMethod.GET, path = "/address/customer", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) @@ -79,3 +137,4 @@ public ResponseEntity getAllAddresses(@RequestHeader("autho } +*/ diff --git a/FoodOrderingApp-api/src/main/java/com/upgrad/FoodOrderingApp/api/controller/CustomerController.java b/FoodOrderingApp-api/src/main/java/com/upgrad/FoodOrderingApp/api/controller/CustomerController.java index e2b1967..410cfa1 100644 --- a/FoodOrderingApp-api/src/main/java/com/upgrad/FoodOrderingApp/api/controller/CustomerController.java +++ b/FoodOrderingApp-api/src/main/java/com/upgrad/FoodOrderingApp/api/controller/CustomerController.java @@ -1,108 +1,117 @@ package com.upgrad.FoodOrderingApp.api.controller; - +import com.upgrad.FoodOrderingApp.api.model.*; import com.upgrad.FoodOrderingApp.service.businness.CustomerService; import com.upgrad.FoodOrderingApp.service.businness.CustomerServiceImpl; +import com.upgrad.FoodOrderingApp.service.dao.CustomerDao; import com.upgrad.FoodOrderingApp.service.entity.CustomerAuthEntity; import com.upgrad.FoodOrderingApp.service.entity.CustomerEntity; import com.upgrad.FoodOrderingApp.service.exception.AuthenticationFailedException; +import com.upgrad.FoodOrderingApp.service.exception.AuthorizationFailedException; import com.upgrad.FoodOrderingApp.service.exception.SignUpRestrictedException; +import com.upgrad.FoodOrderingApp.service.exception.UpdateCustomerException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import com.upgrad.FoodOrderingApp.api.model.*; +import javax.naming.AuthenticationException; +import java.awt.*; import java.util.ArrayList; import java.util.Base64; import java.util.List; import java.util.UUID; - -@RestController -@RequestMapping("/customer") +@RestController//returns the object and object data is directly written into HTTP response as JSON +@CrossOrigin//for the future use if we want t0 link the frontend to the backend and to avoid the CORS issue +@RequestMapping("/")//to tell where the mapping in the db has to go public class CustomerController { - @Autowired +//control over where and how autowiring should be done in the code .Can be on constructors, variables class and its objects private CustomerService customerService; - @RequestMapping(method = RequestMethod.POST, path = "/signup", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) - public ResponseEntity signUp(@RequestBody final SignupCustomerRequest signupCustomerRequest) - throws SignUpRestrictedException { - - //validate this request. + @Autowired + private CustomerDao customerDao; - if(signupCustomerRequest.getLastName().isEmpty()) { - throw new SignUpRestrictedException("SGR -005", "Last name cannot be empty"); + @Autowired + private CustomerServiceImpl customerServiceImpl; + + //this is the signup endpoint function definition which is of POST type + @RequestMapping(method = RequestMethod.POST, path = "/customer/signup", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) +//api takes the input as Json format and output as Json format + public ResponseEntity signUp(final SignupCustomerRequest signupCustomerRequest) throws SignUpRestrictedException { + + final CustomerEntity customerEntity = new CustomerEntity();//which is going to be saved in db yeh sb store hoga db mei. + customerEntity.setUuid(UUID.randomUUID().toString());//this generates random uuid automatically .the intellij has the function + customerEntity.setFirstName(signupCustomerRequest.getFirstName());//to set the firstname in the db + customerEntity.setLastName(signupCustomerRequest.getLastName());//set the lastname in the db + customerEntity.setContactNumber(signupCustomerRequest.getContactNumber());//set the contact number + customerEntity.setEmailAddress(signupCustomerRequest.getEmailAddress());//set the email id + customerEntity.setPassword(signupCustomerRequest.getPassword());//set the password + customerEntity.setSalt("1234");//salt is for password cryptography and security reasons. + + try { + final CustomerEntity responseCustomer = customerService.saveCustomer(customerEntity, signupCustomerRequest.getFirstName(), signupCustomerRequest.getLastName(), signupCustomerRequest.getContactNumber(), signupCustomerRequest.getEmailAddress(), signupCustomerRequest.getPassword());//if everything is f9 then this will bring some output response + SignupCustomerResponse signupCustomerResponse = new SignupCustomerResponse(); + signupCustomerResponse.setId(responseCustomer.getUuid()); + signupCustomerResponse.setStatus("CUSTOMER SUCCESSFULLY REGISTERED");//if no issues then customer is stored in db and this msg displayed + return new ResponseEntity(signupCustomerResponse, HttpStatus.CREATED); + } catch (SignUpRestrictedException e) { + SignupCustomerResponse signupCustomerResponse = new SignupCustomerResponse().id(e.getCode()).status(e.getErrorMessage()); + return new ResponseEntity(signupCustomerResponse, HttpStatus.BAD_REQUEST);//if issue the exception is thrown and the return is from the exception classes } - - CustomerEntity customerEntity = new CustomerEntity(); - customerEntity.setContactNumber("12345cds6237890"); - customerEntity.setEmailAddress("testing@teasst.com"); - customerEntity.setLastname("lsatname"); - customerEntity.setFirstName("first"); - customerEntity.setPassword("password"); - customerEntity.setSalt("salt"); - customerEntity.setUuid(UUID.randomUUID().toString()); - - final CustomerEntity responseCustomer = customerService.saveCustomer(customerEntity); - SignupCustomerResponse signupCustomerResponse = new SignupCustomerResponse(); - signupCustomerResponse.setId(responseCustomer.getUuid()); - signupCustomerResponse.setStatus("Customer Registered"); - return new ResponseEntity(signupCustomerResponse, HttpStatus.CREATED); } + //login endpoint functionality defined having method of post type + @RequestMapping(method = RequestMethod.POST, path = "/customer/login", produces = MediaType.APPLICATION_JSON_UTF8_VALUE, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResponseEntity login(@RequestHeader("authorization") final String authorization) throws AuthenticationFailedException { +//bearer has the contactnumber:password which is encoded in base64 format which is then passed along + byte[] decodedBytes = Base64.getDecoder().decode(authorization.split("Basic ")[1]);//splits the bearer + String decodedString = new String(decodedBytes); + String decodeArr[] = decodedString.split(":");//splits contact number and password as in betwee the 2=string of them is : + try { + if (CustomerServiceImpl.validAuthFormat(authorization) == true) //if the function called holds true + { + final CustomerAuthEntity customerAuthEntity = customerServiceImpl.verifyAuthenticate(decodeArr[0], decodeArr[1]);//passing the contactnumber and password as array 0 and array 1 + CustomerEntity customerEntity = customerAuthEntity.getCustomer();//return customer according to the query + if (customerEntity == null) { + //if the returned customerEntity is null ie returns nulll then thsi exception with the error message is thrown + throw new AuthenticationFailedException("ATH-002", "Invalid Credentials"); + } + LoginResponse loginResponse = new LoginResponse().firstName(customerEntity.getFirstName()).lastName(customerEntity.getLastName()).contactNumber(customerEntity.getContactNumber()).emailAddress(customerEntity.getEmailAddress()).id(customerEntity.getUuid()) + .message("LOGGED IN SUCCESSFULLY"); // if all validations verified then customer login successfully + HttpHeaders headers = new HttpHeaders(); + List header = new ArrayList<>(); + header.add("access-token"); + headers.setAccessControlExposeHeaders(header); + headers.add("access-token", customerAuthEntity.getAccessToken()); + return new ResponseEntity(loginResponse, headers, HttpStatus.OK);// if everything is verified then it return response and HTTPstatus.OK + } else { //if basic information for authentication is not provided in correct format then we throw this exception with an error message + throw new AuthenticationFailedException("ATH-003", "Incorrect format of decoded customer name and password"); + } + } catch (AuthenticationFailedException e) { + LoginResponse loginresponse = new LoginResponse().id(e.getCode()).message(e.getErrorMessage()); + return new ResponseEntity(loginresponse, HttpStatus.UNAUTHORIZED); - @RequestMapping(method = RequestMethod.POST, path = "/login", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) - public ResponseEntity login(@RequestHeader("authorization") final String auth) throws AuthenticationFailedException { - - //call to service to login - - //Use https://www.base64encode.org/ to create the encoded string - - //pass that encoded string in request header. - - //decode that string and get the password and contact number(On upgrad's portal there is a seperate lecture for this, see that one). - - // After decoding it check if that contact number exist in database if not then throw exception otherwise encrypt the decoded - // password and check with password if matched then create a random string - - // create one more table customerAuthEntity and store this string and current time inside that table and customer also. - - //set that random string in response headers and return it in response. - - byte[] dc= Base64.getDecoder().decode(auth.split("basic")[1]); - String dt = new String(dc); - String[] decodearr = dt.split(":"); - CustomerServiceImpl obj = new CustomerServiceImpl(); - if(CustomerServiceImpl.validAuthFormat(auth)== true) - { - final CustomerAuthEntity custAuthToken =obj.verifyAuthenticate(decodearr[0],decodearr[1]); - CustomerEntity customerentity = custAuthToken.getCustomer(); - LoginResponse loginresponse =new LoginResponse() - .firstName(customerentity.getFirstName()) - .lastName(customerentity.getLastname()) - .contactNumber((customerentity.getContactNumber())) - .emailAddress(customerentity.getEmailAddress()) - .id(customerentity.getUuid()) - .message("LOGGED IN SUCCESSFULLY"); - - HttpHeaders headers =new HttpHeaders(); - List header =new ArrayList<>(); - header.add("access-token"); - headers.setAccessControlExposeHeaders(header); - headers.add("access-token",custAuthToken.getAccessToken()); - return new ResponseEntity(loginresponse,headers,HttpStatus.OK); - } - else - { - throw new AuthenticationFailedException("ATH-003","Incorrect form of decoded customer name and password"); - } - // LoginResponse loginResponse = new LoginResponse(); - //return new ResponseEntity(loginResponse, HttpStatus.OK); + } + } + //this is logout endpoint method definition whch is of post type and throws AuthorizationFailed exception + @RequestMapping(method = RequestMethod.POST, path = "/customer/logout", produces = MediaType.APPLICATION_JSON_UTF8_VALUE, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResponseEntity logout(@RequestHeader("accessToken") final String accessToken) throws AuthorizationFailedException { + try { + String[] aToken = accessToken.split("Bearer ");//splits the accesstoken which we got during the login and then checks the condtitions + CustomerAuthEntity customerAuthEntity = customerServiceImpl.logout(aToken[1]);//method logout is called which holds the business logic + // if every validation fullfill then the we send this message to customer + LogoutResponse response = new LogoutResponse().id(customerAuthEntity.getUuid()).message("LOGGED OUT SUCCESSFULLY"); + return new ResponseEntity(response, HttpStatus.OK); + } catch (AuthorizationFailedException e)//if above validations conditions dont hold true then exception is raised which is caught in this block + { + LogoutResponse logoutResponse = new LogoutResponse().id(e.getCode()).message(e.getErrorMessage()); + return new ResponseEntity(logoutResponse, HttpStatus.BAD_REQUEST); + } } -} +} \ No newline at end of file diff --git a/FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/controller/AddressController.class b/FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/controller/AddressController.class deleted file mode 100644 index fa4c1e06ad9d920cf0f83717fb4a10c3e7ca3d60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6698 zcmc&&d3+Sr9sj<~W@odR2qqkE4*~H=I9x>#-EcI7M9>g0OR#{|PIiZ6V6(H%%m%QB zwXHp+_O`ZFTYK16+bZe;rbSC{=zZDyzAt+pw$*;$9DCrhX6YaO1a^M!&HMe{@A&?H z@Au~D;}0GNuvE0fup0ZKcufp9;k7MTh1a#>^>~AVH^vabz8KzwH%sbfNxelRPZT* zY3YLPnB%&Y(ya+2tqZIgNSot{LVncJGKqfE%xttWx@F`>d-C~&?X60T6l^1x(``G^ zTg~4s5FaY!9AjMHV%Ww=R`1E>Oh@rf5$UI|W8o7&*gPCD7E_wM8J@Yi4Nv zv;iZh4;IEpbZfIl^#$4o%(Rx>qFII<`;%d3%%DAWbc)3%oZ%&npcNNvNqU-ah)zcof~G2w3`Ttowk|lPLFAptvf4+ zH}@~Th->qfnJF+m1kR`~ucb&;)!Ai@s=LO_$U+dcSWjfZZQ?14lQ4UouJN>>q~-}N zTafj1RCju^Ss%~RfR&w3t_F=1t5)BG1BUGgESVZM{QV^lm7886BE`drdM|}4 zr~1OY`rv6b-7~S^7}?m}3RkEf@N(x_)hE;5d~iBlcHH)L6R2*rlljv| zOVhiU6zT)wlNAmFR=H2329yB%Gq7Z1yZ}FOZu2zrv`bI2#PZ+T*@q1 zX}#Z&r}!+NzkK|jE6=3Hs)Oy6*}GNr;}QX7jjma`HCMq=6<@#?RXhtl3cjS`%lHa$ zHHB_U_YN&zLk~v^zN+GD__~U3;1Lzyl+?E*^=(OgM^fLF)c5d+g72&N0e-0BM{?%J zctl|J)VB>fxT@_{`~*K$@iY8f#ai?!_=SoM_$A#{M{qeQ zM#U2Znh>f8QIcq4^hH=St0E#4RYdWqK=)G!=3#TfMwA7y+@Eb6*{P>lSl8DPSSlGo z3n4r8axd4fG37F){(_xRL$WHsQz4_TAsK!k22H2mEaWP6sW3HYPwQd2WNNL(l3l9n zxKf>Gt6QE}&;Ci{m4=6*&EuUuJ*QTk-2UX_P+-LrtUci+jQ0wjxk&SYz&(i85y!g-I1ac+~5OS>1o7^h2vif|4OuV2eE#Jk9NgZ4m8H{NoNzKA+z zfFrrXaKT`^D24hEWGw48&ByuL=khNb@?t9ODaVrC(-ffLpC|!ag|vEgB2c9aEMJ>c z@NwXQMs}|@|hNLw!A)`-rczYBuWb8CPZ?%954P_eym4lvpK#+Gu^b2NxJElMZ%=&rQ%rsfg z*mn5K%Q+gjpt6*7aCI;)*P$pK!%>9KUU!yl=W%mQ9JA-eqX@G1CgUT^^7UYBJ(f29CmHZJ9_ z>Mg)!7~n{-gB|31GK*n^5#!t~VsLSLsEDTUl4N+n{Rl5Qgys;E&69|1Jpd&ciANR| z5iO#{C1ORix`bLpn@gNh#I$(iAf^{_Y7y;|=pf&Wq!L%+ks@aD(OkqVik=;h#Faxh ztqIBKB;s84v^eEHy@+SDKeLF_lP!~&vo+qbA9D|2-aS+<1ZmJJOylnv9L=XeXX7+} z$(@G<{9A|%um~%#n4U^t6VAt0EWvX*JBnqPz=gOG%Uwt8@Qn2xL9?-u>!qV^!Q~io zV{kK4q?)+LK5Qlx=1$jR7+cWH{r2DrJe$tj%2;j1HYk)oAKN(>mZ665>|Vxyf{-ISe7=hPjiQ>)c|;b_kv7j=>;hV<&dG&n(9MXO3L6LtJk1 ze|{UT;ltv8+orw(4hnuqkN6=yw$KmghH^XyrT-Tn!Wj&0coOsJ{4#cX1X z58-STSCUe2w9?FL%mnqwun9CM+;Pk}h%LL)>S4!F>0q9%9YT0D== z@4_A2`vru{3&|~W&wFWjzlY8O9YGG6Us tr&(~{05>mpaWj`MbpkBF%`1G|ys`=}s;mqpkc99m?jEA}pupS+{1*q*9{2zN diff --git a/FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/controller/CustomerController.class b/FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/controller/CustomerController.class index f5db4f0b7db5de3aa536e577ab65d5f0688ab437..571c3f051227fe7215553f36011f0e473cdb6ecc 100644 GIT binary patch literal 8064 zcmcgxd3+qzeg8gbrCF^;mRW3L0d^K+Y{`~bW61_2+gQiS64qhsurW?bN4sNbVYRcF zoi&&=Eo~BVwFy0-v}syeT0$-gE?EJ}(Ieze8=77uX>;F6o1;hEq@my6%+Bu0S}iik zhd*}S@6CJf_kPFs_j|uL`>~%s^?m?dYC43MVnM?bA=F?YgeUQoJQk(<-Vol0_Y3s_ zq5e{+zY^-Nh58$zJ}A`FLVZZ64+rrPX+PS4llWL8K8{al_+$v{g>?=7R;a%V;#1N- zqv7ux@M-)*2$$g>HT+WuoAJ*w@-IR?E7WIX!e>MH9R4+ke+!`%pAX>+_@ag{N$1N! zd?kdh;%lBRR$7HZRp?+Zn3I`IRc zs7)t+D3AXP;=iQ*Zw>zw!a=dnk3#6fLJ;Q~@xS=7y!?r5_J2bCROEb)iYNq?3aT2} zn7TyqEJsvrPz5NRs?$_`2ooa8H^mqeN(-u>v<;dHg>aLsxe3o|s!>zALUTNqb*y>Q zo;2;#$+)R-U?gtMM{}83+ekzQEh{l@Crmq;p6$(KqFHZNbS9TgrqgCN8|`1ZzDJ>D zBA0fO^X9Q+HaU|rd(&ylF`T58&MI6tV%f9NY)1H{9_U0Vx_M~kl$hOg!bil9_x>h4)!mx_+aTS?d>@z8-J3OCBDfF#|*@`L)53;V` zmrN&}0}8dRZO0S>{Z@k3Y#vFb&9U74jA>69w1z@>#EKiKV}_lSe&J=nnM=|6XwfvX4dIxtLUaV z$H_z|%xs3PG-LF!bB0^4wF_^2CJNov_VyuUx(teH6!~os70N~O_EXqjjqA!9dCMuN zqVb2S@hD1mN8HQ^U|s7>XQ;AcC*zKpi1{OAxBh%NUDGM-tG30;VtR&GSmPtqGl)Xd zq+`Ty8#OX6RNT02VlrhmQwS9WB6!x0n$Db+IATa#Ii}554dPzI$=Ou>p%(`cFHrr0 zmk!Xdm2<@H=1g=ZnNF0ahXPz_n+)>_m)28pnn2;&iU6+0!(B)gfg|ISQ*1JZGe?_7 zeRo7XcQgAk2D7<&ljhybjZ?|Eo7|$eX03Eje9o}5rn7%~YOv!v&du0XA{Uprbt!8$ znI?)`M{YGv8_|@Jo{dftR}}n0!Y%9z#N0UNW29={D8hPaz?Ifh>n2w^KenGIy_P^c zB0Bl2$VQtp4IUO$cUwgVxEW-KX=KQoCoc1r(A1t?a!xW89Z50?`BM4$MPZ~`Xcg7; zV^mI$Imt4fg9eRcYH0*F8Ju9*$va&KN@iZ>83jFI#+fM-ePYVHnSa5t=z)V9)}1y|Ii{|9ZfE5j62_Euo5?5&mO!zm8Yq@Pl`P7z zy2fMbzfm|`jZtNE6~VI{T#ZJYai4YNW#y&dyf{89S5ll-mce{0h9<3?9XAIV4+@v` z7Yevi9dWgU!G-1FtW#RfP4`rc{z~b$-?p;ZaXZO8!gVUD!^A1>y^0!CLfbiWUIC%0 zW?ijS7wIajF4omLwO&(Ay4oO}OVoN@Z4|0Ss7r;qOsLC++9cFwpVS?o z61uuU9b{V5Rj*=Zz43yiuA1O^8ud;Mb?n-;n@M>%%~X<1MEZG`5ZoB4tjN=^u)E5R zC3lXLA9T7JP%&K%%HxnchUC$%VhS5Z#t$8e4Mc{=mUvZH!!o*cMOT)ciImngoqG`S zNHNaHX~=`fODG+VWI#>bsH?+jL|3C~OjqOLnZv4IS4TVm94%_!sjzoA9k*=Tj60E2 zmOXDc5$jZ>aD+wtaw3vu)fh3-iAcuCW_c~6YbI11`Sh8FZQ2nX535Oq&ehthED?!u zSW{h6FwXe&)H3UEc(@AZ<%kvEuatgSgjeAuUS$op@;zz^c*kdMrQvv|c^-~cu2a>; zDXO+Kor!*adAFtni0SF!0oMIC9c9gXop5VgSrH-c7-m7o@~e||{&;!GNx!mAoz5j$ zEU&M0GVuzl&zjC)(#|?#ga*4@P}Xha=!oGDHgd4kTgx#y5O|~a?!GiBC!F`HnX_W^ zEX#Tm37+Syu9`V%=^NSQNCA-i2Eg%BPc)b`Qglu=cl-8T@%}EF8K+JE98~yJ)ti#f zuj293v%Gx!dA(^{Re7=$L>_<$2aRU*oLxtw4b$ljVmyAA$-L4@r!^9K-;$LQKHY7 zCC2Ns1(P)P^$y%J5j#2^liQ$on7J95hn=~%iy=ty2HdLwi+-(0>BIaiX7{HES-CD; z?#Eu)+O37jG*DfZ_ebJ)dnM&6UL-b_Qh_Il&yBKsDV>Ksn9tiD?g3F`EzX z6~o2*WY+ASr;?-w-6Lg%EOIk%Rj2v&@YI>Ivzm5JR1k4_pu7;sm+~gLl%9IBvcRWVj5I;c&Ms4C>*CON>$va4<`$)g%SPk4YXJ372F zqSi>9pYjWl*+yq=VpiyNFD{a+`K2*-N5;yUh3h&?lY%y-Te{$B4bAMWDqPQM#t$pZ zlxtos`dwzDxs;PUCigvl&RKny(5J_Gr>BO-Cx&m9%rsHH=W4Qq5BKw&z63?X7s_;r z3(M-D9$dkH5njrFMQZt10B;pgxP`rXw!g@>1_ox9yN1ZHI7Bo`8I~GxMVga?I?N1<(M_nHE?K|_( z@(4=XkVi<`#yoUsoAOvAZF3%L+rt;-5#I4QE|xbMe+~RK^4G*)^OIPoVQdlW$$mq3 zpe4|e$0d1eYzc&0^0;&nmz`({oW-=bNtFK}UX9mK zw_1p%eOSw96hZ7l7}wxZ?8X-Uv$6wSr1qd2d%5Czn!20wd+>7X!yVX94hL{IZopeP zDpnezEpEX!q+z+7HzC8h0gg8nsJpQhHnJS0#R}FG%0Z4&1@R|1&9ybSo#X4Fp5qp^ z8t%|=M#G&@8eV~4;*j`nGhRumj^70+{V$WO!LPVrXyxEtobszD`NbN)hF9U$q_Sjn zx7)rJuPd|)ug4qcXZo>b2fY{~mvc{G>(201d29>p&SU%NB3e(hFQ9F#BfNtzy8}C) zz|Oz}c!2(DZwb`yZVAZ5j_$e^`uytd`j+|+qj?e06X9LqYZkEk1B>XS=ekzROSkS1AIRf|Zfy|6*Bm84;jDQ%Yi_@% delta 2622 zcmaJ@d3an^75|;t-kUdXvb=1arb(uyZPI4i>}^R(nuRn?$#yAu1|R7r+f%z;h>Qzfb%={&@HN&OPUz zdzRmOGt=vCY{)$R>cfu!Xr?6^25?BjhjF`x8XQ*e5fyi+_^1XC?o@D>1{H@?d`!wC zDn2gdCsce=%DYv3O3Hgw+$-g$ReVOu&uaJ_j>_deseay%e%v3xF+8B)xQ23M_(l~E zO8Ah9FG%SqnDOHTPHI?)hc#sJMHOF?IX$A`6dqOZm{h*3;wuWis-ae9U5l^DKTz;P4VU1Mf*)yECrkcu z08ip4a`UG${?8=(xlHjFGR3D9{8Gi!Dt@J5gY49=75qlrO-IEGu9wBrp54?cHW#fG z&$^3TrIx7jm53ovS6*<~j>h&5L?^dKN5{B1%CbAB?A=>ad(9-Fox?VXBT8^lp0uPU%(R)b6ZU>Wa6C1ZNTy9|GL^JU zLNmKA5Yxq)c+{UKUQ#xDJy8xMj;Un}T=5vewX=(txJ~fK%~&dKM$>6Rk?1TbQQWD~ zJ%la}u~?jSg+I#)xL7Rd|B%TnpY zfvBBGCB^N5c$L5Ie9k(yU|7L3I)01a>G(aKC9D_My356+YKZ%Sp*n&(+`A>bqQ1U` z5bBRwb~qWGFvGEEGMTc&qh{Egn6&rHK+h4@FVOKvse5-N(w42`PdVcxdtZ}E z$94Q!>K-dP&bAkDPQi;hUcz5={8iTRH=NTk7{ri*zw7u1UM940W-THws8r(>>GDq* zps0IpcHu4NSi-V-h#dQ0(o`+ZdaL^s{9DI=@Tx5DHHDxPk%zMyjarGAPG0gUr0ArQ zpHQ$Tx-VKc9!-wb4clq1jt`MWpjJZ1Tu)UVVnvBg0n&8}Ql3KjIu%eMp^-h7Fhhcu z>11$%R7Ax(l}J=7QJF;ZBnnA1U!rmyW3O<2orRpQQqR8wHgv?UV;c}|4lnq~d3FP*8VB&;6E41&96*%jhUX{5NoGVShE zlHWahaB5=IWR{mOe~UM4XQr^NXCj&y?~KR!-LVJ(-jTORHgM-zTQ9jVd#N;Tnqvds z#o91)LG%@N1f;TUDiNQ}STb1^w;Ic7pSaCiA?CO#hKgPkPZXaKPnFz5va)ivEELz3 z4h40t?!rytmC})w=j)x#L><3SdI7t>uApE{6dPefH~*&=S0XMBls%u}PgXyF>H&V? zF^D0Sn^^O)+|1I=l3z$(x3X5pl303|&ww6a;KDXur86)e+j-Sz9k2tJvql)f6>R6j zRKUL+Ufw%c>%ir}eHi&!WIQ8=*YM3iIhBPvG6VlW#LyfBB8KiD7%}o3uw+v%*1zgUXP{sB#d_V&O>0a~z9i zaM3Z&z@5vw9r-{8OQE3}rC5$i{>fO32%{DJhBN zdUk6FDGqqQNy=siEmE#>uv*GB4lb6Go8M}*Iau4OW^oChYH#&tv5rAUs}|CX&Xefk z)`a{ao^_@>l`Hy4$40?}cv0=pMGd9lPvQu1xCpWt7C}BLn102LW z=4_Z-wT$`Nz)bC6vh}jpCTwR4?%~i%+@2wL~)cy zlI4y|22XOcI`B5wnBoTZvfRh+3Lk98H5@|a<1N^a1MqW@2z$PrDa7r)K!Vfk`wkvK zKL07mV47z+5BK9*-g9%R_u@KS&xI_*U3e#MfH%VdXJ4GzaPQ`Dk|E`w*ElPmf*TdQ zN5M_G^}Pz-$Ho{xk~kaA6X)Os;@td(#CiY!5vN-+N0-dGg`Zn3+{Sr+fcIPwxljh9 X53)Wc%{jJxh}^7ete--bT=4%F-mgg| diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/AddressServiceImpl.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/AddressServiceImpl.java index 2cf89b5..99a3be8 100644 --- a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/AddressServiceImpl.java +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/AddressServiceImpl.java @@ -1,3 +1,4 @@ +/* package com.upgrad.FoodOrderingApp.service.businness; import com.upgrad.FoodOrderingApp.service.dao.AddressDao; @@ -13,6 +14,10 @@ import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; +import java.util.List; + + + import java.util.List; @Service @@ -37,6 +42,31 @@ public AddressEntity saveAddress(AddressEntity addressEntity, CustomerAddressEnt return addressEntity; } + @Transactional + public AddressEntity saveAddress(AddressEntity addressEntity,final String stateUuid,final CustomerEntity customerEntity) throws SaveAddressException,AddressNotFoundException + { + if(!checkFields(addressEntity,stateUuid)) + { + throw new SaveAddressException("SAR-001","No field can be empty"); + } + else if(!verifyPincode(addressEntity)) + { + throw new SaveAddressException("SAR-002","Invalid pincode"); + } + else + { + StateEntity stateEntity = getState(stateUuid); + if(stateEntity == null) + { + throw new AddressNotFoundException("ANF-002","No state by this id"); + } + addressEntity.setState(stateEntity.getId()); + addressEntity =addressDao.saveAddress(addressEntity); + + + } + } + @Override public AddressEntity getAddressByUUID(String addressId, CustomerEntity customerEntity) throws @@ -66,3 +96,4 @@ public StateEntity getState(String stateUUID) { } +*/ diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/CustomerService.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/CustomerService.java index 6677257..b56826e 100644 --- a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/CustomerService.java +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/CustomerService.java @@ -4,10 +4,19 @@ import com.upgrad.FoodOrderingApp.service.entity.CustomerEntity; import com.upgrad.FoodOrderingApp.service.exception.AuthenticationFailedException; import com.upgrad.FoodOrderingApp.service.exception.AuthorizationFailedException; +import com.upgrad.FoodOrderingApp.service.exception.SignUpRestrictedException; +import com.upgrad.FoodOrderingApp.service.exception.UpdateCustomerException; public interface CustomerService { - CustomerEntity saveCustomer(CustomerEntity customerEntity); - CustomerAuthEntity login(String contactNumber, String password) throws AuthenticationFailedException; - CustomerEntity getCustomer(String access_token) throws AuthorizationFailedException; + CustomerEntity saveCustomer(CustomerEntity customerEntity,String firstName,String lastName,String password,String email,String contactNumber) throws SignUpRestrictedException; + boolean checkIfFieldIsEmpty(final CustomerEntity customerEntity);//signup method validator function + boolean checkEmailPattern(final CustomerEntity customerEntity);//signup method validator function + boolean checkContactNumber(final CustomerEntity customerEntity);//signup method validator function + boolean checkPassword(final CustomerEntity customerEntity);//signup method validator function + CustomerAuthEntity verifyAuthenticate(String contactNumber,String password)throws AuthenticationFailedException;//login method + //CustomerEntity getCustomer(String access_token) throws AuthorizationFailedException;//login method validator + //CustomerAuthEntity authorization(String access_token) throws AuthorizationFailedException;//logout method + CustomerEntity updateCustomerPassword(String accessToken,String oldPAssword,String newPAssword)throws AuthorizationFailedException, UpdateCustomerException, UpdateCustomerException; + } diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/CustomerServiceImpl.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/CustomerServiceImpl.java index 738518f..676aab7 100644 --- a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/CustomerServiceImpl.java +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/CustomerServiceImpl.java @@ -6,6 +6,8 @@ import com.upgrad.FoodOrderingApp.service.entity.CustomerEntity; import com.upgrad.FoodOrderingApp.service.exception.AuthenticationFailedException; import com.upgrad.FoodOrderingApp.service.exception.AuthorizationFailedException; +import com.upgrad.FoodOrderingApp.service.exception.SignUpRestrictedException; +import com.upgrad.FoodOrderingApp.service.exception.UpdateCustomerException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; @@ -14,54 +16,112 @@ import java.time.ZonedDateTime; import java.util.Base64; import java.util.UUID; +import java.util.regex.Pattern; @Service public class CustomerServiceImpl implements CustomerService { + @Autowired + private CustomerDao customerDao;//the dao is Data object model which links from model to controller to view.. @Autowired - private CustomerDao customerDao; + private CustomerDaoImpl customerDaoImpl; @Autowired - private PasswordCryptographyProvider passwordCryptographyProvider; + private PasswordCryptographyProvider passwordCryptographyProvider;//for encryption of password we already have in intellij + //signup implementation and validation function @Override - @Transactional(propagation = Propagation.REQUIRED) - public CustomerEntity saveCustomer(CustomerEntity customerEntity) { - //handle the validations -//signup validations here - -// if(customerDao.getCustomer(customerEntity.getContactNumber() != null) { -// //throw exception -// } - - - //if validations are okay then save the customer in db; - - - - - String[] encryptPassoword = passwordCryptographyProvider.encrypt(customerEntity.getPassword()); - - customerEntity.setSalt(encryptPassoword[0]); - customerEntity.setPassword(encryptPassoword[1]); + @Transactional(propagation = Propagation.REQUIRED)//means of telling your code when it executes that it must have a Transaction. + public CustomerEntity saveCustomer(CustomerEntity customerEntity, String firstname, String lastname, String password, String email, String contactNumber) throws SignUpRestrictedException { + //handle all the validations here if all validations are ok then save in db using Dao + //if the customer exists in the db using the customer column which is also a primary key + CustomerEntity object = customerDao.getCustomerByContactNumber(customerEntity.getContactNumber());//gets the value from CustomerDaoImpl + if (object != null)//this means that there exists in db a customer with the same mobile number so this particular exception thrown + throw new SignUpRestrictedException("SGR-001", "This contact number is already registered! Try other contact number"); + //if (checkIfFieldIsEmpty(customerEntity)) + if(firstname == null || email == null || contactNumber == null ||password == null)//to check whether the fields of all these are empty or not + throw new SignUpRestrictedException("SGR-005", "Except last name all fields should be filled"); + if (!checkEmailPattern(customerEntity))//if the email id is not in the correct format then the exception is thrown + throw new SignUpRestrictedException("SGR-002", "Invalid email-id format!"); + if(!checkContactNumber(customerEntity))//if the contact number is not in correct format then this exception is thrown + throw new SignUpRestrictedException("SGR-003","Invalid contact number!"); + if(!checkPassword(customerEntity))//if password is of wrong format which is explained in the checkPassword method then the particular exception is thrown + throw new SignUpRestrictedException("SGR-004","Weak password!"); + else { + //if there is no such exception and all above conditions are satisfactory then encrypt the password for its safety and security purpos + String[] encryptPassoword = passwordCryptographyProvider.encrypt(customerEntity.getPassword());//this is provided by springboot/hibernate to encrpyt the password + customerEntity.setSalt(encryptPassoword[0]);//setting the salt + customerEntity.setPassword(encryptPassoword[1]);//encrypt password + //salt is an extra layer for better security purpose.an extra layer for defense against hacking + return customerDao.saveCustomer(customerEntity);//data wiill be saved in db now + } + } + @Override + public boolean checkIfFieldIsEmpty(final CustomerEntity customerEntity) + {//this method checks whether the input fields are empty or not if they are empty then the returns true where it is called and exception is thrown + if (customerEntity.getFirstName().length() == 0 || customerEntity.getLastName().length() == 0 || customerEntity.getContactNumber().length() == 0 || customerEntity.getEmailAddress().length() == 0 || customerEntity.getPassword().length() == 0) + return true; + else + return false; + } - return customerDao.saveCustomer(customerEntity); + @Override + public boolean checkEmailPattern(final CustomerEntity customerEntity) { + //this method checks that the email pattern is correct according to the constraints specified or not + /* String emailExpression = "^[a-zA-Z0-9_+&*-]+(?:\\." + "[a-zA-Z0-9_+&*-]+)*@" + "(?:[a-zA-Z0-9-]+\\.)+[a-z" + "A-Z]{2,7}$"; + Pattern pattern = Pattern.compile(emailExpression); + if (pattern.matcher(emailExpression).matches()) + return true; + else + return false;*/ + final String email = customerEntity.getEmailAddress(); + return email.contains("@") && email.contains(".") && !email.contains(" ");//it checks whether the email string has @,. and it doesnt have space in it + } + @Override + public boolean checkContactNumber(CustomerEntity customerEntity) { + //constraint specified is that the contactNumber should be of digits only and it should be of length 10 only and if the constraints are not followed it should throw an exception + String expression = "^[0-9]{10}$";//to check whether the contact number is of 0-9 numbers only and size is 10 + String contact = customerEntity.getContactNumber(); + if( contact.matches(expression)){ + return true; + } + else + return false; + //int number = Integer.parseInt(contact); + //if length of number is less than 10 then return true + /*try { + if (contact.length() != 10) + return false; + else + return true; + } catch (NumberFormatException e) { + return false; + }*/ } @Override - @Transactional(propagation = Propagation.REQUIRED) - public CustomerAuthEntity login(String contactNumber, String password) throws AuthenticationFailedException { + public boolean checkPassword(CustomerEntity customerEntity) { + //the password constraints specified are tht shouldn't be less than 8 characters of length + //it should have atleast 1 uppercase and lowercase alphabet each, shuld have atleast 1 number adn should have atleast 1 special character. + String pass=customerEntity.getPassword(); + if(pass.length()<8||!pass.matches("(?=.*[0-9]).*")||!pass.matches("(?=.*[A-Z]).*")||!pass.matches("(?=.*[~!@#$%^&*()_-]).*")) + return false; + else + return true; + } - CustomerEntity customerEntity = null; - // CustomerEntity customerEntity = customerDao.getCustomerByContactNumber(contactNumber); + //-----> login logic implementation + @Override + @Transactional(propagation =Propagation.REQUIRED) + public CustomerAuthEntity verifyAuthenticate(String contactNumber, String password) throws AuthenticationFailedException { - if (customerEntity == null) { + CustomerEntity customerEntity=customerDao.getCustomerByContactNumber(contactNumber); + if(customerEntity==null)// if contact number provided by customer is not exist in database throw new AuthenticationFailedException("ATH-001", "This contact number has not been registered!"); - } - final String encryptedPassword = PasswordCryptographyProvider.encrypt(password, customerEntity.getSalt()); + final String encryptedPassword = PasswordCryptographyProvider.encrypt(password, customerEntity.getSalt());//for pssword encryption checker if (encryptedPassword.equals(customerEntity.getPassword())) { JwtTokenProvider jwtTokenProvider = new JwtTokenProvider(encryptedPassword); @@ -74,80 +134,137 @@ public CustomerAuthEntity login(String contactNumber, String password) throws Au customerAuthEntity.setLoginAt(ZonedDateTime.now()); customerAuthEntity.setExpiresAt(expiresAt); customerAuthEntity.setAccessToken(jwtTokenProvider.generateToken(customerEntity.getUuid(), now, expiresAt)); - - // return customerDao.createCustomerAuth(customerAuthEntity); - return null; + return customerAuthEntity; } else { + // if the password does not match with the existing password present in database throw new AuthenticationFailedException("ATH-002", "Invalid Credentials"); } } - public void authorization(String access_token) throws AuthorizationFailedException { + //function called in customer controller to check valid format and it returns boolean value + public static boolean validAuthFormat(String authorization) + { + String regexStr = "^[0-9]{10}$"; + byte[] decode = Base64.getDecoder().decode(authorization.split("Basic ")[1]); + String decodedText = new String(decode); + String[] decodedArray = decodedText.split(":"); + + String basic = authorization.split("Basic")[1]; + if(contactNumberVerified(decodedArray[0]) && passwordVerified(decodedArray[1]) ){ + return true; + } + else { + return false; + } + } + + // function called in validAuthFormat to verify contact number or ATH-003 + public static boolean contactNumberVerified(String cno) + { + String str= "^[0-9]{10}$"; + if(cno.matches(str)) + { + return true; + } + else + { + return false; + } + } + // function called in validAuthFormat to verifyPassword + public static boolean passwordVerified(String password) + { + if(password.length()<8 || !password.matches("(?=.*[0-9]).*")|| !password.matches("(?=.*[A-Z]).*")|| !password.matches("(?=.*[~!@#$%^&*()_-]).*")) + { + return false; + } + return true; + } + - CustomerAuthEntity customerAuthEntity = customerDao.getCustomerAuthByAccesstoken(access_token); + /* @Override + public CustomerEntity getCustomer(String access_token) throws AuthorizationFailedException { + + authorization(access_token); + CustomerAuthEntity customerAuthEntity = customerDao.getAuthTokenByAccessToken(access_token); + return customerAuthEntity.getCustomer(); + }*/ + //-------------->Logout + //checks whether customer has loggedout based on access token + /*@Transactional(propagation = Propagation.REQUIRED) + public CustomerAuthEntity logout(final String access_token) throws AuthorizationFailedException { + CustomerAuthEntity customerAuthEntity = customerDaoImpl.getAuthTokenByAccessToken(access_token); if (customerAuthEntity == null) { + //if access token provided by the customer not exist in database throw new AuthorizationFailedException("ATHR-001", "Customer is not Logged in."); } - - if (customerAuthEntity.getLogoutAt() != null) { + else if(customerAuthEntity!=null&&customerAuthEntity.getLoginAt()!=null){ + //if (customerAuthEntity.getLogoutAt() != null) { throw new AuthorizationFailedException("ATHR-002", "Customer is logged out. Log in again to access this endpoint."); } - if (ZonedDateTime.now().isAfter(customerAuthEntity.getExpiresAt())) { + else if (customerAuthEntity!=null && ZonedDateTime.now().isAfter(customerAuthEntity.getExpiresAt())) { throw new AuthorizationFailedException("ATHR-003", "Your session is expired. Log in again to access this endpoint."); } - } - - public CustomerAuthEntity verifyAuthenticate(final String cno, final String pswd)throws AuthenticationFailedException + else + { + final ZonedDateTime now=ZonedDateTime.now(); + customerAuthEntity.setLogoutAt(now); + return customerAuthEntity; + } + }*/ + //logout implementation and validation + @Transactional(propagation = Propagation.REQUIRED) + public CustomerAuthEntity logout(final String accesstoken)throws AuthorizationFailedException { - CustomerDaoImpl obj= new CustomerDaoImpl(); - CustomerEntity centity = obj.getCustomerByCno(cno); - if(centity== null) - { -throw new AuthenticationFailedException("ATH-001","This contact number has not been registered!"); - } - - final String encPswd = passwordCryptographyProvider.encrypt(pswd,centity.getSalt()); - if(encPswd.equals(centity.getPassword())) - { - JwtTokenProvider jtp = new JwtTokenProvider(encPswd); - CustomerAuthEntity cat = new CustomerAuthEntity(); - cat.setCustomer(centity); - final ZonedDateTime now =ZonedDateTime.now(); - final ZonedDateTime expAt = now.plusHours(8); - cat.setAccessToken(jtp.generateToken(centity.getUuid(),now,expAt)); - cat.setLoginAt(now); - cat.setExpiresAt(expAt); - cat.setUuid(centity.getUuid()); - obj.createAuthToken(cat); - obj.updateCustomer(centity); - return cat; - } - else - { - throw new AuthenticationFailedException("ATH-002","Invalid Credentials"); - } - } + CustomerAuthEntity customerAuthEntity = customerDaoImpl.getAuthTokenByAccessToken(accesstoken); + if(customerAuthEntity== null) + { + //if access token provided by the customer not exist in database + throw new AuthorizationFailedException("ATHR-001","Customer is not logged in."); + } + if(!checkIsCustomerLoggedIn(accesstoken)) + { + // if the access token provided by the customer exist in database, but customer is already logout + throw new AuthorizationFailedException("ATHR-002","Customer is logged out.Login again to access this endpoint."); + } + if(verifyTokenExpiry(accesstoken)) + { + // if the token of customer is expired + throw new AuthorizationFailedException("ATHR-002","Customer is logged out.Login again to access this endpoint."); + } - public static boolean validAuthFormat(String auth) - { - String regexStr ="^[0-9]{10}$"; - byte[] dc= Base64.getDecoder().decode(auth.split("Basic")[1]); - String dt= new String(dc); - String[] decodedarr= dt.split(":"); - - String bas= auth.split("Basic")[1]; - if(contactNumberVerified(decodedarr[0]) && passwordVerified(decodedarr[1])) - return true; + ZonedDateTime now=ZonedDateTime.now(); + long diff = customerAuthEntity.getExpiresAt().compareTo(now); + if(customerAuthEntity.getLogoutAt()!= null) + { + // + throw new AuthorizationFailedException("AUTH-002","Customer is logged out.Login again to access this endpoint."); + } + else if(diff<0) + { + // if token is exist in database, but session has expired + throw new AuthorizationFailedException("AUTH-003","Your session is expired.Login again to access this endpoint."); + } else - return false; + { + customerAuthEntity.setLogoutAt(now); + customerDaoImpl.updateCustomer(customerAuthEntity); + } + return customerAuthEntity; } - - public static boolean contactNumberVerified(String cno) + // this function is used to verify the token of customer + @Transactional + public boolean verifyTokenExpiry(final String accessToken) { - String regexStr= "^[0-9]{10}$"; - if(cno.matches(regexStr)) + CustomerAuthEntity custAuthEntity = customerDaoImpl.getAuthTokenByAccessToken(accessToken); + if(custAuthEntity== null) + return true; + + ZonedDateTime now =ZonedDateTime.now(); + long diff=custAuthEntity.getExpiresAt().compareTo(now); + if(diff<0) { return true; } @@ -156,22 +273,68 @@ public static boolean contactNumberVerified(String cno) return false; } } - - public static boolean passwordVerified(String pswd) + // function called in logout method to check customer is login or not + @Transactional + public boolean checkIsCustomerLoggedIn(final String accesstoken) { - if(pswd.length()<8 || !pswd.matches("(?=.*[0-9]).*")) - { + CustomerAuthEntity custAuthEntity =customerDaoImpl.getAuthTokenByAccessToken(accesstoken); + if(custAuthEntity== null) return false; - } - return true; - } + ZonedDateTime logoutAt =custAuthEntity.getLogoutAt(); + ZonedDateTime loginAt =custAuthEntity.getLoginAt(); - @Override - public CustomerEntity getCustomer(String access_token) throws AuthorizationFailedException { + if(logoutAt== null) + return true; + long checkDifference = loginAt.compareTo(logoutAt); + if(checkDifference>0) + return true; + else + return false; + } - authorization(access_token); - CustomerAuthEntity customerAuthEntity = customerDao.getCustomerAuthByAccesstoken(access_token); - return customerAuthEntity.getCustomer(); + //--------------------> + //password updatation method implementation + @Override + @Transactional(propagation = Propagation.REQUIRED) + public CustomerEntity updateCustomerPassword(String accessToken, String oldPassword, String newPassword)throws AuthorizationFailedException, UpdateCustomerException { + CustomerAuthEntity customerAuthEntity=customerDaoImpl.getAuthTokenByAccessToken(accessToken);//rturns the daoimpl function on the query + CustomerEntity customerEntity=customerAuthEntity.getCustomer();//returns the customer + final String decryptedPassword = passwordCryptographyProvider.encrypt(oldPassword,customerAuthEntity.getCustomer().getSalt());//to encrypt the password and return the old pasword along with the salt + if(oldPassword==null||newPassword==null) { + //of password whether old or new is empty then this exception is thrown + throw new UpdateCustomerException("UCR-003", "No field should be empty"); + } + if(customerAuthEntity==null) + { + //if no customer is in the login state + throw new AuthorizationFailedException("ATHR-001","Customer is not Logged in."); + } + else if(customerAuthEntity!=null&&customerAuthEntity.getLogoutAt()!=null){ + //if the customer has already logged out before + throw new AuthorizationFailedException("ATHR-002","Customer is logged out. Log in again to access this endpoint."); + } + else if(customerAuthEntity!=null && ZonedDateTime.now().isAfter(customerAuthEntity.getExpiresAt())){ + //if his access token time has expired or the time for the person to remain loggedin has exceeded + throw new AuthorizationFailedException("ATHR-003", "Your session is expired. Log in again to access this endpoint."); + } + else if(!passwordVerified(newPassword)){ + //if the new password doesnt match the constraints + throw new UpdateCustomerException("UCR-001","Weak password!"); + } + else if(!customerAuthEntity.getCustomer().getPassword().matches(oldPassword)) + { + //if the old password stored in db doesnt match with the password u input then this exception is thrown + throw new UpdateCustomerException("UCR-004","Incorrect old password!"); + } + else + { + //if above all validations constraints are verified and there is no issue then we encrypt the new password along with the salt + String encrpted[]=passwordCryptographyProvider.encrypt(newPassword); + customerEntity.setSalt(encrpted[0]); + customerEntity.setPassword(encrpted[1]); + customerDaoImpl.updateCustomer(customerEntity); + return customerAuthEntity.getCustomer(); + } } -} +} \ No newline at end of file diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/AddressDaoImpl.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/AddressDaoImpl.java index 1708c10..ffbf908 100644 --- a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/AddressDaoImpl.java +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/AddressDaoImpl.java @@ -23,6 +23,7 @@ public class AddressDaoImpl implements AddressDao{ @PersistenceContext private EntityManager entityManager; + //function @Override public AddressEntity saveAddress(AddressEntity addressEntity) { entityManager.persist(addressEntity); diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/CustomerDao.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/CustomerDao.java index 1b2e6a8..5bd85c1 100644 --- a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/CustomerDao.java +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/CustomerDao.java @@ -5,15 +5,15 @@ public interface CustomerDao { + //logic how customer is saved in db CustomerEntity saveCustomer(CustomerEntity customerEntity); + //CustomerEntity getCustomer(CustomerEntity customerEntity); + CustomerEntity getCustomerByContactNumber(String contactNumber); - CustomerEntity getCustomer(String contactNumber); - - boolean getCustomer(boolean b); - - CustomerAuthEntity getCustomerAuthByAccesstoken(String access_token); - - + //fetch the contactnumber se customer.if exist + //CustomerEntity getCustomer(String contactNumber); //boolean getCustomer(boolean b); + CustomerAuthEntity getAuthTokenByAccessToken(String access_token); + } diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/CustomerDaoImpl.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/CustomerDaoImpl.java index 6d255da..0925321 100644 --- a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/CustomerDaoImpl.java +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/CustomerDaoImpl.java @@ -1,65 +1,73 @@ package com.upgrad.FoodOrderingApp.service.dao; + import com.upgrad.FoodOrderingApp.service.entity.CustomerAuthEntity; import com.upgrad.FoodOrderingApp.service.entity.CustomerEntity; import org.springframework.stereotype.Repository; import javax.persistence.EntityManager; +import javax.persistence.EntityTransaction; import javax.persistence.NoResultException; import javax.persistence.PersistenceContext; -@Repository -public class CustomerDaoImpl implements CustomerDao { - +@Repository//indicate that the class provides the mechanism for storage, retrieval, search, update and delete operation on objects. +public class CustomerDaoImpl implements CustomerDao{ - @PersistenceContext + @PersistenceContext//set of entities such that for any persistent identity there is a unique entity instance. private EntityManager entityManager; - @Override - public CustomerEntity saveCustomer(CustomerEntity customerEntity) { + @Override//the method in the interface is implemented here and overridden + public CustomerEntity saveCustomer(CustomerEntity customerEntity) //this method is for signup which will save users/customers int eh db + { entityManager.persist(customerEntity); return customerEntity; } - @Override - public CustomerEntity getCustomer(String contactNumber) { - return null; + public CustomerEntity getCustomerByContactNumber(final String contactNumber) //to check whether there already exists a customer in the db having the same contactnumber + { + try { + return entityManager.createNamedQuery("customerByContactNumber", CustomerEntity.class).setParameter("contactNumber", contactNumber).getSingleResult(); + } catch (NoResultException nre) { + return null; + } } - @Override - public boolean getCustomer(boolean b) { - return false; + public CustomerAuthEntity createAuthToken(CustomerAuthEntity customerAuthEntity) + { + this.entityManager.persist(customerAuthEntity); + return customerAuthEntity; } - @Override - public CustomerAuthEntity getCustomerAuthByAccesstoken(String access_token) { - return null; + + public void updateCustomer(CustomerEntity updatedCustomerEntity) { + this.entityManager.merge(updatedCustomerEntity); } - public CustomerEntity getCustomerByCno(final String cno) + public CustomerAuthEntity updateCustomer(final CustomerAuthEntity customerAuthEntity) { - try - { - return entityManager.createNamedQuery("customerByContactNumber",CustomerEntity.class).setParameter("contact_number",cno).getSingleResult(); - } - catch(NoResultException e) - { - return null; - } + EntityTransaction entityTransaction=entityManager.getTransaction(); + try + { + entityTransaction.begin(); + entityManager.merge(customerAuthEntity); + entityTransaction.commit(); + //System.out.println("customerAuthEntity updated with UUID: "+customerAuthEntity.getUuid()); + } + catch (Exception e) + { + entityTransaction.rollback(); + return null; + } + return customerAuthEntity; + } + + public CustomerAuthEntity getAuthTokenByAccessToken(final String accessToken) { + try { + return entityManager.createNamedQuery("customerAuthByAccesstoken", CustomerAuthEntity.class).setParameter("accessToken", accessToken).getSingleResult(); + } catch (NoResultException nre) { + return null; + } } - public CustomerAuthEntity createAuthToken(CustomerAuthEntity cat) - { - this.entityManager.persist(cat); - return cat; - } - public void updateCustomer(CustomerEntity uct) - { - this.entityManager.merge(uct); - } - /* @Override - public boolean getCustomer(boolean b) { - return false; - }*/ } diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/CustomerAddressEntity.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/CustomerAddressEntity.java index 723714d..d1ec879 100644 --- a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/CustomerAddressEntity.java +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/CustomerAddressEntity.java @@ -1,5 +1,6 @@ package com.upgrad.FoodOrderingApp.service.entity; + import org.hibernate.annotations.OnDelete; import org.hibernate.annotations.OnDeleteAction; @@ -7,14 +8,11 @@ import javax.validation.constraints.NotNull; import java.io.Serializable; -/** - * CustomerAddressEntity class contains all the attributes to be mapped to all the fields in customer_address table in the database. - * All the annotations which are used to specify all the constraints to the columns in the database must be correctly implemented. - */ + @Entity @Table(name = "customer_address") -@NamedQuery(name = "userByAddress", query = "select a from CustomerAddressEntity a inner join a.address b where " + - "b.uuid = :uuid") +@NamedQuery(name = "userByAddress", query = "select a from CustomerAddressEntity a inner join a.address b where " + +"b.uuid = :uuid") public class CustomerAddressEntity implements Serializable { @Id @@ -59,5 +57,4 @@ public AddressEntity getAddress() { public void setAddress(AddressEntity address) { this.address = address; } - } diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/CustomerAuthEntity.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/CustomerAuthEntity.java index c37e658..b8a6e34 100644 --- a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/CustomerAuthEntity.java +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/CustomerAuthEntity.java @@ -4,15 +4,11 @@ import java.io.Serializable; import java.time.ZonedDateTime; -/** - * CustomerAuthEntity class contains all the attributes to be mapped to all the fields in customer_auth table in the database. - * All the annotations which are used to specify all the constraints to the columns in the database must be correctly implemented. - */ @Entity @Table(name = "customer_auth") @NamedQueries({ - @NamedQuery(name = "customerByuuid", query = "select c from CustomerAuthEntity c where c.uuid = :uuid"), - @NamedQuery(name = "customerAuthByAccesstoken", query = "select c from CustomerAuthEntity c where c.accessToken = :accesstoken") + // @NamedQuery(name = "searchByUuid", query = "select c from CustomerAuthEntity c where c.uuid = :uuid"), + @NamedQuery(name = "customerAuthByAccesstoken", query = "select c from CustomerAuthEntity c where c.accessToken = :accessToken") }) public class CustomerAuthEntity implements Serializable { @@ -43,8 +39,7 @@ public class CustomerAuthEntity implements Serializable { public CustomerAuthEntity() { } - public CustomerAuthEntity(String uuid, CustomerEntity customer, String accessToken,ZonedDateTime expiresAt, ZonedDateTime loginAt, ZonedDateTime - logoutAt) { + public CustomerAuthEntity(String uuid, CustomerEntity customer, String accessToken,ZonedDateTime expiresAt,ZonedDateTime loginAt, ZonedDateTime logoutAt) { this.uuid = uuid; this.customer = customer; this.accessToken = accessToken; diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/CustomerEntity.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/CustomerEntity.java index dba07cf..1dcb3ef 100644 --- a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/CustomerEntity.java +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/CustomerEntity.java @@ -1,41 +1,68 @@ package com.upgrad.FoodOrderingApp.service.entity; +import org.apache.commons.lang3.builder.HashCodeBuilder; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + import javax.persistence.*; import java.io.Serializable; -@Entity @Table(name = "CUSTOMER") -//name query will come here +@Entity//specifies that the class is an entity and is mapped to a database table +@Table(name="CUSTOMER")//tells us in which table in the database we have to go +@NamedQueries( + { + //statically defined query with a predefined unchangeable query string. + @NamedQuery(name = "customerByContactNumber", query = "select u from CustomerEntity u where u.contactNumber =:contactNumber") + } +) public class CustomerEntity implements Serializable { - @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; - - @Column(name = "firstname", nullable = false) private String firstName; + @Id//member field below is the primary key of current entity. + @Column(name = "id")//the name of the column of the table + @GeneratedValue(strategy = GenerationType.IDENTITY)//configure the way of increment of the specified column(field)/how the primary key should be generated + private int id; - @Column(name = "uuid", nullable = false) + @Column(name="uuid",nullable = false) private String uuid; + @Column(name = "firstname",nullable = false) + private String firstName; - @Column(name = "lastname", nullable = false) private String lastname; + @Column(name = "lastname",nullable = false) + private String lastName; - @Column(name = "email", nullable = false) private String emailAddress; + @Column(name = "email",nullable = false) + private String emailAddress; - @Column(name = "password", nullable = false) private String password; + @Column(name = "password",nullable = false) + private String password; - @Column(name = "contact_number", nullable = false) private String contactNumber; + @Column(name = "contact_number",nullable = false) + private String contactNumber; - @Column(name = "salt", nullable = false) private String salt; + @Column(name = "salt",nullable = false) + private String salt; - public CustomerEntity() { + //constructor + public CustomerEntity(){ } - - public Integer getId() { + //getter setter of all the variables + public int getId() { return id; } - public void setId(Integer id) { + public void setId(int id) { this.id = id; } + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + public String getFirstName() { return firstName; } @@ -44,12 +71,12 @@ public void setFirstName(String firstName) { this.firstName = firstName; } - public String getLastname() { - return lastname; + public String getLastName() { + return lastName; } - public void setLastname(String lastname) { - this.lastname = lastname; + public void setLastName(String lastName) { + this.lastName = lastName; } public String getEmailAddress() { @@ -84,14 +111,14 @@ public void setSalt(String salt) { this.salt = salt; } - public String getUuid() { - return uuid; + @Override + public int hashCode() { + return new HashCodeBuilder().append(this).hashCode(); } - public void setUuid(String uuid) { - this.uuid = uuid; + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE); } -} - - +} diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/StateEntity.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/StateEntity.java index 1d20d1c..4d90b00 100644 --- a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/StateEntity.java +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/StateEntity.java @@ -3,10 +3,6 @@ import javax.persistence.*; import java.io.Serializable; -/** - * StateEntity class contains all the attributes to be mapped to all the fields in state table in the database. - * All the annotations which are used to specify all the constraints to the columns in the database must be correctly implemented. - */ @Entity @Table(name = "state") @NamedQueries({ diff --git a/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/businness/AddressServiceImpl.class b/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/businness/AddressServiceImpl.class deleted file mode 100644 index 19dc824cc4140664629cc238cd98ef429e3beb5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3442 zcmb_fSyLNF5dKCS0%q)qkZN?S_W4&r_gJ3(X^LOh?hh2yMq zi(x*Uvr2lUT(EgwPg+)f%gzhiFbnZ=S$BkeWaNaN=awF?E5#VD?o>=^l*GQ_7}=tT zo2DhXG%V9$xSh7_g6@L{@8f3HL45f#O=lkyc6AzF8k&q637}nhXQn z+cFP|;m!rH#&XT*wHa+cG|fFEo*Bt=Pd9kk-^ftno17^7*)+T%n!?IiB+rFIhQ48sK>{ot=w z_x4gW^?fw`gdcIe$jySDk*XHXlMMeu7WDgBkjksNIYWwJu(q|eJX!1@PilMW6AfZF zh&_hOs(@<0`JrL>u9HG~N&6g;XpTVnrnakCtkX)LhgO}B8_|k1ih9~`q)LpOUn&g! z8KYowS+S{SQAV`UX@%ECYSdd;S?U1Fchg5&Rs_j^Dmh7{?lno%PFju&<3p3XjzaYc zAe6Bxc1|P>)vvGkBpSNxjEWmWv}r9nROrHz)w0lim6(PrcqNE^4F`A-#6t~_@R^3s z@qn68JAtkB6g_j&+v|;nA()BpOwZ2FF^p|mk)$DtPGpUnk*tV_Qdw4&{Vz0J#%K^< zYIqZ0X_&`N4O949!!3NMfrEm((gv6RI(?{{oYd%6_KCLPf9wa(!kbGSyg%}bzjg`R+_4I0Pj(%MVoxIa?a(%V&f(`jTh_DsG2`mQ^yD#qw6OOkkn1mj~My`Jr75EM}jZV_t)ev z=%4xxp#TmhZyY0hF!h|&x?EG^bXf*Ljv_*zcc^yX#T?#qO-DR<-!vJb71vxk^LU%q z252paL|`;b8cJe>_C87d0a^-L1lRci`r$e~QGp3ek}!oEgsmcwA{6CB*e9t4pvX1G zVWxphxK1XFY0MB5sZtncNkdWSrEv}))JROzlui#_>gjKTXK{s=1eBU@ap0`QTdu`% zZ&`yyfgc5S>kvI3Eq9X(^QNPpQ4&3pd~pl|%|EZA9pW+h)BG!Fa# zPW&RotQ$Lxd`SYb#`ccJZ{E(n=U;z*`~-kE@XCQF4m>5Wt?85>$J)q%D+0d{PnZnc zI2tSJxm_u}Gv#q5!f`u_T+P)~Fz)iu2s3lj&pOHS?a2k5QrD;9*c}-A$$!fnZBB|n zt@DlX$Osu~2c8jVe&S{#y*^bm;D#$r;1-(?;Cd$nsw1JaImH436`y9W5!L!iDvv;k z2UPe38cc?UGIJUSLp#7-HsS2DH|h%Rdp+F=A~PfK{vXDA^p(I)g4(ey`_v%mkU%TR z9WS?UB*}h8vo*!T8_n9Wnb<>P)ZmW1!&Q!IlcC!_b2T{doWOn@dDt=)%7T|#i9(*{ zCZsY#FC2JDpiUX%T7Qw39H&^9zSnQ3r&%fwFL<61yBB!X7y zqSBVYdTWD8CB9Q@yByYswXn{YB$Vy1On^WEe`Wwqk-!!daaF=q5%Xnm@a>=s6?{}N zY8Z8lZHxxipy%N>7TU5BdK{XVYUWcr`BW>P+J(Iv&F>_r)q-tgnoOTnUdzZa z`4E%UWF|&6F4mm<^vpa)h7^s7jVhCMnCxvC8Ms_4l2Z#xGV}9_*%?F`8F-WP^GXtv zOZ-Z6lR(CB6eJcGm**FyFfwqbra9p;M3 zZ<(j3voSI-GB5$1$iTqN!pOkPzyjp60(q>A3~USxKp}Pp4xj=~pb$uk3oOaW#J~*{ a-~lV(W#B_nzz@?c093%pAP6Lx7=!?4t} diff --git a/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/businness/CustomerServiceImpl.class b/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/businness/CustomerServiceImpl.class index 726cdaa463001502ad58ae683d93e34cc33a5b45..b911aa9ee4eeed588f5ca6eabe57b946d3d6ee7e 100644 GIT binary patch literal 9897 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 Uf-k}jX^e%4@wZpCe1fX~7yJcn#sB~S literal 6614 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 F{vWhu8OQ(t diff --git a/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/dao/AddressDaoImpl.class b/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/dao/AddressDaoImpl.class index 02a8e19f2b89ec3caaf1a1018c4c0f4832edc4e2..469dab4e497066d3399b971c602c6936037ae06d 100644 GIT binary patch delta 109 zcmZpdZkOI*#KkJhz{MapS&~OI+2lRk5v$$DLj)oy@7gsfO>p^dcpyvx)ovo delta 109 zcmZpdZkOI*#KkJZz{MatS&~Oag9?K@gX&}hUd72--13vZ0!4LzqPjp) yJ*cQJs|iq->Eu1!5v*1~mNig+5vL=AG=md^41@FJDLj)oy?}bWfqHy^dcpysL={i~ diff --git a/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/dao/CustomerDao.class b/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/dao/CustomerDao.class index cf2c6f49fa1f289b90cce36b5613f29d6582c310..7c4930effbe7e2af9cbb3adcd1c71dfe2c0dd00e 100644 GIT binary patch delta 113 zcmZo>{m3G4>ff$?3=9k=41(+o{Ok+@69v{uN~NckIF}Zeff$?3=9k=48rUTg6s@J69v|Bai^!2IF}Ze>s6`yN_gPB2wyPvUm61@1F16^F4O|{Oi}>0o+El2LqVx#wk4P#Up%} z!$%q(tJ{xrDD>hJ%&E(~h6Odbs4h#rc!FhhS<$en#!qut)3Bbyl!nhVe6HaOfn(AM z>|kf!bj-5!1P14xo7?6Kqb5Dy_5hx+mQ?P>W1`IO=1h==UmIIteKvz zp5w`mVAH0v@j1(_8ueP)GfT!J*DWo2CF$8tdAe3JeCci5WM48}qgeL?w<^6^(|ug6 zRp?&#&25=X3v7=Z1}f63ffng9F?#f^0)19YEdmp`_d00(^D@|UOG~C_R%Jlh1nh{wMl{ncUk)NO7QT7C2J~K7=&Zi zemeP9HZ)oxZ{jEJZKU>f%``}XL3fC*+2wXN)VH*6O7tGO8s<{PROwSS3T45nL7+!`v^x^ zDYJ>N&#Y_sk{yU`gPEvK7lv$RXWFu)@5k|5{+|+YpL)G!+C|TbTlXya$W~qDR3bp! z5w5AOCs3Gky|UrgR3SW5HT0e9Z5eEXo^*qqnlzSW&GqfT^>!w7yovKV&fpCVU+MT7 zPX*2-S-}k^@myMgz|B|3YO7gG z!U|k!RW`C}ydbss&B%I5=WN7nLcPlRqwci8^eH{5OK(S@m^O|3Y^vId71Q_Gcw3#X zGU*}^c7yW=t*cj>3>uwZVD@023E}^8dYo0e!g8p{sDHC|Mk1zB4#hYEoqWHRnViFE zzx%wrw4sm4scs=~B?fNy^^r295}g~eY_kn@F%zmbQzGZNmC6R+6By)I(f|Zb^Pf@G z$?+_|qPjSqMsUa!P#)_BVmD8t!S}%X1P!!~I-SFcpml_#hT+e}u;Msm>PLv+0|~xZm;tdX_xobbIY?e*a>U3=WGw@K?4Ck#+kks9^{(1vfO@#4WxZ ze2}eSkzvqmw}@e{wz}(0YeT_p4R>%?!#&(*(D_G64{2CJouR~8Q0Kn~9=+=*&sZKA zYEcw~pd|@9>3!6~0n+w_JaIIX6E_FX!+kcgy8}!m|xg z;2>m@Q`D1bq)~7Z8zWnqq8=x^Xh_B_IfJ}|oF*$xZAHO}f8ESG<1FB$NLP$x!5c}D xMpE+C>>tStPI)!Y5SQUJ{Zs<-OHI{0$Q&Y=-vd(g&$UPpiQ)-)*8RZF0XvNxYYzYb diff --git a/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/entity/CustomerAddressEntity.class b/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/entity/CustomerAddressEntity.class index 8d00a95ffbeb96aba7a09eece7aacc186e385e8d..a422ace71afff46be72c045324f6fd33841a571d 100644 GIT binary patch delta 73 zcmew?_*rnnXEs(P1{Mb8$v@a^7}X}5vfHw1F|aadPoB>qKDm$GicxR!NuZb!P|O%C Wro>^zXf`>P!s delta 73 zcmew?_*rnnXEs(91{Ma@$v@a^7&RuFvfHxiFt9S{PM*&pKDm$GiqT;5NuZbsP|Or8 Wro>^zXfZjK!b$uBsjGnxR^+Ok?OurgRquHzP;e3R3P(FUwvlS_lu0VwVW7SH9fVsrtE z?*)o`0L4AQ;*8u@j6PuTKyD4z0HAmvP&|+^Wby@WTh<65KN74?lgElN2CS}XQq3#RV807=jp>7zB$Mf*C@J8A1UX>OsW- delta 387 zcmX}oPfG$p7zXfXtXbW45h5ZoDhYxGBkiBoijhH4f|iw2MbsC;Fst!haiZK zojOFf4jnoML7%{{5PgB@ojG)QW}Y7}!^?aIAIB3PzprlqmQXif;7Es#l8j>+Wf>2y}jh^c^FBo{+Z8$xKxQJ?DQ(7n)vgIjsZBj(E z6zjgUwI{~I7{sjjF-F9SZ+jv_ElTgtBY*`AV-aJt)fAR7gP6GY-Lh3Ro7OF!1jm|q zFh<3VZnKo~KKUm3mhx%CW;@Cq!{Qn8EP0OQ$dWuyy`bjOew&rl+@0Uz74oX`K6y>~ zoN4g}`K5Blv{_U6J9&%zN_?BKcnkx`&_8CuFx0^=_UMu;!?TWkcqAR*u!H=6Ey!B@ E1J%1%`v3p{ diff --git a/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/entity/CustomerEntity.class b/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/entity/CustomerEntity.class index 04a9ea2e4b67f2b2c565796c3a78789f56682afc..a854b90e205a12e9996e81342d2f6e85293ad784 100644 GIT binary patch literal 3468 zcmbW2`*#yX6vywTNt1?!M$5y3tpUWgLAyv%9_3X++D6g`O0~s z{-7QKkDlWn;2-7jJ3E`S*-YTzFL&q8y)*Nf`w{aP=+?S*y7?5 z7mvBv=Hdw#Pr3LuN#CU@O%*P_=VE7so{^rWU8*LjmL!&>J%wUMO(CVI(D;ULc}A0M z8LqKwvIWbsJ>4^G%T?%PX(zU$dd z<`e=Ifk@PuR|GK5N3IjD(BjiYj+0qoUc;`f>kb0rA;$_O;lCNg_4xFREV4;#AskLj z_uKidDz;cW2)Bv_htwmmmbyVd0^@-;3R|Hk^rNu%&hYi?-8}I12U-TUd~aehaEMIt zE0%-o@Vkgns-e3Lk(`ugi!xFuUABFv$`%ctqOsoC&hpNXH$pe~ta?2|;zge!V ztrRvC%1YdLsn#C)$TM?!8ei~!QE2jQu5CD;s)iMCuN}E|;s@-8HoNaKlU2Q}pWSop zX14cMn0?t`4$JzpVMU8F&EC4vqpNh0K38dsj;l05lPaC%;yf1@xR~N%nu{DwDs;(q z>YCots|}{1n45T9f`*;bc74M{HEYXZ{O<`}r8+fKTB5lm87l45^CX!nHOW%w+W&0_ z6g*Fwcq-O*_Ynn!jt5hQt(6gL-86m@4LPj0TFgS@EFP|Mv1op#^uG5&W@g{HrVGV?~wrTR-hsQNI1w&pKArb-#70V@1LDTW2~}bV9#1C#++zprataz@6vt zRq##Z-jMPu1~Hn2Oyf%!#px1h7^%Vu+LzE2x*ROz8))4Pey7;am=GHb2Mgw;i?7gE z@ZyVaH2QRph1#ib524gCV+VWxR0 z({;K5uU@8$uV^UBbO%g#2QZ0B37IAWrgO~Lga!iC374fMKnfv{Iu00|ORjZIY&FN0?{A zJQt=e%nM;&3eyl~H%EIp+RxE}K`F;JXr}STdTW`k<#o)u$61F3j|`fB6?xq0vLh#S zj$O9pc|Nze<9ne&WjW&)v&Vwa2|4rH%&gm(bVVaPV;&1E&g>)0jTnORAs6G$$$R6m zQ|qKBJ5A0YT#+xNKD=6g~1m<0x% zkHiL$cLqh79a{RdECsB5CTi~N262#Be;SK5 zPBTA^NrO=lT5YHlMd-sGG5_GSE@J**RDxC=E>sBt30DqLO5Fw4R$P}!jM54{>F?BEC3KYqj7xUI9&<@jb3_sepfU&Up_mg1{H*(pycL56-2 zFXsYACE4QsGMb@TIKUjsCA1&I^GQhabn$!o6n!v{stbJ;M;%oc`zmrUs(#j2k(^O= zsjnhyqw1Buigb>u%Sycf1r>q4j-%d1YoN`n{zb;`=%na#*eSGx1Ex`}3VH<Su|WmL=1smT5A{^sScZiJoaP$@Bx5ejLN3{@|Et0Zb`+D(#m1 R)r%N^jd2yf1HSI<{{g*4sAT{E diff --git a/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/entity/StateEntity.class b/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/entity/StateEntity.class index 96866a782245a3cc2ce77c1da60fbd901f30bad2..c5b83707629033b8f8a7e3644736fa6f86a0305b 100644 GIT binary patch delta 103 zcmeyu_l0l6Qx;YU1{Ma%$%bsAlmD|A@=61FG7OvyvJ89-a+7UY;~5pfa+_E+SXCKV s8Pq1H_(CK)(3oE;cJhL$JDAY#OYlKyfp$xEy;J0J9($8UO$Q delta 103 zcmeyu_l0l6Qx;Yk1{Ma{$%bsAlmD|A^2!5w3JjbKiVS=VN|S9_;~7=Ka+_E+STz|~ s8MG$fXANZ31&Z0S8Up!7K)(3oE;cJhQ?R;QY#OYVKyfRuxEy;J0Kdc+RsaA1 From 144c745417e978acdf93b40cdc974d6817fb1096 Mon Sep 17 00:00:00 2001 From: Abhishekdawer Date: Sat, 2 May 2020 22:41:03 +0530 Subject: [PATCH 3/3] restaurant endpoint implementation --- .../api/controller/AddressController.java | 244 ++++++++++------- .../api/controller/CategoryController.java | 86 ++++++ .../api/controller/CustomerController.java | 108 +++++--- .../api/controller/RestaurantController.java | 156 +++++++++++ .../api/exception/RestExceptionHandler.java | 65 +++++ .../FoodOrderingApp-api.kotlin_module | Bin 0 -> 16 bytes .../api/controller/AddressController.class | Bin 0 -> 10240 bytes .../api/controller/CategoryController.class | Bin 0 -> 6781 bytes .../api/controller/CustomerController.class | Bin 8064 -> 9489 bytes .../controller/RestaurantController$1.class | Bin 0 -> 1537 bytes .../api/controller/RestaurantController.class | Bin 0 -> 13425 bytes .../api/exception/RestExceptionHandler.class | Bin 0 -> 7934 bytes .../service/businness/AddressService.java | 20 +- .../service/businness/AddressServiceImpl.java | 166 ++++++++---- .../businness/CategoryItemServiceImpl.java | 25 ++ .../businness/CategoryServiceImpl.java | 47 ++++ .../service/businness/CustomerService.java | 7 +- .../businness/CustomerServiceImpl.java | 245 +++++++++++------- .../service/businness/ItemService.java | 7 + .../service/businness/ItemServiceImpl.java | 23 ++ .../businness/RestaurantCategoryService.java | 12 + .../RestaurantCategoryServiceImpl.java | 29 +++ .../service/businness/RestaurantService.java | 15 ++ .../businness/RestaurantServiceImpl.java | 54 ++++ .../service/businness/StateService.java | 7 + .../service/businness/StateServiceImpl.java | 24 ++ .../service/dao/AddressDao.java | 17 +- .../service/dao/AddressDaoImpl.java | 161 +++++++++--- .../service/dao/CategoryDaoImpl.java | 81 ++++++ .../service/dao/CategoryItemDaoImpl.java | 39 +++ .../service/dao/CustomerAddressDaoImpl.java | 65 +++++ .../service/dao/CustomerAuthEntityDao.java | 9 + .../dao/CustomerAuthEntityDaoImpl.java | 71 +++++ .../service/dao/CustomerDao.java | 5 +- .../service/dao/CustomerDaoImpl.java | 94 ++++++- .../service/dao/ItemDaoImpl.java | 41 +++ .../service/dao/RestaurantCategoryDao.java | 12 + .../dao/RestaurantCategoryDaoImpl.java | 56 ++++ .../service/dao/RestaurantDao.java | 14 + .../service/dao/RestaurantDaoImpl.java | 82 ++++++ .../FoodOrderingApp/service/dao/StateDao.java | 8 + .../service/dao/StateDaoImpl.java | 37 +++ .../service/entity/AddressEntity.java | 70 ++--- .../service/entity/CategoryEntity.java | 55 ++++ .../service/entity/CategoryItemEntity.java | 61 +++++ .../service/entity/CustomerAddressEntity.java | 46 ++-- .../service/entity/CustomerAuthEntity.java | 42 ++- .../service/entity/CustomerEntity.java | 31 ++- .../service/entity/ItemEntity.java | 97 +++++++ .../entity/RestaurantCategoryEntity.java | 55 ++++ .../service/entity/RestaurantEntity.java | 108 ++++++++ .../service/entity/RestaurantItemEntity.java | 35 +++ .../service/entity/StateEntity.java | 26 +- .../FoodOrderingApp-service.kotlin_module | Bin 0 -> 16 bytes .../service/businness/AddressService.class | Bin 1306 -> 1146 bytes .../businness/AddressServiceImpl.class | Bin 0 -> 6036 bytes .../businness/CategoryItemServiceImpl.class | Bin 0 -> 1064 bytes .../businness/CategoryServiceImpl.class | Bin 0 -> 2009 bytes .../service/businness/CustomerService.class | Bin 1448 -> 1745 bytes .../businness/CustomerServiceImpl.class | Bin 9897 -> 9601 bytes .../service/businness/ItemService.class | Bin 0 -> 272 bytes .../service/businness/ItemServiceImpl.class | Bin 0 -> 999 bytes .../businness/RestaurantCategoryService.class | Bin 0 -> 443 bytes .../RestaurantCategoryServiceImpl.class | Bin 0 -> 1355 bytes .../service/businness/RestaurantService.class | Bin 0 -> 751 bytes .../businness/RestaurantServiceImpl.class | Bin 0 -> 2269 bytes .../service/businness/StateService.class | Bin 0 -> 289 bytes .../service/businness/StateServiceImpl.class | Bin 0 -> 1032 bytes .../service/dao/AddressDao.class | Bin 1226 -> 984 bytes .../service/dao/AddressDaoImpl.class | Bin 3463 -> 6579 bytes .../service/dao/CategoryDaoImpl.class | Bin 0 -> 3259 bytes .../service/dao/CategoryItemDaoImpl.class | Bin 0 -> 2297 bytes .../service/dao/CustomerAddressDaoImpl.class | Bin 0 -> 3186 bytes .../service/dao/CustomerAuthEntityDao.class | Bin 0 -> 541 bytes .../dao/CustomerAuthEntityDaoImpl.class | Bin 0 -> 3645 bytes .../service/dao/CustomerDao.class | Bin 625 -> 478 bytes .../service/dao/CustomerDaoImpl.class | Bin 3260 -> 5069 bytes .../service/dao/ItemDaoImpl.class | Bin 0 -> 2244 bytes .../service/dao/RestaurantCategoryDao.class | Bin 0 -> 446 bytes .../dao/RestaurantCategoryDaoImpl.class | Bin 0 -> 2514 bytes .../service/dao/RestaurantDao.class | Bin 0 -> 650 bytes .../service/dao/RestaurantDaoImpl.class | Bin 0 -> 3397 bytes .../service/dao/StateDao.class | Bin 0 -> 275 bytes .../service/dao/StateDaoImpl.class | Bin 0 -> 2153 bytes .../service/entity/AddressEntity.class | Bin 3407 -> 2704 bytes .../service/entity/CategoryEntity.class | Bin 0 -> 1893 bytes .../service/entity/CategoryItemEntity.class | Bin 0 -> 1899 bytes .../entity/CustomerAddressEntity.class | Bin 2291 -> 1443 bytes .../service/entity/CustomerAuthEntity.class | Bin 3405 -> 2647 bytes .../service/entity/CustomerEntity.class | Bin 3468 -> 4055 bytes .../service/entity/ItemEntity.class | Bin 0 -> 2960 bytes .../entity/RestaurantCategoryEntity.class | Bin 0 -> 1931 bytes .../service/entity/RestaurantEntity.class | Bin 0 -> 2937 bytes .../service/entity/RestaurantItemEntity.class | Bin 0 -> 1263 bytes .../service/entity/StateEntity.class | Bin 1908 -> 1627 bytes 95 files changed, 2300 insertions(+), 458 deletions(-) create mode 100644 FoodOrderingApp-api/src/main/java/com/upgrad/FoodOrderingApp/api/controller/CategoryController.java create mode 100644 FoodOrderingApp-api/src/main/java/com/upgrad/FoodOrderingApp/api/controller/RestaurantController.java create mode 100644 FoodOrderingApp-api/src/main/java/com/upgrad/FoodOrderingApp/api/exception/RestExceptionHandler.java create mode 100644 FoodOrderingApp-api/target/classes/META-INF/FoodOrderingApp-api.kotlin_module create mode 100644 FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/controller/AddressController.class create mode 100644 FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/controller/CategoryController.class create mode 100644 FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/controller/RestaurantController$1.class create mode 100644 FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/controller/RestaurantController.class create mode 100644 FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/exception/RestExceptionHandler.class create mode 100644 FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/CategoryItemServiceImpl.java create mode 100644 FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/CategoryServiceImpl.java create mode 100644 FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/ItemService.java create mode 100644 FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/ItemServiceImpl.java create mode 100644 FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/RestaurantCategoryService.java create mode 100644 FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/RestaurantCategoryServiceImpl.java create mode 100644 FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/RestaurantService.java create mode 100644 FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/RestaurantServiceImpl.java create mode 100644 FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/StateService.java create mode 100644 FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/StateServiceImpl.java create mode 100644 FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/CategoryDaoImpl.java create mode 100644 FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/CategoryItemDaoImpl.java create mode 100644 FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/CustomerAddressDaoImpl.java create mode 100644 FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/CustomerAuthEntityDao.java create mode 100644 FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/CustomerAuthEntityDaoImpl.java create mode 100644 FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/ItemDaoImpl.java create mode 100644 FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/RestaurantCategoryDao.java create mode 100644 FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/RestaurantCategoryDaoImpl.java create mode 100644 FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/RestaurantDao.java create mode 100644 FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/RestaurantDaoImpl.java create mode 100644 FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/StateDao.java create mode 100644 FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/StateDaoImpl.java create mode 100644 FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/CategoryEntity.java create mode 100644 FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/CategoryItemEntity.java create mode 100644 FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/ItemEntity.java create mode 100644 FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/RestaurantCategoryEntity.java create mode 100644 FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/RestaurantEntity.java create mode 100644 FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/RestaurantItemEntity.java create mode 100644 FoodOrderingApp-service/target/classes/META-INF/FoodOrderingApp-service.kotlin_module create mode 100644 FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/businness/AddressServiceImpl.class create mode 100644 FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/businness/CategoryItemServiceImpl.class create mode 100644 FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/businness/CategoryServiceImpl.class create mode 100644 FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/businness/ItemService.class create mode 100644 FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/businness/ItemServiceImpl.class create mode 100644 FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/businness/RestaurantCategoryService.class create mode 100644 FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/businness/RestaurantCategoryServiceImpl.class create mode 100644 FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/businness/RestaurantService.class create mode 100644 FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/businness/RestaurantServiceImpl.class create mode 100644 FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/businness/StateService.class create mode 100644 FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/businness/StateServiceImpl.class create mode 100644 FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/dao/CategoryDaoImpl.class create mode 100644 FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/dao/CategoryItemDaoImpl.class create mode 100644 FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/dao/CustomerAddressDaoImpl.class create mode 100644 FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/dao/CustomerAuthEntityDao.class create mode 100644 FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/dao/CustomerAuthEntityDaoImpl.class create mode 100644 FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/dao/ItemDaoImpl.class create mode 100644 FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/dao/RestaurantCategoryDao.class create mode 100644 FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/dao/RestaurantCategoryDaoImpl.class create mode 100644 FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/dao/RestaurantDao.class create mode 100644 FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/dao/RestaurantDaoImpl.class create mode 100644 FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/dao/StateDao.class create mode 100644 FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/dao/StateDaoImpl.class create mode 100644 FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/entity/CategoryEntity.class create mode 100644 FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/entity/CategoryItemEntity.class create mode 100644 FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/entity/ItemEntity.class create mode 100644 FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/entity/RestaurantCategoryEntity.class create mode 100644 FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/entity/RestaurantEntity.class create mode 100644 FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/entity/RestaurantItemEntity.class diff --git a/FoodOrderingApp-api/src/main/java/com/upgrad/FoodOrderingApp/api/controller/AddressController.java b/FoodOrderingApp-api/src/main/java/com/upgrad/FoodOrderingApp/api/controller/AddressController.java index 0882460..9e2e903 100644 --- a/FoodOrderingApp-api/src/main/java/com/upgrad/FoodOrderingApp/api/controller/AddressController.java +++ b/FoodOrderingApp-api/src/main/java/com/upgrad/FoodOrderingApp/api/controller/AddressController.java @@ -1,140 +1,192 @@ -/* package com.upgrad.FoodOrderingApp.api.controller; -import com.upgrad.FoodOrderingApp.service.businness.AddressService; -import com.upgrad.FoodOrderingApp.service.businness.CustomerService; +import com.upgrad.FoodOrderingApp.api.model.*; +import com.upgrad.FoodOrderingApp.service.businness.AddressServiceImpl; import com.upgrad.FoodOrderingApp.service.businness.CustomerServiceImpl; import com.upgrad.FoodOrderingApp.service.entity.AddressEntity; +import com.upgrad.FoodOrderingApp.service.entity.CustomerAddressEntity; import com.upgrad.FoodOrderingApp.service.entity.CustomerEntity; import com.upgrad.FoodOrderingApp.service.exception.AddressNotFoundException; import com.upgrad.FoodOrderingApp.service.exception.AuthorizationFailedException; import com.upgrad.FoodOrderingApp.service.exception.SaveAddressException; +import com.upgrad.FoodOrderingApp.service.exception.UpdateCustomerException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import com.upgrad.FoodOrderingApp.api.model.*; +import java.util.ArrayList; import java.util.List; import java.util.UUID; - -@RestController +@RestController//returns the object and object data is directly written into HTTP response as JSON +@CrossOrigin//for resolving the CORS issue when integrating the frontend and the backend +@RequestMapping("/")//to tell where the mapping in the db has to go public class AddressController { - @Autowired - private CustomerService customerService; - - @Autowired + @Autowired//control over where and how autowiring should be done in the code .Can be on constructors, variables class and its objects private CustomerServiceImpl customerServiceImpl; @Autowired - private AddressService addressService; - - @RequestMapping(method = RequestMethod.POST, path = "/address", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) - public ResponseEntity saveAddress(@RequestBody(required = false) final SaveAddressRequest saveAddressRequest, @RequestHeader("authorization") final String randomString) throws - AuthorizationFailedException, SaveAddressException, AddressNotFoundException { - */ -/* String authorization = null; - String access_token = authorization.split("Bearer ")[1]; - - //validate the user first using this - CustomerEntity customerEntity = customerService.getCustomer(randomString); - - final AddressEntity addressEntity = new AddressEntity(); - - addressEntity.setFlatBuilNo(saveAddressRequest.getFlatBuildingName()); - addressEntity.setLocality(saveAddressRequest.getLocality()); - addressEntity.setCity(saveAddressRequest.getCity()); - addressEntity.setPincode(saveAddressRequest.getPincode()); - // addressEntity.setState(addressService.getStateByUUID(saveAddressRequest.getStateUuid())); - addressEntity.setUuid(UUID.randomUUID().toString()); - - final CustomerAddressEntity customerAddressEntity = new CustomerAddressEntity(); - customerAddressEntity.setAddress(addressEntity); - customerAddressEntity.setCustomer(customerEntity); - - final AddressEntity createdAddressEntity = addressService.saveAddress(addressEntity,customerAddressEntity); - SaveAddressResponse saveAddressResponse = new SaveAddressResponse().id(createdAddressEntity.getUuid()).status("ADDRESS SUCCESSFULLY REGISTERED"); - return new ResponseEntity(saveAddressResponse, HttpStatus.CREATED);*//* + private AddressServiceImpl addressServiceImpl; - try - { - CustomerEntity customerEntity = CustomerServiceImpl.getCustomer(randomString); - if(customerEntity == null) { - throw new AuthorizationFailedException("ATHR-001", "Customer is not logged in."); + //saveAddress endpoint definition of POST type + @RequestMapping(path = "/address",method = RequestMethod.POST,produces= MediaType.APPLICATION_JSON_UTF8_VALUE,consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResponseEntitysaveAddress(@RequestBody SaveAddressRequest saveAddressRequest, @RequestHeader("accessToken") final String accessToken) throws AuthorizationFailedException, SaveAddressException,AddressNotFoundException, UpdateCustomerException { + try{ + //if any of the input fields is empty then this exception is thrown + if(saveAddressRequest.getStateUuid().isEmpty() || saveAddressRequest.getPincode().isEmpty()|| saveAddressRequest.getFlatBuildingName().isEmpty() || saveAddressRequest.getLocality().isEmpty() || saveAddressRequest.getCity().isEmpty()) + { + throw new SaveAddressException("SAR-001", "No field can be empty"); } - if(!customerServiceImpl.checkIsCustomerLoggedIn(randomString)) + // Getting the CustomerEntity object using the accessToken. + CustomerEntity customerEntity=customerServiceImpl.getCustomer(accessToken); + if(customerEntity==null)//if the accessToken is not in db { - throw new AuthorizationFailedException("ATHR-002","Customer is logged out.Log in again to access this endpoint."); + throw new AuthorizationFailedException("ATHR-001", "Customer is not Logged in."); } - if(customerServiceImpl.verifyTokenExpiry(randomString)) + if(!customerServiceImpl.isUserLoggedIn(accessToken)) { - throw new AuthorizationFailedException("ATHR-002","Log in again to access this endpoint.") + //if the accessToken states that the customer has already logged out + throw new AuthorizationFailedException("ATHR-002", "Customer is logged out. Log in again to access this endpoint."); } - - AddressEntity addressEntity = new AddressEntity(); - addressEntity.setUuid(UUID.randomUUID().toString()); - addressEntity.setFlatBuilNo(saveAddressRequest.getFlatBuildingName()); - addressEntity.setLocality(saveAddressRequest.getLocality()); - addressEntity.setCity(saveAddressRequest.getCity()); - addressEntity.setPincode(saveAddressRequest.getPincode()); - - String stateUuid =saveAddressRequest.getStateUuid(); - addressServiceImpl.saveAddress(addressEntity,stateUuid,customerEntity); - - SaveAddressResponse saveAddressResponse =new SaveAddressResponse() - .id(addressEntity.getUuid()) - .status("ADDRESS SUCCESSFULLY REGISTERED"); - return new ResponseEntity(saveAddressResponse,HttpStatus.CREATED); + if(customerServiceImpl.checkExpiryOfToken(accessToken)) + { + //if the customer has not logged out but the max time limit to stay logged in has exceeded. + throw new AuthorizationFailedException("ATHR-002", "Customer is logged out. Log in again to access this endpoint."); + } + AddressEntity addressEntity=new AddressEntity();// Creating an empty AddressEntity object. + //setting the values in the AddressEntity in the address table + addressEntity.setUuid(UUID.randomUUID().toString());//this generates UUID in the db table + addressEntity.setFlatBuilNumber(saveAddressRequest.getFlatBuildingName());//setting the flat,building value in the table + addressEntity.setLocality(saveAddressRequest.getLocality());//setting the locality + addressEntity.setCity(saveAddressRequest.getCity());//setting the city in the table + addressEntity.setPincode(saveAddressRequest.getPincode());//setting the pincode according to the constraints + String stateUuid=saveAddressRequest.getStateUuid();//the stateUuid is taken from the State table + addressServiceImpl.saveAddress(addressEntity,stateUuid,customerEntity);//the logic of the saveAddress + //if all conditions are met and no issues found then save the data in the table + SaveAddressResponse response=new SaveAddressResponse().id(addressEntity.getUuid()).status("ADDRESS SUCCESSFULLY REGISTERED"); + return new ResponseEntity(response, HttpStatus.CREATED); } - catch (AuthorizationFailedException afe) + catch (AuthorizationFailedException e)//if there exists exception in the table { - SaveAddressResponse saveAddressResponse =new SaveAddressResponse() - .id(afe.getCode()) - .status(afe.getErrorMessage()); - return new ResponseEntity(saveAddressResponse,HttpStatus.BAD_REQUEST); + //throw the exception + SaveAddressResponse errorResponse=new SaveAddressResponse().id(e.getCode()).status(e.getErrorMessage()); + return new ResponseEntity(errorResponse,HttpStatus.BAD_REQUEST); } - catch (SaveAddressException sae) + catch (SaveAddressException e) { - SaveAddressResponse saveAddressResponse = new SaveAddressResponse(). - id(sae.getCode()) - .status(sae.getErrorMessage()); - return new ResponseEntity(saveAddressResponse,HttpStatus.BAD_REQUEST); + SaveAddressResponse errorResponse=new SaveAddressResponse().id(e.getCode()).status(e.getErrorMessage()); + return new ResponseEntity(errorResponse,HttpStatus.BAD_REQUEST); } catch (AddressNotFoundException e) { - SaveAddressResponse saveAddressResponse = new SaveAddressResponse() - .id(e.getCode()) - .status(e.getErrorMessage()); - return new ResponseEntity(saveAddressResponse,HttpStatus.BAD_REQUEST); + SaveAddressResponse errorResponse=new SaveAddressResponse().id(e.getCode()).status(e.getErrorMessage()); + return new ResponseEntity(errorResponse,HttpStatus.BAD_REQUEST); } + } - @RequestMapping(method = RequestMethod.GET, path = "/address/customer", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) - public ResponseEntity getAllAddresses(@RequestHeader("authorization") final String authorization) throws AuthorizationFailedException { - String access_token = authorization.split("Bearer ")[1]; - CustomerEntity customerEntity = customerService.getCustomer(access_token); - List addressEntityList = addressService.getAllAddress(customerEntity); - AddressListResponse addressListResponse = new AddressListResponse(); - for (AddressEntity addressEntity : addressEntityList){ - AddressList addressList = new AddressList(); - addressList.setId(UUID.fromString(addressEntity.getUuid())); - addressList.setLocality(addressEntity.getLocality()); - addressList.setCity(addressEntity.getCity()); - addressList.setFlatBuildingName(addressEntity.getFlatBuilNo()); - addressList.setPincode(addressEntity.getPincode()); - AddressListState addressListState = new AddressListState(); - addressListState.setId(UUID.fromString(addressEntity.getState().getUuid())); - addressListState.setStateName(addressEntity.getState().getStateName()); - addressList.setState(addressListState); - addressListResponse.addAddressesItem(addressList); + //getAddress From the db table endpoint definition which is of GET type + @RequestMapping(method = RequestMethod.GET,value = "/address/customer",produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResponseEntity getAllAddress(@RequestHeader("accessToken") String accessToken){ + try { + CustomerEntity customerEntity=customerServiceImpl.getCustomer(accessToken); + + if(customerEntity==null) + { + //if the accessToken doesnt exist in the db table + throw new AuthorizationFailedException("ATHR-001", "Customer is not Logged in."); + } + if(!customerServiceImpl.isUserLoggedIn(accessToken)) + { + //if the accessToken states that the customer has already logged out + throw new AuthorizationFailedException("ATHR-002", "Customer is logged out. Log in again to access this endpoint."); + } + if(customerServiceImpl.checkExpiryOfToken(accessToken)) + { + //if the customer has not logged out but the max time limit to stay logged in has exceeded. + throw new AuthorizationFailedException("ATHR-002", "Customer is logged out. Log in again to access this endpoint."); + } + //getting the object list of AddressEntity + List addressEntityList=addressServiceImpl.getAllAddresses(customerEntity); + List newAddressEntityList=new ArrayList<>();//empty AddressList + + // Creating an AddressListState object. + for(AddressEntity addressEntity:addressEntityList){ + AddressListState addressListState=new AddressListState().id(UUID.fromString(addressEntity.getUuid())).stateName(addressServiceImpl.getStateNameByStateId(addressEntity.getId())); + // Creating an AddressList object. + AddressList addressList=new AddressList().id(UUID.fromString(addressEntity.getUuid())).flatBuildingName(addressEntity.getFlatBuilNumber()).locality(addressEntity.getLocality()).city(addressEntity.getCity()).state(addressListState).pincode(addressEntity.getPincode()); + newAddressEntityList.add(addressList);//adding AddressList object to the list. + } + AddressListResponse addressListResponse=new AddressListResponse().addresses(newAddressEntityList); + return new ResponseEntity(addressListResponse,HttpStatus.OK); + } + catch (AuthorizationFailedException e) + { + ErrorResponse response=new ErrorResponse().code(e.getCode()).message(e.getErrorMessage()); + return new ResponseEntity(response,HttpStatus.BAD_REQUEST); } - return new ResponseEntity(addressListResponse, HttpStatus.OK); } + //deleteAddress endpoint definition with DELETE type method + @RequestMapping(value = "/address/{address_id}",method=RequestMethod.DELETE,produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResponseEntity deleteAddress(@PathVariable("address_id")final String addressUuid,@RequestHeader("accessToken")final String accessToken) + { + try { + boolean check=false;//creating a flag to check the values + CustomerEntity customerEntity=customerServiceImpl.getCustomer(accessToken); + if(customerEntity == null) { + //if the accessToken doesnt exist in the db table + throw new AuthorizationFailedException("ATHR-001", "Customer is not Logged in."); + } + if(!customerServiceImpl.isUserLoggedIn(accessToken)) { + //if the accessToken states that the customer has already logged out + throw new AuthorizationFailedException("ATHR-002", "Customer is logged out. Log in again to access this endpoint."); + } + if(customerServiceImpl.checkExpiryOfToken(accessToken)) { + //if the customer has not logged out but the max time limit to stay logged in has exceeded. + throw new AuthorizationFailedException("ATHR-002", "Customer is logged out. Log in again to access this endpoint."); + } + for(AddressEntity address : customerEntity.getAddress()){ + if(address.getUuid().equalsIgnoreCase(addressUuid)) + check = true; + } + //if(addressUuid.length()==0)//required hai + if(addressUuid.isEmpty()) + { + throw new AddressNotFoundException("ANF-005", "Address id can not be empty"); + } + AddressEntity addressEntity=addressServiceImpl.searchByUuid(addressUuid); + CustomerAddressEntity customerAddressEntity=addressServiceImpl.searchByAddressId(addressEntity.getId()); + + //if(customerAddressEntity.getCustomerId()!=customerEntity.getId())//nhi chl rhi + if(!check) + { + //if the customer id of the table doesnt match with the id of the accessToken customer then this exception is thrown + throw new AuthorizationFailedException("ATHR-004", "You are not authorized to view/update/delete any one else's address."); + } + if(addressEntity == null)//nhi chl rhi + { + throw new AddressNotFoundException("ANF-003", "No address by this id"); + } + addressServiceImpl.deleteAddress(addressEntity,customerAddressEntity);// Getting the AddressEntity object using the addressUuid. + DeleteAddressResponse response=new DeleteAddressResponse().id(UUID.fromString(addressEntity.getUuid())).status("ADDRESS DELETED SUCCESSFULLY"); + return new ResponseEntity(response,HttpStatus.OK); + + } catch (AuthorizationFailedException e) { + //if some constraints are not followed exception is thrown which is caught by catch block + ErrorResponse errorResponse=new ErrorResponse().code(e.getCode()).message(e.getErrorMessage()); + return new ResponseEntity(errorResponse,HttpStatus.BAD_REQUEST); + } + catch (AddressNotFoundException e) { + ErrorResponse errorResponse=new ErrorResponse().code(e.getCode()).message(e.getErrorMessage()); + return new ResponseEntity(errorResponse,HttpStatus.BAD_REQUEST); + } + + } } -*/ + diff --git a/FoodOrderingApp-api/src/main/java/com/upgrad/FoodOrderingApp/api/controller/CategoryController.java b/FoodOrderingApp-api/src/main/java/com/upgrad/FoodOrderingApp/api/controller/CategoryController.java new file mode 100644 index 0000000..cafa988 --- /dev/null +++ b/FoodOrderingApp-api/src/main/java/com/upgrad/FoodOrderingApp/api/controller/CategoryController.java @@ -0,0 +1,86 @@ +package com.upgrad.FoodOrderingApp.api.controller; + +import com.upgrad.FoodOrderingApp.api.model.*; +import com.upgrad.FoodOrderingApp.api.model.CategoriesListResponse; +import com.upgrad.FoodOrderingApp.api.model.CategoryListResponse; +import com.upgrad.FoodOrderingApp.api.model.ItemList; +import com.upgrad.FoodOrderingApp.service.businness.CategoryItemServiceImpl; +import com.upgrad.FoodOrderingApp.service.businness.CategoryServiceImpl; +import com.upgrad.FoodOrderingApp.service.businness.ItemServiceImpl; +import com.upgrad.FoodOrderingApp.service.entity.CategoryEntity; +import com.upgrad.FoodOrderingApp.service.entity.CategoryItemEntity; +import com.upgrad.FoodOrderingApp.service.entity.ItemEntity; +import com.upgrad.FoodOrderingApp.service.exception.CategoryNotFoundException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +@RestController +@CrossOrigin +@RequestMapping("/") +public class CategoryController { + + @Autowired + private CategoryServiceImpl categoryServiceImpl; + + @Autowired + private CategoryItemServiceImpl categoryItemServiceImpl; + + @Autowired + private ItemServiceImpl itemServiceImpl; + + //getAllCategory endpoint definition + @RequestMapping(value = "/category",method = RequestMethod.GET)//produces = MediaType.APPLICATION_JSON_UTF8_VALUE,consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResponseEntity getAllCategories() + { + + ListcategoryList=categoryServiceImpl.getAllCategories(); + List list = new ArrayList<>(); + for(CategoryEntity categoryEntity:categoryList) + { + CategoryListResponse categoryListResponse=new CategoryListResponse().id(UUID.fromString(categoryEntity.getUuid())).categoryName(categoryEntity.getCategoryName()); + list.add(categoryListResponse); + } + CategoriesListResponse response = new CategoriesListResponse().categories(list); + return new ResponseEntity (response, HttpStatus.FOUND); + //return new ResponseEntity (response, HttpStatus.OK); + } + + @RequestMapping(value = "/category/{category_id}", method = RequestMethod.GET)//,produces = MediaType.APPLICATION_JSON_UTF8_VALUE,consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResponseEntity getCategoryById(@PathVariable("category_id") final String categoryUuid) throws CategoryNotFoundException { + + try { + CategoryEntity categoryEntity = categoryServiceImpl.getCategoryUsingUuid(categoryUuid); + Listlist=categoryItemServiceImpl.getItemsUsingCategoryId(categoryEntity.getId()); + List itemList=new ArrayList<>(); + for(CategoryItemEntity categoryItemEntity:list) + { + ItemEntity itemEntity=itemServiceImpl.getItemUsingId(categoryItemEntity.getItemId()); + ItemList itemList1=new ItemList().id(UUID.fromString(itemEntity.getUuid())).itemName(itemEntity.getItemName()).price(itemEntity.getPrice()); + if(itemEntity.getType().equals("0")) + { + itemList1.setItemType(ItemList.ItemTypeEnum.VEG); + } + else if(itemEntity.getType().equals("1")) + { + itemList1.setItemType(ItemList.ItemTypeEnum.NON_VEG); + } + itemList.add(itemList1); + } + CategoryDetailsResponse response = new CategoryDetailsResponse().id( UUID.fromString(categoryEntity.getUuid())).categoryName(categoryEntity.getCategoryName()).itemList(itemList ); + return new ResponseEntity (response, HttpStatus.FOUND); + } + catch (CategoryNotFoundException e) + { + ErrorResponse response=new ErrorResponse().code(e.getCode()).message(e.getErrorMessage()); + return new ResponseEntity(response,HttpStatus.NOT_FOUND); + } + } + +} diff --git a/FoodOrderingApp-api/src/main/java/com/upgrad/FoodOrderingApp/api/controller/CustomerController.java b/FoodOrderingApp-api/src/main/java/com/upgrad/FoodOrderingApp/api/controller/CustomerController.java index 410cfa1..66ecd23 100644 --- a/FoodOrderingApp-api/src/main/java/com/upgrad/FoodOrderingApp/api/controller/CustomerController.java +++ b/FoodOrderingApp-api/src/main/java/com/upgrad/FoodOrderingApp/api/controller/CustomerController.java @@ -29,8 +29,7 @@ @RequestMapping("/")//to tell where the mapping in the db has to go public class CustomerController { - @Autowired -//control over where and how autowiring should be done in the code .Can be on constructors, variables class and its objects + @Autowired//control over where and how autowiring should be done in the code .Can be on constructors, variables class and its objects private CustomerService customerService; @Autowired @@ -40,11 +39,10 @@ public class CustomerController { private CustomerServiceImpl customerServiceImpl; //this is the signup endpoint function definition which is of POST type - @RequestMapping(method = RequestMethod.POST, path = "/customer/signup", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) -//api takes the input as Json format and output as Json format - public ResponseEntity signUp(final SignupCustomerRequest signupCustomerRequest) throws SignUpRestrictedException { + @RequestMapping(method= RequestMethod.POST,path = "/customer/signup", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)//api takes the input as Json format and output as Json format + public ResponseEntity signUp(final SignupCustomerRequest signupCustomerRequest) throws SignUpRestrictedException{ - final CustomerEntity customerEntity = new CustomerEntity();//which is going to be saved in db yeh sb store hoga db mei. + final CustomerEntity customerEntity=new CustomerEntity();//which is going to be saved in db yeh sb store hoga db mei. customerEntity.setUuid(UUID.randomUUID().toString());//this generates random uuid automatically .the intellij has the function customerEntity.setFirstName(signupCustomerRequest.getFirstName());//to set the firstname in the db customerEntity.setLastName(signupCustomerRequest.getLastName());//set the lastname in the db @@ -58,60 +56,86 @@ public ResponseEntity signUp(final SignupCustomerRequest SignupCustomerResponse signupCustomerResponse = new SignupCustomerResponse(); signupCustomerResponse.setId(responseCustomer.getUuid()); signupCustomerResponse.setStatus("CUSTOMER SUCCESSFULLY REGISTERED");//if no issues then customer is stored in db and this msg displayed - return new ResponseEntity(signupCustomerResponse, HttpStatus.CREATED); - } catch (SignUpRestrictedException e) { - SignupCustomerResponse signupCustomerResponse = new SignupCustomerResponse().id(e.getCode()).status(e.getErrorMessage()); - return new ResponseEntity(signupCustomerResponse, HttpStatus.BAD_REQUEST);//if issue the exception is thrown and the return is from the exception classes + return new ResponseEntity(signupCustomerResponse,HttpStatus.CREATED); + //return new ResponseEntity(signupCustomerResponse, HttpStatus.OK); + } + catch(SignUpRestrictedException e) { + SignupCustomerResponse signupCustomerResponse=new SignupCustomerResponse().id(e.getCode()).status(e.getErrorMessage()); + return new ResponseEntity(signupCustomerResponse,HttpStatus.BAD_REQUEST);//if issue the exception is thrown and the return is from the exception classes } } - //login endpoint functionality defined having method of post type - @RequestMapping(method = RequestMethod.POST, path = "/customer/login", produces = MediaType.APPLICATION_JSON_UTF8_VALUE, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) - public ResponseEntity login(@RequestHeader("authorization") final String authorization) throws AuthenticationFailedException { -//bearer has the contactnumber:password which is encoded in base64 format which is then passed along - byte[] decodedBytes = Base64.getDecoder().decode(authorization.split("Basic ")[1]);//splits the bearer + + //login endpoint functionality defined having method of post typ + @RequestMapping(method = RequestMethod.POST,path="/customer/login",produces = MediaType.APPLICATION_JSON_UTF8_VALUE,consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResponseEntitylogin(@RequestHeader("authorization")final String authorization)throws AuthenticationFailedException { +//the String authorization has the contactnumber:password which is encoded in base64 format which is then passed along + byte[] decodedBytes = Base64.getDecoder().decode(authorization);//.split("Basic ")[1]);//splits the bearer String decodedString = new String(decodedBytes); - String decodeArr[] = decodedString.split(":");//splits contact number and password as in betwee the 2=string of them is : + if (!decodedString.contains(":"))//if the encrypted form doesnt have : then tht means the inout string/value is wrong + throw new AuthenticationFailedException("ATH-003", "Incorrect format of decoded customer name and password"); try { - if (CustomerServiceImpl.validAuthFormat(authorization) == true) //if the function called holds true - { - final CustomerAuthEntity customerAuthEntity = customerServiceImpl.verifyAuthenticate(decodeArr[0], decodeArr[1]);//passing the contactnumber and password as array 0 and array 1 - CustomerEntity customerEntity = customerAuthEntity.getCustomer();//return customer according to the query - if (customerEntity == null) { - //if the returned customerEntity is null ie returns nulll then thsi exception with the error message is thrown - throw new AuthenticationFailedException("ATH-002", "Invalid Credentials"); - } - LoginResponse loginResponse = new LoginResponse().firstName(customerEntity.getFirstName()).lastName(customerEntity.getLastName()).contactNumber(customerEntity.getContactNumber()).emailAddress(customerEntity.getEmailAddress()).id(customerEntity.getUuid()) - .message("LOGGED IN SUCCESSFULLY"); // if all validations verified then customer login successfully - HttpHeaders headers = new HttpHeaders(); - List header = new ArrayList<>(); + String decodeArr[] = decodedString.split(":");//splits contact number and password as in betwee the 2=string of them is : + final CustomerAuthEntity customerAuthEntity = customerServiceImpl.verifyAuthenticate(decodeArr[0], decodeArr[1]);//passing the contactnumber and password as array 0 and array 1 + CustomerEntity customerEntity=customerServiceImpl.searchById(customerAuthEntity.getCustomerId()); + //CustomerEntity customerEntity = customerAuthEntity.getCustomer();//return customer according to the query + if (customerEntity == null) { + //if the returned customerEntity is null ie returns nulll then thsi exception with the error message is thrown + throw new AuthenticationFailedException("ATH-002", "Invalid Credentials"); + } + LoginResponse loginResponse = new LoginResponse().firstName(customerEntity.getFirstName()).lastName(customerEntity.getLastName()).contactNumber(customerEntity.getContactNumber()).emailAddress(customerEntity.getEmailAddress()).id(customerEntity.getUuid()) + .message("LOGGED IN SUCCESSFULLY"); // if all validations verified then customer login successfully + HttpHeaders headers = new HttpHeaders(); + headers.add("access-token", customerAuthEntity.getAccessToken()); + /* List header = new ArrayList<>(); header.add("access-token"); headers.setAccessControlExposeHeaders(header); - headers.add("access-token", customerAuthEntity.getAccessToken()); - return new ResponseEntity(loginResponse, headers, HttpStatus.OK);// if everything is verified then it return response and HTTPstatus.OK - } else { //if basic information for authentication is not provided in correct format then we throw this exception with an error message - throw new AuthenticationFailedException("ATH-003", "Incorrect format of decoded customer name and password"); - } + headers.add("access-token", customerAuthEntity.getAccessToken());*/ + return new ResponseEntity(loginResponse, headers, HttpStatus.OK);// if everything is verified then it return response and HTTPstatus.OK } catch (AuthenticationFailedException e) { LoginResponse loginresponse = new LoginResponse().id(e.getCode()).message(e.getErrorMessage()); return new ResponseEntity(loginresponse, HttpStatus.UNAUTHORIZED); - } } //this is logout endpoint method definition whch is of post type and throws AuthorizationFailed exception - @RequestMapping(method = RequestMethod.POST, path = "/customer/logout", produces = MediaType.APPLICATION_JSON_UTF8_VALUE, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) - public ResponseEntity logout(@RequestHeader("accessToken") final String accessToken) throws AuthorizationFailedException { + @RequestMapping(method = RequestMethod.POST, path = "/customer/logout", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)//,consumes=MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResponseEntity logout(@RequestHeader("accessToken") final String accessToken) throws AuthorizationFailedException{ try { - String[] aToken = accessToken.split("Bearer ");//splits the accesstoken which we got during the login and then checks the condtitions - CustomerAuthEntity customerAuthEntity = customerServiceImpl.logout(aToken[1]);//method logout is called which holds the business logic + //String[] aToken = accessToken.split("Bearer ");//splits the accesstoken which we got during the login and then checks the condtitions + CustomerAuthEntity customerAuthEntity = customerServiceImpl.logout(accessToken);//method logout is called which holds the business logic // if every validation fullfill then the we send this message to customer LogoutResponse response = new LogoutResponse().id(customerAuthEntity.getUuid()).message("LOGGED OUT SUCCESSFULLY"); return new ResponseEntity(response, HttpStatus.OK); - } catch (AuthorizationFailedException e)//if above validations conditions dont hold true then exception is raised which is caught in this block + } + catch(AuthorizationFailedException e)//if above validations conditions dont hold true then exception is raised which is caught in this block { - LogoutResponse logoutResponse = new LogoutResponse().id(e.getCode()).message(e.getErrorMessage()); - return new ResponseEntity(logoutResponse, HttpStatus.BAD_REQUEST); + LogoutResponse logoutResponse=new LogoutResponse().id(e.getCode()).message(e.getErrorMessage()); + return new ResponseEntity(logoutResponse,HttpStatus.BAD_REQUEST); } } -} \ No newline at end of file + + //this is the change password endpoint which is of put type + @RequestMapping(path = "/customer/password",method = RequestMethod.PUT)//,produces = MediaType.APPLICATION_JSON_UTF8_VALUE,consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResponseEntityupdateCustomerPassword(UpdatePasswordRequest updatePasswordRequest, @RequestHeader("accessToken")final String accessToken) throws UpdateCustomerException ,AuthorizationFailedException{ + try{ + //String bToken[]=bearerAuthorization.split("Bearer");//this split the access token which we get when we log in + CustomerEntity customerEntity = customerServiceImpl.getCustomer(accessToken);//this method is to bring the customer from the customer_Auth table having the same accessToken + CustomerEntity customerEntityNew = customerServiceImpl.updateCustomerPassword(updatePasswordRequest.getOldPassword(),updatePasswordRequest.getNewPassword(),customerEntity); + //final CustomerEntity customerEntity=customerService.updateCustomerPassword(bToken[1],oldPassword,newPassword);//the method which holds the logic in service class + UpdatePasswordResponse updatePasswordResponse=new UpdatePasswordResponse().id(customerEntity.getUuid()).status("CUSTOMER PASSWORD UPDATED SUCCESSFULLY"); + return new ResponseEntity(updatePasswordResponse,HttpStatus.OK);//if all hold true then this works with the above output + } + catch (AuthorizationFailedException e) + { + UpdatePasswordResponse response=new UpdatePasswordResponse().id(e.getCode()).status(e.getErrorMessage()); + return new ResponseEntity(response,HttpStatus.BAD_REQUEST); + } + catch (UpdateCustomerException e1)//if the password validations are not true then the updateCustomerException is thrown which is caught by this + { + UpdatePasswordResponse response=new UpdatePasswordResponse().id(e1.getCode()).status(e1.getErrorMessage());//this returns the error code with the error message + return new ResponseEntity(response,HttpStatus.BAD_REQUEST); + } + + } +} diff --git a/FoodOrderingApp-api/src/main/java/com/upgrad/FoodOrderingApp/api/controller/RestaurantController.java b/FoodOrderingApp-api/src/main/java/com/upgrad/FoodOrderingApp/api/controller/RestaurantController.java new file mode 100644 index 0000000..6402957 --- /dev/null +++ b/FoodOrderingApp-api/src/main/java/com/upgrad/FoodOrderingApp/api/controller/RestaurantController.java @@ -0,0 +1,156 @@ +package com.upgrad.FoodOrderingApp.api.controller; + +import com.upgrad.FoodOrderingApp.api.model.*; +import com.upgrad.FoodOrderingApp.service.businness.*; +import com.upgrad.FoodOrderingApp.service.entity.*; +import com.upgrad.FoodOrderingApp.service.exception.CategoryNotFoundException; +import com.upgrad.FoodOrderingApp.service.exception.RestaurantNotFoundException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.math.BigDecimal; +import java.util.*; + +@RestController// used tp create Restful web services using spring mvc. +@CrossOrigin//for the future use if we want t0 link the frontend to the backend and to avoid the CORS issue +public class RestaurantController { + + @Autowired //control over where and how autowiring should be done with the code. can be on constructors, variable class and its objects + private RestaurantServiceImpl restaurantServiceImpl; + + @Autowired + private AddressServiceImpl addressServiceImpl; + + @Autowired + private StateServiceImpl stateServiceImpl; + + @Autowired + private RestaurantCategoryServiceImpl restaurantCategoryServiceImpl; + + @Autowired + private CategoryServiceImpl categoryServiceImpl; + + @Autowired + private CategoryItemServiceImpl categoryItemServiceImpl; + + @Autowired + private ItemServiceImpl itemServiceImpl; + + //getRestaurantByName endpoint function definition and Request Method type is GET + @RequestMapping(value = "/restaurant/name/{restaurant_name}" , method = RequestMethod.GET) + public ResponseEntity getRestaurantByName(@PathVariable(value="restaurant_name") final String restaurantName) + { + try + { + List restaurantEntityList = restaurantServiceImpl.getRestaurantUsingName(restaurantName); //list type of Restaurant entity defined in serviceEntity + List restaurantListList = new ArrayList<>(); // list which is type of Restaurant List defined in api.model + + String category = new String(); // category type of String + List categories = new ArrayList<>(); // categories list type of string + for (RestaurantEntity restaurantEntity :restaurantEntityList) + { + long restaurantId = restaurantEntity.getId();//fetching the restaurantId from the RestaurantEntity + List restaurantCategoryEntityList = restaurantCategoryServiceImpl.getCategoryByRestaurantId(restaurantId); + for(RestaurantCategoryEntity restaurantCategoryEntity : restaurantCategoryEntityList) + { + + CategoryEntity categoryEntity = categoryServiceImpl.getCategoryUsingId(restaurantCategoryEntity.getCategoryId()); + categories.add(categoryEntity.getCategoryName()); //add category in list of categories + } + + Collections.sort(categories); // sort all the categories + category = categories.toString().substring(1,categories.toString().length()-1); + + AddressEntity addressEntity = addressServiceImpl.getAddressById(restaurantEntity.getAddressId());// fetch address using getAddressById and Store in addressEntity + StateEntity stateEntity =stateServiceImpl.getStateById(addressEntity.getStateId()); // fetch state using getStateById and store in stateEntity + + RestaurantDetailsResponseAddressState restaurantDetailsResponseAddressState = new RestaurantDetailsResponseAddressState().id(UUID.fromString(stateEntity.getUuid())).stateName(stateEntity.getStateName()); //getting id(stateId) , stateName + + // getting id, city , flatBuildNUmber, locality, pincode, state + RestaurantDetailsResponseAddress restaurantDetailsResponseAddress = new RestaurantDetailsResponseAddress().id(UUID.fromString(addressEntity.getUuid())).city(addressEntity.getCity()).flatBuildingName(addressEntity.getFlatBuilNumber()).locality(addressEntity.getLocality()).pincode(addressEntity.getPincode()).state(restaurantDetailsResponseAddressState); + + //getting id, restaurantName,photoUrl,customerRating , averagePrice,numberCustomerRated , address , Categories + RestaurantList restaurantList = new RestaurantList().id(UUID.fromString(restaurantEntity.getUuid())).restaurantName(restaurantEntity.getRestaurantName()).photoURL(restaurantEntity.getPhotoUrl()).customerRating(new BigDecimal(restaurantEntity.getCustomerRating())).averagePrice(restaurantEntity.getAveragePriceForTwo()).numberCustomersRated(restaurantEntity.getNumberOfCustomersRated()).address(restaurantDetailsResponseAddress).categories(category); + + restaurantListList.add(restaurantList); // add restaurantlist in List of Restaurant for final result + } + + RestaurantListResponse restaurantListResponse = new RestaurantListResponse().restaurants(restaurantListList); // object of restaurantList Response and pass list of restaurant + return new ResponseEntity(restaurantListResponse, HttpStatus.OK);// return the list of response to the customer + } + catch (RestaurantNotFoundException exc)//if the constraints are not taken care of or validations not followed then exception is thrown which is caught by the catch block + { + ErrorResponse response = new ErrorResponse().code(exc.getCode()).message(exc.getErrorMessage()); + return new ResponseEntity(response,HttpStatus.NOT_FOUND); + } + } + // this is getRestaurantById endpoint of RequestMethod of type GET + @RequestMapping(value = "/api/restaurant/{restaurant_id}", method = RequestMethod.GET) + public ResponseEntity getRestaurantById(@PathVariable(value ="restaurant_id") final String restaurantId) + { + try { + + RestaurantEntity restaurantEntity = restaurantServiceImpl.getRestaurantUsingUuid(restaurantId);// get RestaurantUsingId and store in object of RestaurantEntity + List restaurantCategoryEntityList = restaurantCategoryServiceImpl.getCategoryByRestaurantId(restaurantEntity.getId());// list of RestaurantCategoryEntity and find category type by using getCategoryBYRestaurantId + List categories= new ArrayList<>();//list of CategoryEntity type + for(RestaurantCategoryEntity restaurantCategoryEntity : restaurantCategoryEntityList) + { + CategoryEntity categoryEntity = categoryServiceImpl.getCategoryUsingId(restaurantCategoryEntity.getCategoryId()); + categories.add(categoryEntity); + } + List categoryListList = new ArrayList<>(); // list type of categoryList defined in api.model + for(CategoryEntity category : categories) + { + List list = categoryItemServiceImpl.getItemsUsingCategoryId(category.getId()); // list type of categoryItem entity and add items in list using getItemsUsingCategoryId + List itemListList = new ArrayList<>(); + + for(CategoryItemEntity categoryItemEntity :list) + { + + ItemEntity itemEntity = itemServiceImpl.getItemUsingId(categoryItemEntity.getItemId()); //create object of ItemEntity and store items using getItemsById + ItemList itemList =new ItemList().id(UUID.fromString(itemEntity.getUuid())).itemName(itemEntity.getItemName()).price(itemEntity.getPrice()); // getting the id, itemName, price + + if(itemEntity.getType().equals("0")) // if itemType value is 0 + { + itemList.setItemType(ItemList.ItemTypeEnum.VEG); // set Item Type is VEG + } + else if(itemEntity.getType().equals("1")) // if item value is 1 + { + itemList.setItemType(ItemList.ItemTypeEnum.NON_VEG); //set item Type is NONVEG + } + itemListList.add(itemList); // add itemList in list + } + CategoryList categoryList= new CategoryList(); + categoryList.id(UUID.fromString(category.getUuid())).categoryName(category.getCategoryName()).itemList(itemListList);//getting categoryUuid,categoryName, itemList + + categoryListList.add(categoryList); // add in categoryList + } + //sort category using Collections.sort and comparator + Collections.sort(categoryListList, new Comparator() + { + @Override + public int compare(CategoryList o1, CategoryList o2) + { + return o1.getCategoryName().compareTo(o2.getCategoryName()); + } + }); + AddressEntity addressEntity = addressServiceImpl.getAddressById(restaurantEntity.getAddressId());// object of restaurantEntity and getAddressById function + StateEntity stateEntity =stateServiceImpl.getStateById(addressEntity.getStateId()); + RestaurantDetailsResponseAddressState restaurantDetailsResponseAddressState = new RestaurantDetailsResponseAddressState().id(UUID.fromString(stateEntity.getUuid())).stateName(stateEntity.getStateName()); //getting id, stateId, stateName + RestaurantDetailsResponseAddress restaurantDetailsResponseAddress = new RestaurantDetailsResponseAddress().id(UUID.fromString(addressEntity.getUuid())).flatBuildingName(addressEntity.getFlatBuilNumber()).locality(addressEntity.getLocality()).city(addressEntity.getCity()).pincode(addressEntity.getPincode()).state(restaurantDetailsResponseAddressState);//getting id, flatBuildNumber, pincode, locality , city, state + + // getting id, restaurantName, photoUrl, customerRating , average price, average price for two, number of customerRated + RestaurantDetailsResponse restaurantDetailsResponse = new RestaurantDetailsResponse().id(UUID.fromString(restaurantEntity.getUuid())).restaurantName(restaurantEntity.getRestaurantName()).photoURL(restaurantEntity.getPhotoUrl()).customerRating(new BigDecimal(restaurantEntity.getCustomerRating())).averagePrice(restaurantEntity.getAveragePriceForTwo()).numberCustomersRated(restaurantEntity.getNumberOfCustomersRated()).address(restaurantDetailsResponseAddress).categories(categoryListList); + return new ResponseEntity(restaurantDetailsResponse,HttpStatus.FOUND);// return the Response of restaurant and HttpStatus.FOUND + } + catch(RestaurantNotFoundException e)//if the validations are not followed or the constraints are not properly handled then an exception is thrown which is caught by the catch block + { + ErrorResponse response =new ErrorResponse().code(e.getCode()).message(e.getErrorMessage()); + return new ResponseEntity(response,HttpStatus.NOT_FOUND); + } + } + + +} diff --git a/FoodOrderingApp-api/src/main/java/com/upgrad/FoodOrderingApp/api/exception/RestExceptionHandler.java b/FoodOrderingApp-api/src/main/java/com/upgrad/FoodOrderingApp/api/exception/RestExceptionHandler.java new file mode 100644 index 0000000..73778ae --- /dev/null +++ b/FoodOrderingApp-api/src/main/java/com/upgrad/FoodOrderingApp/api/exception/RestExceptionHandler.java @@ -0,0 +1,65 @@ +package com.upgrad.FoodOrderingApp.api.exception; + +import com.upgrad.FoodOrderingApp.api.model.ErrorResponse; +import com.upgrad.FoodOrderingApp.service.exception.*; +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.context.request.WebRequest; + +@ControllerAdvice +public class RestExceptionHandler { + + @ExceptionHandler(SignUpRestrictedException.class) + public ResponseEntitysignUpRestrictedException(SignUpRestrictedException exc, WebRequest request){ + return new ResponseEntity(new ErrorResponse().code(exc.getCode()).message(exc.getErrorMessage()), HttpStatus.NOT_FOUND); + } + + @ExceptionHandler(AuthenticationFailedException.class) + public ResponseEntityauthenticationFailedException(AuthenticationFailedException exc,WebRequest request){ + return new ResponseEntity(new ErrorResponse().code(exc.getCode()).message(exc.getErrorMessage()),HttpStatus.UNAUTHORIZED); + } + + @ExceptionHandler(UpdateCustomerException.class) + public ResponseEntityupdateCustomerException(UpdateCustomerException exc,WebRequest request){ + return new ResponseEntity(new ErrorResponse().code(exc.getCode()).message(exc.getErrorMessage()),HttpStatus.UNAUTHORIZED); + } + + @ExceptionHandler(CategoryNotFoundException.class) + public ResponseEntityupdateCustomerException(CategoryNotFoundException exc,WebRequest request){ + return new ResponseEntity(new ErrorResponse().code(exc.getCode()).message(exc.getErrorMessage()),HttpStatus.UNAUTHORIZED); + } + + @ExceptionHandler(AddressNotFoundException.class) + public ResponseEntityaddressNotFoundException(AddressNotFoundException exc,WebRequest request){ + return new ResponseEntity(new ErrorResponse().code(exc.getCode()).message(exc.getErrorMessage()),HttpStatus.NOT_FOUND); + } + + @ExceptionHandler(AuthorizationFailedException.class) + public ResponseEntityauthorizationFailedException(AuthorizationFailedException exc,WebRequest request){ + return new ResponseEntity(new ErrorResponse().code(exc.getCode()).message(exc.getErrorMessage()),HttpStatus.NOT_FOUND); + } + + @ExceptionHandler(CustomerNotFoundException.class) + public ResponseEntitycustomerNotFoundException(CategoryNotFoundException exc,WebRequest request){ + return new ResponseEntity(new ErrorResponse().code(exc.getCode()).message(exc.getErrorMessage()),HttpStatus.NOT_FOUND); + } + + @ExceptionHandler(ItemNotFoundException.class) + public ResponseEntityitemNotFoundException(ItemNotFoundException exc,WebRequest request){ + return new ResponseEntity(new ErrorResponse().code(exc.getCode()).message(exc.getErrorMessage()),HttpStatus.NOT_FOUND); + } + + @ExceptionHandler(RestaurantNotFoundException.class) + public ResponseEntityrestaurantNotFoundException(RestaurantNotFoundException exc,WebRequest request){ + return new ResponseEntity(new ErrorResponse().code(exc.getCode()).message(exc.getErrorMessage()),HttpStatus.NOT_FOUND); + } + + @ExceptionHandler(SaveAddressException.class) + public ResponseEntitysaveAddressException(SaveAddressException exc,WebRequest request){ + return new ResponseEntity(new ErrorResponse().code(exc.getCode()).message(exc.getErrorMessage()),HttpStatus.NOT_FOUND); + } + + +} diff --git a/FoodOrderingApp-api/target/classes/META-INF/FoodOrderingApp-api.kotlin_module b/FoodOrderingApp-api/target/classes/META-INF/FoodOrderingApp-api.kotlin_module new file mode 100644 index 0000000000000000000000000000000000000000..a49347afef10a9b5f95305e1058ba36adec7d6dd GIT binary patch literal 16 RcmZQzU|?ooU|@t|0RRA102TlM literal 0 HcmV?d00001 diff --git a/FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/controller/AddressController.class b/FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/controller/AddressController.class new file mode 100644 index 0000000000000000000000000000000000000000..2b1247373b0244625ab1c330427e0af941234529 GIT binary patch literal 10240 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 R{3f2ig?|r8Z##&7`#Y_%DxClT literal 0 HcmV?d00001 diff --git a/FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/controller/CategoryController.class b/FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/controller/CategoryController.class new file mode 100644 index 0000000000000000000000000000000000000000..83d72e83dab2b0085bac2215d3d22f98e2b68166 GIT binary patch literal 6781 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 fo^0m)rJTQveWvQ5je>C5iC|}W6S>ld~z{h literal 0 HcmV?d00001 diff --git a/FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/controller/CustomerController.class b/FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/controller/CustomerController.class index 571c3f051227fe7215553f36011f0e473cdb6ecc..39a18b48623e69d6ae991bba5b1ef850e6bf12b4 100644 GIT binary patch delta 3566 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 literal 0 HcmV?d00001 diff --git a/FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/exception/RestExceptionHandler.class b/FoodOrderingApp-api/target/classes/com/upgrad/FoodOrderingApp/api/exception/RestExceptionHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..98d3a763089fac9326c144112fce174a7d37b7c5 GIT binary patch literal 7934 zcmdU!>v9xT5Xb)~35;1*K?J!=6qE#%Q7(#vi%XJa151KQHV9E*cIL1d*qvEs&xDJ& zchOQy{i1$=Dyi}Td;%@C)EBYrvy+?VoY^{CY!%@H({t&bU-!Rf&Q9m&e}4Q4z!7|! z!7h|6Ok22=K{rYnyobxux+1L^X}#Zz4{$YuE?mptx;%RwGxC^|L0RsW<#n#KTxogI z@}$M3#ieyaS~sLskyb@ov(lQyj0NAqO@_56{Jb zO*!Q%9obk6U8g$jM84dgKiDH?{RYG7q8rxixL%1I&(4RTHy(LB@`FmQUbmgPZ}Yn@ zuM0m6>=u){P=m!V zs@RRXB)btgHGU_IZrOKu*>=M~@Vml}`0bbw>`S~nk(h%6N~c*N>N1yl7&Q1uAbfF; zvgoEf848aJm%*9`VmPA2Xu-~~;Q|-4p?A@d=?Wf^SiQ17j))@?^^et2+7oFNmHkzt zrmfl|Q4~fCq70srZ8Z^-HZ?x&H+<^aTo8o9k$p&YIIgW|*$+J1S-jR>?8T*iT{GuY zV=CY-Cl<4u?%_7W<{iKKpWgk}u)w*ra2@a8Vp^S7K4|H%41cellxuYu z`S;aJ^*5&3r$p>0?C~tm9&zGZQ-vmEq6T zl6c#~Z)!Mme17p<_ACE0!^9^QQ93U5keSpi1Wzm3;2(g8^Ebc&9xNG5_h5HshwD6IIk1c${aI(c+`NHr{Im)AnlPr{7 zb%KgLUcSj)!H`c0xpJzY9pBM7tinYypWM_xP+YpvBn=IN3N61qZgYBB=wEqqAnh5@ z&5&piO1Eszl`ha{f>WXPuxbm|9<7uG8V^p=q$!s3wz2W4Yx(ig*f7J(%Fm#t`b#d9 z$MNL}BxO{;B>wLzN4V#V%AGpIVaS%oa;2%l_{8Xy5lUd#D7I!+VA>JduS$jyBOcwi z55uTgoRpu_3}=jDDSt%K5ZNe5%HqtBGYX}8`Qt_Gq`z3mf9t^HdyM|?qdl9pjJ9j` zKLq=pj4rwqSlc|9#Y<#olMAp1dufjz0lb2qrt?+WcGI!GN9elz2;G+-qUXQ^ta*U7 zw6PxGsUOh$5Sj1jn&ojfG~@OqzVmS@3ihGDd9OYUU_W^rAiv%&It)4hyxI)&8V=I- z8M;uizdi%zHr?L9p>(Wu30Ag=^|S(Ovli=cYpf#*Ea`R>Z>D2ClVGjaVr|!Az114) zm;y_>9mU(}SQ`?oXSGq}vIcOvl=oU_Gbpt-V^TQ?0R1E3l;7JIJMD zZA!213DyoR)=4ea#nxEwDzGlnyLY1bvYl+6 Jm8-!N@GmLwwafqj literal 0 HcmV?d00001 diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/AddressService.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/AddressService.java index a6039e5..0557539 100644 --- a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/AddressService.java +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/AddressService.java @@ -5,22 +5,18 @@ import com.upgrad.FoodOrderingApp.service.entity.CustomerEntity; import com.upgrad.FoodOrderingApp.service.entity.StateEntity; import com.upgrad.FoodOrderingApp.service.exception.AddressNotFoundException; -import com.upgrad.FoodOrderingApp.service.exception.AuthorizationFailedException; import com.upgrad.FoodOrderingApp.service.exception.SaveAddressException; import java.util.List; -/* - * This AddressService interface gives the list of all the service that exist in the address service implementation class. - * Controller class will be calling the service methods by this interface. - */ public interface AddressService { - AddressEntity saveAddress(AddressEntity addressEntity, CustomerAddressEntity customerAddressEntity) throws - SaveAddressException; - AddressEntity getAddressByUUID(String addressId, CustomerEntity customerEntity) throws AuthorizationFailedException, - AddressNotFoundException; - List getAllAddress(CustomerEntity customer); - StateEntity getState(String stateUUID); - + AddressEntity saveAddress(AddressEntity addressEntity, final String stateUuid, final CustomerEntity customerEntity) throws SaveAddressException, AddressNotFoundException; + AddressEntity deleteAddress(AddressEntity addressEntity, CustomerAddressEntity customerAddressEntity); + //StateEntity getStateIdByUuid(final String stateUuid) throws AddressNotFoundException ; + List getAllAddresses(final CustomerEntity customerEntity); + //String getStateNameByStateId(final long stateId); + //AddressEntity searchByUuid(final String addressUuid); + //CustomerAddressEntity searchByAddressId(final long addressId); + //AddressEntity getAddressById(final Long addressId); } diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/AddressServiceImpl.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/AddressServiceImpl.java index 99a3be8..cbeb9c3 100644 --- a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/AddressServiceImpl.java +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/AddressServiceImpl.java @@ -1,99 +1,161 @@ -/* package com.upgrad.FoodOrderingApp.service.businness; import com.upgrad.FoodOrderingApp.service.dao.AddressDao; +import com.upgrad.FoodOrderingApp.service.dao.AddressDaoImpl; +import com.upgrad.FoodOrderingApp.service.dao.CustomerAddressDaoImpl; import com.upgrad.FoodOrderingApp.service.entity.AddressEntity; import com.upgrad.FoodOrderingApp.service.entity.CustomerAddressEntity; import com.upgrad.FoodOrderingApp.service.entity.CustomerEntity; import com.upgrad.FoodOrderingApp.service.entity.StateEntity; import com.upgrad.FoodOrderingApp.service.exception.AddressNotFoundException; -import com.upgrad.FoodOrderingApp.service.exception.AuthorizationFailedException; import com.upgrad.FoodOrderingApp.service.exception.SaveAddressException; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import java.util.List; - - -import java.util.List; - -@Service -public class AddressServiceImpl implements AddressService { +@Service//classes that provide some business functionality.It is to mark the class as a service provider +public class AddressServiceImpl implements AddressService{ @Autowired private AddressDao addressDao; + @Autowired + private AddressDaoImpl addressDaoImpl; + + @Autowired + private CustomerAddressDaoImpl customerAddressDaoImpl; + //saveAddress implementation and the business logic @Override @Transactional(propagation = Propagation.REQUIRED) - public AddressEntity saveAddress(AddressEntity addressEntity, CustomerAddressEntity customerAddressEntity) throws - SaveAddressException { - //validations + public AddressEntity saveAddress(AddressEntity addressEntity, String stateUuid, CustomerEntity customerEntity) throws SaveAddressException, AddressNotFoundException { - if(addressEntity.getPincode().isEmpty() || addressEntity.getFlatBuilNo().isEmpty()) { - throw new SaveAddressException("SAR-001", "No Fiels Can be empty"); + //if(checkFieldIsEmpty(addressEntity,stateUuid)){ + //if(checkFieldIsEmpty(addressEntity, stateUuid)) { + if(addressEntity.getFlatBuilNumber().length()==0||addressEntity.getCity().length()==0||addressEntity.getLocality().length()==0||addressEntity.getPincode().length()==0||stateUuid.length()==0) + {//if one of the fields is empty then this exception is thrown + throw new SaveAddressException("SAR-001", "No field can be empty"); + } + else if(!checkIfPincode(addressEntity)) + { + //if the pincode doesnt match with the constraints given + throw new SaveAddressException("SAR-002","Invalid pincode"); + } + else + { + StateEntity stateEntity=getStateIdByUuid(stateUuid);//getting the stateuuid from the state table + if(stateEntity==null)//if no such stateUuid exists then this particular exception is thrown + { + throw new AddressNotFoundException("ANF-002", "No state by this id"); + } + addressEntity.setStateId(stateEntity.getId()); + addressEntity=addressDao.saveAddress(addressEntity); + + CustomerAddressEntity customerAddressEntity=new CustomerAddressEntity();//creating the object + customerAddressEntity.setCustomerId(customerEntity.getId()); + customerAddressEntity.setAddressId(addressEntity.getId()); + //CustomerAddressDaoImpl.saveCustomerAddress(customerAddressEntity); + customerAddressDaoImpl.saveCustomerAddress(customerAddressEntity); + return addressEntity; } - - addressDao.saveAddress(addressEntity); - saveCustomerAddress(customerAddressEntity); - return addressEntity; } - - @Transactional - public AddressEntity saveAddress(AddressEntity addressEntity,final String stateUuid,final CustomerEntity customerEntity) throws SaveAddressException,AddressNotFoundException + //function to check if the input field is filled or empty + public boolean checkFieldIsEmpty(final AddressEntity addressEntity,final String stateUuid) { - if(!checkFields(addressEntity,stateUuid)) - { - throw new SaveAddressException("SAR-001","No field can be empty"); - } - else if(!verifyPincode(addressEntity)) - { - throw new SaveAddressException("SAR-002","Invalid pincode"); - } - else - { - StateEntity stateEntity = getState(stateUuid); - if(stateEntity == null) + /* if(addressEntity.getFlatBuilNumber().length() == 0 || addressEntity.getLocality().length() == 0 || addressEntity.getCity().length() == 0 || addressEntity.getPincode().length()==0||stateUuid.length()==0) { - throw new AddressNotFoundException("ANF-002","No state by this id"); + return true; } - addressEntity.setState(stateEntity.getId()); - addressEntity =addressDao.saveAddress(addressEntity); - + else + return false;*/ + + //the constraint was that when saving the addresses in the table no field should be empty + if (addressEntity.getFlatBuilNumber().isEmpty() || addressEntity.getLocality().isEmpty() || addressEntity.getCity().isEmpty() || addressEntity.getPincode().isEmpty() || addressEntity.getUuid().isEmpty()){ + //if(addressEntity.getFlatBuilNumber().length() == 0 || addressEntity.getLocality().length() == 0 ||addressEntity.getCity().length() == 0 || addressEntity.getPincode().length() == 0 || stateUuid.length() == 0) { + return true; + } else { + return false; + } + } + //function to check if the pincode constraint is handled or not + public boolean checkIfPincode(final AddressEntity addressEntity) + { + //the pincode should be of numbers and should be of length 6 only. + /* String pattern="^[0-9]{6}$"; + if(addressEntity.getPincode().matches(pattern)) + { + return true; + } + else + { + return false; + }*/ + final String pin=addressEntity.getPincode(); + try + { + long no=Long.parseLong(pin); + if(pin.length()!=6) + return false; + else + return true; + } + catch (NumberFormatException e) + { + return false; + } + } - } + //this is the business logic of deleting the address of the specified accessToken customer along with his/her valid addressId + @Override + @Transactional(propagation = Propagation.REQUIRED) + @Modifying + public AddressEntity deleteAddress(AddressEntity addressEntity, CustomerAddressEntity customerAddressEntity) { + customerAddressDaoImpl.deleteCustomerAddress(customerAddressEntity); + return addressDao.deleteAddress(addressEntity); } + //this method returns the state according to the StateUuid + @Transactional(propagation = Propagation.REQUIRED) + public StateEntity getStateIdByUuid(String stateUuid) throws AddressNotFoundException { + return addressDaoImpl.getStateIdByUuid(stateUuid); + } + //this is the method logic for returning all the addresses of the accessToken specified in the inout field @Override - public AddressEntity getAddressByUUID(String addressId, CustomerEntity customerEntity) throws - AuthorizationFailedException, AddressNotFoundException { - // if(addressDao.getAddressByUUID(addressId) == null) throw new AddressNotFoundException("ANF-003", "No address by this id"); - // else if(addressDao.getCustomerByAddress(addressId).getCustomer() != customerEntity) throw new AuthorizationFailedException("ATHR-004", "You are not authorized to view/update/delete any one else's address"); - return addressDao.getAddressByUUID(addressId); + @Transactional(propagation = Propagation.REQUIRED) + public List getAllAddresses(CustomerEntity customerEntity) { + return addressDao.getAllAddresses(customerEntity); } - + //this returns from the AddressDao the states from it stateId @Transactional(propagation = Propagation.REQUIRED) - public CustomerAddressEntity saveCustomerAddress(CustomerAddressEntity customerAddressEntity) { - return addressDao.saveCustomerAddress(customerAddressEntity); + public String getStateNameByStateId(long stateId) { + return addressDao.getStateNameByStateId(stateId); } - @Override - public List getAllAddress(CustomerEntity customer) { - return addressDao.getAllAddress(customer); + //this method returns the addressUuid made + @Transactional(propagation = Propagation.REQUIRED) + public AddressEntity searchByUuid(String addressUuid) { + return addressDao.searchByUuid(addressUuid); } - @Override - public StateEntity getState(String stateUUID) { - return addressDao.getStateByUUID(stateUUID); + + //this method searches for the addresses using the addressID + @Transactional(propagation = Propagation.REQUIRED) + public CustomerAddressEntity searchByAddressId(long addressId) { + return customerAddressDaoImpl.searchByAddressId(addressId); } + //this method returns address by addressId + @Transactional(propagation = Propagation.REQUIRED) + public AddressEntity getAddressById(Long addressId) { + return addressDao.getAddressById(addressId); + } } -*/ diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/CategoryItemServiceImpl.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/CategoryItemServiceImpl.java new file mode 100644 index 0000000..1ce344b --- /dev/null +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/CategoryItemServiceImpl.java @@ -0,0 +1,25 @@ +package com.upgrad.FoodOrderingApp.service.businness; + +import com.upgrad.FoodOrderingApp.service.dao.CategoryItemDaoImpl; +import com.upgrad.FoodOrderingApp.service.entity.CategoryItemEntity; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +public class CategoryItemServiceImpl { + + @Autowired + private CategoryItemDaoImpl categoryItemDaoImpl; + + + //@Transactional(propagation = Propagation.REQUIRED) + @Transactional + public List getItemsUsingCategoryId(final long categoryId){ + return categoryItemDaoImpl.getItemsUsingCategoryId(categoryId); + } + +} diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/CategoryServiceImpl.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/CategoryServiceImpl.java new file mode 100644 index 0000000..fe7610c --- /dev/null +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/CategoryServiceImpl.java @@ -0,0 +1,47 @@ +package com.upgrad.FoodOrderingApp.service.businness; + +import com.upgrad.FoodOrderingApp.service.dao.CategoryDaoImpl; +import com.upgrad.FoodOrderingApp.service.entity.CategoryEntity; +import com.upgrad.FoodOrderingApp.service.exception.CategoryNotFoundException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +public class CategoryServiceImpl { + + @Autowired + private CategoryDaoImpl categoryDaoImpl; + + @Transactional + public CategoryEntity getCategoryUsingId(final Long categoryId) + { + return categoryDaoImpl.getCategoryUsingId(categoryId); + } + + @Transactional + public CategoryEntity getCategoryUsingUuid(final String categoryUuid) throws CategoryNotFoundException{ + + if(categoryUuid.length()==0) + { + throw new CategoryNotFoundException("CNF-001", "Category id field should not be empty"); + } + CategoryEntity categoryEntity=categoryDaoImpl.getCategoryUsingUuid(categoryUuid); + if(categoryEntity==null) + { + throw new CategoryNotFoundException("CNF-002", "No category by this id"); + } + return categoryEntity; + } + + //@Transactional(propagation = Propagation.REQUIRED) + @Transactional + public List getAllCategories() + { + + return categoryDaoImpl.getAllCategories(); + } +} diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/CustomerService.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/CustomerService.java index b56826e..a9d7151 100644 --- a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/CustomerService.java +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/CustomerService.java @@ -15,8 +15,9 @@ public interface CustomerService { boolean checkContactNumber(final CustomerEntity customerEntity);//signup method validator function boolean checkPassword(final CustomerEntity customerEntity);//signup method validator function CustomerAuthEntity verifyAuthenticate(String contactNumber,String password)throws AuthenticationFailedException;//login method - //CustomerEntity getCustomer(String access_token) throws AuthorizationFailedException;//login method validator + CustomerEntity getCustomer(final String accessToken) throws AuthorizationFailedException;//login method validator //CustomerAuthEntity authorization(String access_token) throws AuthorizationFailedException;//logout method - CustomerEntity updateCustomerPassword(String accessToken,String oldPAssword,String newPAssword)throws AuthorizationFailedException, UpdateCustomerException, UpdateCustomerException; - + CustomerAuthEntity logout(final String accesstoken)throws AuthorizationFailedException;//logout + //public CustomerEntity getCustomer (final String accessToken) throws AuthorizationFailedException; + CustomerEntity updateCustomerPassword(String oldPassword,String newPassword,CustomerEntity customerEntity)throws UpdateCustomerException; } diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/CustomerServiceImpl.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/CustomerServiceImpl.java index 676aab7..538d4ff 100644 --- a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/CustomerServiceImpl.java +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/CustomerServiceImpl.java @@ -1,5 +1,7 @@ package com.upgrad.FoodOrderingApp.service.businness; +import com.upgrad.FoodOrderingApp.service.dao.CustomerAuthEntityDao; +import com.upgrad.FoodOrderingApp.service.dao.CustomerAuthEntityDaoImpl; import com.upgrad.FoodOrderingApp.service.dao.CustomerDao; import com.upgrad.FoodOrderingApp.service.dao.CustomerDaoImpl; import com.upgrad.FoodOrderingApp.service.entity.CustomerAuthEntity; @@ -18,7 +20,7 @@ import java.util.UUID; import java.util.regex.Pattern; -@Service +@Service//classes that provide some business functionality.It is to mark the class as a service provider public class CustomerServiceImpl implements CustomerService { @Autowired @@ -27,6 +29,9 @@ public class CustomerServiceImpl implements CustomerService { @Autowired private CustomerDaoImpl customerDaoImpl; + @Autowired + private CustomerAuthEntityDaoImpl customerAuthEntityDaoImpl; + @Autowired private PasswordCryptographyProvider passwordCryptographyProvider;//for encryption of password we already have in intellij @@ -116,80 +121,110 @@ public boolean checkPassword(CustomerEntity customerEntity) { @Override @Transactional(propagation =Propagation.REQUIRED) public CustomerAuthEntity verifyAuthenticate(String contactNumber, String password) throws AuthenticationFailedException { - - CustomerEntity customerEntity=customerDao.getCustomerByContactNumber(contactNumber); + //boolean checkData=false; + CustomerEntity customerEntity=customerDaoImpl.getCustomerByContactNumber(contactNumber);//Using customerDaoImpl to find the user based on contact number if(customerEntity==null)// if contact number provided by customer is not exist in database throw new AuthenticationFailedException("ATH-001", "This contact number has not been registered!"); + else{ + //verifyauthenticate the user and encrypt the password received from the Customer with the salt added as well + final String encryptedPassword = PasswordCryptographyProvider.encrypt(password, customerEntity.getSalt());//for pssword encryption checker + + if (encryptedPassword.equals(customerEntity.getPassword())) + { + //customer has been authenticated and verified .Now create a JWT token + JwtTokenProvider jwtTokenProvider = new JwtTokenProvider(encryptedPassword); + CustomerAuthEntity customerAuthEntity = new CustomerAuthEntity();//store data and token in db using CustomerAuthEntity + + /*customerAuthEntity = customerDaoImpl.getCustomerAuthEntityTokenByUUID(customerEntity.getUuid()); + if (customerAuthEntity != null) { + checkData = true; + } else { + customerAuthEntity = new CustomerAuthEntity(); + }*/ - final String encryptedPassword = PasswordCryptographyProvider.encrypt(password, customerEntity.getSalt());//for pssword encryption checker + //setting values in the customer_auth table + customerAuthEntity.setUuid(UUID.randomUUID().toString());//set the uuid randomly generated in customer_ath table + customerAuthEntity.setCustomerId(customerEntity.getId());//set the customerid which is the primary key of customer table "id" + final ZonedDateTime now = ZonedDateTime.now();//finding the current login time of customer + final ZonedDateTime expiresAt = now.plusHours(8);//automatic logout time or the time the customer/user can remain logged in + customerAuthEntity.setLoginAt(now);//login time is set in the column at the time of login of customer + customerAuthEntity.setExpiresAt(expiresAt);//setting the max login or the expirytime in db - if (encryptedPassword.equals(customerEntity.getPassword())) { - JwtTokenProvider jwtTokenProvider = new JwtTokenProvider(encryptedPassword); - CustomerAuthEntity customerAuthEntity = new CustomerAuthEntity(); - customerAuthEntity.setUuid(UUID.randomUUID().toString()); - customerAuthEntity.setCustomer(customerEntity); - ZonedDateTime now = ZonedDateTime.now(); - ZonedDateTime expiresAt = now.plusHours(8); + //customerAuthEntity.setAccessToken(jwtTokenProvider.generateToken(customerEntity.getUuid(), now, expiresAt)); + String accessToken = jwtTokenProvider.generateToken(customerEntity.getUuid(), now, expiresAt); + customerAuthEntity.setAccessToken(accessToken);//setting the accessToken in the customer_Auth table + customerAuthEntity.setLogoutAt(null); - customerAuthEntity.setLoginAt(ZonedDateTime.now()); + // if already uuid so new token generate for existing previous will merge else another user with new token + /* if (checkData) + customerDaoImpl.createAuthToken(customerAuthEntity); + else + customerDaoImpl.updateLoginInfo(customerAuthEntity);*/ + + customerAuthEntityDaoImpl.create(customerAuthEntity);// Persist the CustomerAuthEntity generated, in the database + customerDaoImpl.updateUser(customerEntity);//updating the user/customer value in customer,customer_auth table + return customerAuthEntity;// Return the CustomerAuthEntity generated + + /*customerAuthEntity.setLoginAt(ZonedDateTime.now()); customerAuthEntity.setExpiresAt(expiresAt); customerAuthEntity.setAccessToken(jwtTokenProvider.generateToken(customerEntity.getUuid(), now, expiresAt)); - return customerAuthEntity; - } else { - // if the password does not match with the existing password present in database - throw new AuthenticationFailedException("ATH-002", "Invalid Credentials"); - } + return customerAuthEntity;*/ + + } else { + // if the password does not match with the existing password present in database + throw new AuthenticationFailedException("ATH-002", "Invalid Credentials"); + } + }} + + @Transactional + public CustomerEntity getCustomerByContactNumber(final String contactNumber) { + //runs the method according to the sql queries and returns the value/result of the query + return customerDaoImpl.getCustomerByContactNumber(contactNumber); } - //function called in customer controller to check valid format and it returns boolean value + @Transactional + public CustomerEntity searchByUuid(final String uuid) { + //runs the method according to the sql queries and returns the value/result of the query + return customerDaoImpl.searchByUuid(uuid); + } + + @Transactional + public CustomerEntity searchById(final long id) { + //runs the method according to the sql queries and returns the value/result of the query + return customerDaoImpl.searchById(id); + } + + + /*//function called in customer controller to check valid format and it returns boolean value public static boolean validAuthFormat(String authorization) { String regexStr = "^[0-9]{10}$"; byte[] decode = Base64.getDecoder().decode(authorization.split("Basic ")[1]); String decodedText = new String(decode); String[] decodedArray = decodedText.split(":"); - String basic = authorization.split("Basic")[1]; if(contactNumberVerified(decodedArray[0]) && passwordVerified(decodedArray[1]) ){ - return true; - } - else { - return false; - } - } + return true;} + else {return false;} + } // function called in validAuthFormat to verify contact number or ATH-003 public static boolean contactNumberVerified(String cno) { String str= "^[0-9]{10}$"; if(cno.matches(str)) - { return true; - } else - { return false; - } } // function called in validAuthFormat to verifyPassword public static boolean passwordVerified(String password) { if(password.length()<8 || !password.matches("(?=.*[0-9]).*")|| !password.matches("(?=.*[A-Z]).*")|| !password.matches("(?=.*[~!@#$%^&*()_-]).*")) - { - return false; - } + return false; + return true; } - - - /* @Override - public CustomerEntity getCustomer(String access_token) throws AuthorizationFailedException { - - authorization(access_token); - CustomerAuthEntity customerAuthEntity = customerDao.getAuthTokenByAccessToken(access_token); - return customerAuthEntity.getCustomer(); - }*/ - //-------------->Logout //checks whether customer has loggedout based on access token /*@Transactional(propagation = Propagation.REQUIRED) @@ -203,7 +238,6 @@ else if(customerAuthEntity!=null&&customerAuthEntity.getLoginAt()!=null){ //if (customerAuthEntity.getLogoutAt() != null) { throw new AuthorizationFailedException("ATHR-002", "Customer is logged out. Log in again to access this endpoint."); } - else if (customerAuthEntity!=null && ZonedDateTime.now().isAfter(customerAuthEntity.getExpiresAt())) { throw new AuthorizationFailedException("ATHR-003", "Your session is expired. Log in again to access this endpoint."); } @@ -214,98 +248,111 @@ else if (customerAuthEntity!=null && ZonedDateTime.now().isAfter(customerAuthEnt return customerAuthEntity; } }*/ + + //logout implementation and validation @Transactional(propagation = Propagation.REQUIRED) - public CustomerAuthEntity logout(final String accesstoken)throws AuthorizationFailedException + public CustomerAuthEntity logout(final String accessToken)throws AuthorizationFailedException { - CustomerAuthEntity customerAuthEntity = customerDaoImpl.getAuthTokenByAccessToken(accesstoken); - if(customerAuthEntity== null) + //returns the customer with that particular accessToken from the db + CustomerAuthEntity customerAuthEntity = customerAuthEntityDaoImpl.getAuthTokenByAccessToken(accessToken); + if(customerAuthEntity == null) { //if access token provided by the customer not exist in database throw new AuthorizationFailedException("ATHR-001","Customer is not logged in."); } - if(!checkIsCustomerLoggedIn(accesstoken)) + if(!isUserLoggedIn(accessToken)) //if the method returns false ie. there is no customer in the db with the accessToken anymore { - // if the access token provided by the customer exist in database, but customer is already logout - throw new AuthorizationFailedException("ATHR-002","Customer is logged out.Login again to access this endpoint."); + throw new AuthorizationFailedException("ATHR-002", "Customer is logged out. Log in again to access this endpoint."); } - if(verifyTokenExpiry(accesstoken)) + + if(checkExpiryOfToken(accessToken))//if the expiry time or the max login time has exceeded even though the customer was loggedin he/she gets automatically loggedout { - // if the token of customer is expired - throw new AuthorizationFailedException("ATHR-002","Customer is logged out.Login again to access this endpoint."); + throw new AuthorizationFailedException("ATHR-002", "Customer is logged out. Log in again to access this endpoint."); } - ZonedDateTime now=ZonedDateTime.now(); - long diff = customerAuthEntity.getExpiresAt().compareTo(now); - if(customerAuthEntity.getLogoutAt()!= null) + ZonedDateTime now = ZonedDateTime.now();//getting the current time + long difference = customerAuthEntity.getExpiresAt().compareTo(now);//finding the difference of maxlogin time and current time + if(customerAuthEntity.getLogoutAt() != null)//if the logout is not null { - // - throw new AuthorizationFailedException("AUTH-002","Customer is logged out.Login again to access this endpoint."); + throw new AuthorizationFailedException("AUTH-002", "Customer is logged out. Log in again to access this endpoint."); } - else if(diff<0) + else if (difference < 0) { - // if token is exist in database, but session has expired - throw new AuthorizationFailedException("AUTH-003","Your session is expired.Login again to access this endpoint."); + //if the difference is in negative ie. current time-maxLogin or expiry that means the login session has expired and customer is automatically logged out + throw new AuthorizationFailedException("AUTH-003", "Your session is expired. Log in again to access this endpoint."); } else { - customerAuthEntity.setLogoutAt(now); - customerDaoImpl.updateCustomer(customerAuthEntity); + customerAuthEntity.setLogoutAt(now);//changiing the logout time + customerAuthEntityDaoImpl.updateCustomer(customerAuthEntity);//changing the values in table } return customerAuthEntity; } // this function is used to verify the token of customer @Transactional - public boolean verifyTokenExpiry(final String accessToken) - { - CustomerAuthEntity custAuthEntity = customerDaoImpl.getAuthTokenByAccessToken(accessToken); - if(custAuthEntity== null) - return true; - - ZonedDateTime now =ZonedDateTime.now(); - long diff=custAuthEntity.getExpiresAt().compareTo(now); - if(diff<0) - { + public boolean checkExpiryOfToken(final String accessToken) { + CustomerAuthEntity customerAuthEntity = customerAuthEntityDaoImpl.getAuthTokenByAccessToken(accessToken); + if(customerAuthEntity == null) { return true; } + ZonedDateTime now = ZonedDateTime.now(); + long diff = customerAuthEntity.getExpiresAt().compareTo(now); + if(diff < 0) + return true; else - { return false; - } } - // function called in logout method to check customer is login or not + @Transactional - public boolean checkIsCustomerLoggedIn(final String accesstoken) - { - CustomerAuthEntity custAuthEntity =customerDaoImpl.getAuthTokenByAccessToken(accesstoken); - if(custAuthEntity== null) + public boolean isUserLoggedIn(final String accessToken) { + //checking of the customer is still logged in or not + CustomerAuthEntity customerAuthEntity = customerAuthEntityDaoImpl.getAuthTokenByAccessToken(accessToken); + if(customerAuthEntity == null) return false; - ZonedDateTime logoutAt =custAuthEntity.getLogoutAt(); - ZonedDateTime loginAt =custAuthEntity.getLoginAt(); - - if(logoutAt== null) + ZonedDateTime logoutAt = customerAuthEntity.getLogoutAt(); + ZonedDateTime loginAt = customerAuthEntity.getLoginAt(); + if(logoutAt == null) return true; - long checkDifference = loginAt.compareTo(logoutAt); - if(checkDifference>0) + + long diff = loginAt.compareTo(logoutAt); + if(diff > 0) return true; else return false; } - //--------------------> + @Transactional + public CustomerEntity getCustomer (final String accessToken) throws AuthorizationFailedException { + final CustomerAuthEntity customerAuthEntity = customerAuthEntityDaoImpl.getAuthTokenByAccessToken(accessToken); + if(customerAuthEntity == null) { + //if the access token is null ie the customerAuthEntity is null means there is no customer logged in of that particular accessToken + throw new AuthorizationFailedException("ATHR-001", "Customer is not Logged in."); + } + ZonedDateTime now = ZonedDateTime.now(); + long difference = customerAuthEntity.getExpiresAt().compareTo(now); + CustomerEntity customerEntity = customerDaoImpl.searchById(customerAuthEntity.getCustomerId()); + return customerEntity; + } + + //password updatation method implementation @Override @Transactional(propagation = Propagation.REQUIRED) - public CustomerEntity updateCustomerPassword(String accessToken, String oldPassword, String newPassword)throws AuthorizationFailedException, UpdateCustomerException { - CustomerAuthEntity customerAuthEntity=customerDaoImpl.getAuthTokenByAccessToken(accessToken);//rturns the daoimpl function on the query + public CustomerEntity updateCustomerPassword(final String oldPassword,final String newPassword,final CustomerEntity customerEntity)throws UpdateCustomerException { + /*CustomerAuthEntity customerAuthEntity=customerDaoImpl.getAuthTokenByAccessToken(accessToken);//rturns the daoimpl function on the query CustomerEntity customerEntity=customerAuthEntity.getCustomer();//returns the customer - final String decryptedPassword = passwordCryptographyProvider.encrypt(oldPassword,customerAuthEntity.getCustomer().getSalt());//to encrypt the password and return the old pasword along with the salt - if(oldPassword==null||newPassword==null) { - //of password whether old or new is empty then this exception is thrown + final String decryptedPassword = passwordCryptographyProvider.encrypt(oldPassword,customerAuthEntity.getCustomer().getSalt());*///to encrypt the password and return the old pasword along with the salt + CustomerEntity customerAuthEntity1=new CustomerEntity(); + final String oldPasswordString=passwordCryptographyProvider.encrypt(oldPassword, customerEntity.getSalt()); + final String newPasswordString=passwordCryptographyProvider.encrypt(oldPassword, customerEntity.getSalt()); + if( oldPassword.length()==0 || newPassword.length()==0 )//if password whether old or new is empty then this exception is thrown + { throw new UpdateCustomerException("UCR-003", "No field should be empty"); } - if(customerAuthEntity==null) + customerAuthEntity1.setPassword(newPassword);//set the new password + /* if(customerAuthEntity==null) { //if no customer is in the login state throw new AuthorizationFailedException("ATHR-001","Customer is not Logged in."); @@ -317,24 +364,26 @@ else if(customerAuthEntity!=null&&customerAuthEntity.getLogoutAt()!=null){ else if(customerAuthEntity!=null && ZonedDateTime.now().isAfter(customerAuthEntity.getExpiresAt())){ //if his access token time has expired or the time for the person to remain loggedin has exceeded throw new AuthorizationFailedException("ATHR-003", "Your session is expired. Log in again to access this endpoint."); - } - else if(!passwordVerified(newPassword)){ + }*/ + if(!checkPassword(customerAuthEntity1)){ //if the new password doesnt match the constraints throw new UpdateCustomerException("UCR-001","Weak password!"); } - else if(!customerAuthEntity.getCustomer().getPassword().matches(oldPassword)) + if(!customerEntity.getPassword().matches(oldPasswordString)) { //if the old password stored in db doesnt match with the password u input then this exception is thrown throw new UpdateCustomerException("UCR-004","Incorrect old password!"); } - else + customerEntity.setPassword(newPasswordString);//set the password as new password + customerDaoImpl.updateUser(customerEntity);//make changes into the db + return customerEntity; + /* else { //if above all validations constraints are verified and there is no issue then we encrypt the new password along with the salt String encrpted[]=passwordCryptographyProvider.encrypt(newPassword); customerEntity.setSalt(encrpted[0]); customerEntity.setPassword(encrpted[1]); customerDaoImpl.updateCustomer(customerEntity); - return customerAuthEntity.getCustomer(); - } + return customerAuthEntity.getCustomer();}*/ } } \ No newline at end of file diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/ItemService.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/ItemService.java new file mode 100644 index 0000000..5a57f11 --- /dev/null +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/ItemService.java @@ -0,0 +1,7 @@ +package com.upgrad.FoodOrderingApp.service.businness; + +import com.upgrad.FoodOrderingApp.service.entity.ItemEntity; + +public interface ItemService { + public ItemEntity getItemUsingId(final long itemId); +} diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/ItemServiceImpl.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/ItemServiceImpl.java new file mode 100644 index 0000000..a50c5fb --- /dev/null +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/ItemServiceImpl.java @@ -0,0 +1,23 @@ +package com.upgrad.FoodOrderingApp.service.businness; + +import com.upgrad.FoodOrderingApp.service.dao.ItemDaoImpl; +import com.upgrad.FoodOrderingApp.service.entity.ItemEntity; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +@Service +public class ItemServiceImpl implements ItemService{ + + @Autowired + private ItemDaoImpl itemDaoImpl; + + @Override + //@Transactional(propagation = Propagation.REQUIRED) + @Transactional + public ItemEntity getItemUsingId(final long itemId){ + + return itemDaoImpl.getItemUsingId(itemId); + } +} diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/RestaurantCategoryService.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/RestaurantCategoryService.java new file mode 100644 index 0000000..e938a9a --- /dev/null +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/RestaurantCategoryService.java @@ -0,0 +1,12 @@ +package com.upgrad.FoodOrderingApp.service.businness; + +import com.upgrad.FoodOrderingApp.service.entity.RestaurantCategoryEntity; + +import java.util.List; + +public interface RestaurantCategoryService { + + public List getCategoryByRestaurantId(final long rId); + + public List getRestaurantByCategoryId(final long cid); +} diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/RestaurantCategoryServiceImpl.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/RestaurantCategoryServiceImpl.java new file mode 100644 index 0000000..9098f49 --- /dev/null +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/RestaurantCategoryServiceImpl.java @@ -0,0 +1,29 @@ +package com.upgrad.FoodOrderingApp.service.businness; + + +import com.upgrad.FoodOrderingApp.service.dao.RestaurantCategoryDaoImpl; +import com.upgrad.FoodOrderingApp.service.entity.RestaurantCategoryEntity; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service// defines that class provides some business fuctionality, used to mark class as a service provider +public class RestaurantCategoryServiceImpl implements RestaurantCategoryService{ + + @Autowired //control where and how autowiring should be done in the code , it can be constructors , variable class etc + private RestaurantCategoryDaoImpl restaurantCategoryDao; + + @Transactional// ask your code that this function executes must have a transaction + public List getCategoryByRestaurantId(final long rId) + { + return restaurantCategoryDao.getCategoriesByRestaurantId(rId); // return value of category using restaurantId + } + + @Transactional + public List getRestaurantByCategoryId(final long cid) + { + return restaurantCategoryDao.getRestaurantByCategoryId(cid); // return restaurant using categoryId + } +} diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/RestaurantService.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/RestaurantService.java new file mode 100644 index 0000000..2f09db5 --- /dev/null +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/RestaurantService.java @@ -0,0 +1,15 @@ +package com.upgrad.FoodOrderingApp.service.businness; + +import com.upgrad.FoodOrderingApp.service.entity.RestaurantEntity; +import com.upgrad.FoodOrderingApp.service.exception.RestaurantNotFoundException; + +import java.util.List; + +public interface RestaurantService { + + public List getRestaurantUsingName(final String rName) throws RestaurantNotFoundException; + + public RestaurantEntity getRestaurantUsingId(final long rId); + + public RestaurantEntity getRestaurantUsingUuid(final String rUuid) throws RestaurantNotFoundException; +} diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/RestaurantServiceImpl.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/RestaurantServiceImpl.java new file mode 100644 index 0000000..c1e927d --- /dev/null +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/RestaurantServiceImpl.java @@ -0,0 +1,54 @@ +package com.upgrad.FoodOrderingApp.service.businness; + + +import com.upgrad.FoodOrderingApp.service.dao.RestaurantDaoImpl; +import com.upgrad.FoodOrderingApp.service.entity.RestaurantEntity; +import com.upgrad.FoodOrderingApp.service.exception.RestaurantNotFoundException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service // class that provide some business functionality , used to mark class as a service provider +public class RestaurantServiceImpl implements RestaurantService { + + @Autowired + private RestaurantDaoImpl restaurantDaoImpl; + + + //function getRestaurantByName and return list type of RestaurantEntity + @Transactional// means of telling your code when it executes that it must have a Transaction. + public List getRestaurantUsingName(final String rName) throws RestaurantNotFoundException + { + if (rName.length()==0) // if length of restaurant name is 0 then throw exception + { + throw new RestaurantNotFoundException("RNF-003","Restaurant name field should not be empty"); + } + else + { + //if it validates then provide value using function defined in restaurantDao + return restaurantDaoImpl.getRestaurantUsingName(rName); + } + } + + @Transactional + public RestaurantEntity getRestaurantUsingId(final long rId) + { + return restaurantDaoImpl.getRestaurantUsingId(rId); // return value using getRestaurantUsingId defined in restaurantDao + } + + @Transactional + public RestaurantEntity getRestaurantUsingUuid(final String rUuid) throws RestaurantNotFoundException + { + if(rUuid.length()==0) // if length of restaurantUuid is 0 then throw exception + { + throw new RestaurantNotFoundException("RNF-002","Restaurant id field should not be empty"); + } + RestaurantEntity restaurantEntity =restaurantDaoImpl.getRestaurantByUuid(rUuid); // object of RestaurantEntity + if (restaurantEntity== null) // if value of restaurantEntity is null then throw exception + throw new RestaurantNotFoundException("RNF-001","No restaurant by this id"); + + return restaurantEntity; + } +} diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/StateService.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/StateService.java new file mode 100644 index 0000000..5b2fca5 --- /dev/null +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/StateService.java @@ -0,0 +1,7 @@ +package com.upgrad.FoodOrderingApp.service.businness; + +import com.upgrad.FoodOrderingApp.service.entity.StateEntity; + +public interface StateService { + StateEntity getStateById(final Long stateId); +} diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/StateServiceImpl.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/StateServiceImpl.java new file mode 100644 index 0000000..f829574 --- /dev/null +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/businness/StateServiceImpl.java @@ -0,0 +1,24 @@ +package com.upgrad.FoodOrderingApp.service.businness; + +import com.upgrad.FoodOrderingApp.service.dao.StateDaoImpl; +import com.upgrad.FoodOrderingApp.service.entity.StateEntity; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +@Service//classes that provide some business functionality.It is to mark the class as a service provider +public class StateServiceImpl implements StateService{ + + @Autowired + private StateDaoImpl stateDao; + + //return the stateId according to the stateId passed + @Override + //@Transactional(propagation = Propagation.REQUIRED) + @Transactional + public StateEntity getStateById(Long stateId) + { + return stateDao.getStateById(stateId); + } +} diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/AddressDao.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/AddressDao.java index 06f39c4..b074520 100644 --- a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/AddressDao.java +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/AddressDao.java @@ -1,23 +1,18 @@ package com.upgrad.FoodOrderingApp.service.dao; import com.upgrad.FoodOrderingApp.service.entity.AddressEntity; -import com.upgrad.FoodOrderingApp.service.entity.CustomerAddressEntity; import com.upgrad.FoodOrderingApp.service.entity.CustomerEntity; import com.upgrad.FoodOrderingApp.service.entity.StateEntity; import java.util.List; -/* - * This AddressDao interface gives the list of all the dao methods that exist in the address dao implementation class. - * Service class will be calling the dao methods by this interface. - */ public interface AddressDao { - AddressEntity saveAddress(AddressEntity addressEntity); - AddressEntity getAddressByUUID(String addressId); - CustomerAddressEntity getCustomerByAddress(String addressId); - CustomerAddressEntity saveCustomerAddress(CustomerAddressEntity customerAddressEntity); + //StateEntity getStateIdByUuid(final String stateUuid); + List getAllAddresses(final CustomerEntity customerEntity); + String getStateNameByStateId(final long stateId); AddressEntity deleteAddress(AddressEntity addressEntity); - List getAllAddress(CustomerEntity customer); - StateEntity getStateByUUID(String uuid); + AddressEntity searchByUuid(final String addressUuid); + AddressEntity getAddressById(final Long addressId); + } diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/AddressDaoImpl.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/AddressDaoImpl.java index ffbf908..fc546b2 100644 --- a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/AddressDaoImpl.java +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/AddressDaoImpl.java @@ -5,76 +5,161 @@ import com.upgrad.FoodOrderingApp.service.entity.CustomerEntity; import com.upgrad.FoodOrderingApp.service.entity.StateEntity; import org.springframework.stereotype.Repository; -import org.springframework.transaction.annotation.Transactional; -import javax.persistence.EntityManager; -import javax.persistence.NoResultException; -import javax.persistence.PersistenceContext; +import javax.persistence.*; +import java.util.ArrayList; import java.util.List; -/** - * AddressDao class provides the database access for all the endpoints in address controller. - */ -@Repository -@Transactional +@Repository//indicate that the class provides the mechanism for storage, retrieval, search, update and delete operation on objects. public class AddressDaoImpl implements AddressDao{ - //When a container of the application(be it a Java EE container or any other custom container like Spring) manages the lifecycle of the Entity Manager, the Entity Manager is said to be Container Managed. The most common way of acquiring a Container Managed EntityManager is to use @PersistenceContext annotation on an EntityManager attribute. - @PersistenceContext - private EntityManager entityManager; + @PersistenceUnit//set of entities such that for any persistent identity there is a unique entity instance. + private EntityManagerFactory entityManagerFactory; - //function @Override public AddressEntity saveAddress(AddressEntity addressEntity) { - entityManager.persist(addressEntity); + EntityManager entityManager=entityManagerFactory.createEntityManager(); + EntityTransaction transaction=entityManager.getTransaction(); + try + { + transaction.begin(); + entityManager.persist(addressEntity); + transaction.commit(); + } + catch (Exception e) + { + transaction.rollback(); + return null; + } + AddressEntity addressEntity1=searchByUuid(addressEntity.getUuid()); + addressEntity.setId(addressEntity1.getId()); + entityManager.close(); return addressEntity; } - @Override - public AddressEntity getAddressByUUID(String addressId) { - try { - return entityManager.createNamedQuery("getAddressByUUID", AddressEntity.class).setParameter("uuid", addressId).getSingleResult(); - } catch (NoResultException nre) { + //@Override + public StateEntity getStateIdByUuid(String stateUuid) { + /* EntityManager entityManager = entityManagerFactory.createEntityManager(); + TypedQuery query = entityManager. + createQuery("select u from StateEntity u where u.uuid = :uuid", StateEntity.class); + List list = query.setParameter("uuid", stateUuid).getResultList(); + entityManager.close(); + if(list.size() == 0) return null; - } + else + return list.get(0);*/ + EntityManager entityManager = entityManagerFactory.createEntityManager(); + //the query is written which searches for the required in the database + TypedQuery query = entityManager.createQuery("select s from StateEntity s where s.uuid = :uuid", StateEntity.class); + List list = query.setParameter("uuid", stateUuid).getResultList(); + entityManager.close(); + if(list.size() == 0) + return null; + else + return list.get(0); } - @Override - public CustomerAddressEntity getCustomerByAddress(String addressId) { - try { - return entityManager.createNamedQuery("userByAddress", CustomerAddressEntity.class).setParameter("uuid", addressId).getSingleResult(); - } catch (NoResultException nre) { - return null; + @Override//this method retruns all the address oof the particular accessToken's customer from the table + public List getAllAddresses(CustomerEntity customerEntity) { + /*EntityManager entityManager = entityManagerFactory.createEntityManager(); + TypedQuery query = entityManager.createQuery("select c from CustomerAddressEntity c where c.customerId = :customerId", CustomerAddressEntity.class); + query.setParameter("customerId", customerEntity.getId()); + List customerAddressEntityList = query.getResultList(); + List list = new ArrayList<>(); + for(CustomerAddressEntity customerAddressEntity : customerAddressEntityList) { + TypedQuery query2 = entityManager.createQuery("select u from AddressEntity u where u.id = :id", AddressEntity.class); + query2.setParameter("id", customerAddressEntity.getAddressId()); + AddressEntity addressEntity = query2.getSingleResult(); + list.add(addressEntity); } + entityManager.close(); + return list;*/ + EntityManager entityManager = entityManagerFactory.createEntityManager(); + //the query is written which searches for the required in the database + TypedQuery query = entityManager + .createQuery("select c from CustomerAddressEntity c where c.customerId = :customerId", CustomerAddressEntity.class); + query.setParameter("customerId", customerEntity.getId()); + List customerAddressEntityList = query.getResultList(); + List list = new ArrayList<>(); + for(CustomerAddressEntity customerAddressEntity : customerAddressEntityList) { + TypedQuery query2 = entityManager + .createQuery("select a From AddressEntity a where a.id = :id", AddressEntity.class); + query2.setParameter("id", customerAddressEntity.getAddressId()); + AddressEntity addressEntity = query2.getSingleResult(); + list.add(addressEntity); + } + entityManager.close(); + return list; } @Override - public CustomerAddressEntity saveCustomerAddress(CustomerAddressEntity customerAddressEntity) { - entityManager.persist(customerAddressEntity); - return customerAddressEntity; + public String getStateNameByStateId(long stateId) { + EntityManager entityManager = entityManagerFactory.createEntityManager(); + //the query is written which searches for the required in the database + TypedQuery query = entityManager. + createQuery("select u from StateEntity u where u.id = :id", StateEntity.class); + List list = query.setParameter("id", stateId).getResultList(); + + entityManager.close(); + + if(list.size() == 0) + return null; + else + return list.get(0).getStateName(); } @Override public AddressEntity deleteAddress(AddressEntity addressEntity) { - entityManager.remove(addressEntity); + EntityManager entityManager = entityManagerFactory.createEntityManager(); + EntityTransaction transaction = entityManager.getTransaction(); + + try { + transaction.begin(); + AddressEntity searched = entityManager.find(AddressEntity.class, addressEntity.getId()); + entityManager.remove(searched); + transaction.commit(); + } + catch (Exception e) + { + transaction.rollback(); + return null; + } + entityManager.close(); return addressEntity; } @Override - public List getAllAddress(CustomerEntity customer){ - try { - return entityManager.createNamedQuery("getAllAddress", AddressEntity.class).setParameter("customer", customer).getResultList(); - } catch (NoResultException nre) { + public AddressEntity searchByUuid(String addressUuid) { + EntityManager entityManager=entityManagerFactory.createEntityManager(); + //the query is written which searches for the required in the database + TypedQuery query = entityManager.createQuery("select u from AddressEntity u where u.uuid = :uuid", AddressEntity.class); + List list = query.setParameter("uuid", addressUuid).getResultList(); + entityManager.close(); + if(list.size() == 0) return null; - } + else + return list.get(0); } @Override - public StateEntity getStateByUUID(String uuid) { + public AddressEntity getAddressById(Long addressId) { + EntityManager entityManager = entityManagerFactory.createEntityManager(); + List list = new ArrayList<>(); + try { - return entityManager.createNamedQuery("getStateByUUID", StateEntity.class).setParameter("uuid",uuid).getSingleResult(); - } catch (NoResultException nre) { + //the query is written which searches for the required in the database + TypedQuery query = entityManager.createQuery("Select u from AddressEntity u where u.id = :addressId", AddressEntity.class); + query.setParameter("addressId", addressId); + list = query.getResultList(); + + } catch (Exception e) { return null; } + + entityManager.close(); + if(list.size() == 0) + return null; + else + return list.get(0); } } diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/CategoryDaoImpl.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/CategoryDaoImpl.java new file mode 100644 index 0000000..cc79067 --- /dev/null +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/CategoryDaoImpl.java @@ -0,0 +1,81 @@ +package com.upgrad.FoodOrderingApp.service.dao; + +import com.upgrad.FoodOrderingApp.service.entity.CategoryEntity; +import org.springframework.stereotype.Repository; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.PersistenceUnit; +import javax.persistence.TypedQuery; +import java.util.ArrayList; +import java.util.List; + +@Repository +public class CategoryDaoImpl { + + @PersistenceUnit + private EntityManagerFactory entityManagerFactory; + + public CategoryEntity getCategoryUsingId(final Long categoryId) + { + EntityManager entityManager=entityManagerFactory.createEntityManager(); + Listlist=new ArrayList<>(); + try + { + TypedQuery query = entityManager.createQuery("select c from CategoryEntity c where c.id = :categoryId", CategoryEntity.class); + query.setParameter("categoryId", categoryId); + list = query.getResultList(); + } + catch (Exception e) + { + System.out.println(e); + return null; + } + entityManager.close(); + if(list.size() == 0) + return null; + else + return list.get(0); + } + + public CategoryEntity getCategoryUsingUuid(final String categoryUuid){ + EntityManager entityManager=entityManagerFactory.createEntityManager(); + Listlist=new ArrayList<>(); + try + { + TypedQuery query = entityManager.createQuery("select c from CategoryEntity c where c.uuid = :categoryUuid", CategoryEntity.class); + query.setParameter("categoryUuid", categoryUuid); + list = query.getResultList(); + } + catch (Exception e) + { + System.out.println(e); + return null; + } + entityManager.close(); + if(list.size()==0) + return null; + else + return list.get(0); + } + + public List getAllCategories(){ + EntityManager entityManager=entityManagerFactory.createEntityManager(); + Listlist=new ArrayList<>(); + try + { + TypedQuery query = entityManager.createQuery("SELECT c FROM CategoryEntity c ORDER BY c.categoryName", CategoryEntity.class); + list = query.getResultList(); + } + catch (Exception e) + { + System.out.println(e); + return null; + } + entityManager.close(); + /*if(list.size()==0) + return null; + else*/ + return list; + } +} diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/CategoryItemDaoImpl.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/CategoryItemDaoImpl.java new file mode 100644 index 0000000..7357a06 --- /dev/null +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/CategoryItemDaoImpl.java @@ -0,0 +1,39 @@ +package com.upgrad.FoodOrderingApp.service.dao; + +import com.upgrad.FoodOrderingApp.service.entity.CategoryItemEntity; +import org.springframework.stereotype.Repository; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.PersistenceUnit; +import javax.persistence.TypedQuery; +import java.util.ArrayList; +import java.util.List; + +@Repository +public class CategoryItemDaoImpl { + + @PersistenceUnit + private EntityManagerFactory entityManagerFactory; + + public List getItemsUsingCategoryId(final long categoryId) + { + EntityManager entityManager=entityManagerFactory.createEntityManager(); + Listlist=new ArrayList<>(); + try + { + TypedQuery query = entityManager.createQuery("SELECT c FROM CategoryItemEntity c WHERE c.categoryId = :categoryId", CategoryItemEntity.class); + query.setParameter("categoryId", categoryId); + list = query.getResultList(); + + } catch (Exception e) { + System.out.println(e); + return null; + } + entityManager.close(); + /* if(list.size()==0) + return null; + else*/ + return list; + } +} diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/CustomerAddressDaoImpl.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/CustomerAddressDaoImpl.java new file mode 100644 index 0000000..b1a58d3 --- /dev/null +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/CustomerAddressDaoImpl.java @@ -0,0 +1,65 @@ +package com.upgrad.FoodOrderingApp.service.dao; + +import com.upgrad.FoodOrderingApp.service.entity.CustomerAddressEntity; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Repository; + +import javax.persistence.*; +import java.util.List; + +@Repository +public class CustomerAddressDaoImpl { + + @Autowired + private EntityManagerFactory entityManagerFactory; + + @PersistenceContext + private EntityManager entityManager; + + public CustomerAddressEntity searchByAddressId(long addressId) { + EntityManager entityManager = entityManagerFactory.createEntityManager(); + + TypedQuery query = entityManager.createQuery("select c from CustomerAddressEntity c where c.addressId = :addressId", CustomerAddressEntity.class); + List list = query.setParameter("addressId", addressId).getResultList(); + if(list.size() == 0) + return null; + else + return list.get(0); + } + + + public CustomerAddressEntity saveCustomerAddress(CustomerAddressEntity customerAddressEntity) { + EntityManager entityManager = entityManagerFactory.createEntityManager(); + EntityTransaction tx = entityManager.getTransaction(); + + try { + + tx.begin(); + entityManager.persist(customerAddressEntity); + tx.commit(); + + } catch (Exception e) { + tx.rollback(); + return null; + } + return customerAddressEntity; + } + + public CustomerAddressEntity deleteCustomerAddress(CustomerAddressEntity customerAddressEntity) { + EntityManager entityManager = entityManagerFactory.createEntityManager(); + EntityTransaction tx = entityManager.getTransaction(); + + try { + + tx.begin(); + entityManager.remove(customerAddressEntity); + tx.commit(); + } + catch (Exception e) + { + tx.rollback(); + return null; + } + return customerAddressEntity; + } +} diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/CustomerAuthEntityDao.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/CustomerAuthEntityDao.java new file mode 100644 index 0000000..a11041b --- /dev/null +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/CustomerAuthEntityDao.java @@ -0,0 +1,9 @@ +package com.upgrad.FoodOrderingApp.service.dao; + +import com.upgrad.FoodOrderingApp.service.entity.CustomerAuthEntity; + +public interface CustomerAuthEntityDao { + CustomerAuthEntity create(final CustomerAuthEntity customerAuthEntity); + CustomerAuthEntity updateCustomer(final CustomerAuthEntity customerAuthEntity); + CustomerAuthEntity getAuthTokenByAccessToken(final String accessToken); +} diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/CustomerAuthEntityDaoImpl.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/CustomerAuthEntityDaoImpl.java new file mode 100644 index 0000000..5a02b02 --- /dev/null +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/CustomerAuthEntityDaoImpl.java @@ -0,0 +1,71 @@ +package com.upgrad.FoodOrderingApp.service.dao; + +import com.upgrad.FoodOrderingApp.service.entity.CustomerAuthEntity; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Repository; + +import javax.persistence.*; +import java.util.List; + +@Repository +public class CustomerAuthEntityDaoImpl implements CustomerAuthEntityDao{ + + @Autowired + private EntityManagerFactory entityManagerFactory; + + @PersistenceContext + private EntityManager entityManager; + + @Override + public CustomerAuthEntity create(CustomerAuthEntity customerAuthEntity) { + EntityManager entityManager = entityManagerFactory.createEntityManager(); + EntityTransaction tx = entityManager.getTransaction(); + try { + tx.begin(); + entityManager.persist(customerAuthEntity); + tx.commit(); + } catch (Exception e) { + tx.rollback(); + System.out.println(e); + return null; + } + return customerAuthEntity; + } + + @Override + public CustomerAuthEntity updateCustomer(CustomerAuthEntity customerAuthEntity) { + EntityManager entityManager = entityManagerFactory.createEntityManager(); + EntityTransaction tx = entityManager.getTransaction(); + + try { + + tx.begin(); + entityManager.merge(customerAuthEntity); + tx.commit(); + System.out.println("customerAuthEntity updated with UUID : " + customerAuthEntity.getUuid()); + + } catch (Exception e) { + tx.rollback(); + System.out.println(e); + return null; + } + return customerAuthEntity; + } + + @Override + public CustomerAuthEntity getAuthTokenByAccessToken(String accessToken) { + EntityManager entityManager = entityManagerFactory.createEntityManager(); + TypedQuery query = entityManager.createQuery("select c from CustomerAuthEntity c where c.accessToken = :accessToken", CustomerAuthEntity.class); + List list = query.setParameter("accessToken", accessToken).getResultList(); + if(list.size() == 0) + return null; + else + return list.get(0); + }/** + try { + return entityManager.createNamedQuery("customerAuthByAccesstoken", CustomerAuthEntity.class).setParameter("accessToken", accessToken).getSingleResult(); + } catch (NoResultException nre) { + return null; + } }*/ + +} diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/CustomerDao.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/CustomerDao.java index 5bd85c1..69334ea 100644 --- a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/CustomerDao.java +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/CustomerDao.java @@ -4,16 +4,13 @@ import com.upgrad.FoodOrderingApp.service.entity.CustomerEntity; public interface CustomerDao { - //logic how customer is saved in db CustomerEntity saveCustomer(CustomerEntity customerEntity); - //CustomerEntity getCustomer(CustomerEntity customerEntity); CustomerEntity getCustomerByContactNumber(String contactNumber); - //fetch the contactnumber se customer.if exist //CustomerEntity getCustomer(String contactNumber); //boolean getCustomer(boolean b); - CustomerAuthEntity getAuthTokenByAccessToken(String access_token); + //CustomerAuthEntity getAuthTokenByAccessToken(String access_token); } diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/CustomerDaoImpl.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/CustomerDaoImpl.java index 0925321..a52d4f2 100644 --- a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/CustomerDaoImpl.java +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/CustomerDaoImpl.java @@ -5,10 +5,8 @@ import com.upgrad.FoodOrderingApp.service.entity.CustomerEntity; import org.springframework.stereotype.Repository; -import javax.persistence.EntityManager; -import javax.persistence.EntityTransaction; -import javax.persistence.NoResultException; -import javax.persistence.PersistenceContext; +import javax.persistence.*; +import java.util.List; @Repository//indicate that the class provides the mechanism for storage, retrieval, search, update and delete operation on objects. public class CustomerDaoImpl implements CustomerDao{ @@ -24,12 +22,35 @@ public CustomerEntity saveCustomer(CustomerEntity customerEntity) //this method } public CustomerEntity getCustomerByContactNumber(final String contactNumber) //to check whether there already exists a customer in the db having the same contactnumber - { + {/* try { return entityManager.createNamedQuery("customerByContactNumber", CustomerEntity.class).setParameter("contactNumber", contactNumber).getSingleResult(); } catch (NoResultException nre) { return null; - } + }*/ + + //the query is written which searches for the required in the database + TypedQuery query = entityManager.createQuery("SELECT c from CustomerEntity c where c.contactNumber = :contactNumber", + CustomerEntity.class); + + List list = query.setParameter("contactNumber", contactNumber).getResultList(); + if(list.size() == 0) + return null; + else + return list.get(0); + } + + public CustomerEntity searchById(final long id) { + + TypedQuery query = entityManager.createQuery("SELECT c from CustomerEntity c where c.id = :id", + CustomerEntity.class); + + List list = query.setParameter("id", id).getResultList(); + if(list.size() == 0) + return null; + else + return list.get(0); + } public CustomerAuthEntity createAuthToken(CustomerAuthEntity customerAuthEntity) @@ -37,12 +58,6 @@ public CustomerAuthEntity createAuthToken(CustomerAuthEntity customerAuthEntity) this.entityManager.persist(customerAuthEntity); return customerAuthEntity; } - - - public void updateCustomer(CustomerEntity updatedCustomerEntity) { - this.entityManager.merge(updatedCustomerEntity); - } - public CustomerAuthEntity updateCustomer(final CustomerAuthEntity customerAuthEntity) { EntityTransaction entityTransaction=entityManager.getTransaction(); @@ -60,13 +75,66 @@ public CustomerAuthEntity updateCustomer(final CustomerAuthEntity customerAuthE } return customerAuthEntity; } + public void updateUser(final CustomerEntity customerEntity) { + try { + entityManager.merge(customerEntity); - public CustomerAuthEntity getAuthTokenByAccessToken(final String accessToken) { + } catch (Exception e) { + System.out.println(e); + } + } + + + /*public CustomerAuthEntity getAuthTokenByAccessToken(final String accessToken) { try { return entityManager.createNamedQuery("customerAuthByAccesstoken", CustomerAuthEntity.class).setParameter("accessToken", accessToken).getSingleResult(); } catch (NoResultException nre) { return null; } + }*/ + public CustomerAuthEntity updateLoginInfo(final CustomerAuthEntity userAuthEntity) { + try { + entityManager.persist(userAuthEntity); + return userAuthEntity; + } catch (NoResultException nre) { + return null; + } + } + + public CustomerAuthEntity getCustomerAuthEntityTokenByUUID(final String uuid) { + /*try { + return entityManager.createNamedQuery("userAuthTokenByUUID", CustomerAuthEntity.class).setParameter("uuid", UUID).getSingleResult(); + } catch (NoResultException nre) { + return null; + }*/ + TypedQuery query = entityManager.createQuery("SELECT c from CustomerEntity c where c.uuid = :uuid",CustomerEntity.class); + + List list = query.setParameter("uuid", uuid).getResultList(); + if(list.size() == 0) + return null; + try { + return entityManager.createNamedQuery("userAuthTokenByUUID", CustomerAuthEntity.class).setParameter("uuid", uuid).getSingleResult(); + } catch (NoResultException nre) { + return null;} + + } + + public CustomerAuthEntity updateUserLogOut(final CustomerAuthEntity customerAuthEntity) { + try { + return entityManager.merge(customerAuthEntity); + } catch (NoResultException nre) { + return null; + } + } + public CustomerEntity searchByUuid(final String uuid) { + + TypedQuery query = entityManager.createQuery("SELECT c from CustomerEntity c where c.uuid = :uuid",CustomerEntity.class); + + List list = query.setParameter("uuid", uuid).getResultList(); + if(list.size() == 0) + return null; + else + return list.get(0); } diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/ItemDaoImpl.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/ItemDaoImpl.java new file mode 100644 index 0000000..337b7e0 --- /dev/null +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/ItemDaoImpl.java @@ -0,0 +1,41 @@ +package com.upgrad.FoodOrderingApp.service.dao; + +import com.upgrad.FoodOrderingApp.service.entity.ItemEntity; +import org.springframework.stereotype.Repository; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.PersistenceUnit; +import javax.persistence.TypedQuery; +import java.util.ArrayList; +import java.util.List; + +@Repository +public class ItemDaoImpl { + + @PersistenceUnit + private EntityManagerFactory entityManagerFactory; + + public ItemEntity getItemUsingId(final long itemId) + { + EntityManager entityManager=entityManagerFactory.createEntityManager(); + Listlist=new ArrayList<>(); + try + { + TypedQuery query = entityManager.createQuery("select i from ItemEntity i where i.id = :itemId", ItemEntity.class); + query.setParameter("itemId", itemId); + list = query.getResultList(); + } + catch (Exception e) + { + System.out.println(e); + return null; + } + entityManager.close(); + if(list.size()==0) + return null; + else + return list.get(0); + } + +} diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/RestaurantCategoryDao.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/RestaurantCategoryDao.java new file mode 100644 index 0000000..b99423a --- /dev/null +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/RestaurantCategoryDao.java @@ -0,0 +1,12 @@ +package com.upgrad.FoodOrderingApp.service.dao; + +import com.upgrad.FoodOrderingApp.service.entity.RestaurantCategoryEntity; + +import java.util.List; + +public interface RestaurantCategoryDao { + + public List getCategoriesByRestaurantId(final long retaurantId); + + public List getRestaurantByCategoryId(final long categoryId); +} diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/RestaurantCategoryDaoImpl.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/RestaurantCategoryDaoImpl.java new file mode 100644 index 0000000..b5788d7 --- /dev/null +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/RestaurantCategoryDaoImpl.java @@ -0,0 +1,56 @@ +package com.upgrad.FoodOrderingApp.service.dao; + +import com.upgrad.FoodOrderingApp.service.entity.RestaurantCategoryEntity; +import org.springframework.stereotype.Repository; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.TypedQuery; +import java.util.ArrayList; +import java.util.List; + +@Repository // indicates that the class provide mechanism for storage , retreival , search and delete operation on objects +public class RestaurantCategoryDaoImpl implements RestaurantCategoryDao{ + + @PersistenceContext // set of entity such that for any persistent identity there is unique identity instance + private EntityManager entityManager; + + + // function to get the categories using restaurant id + public List getCategoriesByRestaurantId(final long retaurantId) + { + // list of type RestaurantCategoryEntity + List restaurantCategoryEntityList = new ArrayList<>(); + try + { + // query written for our requirement using database + TypedQuery query= entityManager.createQuery(" SELECT r FROM RestaurantCategoryEntity r WHERE r.restaurantId =:restaurantId",RestaurantCategoryEntity.class); + query.setParameter("restaurantId",retaurantId); + restaurantCategoryEntityList = query.getResultList(); + } + catch (Exception e) + { + return null; + } + entityManager.close(); // closes an entity manager to release its persistence context and other resources + return restaurantCategoryEntityList; + } + + //function to getRestaurantBy the categoryId + public List getRestaurantByCategoryId(final long categoryId) + { + List restaurantCategoryEntityList = new ArrayList<>(); + try + { + TypedQuery query = entityManager.createQuery("SELECT r FROM RestaurantCategoryEntity r WHERE r.categoryId = :categoryId",RestaurantCategoryEntity.class); + query.setParameter("categoryId",categoryId); + restaurantCategoryEntityList = query.getResultList(); + } + catch (Exception ex) + { + return null; + } + entityManager.close(); + return restaurantCategoryEntityList; + } +} diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/RestaurantDao.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/RestaurantDao.java new file mode 100644 index 0000000..d3a7769 --- /dev/null +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/RestaurantDao.java @@ -0,0 +1,14 @@ +package com.upgrad.FoodOrderingApp.service.dao; + +import com.upgrad.FoodOrderingApp.service.entity.RestaurantEntity; + +import java.util.List; + +public interface RestaurantDao { + + public RestaurantEntity getRestaurantUsingId(final long restaurantId); + + public List getRestaurantUsingName(final String restaurantName); + + public RestaurantEntity getRestaurantByUuid(final String restaurantUuid); +} diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/RestaurantDaoImpl.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/RestaurantDaoImpl.java new file mode 100644 index 0000000..afdf5ae --- /dev/null +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/RestaurantDaoImpl.java @@ -0,0 +1,82 @@ +package com.upgrad.FoodOrderingApp.service.dao; + +import com.upgrad.FoodOrderingApp.service.entity.RestaurantEntity; +import org.springframework.stereotype.Repository; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.TypedQuery; +import java.util.ArrayList; +import java.util.List; + +@Repository +public class RestaurantDaoImpl implements RestaurantDao { + + @PersistenceContext //set of entities such that for any persistent identity there is a unique entity instance. + private EntityManager entityManager; + + // function to get Restaurant using the id + public RestaurantEntity getRestaurantUsingId(final long restaurantId) + { + // list of type RestaurantEntity + List restaurantEntityList = new ArrayList<>(); + try + { + // query which used to complete requirement using database + TypedQuery query =entityManager.createQuery("SELECT r from RestaurantEntity WHERE r.id := restaurantId ORDER BY r.restaurantName",RestaurantEntity.class); + query.setParameter("restaurantId",restaurantId); + restaurantEntityList = query.getResultList(); + } + catch (Exception ex) + { + return null; + } + entityManager.close();//closes an entity manager to release its persistence context and other resources + if(restaurantEntityList.size()==0) + return null; + else + return restaurantEntityList.get(0); + } + + // function to get the restaurant using name + public List getRestaurantUsingName(final String restaurantName) + { + // list of type restaurantEntity + List restaurantEntityList= new ArrayList<>(); + String str= "%"+restaurantName.toLowerCase()+"%"; // it converts the restaurant name to lower case + try + { + TypedQuery query = entityManager.createQuery("SELECT r FROM RestaurantEntity r WHERE LOWER(r.restaurantName) LIKE :str ORDER BY r.restaurantName",RestaurantEntity.class); + query.setParameter("str",str); + restaurantEntityList = query.getResultList(); + } + catch (Exception e) + { + return null; + } + entityManager.close(); + return restaurantEntityList; // return the list of restaurantEntity + } + + // function to get the name of restaurant by using Uuid + public RestaurantEntity getRestaurantByUuid(final String restaurantUuid) + { + // list of type restaurant Entity + List restaurantEntityList = new ArrayList<>(); + try + { + TypedQuery query = entityManager.createQuery("SELECT r from RestaurantEntity r WHERE r.uuid =:restaurantUuid",RestaurantEntity.class); + query.setParameter("restaurantUuid",restaurantUuid); + restaurantEntityList = query.getResultList(); + } + catch (Exception x) + { + return null; + } + entityManager.close(); + if(restaurantEntityList.size()==0) + return null; + else + return restaurantEntityList.get(0); + } +} diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/StateDao.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/StateDao.java new file mode 100644 index 0000000..0a22040 --- /dev/null +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/StateDao.java @@ -0,0 +1,8 @@ +package com.upgrad.FoodOrderingApp.service.dao; + +import com.upgrad.FoodOrderingApp.service.entity.StateEntity; + +public interface StateDao { + StateEntity getStateById(final Long stateId); + +} diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/StateDaoImpl.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/StateDaoImpl.java new file mode 100644 index 0000000..c5bec9f --- /dev/null +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/dao/StateDaoImpl.java @@ -0,0 +1,37 @@ +package com.upgrad.FoodOrderingApp.service.dao; + +import com.upgrad.FoodOrderingApp.service.entity.StateEntity; +import org.springframework.stereotype.Repository; + +import javax.persistence.*; +import java.util.ArrayList; +import java.util.List; + +@Repository//indicate that the class provides the mechanism for storage, retrieval, search, update and delete operation on objects. +public class StateDaoImpl implements StateDao{ + + @PersistenceUnit//set of entities such that for any persistent identity there is a unique entity instance. + private EntityManagerFactory entityManagerFactory; + + @Override + public StateEntity getStateById(Long stateId) { + EntityManager entityManager=entityManagerFactory.createEntityManager(); + Listlist=new ArrayList<>(); + try + { + //the query is written which searches for the required in the database + TypedQueryquery=entityManager.createQuery("select u from StateEntity u where u.id=:stateId",StateEntity.class); + query.setParameter("stateId",stateId); + list=query.getResultList(); + } + catch (Exception exception) + { + return null; + } + entityManager.close(); + if(list.size()==0) + return null; + else + return list.get(0); + } +} diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/AddressEntity.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/AddressEntity.java index 57deca5..e440f7f 100644 --- a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/AddressEntity.java +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/AddressEntity.java @@ -4,60 +4,65 @@ import javax.validation.constraints.NotNull; import java.io.Serializable; -/** - * AddressEntity class contains all the attributes to be mapped to all the fields in address table in the database. - * All the annotations which are used to specify all the constraints to the columns in the database must be correctly implemented. - */ -@Entity -@Table(name = "address") -@NamedQueries({ + +/*@NamedQueries({ + @NamedQuery(name = "deleteAddressById", query = "delete from AddressEntity a where a.uuid=:addressuuid"), + @NamedQuery(name = "getAddressById", query = "select a from AddressEntity a where a.uuid=:addressuuid") + @NamedQuery(name = "getAllAddress", query = "select b from CustomerAddressEntity a inner join a.address b where " + "a.customer = :customer order by b.id desc"), @NamedQuery(name = "getAddressByUUID", query = "select b from CustomerAddressEntity a inner join a.address b where " + "b.uuid = :uuid") -}) +})*/ +@Entity +@Table(name = "address") public class AddressEntity implements Serializable { @Id + @Column(name = "id") @GeneratedValue(strategy = GenerationType.IDENTITY) - private Integer id; + private long id; - @Column(name = "UUID", length = 64, nullable = false) + @Column(name = "uuid", nullable = false) private String uuid; @Column(name = "flat_buil_number", nullable = false) - private String flatBuilNo; + private String flatBuilNumber; - @Column(nullable = false) + @Column(name = "locality",nullable = false) private String locality; - @Column(nullable = false) + @Column(name = "city",nullable = false) private String city; - @Column(nullable = false) + @Column(name = "pincode",nullable = false) private String pincode; - @OneToOne - @NotNull - private StateEntity state; + @Column(name = "state_id",nullable = false) + private long stateId; - public AddressEntity(String uuid, String flatBuilNo, String locality, String city, String pincode, StateEntity state) { + //constructor + public AddressEntity() {} + + public AddressEntity(long id, String uuid, String flatBuilNumber, String locality, String city, String pincode, long stateId) { + this.id = id; this.uuid = uuid; - this.flatBuilNo = flatBuilNo; + this.flatBuilNumber = flatBuilNumber; this.locality = locality; this.city = city; this.pincode = pincode; - this.state = state; + this.stateId = stateId; } - public AddressEntity() { - } - public Integer getId() { + + + //getter and setters + public long getId() { return id; } - public void setId(Integer id) { + public void setId(long id) { this.id = id; } @@ -69,12 +74,12 @@ public void setUuid(String uuid) { this.uuid = uuid; } - public String getFlatBuilNo() { - return flatBuilNo; + public String getFlatBuilNumber() { + return flatBuilNumber; } - public void setFlatBuilNo(String flatBuilNo) { - this.flatBuilNo = flatBuilNo; + public void setFlatBuilNumber(String flatBuilNumber) { + this.flatBuilNumber = flatBuilNumber; } public String getLocality() { @@ -101,12 +106,11 @@ public void setPincode(String pincode) { this.pincode = pincode; } - public StateEntity getState() { - return state; + public long getStateId() { + return stateId; } - public void setState(StateEntity state) { - this.state = state; + public void setStateId(long stateId) { + this.stateId = stateId; } - } diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/CategoryEntity.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/CategoryEntity.java new file mode 100644 index 0000000..44e1e24 --- /dev/null +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/CategoryEntity.java @@ -0,0 +1,55 @@ +package com.upgrad.FoodOrderingApp.service.entity; + +import javax.persistence.*; +import javax.validation.constraints.NotNull; + +@Entity +@Table(name = "CATEGORY") +public class CategoryEntity { + + @Id + @Column(name = "ID") + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + @Column(name = "UUID") + @NotNull + private String uuid; + + @Column(name = "CATEGORY_NAME") + private String categoryName; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getCategoryName() { + return categoryName; + } + + public void setCategoryName(String categoryName) { + this.categoryName = categoryName; + } + + @Override + public String toString() { + return "CategoryEntity{" + + "id=" + id + + ", uuid='" + uuid + '\'' + + ", categoryName='" + categoryName + '\'' + + '}'; + } + +} diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/CategoryItemEntity.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/CategoryItemEntity.java new file mode 100644 index 0000000..c000539 --- /dev/null +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/CategoryItemEntity.java @@ -0,0 +1,61 @@ +package com.upgrad.FoodOrderingApp.service.entity; + +import javax.persistence.*; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/* +@NamedQueries({ + @NamedQuery( name = "customerItemByCategoryId", query = "select ci from CategoryItemEntity ci where ci.categoryId = :categoryId") +}) +*/ +@Entity +@Table(name = "category_item") +public class CategoryItemEntity implements Serializable { + + @Id + @Column(name = "id") + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + @Column(name = "item_id") + @NotNull + private long itemId; + + @Column(name = "category_id") + @NotNull + private long categoryId; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public long getItemId() { + return itemId; + } + + public void setItemId(long itemId) { + this.itemId = itemId; + } + + public long getCategoryId() { + return categoryId; + } + + public void setCategoryId(long categoryId) { + this.categoryId = categoryId; + } + + @Override + public String toString() { + return "CategoryItemEntity{" + + "id=" + id + + ", itemId=" + itemId + + ", categoryId=" + categoryId + + '}'; + } +} diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/CustomerAddressEntity.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/CustomerAddressEntity.java index d1ec879..d5bdea3 100644 --- a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/CustomerAddressEntity.java +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/CustomerAddressEntity.java @@ -9,52 +9,46 @@ import java.io.Serializable; + +/*@NamedQuery(name = "userByAddress", query = "select a from CustomerAddressEntity a inner join a.address b where " + +"b.uuid = :uuid")*/ @Entity @Table(name = "customer_address") -@NamedQuery(name = "userByAddress", query = "select a from CustomerAddressEntity a inner join a.address b where " - +"b.uuid = :uuid") public class CustomerAddressEntity implements Serializable { @Id + @Column(name = "id") @GeneratedValue(strategy = GenerationType.IDENTITY) - private Integer id; - - @ManyToOne - @OnDelete(action = OnDeleteAction.CASCADE) - @JoinColumn(name = "customer_id") - @NotNull - private CustomerEntity customer; + private long id; - @OneToOne - @OnDelete(action = OnDeleteAction.CASCADE) - @JoinColumn(name = "address_id") - @NotNull - private AddressEntity address; + @Column(name = "customer_id",nullable = false) + private long customerId; - public CustomerAddressEntity() { - } + @Column(name = "address_id",nullable = false) + private long addressId; - public Integer getId() { + //getter and setter methods of the variables + public long getId() { return id; } - public void setId(Integer id) { + public void setId(long id) { this.id = id; } - public CustomerEntity getCustomer() { - return customer; + public long getCustomerId() { + return customerId; } - public void setCustomer(CustomerEntity customer) { - this.customer = customer; + public void setCustomerId(long customerId) { + this.customerId = customerId; } - public AddressEntity getAddress() { - return address; + public long getAddressId() { + return addressId; } - public void setAddress(AddressEntity address) { - this.address = address; + public void setAddressId(long addressId) { + this.addressId = addressId; } } diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/CustomerAuthEntity.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/CustomerAuthEntity.java index b8a6e34..3471f50 100644 --- a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/CustomerAuthEntity.java +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/CustomerAuthEntity.java @@ -1,15 +1,17 @@ package com.upgrad.FoodOrderingApp.service.entity; import javax.persistence.*; +import javax.validation.constraints.NotNull; import java.io.Serializable; import java.time.ZonedDateTime; + +/*@NamedQueries({ + // @NamedQuery(name = "searchByUuid", query = "select c from CustomerAuthEntity c where c.uuid = :uuid"), + @NamedQuery(name = "customerAuthByAccesstoken", query = "select c from CustomerAuthEntity c where c.accessToken = :accessToken") +})*/ @Entity @Table(name = "customer_auth") -@NamedQueries({ - // @NamedQuery(name = "searchByUuid", query = "select c from CustomerAuthEntity c where c.uuid = :uuid"), - @NamedQuery(name = "customerAuthByAccesstoken", query = "select c from CustomerAuthEntity c where c.accessToken = :accessToken") -}) public class CustomerAuthEntity implements Serializable { @Id @@ -17,12 +19,16 @@ public class CustomerAuthEntity implements Serializable { @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; - @Column(name = "UUID", length = 64, nullable = false) + @Column(name = "UUID", nullable = false) private String uuid; - @ManyToOne + /* @ManyToOne @JoinColumn(name = "customer_id") - private CustomerEntity customer; + private CustomerEntity customer;*/ + + @Column(name = "customer_id") + @NotNull + private long customerId; @Column(name = "access_token",length = 500, nullable = false) private String accessToken; @@ -36,23 +42,23 @@ public class CustomerAuthEntity implements Serializable { @Column(name = "logout_at") private ZonedDateTime logoutAt; - public CustomerAuthEntity() { - } + /* public CustomerAuthEntity() {} + */ - public CustomerAuthEntity(String uuid, CustomerEntity customer, String accessToken,ZonedDateTime expiresAt,ZonedDateTime loginAt, ZonedDateTime logoutAt) { + /* public CustomerAuthEntity(String uuid, CustomerEntity customer, String accessToken,ZonedDateTime expiresAt,ZonedDateTime loginAt, ZonedDateTime logoutAt) { this.uuid = uuid; this.customer = customer; this.accessToken = accessToken; this.expiresAt = expiresAt; this.loginAt = loginAt; this.logoutAt = logoutAt; - } + }*/ public long getId() { return id; } - public void setId(long id) { + public void setId(int id) { this.id = id; } @@ -64,13 +70,23 @@ public void setUuid(String uuid) { this.uuid = uuid; } - public CustomerEntity getCustomer() { + /* public CustomerEntity getCustomer() { return customer; } + public void setCustomer(CustomerEntity customer) { this.customer = customer; } +*/ + + public long getCustomerId() { + return customerId; + } + + public void setCustomerId(long customerId) { + this.customerId = customerId; + } public String getAccessToken() { return accessToken; diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/CustomerEntity.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/CustomerEntity.java index 1dcb3ef..bb98e69 100644 --- a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/CustomerEntity.java +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/CustomerEntity.java @@ -6,24 +6,31 @@ import javax.persistence.*; import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; -@Entity//specifies that the class is an entity and is mapped to a database table +/*@Entity//specifies that the class is an entity and is mapped to a database table @Table(name="CUSTOMER")//tells us in which table in the database we have to go @NamedQueries( { - //statically defined query with a predefined unchangeable query string. - @NamedQuery(name = "customerByContactNumber", query = "select u from CustomerEntity u where u.contactNumber =:contactNumber") + //statically defined query with a predefined unchangeable query string. + @NamedQuery(name = "customerByContactNumber", query = "select u from CustomerEntity u where u.contactNumber =:contactNumber"), + @NamedQuery(name = "searchById",query = "Select c from CustomerEntity c where c.id = :id"), + @NamedQuery(name = "UserQueryByPassword",query = "select c from CustomerEntity c where c.contactNumber=:contactNumber and c.password=:password") } -) +)*/ +@Entity +@Table(name = "CUSTOMER") public class CustomerEntity implements Serializable { @Id//member field below is the primary key of current entity. @Column(name = "id")//the name of the column of the table @GeneratedValue(strategy = GenerationType.IDENTITY)//configure the way of increment of the specified column(field)/how the primary key should be generated - private int id; + private long id; @Column(name="uuid",nullable = false) private String uuid; + @Column(name = "firstname",nullable = false) private String firstName; @@ -47,11 +54,11 @@ public CustomerEntity(){ } //getter setter of all the variables - public int getId() { + public long getId() { return id; } - public void setId(int id) { + public void setId(long id) { this.id = id; } @@ -121,4 +128,14 @@ public String toString() { return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE); } + @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL) + private List address = new ArrayList(); + + public List getAddress() { + return address; + } + + public void setAddress(List address) { + this.address = address; + } } diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/ItemEntity.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/ItemEntity.java new file mode 100644 index 0000000..ac310ba --- /dev/null +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/ItemEntity.java @@ -0,0 +1,97 @@ +package com.upgrad.FoodOrderingApp.service.entity; + +import org.apache.commons.lang3.builder.EqualsBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import javax.persistence.*; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + + +/* +@NamedQueries({ + @NamedQuery(name = "getAllItems", query = "select i from ItemEntity i") +}) +*/ +@Entity +@Table(name = "item") +public class ItemEntity implements Serializable { + + @Id + @Column(name = "id") + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + @Column(name = "uuid") + @NotNull + private String uuid; + + @Column(name = "item_name") + @NotNull + private String ItemName; + + @Column(name = "price") + @NotNull + private int price; + + @Column(name = "type") + @NotNull + private String type; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getItemName() { + return ItemName; + } + + public void setItemName(String itemName) { + ItemName = itemName; + } + + public int getPrice() { + return price; + } + + public void setPrice(int price) { + this.price = price; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + @Override + public boolean equals(Object obj) { + return new EqualsBuilder().append(this, obj).isEquals(); + } + + @Override + public int hashCode() { + return new HashCodeBuilder().append(this).hashCode(); + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE); + } +} diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/RestaurantCategoryEntity.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/RestaurantCategoryEntity.java new file mode 100644 index 0000000..48733b1 --- /dev/null +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/RestaurantCategoryEntity.java @@ -0,0 +1,55 @@ +package com.upgrad.FoodOrderingApp.service.entity; + +import javax.persistence.*; +import javax.validation.constraints.NotNull; + +@Entity +@Table(name = "RESTAURANT_CATEGORY") +public class RestaurantCategoryEntity { + + @Id + @Column(name = "id") + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + @Column(name = "restaurant_id") + @NotNull + private long restaurantId; + + @Column(name = "category_id") + @NotNull + private long categoryId; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public long getRestaurantId() { + return restaurantId; + } + + public void setRestaurantId(long restaurantId) { + this.restaurantId = restaurantId; + } + + public long getCategoryId() { + return categoryId; + } + + public void setCategoryId(long categoryId) { + this.categoryId = categoryId; + } + + @Override + public String toString() { + return "RestaurantCategoryEntity{" + + "id=" + id + + ", restaurantId=" + restaurantId + + ", categoryId=" + categoryId + + '}'; + } +} \ No newline at end of file diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/RestaurantEntity.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/RestaurantEntity.java new file mode 100644 index 0000000..46690c0 --- /dev/null +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/RestaurantEntity.java @@ -0,0 +1,108 @@ +package com.upgrad.FoodOrderingApp.service.entity; + + +import javax.persistence.*; +import javax.validation.constraints.NotNull; + +@Entity +@Table(name ="RESTAURANT") +public class RestaurantEntity { + + @Id + @Column(name = "id") + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + @Column(name = "uuid") + @NotNull + private String uuid; + + @Column(name = "restaurant_name") + @NotNull + private String restaurantName; + + @Column(name = "photo_url") + private String photoUrl; + + @Column(name = "customer_rating") + @NotNull + private float customerRating; + + @Column(name = "average_price_for_two") + @NotNull + private int averagePriceForTwo; + + @Column(name = "number_of_customers_rated") + @NotNull + private int numberOfCustomersRated; + + @Column(name = "address_id") + @NotNull + private long addressId; + + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getRestaurantName() { + return restaurantName; + } + + public void setRestaurantName(String restaurantName) { + this.restaurantName = restaurantName; + } + + public String getPhotoUrl() { + return photoUrl; + } + + public void setPhotoUrl(String photoUrl) { + this.photoUrl = photoUrl; + } + + public float getCustomerRating() { + return customerRating; + } + + public void setCustomerRating(float customerRating) { + this.customerRating = customerRating; + } + + public int getAveragePriceForTwo() { + return averagePriceForTwo; + } + + public void setAveragePriceForTwo(int averagePriceForTwo) { + this.averagePriceForTwo = averagePriceForTwo; + } + + public int getNumberOfCustomersRated() { + return numberOfCustomersRated; + } + + public void setNumberOfCustomersRated(int numberOfCustomersRated) { + this.numberOfCustomersRated = numberOfCustomersRated; + } + + public long getAddressId() { + return addressId; + } + + public void setAddressId(long addressId) { + this.addressId = addressId; + } + +} diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/RestaurantItemEntity.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/RestaurantItemEntity.java new file mode 100644 index 0000000..8ba38a5 --- /dev/null +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/RestaurantItemEntity.java @@ -0,0 +1,35 @@ +package com.upgrad.FoodOrderingApp.service.entity; + +import javax.persistence.*; +import javax.validation.constraints.NotNull; + +@Entity +@Table(name = "RESTAURANT_ITEM") +public class RestaurantItemEntity { + + @Id + @Column(name = "id") + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + @Column(name = "restaurant_id") + @NotNull + private int restaurantId; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public int getRestaurantId() { + return restaurantId; + } + + public void setRestaurantId(int restaurantId) { + this.restaurantId = restaurantId; + } +} + diff --git a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/StateEntity.java b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/StateEntity.java index 4d90b00..4bad581 100644 --- a/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/StateEntity.java +++ b/FoodOrderingApp-service/src/main/java/com/upgrad/FoodOrderingApp/service/entity/StateEntity.java @@ -3,37 +3,43 @@ import javax.persistence.*; import java.io.Serializable; -@Entity -@Table(name = "state") -@NamedQueries({ + +/*@NamedQueries({ + @NamedQuery(name = "getStateByUUID", query = "select s from StateEntity s where s.uuid =:uuid"), @NamedQuery(name = "getAllStates", query = "select s from StateEntity s") -}) +})*/ +@Entity +@Table(name = "state") public class StateEntity implements Serializable { @Id + @Column(name = "id") @GeneratedValue(strategy = GenerationType.IDENTITY) - private Integer id; + private long id; - @Column(name = "UUID", length = 64, nullable = false) + @Column(name = "uuid", nullable = false) private String uuid; @Column(name = "state_name", nullable = false) private String stateName; + + //constructor public StateEntity() { } - public StateEntity(String uuid, String stateName) { + public StateEntity(long id, String uuid, String stateName) { + this.id = id; this.uuid = uuid; this.stateName = stateName; } - - public Integer getId() { + //getter and setter functions + public long getId() { return id; } - public void setId(Integer id) { + public void setId(long id) { this.id = id; } diff --git a/FoodOrderingApp-service/target/classes/META-INF/FoodOrderingApp-service.kotlin_module b/FoodOrderingApp-service/target/classes/META-INF/FoodOrderingApp-service.kotlin_module new file mode 100644 index 0000000000000000000000000000000000000000..a49347afef10a9b5f95305e1058ba36adec7d6dd GIT binary patch literal 16 RcmZQzU|?ooU|@t|0RRA102TlM literal 0 HcmV?d00001 diff --git a/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/businness/AddressService.class b/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/businness/AddressService.class index c0d9ef470b48824a040e4cae35b8c5ce529527c1..e7f221b4483fe1a57b592277f913d18783265873 100644 GIT binary patch delta 236 zcmXX=I}QOs82)B<*IKXjT8~m8E}#*WLZYA`aR9Lskt`B3Bo5#Jn@JQ-A_@_uM&}4> zwL<*asJ?gd9TT5;?fyMq05nmx;n^rLB;{l)I=;UaQZih_T3ff+K76`n*+wON)g4Ew zi4x<@TtAp+`63W1EZrL3bR*SjA=dwKcd6!T$KcL{>IA{x75dFadcY65XPk839QuaI zV88^2MNeXcG1!O`PaALu638NnEY(s-gGG_UqbLKA?NWh9wnhI*i_r*0u)#UG=N BFCG8@ delta 380 zcmXw#zfZzI9L3+aEwr?Nh=TYFVxkFyhQ+w(q7f4!8)4GrLL00p#k2JPKB2x`3jrom*>iOen?X`agK- BQ?dX6 diff --git a/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/businness/AddressServiceImpl.class b/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/businness/AddressServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..5f95c8d95c818ad3c717cbc63cc91275690399b3 GIT binary patch literal 6036 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 literal 0 HcmV?d00001 diff --git a/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/businness/CategoryServiceImpl.class b/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/businness/CategoryServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..f4af741306d32a2de43d0858f32ca80af055ff12 GIT binary patch literal 2009 zcmbtUQEwAR5dPMVbGB=e)S+phv>Z^19gf`!ub6K!&t-C#_ ze?{N>D_W@nsg>HtO8re$)mi(_n8Z|8dD*$yoBigSZ)W$ee}4TPz*ndjF^7!;&frE7 zoA|OwdtY0)na4MI+$ti6Z_WPgJht-KHlKGa>{z(VFz<3Ld=>T|aJApZLk#x9Nod+S5c*hokGRoL zi;!x&JyBX6lC&f&$v-aalQ-Mk)O7Y_O;2Ml)&h$0|$U8RpWM zp&F*LDQ59qN}g$H?mj=@y}=|{xJTmdeea51GLZ{Zd9Bk)8Y%@TS*}!vykadoPD4hT z6e_f&A8;LqG-AzD0o(td;*M!|OU0op>e3AGa>AuQHg@Y~xELxEdmPaK2&MZy;Uq`4 zN?63%66UdBp;p3qd}85#3A=c}P@hK4RH4ymHkGccIPgZ=F<86J`r5|E4Th^JWm|go zkrW-zj*eAKhVH)I7Pjd2bl;HLE5XL4(b-LgrKYmej@#|NZEh;Tlu*SA!@ViU{^y0I zyYl8@K5Rb|uBK;b3e<@M#c*?qqZ8i6w`dGUou0Ig2z-4!c+&P6u1&aYr!PqL5SQqU zpQAUQA!Axh_CxY!$(G5^kfrX^`Vn~!Sw=Ru@*3=C`p963Ruc>Y`Iy$yFaXOqM;*N6i0*+;`>Kvh^DIKa!+{gVjHiAI0(q=Etg`ksZ`=o+<%luqfFgjn)N1 zws8fkxH_O_579@|)^VBs8ct<=PB9sLLFWs|EdGsU3)fH~*C?1v*o?7BuT3nK!n_9%k z;HNQpJ(ItT22eaPIXShsI3zziHII>jEhj%czqEvrAqb?vZE^w=Hy>P02}sT4JSJ(T zSsD`?RVV8)8BJcx$T9g4la070P*r|TNny8d zSQr=?BpBF%PGn_dkYo^GVPueEkY-?FU8eJA*Pi zg9;-9cVcpKYH@K$es*deke8p665v=|T%KQ)0_5eTmIpX)mSow$$jCnV6zgg=4hCih e2?j|ZWCz;8%gi7Jq@;mZ28bCMWPv0TgB$=8&KtD= diff --git a/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/businness/CustomerServiceImpl.class b/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/businness/CustomerServiceImpl.class index b911aa9ee4eeed588f5ca6eabe57b946d3d6ee7e..f2ca41a24dc4317dc517a44fe378a5ce894e16d1 100644 GIT binary patch literal 9601 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 Uf-k}jX^e%4@wZpCe1fX~7yJcn#sB~S diff --git a/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/businness/ItemService.class b/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/businness/ItemService.class new file mode 100644 index 0000000000000000000000000000000000000000..81e1c64366c05de0ddc715acde5547917a355bd5 GIT binary patch literal 272 zcma)%L2kk@5Jmr_gtQ=49HZUTn=YtWu>gq*L?zS%IPoYrB5`CpNWEGYJwOkIm;eW0 zH&65bpFjVn-#-BF7-x9OFd{sc99NO+?_is9We6WHpRen})v9YtuZ>zdXSUw3m;JnL zRbYR#1uJf%jX$dQE-vGYFxhb2JM*Qzt~s&~grOBdpF7&Q&KJD22Nq#(+g+31Dt*+1 y=^Z!oPFgk`!sYDEFKK;(I_RcU+q~i;4he)r9tCJXc)&n76-uQLCIXp2g2yv}fKDd> literal 0 HcmV?d00001 diff --git a/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/businness/ItemServiceImpl.class b/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/businness/ItemServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..766edc5b04a26e6e5d446a6f6e582b8978f404ee GIT binary patch literal 999 zcmbVL+invv5IxR?C28org>ox}m$VO9LVW;QDn&r0RDmK|^6uSrw{Elc%Ij^FzXAz? z!~-9|MbXev~sh==ufW@paKIktcN{PrEdCLT3W$DIahxZA`%+z+rC;6Z>jhAHJ_ z`bwB?nhh8>dyz?bktJ5deAk$G-^S7^opiE{=hB|3Nb*=1-W^wMF|52Vv{R|z@hS@jL9h>-_@TxdzY1-#k zisdYcMN*NVm!&!!hlQWCd0+|~$zA0&S@bhsV)FPzoC${Zl?`(0E{z*zl8;KZT9`ts zg#gzBJZxbe3k=&6T#kQANqqeXd?0kf_rntzIl3JGi^%X~g3`ZkD%R)))IrBUU&V7H z+n^WX{U+H8S)xtr4e~fyMz+5373@>_dzx0C3`(1!)u&PdW-&*WZXy;?EsI}}tx~M9 y@fnrXFQ|Sbr-CuSQVFn3F-jT%_}wCw2xyt2bvi}*@n^uBCBUt6UAc(f27Uo!T@F(K literal 0 HcmV?d00001 diff --git a/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/businness/RestaurantCategoryService.class b/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/businness/RestaurantCategoryService.class new file mode 100644 index 0000000000000000000000000000000000000000..0bc7d555cc25c70a822fc1850cd0b9564f5e01ae GIT binary patch literal 443 zcma)&yH3L}6o!v`3oW-wOf1Z>;DxOSi6SC_f{Mt*=q5+TRcc4}aizQ(Lmz;LLO7vO zkYHf3bo776{``M@zHb5G3XUTiYnfDv~KrJFuMr?wQ>i{s}`vp`k4ynBsJb<7^@2e)|sK8R}(>;(iGuSSVu=4^r~5h(|>{F5(Hp zl$Fkl#0u@#g_p6ho!7!JtOcQI@uVGF5%CRUq8%Gat8~2DZgVH?i3%l;gyFk`{5MLR7A^rCb6O1Q0X)ld$t#reHcDX0b-~QEXWZm()dnW@^hD^ z3M#l(!4;H>s8&$JWCgRBWY`*FZ-<;KjV2pgQ|OrQG>&EH88-e;e1=y;1p4O%W0>u2 zos#bNy~6_C`B5+w>C2@+5iir5km{}y&l4vMiC!m(6KBLn>R-V=(IJO1qNy>+Xq;%} z%m6nqK@#mXCQ-@mj@xWx1Uh^CYwU2=k{h#;-HL)! zT#tS*p76*Lc-n)>|8`-6*;lrwoQ(hXq(Xo|0k;sKSi&r!gijgYN?5Oeho>@uBk-Y$ f#{$&wqhmNhaV4FCkEJs>M{%pq$36lV%g)PRpI+m< literal 0 HcmV?d00001 diff --git a/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/businness/RestaurantServiceImpl.class b/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/businness/RestaurantServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..7cb7d1417155c76cf779b47beee671eb3f8cde92 GIT binary patch literal 2269 zcmbtVQEwYX5dPMVbGC64W0#PIK(A0*J579P8X&}J+N6nTisM#s8;QrYZ{u8R-&%Kj zE&dg}^D96?tppN0BJrCLV%F!{*Tw})dGO8N-p)5O-+Vj%>z`kL2e6J>8d?U!~z@CA90~Ln%J>e@Jc-&QcTpo0~ zZHCQiQ+BMN+w!<=Riv~ZdbaQ!x3$ylTE6g}J56EPTv|tO`<59l9R;p(I^x*zokm;i zxUN)OInwnRHmcHVS$UP$km)ezkEtrOl<((74#=wR&xO1^MBVH521mg72V zn;~8(9y3hcleS=(tvar#1)YZQ9&?JukgLijZy$5d(eH!JDRt^l_`ON$Y6QOHy2AG( z)z!nAH9M5bTuZ1?}{O4Xf~%T?e}{Kf?Fwiw9y;D+n6F85 z)D*MPGxZ2CwGMVCsQQ0~07G_k(H}ORil$=NJ|8aKtO)?#p~W{63MUVZ%(ie_>a;&H z4~WY#`ae5?^l;snAd#`-pCSLo1>f!I`++O;ca#PF*U&Gf`%U&D{ew-D{ebKgSrR5a z=jqKN%g82{UV;5gix@7^Qy&Iqut3jDcmN+^k=~e=4ibH5PGB+GTfFfSu^%z}8{*&P zrgDi_nEqqw7Z|ji{E5ED` z7e=^&WlBaz_<^jBP>NQb&b=3@Jaf4G=YWz6xf%UodBnv6F$_X8P$Di?sqULp_Zsc2 w_fs=N^kHfxtn_(Vq=uHLX|X;-Da7)BW8NTuGd!)lm3@pNXcE?jHQfUK1)i&7&j0`b literal 0 HcmV?d00001 diff --git a/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/businness/StateService.class b/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/businness/StateService.class new file mode 100644 index 0000000000000000000000000000000000000000..d40b0477240a286789190fc608cdfa12afb8c3c2 GIT binary patch literal 289 zcma)%F>V4e5JmqGU;{}(ZUGH$Xb=@hAR#Rx(w@MqN5%;3mF-31YAJGn94f-QL`q9H zubBV-|M~s;1~9{0hCzlQ;azhqqKv${Z53fV&QJ0x#aUV{a%c5ol9%ox>Pma5#Kt+b z_lmu-dRbK>u)ms;1>0!iO|(Jl_FfQ1JB~-EKBbozj_d;=3yrD~4GUNMk~ikegpc;I zc!W)x0)+V!+Cv?TwH(63{1=eS{~Pv)6PK}1Aav4lfVzYibQAXy^$2~85@ZQFc)bG} C<5ZRa literal 0 HcmV?d00001 diff --git a/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/businness/StateServiceImpl.class b/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/businness/StateServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..836084ca35bde05fb6ea4c6ca451947f05d967fe GIT binary patch literal 1032 zcmbVL+iuf95Ivgpm1%*qcNQPFV%KOINx?7T6YrSrjzXAz? z!~-9|MH01-I(BjXMGE2Dlesonaw! z!pV2SFgy(-GvaxgSP}DWW8xhfORIF!NmHIld!!=CV_|r2I?^4b!#2a(r(8QVl6{q_ z!BBRzHUv;cXAI9mV-udGo@U>Qkvul`GapEyGrlh(XY81ZlL6kzojF!k#zcGJrP9j1 zVkoyZ`V5t~CYB6~q0;hWJ{m~7CukePa%dtk>|TP#g(96guId(Mfw_o)wY|a^ngA`{JDh28H#Wb?GcAwLVC9 zVB%fjO>@$cm>1`I=`49kPLkiJo!pzXh5t$Qp2=+_x0SbSwNP|Q=p!$Rp>^(tjMhuz z#;N4fk#++Y(P$vRLV)`XEMtXXYmU?NZ>vf1%-Eg5p^O~E^Z%w~cs$4K*~5%=x*}E3 z*`ufACOfYc1lNnWcGA58`~?Nm B8sq=~ literal 0 HcmV?d00001 diff --git a/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/dao/AddressDao.class b/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/dao/AddressDao.class index b7422e3ab3b7338f91955c6490aebfcff325edef..787bd3872d7a5f99436f536312b85f64f41b94ab 100644 GIT binary patch delta 344 zcmX@bd4pZx)W2Q(7#J8#7^K)4B-j}wCkm_*=1)&8am>kaOi3w9EiO(iW@PZ0sHiiE zSzgGRk%2F{w74WcH?_z$uOzdia`I888BwA@4Z$UeC8>Uixv5T-V5VmZBZH`hm!?lv zVp*boPGVlVesD=qW?nkb4EAD>Vvq{nl+>Kml2oWwj0`-*sfk6&8BUdF0Y7#UcB zK4oQOU}Ina3b8YAFfhS{I2i;OxPY=u4BS8|9tK{7YCZ;m$@MH!nsDtx3<5wk!VDq^ OHKIW6j0|F61H=L83QPO| literal 1226 zcmb_c%T5A85UfTJP!S*a_5<|d#>AV(1XL0uL=(aXj60Kc$-hLE z%K#BQD0tXI_e@vSban6h$Lkw_GaP2IpTz-TITAfpmQt%IBABC^8@8Re>uDjKY8c9U zEtU2=Ub)+KBBgu2s~puazUe!*>L!WKk7uqVtksoy3gv^)qOFY5tfU}@nuh3n#Z$%- zR{G86?KPo(RBMTza01csoQ4^woJ&RCQr=2JiRrH5$b@aBD}75$XwFGFg0z6Pb%f1< z3sZ-L=fAiyRXu|%KO+#fT-%5*s@Wo`0(NWMoWj7OAQ;EBS>%s(C)UQs51g7GnR7yJ zB!iG|_+CetSS!NIKeAlRJj0hPaFyTRFv6(OfZokHEeY6oM$&QY^JFeH!dSbi>IeMz zqHXrI2u}tLBb@$Xf29aV%gcqlTaz`qe{3n&ED{JQ{!swgG+_a0jx!u(2#WxxvdB$R u`6RW3<>}N43X{}oa;x|qYYpp6X5lxOWs|=YN=&nb?FqmRrwO~s;oc{hA$~#t diff --git a/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/dao/AddressDaoImpl.class b/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/dao/AddressDaoImpl.class index 469dab4e497066d3399b971c602c6936037ae06d..5cfed1bfc7f6c1882227c12fefcc9bf83a4d196b 100644 GIT binary patch literal 6579 zcmb_g`F|AU9e&@5cw^(+B0#-5Ne5@ApJei+iIKJuaW_ zla~`x>i!5G(C}gT_>l-cT7!?_q`W*>gOB5synG^phcrAK!6Q+8QffYm$22@1#g#ZJ z*Pp1tlXyyAo{r#C8lH*Z(@|WG&qy<$l@g~T_*@k8@OkOw3-a>C2)-1-mm?U}@D&YT z)i5rwz|7{Y{8+b*2>dD)dq_X8wD!s>h}nQ+H+}B;F2yYYxWd| z514kJLBj&Eu3XB<>@jRh{`Ovm@hEX(N|xOQ&tqaW)&d&f$>^z1KL#sOh~G$k)xpkPDh`%LS&j{-QMn1k+onz)EI} z>|k=sk(4s|6H*cg4bsHn9aH<8L(eSK>uW`Ew%a5yx zCM|o!sZdddHJlNM_T~z9%IvV@^q=qPdy~6S9#8}tx^nhl(ixGHU_g$J!#Vp-dfo`Yyhw<2KkjzKt=9nG1bW{Sz=DdPw)!IjOt zn~9VcTB^~fv`!UZ@t43&GY@lGCoE>soZ7r+bo>^-^Kn)qv(2`RG0C7hevdzJf9v=o z{-op2cvYa$OT|cZNNmfxDPedi7>zEr64~aNhg@b%pu$S)_=_y0}b-T%Pc|IjKW5eC3ax=}OrOrJH za}yRje*1xg>|=rJW`JS2DS@SL@ae$Mg7Zm~93cg+JXflC=HfJ0(FR8?fg5HJtGAQ< z7WEGTv7)U`Qinmh@Ert{Byi2S0l5aIem%`k*(MK`WsA(Z&gK3Kd{xOq3Q4yNhHEdN zRw78%@Bwqs;t^f*zS`uxaYwF7!mVkm{KTpvRKphQ8?kel%mJRusYS=T6(ue3JeHlZ zX`TYIz4(>JAr*GqUm=b(S`4Q$IfpD=b1`a2%fB&&9P^Xy(PC zmk+)R1U6sTsGsH=S)Idlc9~8glXuT-F+b~|rRX~3Shq7PrrgOZH6*5;r8C@fNBl;O zOu^hfKt?N{@@k$DYAfihMP;u1j-xwm$Z&ehBlJR#`{_Qbev}s^@TfB$j}&BGE=>&-2#=ggNxF5K%1RN*tGAF_z#8$}FSQRj9{O zrjcN(wTy5%HgjbwR;buFGLw2*+K8JFl975@$fujpMqg2E;=gugbSbqrV+*~u^0|Yn zA-tVBaa5e8qmYJoXz0|iRl_z24PDjf<}&lVnKvel?H(?#dAPKf;1ateHg6J_RuY?7 zjJV9Ni`zf?)|XK3~s(*Aa{+CfJMy zuB>CC%?w$VYON|qdyr&1c3`JUa=n-2LUzY4^fJH|1hEghX?+hh7cq2qtv^`X>j5wq z;&n8u#P?~~?`OS(Y69=XEmUAPh$ko><-1d*Szi{r+|N4BnlFAHSE$_k*$FE97jfmj zGq|cHECEPcKvf&SBHCp>V&MI1Nc5(e4LP`C4G2eaNuEOucvQE5_$>}HO8V4xok_Tm`! z;W*#i&s0w`S&8#4sOEYd-bI}VC8DaCs)^=Wyc_RPl{ytv;S_GAv~0B#K^5-us<0YE zIH0P~L_JxLu&T#Og6Vol(ZfRi{cso31lpB1x$4RfP+m6aGTEdzK~qgS7}Sd8(&z#I zWxspPdMl+Z{;$A6#&if7uWA27n^krqDT?+G~3O@N(_>uEW&h<))Ua$=7832^k^+0vkh-dX8gSJ`eIr#Yw-5stjMgk*bgq5 z-AxGYVRPTh4S1ZX-N)LVAeTH)(hH?z=FFPRQURF_u(%R{^N^XNdLhqhsL>`8RFu8Y zSL_9ksd`q$R{2aMcg1R#%=={{kkNWhLu(0%aku*1AwH?E_ICzh;2+aDuGX@GF1NcK zaguO6$d!l4%nx&HJwlnsDfKA#`eS7JCt2^On8efQ#4|xhEWvzlLo_jVza#pBj_6}| z9adXttJe`R-X+si2F&l;NHH3BZGdYMti`B2%K+TbcSLQV{c7}8&ht0XD8(u;rmnXK J2aWdv{|6Oc)6@U} literal 3463 zcmb_eZBrXn6n<_3Y=BTOV71Ciu?2attgS^X0V*V*NCK2MU#itha!t2Qb~C$ok&IuR z@$cY_GadZk_}L%jc<%0INt%EG9EQEw`|_OUoafwg_V0iG_!GcG@GcBsr4#)~bt8?{ z7{)cMsh^+4u-J{yv92CpXxNA$qamx7He;BLVNNY<#gNpnt>KA=9Syq-J;IcRtYo># z3&Lg?&Ai}8{8%pw+c6v|%$(3yYqumBZtb`9w%&uM8?YT;sLh}^&U*N$>#^lJ1rZHqYy8mX+VK^TIaF!g9H+JHkFPh<%=0`f@&R3&%-wYrRx1lJ#zfABkX= zK~A&+dF7K7d+yWnp%@-r1FJ79RSM)~?jAa*er>rjekE$~KWZ5ruD(kkeWTh&ia z9mAc*uGCOrsD8Lq^lPfb*0E~TYVBNOi=yg%Rv)(xUx=J! zxZeVWdMJjG#=!Y`6n1BhGxfVsfJ0v> zwkTOgbhlJ3^!KXjMZK%K|E!{6l)lLZKry8Mh`I+fzD?h39W>seF-9X@5qb{Nn@%I6 zv3=?l*l+YBf+2dU%^;XzddB??7{P6NqYpE@N4wPFG>s9pW9oNArcV)#VETmKeT*(| zZ3tb2qHu2ddjlMWdk1$3Z;aO3>0;49Uu}4wwkhzR5v4z1RDmbj678qxh$5kpomdp7 z=w$c{?I&4w;_(|I8(nljvA^LRyh}4^`Q#8deLs4qRsXGyG#wmUQr+dU@hAivX<@6!$2b@|FVU|Mkv1hVTga`PDd<;Z* z;5q#8T!nj@D4Znlg>%50C_GC{qMpLXG%AIMJ%w*n74EGn+{X}xQe|wtyel-5BAj#> z%E20WheLUXF^5misAw27~O{i2go2aC@oeoR;%1cEky;TU?3IE1;fQ^?PW-gVKm9anTbjtr7z%L z+tpQ9+O@j+yD!r>sNH8K2|=@vR)6HoYI3Y6SI4dZ_P0#(@d@RI7 z@_3uks-9IelI-Eg;9j)}vaa~OHeq);T>bwt&2!geK&uJl9mDmmd1mfW%B=XwG2tCm>{+v`PEIB)m4!zdxl+%dDOD*1 z#*?;FFx-k#=7Ey)sqH*6SUMbOdo+)cl@;5yRC$@x@iC6;_z)jyFm-GpCorJG82-60 zI*z%cTqtnKl|`BJV!7A@$1cShTL&&?@6&C@kL9MUeC%3mwjrs?kIM(B2SL8PmaVjh zjy$A>2RaJa)?tCQDZuBKgJw=@c&OtMiW*8f%CL1*aGc)K@feN{7i2JZKn7LXtd&Dx ziP`Nc?9y^JcKt3TXpm1+dx4n)&~H-?X*mBJe4d%Dhtyu+@NSo? zGy*48$3B-sV@WfM_k<1XEpYZNQJR<0K+ch@e0xe4@0PmD_rbxuhy-i>@+uH-lf^BG z7cZKw%d~zI*lvAe%;Wow3+S%&niWN0Y5zR~k>9>)FAG6dy49i=WJb$5t?e+)O1wVp zDo?9^dsw!y%3SoQwlqsb9T<3Tw}7S+)+?5|t`%nk6|dvYT+w#vsIY7Ozz6T>6}Cj9 zmaNoEQHx*ZaEhNQgZy+6=ukP%=MeuL;`11vVLqAuY)|l?!KdJ}bL=I=PkiaXFk3Yl zIE<5Q^>bh7XM*e~d)AtaFc9pSq#(V3oz9*Sx;bcHY*9tuah z$7|>b;m%OFh6pR44CY>z^HmPJWzn6ySo=>qXh6W0t;&lBwektT>WgERabJL_|qC$nJ;u;)`o zn_-NzIL9|~sPj{ABaFxE9$AcGoLr;0i3v=S?G$GY`WmSi23H1S=Q(zPW5*DBMG#>P z7d3pQVOqoI5E^D8{kX*OPJY^$ TCN7n#3;ZqmZ`YeS9tZvf3g0@J literal 0 HcmV?d00001 diff --git a/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/dao/CategoryItemDaoImpl.class b/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/dao/CategoryItemDaoImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..7e6df771b3d7659ee2d1e8682d9f801b4c9f0245 GIT binary patch literal 2297 zcmb_eYgZdp6x|mR29lv*QeN6hYHI~5j8AM6ied;B8Xiq}SRd8PT)wLs^thP;M#fs4xaE&p&`+On+N z6>0j8dnhoKe=HB=Q=_I_&+>d_o65*_(aZ=;6zUXI)vo1P`xUih+m0`N%dtIyt6j`& zwN38WmQM?P3l=Af0=-kyy8@A{Q&Iv$dCOKC_3FNIwu_utQnQJjTL%#G1fhM=%7gbg|wM1saJ|h)7`gG{(_Rx`?Vt*@G@-+n~?IWC*l_ z%n(>+k(jpr2j&%+94z|Me6lWU4IdiWyP;u|iA~?vmH)^oZAn*FmCy7N7${n0Tl#gE z^cPP@@D%`x6`i_ksue59%<)#nw6kh1s33tGdB-gqUMo74ckUj^D7nCl8-{7Zl&*uJPWs;o9GkTZ6g*K@npV!Yg(rS!J(^ah6 zkmP39WS^S~d&El`Cd(ooo^7-ShA`~0Mgw}$5Aq`u)=gt4TaliZ>1MWFs|{SbjOkknyuo4zj%#lvl6#A>D~4UmZR5 zL?nxcERZT61gFk;Hv6aL7+Yk?Cs#^V=}K4{o!cZJC^f%g^V~`B$58peM9qrhDO}+j zn&6u%&=Zs##}TgjIF54c;mB&_cY-T}qu>~wc@FV&L;O0wfiiFbZ}6*!3b=&JT=8kZ zBzl9xBFXo;k9!+4zoO>|y#gD5B69yZqUp$NqA#Hxp}!aD=tMLzF!?)TM~L@gZz6gG zoy8IP2}9}VFSsxf{S8Cn+3XR92`ci8cO)^7TNtGM0L>iY{Ei?-2a>#blDo6SHjfmw zE+a!sS?=cO`dz%;K)pz0lXNu2y(l$ecneoKBig1X!R#8f`Cefe*YOU$N>XzQ)4X?v znxiBuv~hzcL)p8O%~Cdoo_~3HM8h0^hKBbbG`t_j2NXsHEf3>EPJ8&*rUxH4X7jB; Hd;|kTgbj*_UW=tz^y$ykE{*hTX*Nv+5eA^GCV@cy~8_h9+zJ(eE6}fEt zcA+e%9LEjJz;+#9U?lH)CBv_Jwo_X1%!*udy~jpDnvQR*L}wXh%fOhb1@4;d$s*l$ z?*b-p=4FUzbFq!igKY-Wt`o@hfQlXCwqpmA0`Y8aSs*d(7Nx+!yzR*QwMs#HOD3rZ z^yFR3EH9g$t=7%WM6ha;+pWCiR*YJ;pWz^L#DaB!3vKQ{I%LUXp|i{tkg(y*YB1S` z2&yQ{4D7ymrWW0rXUQ2`Ro}@y;%4PsR;@{3sBLdyukxfDFguL}S#^C|^|LV@@1kGF zF&x)W&|yJUnokH;kg+l=o?FT6IV&PS;o2%4W~|Gtg33%}Mq3NEfmi4PGVGk~i^Myx@nZW6nJP!h=_G@f68i50$&sKjCIJaMaUlOsyKTm7#19rsn zq#4M_MN`N_vbpCbYg368la6e|mMAbCy@gSH7X#Jd$99z3blLR%v372^>C$J!H@u^~ z>y!kvx>>Ht`4wKDYWZO}T4EaLz6@IZN4*O>RQ98Y?&ak$x=S)xkbbQksIJZjt{ISB zoj&2)Pg#C^8)rGvg7uo6-HEYz9BEOyqsj#aUJ&6OiX@mU$dc_a5Y7J>>X02Aw;1tx z?qL2_Y@+D&+;X|Vmd!m+R@}P88U8csO*X#xy zPjh8(7MzoVze4;Rnq)XC2SA$c0XHp1=+RF9hRz1M;%FcxFq-V6FfH&Sl47$j8E-(3;ZGzt=_P>-#}lE)qezjC zA~Z-s*Gc9Ei6}JJk>q&0iAH^0!~jvHFhbjth|_8qS>)(X*$!fe7Q?hT7KTX4F12Kr zDKjWL0PzerG`y$biiWGW#=RuVjg#P!?>7nm%~>6PtwnflxPflPyMY4&!$S=mjDd?o z0zaX9G{MgvMtE~*la3BEb^{#aA=5!(2ES6|b(k?d&g1$iKTos+#GfN}gXpgi?-uhM zIvI(Z#7_{d7+fRw55gGa!WhKp?<__!#*-AgKE(c|%Y=q;4HF^DNeB(My0(apP)p#$ x*CKl4^@v^}(W?Y@gG6tV=m?2U64fY)juYktiQf8Oh{iBQx-q8CR;^3}{{ckjPbdHY literal 0 HcmV?d00001 diff --git a/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/dao/CustomerAuthEntityDao.class b/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/dao/CustomerAuthEntityDao.class new file mode 100644 index 0000000000000000000000000000000000000000..a6c735d451193f0e928e4ae41d7282d6c16a83d1 GIT binary patch literal 541 zcmbu6Jx;?w5QX37&yYZ{=->pQVH-MV%ulMIAi@Qf-I3!Ed#&Adq%<6if&*|U#5hu9 zq);HGd{6W9&6}_9k52$sIEio^VJOhkj#MCl_t8Y#Tvlc3l#yd=&D0rkS&=4XDLuJW zrb$u}vaptSl@B&2msDZ?u(7T$_G=f2A1TbOc~Va06v%mjQ@yiCU|5xgiMI#>XDNjm zw;CVDzsFjjSRittj>T~ud9jMhfO^vlZ=H2RLl1`iNN!xTS@o EA2jNvRsaA1 literal 0 HcmV?d00001 diff --git a/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/dao/CustomerAuthEntityDaoImpl.class b/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/dao/CustomerAuthEntityDaoImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..9006d76355f19d37db4e975291fe6081330c6287 GIT binary patch literal 3645 zcmbtWSyL2O6#nio*f`UmqJX%>F@{Z)j!U9pQCSTMAhM}hOq!X?&@wYUcJ~OF#3W|l z_m}*EypmK3i=--*=e*`MeW z#377?aRsAcT*X)z{qu`EC zD`j~X1j?FQrUZh$c1#NF8nRMyB$J$$&V)%Q0@Xuy)J#m7j-~dwk3nzNBDS8PsGT%2 z>9}LYi~-w@U2$Sk0qstw4OcpMEOHhzZKF5idUjGeL^tbm*k{^<$#g?K%l6a-1f8hK@@FK>RNUxah|07IBfYGSZh#uEH$Jx+-8vo>>ifhtQ{LQRg!rOxj@!j0(o->* zu;*l|XR$jPm9CrJ2#om&??WH=R2a8UY1k~hqPl?G+zkTdw=+`J+Y=>dm{?59*j07T z5Cjt}L*n#}WIQWj4Dkz3YKwD}O1V6}xv9<0?S=0GZysIe%(hKxa5OM

aFoMCE{` zYVe8G2yUpKHr1m9T1z$=HZ4cm9_cW~WZHHu)z~_8G@?nz5kxe2Ix@J!B+@aD1!j_t zMRj-=Z|HavO#*w>1?$Q|$6IL9a8JkEct^v#I_@j^_wc?z-I}}~;hv0@U{eri+E_sm zKR;uUdCQxPOim8=McN}eKEQ`MKElU3K2gJcd@9iI%7l!1k!WPbv6GRFgz#j3mUtu4 zwt}3CbVb?=wgR17=va?zF*-iO=Zuh!FYu*~ukbZvrQ;iXtK&O-FK}rK);H~kOz$-U zuT0+}bS^mT@a3pygh8HvhsF=(FFU9>*OFYtmvQDjYkJ zm}VC)iqrTaD=o>F)Xq>Q_kviqG0Gn5u?nP_8#j z*;gs&7ripmX_<-%oGjGHckXOBvKmE&NKZ6!Hkq-gxi3dnQPU?(&-QiJQL<{Al!X15 zWqY$gZwU_yT<%SnuFJ<{V?wMY5dG3!>E)jfY6@e9$ z2@IcDK~P}i!wfnN}+4=y7tmRgr+a1VWKLIuj8u5RPC z;6LaPYI(9Bb*Lx41C%*Jse_a`M6VCy9KSwC#LC69bfX2k`Tc3)qeD4o)#?;Z^NtW_ z#YKQNkK+tA%J2*&>k;^mW`i1@)o@P3d5uPehW0&FB`tz_3Up^4^uN?pps#NNS`Xlw zkD5?_N9BzNsH)zzjNPrv*u!ZV)yvqs86(~3%QJGCApjbPp)u=y9nl?OFd7(&Zer;p z?g1hnqOTJ~J4JM>tPB*eay`$=^*k#hc~&m3XQl7)taRZ*E*1XHvC>t*O7*_#nibTR zF&(Pwmffn*;}#fnX#;XlE*P5Nanu zcG2yNd1&C?&q=kqh)dZppUDBLVTN|2hi)}6iF!#=5dE}SONaflf&AHJo~dN0f_R8i Z*(7*g!{BNLT;x#zFJ#9T^Yt|Z{13SU;M)KI literal 0 HcmV?d00001 diff --git a/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/dao/CustomerDao.class b/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/dao/CustomerDao.class index 7c4930effbe7e2af9cbb3adcd1c71dfe2c0dd00e..2664145e15c489fbe97864900a882c9b15be8ec2 100644 GIT binary patch delta 46 zcmey!a*tWy)W2Q(7#J8#82H#3c-R?uHwx%5PTs><$jCHVk4cS-fsug=D9yyc4FD>r B2~7Y1 delta 125 zcmcb|{E2WBwh1LGD|A085wvI!SeAXAk~wt7>gO1C$D2vlVxFK;9}rrU}RtgTEGfa O2c#Goc!4An10MiQE$ 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 a__%)pAE}GvBh|)7gitgy4-Q555cmfQpPd>2 literal 0 HcmV?d00001 diff --git a/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/dao/RestaurantDao.class b/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/dao/RestaurantDao.class new file mode 100644 index 0000000000000000000000000000000000000000..753b6988461c73783918885e30e998389c88b09b GIT binary patch literal 650 zcmbtS%T5A85Uk-Th`56B3p~KZxp2d1G)kgDArd}d*qy9HU}rNsL&C3l@B{oPV=rr5 zj2=ihc2#%RRP}s(zP$tJp@-nP_z*B$cOJV#UoW|fLn8t{ z&^j2IKpNt2;+QAWtduXgjI6S2o^QC{0DT7UN!nK(jD-dbIWR`QJ-jMd^u1H^4iMdzZ3c*&5ohBgJ2-^*6C=L&Xy-Xn$4weD+~+; t`ZPeX#85M~Vjh6+4_syLvAZ>RvkK-y@L~2C z&LAB`MnSd>^H>OCID`ktwIPp1`FN;cNv?w==4tu4|USh4fQ(Q{9S{HLIdmY|SWWu|%WEU4fol zl`|XKl3vkQOWK5Cn6_%`rcn{N(q#XF=WEI|Y;DV?lh%8>q1$5u{@%VNfxwhmWI89( zx}jyO8>^bNsM5DUByASd(voWF@^@`AU_a3rES@fy8?kD6-BOFOq-hrCt)gb>#`;9L z9II&7rq1k(su{~^6}d7sFOPXPK6mWyao=8!XKe z66kO}RBgQ!lQZ1hwHF$L*1$bJG^cwXQ}`I;X7{D?(GJ`5wpw_WQOi#Lj&9eedKR70 z>?dY%LABHk&8EOu^uYtoa#7$?Zv*4JEd_G7Z(pWNUeNTohuGa4Ik=UQt=N`=b%A4f zece#)s>Q9VM~L##JUaK(IJy0>s#6>bO+z2yZv3~11*O>l!;KTln^mizC3Sf*yS&R& zyHvxnbqEZkO=~??DND|4@_1gD*0UIUiKUq~rN}!|HY>Vq@)Cq`0T%^2<<6L+;0eo8 zx2253_zdR+^7%wMF|`=AqHC795%q$)S0K7PlgK5a*05fT#_vbH<4YBz^SS9nE;{*$ ztKPhOtnm+rqu@yxI-V+c7Dfph3XCvJl*4!qHc+>ez1KO63N9*G3&Tb=j7_`{=ypnW z>|9AsR`n9Q7j<|!j4f~~757EcskuZn zPT?MgWvm{gIqcma)^L@=i{6iWTwR6SIRe+F4VgFE12Vt*R4cHvjedwX>ef?JtwVaQ zUDg8U<! zp;6E_-F<8+XZU{<;qlKWy9meg{0FO*W0YfnBijz2pYvCYqu|)m{}$p`zW8v7PiYLa z<1(LN*8o>=mA?df(MKz87GXMT;avV5e2?D3pY8t*fk;cFbq9(c@jy=?5=|^k!pp31h?QJpg*RB)C~LaUw34)*VX`vyQKr|;J^dJqF7 zog=VMYJ9Rok)8pU4k1xmgwvXBP}ZQQtigTCy2@(zDr&(*h<1(ABG22y^yK{v0GNwnWTPmyHQI<=} V!Q`uJD@jg1eC3duso&}p@GnlNYSjP$ literal 0 HcmV?d00001 diff --git a/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/dao/StateDao.class b/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/dao/StateDao.class new file mode 100644 index 0000000000000000000000000000000000000000..fef78537c932657491b76bafe393738be6fdf851 GIT binary patch literal 275 zcma)%F>b;@5JmqGgNX?e$AE@y(z!|$kdTasRa;PY4r%0Rb zzv9oE|MmUx3E&xv7>_X$!jlo7d-n3$A2i{x&MLmMx^it)W^0pfvcld}*BHlI?XA@( zr^S`Ed1)Heio2JED5-tvdo>=~jX5Q(j^Zy?zq8|;cyTQuZU@yMN^;w|LiXiV2+Ohf w#&$c%3F;q8&Gy$9YQgpQ_32zm;b#QGBy0sJB0L}pJPkA@%&-a&2bf^~18;6lXaE2J literal 0 HcmV?d00001 diff --git a/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/dao/StateDaoImpl.class b/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/dao/StateDaoImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..4b450f0f765b4a00c30c212228fafc771fa8f680 GIT binary patch literal 2153 zcmbtV+fv(B6kW%b5!fODlhBZ+#A(u$yP5=&6bLQX)Ty}y2sFJs2>HY)u_afMlh9A; z5A>DJbSC3=rqkzsRNHkVV{q#sw0+Py(%$>5eK~7y{r<<#zXF)VH)-_ZUKe_BKZB1k ztz#w)4fi@RtK&fibNHkaH!}DX^J-bpv8aSg87yN(Ee~~krX#Q8k-!D%hE8~}YPnWP z`YV-1Qy5^JliVoSiYma8$vDI zcj#%VV0#s_RxSBf(OmJo;<{gyzT=kWt5q|Q{!51$6fMu(VsLWF^755xnZAvZ3?tFP zLB1%Ej}te`mRm9lo?Dt3J_~SM#27m+6QNVz)}*TCV4EUrA5>-WvC`A9OTM;cRh3NO zVq_fqUp^AkMh{fnD#V@>7Ey!(-7S|WaIKBUmfItsR_47n(Q2VnHVc$c)8ATVM%pO# zZX4L+L}veEq2}l^ALrDJ;{RZE^E&Mpt5!9NI->gLItn^g*$7N{RfhXsal`VhiVVp` zf%KMF^KH4}D3bM_B*=v70)f$j=aIC4w0=;v1TSFcvO$YvK0iJEB_4axS5D~8 z+nsiE9B#^>Rt{s1W*h0p literal 0 HcmV?d00001 diff --git a/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/entity/AddressEntity.class b/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/entity/AddressEntity.class index fef4f1c433f80dd4f778e55521fbc83add06f693..d395040d1de57be8839faff8cadd9a71461fd5e1 100644 GIT binary patch literal 2704 zcmb`IZEqVz5XWczbdKYaq@)IiCMgAq<2H4nEupjo5;rb(Lt4eb5=A09`?l@{=gzu^ zitwF~K&pj=1RsD8h4|0zxo*#AULan0Zgywx_Ba38UH|p>?|%}}E!rxO#}2jy zr7Ig9yi`}I3;VVs^)g3Hz=Ztaj_KJvjwUm~GaCxu+3&fhwQ$(?Osm##UF(r&NiJe% zIIQ{7du~H=i3SB{wH?dyr0?&k5sEynw5DtSzh+uo(&E=Lc;;Gk;$O#hF(uLY}Lir>`z%$`1F7J-C<>j9UK~fEz;twV9ECK~(Y0|DnoUP9=_qqTcG&k&RSi#pXSVtqiC^KQ z=zZ9nn%txh;1_iQU7-&#;+HGP;+Ow`GzC02`Q_^Rh*H(f5v8l;%!o48a(0BzmUAP@ zRm;YRjA|)AqWol$D^Q#XGIRspM^O7?sCpBs-J(l$8w-9y*Jw*Y98#VaiXhn29b%7r zz*pU-(mSI();6m=)-k6%*33{I>yxJq_^Sp!MEC?Zny~jUh2I)}>-Y(((p6Y3RZ1&S zeL<<85qwpu?L?`rfk{iX4MJwjDVZi36c8uc1#4Y>p`^ySmv!c%I+-;q6sw@?s%@HS z+`bo-{w2oLNMyPJrN>Muy;}7ux)x_@f$8B4CcWz;Ce}`%b-b10Oqn>-K_b)5WTs4< z=@3lq8BF@DMNHgFfo+t;l#MfW5}9r%GiBpUPr&ru3?_ZTBPQNk0$VzXDHmt@K9OlF znJE`%>Vl~^gGt{j5fkrqL7yfv8F8kkiA;BrnT$Bo37CGE!K81qh>6dhpwAM|T|R#9 uoJ6L($>;8syGNfp4@~|HCVhuSOneul=$^8ltG|T>jJGlV0<5_5zx)RPQm0D* literal 3407 zcmb`IZC4vr5XWcp2q9Qn9yGPBD=LMwu=YVJv>@TBjY5DDqO@wyCVL6X+3d!BK=E_< zA$+OlnBzIV@B{dvJpN~Q2}#`aD5o!S@6MgMbAK~;?&Pn(|M-)L9@5tt%Fx~*4bpQS z_IW7taKJ-_hc9{fDouxJdXc7=62){)qS37r^;A_1)vPN;(-n1LKb9!>+%sLhAu76~ zR}E1xP0LkX-7+1CCj1>gC{1BIy5kD7CX}LvO_LFdr@|Dr>I$u*8lHgBfa9`UKYOh` zPAZ=@ef#42MyXsZA4-()JSM)@LA>wUx><+Y>k((KS%%jzp-h-+Ltr{MD6UJCGK5)o zkK@SO3V2MPVSDg55J^pSNuI-yppa5yp-w z$`%Hwr$Y592sHmblp5{?8P!eKQA(CuLNqYE*?oVU%dR_2J<(0wU6$yl>3?VQjjdcR z3o{j@cFj-dl`Y*AB|r0Jz9YVTPJczUb(X`$gnO)`Fcv?$CkFM z+9(wll`T89Z!Fc|Oj z5$f5+FkEbQl;tpXbjm}}`+4!}aR}NAiH~0k>J;n2R|adl=S7>ra$6XH#;-_Z6SSAR zKz`(HH;dDk^umE>_ASq@iA~+V`mQ^hcm88Yhe`S%OIaF5Km6}?)Rhqga`ET1Q$0Zj zB^vXWbW7RC?Vu0-$c+Fe4&o0`q9ICCj8Db)TWIK4Azi^d0{N<-Ycz@lActz6Cn!#D zJM<3aigcaceL**1f`CF3-Z_C4nA|$oBGOPh%pc)5 zh2H>4qk+T-w`m&s8La<|In6ft-$}~fX;CbHw?*;%Y>N{4T%twEd@k9dR6dt#QTkU{ z#wd?*5*~@}Qi5iYtT~*iAR8Z3j_%>=?&I7CbO#pC0`IV#g~TjDzW9sN67$zM1^kye z#WxP0{KY{g{V$Fxg)@k9DQqWfBpgC8CYUh{|JkB|Fmg~2FiV(|9MlCf=Y;4J_@DRL zvVl>^CV~E5=ztvs4t}G7U$7|%I^{1eL~g#1Q-hQ)W9EZWoX&yXQEnkmuCbO5GGAEw|HhfG|Y5eVBp<5;Dm?({dzJs+UQPWcnp)z;x7yDd=4x6F**wR;YlH zA8u!jr+b<7NTyXmRCRuw$^2AIq~Ox$23zro<$O@bpv>;Aam_tJUvrcKCCVT8v0 bjEea9{3XR!=nI%)X^XZUDz(KO7I*&vd~u_W diff --git a/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/entity/CategoryEntity.class b/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/entity/CategoryEntity.class new file mode 100644 index 0000000000000000000000000000000000000000..0013fdb455105a843ca656b90f4dc84040fa7076 GIT binary patch literal 1893 zcmbVMYi|=*5S_bzEymPofTV%Yghz?v1eUgx(m+g&J!1PSA9bA`vu)_K!nRqU)dH;v(v&4gJP|bYEOY|Zms`qLJGQJljvJVP zavfjL#QFTGj(Wmr?=^*ADv*f?3DxOLSz-cDW}IcHa8i<%>=@p zX)7z5%;;h|v{X*u8*MjehqjIUE5l51vmrK0T?XlT`|W7HbB%hZxwi3a`_Fd$X;V=C zp>kAE6O^gUZ=rj`wZKAoT{*HH_IIS$F~Kimb-Sj$WqOMJ|Amhr?Pj+m7)YKCw0z>OslRDAA+URSOv z=HdKdT0FpQUbXbiI+}1Qk@Dm|Mg;N_9m-LnYjnLtWAt^2F4J_0W@%c`BtL(0K^}+7 z2Di{-7{^OxEtlvwYViRc^~G7fta__nEy zbzr)23MSSC>l0(T9AWw)6;pN;(_AX1AJZ{qM=>n`)8Z+Z;sr=B%|@8;zmsUU3-Vd` z+6T&QzoYzk;ed43@qo^Z7vt{?%-GxkogFX57umy$u~)b~pmU?c+&M8!Es;#4pU_96 Qdq->gGyMDLj`jZKKS{`dyZ`_I literal 0 HcmV?d00001 diff --git a/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/entity/CategoryItemEntity.class b/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/entity/CategoryItemEntity.class new file mode 100644 index 0000000000000000000000000000000000000000..298b422f4d31eb5bb0ec2b1489ab0e080da7298c GIT binary patch literal 1899 zcmbtUTTc{O5U$g6WgI|fT@-JyUf5wkdR1KA6>wp=IEY{tLgLGkX8L42rl)(-eTIme z{Yjf>vWtl({s4cJ@vH7;fSJY@AEr*#sj5?7)mPJ>zkK*aMAP)NK!fzKj|S*B7QeH2 zl%tsfW$0m^X8D|B@ijq9|^jY;HY{|yXnH2cCDrqbUh(vMY__rw6wP^ zr!5hi4>a42{cpwt&DMS^jIS*&t#8$~UI@x6Et@rTkz-|t`x%Q%?pcnq!zRo+8bJx= z>cCw0^m^NIQ18g)s^$t$B6J*|vPec6^!EFBRrGw^sL>X1mq!E!$l7JbS~prLWw^e5+*!(%(}U zv;-}B->e=YL6b}274T;oQZqDQ0EL+#veM;MhIICs)Gs~zx#fcg4eA8-aeO?kK8}v{ ze%yBo;JtqMj@xz8D1&R+ywL3*EiAHWUW?9 zx}f5Axp&;X48)ycP**^HPsVX~^>jC;I)HBqa8im49xwDC@UgiB`#jDcVGjjxT!3;> z(l9&*GXTkPgE-@uD|8hX*YL}efR8PMdFl-vO$bF2a}0R{i6%~gGgEm_;$8UCO~`C` zIY76d7oz|gqn}|3D$_V*lx#%4%70}1+m(DRF}Xq$fXT^o=sblpTN(MEjHA*8_zCzj zh~n}?p`DG(Gqh-WlkjB(490Xj5mTxg(^w*=sboy4ZcG(mnm7d$GbJd-bUDOiCSpo= zW133D^h+|PbT_8Ez;y2vOuP~uOd}yC{MB&9^}!oJfQx!$TR3@PaYg=VLB$t04$E0?yT>9*uSDC*8IU&jsb$o literal 0 HcmV?d00001 diff --git a/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/entity/CustomerAddressEntity.class b/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/entity/CustomerAddressEntity.class index a422ace71afff46be72c045324f6fd33841a571d..9ec45c51c701f8fe255469a51878128bb0560d8b 100644 GIT binary patch literal 1443 zcmbu8T~8B16o$`izi3&cB37v%d?;Efu&8*Y!88b_q=J#AiQbT5cT$FIcbnZ=BK{{Y zOf)85_yhb=#&>oX#kzXq&6zoK-kEvMIWynBfB8y8>$F~>BCV9EK&#qV+N_o6eu*BG z=piFRI*iy3qnTHcr{qBNWGD|^(egZBaV32(WK`=M^ArBo8j2v4p%R`gthV!*Q9UED z>ATUuLoo00fnc?lfwVy8L)saMzS{>UTSkbT_aL3yAeP=IlL?FF>YdEw*5u8X= zO`yi=)Y?puTM5rryoxdu`a)?qV4x+1F!Az@9ZgkzA=HuYyyOAus?Z8X6VRWXrT0x> z$9dmGJiSAQO@z<6m3==7Y_TnMYW1^yzcH=q#%K5WC-h84gX7X5p{ku`dcc!ZO}a`m zCXG?qq$zD`RA%(_KTC&;G^piruW#)g9t&GBnvR#GZ|$QE+?DTi&uAVWpoq6nq8u5T z1M>=AM;-n+Mic%-h`#!OC0=hvrF*2H^IoM>gk;IxG$#{?8`OR~go9Af(D!q9F z`RQ*^Y|efn!o~Q6TI?6o>or8p^@YOL|S zJrqGGLoJje?3N3qyBQmw3nc=sg?q}qNI+;Y)Mnlv{i8fi>W+r7eCzP2(`|LXhN=^V z+8>C3(N5d(2X-{<2i&!v`M!G`xFV3M-xv<i%!R(tErjw`bt|S%7k?of@2^%fwhj66bD__C z_e&liK^oTpNrKJEd5rd8`F|AX5&$lZ?N|T1Ekj!dS`q?AyK|AHBUc94)YRTQT(g#9 ztP?*99Pvz=l;57XJ0n*&PZKsXYHV77YZ;qy$>0hsJIU35$tSg*b?G|DqWdBe!3a86 zBRn5ZM^i5g-g$;^FwgTr9eS z??I99B+&xp3UXF226-!wNfHQ&n6EWs!ug!V3U9-?RH3$+PQ12+1xfuAY&BNoO6OaKVNS;|{fgOpJ|KyMBz*0z74T>AJL4&06{ ztd6CU;~}4fbsM?`e8JE$dXL^mn`T-_Gu1Ph>To23X(7$@089^G!DMpDKpZnI$4np4 zhZ#)yG}EI@rUy7FgDIb8+5ywyE!n&utYlM!im8+2)Gx+na&SrOdTn&kT8Rt;55GS z@FG&L_sdyC=)fq&J4sDT@m69Lcl;=5^A$&y?neJkXPQ5fk5>Oi2Sth7?c&Q;bw|NQ z+DRGrE!440ReD&aGL4jJif)u?TFz$V>^?mx)2tjS^nlU)|7jGofy9pA@#eux-bOD^ zs3pfYchGTom_Nz(q`UZ(74e!&R3JlwVLpoYeTyI(8~7U{cAb=E$g3xbCRL)0O!Ow*ZP2}bHVAY1 zthf5RQ0(&V+x=Zgne3KSdUcmMU@=(;jPHQQ#4p2duKGK%-!L)gU5t6PI7W{!FUJmW zeGe9+_vr(Saj+5ZRbP?uODg!WHuyvQmoZfEB1AS2Q>ae=d`iaI*+sRy0ER`CVk&k^ z&PM=5BnV22x3;nN!N9nfAc+{0b)7ivyje71M%Nr(9a6 z@3c&ddYy7lOtzNkDJ>0jI#;`Vn&}Ws&J|4YD@&N} zE2d>FQz6adYMJVKrb3#j2c{pdV2a;%!ZfRxRXI-AG|f#U!$7%lCA#>O9Igu literal 3405 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 literal 3468 zcmbW2`*#yX6vywTNt1?!M$5y3tpUWgLAyv%9_3X++D6g`O0~s z{-7QKkDlWn;2-7jJ3E`S*-YTzFL&q8y)*Nf`w{aP=+?S*y7?5 z7mvBv=Hdw#Pr3LuN#CU@O%*P_=VE7so{^rWU8*LjmL!&>J%wUMO(CVI(D;ULc}A0M z8LqKwvIWbsJ>4^G%T?%PX(zU$dd z<`e=Ifk@PuR|GK5N3IjD(BjiYj+0qoUc;`f>kb0rA;$_O;lCNg_4xFREV4;#AskLj z_uKidDz;cW2)Bv_htwmmmbyVd0^@-;3R|Hk^rNu%&hYi?-8}I12U-TUd~aehaEMIt zE0%-o@Vkgns-e3Lk(`ugi!xFuUABFv$`%ctqOsoC&hpNXH$pe~ta?2|;zge!V ztrRvC%1YdLsn#C)$TM?!8ei~!QE2jQu5CD;s)iMCuN}E|;s@-8HoNaKlU2Q}pWSop zX14cMn0?t`4$JzpVMU8F&EC4vqpNh0K38dsj;l05lPaC%;yf1@xR~N%nu{DwDs;(q z>YCots|}{1n45T9f`*;bc74M{HEYXZ{O<`}r8+fKTB5lm87l45^CX!nHOW%w+W&0_ z6g*Fwcq-O*_Ynn!jt5hQt(6gL-86m@4LPj0TFgS@EFP|Mv1op#^uG5&W@g{HrVGV?~wrTR-hsQNI1w&pKArb-#70V@1LDTW2~}bV9#1C#++zprataz@6vt zRq##Z-jMPu1~Hn2Oyf%!#px1h7^%Vu+LzE2x*ROz8))4Pey7;am=GHb2Mgw;i?7gE z@ZyVaH2QRph1#ib524gCV+VWxR0 z({;K5uU@8$uV^UBbO%g#2QZ0B37IAWrg<<*?I@FYsjoyV#52s~EnH;Tr`Zy`(@{Q!x0vY1n#A z?C1^spep7K!?ZP9H;smZf!v{Xr2U}Qh1Jj-wlIo9&6Z{q3)n$>2_;APm*YC^%S z0GlVm5SC_((vDVb3fjgSw%nJG|J9yo3deQFKD)G>FJue54AX4N9QvFvYE?7J>XvQk zMwxEMyx2!tRWCW&s6}SPSh`_1)Vyiuo7E}}Z=BCwMmfhoJZpft?c$Ou zm$f*}HeIp^j&#Lo=^cdAS?NiFk;HSwJ9iZo-#4`?k)8{`ad0S#_RRPmGc^wm&llgj zWQ2;=sJQgUZPV3+g2a~Dw2ERymqkdOv3EyGJXp~!dIvo@wfBKjIZ_{%xhC-u(n<8= zS`xz;N#d3qM)6@1V;E6z$F$0-R@aIZK_S*^)S{!<`|3ecud>GKvXk$EyG!C*>?iRZ z2yC+B(^W6sw#NraEMX>wViF~Y7+xe%Mn%EY|Irr}Bsp?h%w<_YzjLIU>J|mcF8k3{ zcT}s_g+V3mw9CdTO`DLslkr@~?9LHGzTF17?7$aqJ3-@JEH znhE$8;3j`(`k>${A_z%|b3MS{rXh6U9nSA^KiJ^K5Es`4-op*ru?sj#yA)^7W*G1D z;3og#P_Dw+g=DW>H2omZlpS@^bTrVEeRt7xEWq>%VY7QVjuV*5S>YVXyn^y87a?Rg zMxDccOmLla4R9MDb4T4ckKD&0@9|57e)c`S9r$<>cNs!Ho+F=KoTHhM6NJt}CwLD` zlKs1mhXH3F^}L6;xX zLt>h~1e2`40uR%$gXz;iOkqE!*+5JWgE58um>v_;{3V#C+c8Z$m_EZy08f#hd^{}$ zVw%P07kIjUf`}i}Dlug*!6X&k;%U^uG#AKI)X!5c5YwYzo}zwCo5b|&5=^pnTA0Qh zOpi&bE7K*4R0^{9HDbH35YJ4UqWcsHKV{o(&U;&8?ZpBX&zvtf&iPa26=9mLW%s3C zqleCunNz%ViYtEKdu^$wT79_O;_aU2CZ72Xso&A-r*6OPecXE=!U_Y2@TB$8TID`V JIQ+P+{R4e*P6Yq} literal 0 HcmV?d00001 diff --git a/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/entity/RestaurantCategoryEntity.class b/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/entity/RestaurantCategoryEntity.class new file mode 100644 index 0000000000000000000000000000000000000000..129c539eead682d993edbd7da7ba8755df0c08f2 GIT binary patch literal 1931 zcmbtUZBG+f6h60a)LJZ}i-I8dx`hQtU3Ps1Eu~-$mQCrB@MX==xvAGoXPTKiWXWcK zl8KwFn7GOQ0DqM6IWwh&GWf+0oO{nb=gfJ|^Bns5%cuW|XpyQpD$s*7bdDafdBo=N z5IxCJnjU27DW6Mhmb3IMOV9aQVzV+tG{gn(rHSgYCRD&5fdo8cF=YZOgUy-3c4PXvo0O!nOa)grX5J+ zW_`_mYyX@1K-1Xog!$FgO07|C>Fp_y zE+LWLH|o8K%Uw*BFn}r2Eg8}PBoH<2M_#J3)cs&`a))F>vex})5kudi~p6=2;K`Y-cEyU|%-rRjF zn_5uD>~y39%@&F$SwAU6cStZbiG4UxaWq^$Jxtf|BU8Z7Pm&VMD`BtUO~Ai^^CJ8o zd<4dDxg_Z_jUx}#!*X5$XE)~xP2yn+e_0Z!WiP=3olKpMNktKh3ws@f22O!9J@=8s zKjD{dz-Ge7EZxLCA0^N&x(!dzk5q(>iW5<6?q5p08z{aUTRcm1fXT(nm^_IyGdKN# z68+XW#CfPRM&$Nmp`YotXJ`?7KOvTezBmNU$6`tjVw#D?v=EOeIf&^dFx@%@6DuXC zi)kXnbSD;5Y7kQ~7LyT=DK&^`9+(zR!Ne=k!*n&og#Rl%G5vpld=`H3KT7X>q|E5h z0cBao13ELBi|$FjpN;M*+(-UCp!@+1zeiny`g?Nk$OwyFp%QdI%=)>vzKigGK~Jpt GuU`QLYmwIg literal 0 HcmV?d00001 diff --git a/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/entity/RestaurantEntity.class b/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/entity/RestaurantEntity.class new file mode 100644 index 0000000000000000000000000000000000000000..4a2da2e7484895e5f588299f30cb51c37acd3192 GIT binary patch literal 2937 zcmbW2ZBrXn6vxkoJd>6}OBDKKAH+ay*J`VlQZ%K|hC-krpmoN{EZIv~CfUvG1Il+& zM`y}7;|o84AFAX3++8;9=EfJk$hi;aoO^!voU=Foy#4EMB6>jI7ipX}3sj^!i!B!0 zEMBo_u-IYIWU-s0y&Qd~QOYtk($+PaX#}=!^~9d#S^Hg4wQa{Ye9N&tjmjHG#-=-NCVQQS4)*Ynk#kdK))FEX(#iz3%w+ zpxcGv)%S1DQQphIc~^M85x9o!*X6Ay1{_>IbCr~lx||f zvPE6SX&Pt>&a%@sx_gFe@jBW}`-c{~WND-A^z@+LaSc;na~yNaH3b)<+VAV0aF4;S z3pAO3qBr7nuF4IRAkz^(bAbTunDN3@y0Xqd7dC}|=$PAvi|qSoLydB<-<74mRGC*5 zKZheigXzk!o==^`5d)I2u#@mg?v2B4JFf0HECwq+2OZSE#8C#z;*JxzXg!O|JUz%jSf6|R0I0wB zxPUX!$M)_kAv*-cEjCtnn$_J#wcadIh2~3CqH`rG(+4G*WpRbYHM(A+8+5Zow^_{5 zIgJ+oe^a4t7(09uw)T%i+sEnrOcLcO#R!BC6suVpqX~=`u%7gwn8M_upi49jJ5WNh z-2}$Src57VV+OxGX%|VZQhb+T)5}Uz+&GFpjxjp*D!h?};WIu`o`GBqo8D5IBBR5m zA1h6f_hHjd6sD5^M=>E6kOv*3hB347Cux6RlA=41S-DxDPcbir26UJ1VWq+4Gsw_6 z73vn=Q0mu&^IfI$efk_B*m)V{8^f4gxPD5hLFgj%ME5BJOAcR_>ueOB(ZUw^0=kTb z1v5RMhcVOHh2GHE?@+#bp@&MQFX^k8DHTRrxN}NlNv20&S{%W|?WR%0RF+I%E1A+s zrYB0KM{1^YlBo)&rz4oSuVbcJ$+W0s$|RXql}wM-OqnE84NU7Jn8FVz%F`9ev_wx7 zwafmNsNJTLX_>wms@<(q$|jj!fvGWqiND=APuC>Vw^UUy<$g&p?JAj`(#jCiyTN~Y)P jx1f+@vcPmSf{CBKm}yRy=Y^ED`0ZcE`X!9;AF=T-Sm^Ho literal 0 HcmV?d00001 diff --git a/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/entity/RestaurantItemEntity.class b/FoodOrderingApp-service/target/classes/com/upgrad/FoodOrderingApp/service/entity/RestaurantItemEntity.class new file mode 100644 index 0000000000000000000000000000000000000000..a2f33d86dd75e2d6c0ae798314087606b8d0391b GIT binary patch literal 1263 zcmbtTU2hUW6ukp1rAVdLTBRTML#-6G`{J9XkyL87p|qhZiBHYIPUtktEZLoH?0?b+ zlQt$k_yhb=#xo02YS0%$xHI>Qd(OGTkDuSZ6VXeu^JGzFnlkjvnCDaUVv4pIrKHD* z?K3JhW2I$Jv}7dPzNjh{Xs%_TB1Q}KGk(rL+I;`_^Q%GhM z?+Hd56KdWGB|@%+*W!LGP@9Xi@w*rQtOpwRqMy_|Z)*+LaX&CBgd);B4!P2f;o>lw zxelEeew#xG=iHZGLdx!d7)DB^BfAmkM(q25v2s%cGwg;C+1FA@y~8M7-fDs2Zs37o zu`ZQp#J#o%T@LLS&DDbr_gg%a#vcYV`cy*9H}y`?v*Ug@*}+?+G)?2o z!@m_FQNU$J&}}NB4p?AKo$-b>b95Jhd3M8I56{NQOtkWq*cV(<^Z+)S z1anlv-Hb79i?oE3(K4;T4w_SgT;-BdpOGAIo}bwKkXBJ;ns-1ajWb(Wy`t3h=sfZS z5ElB)_=UvJ4#yj414-79vltwMX`MDkn0^zwr1U2w$1yEW#PoxEXxJvY#(xOZZmS|80e^8+4)%xy5UYOiZF z7L(ZaoT%j@sk>H-X*3;E^OCvDw?byuEhl2A9SB0PZ=U_L9yGPHwydu{-`THKYwvJP z6bTI@@*2~z+@^UL`rK`bwr=D&7UU#h25B@HKoi@STv-`^P>|^j?(%R`qhxumj-K0| z4fNqX?y~);b;SId=pt_M8kSSHd@lB#Lp?m^aA|F?;kC@D-SjQneBpWafp0Sbvej;z z0rO8eY-2DvJOd#(c4Q39a(TC(zW+p!nmL808A7cC65ki5z_1Aox7%^rG@-(WAeuqW4}Ye~#Z{D^dg zm*kCq50*3)rlbPlkwJH;WY7Q&8Z<(q1{G;kqt*X%8hnCD&B(#g32THJ<>e9g%tO4D z}{1DKn6nb9YgnJtQyu-`9SVe;gREP#G zV5YDZM1#u21tltr7nH1&^b6828y02JBpOaZ;WWg|P@W#h<`tZxL8rNhlnWvfI>j%l zAT{YUiFhc90z!&#C}^h8P{}btrR1Db;xm#;j_{XgHde|ED3p{<+$8QwOBt8!%8Yp^ zSdblxs7F`LqtEjcb_HTy~hm+a+jTei!7(4`aWG{SsI) G&gO5+B_m4! literal 1908 zcmbVMTT|0e5Z;sCXsz5q5ib=LXt~52pn?d3I-Nnh0G&Y}oX{NGFlkbALF=#5869VQ z@CW##9KTH>)Eap3)M%^)Ec z?B9gh=_SK5yk$X&$zlayYqk!|o(;p2n|@NjhSrmK%_TYu*0k}FtkHdR+T2L`m1P~K~)Tg>B8uty0KlmAxz?+Fv@eJZ`Wtv}Zs z)Zn2JfM9DjyrHU~gOLvpk*g?LE|HB&PR)?$9mevW$WXF)_?Uf8nD6(&f+t z9#KITPYP`zu=`Ib4_o0xrQQJq1C17%vg#Gw!du5~6xzzb(fhh|WWk-~Auim%7tS)P zvTB+^BpNk(0zjTd>3p7gsV`3>ymV1k(A<9w6f{2i>YwfHgS4Q*;K;DmEhwUy#z&rC zx{RMj8s9~R5~T2(*yr%2^uap?n}>f|QaAPB0OX?UA=rMT47fB%LuDGKGq30@LO?wV z=?y{@4mlUzcHsm?V!Z(5Td)E)Rr*HaGd2oc#F~R8KqUcn2|Ff$AS!?=f54+Oh6o1O zh2^ihhXG1cUr8xVf2G6`R6jrn2}!(}MM^gwV8}w47C{0aDvWo`U!g0A%5uGg1Ag@? zUBk++s;~k!Rr*57PuPUCSwjNFILhNR5m8=-B`s>8LZz zD}|pLjG##>V(sLlbaE=jaw^eO94Dod(+oJx9>XadhlmqvC1^U9Q=*g8jaW`I@toQ^ z8tOC$PV>ib3g<84#Jy8MpI0>)>v^>PI{X{piov`YOyTXAZdfy@8^