Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
85 changes: 85 additions & 0 deletions src/main/java/kr/mayb/controller/ProductController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
package kr.mayb.controller;


import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import kr.mayb.dto.ProductDto;
import kr.mayb.dto.ProductRegistrationRequest;
import kr.mayb.dto.ProductUpdateRequest;
import kr.mayb.facade.ProductFacade;
import kr.mayb.security.DenyAll;
import kr.mayb.security.PermitAdmin;
import kr.mayb.security.PermitAll;
import kr.mayb.util.response.ApiResponse;
import kr.mayb.util.response.ListResponse;
import kr.mayb.util.response.Responses;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;


@Tag(name = "Product", description = "상품 관련 API")
@DenyAll
@RestController
@RequiredArgsConstructor
public class ProductController {

private final ProductFacade productFacade;

@Operation(summary = "제품 등록(관리자)")
@PermitAdmin
@PostMapping("/products")
public ResponseEntity<ApiResponse<ProductDto>> registerProduct(@RequestPart(value = "profile") MultipartFile profileImage,
@RequestPart(value = "detail") MultipartFile detailImage,
@RequestPart(value = "product") @Valid ProductRegistrationRequest request) {
ProductDto response = productFacade.registerProduct(profileImage, detailImage, request);
return Responses.ok(response);
}

@Operation(summary = "상품 전체 조회", description = "관지자는 모든상품, 일반 사용자는 활성화 상품만 조회 가능")
@PermitAll
@GetMapping("/products")
public ResponseEntity<ApiResponse<ListResponse<ProductDto, Void>>> getProducts() {
List<ProductDto> response = productFacade.getProducts();
return Responses.ok(response);
}

@Operation(summary = "상품 단건 조회")
@PermitAll
@GetMapping("/products/{productId}")
public ResponseEntity<ApiResponse<ProductDto>> getProduct(@PathVariable long productId) {
ProductDto response = productFacade.getProduct(productId);
return Responses.ok(response);
}

@Operation(summary = "상품 수정")
@PermitAdmin
@PutMapping("/products/{productId}")
public ResponseEntity<ApiResponse<ProductDto>> updateProduct(@PathVariable long productId,
@RequestPart(value = "profile", required = false) MultipartFile profileImage,
@RequestPart(value = "detail", required = false) MultipartFile detailImage,
@RequestPart(value = "product") @Valid ProductUpdateRequest request) {
ProductDto response = productFacade.updateProduct(productId, profileImage, detailImage, request);
return Responses.ok(response);
}

@Operation(summary = "상품 삭제")
@PermitAdmin
@DeleteMapping("/products/{productId}")
public ResponseEntity<Void> deleteProduct(@PathVariable long productId) {
productFacade.deleteProduct(productId);
return Responses.noContent();
}

@Operation(summary = "상품 목록에서 숨기기 확성화, 비활성화")
@PermitAdmin
@PutMapping("/products/{productId}/{status}")
public ResponseEntity<Void> changeStatus(@PathVariable long productId, @PathVariable boolean status) {
productFacade.changeStatus(productId, status);
return Responses.ok();
}
}
1 change: 0 additions & 1 deletion src/main/java/kr/mayb/data/model/Member.java
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,6 @@ public class Member extends BaseEntity{
@Column
private String idealType;


@JsonIgnore
@BatchSize(size = 10)
@ManyToMany(fetch = FetchType.LAZY)
Expand Down
62 changes: 62 additions & 0 deletions src/main/java/kr/mayb/data/model/Product.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package kr.mayb.data.model;

import jakarta.persistence.*;
import kr.mayb.enums.ProductStatus;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.annotations.BatchSize;

import java.util.ArrayList;
import java.util.List;

@Getter
@Setter
@Table(schema = "mayb")
@Entity
public class Product extends BaseEntity {

@Id
@Column(name = "product_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;

@Column
private String name;

@Column
private int originalPrice;

@Column
private int salePrice;

@Column
private String profileImageUrl;

@Column
private String detailImageUrl;

@Column
private String description;

@Column
private long creatorId;

@Column
private long lastModifierId;

@Column
@Enumerated(EnumType.STRING)
private ProductStatus status;

@BatchSize(size = 20)
@OneToMany(mappedBy = "product", cascade = CascadeType.ALL)
private List<ProductTag> productTags = new ArrayList<>();

@BatchSize(size = 20)
@OneToMany(mappedBy = "product", cascade = CascadeType.ALL)
private List<ProductGender> productGenders = new ArrayList<>();

@BatchSize(size = 20)
@OneToMany(mappedBy = "product", cascade = CascadeType.ALL)
private List<ProductDateTime> productDateTimes = new ArrayList<>();
}
25 changes: 25 additions & 0 deletions src/main/java/kr/mayb/data/model/ProductDateTime.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package kr.mayb.data.model;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;

import java.time.LocalDateTime;

@Getter
@Setter
@Table(schema = "mayb")
@Entity
public class ProductDateTime extends BaseEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;

@Column(nullable = false)
private LocalDateTime dateTime;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "product_id", nullable = false)
private Product product;
}
26 changes: 26 additions & 0 deletions src/main/java/kr/mayb/data/model/ProductGender.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package kr.mayb.data.model;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@Table(schema = "mayb")
@Entity
public class ProductGender extends BaseEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;

@Column(nullable = false)
private String gender;

@Column(nullable = false)
private int price;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "product_id", nullable = false)
private Product product;
}
23 changes: 23 additions & 0 deletions src/main/java/kr/mayb/data/model/ProductTag.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package kr.mayb.data.model;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@Table(schema = "mayb")
@Entity
public class ProductTag {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;

@Column(nullable = false)
private String name;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "product_id", nullable = false)
private Product product;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package kr.mayb.data.repository;

import kr.mayb.data.model.Product;
import kr.mayb.data.model.ProductDateTime;
import org.springframework.data.jpa.repository.JpaRepository;

public interface ProductDateTimeRepository extends JpaRepository<ProductDateTime, Long> {
void deleteByProduct(Product product);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package kr.mayb.data.repository;

import kr.mayb.data.model.Product;
import kr.mayb.data.model.ProductGender;
import org.springframework.data.jpa.repository.JpaRepository;

public interface ProductGenderRepository extends JpaRepository<ProductGender, Long> {
void deleteByProduct(Product product);
}
7 changes: 7 additions & 0 deletions src/main/java/kr/mayb/data/repository/ProductRepository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package kr.mayb.data.repository;

import kr.mayb.data.model.Product;
import org.springframework.data.jpa.repository.JpaRepository;

public interface ProductRepository extends JpaRepository<Product, Long> {
}
10 changes: 10 additions & 0 deletions src/main/java/kr/mayb/data/repository/ProductTagRepository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package kr.mayb.data.repository;

import kr.mayb.data.model.Product;
import kr.mayb.data.model.ProductTag;
import org.springframework.data.jpa.repository.JpaRepository;

public interface ProductTagRepository extends JpaRepository<ProductTag, Long> {

void deleteByProduct(Product product);
}
14 changes: 14 additions & 0 deletions src/main/java/kr/mayb/dto/DateTimeInfo.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package kr.mayb.dto;

import kr.mayb.data.model.ProductDateTime;

import java.time.LocalDateTime;

public record DateTimeInfo(
long id,
LocalDateTime dateTime
) {
public static DateTimeInfo of(ProductDateTime dateTime) {
return new DateTimeInfo(dateTime.getId(), dateTime.getDateTime());
}
}
14 changes: 14 additions & 0 deletions src/main/java/kr/mayb/dto/GenderPrice.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package kr.mayb.dto;

import jakarta.validation.constraints.NotBlank;
import kr.mayb.data.model.ProductGender;

public record GenderPrice(
@NotBlank
String gender,
int price
) {
public static GenderPrice of(ProductGender gender) {
return new GenderPrice(gender.getGender(), gender.getPrice());
}
}
13 changes: 12 additions & 1 deletion src/main/java/kr/mayb/dto/MemberDto.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
package kr.mayb.dto;

import kr.mayb.data.model.Authority;
import kr.mayb.data.model.Member;
import kr.mayb.enums.AccountStatus;
import kr.mayb.enums.AuthorityName;
import kr.mayb.enums.Gender;
import lombok.AllArgsConstructor;
import lombok.Getter;

import java.time.LocalDate;
import java.util.List;

@Getter
@AllArgsConstructor
Expand Down Expand Up @@ -34,7 +37,14 @@ public class MemberDto {

private AccountStatus status;

private List<AuthorityName> authorities;

public static MemberDto of(Member member, String contact) {
List<AuthorityName> authorityNames = member.getAuthorities()
.stream()
.map(Authority::getName)
.toList();

return new MemberDto(
member.getId(),
member.getEmail(),
Expand All @@ -46,7 +56,8 @@ public static MemberDto of(Member member, String contact) {
contact,
member.getIntroduction(),
member.getIdealType(),
member.getStatus()
member.getStatus(),
authorityNames
);
}
}
Loading
Loading