Ver Fonte

Merge remote-tracking branch 'origin/master'

Blazej há 3 anos atrás
pai
commit
f0dd0d70ed
26 ficheiros alterados com 552 adições e 26 exclusões
  1. 1 1
      .gitignore
  2. 14 14
      src/main/java/com/example/plantsforyou/appuser/AppUserController.java
  3. 13 2
      src/main/java/com/example/plantsforyou/appuser/AppUserService.java
  4. 7 0
      src/main/java/com/example/plantsforyou/appuser/LoginCredentials.java
  5. 40 0
      src/main/java/com/example/plantsforyou/cart/Cart.java
  6. 47 0
      src/main/java/com/example/plantsforyou/cart/CartController.java
  7. 15 0
      src/main/java/com/example/plantsforyou/cart/CartRepository.java
  8. 49 0
      src/main/java/com/example/plantsforyou/cart/CartService.java
  9. 38 0
      src/main/java/com/example/plantsforyou/dto/AddToCartDto.java
  10. 21 0
      src/main/java/com/example/plantsforyou/dto/CartDto.java
  11. 22 0
      src/main/java/com/example/plantsforyou/dto/ItemCartDto.java
  12. 19 0
      src/main/java/com/example/plantsforyou/dto/PlaceOrderDto.java
  13. 14 0
      src/main/java/com/example/plantsforyou/exceptions/RejectedRequestException.java
  14. 1 1
      src/main/java/com/example/plantsforyou/filter/CustomAuthorizationFilter.java
  15. 42 0
      src/main/java/com/example/plantsforyou/items_order/ItemOrder.java
  16. 9 0
      src/main/java/com/example/plantsforyou/items_order/ItemOrderController.java
  17. 6 0
      src/main/java/com/example/plantsforyou/items_order/ItemOrderRepository.java
  18. 16 0
      src/main/java/com/example/plantsforyou/items_order/ItemOrderService.java
  19. 59 0
      src/main/java/com/example/plantsforyou/order/Order.java
  20. 39 0
      src/main/java/com/example/plantsforyou/order/OrderController.java
  21. 6 0
      src/main/java/com/example/plantsforyou/order/OrderRepository.java
  22. 54 0
      src/main/java/com/example/plantsforyou/order/OrderService.java
  23. 3 0
      src/main/java/com/example/plantsforyou/plant/Plant.java
  24. 4 4
      src/main/java/com/example/plantsforyou/plant/PlantManagementController.java
  25. 10 1
      src/main/java/com/example/plantsforyou/plant/PlantService.java
  26. 3 3
      src/main/resources/application.properties

+ 1 - 1
.gitignore

@@ -3,7 +3,7 @@ target/
 !.mvn/wrapper/maven-wrapper.jar
 !**/src/main/**/target/
 !**/src/test/**/target/
-
+src/main/resources/application.properties
 ### STS ###
 .apt_generated
 .classpath

+ 14 - 14
src/main/java/com/example/plantsforyou/appuser/AppUserController.java

@@ -39,21 +39,21 @@ public class AppUserController {
                 JWTVerifier verifier = JWT.require(algorithm).build();
                 DecodedJWT decodedJWT = verifier.verify(refresh_token);
                 String username = decodedJWT.getSubject();
-                Optional<AppUser> opt = appUserService.getAppUser(username);
+                AppUser opt = appUserService.getAppUser(username);
                 AppUser user;
-                if(opt.isPresent()){
-                    user = opt.get();
-                    String access_token = JWT.create()
-                            .withSubject(user.getEmail())
-                            .withExpiresAt(new Date(System.currentTimeMillis() + 10 * 60 * 1000)) //10 mins
-                            .withIssuer(request.getRequestURL().toString())
-                            .sign(algorithm);
-                    Map<String, String> tokens = new HashMap<>();
-                    tokens.put("access_token", access_token);
-                    tokens.put("refresh_token", refresh_token);
-                    response.setContentType(APPLICATION_JSON_VALUE);
-                    new ObjectMapper().writeValue(response.getOutputStream(), tokens);
-                }
+
+                user = opt;
+                String access_token = JWT.create()
+                        .withSubject(user.getEmail())
+                        .withExpiresAt(new Date(System.currentTimeMillis() + 10 * 60 * 1000)) //10 mins
+                        .withIssuer(request.getRequestURL().toString())
+                        .sign(algorithm);
+                Map<String, String> tokens = new HashMap<>();
+                tokens.put("access_token", access_token);
+                tokens.put("refresh_token", refresh_token);
+                response.setContentType(APPLICATION_JSON_VALUE);
+                new ObjectMapper().writeValue(response.getOutputStream(), tokens);
+
             }catch (Exception exception){
                 response.setHeader("error", exception.getMessage());
                 response.setStatus(FORBIDDEN.value());

+ 13 - 2
src/main/java/com/example/plantsforyou/appuser/AppUserService.java

@@ -1,5 +1,9 @@
 package com.example.plantsforyou.appuser;
 
+import com.auth0.jwt.JWT;
+import com.auth0.jwt.JWTVerifier;
+import com.auth0.jwt.algorithms.Algorithm;
+import com.auth0.jwt.interfaces.DecodedJWT;
 import com.example.plantsforyou.registration.token.ConfirmationToken;
 import com.example.plantsforyou.registration.token.ConfirmationTokenService;
 import lombok.AllArgsConstructor;
@@ -11,7 +15,6 @@ import org.springframework.stereotype.Service;
 
 import java.time.LocalDateTime;
 import java.util.List;
-import java.util.Optional;
 import java.util.UUID;
 
 @Service
@@ -57,9 +60,17 @@ public class AppUserService implements UserDetailsService {
         return token;
     }
     public List<AppUser> getAppUsers(){ return appUserRepository.findAll(); }
-    public Optional<AppUser> getAppUser(String email){ return appUserRepository.findByEmail(email); }
+
+    public AppUser getAppUser(String email){ return appUserRepository.findByEmail(email).orElseThrow(() ->  new UsernameNotFoundException(String.format(USER_NOT_FOUND_MSG,email)));
+    }
 
     public int enableAppUser(String email) {
         return appUserRepository.enableAppUser(email);
     }
+
+    public AppUser getUserFromToken(String token){
+        JWTVerifier verifier = JWT.require(Algorithm.HMAC256("secret".getBytes())).build();
+        DecodedJWT decodedJWT = verifier.verify(token);
+        return getAppUser((String) decodedJWT.getSubject());
+    }
 }

+ 7 - 0
src/main/java/com/example/plantsforyou/appuser/LoginCredentials.java

@@ -1,5 +1,12 @@
 package com.example.plantsforyou.appuser;
 
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+@Getter
+@AllArgsConstructor
+@NoArgsConstructor
 public class LoginCredentials {
     private String username;
     private String password;

+ 40 - 0
src/main/java/com/example/plantsforyou/cart/Cart.java

@@ -0,0 +1,40 @@
+package com.example.plantsforyou.cart;
+
+
+import com.example.plantsforyou.appuser.AppUser;
+import com.example.plantsforyou.plant.Plant;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import javax.persistence.*;
+import java.util.Date;
+
+@NoArgsConstructor
+@Getter
+@Setter
+@Entity
+public class Cart {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long id;
+    private Date createdDate;
+    @ManyToOne
+    @JoinColumn(name = "plant_id", referencedColumnName = "id")
+    private Plant plant;
+    @JsonIgnore
+    @OneToOne(targetEntity = AppUser.class)
+    private AppUser appUser;
+
+    private int quantity;
+
+
+
+    public Cart(Plant plant, Integer quantity, AppUser appUser) {
+        this.plant = plant;
+        this.appUser = appUser;
+        this.quantity = quantity;
+        this.createdDate = new Date();
+    }
+}

+ 47 - 0
src/main/java/com/example/plantsforyou/cart/CartController.java

@@ -0,0 +1,47 @@
+package com.example.plantsforyou.cart;
+
+import com.example.plantsforyou.appuser.AppUser;
+import com.example.plantsforyou.appuser.AppUserService;
+import com.example.plantsforyou.dto.CartDto;
+import com.example.plantsforyou.dto.AddToCartDto;
+import com.example.plantsforyou.exceptions.RejectedRequestException;
+import com.example.plantsforyou.plant.Plant;
+import com.example.plantsforyou.plant.PlantService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+@RestController
+@RequestMapping("api/v1/cart")
+public class CartController {
+    private final CartService cartService;
+    private final PlantService plantService;
+    private final AppUserService appUserService;
+
+    @Autowired
+    public CartController(CartService cartService, PlantService plantService, AppUserService appUserService) {
+        this.cartService = cartService;
+        this.plantService = plantService;
+        this.appUserService = appUserService;
+    }
+
+    @PostMapping
+    public ResponseEntity<Object> addToCart(@RequestBody AddToCartDto itemCartDto) throws RejectedRequestException {
+        String token = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest().getHeader("Authorization").substring("Bearer ".length());
+        AppUser appUser = appUserService.getUserFromToken(token);
+        Plant plant = plantService.findPlantById(itemCartDto.getPlantId());
+        cartService.addToCart(itemCartDto, plant, appUser);
+        return new ResponseEntity<>(HttpStatus.CREATED);
+    }
+    @GetMapping()
+    public ResponseEntity<CartDto> getItemsFromCart(){
+        String token = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest().getHeader("Authorization").substring("Bearer ".length());
+        AppUser appUser = appUserService.getUserFromToken(token);
+        CartDto cartDto = cartService.getAllItemsFromCart(appUser);
+
+        return new ResponseEntity<>(cartDto,HttpStatus.ACCEPTED);
+    }
+}

+ 15 - 0
src/main/java/com/example/plantsforyou/cart/CartRepository.java

@@ -0,0 +1,15 @@
+package com.example.plantsforyou.cart;
+
+import com.example.plantsforyou.appuser.AppUser;
+import com.example.plantsforyou.plant.Plant;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Optional;
+
+@Repository
+public interface CartRepository extends JpaRepository<Cart, Long> {
+    Optional<Cart> findByPlantAndAppUser(Plant plant, AppUser appUser);
+    List<Cart> findAllByAppUserOrderByCreatedDate(AppUser appUser);
+}

+ 49 - 0
src/main/java/com/example/plantsforyou/cart/CartService.java

@@ -0,0 +1,49 @@
+package com.example.plantsforyou.cart;
+
+import com.example.plantsforyou.appuser.AppUser;
+import com.example.plantsforyou.dto.CartDto;
+import com.example.plantsforyou.dto.AddToCartDto;
+import com.example.plantsforyou.dto.ItemCartDto;
+import com.example.plantsforyou.exceptions.RejectedRequestException;
+import com.example.plantsforyou.plant.Plant;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class CartService {
+    private final CartRepository cartRepository;
+
+    @Autowired
+    public CartService(CartRepository cartRepository) {
+        this.cartRepository = cartRepository;
+    }
+
+    public void addToCart(AddToCartDto addToCartDto, Plant plant, AppUser appUser) throws RejectedRequestException {
+        if(cartRepository.findByPlantAndAppUser(plant,appUser).isPresent()){
+            throw new RejectedRequestException("Plant is already in a cart", HttpStatus.BAD_REQUEST);
+        }
+        Cart cart = new Cart(plant,addToCartDto.getAmountInBasket(),appUser);
+        cartRepository.save(cart);
+    }
+
+    public CartDto getAllItemsFromCart(AppUser appUser){
+        List<Cart> cartList = cartRepository.findAllByAppUserOrderByCreatedDate(appUser);
+        List<ItemCartDto> itemCartDto = new ArrayList<>();
+        double totalPrice = 0.0;
+        for (Cart cart: cartList) {
+            ItemCartDto itemCartDtoTemp = getDtoFromCart(cart);
+            itemCartDto.add(itemCartDtoTemp);
+            totalPrice += itemCartDtoTemp.getPlant().getPrice() * itemCartDtoTemp.getQuantity();
+        }
+
+        return new CartDto(itemCartDto,totalPrice);
+    }
+
+    private ItemCartDto getDtoFromCart(Cart cart) {
+        return new ItemCartDto(cart);
+    }
+}

+ 38 - 0
src/main/java/com/example/plantsforyou/dto/AddToCartDto.java

@@ -0,0 +1,38 @@
+package com.example.plantsforyou.dto;
+
+import com.example.plantsforyou.cart.Cart;
+import com.example.plantsforyou.plant.Plant;
+import com.sun.istack.NotNull;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@NoArgsConstructor
+@Setter
+@Getter
+@AllArgsConstructor
+public class AddToCartDto {
+
+    /*
+    * products: "[{\"id\":1,
+    * \"name\":\"Monstera deliciosa\",
+    * \"price\":25.12,
+    * \"quantity\":3,
+    * \"description\":\"Najbardziej pożądana roślina we wnętrzach ostatnich lat, czule nazwana przez nas Grzegorzem, zawdzięcza swoją popularność nie tylko wyjątkowej urodzie, ale też swojej bezproblemowości. Monstera jest jedną z tych roślin, z którymi będziesz żyć długo i szczęśliwie.\",
+    * \"typeOfLight\":\"diffused\",
+    * \"difficulty\":\"EASY\",
+    * \"size\":\"MEDIUM\",
+    * \"inStock\":true,
+    * \"amountInBasket\":2}]"
+    * */
+    Long id;
+    private @NotNull Long plantId;
+    private @NotNull Integer amountInBasket;
+
+    public AddToCartDto(Long plantId, Integer amountInBasket) {
+        this.plantId = plantId;
+        this.amountInBasket = amountInBasket;
+    }
+
+}

+ 21 - 0
src/main/java/com/example/plantsforyou/dto/CartDto.java

@@ -0,0 +1,21 @@
+package com.example.plantsforyou.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import java.util.List;
+
+@NoArgsConstructor
+@Setter
+@Getter
+public class CartDto {
+    List<ItemCartDto> plantsInCart;
+    Double totalCost;
+
+    public CartDto(List<ItemCartDto> plantsInCart, Double totalCost) {
+        this.plantsInCart = plantsInCart;
+        this.totalCost = totalCost;
+    }
+}

+ 22 - 0
src/main/java/com/example/plantsforyou/dto/ItemCartDto.java

@@ -0,0 +1,22 @@
+package com.example.plantsforyou.dto;
+
+import com.example.plantsforyou.cart.Cart;
+import com.example.plantsforyou.plant.Plant;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Getter
+@Setter
+@NoArgsConstructor
+public class ItemCartDto {
+    private Long id;
+    private Plant plant;
+    private Integer quantity;
+
+    public ItemCartDto(Cart cart){
+        this.id = cart.getId();
+        this.plant = cart.getPlant();
+        this.quantity = cart.getQuantity();
+    }
+}

+ 19 - 0
src/main/java/com/example/plantsforyou/dto/PlaceOrderDto.java

@@ -0,0 +1,19 @@
+package com.example.plantsforyou.dto;
+
+
+import lombok.*;
+
+@Getter
+@Setter
+@NoArgsConstructor
+@ToString
+@AllArgsConstructor
+public class PlaceOrderDto {
+    //todo: validation
+    private String phoneNumber;
+    private String postalCode;
+    private String street;
+    private String city;
+
+
+}

+ 14 - 0
src/main/java/com/example/plantsforyou/exceptions/RejectedRequestException.java

@@ -0,0 +1,14 @@
+package com.example.plantsforyou.exceptions;
+
+import org.springframework.http.HttpStatus;
+
+
+public class RejectedRequestException extends Exception{
+    private final HttpStatus status;
+
+    public RejectedRequestException(String message, HttpStatus status) {
+        super(message);
+        this.status = status;
+    }
+
+}

+ 1 - 1
src/main/java/com/example/plantsforyou/filter/CustomAuthorizationFilter.java

@@ -30,7 +30,7 @@ import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;
 public class CustomAuthorizationFilter extends OncePerRequestFilter {
     @Override
     protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
-        if(request.getServletPath().equals("/login") || request.getServletPath().equals("/api/v1/register") || request.getServletPath().equals("/api/v*/users/token/refresh/**")){
+        if(request.getServletPath().equals("/login") || request.getServletPath().equals("/api/v1/registration") || request.getServletPath().equals("/api/v*/users/token/refresh/**")){
             filterChain.doFilter(request,response);
         }
         else{

+ 42 - 0
src/main/java/com/example/plantsforyou/items_order/ItemOrder.java

@@ -0,0 +1,42 @@
+package com.example.plantsforyou.items_order;
+
+
+import com.example.plantsforyou.order.Order;
+import com.example.plantsforyou.plant.Plant;
+import com.sun.istack.NotNull;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import javax.persistence.*;
+import java.util.Date;
+
+
+@Getter
+@Setter
+@NoArgsConstructor
+@Entity
+public class ItemOrder {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long id;
+    private Date date;
+    @NotNull
+    private double price;
+    @OneToOne
+    @JoinColumn(name = "plant_id", referencedColumnName = "id")
+    private Plant plant;
+    @ManyToOne
+    @JoinColumn(name = "order_id", referencedColumnName = "id")
+    private Order order;
+    @NotNull
+    private Integer quantity;
+
+    public ItemOrder(Integer price, Plant plant, Order order, Integer quantity) {
+        this.date = new Date();
+        this.price = price;
+        this.plant = plant;
+        this.order = order;
+        this.quantity = quantity;
+    }
+}

+ 9 - 0
src/main/java/com/example/plantsforyou/items_order/ItemOrderController.java

@@ -0,0 +1,9 @@
+package com.example.plantsforyou.items_order;
+
+import org.springframework.stereotype.Controller;
+
+@Controller
+public class ItemOrderController {
+
+
+}

+ 6 - 0
src/main/java/com/example/plantsforyou/items_order/ItemOrderRepository.java

@@ -0,0 +1,6 @@
+package com.example.plantsforyou.items_order;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface ItemOrderRepository extends JpaRepository<ItemOrder, Long> {
+}

+ 16 - 0
src/main/java/com/example/plantsforyou/items_order/ItemOrderService.java

@@ -0,0 +1,16 @@
+package com.example.plantsforyou.items_order;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class ItemOrderService {
+    private ItemOrderRepository itemOrderRepository;
+
+    @Autowired
+    public ItemOrderService(ItemOrderRepository itemsOrderRepository) {
+        this.itemOrderRepository = itemsOrderRepository;
+    }
+
+
+}

+ 59 - 0
src/main/java/com/example/plantsforyou/order/Order.java

@@ -0,0 +1,59 @@
+package com.example.plantsforyou.order;
+
+import com.example.plantsforyou.appuser.AppUser;
+import com.example.plantsforyou.items_order.ItemOrder;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import lombok.ToString;
+
+import javax.persistence.*;
+import java.util.Date;
+import java.util.List;
+
+@Getter
+@Setter
+@NoArgsConstructor
+@Entity
+@Table(name = "orders")
+public class Order {
+    //todo: validation
+    @Id
+    @GeneratedValue(strategy = GenerationType.AUTO)
+    private Long id;
+
+    private String postalCode;
+
+    private String street;
+
+    private String city;
+
+    private String phoneNumber;
+
+    private Date createdDate;
+
+    private double totalPrice;
+
+    @OneToOne
+    @JsonIgnore
+    @JoinColumn(name = "appuser_id", referencedColumnName = "id")
+    private AppUser appUser;
+
+    @OneToMany
+    private List<ItemOrder> itemsOrders;
+
+    private String status;
+
+    public Order(String postalCode, String street, String city, String phoneNumber, double totalPrice, AppUser appUser, List<ItemOrder> itemsOrders, String status) {
+        this.postalCode = postalCode;
+        this.street = street;
+        this.city = city;
+        this.phoneNumber = phoneNumber;
+        this.createdDate = new Date();
+        this.totalPrice = totalPrice;
+        this.appUser = appUser;
+        this.itemsOrders = itemsOrders;
+        this.status = status;
+    }
+}

+ 39 - 0
src/main/java/com/example/plantsforyou/order/OrderController.java

@@ -0,0 +1,39 @@
+package com.example.plantsforyou.order;
+
+import com.example.plantsforyou.appuser.AppUser;
+import com.example.plantsforyou.appuser.AppUserService;
+import com.example.plantsforyou.cart.CartService;
+import com.example.plantsforyou.dto.PlaceOrderDto;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+@Controller
+@RequestMapping("api/v1/order")
+public class OrderController {
+
+    private final AppUserService appUserService;
+    private final CartService cartService;
+    private final OrderService orderService;
+
+
+    public OrderController(AppUserService appUserService, CartService cartService, OrderService orderService) {
+        this.appUserService = appUserService;
+        this.cartService = cartService;
+        this.orderService = orderService;
+    }
+
+    @PostMapping()
+    public ResponseEntity<Object>placeOrder(@RequestBody PlaceOrderDto placeOrderDto){
+        String token = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest().getHeader("Authorization").substring("Bearer ".length());
+        AppUser appUser = appUserService.getUserFromToken(token);
+        orderService.placeOrder(placeOrderDto,appUser);
+        return new ResponseEntity<>(HttpStatus.CREATED);
+    }
+
+}

+ 6 - 0
src/main/java/com/example/plantsforyou/order/OrderRepository.java

@@ -0,0 +1,6 @@
+package com.example.plantsforyou.order;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface OrderRepository extends JpaRepository<Order, Long> {
+}

+ 54 - 0
src/main/java/com/example/plantsforyou/order/OrderService.java

@@ -0,0 +1,54 @@
+package com.example.plantsforyou.order;
+
+import com.example.plantsforyou.appuser.AppUser;
+import com.example.plantsforyou.cart.CartService;
+import com.example.plantsforyou.dto.CartDto;
+import com.example.plantsforyou.dto.ItemCartDto;
+import com.example.plantsforyou.dto.PlaceOrderDto;
+import com.example.plantsforyou.items_order.ItemOrder;
+import com.example.plantsforyou.items_order.ItemOrderRepository;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+
+@Service
+public class OrderService {
+    private OrderRepository orderRepository;
+    private final CartService cartService;
+    private final ItemOrderRepository itemOrderRepository;
+
+    public OrderService(OrderRepository orderRepository, CartService cartService, ItemOrderRepository itemOrderRepository) {
+        this.orderRepository = orderRepository;
+        this.cartService = cartService;
+        this.itemOrderRepository = itemOrderRepository;
+    }
+
+    public void placeOrder(PlaceOrderDto placeOrderDto, AppUser appUser) {
+        CartDto cartDto = cartService.getAllItemsFromCart(appUser);
+        List<ItemCartDto> itemCartDtos = cartDto.getPlantsInCart();
+
+        Order order = new Order();
+        order.setAppUser(appUser);
+        order.setCity(placeOrderDto.getCity());
+        order.setCreatedDate(new Date());
+        order.setPhoneNumber(placeOrderDto.getPhoneNumber());
+        order.setPostalCode(placeOrderDto.getPostalCode());
+        order.setTotalPrice(cartDto.getTotalCost());
+        order.setStreet(placeOrderDto.getStreet());
+        order.setStatus("Waiting for payment");
+        orderRepository.save(order);
+
+        for (ItemCartDto itemCartDto:
+             itemCartDtos) {
+            ItemOrder itemOrder = new ItemOrder();
+            itemOrder.setDate(new Date());
+            itemOrder.setPrice(itemCartDto.getPlant().getPrice());
+            itemOrder.setPlant(itemCartDto.getPlant());
+            itemOrder.setQuantity(itemCartDto.getQuantity());
+            itemOrder.setOrder(order);
+            itemOrderRepository.save(itemOrder);
+        }
+        //todo:delete items from cart
+    }
+}

+ 3 - 0
src/main/java/com/example/plantsforyou/plant/Plant.java

@@ -3,6 +3,7 @@ package com.example.plantsforyou.plant;
 import com.example.plantsforyou.plant.enums.PlantCareDifficulty;
 import com.example.plantsforyou.plant.enums.PlantSize;
 import com.example.plantsforyou.plant.enums.PlantTypeOfLight;
+import lombok.AllArgsConstructor;
 import lombok.Getter;
 import lombok.NoArgsConstructor;
 import lombok.Setter;
@@ -13,9 +14,11 @@ import javax.persistence.*;
 @Setter
 @NoArgsConstructor
 @Entity
+@AllArgsConstructor
 public class Plant {
 
     @Id
+    @Column
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Long id;
     private String name;

+ 4 - 4
src/main/java/com/example/plantsforyou/plant/PlantManagementController.java

@@ -23,15 +23,15 @@ public class PlantManagementController {
     }
 
     @PostMapping
-    public ResponseEntity addNewPlant(@RequestBody Plant plant){
+    public ResponseEntity<Object> addNewPlant(@RequestBody Plant plant){
         plantService.addPlant(plant);
-        return new ResponseEntity(HttpStatus.OK);
+        return new ResponseEntity<>(HttpStatus.OK);
     }
 
     @DeleteMapping(path = "{plantID}")
-    public ResponseEntity deletePlant(@PathVariable("plantID") Long plantID){
+    public ResponseEntity<Object> deletePlant(@PathVariable("plantID") Long plantID){
         plantService.delete(plantID);
-        return new ResponseEntity(HttpStatus.OK);
+        return new ResponseEntity<>(HttpStatus.OK);
     }
 
     @PutMapping(path = "{plantID}/inStock")

+ 10 - 1
src/main/java/com/example/plantsforyou/plant/PlantService.java

@@ -1,6 +1,9 @@
 package com.example.plantsforyou.plant;
 
+import com.example.plantsforyou.exceptions.RejectedRequestException;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.security.web.firewall.RequestRejectedException;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
@@ -18,7 +21,13 @@ public class PlantService {
     public List<Plant> getAllPlants(){
         return plantRepository.findAll();
     }
-    public Optional<Plant> findPlantById(Long plantID){ return plantRepository.findById(plantID); }
+    public Plant findPlantById(Long plantID) throws RejectedRequestException {
+        Optional<Plant> plant = plantRepository.findById(plantID);
+        if(plant.isPresent()){
+            return plant.get();
+        }
+        throw new RejectedRequestException("Plant does not exist",HttpStatus.BAD_REQUEST);
+    }
     public void addPlant(Plant plant){
         plantRepository.save(plant);
     }

+ 3 - 3
src/main/resources/application.properties

@@ -1,6 +1,6 @@
-spring.datasource.url=jdbc:postgresql://ec2-99-80-170-190.eu-west-1.compute.amazonaws.com:5432/dav1hstm1q97fa
-spring.datasource.username=avcbegattsywaa
-spring.datasource.password=d176f011dbb9eb34974327d668442fcd4c93e2f17b29c1c9591ddd06037f4f09
+spring.datasource.url=jdbc:postgresql://localhost:5432/plantsforyou
+spring.datasource.username=postgres
+spring.datasource.password=1234
 spring.jpa.hibernate.ddl-auto=create-drop
 spring.jpa.show-sql=true
 spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect