본문 바로가기

카테고리 없음

24.03.21 제한걸기

오늘은 먼저 제한을 구현했다.

 

data class ProductRequest(

    @Schema(description = "제목은 최대 250자까지 가능하며, 최소 1자 이상이어야 합니다", example = "사과")
    @field:Size(min = 1, max = 250, message = "제목은 최소 1자 이상, 최대 250자까지 가능합니다.")
    val title: String,

    @Schema(description = "내용은 최소 1자 이상, 최대 1000자까지 가능합니다", example = "상품 설명")
    @field:Size(min = 1 ,max = 1000, message = "내용은 최소 1자 이상, 최대 1000자까지 가능합니다.")
    val content: String,
    val imageUrl: String,

    @Schema(description = "가격은 0보다 커야 합니다", example = "100")
    @field:Positive(message = "가격은 0보다 커야 합니다.")
    val price: Double,

    val purchaseAble: Boolean,
    val userLimit: Int,
    val discount: Double,

    @Schema(description = "재고는 0보다 커야 합니다", example = "10")
    @field:Positive(message = "재고는 0보다 커야 합니다.")
    val stock: Int, // 재고?
)

 

제목에 @Schema(description = "제목은 최대 250자까지 가능하며, 최소 1자 이상이어야 합니다", example = "사과")
    @field:Size(min = 1, max = 250, message = "제목은 최소 1자 이상, 최대 250자까지 가능합니다.") 이렇게 넣어서 글자수를 제한하는 식으로 제한을 만들고 

 

@Operation(summary = "상품 등록", description = "새로운 상품을 시스템에 등록합니다.")
@PostMapping("/products")
fun createProduct(
    @AuthenticationPrincipal user: UserPrincipal,
    @RequestBody @Valid request: ProductRequest,
): ResponseEntity<ProductResponse> {
    val product = productService.createProduct(user.id, request)
    val response = ProductResponse(product)
    return ResponseEntity.ok(response)
}

이렇게 컨트롤러의 post 부분에 @Valid를 넣고, 그래들에 

implementation("org.springframework.boot:spring-boot-starter-validation")

 

이걸 넣어서 제한을 활성화 시켰다.

 

그리고 상품을 생성할때에 별점도 생성할수 있었다는걸 눈치채고 그것도 수정했다.

 

@Column(name = "ratingAverage", nullable = true)
var ratingAverage: Double? = null,

엔티티에서 별점 평균을 이렇게, ProductRequest에서 별정 평균부분을 삭제하고 

 

@Transactional
override fun createProduct(
    sellerId: Long,
    request: ProductRequest,
): Product {
    val seller =
        sellerRepository.findByIdOrNull(sellerId)
            ?: throw ModelNotFoundException("seller", sellerId)

    val product =
        Product(
            title = request.title,
            content = request.content,
            imageUrl = request.imageUrl,
            price = request.price,
            purchaseAble = request.purchaseAble,
            userLimit = request.userLimit,
            discount = request.discount,
            seller = seller,
            likes = 0,
        )

    val productStock =
        ProductStock(
            product = product,
            stock = request.stock,
            productName = request.title,
        )

    // product.productStock = productStock

    productRepository.save(product)
    productStockRepository.save(productStock)

    return product
}

 

서비스임플의 크레이트 부분에도  별점을 지워버린다. 그런식으로 나머지 부분의 별점을 싹 지운다.

물론 get을 할때는 별점이 보여야하니까 리스폰스는 내버려두고, 엔티티의 별점을 널로 바꿨으니 리스폰스 부분도

var ratingAverage: Double?,

 

이렇게 ?를 넣어준다. 그런식으로 평균평점 뒤에 ?를 다 붙여주면 이제 스웨거에서 확인했을때 더이상 평균별점은 보이지 않는다.