diff --git a/buy-sell-service/src/main/java/project/buysellservice/domain/File/service/FileService.java b/buy-sell-service/src/main/java/project/buysellservice/domain/File/service/FileService.java index ecc1e3a..d44db4b 100644 --- a/buy-sell-service/src/main/java/project/buysellservice/domain/File/service/FileService.java +++ b/buy-sell-service/src/main/java/project/buysellservice/domain/File/service/FileService.java @@ -25,6 +25,5 @@ public interface FileService { // 파일 이름 가져오기 List getFileName(Long id) throws Exception; - // 버킷 이름 생성 - String getBucketName() throws Exception; + String newFileName() throws Exception; } diff --git a/buy-sell-service/src/main/java/project/buysellservice/domain/File/service/impl/FileServiceImpl.java b/buy-sell-service/src/main/java/project/buysellservice/domain/File/service/impl/FileServiceImpl.java index ea55253..2bdee60 100644 --- a/buy-sell-service/src/main/java/project/buysellservice/domain/File/service/impl/FileServiceImpl.java +++ b/buy-sell-service/src/main/java/project/buysellservice/domain/File/service/impl/FileServiceImpl.java @@ -22,9 +22,11 @@ public class FileServiceImpl implements FileService { private final MinioClient minioClient; private final ArticleRepository articleRepository; + String bucketName = "article"; + // 버킷 네임 생성 @Override - public String getBucketName() { + public String newFileName() { TimeBasedGenerator generator = Generators.timeBasedGenerator(); // UUID 버전 1 생성 UUID uuid = generator.generate(); @@ -35,13 +37,16 @@ public String getBucketName() { // 파일 업로드 과정 (생성, 수정 중복) @Override public FileResponse uploadFile(List files, String bucketName) throws Exception { + // 이미지 url 저장 List urls = new ArrayList<>(); for (MultipartFile file : files) { - String fileName = file.getOriginalFilename(); // 파일이름 가져오고 + String fileName = newFileName(); // 파일이름 가져오고 InputStream fileStream = file.getInputStream(); // 파일 데이터를 읽고 가져온다. + + PutObjectArgs putObjectArgs = PutObjectArgs.builder() .bucket(bucketName) .object(fileName) @@ -69,8 +74,6 @@ public FileResponse uploadFile(List files, String bucketName) thr // 파일 업로드 @Override public FileResponse createFile(List files) throws Exception { - // 버킷 이름 저장 - String bucketName = getBucketName(); if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) { minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build()); @@ -81,8 +84,8 @@ public FileResponse createFile(List files) throws Exception { @Override public FileResponse updateFile(List files, Long id) throws Exception { - String bucketName = articleRepository.getByIdOrThrow(id).getBucketName(); + deleteFile(id); return uploadFile(files, bucketName); } @@ -90,8 +93,8 @@ public FileResponse updateFile(List files, Long id) throws Except // 이미지 파일 삭제하기 @Override public void deleteFile(Long id) throws Exception { - String bucketName = articleRepository.getByIdOrThrow(id).getBucketName(); - List fileNames = getFileName(id); + + List fileNames = getFileName(id); // 각 파일이름 받아오고 거기서 삭제 for (String file : fileNames) { minioClient.removeObject( @@ -121,6 +124,7 @@ public void deleteBucket(Long id) throws Exception { @Override public List getFileName(Long id) { List urls = articleRepository.getByIdOrThrow(id).getFiles(); + log.info("[getFileName] urls : {}", urls); List fileNames = new ArrayList<>(); @@ -131,7 +135,7 @@ public List getFileName(Long id) { fileNames.add(fileName); } - + log.info("[getFileName] fileNames : {}", fileNames); return fileNames; } diff --git a/buy-sell-service/src/main/java/project/buysellservice/domain/article/controller/ApiV1ArticleController.java b/buy-sell-service/src/main/java/project/buysellservice/domain/article/controller/ApiV1ArticleController.java index 2b8d301..5f7d496 100644 --- a/buy-sell-service/src/main/java/project/buysellservice/domain/article/controller/ApiV1ArticleController.java +++ b/buy-sell-service/src/main/java/project/buysellservice/domain/article/controller/ApiV1ArticleController.java @@ -1,15 +1,16 @@ package project.buysellservice.domain.article.controller; import jakarta.validation.Valid; -import jakarta.ws.rs.core.Response; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import project.buysellservice.domain.article.dto.request.ArticleRequest; import project.buysellservice.domain.article.dto.response.ArticleResponse; +import project.buysellservice.domain.article.entity.Category; import project.buysellservice.domain.article.service.ArticleService; import java.util.List; @@ -23,9 +24,14 @@ public class ApiV1ArticleController { // 게시글 전체 페이징 처리 @GetMapping - public ResponseEntity> getArticle(@Valid @RequestParam("page") int page, - @Valid @RequestParam("size") int size) { - return ResponseEntity.ok(articleService.readAllArticles(PageRequest.of(page, size))); + public ResponseEntity> getArticle(Pageable pageable) { + return ResponseEntity.ok(articleService.readAllArticles(pageable)); + } + + // 게시글 전체 (오래된순) + @GetMapping("/asc") + public ResponseEntity> getArticleAsc(Pageable pageable) { + return ResponseEntity.ok(articleService.readAllArticlesOrderByAsc(pageable)); } // 게시글 가져오기 @@ -34,12 +40,26 @@ public ResponseEntity getArticleById(@PathVariable("id") Long i return ResponseEntity.ok(articleService.readArticle(id)); } + // 구매가능 게시글만 보기 + @GetMapping("/stateSell") + public ResponseEntity> getArticleStateSell(Pageable pageable) { + return ResponseEntity.ok(articleService.readByStateSell(pageable)); + } + + // 가격대 별로 게시판 보기 + @GetMapping("/price") + public ResponseEntity> getArticlePrice(Pageable pageable, + @Valid @RequestParam("minPrice") int minPrice, + @Valid @RequestParam("maxPrice") int maxPrice) { + return ResponseEntity.ok(articleService.readByPrice(pageable, minPrice, maxPrice)); + } + // 게시글 생성 @PostMapping(consumes = "multipart/form-data") public ResponseEntity createArticle(@RequestPart("articleRequest") @Valid ArticleRequest articleRequest, @RequestPart("file") List files) throws Exception { return ResponseEntity.ok(articleService.createArticle( - articleRequest.title(), articleRequest.content(), files, articleRequest.price() + articleRequest.title(), articleRequest.content(), files, articleRequest.price(), articleRequest.category() )); } @@ -49,7 +69,7 @@ public ResponseEntity updateArticle(@Valid @PathVariable("id") @RequestPart("articleRequest") ArticleRequest articleRequest, @RequestPart("file") List files) throws Exception { return ResponseEntity.ok(articleService.updateArticle( - id, articleRequest.title(), articleRequest.content(), files, articleRequest.price() + id, articleRequest.title(), articleRequest.content(), files, articleRequest.price(), articleRequest.category() )); } @@ -65,4 +85,11 @@ public ResponseEntity soldArticle(@Valid @PathVariable("id") Lo return ResponseEntity.ok(articleService.soldArticle(id)); } + // 해당 카테고리 글만 가져오기 + @GetMapping("/category") + public ResponseEntity> getArticleByCategory(@Valid @RequestParam("category") Category category, + Pageable pageable) { + return ResponseEntity.ok(articleService.readCategoryArticle(category, pageable)); + } + } diff --git a/buy-sell-service/src/main/java/project/buysellservice/domain/article/dto/request/ArticleRequest.java b/buy-sell-service/src/main/java/project/buysellservice/domain/article/dto/request/ArticleRequest.java index 840a8e8..60eacf2 100644 --- a/buy-sell-service/src/main/java/project/buysellservice/domain/article/dto/request/ArticleRequest.java +++ b/buy-sell-service/src/main/java/project/buysellservice/domain/article/dto/request/ArticleRequest.java @@ -1,11 +1,13 @@ package project.buysellservice.domain.article.dto.request; import org.springframework.web.multipart.MultipartFile; +import project.buysellservice.domain.article.entity.Category; public record ArticleRequest( String title, String content, - Long price + Long price, + Category category ) { } diff --git a/buy-sell-service/src/main/java/project/buysellservice/domain/article/dto/response/ArticleResponse.java b/buy-sell-service/src/main/java/project/buysellservice/domain/article/dto/response/ArticleResponse.java index 67b85d3..e6a2413 100644 --- a/buy-sell-service/src/main/java/project/buysellservice/domain/article/dto/response/ArticleResponse.java +++ b/buy-sell-service/src/main/java/project/buysellservice/domain/article/dto/response/ArticleResponse.java @@ -1,6 +1,7 @@ package project.buysellservice.domain.article.dto.response; import project.buysellservice.domain.article.entity.Article; +import project.buysellservice.domain.article.entity.Category; import project.buysellservice.domain.article.entity.State; import java.util.List; @@ -11,7 +12,8 @@ public record ArticleResponse( String content, Long price, List files, - State state + State state, + Category category ) { public static ArticleResponse of(Article article) { @@ -20,7 +22,8 @@ public static ArticleResponse of(Article article) { article.getContent(), article.getPrice(), article.getFiles(), - article.getState() + article.getState(), + article.getCategory() ); } diff --git a/buy-sell-service/src/main/java/project/buysellservice/domain/article/entity/Article.java b/buy-sell-service/src/main/java/project/buysellservice/domain/article/entity/Article.java index 64fa7b7..34facfb 100644 --- a/buy-sell-service/src/main/java/project/buysellservice/domain/article/entity/Article.java +++ b/buy-sell-service/src/main/java/project/buysellservice/domain/article/entity/Article.java @@ -28,7 +28,9 @@ public class Article extends BaseEntity { @Column(name = "price", length = 20) private Long price; // 가격 - @ElementCollection // List을 JPA에서 사용할 수 있도록 설정 + // 도메인, 엔티티로 빼야되는 경우가 많음 + // 원투매니 ( 수정이 거의 없을 때 ) + @ElementCollection(fetch = FetchType.EAGER) // List을 JPA에서 사용할 수 있도록 설정 ( 더티체킹을 변경할 때 마다 안 함) / 로딩 비효율적 잘 찾아볼것 @CollectionTable(name = "bucketName") // 별도의 테이블을 생성 (file_images 테이블) @Column(name = "image_url", length = 2048) // 테이블의 컬럼명 지정 private List files; // 이미지 저장 @@ -40,20 +42,25 @@ public class Article extends BaseEntity { @Enumerated(EnumType.STRING) private State state; + @Column(name = "category") + @Enumerated(EnumType.STRING) // 다이어리 코드 공부 좀 했슴다 + private Category category; + // 게시글 생성 빌더 - public static Article createFrom(String title, String content, List files, Long price, String bucketName) { + public static Article createFrom(String title, String content, List files, Long price, String bucketName, Category category) { return Article.builder() .title(title) .content(content) .files(files) .price(price) .bucketName(bucketName) + .category(category) .state(State.SELL) .build(); } // 게시글 수정 빌더 - public static Article updateFrom(Long id, String title, String content, List files, Long price, String bucketName) { + public static Article updateFrom(Long id, String title, String content, List files, Long price, String bucketName, Category category) { return Article.builder() .id(id) .title(title) @@ -61,6 +68,7 @@ public static Article updateFrom(Long id, String title, String content, List findAllByOrderByCreatedAt(Pageable pageable); + // 전체 게시글 받아오기 (최신순) + Slice
findAllByOrderByCreatedAtDesc(Pageable pageable); + + // 전체 게시글 받아오기 (오래된순) + Slice
findAllByOrderByCreatedAtAsc(Pageable pageable); + + // 해당 카테고리 글 가져오기 + Slice
findAllByCategory(Category category, Pageable pageable); + + // 거래가능만 보기 + Slice
findBySellStatus(Pageable pageable); + + // 가격별로 보기 (직접 설정) + Slice
findByPrice(Pageable pageable, int minPrice, int maxPrice); + } diff --git a/buy-sell-service/src/main/java/project/buysellservice/domain/article/repository/impl/ArticleRepositoryCustomImpl.java b/buy-sell-service/src/main/java/project/buysellservice/domain/article/repository/impl/ArticleRepositoryCustomImpl.java index 49c4202..70c0ac6 100644 --- a/buy-sell-service/src/main/java/project/buysellservice/domain/article/repository/impl/ArticleRepositoryCustomImpl.java +++ b/buy-sell-service/src/main/java/project/buysellservice/domain/article/repository/impl/ArticleRepositoryCustomImpl.java @@ -2,11 +2,14 @@ import com.querydsl.jpa.impl.JPAQueryFactory; import lombok.RequiredArgsConstructor; -import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; +import org.springframework.data.domain.SliceImpl; import project.buysellservice.domain.article.entity.Article; +import project.buysellservice.domain.article.entity.Category; import project.buysellservice.domain.article.entity.QArticle; +import project.buysellservice.domain.article.entity.State; import project.buysellservice.domain.article.repository.ArticleRepositoryCustom; import java.util.List; @@ -15,8 +18,20 @@ public class ArticleRepositoryCustomImpl implements ArticleRepositoryCustom { private final JPAQueryFactory jpaQueryFactory; + // 다음 페이지가 있는지 여부 확인 + public static boolean checkHasNext(List items, Pageable pageable) { + boolean hasNext = false; + + if (items.size() > pageable.getPageSize()) { + items.remove(items.size() - 1); // 마지막 요소 제거 + hasNext = true; + } + + return hasNext; + } + @Override - public Page
findAllByOrderByCreatedAt(Pageable pageable) { + public Slice
findAllByOrderByCreatedAtDesc(Pageable pageable) { QArticle article = QArticle.article; List
articles = jpaQueryFactory @@ -26,6 +41,67 @@ public Page
findAllByOrderByCreatedAt(Pageable pageable) { .limit(pageable.getPageSize()) // 한 페이지에 표시할 개수 .fetch(); - return new PageImpl<>(articles); + + return new SliceImpl<>(articles, pageable, checkHasNext(articles, pageable)); + } + + @Override + public Slice
findAllByOrderByCreatedAtAsc(Pageable pageable) { + QArticle article = QArticle.article; + + List
articles = jpaQueryFactory + .selectFrom(article) + .orderBy(article.createDate.asc()) + .offset(pageable.getOffset()) // 페이지 시작 위치 + .limit(pageable.getPageSize()) // 한 페이지에 표시할 개수 + .fetch(); + + return new SliceImpl<>(articles, pageable, checkHasNext(articles, pageable)); + } + + @Override + public Slice
findAllByCategory(Category category, Pageable pageable) { + QArticle article = QArticle.article; + + List
articles = jpaQueryFactory + .selectFrom(article) + .where(article.category.eq(category)) + .orderBy(article.createDate.desc()) + .offset(pageable.getOffset()) // 페이지 시작 위치 + .limit(pageable.getPageSize()) // 한 페이지에 표시할 개수 + .fetch(); + + return new SliceImpl<>(articles, pageable, checkHasNext(articles, pageable)); + } + + @Override + public Slice
findBySellStatus(Pageable pageable) { + QArticle article = QArticle.article; + + List
articles = jpaQueryFactory + .selectFrom(article) + .where(article.state.eq(State.SELL)) + .orderBy(article.createDate.desc()) + .offset(pageable.getOffset()) + .limit(pageable.getPageSize()) + .fetch(); + + return new SliceImpl<>(articles, pageable, checkHasNext(articles, pageable)); + + } + + @Override + public Slice
findByPrice(Pageable pageable, int minPrice, int maxPrice) { + QArticle article = QArticle.article; + + List
articles = jpaQueryFactory + .selectFrom(article) + .where(article.price.goe(minPrice), article.price.loe(maxPrice)) + .orderBy(article.createDate.desc()) + .offset(pageable.getOffset()) + .limit(pageable.getPageSize()) + .fetch(); + + return new SliceImpl<>(articles, pageable, checkHasNext(articles, pageable)); } } diff --git a/buy-sell-service/src/main/java/project/buysellservice/domain/article/service/ArticleService.java b/buy-sell-service/src/main/java/project/buysellservice/domain/article/service/ArticleService.java index b404828..4235ecf 100644 --- a/buy-sell-service/src/main/java/project/buysellservice/domain/article/service/ArticleService.java +++ b/buy-sell-service/src/main/java/project/buysellservice/domain/article/service/ArticleService.java @@ -3,18 +3,19 @@ import org.springframework.data.domain.Pageable; import org.springframework.web.multipart.MultipartFile; import project.buysellservice.domain.article.dto.response.ArticleResponse; +import project.buysellservice.domain.article.entity.Category; import java.util.List; public interface ArticleService { // 게시글 생성 - ArticleResponse createArticle(String name, String content, List files, Long Price) throws Exception; + ArticleResponse createArticle(String name, String content, List files, Long Price, Category category) throws Exception; // 게시글 읽기 ArticleResponse readArticle(Long id); // 게시글 수정 - ArticleResponse updateArticle(Long id, String name, String content, List files, Long price) throws Exception; + ArticleResponse updateArticle(Long id, String name, String content, List files, Long price, Category category) throws Exception; // 게시글 삭제 void deleteArticle(Long id) throws Exception; @@ -22,7 +23,19 @@ public interface ArticleService { // 전체 게시글 읽기 List readAllArticles(Pageable pageable); + // 전체 게시글 읽기 (오래된순) + List readAllArticlesOrderByAsc(Pageable pageable); + // 게시글 팔림 처리 ArticleResponse soldArticle(Long id); + // 카테고리 게시글 가져오기 + List readCategoryArticle(Category category, Pageable pageable); + + // 구매가능 게시판만 보기 + List readByStateSell(Pageable pageable); + + // 가격대 별로 게시판 보기 + List readByPrice(Pageable pageable, int minPrice, int maxPrice); + } diff --git a/buy-sell-service/src/main/java/project/buysellservice/domain/article/service/impl/ArticleServiceImpl.java b/buy-sell-service/src/main/java/project/buysellservice/domain/article/service/impl/ArticleServiceImpl.java index ff215af..1de1e55 100644 --- a/buy-sell-service/src/main/java/project/buysellservice/domain/article/service/impl/ArticleServiceImpl.java +++ b/buy-sell-service/src/main/java/project/buysellservice/domain/article/service/impl/ArticleServiceImpl.java @@ -3,12 +3,14 @@ import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import project.buysellservice.domain.File.service.FileService; import project.buysellservice.domain.article.dto.response.ArticleResponse; import project.buysellservice.domain.article.dto.response.FileResponse; import project.buysellservice.domain.article.entity.Article; +import project.buysellservice.domain.article.entity.Category; import project.buysellservice.domain.article.repository.ArticleRepository; import project.buysellservice.domain.article.service.ArticleService; @@ -21,16 +23,46 @@ public class ArticleServiceImpl implements ArticleService { private final ArticleRepository articleRepository; private final FileService fileService; - // 모든 게시글 가져오기 + // 모든 게시글 가져오기 (최신순) @Override public List readAllArticles(Pageable pageable) { - Page
articles = articleRepository.findAllByOrderByCreatedAt(pageable); + Slice
articles = articleRepository.findAllByOrderByCreatedAtDesc(pageable); List
article = articles.getContent(); return ArticleResponse.listOf(article); } + // 모든 게시글 가져오기 (오래된순) + @Override + public List readAllArticlesOrderByAsc(Pageable pageable) { + Slice
articles = articleRepository.findAllByOrderByCreatedAtAsc(pageable); + + List
article = articles.getContent(); + + return ArticleResponse.listOf(article); + } + + // 구매 가능 게시판만 보기 + @Override + public List readByStateSell(Pageable pageable) { + Slice
articles = articleRepository.findBySellStatus(pageable); + + List
article = articles.getContent(); + + return ArticleResponse.listOf(article); + } + + // 가격대별로 게시판 보기 + @Override + public List readByPrice(Pageable pageable, int minPrice, int maxPrice) { + Slice
articles = articleRepository.findByPrice(pageable, minPrice, maxPrice); + List
article = articles.getContent(); + return ArticleResponse.listOf(article); + } + + + // 게시글 팔림 처리 @Override public ArticleResponse soldArticle(Long id) { Article article = articleRepository.getByIdOrThrow(id); @@ -50,13 +82,23 @@ public ArticleResponse readArticle(Long id) { return ArticleResponse.of(article); } + // 카테고리 게시글 가져오기 + @Override + public List readCategoryArticle(Category category, Pageable pageable) { + + Slice
articles = articleRepository.findAllByCategory(category, pageable); + + List
article = articles.getContent(); + + return ArticleResponse.listOf(article); + } // 생성 @Override - public ArticleResponse createArticle(String name, String content, List files, Long price) throws Exception { + public ArticleResponse createArticle(String name, String content, List files, Long price, Category category) throws Exception { FileResponse fileData = fileService.createFile(files); - Article article = Article.createFrom(name, content, fileData.files(), price, fileData.bucketName()); + Article article = Article.createFrom(name, content, fileData.files(), price, fileData.bucketName(), category); articleRepository.save(article); @@ -65,14 +107,14 @@ public ArticleResponse createArticle(String name, String content, List files, Long price) throws Exception { + public ArticleResponse updateArticle(Long id, String name, String content, List files, Long price, Category category) throws Exception { fileService.deleteFile(id); FileResponse fileData = fileService.updateFile(files, id); Article article = articleRepository.getByIdOrThrow(id); - Article newArticle = Article.updateFrom(article.getId(), name, content, fileData.files(), price, fileData.bucketName()); + Article newArticle = Article.updateFrom(article.getId(), name, content, fileData.files(), price, fileData.bucketName(), category); articleRepository.save(newArticle); @@ -82,8 +124,7 @@ public ArticleResponse updateArticle(Long id, String name, String content, List< // 삭제 @Override public void deleteArticle(Long id) throws Exception { - fileService.deleteBucket(id); - + fileService.deleteFile(id); articleRepository.deleteById(id); } diff --git a/buy-sell-service/src/main/java/project/buysellservice/global/config/MinioConfig.java b/buy-sell-service/src/main/java/project/buysellservice/global/config/MinioConfig.java index 8da1f9e..9a5ff10 100644 --- a/buy-sell-service/src/main/java/project/buysellservice/global/config/MinioConfig.java +++ b/buy-sell-service/src/main/java/project/buysellservice/global/config/MinioConfig.java @@ -1,11 +1,8 @@ package project.buysellservice.global.config; import io.minio.MinioClient; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; @ConfigurationProperties public class MinioConfig { diff --git a/buy-sell-service/src/main/java/project/buysellservice/global/config/WebConfig.java b/buy-sell-service/src/main/java/project/buysellservice/global/config/WebConfig.java index 032d542..06e3b99 100644 --- a/buy-sell-service/src/main/java/project/buysellservice/global/config/WebConfig.java +++ b/buy-sell-service/src/main/java/project/buysellservice/global/config/WebConfig.java @@ -3,6 +3,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import java.util.List; @@ -20,4 +21,10 @@ public WebConfig(OctetStreamReadMsgConverter octetStreamReadMsgConverter) { public void configureMessageConverters(List> converters) { converters.add(octetStreamReadMsgConverter); } + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + registry.addResourceHandler("/**") + .addResourceLocations("classpath:/static/"); + } } diff --git a/buy-sell-service/src/main/resources/application.yml b/buy-sell-service/src/main/resources/application.yml index 79671f6..2ba0726 100644 --- a/buy-sell-service/src/main/resources/application.yml +++ b/buy-sell-service/src/main/resources/application.yml @@ -9,5 +9,4 @@ minio: server: url: http://localhost:9000 access-key: minioadmin - secret-key: minioadmin123 - bucket: files \ No newline at end of file + secret-key: minioadmin123 \ No newline at end of file