Skip to content
Open
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
8 changes: 4 additions & 4 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -326,9 +326,6 @@ gradle-app.setting

# End of https://www.toptal.com/developers/gitignore/api/intellij,gradle,java,windows,macos,intellij+all

# ----- 하늘님 gitignore 추가 요청 20231204.1641
.DS_store

#yml
*.yml
!application.yml
Expand All @@ -347,4 +344,7 @@ gradlew.bat
gradlew

# QueryDSL Q-classes
src/main/generated/
src/main/generated/

# s3 test folder
s3mock
3 changes: 3 additions & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -55,9 +55,12 @@ dependencies {
implementation("io.jsonwebtoken:jjwt-api:0.11.5")
implementation("io.jsonwebtoken:jjwt-impl:0.11.5")
implementation("io.jsonwebtoken:jjwt-jackson:0.11.5")
//s3
implementation("io.awspring.cloud:spring-cloud-starter-aws:2.4.4")
//test
testImplementation ("org.springframework.boot:spring-boot-starter-test")
testRuntimeOnly ("com.h2database:h2")
implementation ("io.findify:s3mock_2.13:0.2.6")
}

tasks.withType<Test> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,24 +5,36 @@
import com.ward.ward_server.api.item.service.BrandService;
import com.ward.ward_server.global.response.ApiResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;

import static com.ward.ward_server.global.response.ApiResponseMessage.*;

@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping("/admin/brands")
public class AdminBrandController {
private final BrandService brandService;

@PostMapping
public ApiResponse<BrandResponse> createBrand(@RequestBody BrandRequest request) {
return ApiResponse.ok(BRAND_CREATE_SUCCESS, brandService.createBrand(request.koreanName(), request.englishName(), request.logoImage()));
public ApiResponse<BrandResponse> createBrand(@RequestPart BrandRequest request,
@RequestPart(required = false) MultipartFile logoImage) throws IOException {
return ApiResponse.ok(BRAND_CREATE_SUCCESS, brandService.createBrand(request.koreanName(), request.englishName(), logoImage));
}

@PatchMapping("/{brandId}")
public ApiResponse<BrandResponse> updateBrand(@PathVariable("brandId") long brandId, @RequestBody BrandRequest request) {
return ApiResponse.ok(BRAND_UPDATE_SUCCESS, brandService.updateBrand(brandId, request.koreanName(), request.englishName(), request.logoImage()));
public ApiResponse<BrandResponse> updateBrand(@PathVariable("brandId") long brandId,
@RequestPart(required = false) BrandRequest request,
@RequestPart(required = false) MultipartFile logoImage) throws IOException {
if (request == null) {
return ApiResponse.ok(BRAND_UPDATE_SUCCESS, brandService.updateBrand(brandId, null, null, logoImage));
} else {
return ApiResponse.ok(BRAND_UPDATE_SUCCESS, brandService.updateBrand(brandId, request.koreanName(), request.englishName(), logoImage));
}
}

@DeleteMapping("/{brandId}")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@
import com.ward.ward_server.global.response.ApiResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.List;

import static com.ward.ward_server.global.response.ApiResponseMessage.*;

Expand All @@ -27,16 +31,30 @@ public ApiResponse<String> abc() {


@PostMapping
public ApiResponse<ItemDetailResponse> createItem(@RequestBody ItemRequest request) throws ApiException {
public ApiResponse<ItemDetailResponse> createItem(@RequestPart ItemRequest request,
@RequestPart(required = false) MultipartFile mainImage,
@RequestPart(required = false) List<MultipartFile> itemImages) throws ApiException, IOException {
return ApiResponse.ok(ITEM_CREATE_SUCCESS,
itemService.createItem(request.itemCode(), request.koreanName(), request.englishName(), request.mainImage(), request.itemImages(), request.brandId(), request.category(), request.price()));
itemService.createItem(request.itemCode(), request.koreanName(), request.englishName(), request.brandId(), request.category(), request.price(),
mainImage, itemImages));
}

@PatchMapping("/{itemId}")
public ApiResponse<ItemDetailResponse> updateItem(@PathVariable("itemId") Long itemId,
@RequestBody ItemRequest request) {
return ApiResponse.ok(ITEM_UPDATE_SUCCESS,
itemService.updateItem(itemId, request.koreanName(), request.englishName(), request.itemCode(), request.mainImage(), request.itemImages(), request.brandId(), request.category(), request.price()));
@RequestPart(required = false) ItemRequest request,
@RequestPart(required = false) MultipartFile mainImage,
@RequestPart(required = false) List<MultipartFile> itemImages) throws IOException {
if (request == null) {
return ApiResponse.ok(ITEM_UPDATE_SUCCESS,
itemService.updateItem(itemId,
null, null, null, null, null, null,
mainImage, itemImages));
} else {
return ApiResponse.ok(ITEM_UPDATE_SUCCESS,
itemService.updateItem(itemId,
request.koreanName(), request.englishName(), request.itemCode(), request.brandId(), request.category(), request.price(),
mainImage, itemImages));
}
}

@DeleteMapping("/{itemId}")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,5 @@

public record BrandRequest(
String koreanName,
String englishName,
String logoImage
) {
String englishName) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,10 @@

import com.ward.ward_server.api.item.entity.enums.Category;

import java.util.List;

public record ItemRequest(
String koreanName,
String englishName,
String itemCode,
String mainImage,
List<String> itemImages,
Long brandId,
Category category,
Integer price) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,10 @@
package com.ward.ward_server.api.item.repository;

import com.ward.ward_server.api.item.entity.Item;
import com.ward.ward_server.api.item.entity.ItemImage;
import org.springframework.data.jpa.repository.JpaRepository;

import javax.swing.text.html.Option;
import java.util.List;
import java.util.Optional;

public interface ItemImageRepository extends JpaRepository<ItemImage, Long> {
List<ItemImage> findAllByItemId(long itemId);

void deleteAllByItemId(long itemId);

Optional<ItemImage> findFirstByItemId(long itemId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,17 @@
import com.ward.ward_server.global.Object.PageResponse;
import com.ward.ward_server.global.Object.enums.BasicSort;
import com.ward.ward_server.global.exception.ApiException;
import com.ward.ward_server.global.exception.ExceptionCode;
import com.ward.ward_server.global.util.S3ImageManager;
import com.ward.ward_server.global.util.ValidationUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.List;
import java.util.stream.Collectors;

Expand All @@ -34,18 +36,21 @@ public class BrandService {
private final BrandRepository brandRepository;
private final ItemRepository itemRepository;
private final ReleaseInfoRepository releaseInfoRepository;
private final S3ImageManager imageManager;
private final String DIR_NAME = "brand/logo";

@Transactional
public BrandResponse createBrand(String koreanName, String englishName, String brandLogoImage) {
public BrandResponse createBrand(String koreanName, String englishName, MultipartFile brandLogoImage) throws IOException {
if (!StringUtils.hasText(koreanName) && !StringUtils.hasText(englishName)) {
throw new ApiException(INVALID_INPUT, NAME_MUST_BE_PROVIDED.getMessage());
}
ValidationUtils.validationNames(koreanName, englishName);
if (brandRepository.existsByKoreanNameOrEnglishName(koreanName, englishName))
if (brandRepository.existsByKoreanNameOrEnglishName(koreanName, englishName)) {
throw new ApiException(DUPLICATE_BRAND);

}
String uploadedImageUrl = brandLogoImage != null ? imageManager.upload(brandLogoImage, DIR_NAME) : null;
Brand savedBrand = brandRepository.save(Brand.builder()
.logoImage(brandLogoImage)
.logoImage(uploadedImageUrl)
.koreanName(koreanName)
.englishName(englishName)
.build());
Expand Down Expand Up @@ -79,13 +84,13 @@ public PageResponse<ReleaseInfoSimpleResponse> getBrandReleaseInfoPage(long bran
}

@Transactional
public BrandResponse updateBrand(long brandId, String koreanName, String englishName, String brandLogoImage) {
if (koreanName == null && englishName == null && brandLogoImage == null)
throw new ApiException(ExceptionCode.INVALID_INPUT);
public BrandResponse updateBrand(long brandId, String koreanName, String englishName, MultipartFile brandLogoImage) throws IOException {
ValidationUtils.validationNames(koreanName, englishName);
Brand origin = brandRepository.findById(brandId).orElseThrow(() -> new ApiException(BRAND_NOT_FOUND));
if (StringUtils.hasText(brandLogoImage)) {
origin.updateLogoImage(brandLogoImage);
if (brandLogoImage != null) {
imageManager.delete(origin.getLogoImage());
String uploadedLogoImageUrl = imageManager.upload(brandLogoImage, DIR_NAME);
origin.updateLogoImage(uploadedLogoImageUrl);
}
if (StringUtils.hasText(koreanName)) {
origin.updateKoreanName(koreanName);
Expand All @@ -98,10 +103,9 @@ public BrandResponse updateBrand(long brandId, String koreanName, String english

@Transactional
public void deleteBrand(long brandId) {
if (!brandRepository.existsById(brandId)) {
throw new ApiException(BRAND_NOT_FOUND);
}
brandRepository.deleteById(brandId);
Brand brand = brandRepository.findById(brandId).orElseThrow(() -> new ApiException(BRAND_NOT_FOUND));
imageManager.delete(brand.getLogoImage());
brandRepository.delete(brand);
}

@Transactional
Expand All @@ -114,7 +118,8 @@ public long increaseBrandViewCount(long brandId) {
private BrandResponse getBrandResponse(Brand brand) {
return new BrandResponse(
brand.getId(),
brand.getLogoImage(),
brand.getLogoImage() == null ?
imageManager.getUrl(DIR_NAME + "/brand-basic-logo.png") : brand.getLogoImage(),
brand.getKoreanName(),
brand.getEnglishName(),
brand.getViewCount()
Expand Down
Loading