Commit 75175179 authored by 0Tyler's avatar 0Tyler

checkout api

parent d3a4013d
package edu.prlab.ecsimple.common.mapper;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
public class MapperUtil {
private final static ObjectMapper mapper = new ObjectMapper();
public static JsonNode objectToJsonNode(Object obj) {
return mapper.valueToTree(obj);
}
}
......@@ -9,7 +9,6 @@ import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
@Configuration
public class DefaultBean {
@Bean
public BCryptPasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
......
package edu.prlab.ecsimple.config;
import edu.prlab.ecsimple.domain.Account;
import edu.prlab.ecsimple.domain.Role;
import edu.prlab.ecsimple.common.exception.EntityNotFoundException;
import edu.prlab.ecsimple.domain.*;
import edu.prlab.ecsimple.service.AccountServiceImpl;
import edu.prlab.ecsimple.service.OrderServiceImpl;
import edu.prlab.ecsimple.service.ProductServiceImpl;
import lombok.RequiredArgsConstructor;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Optional;
@RequiredArgsConstructor
@Component
public class DefaultDataBean implements ApplicationRunner {
private final AccountServiceImpl userService;
private final ProductServiceImpl productService;
private final OrderServiceImpl orderService;
@Override
public void run(ApplicationArguments args) {
......@@ -20,5 +27,20 @@ public class DefaultDataBean implements ApplicationRunner {
userService.create(Account.builder().username("user1").password("1234").build());
userService.addRoleToAccount("user1", "ADMIN");
userService.addRoleToAccount("user1", "USER");
productService.create(Product.builder()
.name("test")
.tags(List.of("test"))
.build());
TheOrder a = orderService.create(TheOrder.builder()
.email("email")
.state("state")
.checkoutDate("2020-07-14 00:00:00")
.build())
.orElseThrow(() -> new EntityNotFoundException("no order"));
Item b = orderService.create(Item.builder()
.quantity(1)
.build())
.orElseThrow(() -> new EntityNotFoundException("no Item"));
orderService.addItemToOrder(a.getIid(), b.getSku());
}
}
package edu.prlab.ecsimple.config;
import edu.prlab.ecsimple.filter.CustomAuthenticationManager;
import edu.prlab.ecsimple.filter.JwtAuthenticationFilter;
import edu.prlab.ecsimple.filter.JwtConfig;
import edu.prlab.ecsimple.filter.JwtTokenProvider;
import edu.prlab.ecsimple.filter.*;
import edu.prlab.ecsimple.service.AccountServiceImpl;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
......@@ -57,10 +54,12 @@ public class SecurityConfig {
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.addFilterBefore(new JwtAuthenticationFilter(authenticationManager, jwtTokenProvider, jwtConfig), UsernamePasswordAuthenticationFilter.class)
.authorizeRequests()
.anyRequest().authenticated();
.antMatchers("/h2**").permitAll()
// .addFilterBefore(new JwtAuthenticationFilter(authenticationManager, jwtTokenProvider, jwtConfig), UsernamePasswordAuthenticationFilter.class)
// .addFilter(new JwtAuthorizationFilter(authenticationManager, jwtTokenProvider))
.anyRequest().permitAll();
http.headers().frameOptions().disable();
return http.build();
}
......
package edu.prlab.ecsimple.controller;
import edu.prlab.ecsimple.common.mapper.MapperUtil;
import edu.prlab.ecsimple.model.ResponseModel;
import edu.prlab.ecsimple.service.ProductService;
import edu.prlab.ecsimple.service.ProductServiceImpl;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequiredArgsConstructor
public class ProductController {
private final ProductServiceImpl productService;
@GetMapping("/product/{sku}")
public ResponseEntity<ResponseModel> getProduct(@PathVariable Integer sku) {
return productService.getProduct(sku)
.map(MapperUtil::objectToJsonNode)
.map(it -> ResponseEntity.ok()
.body(ResponseModel.builder()
.status("status")
.data(it)
.build()))
.orElseGet(() -> ResponseEntity.notFound().build());
}
@GetMapping("/product")
public ResponseEntity<ResponseModel> getProducts() {
return ResponseEntity.ok()
.body(ResponseModel.builder()
.status("status")
.data(MapperUtil.objectToJsonNode(productService.getProducts()))
.build());
}
// @PostMapping("/checkout")
// public ResponseEntity<ResponseModel> checkout(){
// return
// }
}
\ No newline at end of file
package edu.prlab.ecsimple.domain;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class Item {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer sku;
@Column
private Integer quantity;
}
package edu.prlab.ecsimple.domain;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer iid;
@Column
private String name;
@Builder.Default
@ElementCollection(fetch = FetchType.EAGER)
private List<String> tags = new ArrayList<>();
}
package edu.prlab.ecsimple.domain;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
// Order在H2是保留字
public class TheOrder {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer iid;
@Builder.Default
@ManyToMany(fetch = FetchType.EAGER)
private Collection<Item> items = new ArrayList<>();
@Column
private String email;
@Column
private String checkoutDate;
@Column
private String state;
}
package edu.prlab.ecsimple.model;
import com.fasterxml.jackson.databind.JsonNode;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.configurationprocessor.json.JSONObject;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ResponseModel {
private String status;
private JsonNode data;
}
package edu.prlab.ecsimple.repo;
import edu.prlab.ecsimple.domain.Item;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface ItemRepo extends JpaRepository<Item, Integer> {
}
package edu.prlab.ecsimple.repo;
import edu.prlab.ecsimple.domain.TheOrder;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface OrderRepo extends JpaRepository<TheOrder, Integer> {
}
package edu.prlab.ecsimple.repo;
import edu.prlab.ecsimple.domain.Product;
import edu.prlab.ecsimple.domain.Role;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.Optional;
@Repository
public interface ProductRepo extends JpaRepository<Product, Integer> {
}
package edu.prlab.ecsimple.service;
import edu.prlab.ecsimple.domain.Item;
import edu.prlab.ecsimple.domain.TheOrder;
import java.util.Optional;
public interface OrderService {
Optional<TheOrder> create(TheOrder theOrder);
Optional<Item> create(Item item);
void addItemToOrder(Integer orderId, Integer itemId);
}
package edu.prlab.ecsimple.service;
import edu.prlab.ecsimple.common.exception.EntityNotFoundException;
import edu.prlab.ecsimple.domain.Item;
import edu.prlab.ecsimple.domain.TheOrder;
import edu.prlab.ecsimple.repo.ItemRepo;
import edu.prlab.ecsimple.repo.OrderRepo;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Optional;
@Service
@RequiredArgsConstructor
@Transactional
public class OrderServiceImpl implements OrderService {
private final OrderRepo orderRepo;
private final ItemRepo itemRepo;
@Override
public Optional<TheOrder> create(TheOrder theOrder) {
return Optional.of(theOrder)
.map(it -> orderRepo.save(theOrder));
}
@Override
public Optional<Item> create(Item item) {
return Optional.of(item)
.map(it -> itemRepo.save(item));
}
@Override
public void addItemToOrder(Integer orderId, Integer itemId) {
orderRepo.findById(orderId)
.map(order -> itemRepo.findById(itemId)
.map(item -> order.getItems().add(item))
.orElseThrow(() -> new EntityNotFoundException("No found this order")))
.orElseThrow(() -> new EntityNotFoundException("No found this order"));
}
}
package edu.prlab.ecsimple.service;
import edu.prlab.ecsimple.domain.Product;
import java.util.List;
import java.util.Optional;
public interface ProductService {
Optional<Product> create(Product product);
Optional<Product> getProduct(Integer id);
List<Product> getProducts();
}
package edu.prlab.ecsimple.service;
import edu.prlab.ecsimple.domain.Product;
import edu.prlab.ecsimple.repo.ProductRepo;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Optional;
@RequiredArgsConstructor
@Service
public class ProductServiceImpl implements ProductService{
private final ProductRepo productRepo;
@Override
public Optional<Product> create(Product product){
return Optional.of(product).map(productRepo::save);
}
@Override
public Optional<Product> getProduct(Integer id) {
return productRepo.findById(id);
}
@Override
public List<Product> getProducts() {
return productRepo.findAll();
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment