diff --git a/src/main/java/com/capstone/favicon/admin/application/FAQServiceImpl.java b/src/main/java/com/capstone/favicon/admin/application/FAQServiceImpl.java index 1d3f7fa..dd07893 100644 --- a/src/main/java/com/capstone/favicon/admin/application/FAQServiceImpl.java +++ b/src/main/java/com/capstone/favicon/admin/application/FAQServiceImpl.java @@ -10,18 +10,31 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpSession; import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Service; import java.util.List; import java.util.stream.Collectors; @Service +@Primary @RequiredArgsConstructor public class FAQServiceImpl implements FAQService { private final FAQRepository faqRepository; private final UserRepository userRepository; + @Override + public User getAdminUserFromSession(HttpServletRequest request) { + HttpSession session = request.getSession(); + Long id = (Long) session.getAttribute("id"); + User user = userRepository.findByUserId(id); + if (user == null || user.getRole() != 1) { + throw new RuntimeException("이 기능은 관리자만 접근 가능합니다."); + } + return user; + } + @Override public void createFAQ(Long userId, FAQRequestDto request) { User user = userRepository.findById(userId) @@ -54,16 +67,6 @@ public void deleteFAQ(Long faqId) { faqRepository.delete(faq); } - public User getAdminUserFromSession(HttpServletRequest request) { - HttpSession session = request.getSession(); - Long id = (Long) session.getAttribute("id"); - User user = userRepository.findByUserId(id); - if (user == null || user.getRole() != 1) { - throw new RuntimeException("이 기능은 관리자만 접근 가능합니다."); - } - return user; - } - @Override public List getAllFAQs() { List faqs = faqRepository.findAll(); diff --git a/src/main/java/com/capstone/favicon/admin/application/NoticeServiceImpl.java b/src/main/java/com/capstone/favicon/admin/application/NoticeServiceImpl.java index 809e5ea..c11a200 100644 --- a/src/main/java/com/capstone/favicon/admin/application/NoticeServiceImpl.java +++ b/src/main/java/com/capstone/favicon/admin/application/NoticeServiceImpl.java @@ -28,6 +28,7 @@ public class NoticeServiceImpl implements NoticeService { private final NoticeRepository noticeRepository; private final UserRepository userRepository; + @Override public User getAdminUserFromSession(HttpServletRequest request) { HttpSession session = request.getSession(false); if (session == null) { @@ -115,4 +116,68 @@ public Notice getNotice(Long noticeId) { return noticeRepository.save(notice); } + + @Service + @RequiredArgsConstructor + public static class FAQServiceImpl implements FAQService { + + private final FAQRepository faqRepository; + private final UserRepository userRepository; + + @Override + public void createFAQ(Long userId, FAQRequestDto request) { + User user = userRepository.findById(userId) + .orElseThrow(() -> new RuntimeException("사용자를 찾을 수 없습니다.")); + FAQ faq = new FAQ(); + faq.setUser(user); + faq.setCategory(request.getCategory()); + faq.setQuestion(request.getQuestion()); + faq.setAnswer(request.getAnswer()); + + faqRepository.save(faq); + } + + @Override + public void updateFAQ(Long faqId, FAQRequestDto request) { + FAQ faq = faqRepository.findById(faqId) + .orElseThrow(() -> new RuntimeException("FAQ를 찾을 수 없습니다.")); + + faq.setCategory(request.getCategory()); + faq.setQuestion(request.getQuestion()); + faq.setAnswer(request.getAnswer()); + + faqRepository.save(faq); + } + + @Override + public void deleteFAQ(Long faqId) { + FAQ faq = faqRepository.findById(faqId) + .orElseThrow(() -> new RuntimeException("FAQ를 찾을 수 없습니다.")); + faqRepository.delete(faq); + } + + public User getAdminUserFromSession(HttpServletRequest request) { + HttpSession session = request.getSession(); + Long id = (Long) session.getAttribute("id"); + User user = userRepository.findByUserId(id); + if (user == null || user.getRole() != 1) { + throw new RuntimeException("이 기능은 관리자만 접근 가능합니다."); + } + return user; + } + + @Override + public List getAllFAQs() { + List faqs = faqRepository.findAll(); + return faqs.stream().map(FAQResponseDto::new).collect(Collectors.toList()); + } + + @Override + public FAQResponseDto getFAQById(Long faqId) { + FAQ faq = faqRepository.findById(faqId) + .orElseThrow(() -> new RuntimeException("FAQ를 찾을 수 없습니다.")); + return new FAQResponseDto(faq); + } + + } } diff --git a/src/main/java/com/capstone/favicon/admin/application/service/FAQService.java b/src/main/java/com/capstone/favicon/admin/application/service/FAQService.java index b76dd4c..bb9db26 100644 --- a/src/main/java/com/capstone/favicon/admin/application/service/FAQService.java +++ b/src/main/java/com/capstone/favicon/admin/application/service/FAQService.java @@ -2,9 +2,14 @@ import com.capstone.favicon.admin.dto.FAQRequestDto; import com.capstone.favicon.admin.dto.FAQResponseDto; +import com.capstone.favicon.user.domain.User; +import jakarta.servlet.http.HttpServletRequest; + import java.util.List; public interface FAQService { + User getAdminUserFromSession(HttpServletRequest request); + void createFAQ(Long userId, FAQRequestDto request); void updateFAQ(Long faqId, FAQRequestDto request); void deleteFAQ(Long faqId); diff --git a/src/main/java/com/capstone/favicon/admin/application/service/NoticeService.java b/src/main/java/com/capstone/favicon/admin/application/service/NoticeService.java index 60cb982..158b1d8 100644 --- a/src/main/java/com/capstone/favicon/admin/application/service/NoticeService.java +++ b/src/main/java/com/capstone/favicon/admin/application/service/NoticeService.java @@ -3,10 +3,14 @@ import com.capstone.favicon.admin.domain.Notice; import com.capstone.favicon.admin.dto.NoticeRequestDto; import com.capstone.favicon.admin.dto.NoticeResponseDto; +import com.capstone.favicon.user.domain.User; +import jakarta.servlet.http.HttpServletRequest; import java.util.List; public interface NoticeService { + User getAdminUserFromSession(HttpServletRequest request); + void createNotice(Long userId, NoticeRequestDto request); void updateNotice(Long noticeId, NoticeRequestDto request); void deleteNotice(Long noticeId); diff --git a/src/main/java/com/capstone/favicon/admin/application/service/StatisticsService.java b/src/main/java/com/capstone/favicon/admin/application/service/StatisticsService.java index c7cb23e..0620da5 100644 --- a/src/main/java/com/capstone/favicon/admin/application/service/StatisticsService.java +++ b/src/main/java/com/capstone/favicon/admin/application/service/StatisticsService.java @@ -1,7 +1,6 @@ package com.capstone.favicon.admin.application.service; import com.capstone.favicon.admin.dto.MonthlyCountDto; -import com.capstone.favicon.user.domain.User; import java.util.List; import java.util.Map; diff --git a/src/main/java/com/capstone/favicon/admin/controller/FAQController.java b/src/main/java/com/capstone/favicon/admin/controller/FAQController.java index dd7bd7f..98a0a96 100644 --- a/src/main/java/com/capstone/favicon/admin/controller/FAQController.java +++ b/src/main/java/com/capstone/favicon/admin/controller/FAQController.java @@ -1,10 +1,9 @@ package com.capstone.favicon.admin.controller; -import com.capstone.favicon.admin.application.FAQServiceImpl; -import com.capstone.favicon.admin.application.NoticeServiceImpl; import com.capstone.favicon.admin.application.service.FAQService; import com.capstone.favicon.admin.dto.FAQRequestDto; import com.capstone.favicon.admin.dto.FAQResponseDto; +import com.capstone.favicon.config.APIResponse; import com.capstone.favicon.user.domain.User; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; @@ -18,42 +17,59 @@ @RequiredArgsConstructor public class FAQController { - private final FAQServiceImpl faqService; + private final FAQService faqService; @PostMapping("/create") - public ResponseEntity createFAQ(@RequestBody FAQRequestDto request, HttpServletRequest httpRequest) { - User admin = faqService.getAdminUserFromSession(httpRequest); - System.out.println("관리자 : " + admin.getUserId() + " 가 FAQ를 생성했습니다."); - faqService.createFAQ(admin.getUserId(), request); - return ResponseEntity.ok("자주묻는질문이 생성되었습니다."); + public ResponseEntity> createFAQ(@RequestBody FAQRequestDto request, HttpServletRequest httpRequest) { + try { + User admin = faqService.getAdminUserFromSession(httpRequest); + faqService.createFAQ(admin.getUserId(), request); + return ResponseEntity.ok().body(APIResponse.successAPI("관리자 "+admin.getUserId()+"가 FAQ를 생성하였습니다.", null)); + } catch (Exception e) { + return ResponseEntity.badRequest().body(APIResponse.errorAPI(e.getMessage())); + } } @PutMapping("/{faqId}") - public ResponseEntity updateFAQ(@PathVariable Long faqId, @RequestBody FAQRequestDto request, HttpServletRequest httpRequest) { - User admin = faqService.getAdminUserFromSession(httpRequest); - System.out.println("관리자 : " + admin.getUserId() + " 가 FAQ를 수정했습니다."); - faqService.updateFAQ(faqId, request); - return ResponseEntity.ok("자주묻는질문이 수정되었습니다."); + public ResponseEntity> updateFAQ(@PathVariable Long faqId, @RequestBody FAQRequestDto request, HttpServletRequest httpRequest) { + try { + User admin = faqService.getAdminUserFromSession(httpRequest); + faqService.updateFAQ(faqId, request); + return ResponseEntity.ok().body(APIResponse.successAPI("관리자 : " + admin.getUserId() + " 가 FAQ를 수정했습니다.", null)); + } catch (Exception e) { + return ResponseEntity.badRequest().body(APIResponse.errorAPI(e.getMessage())); + } } @DeleteMapping("/{faqId}") - public ResponseEntity deleteFAQ(@PathVariable Long faqId, HttpServletRequest httpRequest) { - User admin = faqService.getAdminUserFromSession(httpRequest); - System.out.println("관리자 : " + admin.getUserId() + " 가 FAQ를 삭제했습니다."); - faqService.deleteFAQ(faqId); - return ResponseEntity.ok("자주묻는질문이 삭제되었습니다."); + public ResponseEntity> deleteFAQ(@PathVariable Long faqId, HttpServletRequest httpRequest) { + try { + User admin = faqService.getAdminUserFromSession(httpRequest); + faqService.deleteFAQ(faqId); + return ResponseEntity.ok().body(APIResponse.successAPI("관리자 : " + admin.getUserId() + " 가 FAQ를 삭제했습니다.", null)); + } catch (Exception e) { + return ResponseEntity.badRequest().body(APIResponse.errorAPI(e.getMessage())); + } } @GetMapping("/list") - public ResponseEntity> getAllFAQs() { - List faqs = faqService.getAllFAQs(); - return ResponseEntity.ok(faqs); + public ResponseEntity> getAllFAQs() { + try { + List faqs = faqService.getAllFAQs(); + return ResponseEntity.ok().body(APIResponse.successAPI("success", faqs)); + } catch (Exception e) { + return ResponseEntity.badRequest().body(APIResponse.errorAPI(e.getMessage())); + } } @GetMapping("/{faqId}") - public ResponseEntity getFAQById(@PathVariable Long faqId) { - FAQResponseDto faq = faqService.getFAQById(faqId); - return ResponseEntity.ok(faq); + public ResponseEntity> getFAQById(@PathVariable Long faqId) { + try { + FAQResponseDto faq = faqService.getFAQById(faqId); + return ResponseEntity.ok().body(APIResponse.successAPI("success", faq)); + } catch (Exception e) { + return ResponseEntity.badRequest().body(APIResponse.errorAPI(e.getMessage())); + } } } diff --git a/src/main/java/com/capstone/favicon/admin/controller/NoticeController.java b/src/main/java/com/capstone/favicon/admin/controller/NoticeController.java index 6e5ede8..54f5fec 100644 --- a/src/main/java/com/capstone/favicon/admin/controller/NoticeController.java +++ b/src/main/java/com/capstone/favicon/admin/controller/NoticeController.java @@ -1,9 +1,10 @@ package com.capstone.favicon.admin.controller; +import com.capstone.favicon.admin.application.service.NoticeService; import com.capstone.favicon.admin.domain.Notice; import com.capstone.favicon.admin.dto.NoticeRequestDto; -import com.capstone.favicon.admin.application.NoticeServiceImpl; import com.capstone.favicon.admin.dto.NoticeResponseDto; +import com.capstone.favicon.config.APIResponse; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; @@ -11,45 +12,73 @@ import java.util.List; + @RestController @RequestMapping("/notice") @RequiredArgsConstructor public class NoticeController { - private final NoticeServiceImpl noticeService; + private final NoticeService noticeService; @PostMapping("/create") - public ResponseEntity createNotice(@RequestBody NoticeRequestDto request, HttpServletRequest httpRequest) { - noticeService.createNotice(noticeService.getAdminUserFromSession(httpRequest).getUserId(), request); - return ResponseEntity.ok("공지사항이 등록되었습니다."); + public ResponseEntity> createNotice(@RequestBody NoticeRequestDto request, HttpServletRequest httpRequest) { + try { + noticeService.createNotice(noticeService.getAdminUserFromSession(httpRequest).getUserId(), request); + return ResponseEntity.ok().body(APIResponse.successAPI("공지사항이 등록되었습니다.", null)); + } catch (Exception e) { + return ResponseEntity.badRequest().body(APIResponse.errorAPI(e.getMessage())); + } } @PutMapping("/{noticeId}") - public ResponseEntity updateNotice(@PathVariable Long noticeId, @RequestBody NoticeRequestDto request, HttpServletRequest httpRequest) { - noticeService.getAdminUserFromSession(httpRequest); - noticeService.updateNotice(noticeId, request); - return ResponseEntity.ok("공지사항이 수정되었습니다."); + public ResponseEntity> updateNotice(@PathVariable Long noticeId, @RequestBody NoticeRequestDto request, HttpServletRequest httpRequest) { + try { + noticeService.getAdminUserFromSession(httpRequest); + noticeService.updateNotice(noticeId, request); + return ResponseEntity.ok().body(APIResponse.successAPI("공지사항이 수정되었습니다.", null)); + } catch (Exception e) { + return ResponseEntity.badRequest().body(APIResponse.errorAPI(e.getMessage())); + } } @DeleteMapping("/{noticeId}") - public ResponseEntity deleteNotice(@PathVariable Long noticeId, HttpServletRequest httpRequest) { - noticeService.getAdminUserFromSession(httpRequest); - noticeService.deleteNotice(noticeId); - return ResponseEntity.ok("공지사항이 삭제되었습니다."); + public ResponseEntity> deleteNotice(@PathVariable Long noticeId, HttpServletRequest httpRequest) { + try { + noticeService.getAdminUserFromSession(httpRequest); + noticeService.deleteNotice(noticeId); + return ResponseEntity.ok().body(APIResponse.successAPI("공지사항이 삭제되었습니다.", null)); + } catch (Exception e) { + return ResponseEntity.badRequest().body(APIResponse.errorAPI(e.getMessage())); + } } @GetMapping("/list") - public ResponseEntity> getAllNotices() { - return ResponseEntity.ok(noticeService.getAllNotices()); + public ResponseEntity> getAllNotices() { + try { + List notices = noticeService.getAllNotices(); + return ResponseEntity.ok().body(APIResponse.successAPI("success", notices)); + } catch (Exception e) { + return ResponseEntity.badRequest().body(APIResponse.errorAPI(e.getMessage())); + } } @GetMapping("/{noticeId}") - public ResponseEntity getNoticeById(@PathVariable Long noticeId) { - return ResponseEntity.ok(noticeService.getNoticeById(noticeId)); + public ResponseEntity> getNoticeById(@PathVariable Long noticeId) { + try { + NoticeResponseDto notice = noticeService.getNoticeById(noticeId); + return ResponseEntity.ok().body(APIResponse.successAPI("success", notice)); + } catch (Exception e) { + return ResponseEntity.badRequest().body(APIResponse.errorAPI(e.getMessage())); + } } @GetMapping("/view/{noticeId}") - public ResponseEntity getNotice(@PathVariable Long noticeId) { - return ResponseEntity.ok(noticeService.getNotice(noticeId)); + public ResponseEntity> getNotice(@PathVariable Long noticeId) { + try { + Notice notice = noticeService.getNotice(noticeId); + return ResponseEntity.ok().body(APIResponse.successAPI("success", notice)); + } catch (Exception e) { + return ResponseEntity.badRequest().body(APIResponse.errorAPI(e.getMessage())); + } } } diff --git a/src/main/java/com/capstone/favicon/admin/controller/StatisticsController.java b/src/main/java/com/capstone/favicon/admin/controller/StatisticsController.java index d3ed189..e3498f1 100644 --- a/src/main/java/com/capstone/favicon/admin/controller/StatisticsController.java +++ b/src/main/java/com/capstone/favicon/admin/controller/StatisticsController.java @@ -3,7 +3,6 @@ import com.capstone.favicon.admin.application.service.StatisticsService; import com.capstone.favicon.admin.dto.MonthlyCountDto; import com.capstone.favicon.config.APIResponse; -import com.capstone.favicon.user.domain.User; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; diff --git a/src/main/java/com/capstone/favicon/aws/S3Controller.java b/src/main/java/com/capstone/favicon/aws/S3Controller.java index 2f0e5d0..a1606bd 100644 --- a/src/main/java/com/capstone/favicon/aws/S3Controller.java +++ b/src/main/java/com/capstone/favicon/aws/S3Controller.java @@ -11,7 +11,6 @@ import com.capstone.favicon.aws.MetadataParser.DatasetMetadata; import com.capstone.favicon.config.APIResponse; import jakarta.transaction.Transactional; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -23,7 +22,6 @@ @RestController @RequestMapping("/s3") -@RequiredArgsConstructor public class S3Controller { private final S3Config s3Config; @@ -31,6 +29,14 @@ public class S3Controller { private final DatasetThemeRepository datasetThemeRepository; private final ResourceRepository resourceRepository; + public S3Controller(@Qualifier("s3Config") S3Config s3Config, DatasetRepository datasetRepository, + DatasetThemeRepository datasetThemeRepository, ResourceRepository resourceRepository) { + this.s3Config = s3Config; + this.datasetRepository = datasetRepository; + this.datasetThemeRepository = datasetThemeRepository; + this.resourceRepository = resourceRepository; + } + @PostMapping("/upload") public ResponseEntity> uploadFile(@RequestParam("file") MultipartFile file) { try { diff --git a/src/main/java/com/capstone/favicon/aws/S3MetadataSyncService.java b/src/main/java/com/capstone/favicon/aws/S3MetadataSyncService.java index 60f4c80..02b00b1 100644 --- a/src/main/java/com/capstone/favicon/aws/S3MetadataSyncService.java +++ b/src/main/java/com/capstone/favicon/aws/S3MetadataSyncService.java @@ -9,6 +9,7 @@ import com.capstone.favicon.aws.MetadataParser.DatasetMetadata; import com.capstone.favicon.dataset.repository.ResourceRepository; import jakarta.transaction.Transactional; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import com.capstone.favicon.dataset.domain.FileExtension; @@ -26,7 +27,7 @@ public class S3MetadataSyncService { private final DatasetThemeRepository datasetThemeRepository; private final ResourceRepository resourceRepository; - public S3MetadataSyncService(S3Config s3Config, DatasetRepository datasetRepository, DatasetThemeRepository datasetThemeRepository, ResourceRepository resourceRepository) { + public S3MetadataSyncService(@Qualifier("s3Config") S3Config s3Config, DatasetRepository datasetRepository, DatasetThemeRepository datasetThemeRepository, ResourceRepository resourceRepository) { this.s3Config = s3Config; this.datasetRepository = datasetRepository; this.datasetThemeRepository = datasetThemeRepository; @@ -71,7 +72,7 @@ public void syncS3FilesToDB() { resourceRepository.save(newResource); System.out.println("[디버깅] Resource 저장 완료: " + rawFileName); } else { - + String rawFileName = fileName.substring(fileName.lastIndexOf("/") + 1); Optional optionalResourceFromDB = resourceRepository.findByDatasetAndResourceName(datasetToUse, rawFileName); diff --git a/src/main/java/com/capstone/favicon/config/S3Config.java b/src/main/java/com/capstone/favicon/config/S3Config.java index b4bc9d1..aa14057 100644 --- a/src/main/java/com/capstone/favicon/config/S3Config.java +++ b/src/main/java/com/capstone/favicon/config/S3Config.java @@ -1,7 +1,6 @@ package com.capstone.favicon.config; import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Configuration; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; @@ -19,8 +18,6 @@ import java.time.ZoneId; import java.util.List; import java.util.stream.Collectors; -import java.io.InputStream; -import java.net.URL; @Service public class S3Config { diff --git a/src/main/java/com/capstone/favicon/dataset/application/DatasetService.java b/src/main/java/com/capstone/favicon/dataset/application/DatasetServiceImpl.java similarity index 93% rename from src/main/java/com/capstone/favicon/dataset/application/DatasetService.java rename to src/main/java/com/capstone/favicon/dataset/application/DatasetServiceImpl.java index 188403f..623ba9e 100644 --- a/src/main/java/com/capstone/favicon/dataset/application/DatasetService.java +++ b/src/main/java/com/capstone/favicon/dataset/application/DatasetServiceImpl.java @@ -1,5 +1,6 @@ package com.capstone.favicon.dataset.application; +import com.capstone.favicon.dataset.application.service.DatasetService; import com.capstone.favicon.dataset.domain.Dataset; import com.capstone.favicon.dataset.domain.DatasetTheme; import com.capstone.favicon.dataset.repository.DatasetRepository; @@ -18,44 +19,51 @@ import java.util.TreeMap; @Service -public class DatasetService { +public class DatasetServiceImpl implements DatasetService { private final DatasetRepository datasetRepository; private DatasetThemeRepository datasetThemeRepository; @Autowired - public DatasetService(DatasetRepository datasetRepository) { + public DatasetServiceImpl(DatasetRepository datasetRepository) { this.datasetRepository = datasetRepository; } + @Override public List findAllDatasets() { return datasetRepository.findAll(); } + @Override public List getTop9ByDownload() { return datasetRepository.findTop9ByOrderByDownloadDesc(); } @Transactional + @Override public void incrementDownloadCount(Long datasetId) { Dataset dataset = datasetRepository.findById(datasetId).orElseThrow(() -> new RuntimeException("Dataset not found with id: " + datasetId)); dataset.setDownload(dataset.getDownload() + 1); datasetRepository.save(dataset); } + @Override public List filterByCategory(String theme) { return datasetThemeRepository.findByTheme(theme); } + @Override public long getTotalDatasetCount() { return datasetRepository.count(); } + @Override public Optional getDatasetDetails(Long datasetId) { return datasetRepository.findById(datasetId); } + @Override public Map> getThemeStats() { long total = datasetRepository.count(); @@ -82,11 +90,12 @@ public Map> getThemeStats() { ); } - + @Override public List getDatasetsByCategory(Long datasetThemeId) { return datasetRepository.findByDatasetTheme_DatasetThemeId(datasetThemeId); } + @Override public List search(String text) { return datasetRepository.searchByText(text); } @@ -98,6 +107,7 @@ public List search(String text) { /*** * theme(질병, 기후, 환경) 별 세부카테고리(감기, 미세먼지, 기온 등) 목록 조회 */ + @Override public Map> getDatasetNameGroupByTheme() { List dataset = datasetRepository.findAllWithTheme(); @@ -109,6 +119,7 @@ public Map> getDatasetNameGroupByTheme() { )); } + @Override public Map> getMonthlyDatasetStats() { List datasets = datasetRepository.findAll(); diff --git a/src/main/java/com/capstone/favicon/dataset/application/DatasetThemeService.java b/src/main/java/com/capstone/favicon/dataset/application/DatasetThemeService.java deleted file mode 100644 index e51017d..0000000 --- a/src/main/java/com/capstone/favicon/dataset/application/DatasetThemeService.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.capstone.favicon.dataset.application; - -import com.capstone.favicon.dataset.domain.DatasetTheme; -import com.capstone.favicon.dataset.repository.DatasetThemeRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.List; - -@Service -public class DatasetThemeService { - - private final DatasetThemeRepository datasetThemeRepository; - - @Autowired - public DatasetThemeService(DatasetThemeRepository datasetThemeRepository) { - this.datasetThemeRepository = datasetThemeRepository; - } - - public List getFilteredDatasets(String region, Integer dataYear, String fileType) { - return datasetThemeRepository.findByRegionAndDataYearAndFileType(region, dataYear, fileType); - } - - public List getDatasetsByRegionAndDataYear(String region, Integer dataYear) { - return datasetThemeRepository.findByRegionAndDataYear(region, dataYear); - } - - public List getDatasetsByRegionAndFileType(String region, String fileType) { - return datasetThemeRepository.findByRegionAndFileType(region, fileType); - } - - public List getDatasetsByDataYearAndFileType(Integer dataYear, String fileType) { - return datasetThemeRepository.findByDataYearAndFileType(dataYear, fileType); - } - - public List getDatasetsByRegion(String region) { - return datasetThemeRepository.findByRegion(region); - } - - public List getDatasetsByDataYear(Integer dataYear) { - return datasetThemeRepository.findByDataYear(dataYear); - } - - public List getDatasetsByFileType(String fileType) { - return datasetThemeRepository.findByFileType(fileType); - } - - public List getAllDatasets() { - return datasetThemeRepository.findAll(); - } - - private long getTotalDatasetCount() { - return datasetThemeRepository.count(); - } - -} diff --git a/src/main/java/com/capstone/favicon/dataset/application/DatasetThemeServiceImpl.java b/src/main/java/com/capstone/favicon/dataset/application/DatasetThemeServiceImpl.java new file mode 100644 index 0000000..66c43ab --- /dev/null +++ b/src/main/java/com/capstone/favicon/dataset/application/DatasetThemeServiceImpl.java @@ -0,0 +1,78 @@ +package com.capstone.favicon.dataset.application; + +import com.capstone.favicon.dataset.application.service.DatasetThemeService; +import com.capstone.favicon.dataset.domain.DatasetTheme; +import com.capstone.favicon.dataset.repository.DatasetThemeRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class DatasetThemeServiceImpl implements DatasetThemeService { + + private final DatasetThemeRepository datasetThemeRepository; + + @Autowired + public DatasetThemeServiceImpl(DatasetThemeRepository datasetThemeRepository) { + this.datasetThemeRepository = datasetThemeRepository; + } + + @Override + public List getDatasets (String region, Integer dataYear, String fileType) { + if (region != null && dataYear != null && fileType != null) { + return getFilteredDatasets(region, dataYear, fileType); + } else if (region != null && dataYear != null) { + return getDatasetsByRegionAndDataYear(region, dataYear); + } else if (region != null && fileType != null) { + return getDatasetsByRegionAndFileType(region, fileType); + } else if (dataYear != null && fileType != null) { + return getDatasetsByDataYearAndFileType(dataYear, fileType); + } else if (region != null) { + return getDatasetsByRegion(region); + } else if (dataYear != null) { + return getDatasetsByDataYear(dataYear); + } else if (fileType != null) { + return getDatasetsByFileType(fileType); + } else { + return getAllDatasets(); + } + } + + private List getFilteredDatasets(String region, Integer dataYear, String fileType) { + return datasetThemeRepository.findByRegionAndDataYearAndFileType(region, dataYear, fileType); + } + + private List getDatasetsByRegionAndDataYear(String region, Integer dataYear) { + return datasetThemeRepository.findByRegionAndDataYear(region, dataYear); + } + + private List getDatasetsByRegionAndFileType(String region, String fileType) { + return datasetThemeRepository.findByRegionAndFileType(region, fileType); + } + + private List getDatasetsByDataYearAndFileType(Integer dataYear, String fileType) { + return datasetThemeRepository.findByDataYearAndFileType(dataYear, fileType); + } + + private List getDatasetsByRegion(String region) { + return datasetThemeRepository.findByRegion(region); + } + + private List getDatasetsByDataYear(Integer dataYear) { + return datasetThemeRepository.findByDataYear(dataYear); + } + + private List getDatasetsByFileType(String fileType) { + return datasetThemeRepository.findByFileType(fileType); + } + + private List getAllDatasets() { + return datasetThemeRepository.findAll(); + } + + private long getTotalDatasetCount() { + return datasetThemeRepository.count(); + } + +} diff --git a/src/main/java/com/capstone/favicon/dataset/application/FilePathService.java b/src/main/java/com/capstone/favicon/dataset/application/FilePathServiceImpl.java similarity index 67% rename from src/main/java/com/capstone/favicon/dataset/application/FilePathService.java rename to src/main/java/com/capstone/favicon/dataset/application/FilePathServiceImpl.java index 3e635b9..1ad5c22 100644 --- a/src/main/java/com/capstone/favicon/dataset/application/FilePathService.java +++ b/src/main/java/com/capstone/favicon/dataset/application/FilePathServiceImpl.java @@ -1,17 +1,19 @@ package com.capstone.favicon.dataset.application; +import com.capstone.favicon.dataset.application.service.FilePathService; import org.springframework.stereotype.Service; import java.nio.file.Paths; @Service -public class FilePathService { +public class FilePathServiceImpl implements FilePathService { /** * 다운로드 디렉토리 경로 가져오기 * @return 다운로드 디렉토리 경로 */ - public static String getDownloadDir() { + @Override + public String getDownloadDir() { String userHome = System.getProperty("user.home"); return Paths.get(userHome, "Downloads").toString(); } diff --git a/src/main/java/com/capstone/favicon/dataset/application/RegionServiceImpl.java b/src/main/java/com/capstone/favicon/dataset/application/RegionServiceImpl.java index fcffffa..45adaee 100644 --- a/src/main/java/com/capstone/favicon/dataset/application/RegionServiceImpl.java +++ b/src/main/java/com/capstone/favicon/dataset/application/RegionServiceImpl.java @@ -4,7 +4,6 @@ import com.capstone.favicon.dataset.repository.RegionRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import com.capstone.favicon.dataset.domain.Region; import java.util.List; diff --git a/src/main/java/com/capstone/favicon/dataset/application/ResourceService.java b/src/main/java/com/capstone/favicon/dataset/application/ResourceServiceImpl.java similarity index 89% rename from src/main/java/com/capstone/favicon/dataset/application/ResourceService.java rename to src/main/java/com/capstone/favicon/dataset/application/ResourceServiceImpl.java index 505bcc8..901c935 100644 --- a/src/main/java/com/capstone/favicon/dataset/application/ResourceService.java +++ b/src/main/java/com/capstone/favicon/dataset/application/ResourceServiceImpl.java @@ -1,5 +1,6 @@ package com.capstone.favicon.dataset.application; +import com.capstone.favicon.dataset.application.service.ResourceService; import com.capstone.favicon.dataset.domain.FileExtension; import com.capstone.favicon.dataset.domain.Resource; import com.capstone.favicon.dataset.repository.ResourceRepository; @@ -13,7 +14,7 @@ @RequiredArgsConstructor @Service @Slf4j -public class ResourceService { +public class ResourceServiceImpl implements ResourceService { @Autowired private ResourceRepository resourceRepository; @@ -23,6 +24,7 @@ public class ResourceService { * @param datasetId * @return resourceUrl */ + @Override public String getResourceUrlByDatasetId(Long datasetId) { Resource resource = resourceRepository.findByDatasetDatasetId(datasetId) .orElseThrow(() -> { @@ -37,6 +39,7 @@ public String getResourceUrlByDatasetId(Long datasetId) { * @param datasetId * @return FileExtension */ + @Override public FileExtension getFileExtensionByDatasetId(Long datasetId) { Optional resource = resourceRepository.findByDatasetDatasetId(datasetId); return resource.map(Resource::getType).orElse(FileExtension.TXT); diff --git a/src/main/java/com/capstone/favicon/dataset/application/S3FileDownloadService.java b/src/main/java/com/capstone/favicon/dataset/application/S3FileDownloadServiceImpl.java similarity index 84% rename from src/main/java/com/capstone/favicon/dataset/application/S3FileDownloadService.java rename to src/main/java/com/capstone/favicon/dataset/application/S3FileDownloadServiceImpl.java index 26f9e1c..85c6f0e 100644 --- a/src/main/java/com/capstone/favicon/dataset/application/S3FileDownloadService.java +++ b/src/main/java/com/capstone/favicon/dataset/application/S3FileDownloadServiceImpl.java @@ -1,7 +1,9 @@ package com.capstone.favicon.dataset.application; import com.capstone.favicon.config.S3Config; -import com.capstone.favicon.dataset.application.ResourceService; +import com.capstone.favicon.dataset.application.service.FilePathService; +import com.capstone.favicon.dataset.application.service.ResourceService; +import com.capstone.favicon.dataset.application.service.S3FileDownloadService; import com.capstone.favicon.dataset.domain.FileExtension; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -15,7 +17,7 @@ import java.io.IOException; @Service -public class S3FileDownloadService extends S3Config { +public class S3FileDownloadServiceImpl extends S3Config implements S3FileDownloadService { @Autowired private ResourceService resourceService; @Autowired @@ -24,9 +26,9 @@ public class S3FileDownloadService extends S3Config { @Value("${aws.s3.bucket-name}") private String bucketName; - public S3FileDownloadService(@Value("${aws.s3.region}") String region, - @Value("${aws.s3.access-key}") String accessKey, - @Value("${aws.s3.secret-key}") String secretKey) { + public S3FileDownloadServiceImpl(@Value("${aws.s3.region}") String region, + @Value("${aws.s3.access-key}") String accessKey, + @Value("${aws.s3.secret-key}") String secretKey) { super(region, accessKey, secretKey); } @@ -36,6 +38,7 @@ public S3FileDownloadService(@Value("${aws.s3.region}") String region, * @return 다운로드된 파일 * @throws IOException 파일 다운로드 중 발생할 수 있는 예외 */ + @Override public File downloadFile(Long datasetId) throws IOException { // 다운로드 경로 설정 diff --git a/src/main/java/com/capstone/favicon/dataset/application/TrendScheduler.java b/src/main/java/com/capstone/favicon/dataset/application/TrendSchedulerServiceImpl.java similarity index 92% rename from src/main/java/com/capstone/favicon/dataset/application/TrendScheduler.java rename to src/main/java/com/capstone/favicon/dataset/application/TrendSchedulerServiceImpl.java index 9ebdceb..d20ad3b 100644 --- a/src/main/java/com/capstone/favicon/dataset/application/TrendScheduler.java +++ b/src/main/java/com/capstone/favicon/dataset/application/TrendSchedulerServiceImpl.java @@ -1,5 +1,6 @@ package com.capstone.favicon.dataset.application; +import com.capstone.favicon.dataset.application.service.TrendSchedulerService; import com.capstone.favicon.dataset.domain.Dataset; import com.capstone.favicon.dataset.domain.Trend; import com.capstone.favicon.dataset.repository.DatasetRepository; @@ -14,13 +15,14 @@ @Component @RequiredArgsConstructor -public class TrendScheduler { +public class TrendSchedulerServiceImpl implements TrendSchedulerService { private final DatasetRepository datasetRepository; private final TrendRepository trendRepository; /*@Scheduled(cron = "0 * * * * *") */ // 매 1분마다 실행(테스트용으로 하기) @Scheduled(cron = "0 0 0 * * *") // 매일 자정(실제 배포용으로) + @Override public void analyzeTrends() { List datasets = datasetRepository.findAllByOrderByDownloadDesc(); LocalDate today = LocalDate.now(); diff --git a/src/main/java/com/capstone/favicon/dataset/application/service/DatasetService.java b/src/main/java/com/capstone/favicon/dataset/application/service/DatasetService.java new file mode 100644 index 0000000..d755f14 --- /dev/null +++ b/src/main/java/com/capstone/favicon/dataset/application/service/DatasetService.java @@ -0,0 +1,34 @@ +package com.capstone.favicon.dataset.application.service; + +import com.capstone.favicon.dataset.domain.Dataset; +import com.capstone.favicon.dataset.domain.DatasetTheme; +import jakarta.transaction.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +public interface DatasetService { + List findAllDatasets(); + + List getTop9ByDownload(); + + @Transactional + void incrementDownloadCount(Long datasetId); + + List filterByCategory(String theme); + + long getTotalDatasetCount(); + + Optional getDatasetDetails(Long datasetId); + + Map> getThemeStats(); + + List getDatasetsByCategory(Long datasetThemeId); + + List search(String text); + + Map> getDatasetNameGroupByTheme(); + + Map> getMonthlyDatasetStats(); +} diff --git a/src/main/java/com/capstone/favicon/dataset/application/service/DatasetThemeService.java b/src/main/java/com/capstone/favicon/dataset/application/service/DatasetThemeService.java new file mode 100644 index 0000000..8a48fc6 --- /dev/null +++ b/src/main/java/com/capstone/favicon/dataset/application/service/DatasetThemeService.java @@ -0,0 +1,9 @@ +package com.capstone.favicon.dataset.application.service; + +import com.capstone.favicon.dataset.domain.DatasetTheme; + +import java.util.List; + +public interface DatasetThemeService { + List getDatasets(String region, Integer dataYear, String fileType); +} diff --git a/src/main/java/com/capstone/favicon/dataset/application/service/FilePathService.java b/src/main/java/com/capstone/favicon/dataset/application/service/FilePathService.java new file mode 100644 index 0000000..aec2877 --- /dev/null +++ b/src/main/java/com/capstone/favicon/dataset/application/service/FilePathService.java @@ -0,0 +1,5 @@ +package com.capstone.favicon.dataset.application.service; + +public interface FilePathService { + String getDownloadDir(); +} diff --git a/src/main/java/com/capstone/favicon/dataset/application/service/ResourceService.java b/src/main/java/com/capstone/favicon/dataset/application/service/ResourceService.java new file mode 100644 index 0000000..da5afde --- /dev/null +++ b/src/main/java/com/capstone/favicon/dataset/application/service/ResourceService.java @@ -0,0 +1,9 @@ +package com.capstone.favicon.dataset.application.service; + +import com.capstone.favicon.dataset.domain.FileExtension; + +public interface ResourceService { + String getResourceUrlByDatasetId(Long datasetId); + + FileExtension getFileExtensionByDatasetId(Long datasetId); +} diff --git a/src/main/java/com/capstone/favicon/dataset/application/service/S3FileDownloadService.java b/src/main/java/com/capstone/favicon/dataset/application/service/S3FileDownloadService.java new file mode 100644 index 0000000..50b36c1 --- /dev/null +++ b/src/main/java/com/capstone/favicon/dataset/application/service/S3FileDownloadService.java @@ -0,0 +1,8 @@ +package com.capstone.favicon.dataset.application.service; + +import java.io.File; +import java.io.IOException; + +public interface S3FileDownloadService { + File downloadFile(Long datasetId) throws IOException; +} diff --git a/src/main/java/com/capstone/favicon/dataset/application/service/TrendSchedulerService.java b/src/main/java/com/capstone/favicon/dataset/application/service/TrendSchedulerService.java new file mode 100644 index 0000000..afc0a7a --- /dev/null +++ b/src/main/java/com/capstone/favicon/dataset/application/service/TrendSchedulerService.java @@ -0,0 +1,9 @@ +package com.capstone.favicon.dataset.application.service; + +import org.springframework.scheduling.annotation.Scheduled; + +public interface TrendSchedulerService { + /*@Scheduled(cron = "0 * * * * *") */ // 매 1분마다 실행(테스트용으로 하기) + @Scheduled(cron = "0 0 0 * * *") // 매일 자정(실제 배포용으로) + void analyzeTrends(); +} diff --git a/src/main/java/com/capstone/favicon/dataset/controller/AnalysisController.java b/src/main/java/com/capstone/favicon/dataset/controller/AnalysisController.java index d29e45e..409c16f 100644 --- a/src/main/java/com/capstone/favicon/dataset/controller/AnalysisController.java +++ b/src/main/java/com/capstone/favicon/dataset/controller/AnalysisController.java @@ -1,5 +1,6 @@ package com.capstone.favicon.dataset.controller; +import com.capstone.favicon.config.APIResponse; import com.capstone.favicon.dataset.application.service.AnalysisService; import com.capstone.favicon.dataset.dto.AnalysisRequestDto; import org.springframework.beans.factory.annotation.Autowired; @@ -19,8 +20,12 @@ public class AnalysisController { private AnalysisService analysisService; @PostMapping - public ResponseEntity> runAnalysis(@RequestBody AnalysisRequestDto requestDto) { - Map result = analysisService.analyze(requestDto); - return ResponseEntity.ok(result); + public ResponseEntity> runAnalysis(@RequestBody AnalysisRequestDto requestDto) { + try { + Map result = analysisService.analyze(requestDto); + return ResponseEntity.ok().body(APIResponse.successAPI("Success", result)); + } catch (Exception e) { + return ResponseEntity.badRequest().body(APIResponse.errorAPI(e.getMessage())); + } } } diff --git a/src/main/java/com/capstone/favicon/dataset/controller/DatasetController.java b/src/main/java/com/capstone/favicon/dataset/controller/DatasetController.java index 5955d15..0493042 100644 --- a/src/main/java/com/capstone/favicon/dataset/controller/DatasetController.java +++ b/src/main/java/com/capstone/favicon/dataset/controller/DatasetController.java @@ -1,9 +1,9 @@ package com.capstone.favicon.dataset.controller; import com.capstone.favicon.config.APIResponse; +import com.capstone.favicon.dataset.application.service.DatasetService; import com.capstone.favicon.dataset.domain.Dataset; import com.capstone.favicon.dataset.domain.DatasetTheme; -import com.capstone.favicon.dataset.application.DatasetService; import org.springframework.http.ResponseEntity; import com.capstone.favicon.dataset.dto.SearchDto; import org.springframework.web.bind.annotation.*; @@ -23,44 +23,83 @@ public DatasetController(DatasetService datasetService) { } @GetMapping - public List getDatasets() { - return datasetService.findAllDatasets(); + public ResponseEntity> getDatasets() { + try { + List datasets = datasetService.findAllDatasets(); + return ResponseEntity.ok().body(APIResponse.successAPI("success", datasets)); + } catch (Exception e) { + return ResponseEntity.badRequest().body(APIResponse.errorAPI(e.getMessage())); + } } @GetMapping("/top9") - public List getTop10Datasets() { - return datasetService.getTop9ByDownload(); + public ResponseEntity> getTop9Datasets() { + try { + List datasets = datasetService.getTop9ByDownload(); + return ResponseEntity.ok().body(APIResponse.successAPI("success", datasets)); + } catch (Exception e) { + return ResponseEntity.badRequest().body(APIResponse.errorAPI(e.getMessage())); + } } @PostMapping("/incrementDownload/{datasetId}") - public void incrementDownload(@PathVariable Long datasetId) { - datasetService.incrementDownloadCount(datasetId); + public ResponseEntity> incrementDownload(@PathVariable Long datasetId) { + try { + datasetService.incrementDownloadCount(datasetId); + return ResponseEntity.ok().body(APIResponse.successAPI("success", null)); + } catch (Exception e) { + return ResponseEntity.badRequest().body(APIResponse.errorAPI(e.getMessage())); + } } @GetMapping("/theme") - public List filterByCategory(@RequestParam String theme) { - return datasetService.filterByCategory(theme); + public ResponseEntity> filterByCategory(@RequestParam String theme) { + try { + List datasetThemes = datasetService.filterByCategory(theme); + return ResponseEntity.ok().body(APIResponse.successAPI("success", datasetThemes)); + } catch (Exception e) { + return ResponseEntity.badRequest().body(APIResponse.errorAPI(e.getMessage())); + } } @GetMapping("/count") - public long getTotalDatasetCount() { - return datasetService.getTotalDatasetCount(); + public ResponseEntity> getTotalDatasetCount() { + try { + long count = datasetService.getTotalDatasetCount(); + return ResponseEntity.ok().body(APIResponse.successAPI("success", count)); + } catch (Exception e) { + return ResponseEntity.badRequest().body(APIResponse.errorAPI(e.getMessage())); + } } @GetMapping("/{datasetId:\\d+}") - public Optional getDatasetDetails(@PathVariable Long datasetId) { - return datasetService.getDatasetDetails(datasetId); + public ResponseEntity> getDatasetDetails(@PathVariable Long datasetId) { + try { + Optional dataset = datasetService.getDatasetDetails(datasetId); + return ResponseEntity.ok().body(APIResponse.successAPI("success", dataset)); + } catch (Exception e) { + return ResponseEntity.badRequest().body(APIResponse.errorAPI(e.getMessage())); + } } @GetMapping("/ratio") - public ResponseEntity>> getThemeStats() { - return ResponseEntity.ok(datasetService.getThemeStats()); + public ResponseEntity> getThemeStats() { + try { + Map> themeStats = datasetService.getThemeStats(); + return ResponseEntity.ok().body(APIResponse.successAPI("success", themeStats)); + } catch (Exception e) { + return ResponseEntity.badRequest().body(APIResponse.errorAPI(e.getMessage())); + } } @GetMapping("/category/{themeId}") - public ResponseEntity> getDatasetsByCategory(@PathVariable Long themeId) { - List datasets = datasetService.getDatasetsByCategory(themeId); - return ResponseEntity.ok(datasets); + public ResponseEntity> getDatasetsByCategory(@PathVariable Long themeId) { + try { + List datasets = datasetService.getDatasetsByCategory(themeId); + return ResponseEntity.ok().body(APIResponse.successAPI("success", datasets)); + } catch (Exception e) { + return ResponseEntity.badRequest().body(APIResponse.errorAPI(e.getMessage())); + } } @GetMapping("/search-sorted") @@ -75,9 +114,13 @@ public ResponseEntity> search(@RequestBody SearchDto searchDto) { } @GetMapping("/group-by-theme") - public ResponseEntity>> getDatasetsGroupedByTheme() { - Map> result = datasetService.getDatasetNameGroupByTheme(); - return ResponseEntity.ok(result); + public ResponseEntity> getDatasetsGroupedByTheme() { + try { + Map> result = datasetService.getDatasetNameGroupByTheme(); + return ResponseEntity.ok().body(APIResponse.successAPI("success", result)); + } catch (Exception e) { + return ResponseEntity.badRequest().body(APIResponse.errorAPI(e.getMessage())); + } } @GetMapping("/stats") diff --git a/src/main/java/com/capstone/favicon/dataset/controller/DatasetThemeController.java b/src/main/java/com/capstone/favicon/dataset/controller/DatasetThemeController.java index 681a7c4..eaec248 100644 --- a/src/main/java/com/capstone/favicon/dataset/controller/DatasetThemeController.java +++ b/src/main/java/com/capstone/favicon/dataset/controller/DatasetThemeController.java @@ -1,8 +1,10 @@ package com.capstone.favicon.dataset.controller; +import com.capstone.favicon.config.APIResponse; +import com.capstone.favicon.dataset.application.service.DatasetThemeService; import com.capstone.favicon.dataset.domain.DatasetTheme; -import com.capstone.favicon.dataset.application.DatasetThemeService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @@ -22,27 +24,16 @@ public DatasetThemeController(DatasetThemeService datasetThemeService) { } @GetMapping("/filter") - public List getFilteredDatasets( + public ResponseEntity> getDatasets( @RequestParam(name = "region", required = false) String region, @RequestParam(name = "dataYear", required = false) Integer dataYear, @RequestParam(name = "fileType", required = false) String fileType) { - if (region != null && dataYear != null && fileType != null) { - return datasetThemeService.getFilteredDatasets(region, dataYear, fileType); - } else if (region != null && dataYear != null) { - return datasetThemeService.getDatasetsByRegionAndDataYear(region, dataYear); - } else if (region != null && fileType != null) { - return datasetThemeService.getDatasetsByRegionAndFileType(region, fileType); - } else if (dataYear != null && fileType != null) { - return datasetThemeService.getDatasetsByDataYearAndFileType(dataYear, fileType); - } else if (region != null) { - return datasetThemeService.getDatasetsByRegion(region); - } else if (dataYear != null) { - return datasetThemeService.getDatasetsByDataYear(dataYear); - } else if (fileType != null) { - return datasetThemeService.getDatasetsByFileType(fileType); - } else { - return datasetThemeService.getAllDatasets(); + try { + List datasets = datasetThemeService.getDatasets(region, dataYear, fileType); + return ResponseEntity.ok().body(APIResponse.successAPI("success", datasets)); + } catch (Exception e) { + return ResponseEntity.badRequest().body(APIResponse.errorAPI(e.getMessage())); } } diff --git a/src/main/java/com/capstone/favicon/dataset/controller/RegionController.java b/src/main/java/com/capstone/favicon/dataset/controller/RegionController.java index 9e6f5aa..5925eff 100644 --- a/src/main/java/com/capstone/favicon/dataset/controller/RegionController.java +++ b/src/main/java/com/capstone/favicon/dataset/controller/RegionController.java @@ -1,8 +1,8 @@ package com.capstone.favicon.dataset.controller; -import com.capstone.favicon.dataset.application.RegionServiceImpl; -import com.capstone.favicon.dataset.domain.Region; +import com.capstone.favicon.config.APIResponse; +import com.capstone.favicon.dataset.application.service.RegionService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; @@ -16,11 +16,15 @@ public class RegionController { @Autowired - private RegionServiceImpl regionServiceImpl; + private RegionService regionService; @GetMapping - public ResponseEntity> getAllRegions() { - List regions = regionServiceImpl.findAllRegionNames(); - return ResponseEntity.ok(regions); + public ResponseEntity> getAllRegions() { + try { + List regions = regionService.findAllRegionNames(); + return ResponseEntity.ok().body(APIResponse.successAPI("success", regions)); + } catch (Exception e) { + return ResponseEntity.badRequest().body(APIResponse.errorAPI(e.getMessage())); + } } } diff --git a/src/main/java/com/capstone/favicon/dataset/controller/s3FileDownloadController.java b/src/main/java/com/capstone/favicon/dataset/controller/s3FileDownloadController.java index 71bd780..136f90b 100644 --- a/src/main/java/com/capstone/favicon/dataset/controller/s3FileDownloadController.java +++ b/src/main/java/com/capstone/favicon/dataset/controller/s3FileDownloadController.java @@ -1,6 +1,7 @@ package com.capstone.favicon.dataset.controller; -import com.capstone.favicon.dataset.application.S3FileDownloadService; +import com.capstone.favicon.config.APIResponse; +import com.capstone.favicon.dataset.application.service.S3FileDownloadService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.Resource; @@ -21,7 +22,7 @@ public class s3FileDownloadController { private S3FileDownloadService s3FileDownloadService; @GetMapping(value="/download/{datasetId}", produces = "application/json; charset=UTF-8") - public ResponseEntity downloadFile(@PathVariable Long datasetId) throws IOException { + public ResponseEntity> downloadFile(@PathVariable Long datasetId) throws IOException { File downloadedFile = s3FileDownloadService.downloadFile(datasetId); Resource fileResource = new FileSystemResource(downloadedFile); @@ -30,6 +31,6 @@ public ResponseEntity downloadFile(@PathVariable Long datasetId) throw return ResponseEntity.ok() .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename*=UTF-8" + fileName) .contentType(MediaType.APPLICATION_OCTET_STREAM) - .body(fileResource); + .body(APIResponse.successAPI("success", fileResource)); } } diff --git a/src/main/java/com/capstone/favicon/user/application/DataServiceImpl.java b/src/main/java/com/capstone/favicon/user/application/DataServiceImpl.java index 196132b..afbb81e 100644 --- a/src/main/java/com/capstone/favicon/user/application/DataServiceImpl.java +++ b/src/main/java/com/capstone/favicon/user/application/DataServiceImpl.java @@ -1,12 +1,8 @@ package com.capstone.favicon.user.application; -import com.capstone.favicon.dataset.domain.Dataset; -import com.capstone.favicon.dataset.repository.DatasetRepository; import com.capstone.favicon.user.application.service.DataService; import com.capstone.favicon.user.domain.Scrap; -import com.capstone.favicon.user.domain.User; import com.capstone.favicon.user.repository.DataRepository; -import com.capstone.favicon.user.repository.UserRepository; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpSession; import lombok.RequiredArgsConstructor; @@ -14,7 +10,6 @@ import org.springframework.stereotype.Service; import java.util.List; -import java.util.Optional; @RequiredArgsConstructor diff --git a/src/main/java/com/capstone/favicon/user/application/RequestImpl.java b/src/main/java/com/capstone/favicon/user/application/RequestImpl.java index 3089d50..7400e75 100644 --- a/src/main/java/com/capstone/favicon/user/application/RequestImpl.java +++ b/src/main/java/com/capstone/favicon/user/application/RequestImpl.java @@ -12,10 +12,9 @@ import com.capstone.favicon.user.repository.QuestionRepository; import com.capstone.favicon.user.repository.AnswerRepository; import com.capstone.favicon.user.application.service.RequestService; -import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import software.amazon.awssdk.services.s3.S3Client; import java.io.IOException; import java.time.LocalDate; @@ -27,7 +26,6 @@ import java.util.TreeMap; @Service -@RequiredArgsConstructor public class RequestImpl implements RequestService { private final DataRequestRepository dataRequestRepository; private final QuestionRepository questionRepository; @@ -35,6 +33,16 @@ public class RequestImpl implements RequestService { private final UserRepository userRepository; private final S3Config s3Config; + public RequestImpl(DataRequestRepository dataRequestRepository,QuestionRepository questionRepository, + AnswerRepository answerRepository, UserRepository userRepository, + @Qualifier("s3Config") S3Config s3Config) { + this.dataRequestRepository = dataRequestRepository; + this.questionRepository = questionRepository; + this.answerRepository = answerRepository; + this.userRepository = userRepository; + this.s3Config = s3Config; + } + @Override public List getAllRequests() { return dataRequestRepository.findAll(); diff --git a/src/main/java/com/capstone/favicon/user/controller/RequestController.java b/src/main/java/com/capstone/favicon/user/controller/RequestController.java index 37de40b..c29f16f 100644 --- a/src/main/java/com/capstone/favicon/user/controller/RequestController.java +++ b/src/main/java/com/capstone/favicon/user/controller/RequestController.java @@ -1,14 +1,12 @@ package com.capstone.favicon.user.controller; import com.capstone.favicon.config.APIResponse; -import com.capstone.favicon.user.application.service.DataService; import com.capstone.favicon.user.domain.DataRequest; import com.capstone.favicon.user.dto.DataRequestDto; import com.capstone.favicon.user.domain.Question; import com.capstone.favicon.user.domain.Answer; import com.capstone.favicon.user.application.service.RequestService; import com.capstone.favicon.user.dto.RequestStatsDto; -import com.capstone.favicon.user.repository.DataRepository; import lombok.RequiredArgsConstructor; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -24,8 +22,13 @@ public class RequestController { private final RequestService requestService; @GetMapping("/list") - public ResponseEntity> getAllRequests() { - return ResponseEntity.ok(requestService.getAllRequests()); + public ResponseEntity> getAllRequests() { + try { + List requests = requestService.getAllRequests(); + return ResponseEntity.ok().body(APIResponse.successAPI("Success", requests)); + } catch (Exception e) { + return ResponseEntity.badRequest().body(APIResponse.errorAPI(e.getMessage())); + } } @PostMapping(value = "/list", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) @@ -42,8 +45,13 @@ public ResponseEntity> createRequest( } @PutMapping("/list/{requestId}/review") - public ResponseEntity updateReviewStatus(@PathVariable Long requestId, @RequestParam DataRequest.ReviewStatus status) { - return ResponseEntity.ok(requestService.updateReviewStatus(requestId, status)); + public ResponseEntity> updateReviewStatus(@PathVariable Long requestId, @RequestParam DataRequest.ReviewStatus status) { + try { + DataRequest dataRequest = requestService.updateReviewStatus(requestId, status); + return ResponseEntity.ok().body(APIResponse.successAPI("Success", dataRequest)); + } catch (Exception e) { + return ResponseEntity.badRequest().body(APIResponse.errorAPI(e.getMessage())); + } } @GetMapping("/stats") @@ -57,64 +65,107 @@ public ResponseEntity> getRequestStats() { } @GetMapping("/question") - public ResponseEntity> getQuestions(@RequestParam Long userId) { - return ResponseEntity.ok(requestService.getQuestionsByUser(userId)); + public ResponseEntity> getQuestions(@RequestParam Long userId) { + try { + List questions = requestService.getQuestionsByUser(userId); + return ResponseEntity.ok().body(APIResponse.successAPI("Success", questions)); + } catch (Exception e) { + return ResponseEntity.badRequest().body(APIResponse.errorAPI(e.getMessage())); + } } @GetMapping("/answer") - public ResponseEntity> getAnswers(@RequestParam Long questionId) { - return ResponseEntity.ok(requestService.getAnswersByQuestion(questionId)); + public ResponseEntity> getAnswers(@RequestParam Long questionId) { + try { + List answers = requestService.getAnswersByQuestion(questionId); + return ResponseEntity.ok().body(APIResponse.successAPI("Success", answers)); + } catch (Exception e) { + return ResponseEntity.badRequest().body(APIResponse.errorAPI(e.getMessage())); + } } // 요청 게시글 수정 @PutMapping("/{requestId}") - public ResponseEntity updateRequest(@PathVariable Long requestId, @RequestBody DataRequest updatedRequest) { - return ResponseEntity.ok(requestService.updateRequest(requestId, updatedRequest)); + public ResponseEntity> updateRequest(@PathVariable Long requestId, @RequestBody DataRequest updatedRequest) { + try { + DataRequest dataRequest = requestService.updateRequest(requestId, updatedRequest); + return ResponseEntity.ok().body(APIResponse.successAPI("Success", dataRequest)); + } catch (Exception e) { + return ResponseEntity.badRequest().body(APIResponse.errorAPI(e.getMessage())); + } } // 요청 게시글 삭제 @DeleteMapping("/{requestId}") - public ResponseEntity deleteRequest(@PathVariable Long requestId) { + public ResponseEntity> deleteRequest(@PathVariable Long requestId) { requestService.deleteRequest(requestId); return ResponseEntity.noContent().build(); } // 질문 작성 @PostMapping("/question") - public ResponseEntity createQuestion(@RequestBody Question question) { - return ResponseEntity.ok(requestService.createQuestion(question)); + public ResponseEntity> createQuestion(@RequestBody Question question) { + try { + Question newQuestion = requestService.createQuestion(question); + return ResponseEntity.ok().body(APIResponse.successAPI("Success", newQuestion)); + } catch (Exception e) { + return ResponseEntity.badRequest().body(APIResponse.errorAPI(e.getMessage())); + } } // 질문 수정 @PutMapping("/question/{questionId}") - public ResponseEntity updateQuestion(@PathVariable Long questionId, @RequestBody Question updatedQuestion) { - return ResponseEntity.ok(requestService.updateQuestion(questionId, updatedQuestion)); + public ResponseEntity> updateQuestion(@PathVariable Long questionId, @RequestBody Question updatedQuestion) { + try { + Question newQuestion = requestService.updateQuestion(questionId, updatedQuestion); + return ResponseEntity.ok().body(APIResponse.successAPI("Success", newQuestion)); + } catch (Exception e) { + return ResponseEntity.badRequest().body(APIResponse.errorAPI(e.getMessage())); + } } // 질문 삭제 @DeleteMapping("/question/{questionId}") - public ResponseEntity deleteQuestion(@PathVariable Long questionId) { - requestService.deleteQuestion(questionId); - return ResponseEntity.noContent().build(); + public ResponseEntity> deleteQuestion(@PathVariable Long questionId) { + try { + requestService.deleteQuestion(questionId); + return ResponseEntity.ok().body(APIResponse.successAPI("Success", null)); + } catch (Exception e) { + return ResponseEntity.badRequest().body(APIResponse.errorAPI(e.getMessage())); + } } // 답변 작성 @PostMapping("/answer") - public ResponseEntity createAnswer(@RequestBody Answer answer) { - return ResponseEntity.ok(requestService.createAnswer(answer)); + public ResponseEntity> createAnswer(@RequestBody Answer answer) { + try { + Answer newAnswer = requestService.createAnswer(answer); + return ResponseEntity.ok().body(APIResponse.successAPI("Success", newAnswer)); + } catch (Exception e) { + return ResponseEntity.badRequest().body(APIResponse.errorAPI(e.getMessage())); + } } // 답변 수정 @PutMapping("/answer/{answerId}") - public ResponseEntity updateAnswer(@PathVariable Long answerId, @RequestBody Answer updatedAnswer) { - return ResponseEntity.ok(requestService.updateAnswer(answerId, updatedAnswer)); + public ResponseEntity> updateAnswer(@PathVariable Long answerId, @RequestBody Answer updatedAnswer) { + try { + Answer newAnswer = requestService.updateAnswer(answerId, updatedAnswer); + return ResponseEntity.ok().body(APIResponse.successAPI("Success", newAnswer)); + } catch (Exception e) { + return ResponseEntity.badRequest().body(APIResponse.errorAPI(e.getMessage())); + } } // 답변 삭제 @DeleteMapping("/answer/{answerId}") - public ResponseEntity deleteAnswer(@PathVariable Long answerId) { - requestService.deleteAnswer(answerId); - return ResponseEntity.noContent().build(); + public ResponseEntity> deleteAnswer(@PathVariable Long answerId) { + try { + requestService.deleteAnswer(answerId); + return ResponseEntity.ok().body(APIResponse.successAPI("Success", null)); + } catch (Exception e) { + return ResponseEntity.badRequest().body(APIResponse.errorAPI(e.getMessage())); + } } } \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 5d8ed83..22e3753 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -43,4 +43,6 @@ springdoc.default-consumes-media-type=application/json springdoc.auto-tag-classes=true springdoc.api-docs.groups.enabled=false springdoc.swagger-ui.operations-sorter=method -springdoc.swagger-ui.path=/swagger-ui.html \ No newline at end of file +springdoc.swagger-ui.path=/swagger-ui.html + +server.port=8082 \ No newline at end of file