Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[FEAT] facade pattern - Topic #218

Merged
merged 9 commits into from
Jul 14, 2024

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.genius.gitget.challenge.instance.domain;


import com.genius.gitget.admin.topic.domain.Topic;
import com.genius.gitget.topic.domain.Topic;
import com.genius.gitget.challenge.certification.util.DateUtil;
import com.genius.gitget.challenge.instance.dto.crud.InstanceCreateRequest;
import com.genius.gitget.challenge.likes.domain.Likes;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
import static com.genius.gitget.global.util.exception.ErrorCode.INVALID_INSTANCE_DATE;
import static com.genius.gitget.global.util.exception.ErrorCode.TOPIC_NOT_FOUND;

import com.genius.gitget.admin.topic.domain.Topic;
import com.genius.gitget.admin.topic.repository.TopicRepository;
import com.genius.gitget.topic.domain.Topic;
import com.genius.gitget.topic.repository.TopicRepository;
import com.genius.gitget.challenge.instance.domain.Instance;
import com.genius.gitget.challenge.instance.dto.crud.InstanceCreateRequest;
import com.genius.gitget.challenge.instance.dto.crud.InstanceDetailResponse;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import static com.genius.gitget.global.util.exception.ErrorCode.MEMBER_NOT_FOUND;
import static com.genius.gitget.global.util.exception.ErrorCode.TOPIC_NOT_FOUND;

import com.genius.gitget.admin.topic.repository.TopicRepository;
import com.genius.gitget.topic.repository.TopicRepository;
import com.genius.gitget.challenge.instance.repository.InstanceRepository;
import com.genius.gitget.challenge.user.repository.UserRepository;
import com.genius.gitget.global.file.domain.FileHolder;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
import static com.genius.gitget.challenge.participant.domain.JoinResult.SUCCESS;
import static com.genius.gitget.challenge.participant.domain.JoinStatus.YES;

import com.genius.gitget.admin.signout.Signout;
import com.genius.gitget.admin.signout.SignoutRepository;
import com.genius.gitget.signout.Signout;
import com.genius.gitget.signout.SignoutRepository;
import com.genius.gitget.challenge.participant.domain.JoinResult;
import com.genius.gitget.challenge.participant.domain.Participant;
import com.genius.gitget.challenge.user.domain.User;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.genius.gitget.admin.signout;
package com.genius.gitget.signout;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.genius.gitget.admin.signout;
package com.genius.gitget.signout;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
package com.genius.gitget.admin.topic.controller;
package com.genius.gitget.topic.controller;

import static com.genius.gitget.global.util.exception.SuccessCode.CREATED;
import static com.genius.gitget.global.util.exception.SuccessCode.SUCCESS;

import com.genius.gitget.admin.topic.dto.TopicCreateRequest;
import com.genius.gitget.admin.topic.dto.TopicDetailResponse;
import com.genius.gitget.admin.topic.dto.TopicIndexResponse;
import com.genius.gitget.admin.topic.dto.TopicPagingResponse;
import com.genius.gitget.admin.topic.dto.TopicUpdateRequest;
import com.genius.gitget.admin.topic.service.TopicService;
import com.genius.gitget.global.util.response.dto.CommonResponse;
import com.genius.gitget.global.util.response.dto.PagingResponse;
import com.genius.gitget.global.util.response.dto.SingleResponse;
import com.genius.gitget.topic.dto.TopicCreateRequest;
import com.genius.gitget.topic.dto.TopicDetailResponse;
import com.genius.gitget.topic.dto.TopicIndexResponse;
import com.genius.gitget.topic.dto.TopicPagingResponse;
import com.genius.gitget.topic.dto.TopicUpdateRequest;
import com.genius.gitget.topic.serviceFacade.TopicFacade;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
Expand All @@ -31,35 +31,36 @@
@RequiredArgsConstructor
@RequestMapping("/api/admin/topic")
public class TopicController {

private final TopicService topicService;
private final TopicFacade topicFacade;

// 토픽 리스트 요청
@GetMapping
public ResponseEntity<PagingResponse<TopicPagingResponse>> getAllTopics(
@PageableDefault(size = 5, direction = Sort.Direction.ASC) Pageable pageable) {
Page<TopicPagingResponse> allTopics = topicService.getAllTopics(pageable);

Page<TopicPagingResponse> topicPagingResponse = topicFacade.findTopics(pageable);
return ResponseEntity.ok().body(
new PagingResponse<>(SUCCESS.getStatus(), SUCCESS.getMessage(), allTopics)
new PagingResponse<>(SUCCESS.getStatus(), SUCCESS.getMessage(), topicPagingResponse)
);
}

// 토픽 상세 정보 요청
@GetMapping("/{id}")
public ResponseEntity<SingleResponse<TopicDetailResponse>> getTopicById(@PathVariable Long id) {
TopicDetailResponse topicDetail = topicService.getTopicById(id);
TopicDetailResponse topicDetailResponse = topicFacade.findOne(id);

return ResponseEntity.ok().body(
new SingleResponse<>(SUCCESS.getStatus(), SUCCESS.getMessage(), topicDetail)
new SingleResponse<>(SUCCESS.getStatus(), SUCCESS.getMessage(), topicDetailResponse)
);
}

// 토픽 생성 요청
@PostMapping
public ResponseEntity<SingleResponse<TopicIndexResponse>> createTopic(
@RequestBody TopicCreateRequest topicCreateRequest) {
Long topicId = topicService.createTopic(topicCreateRequest);
TopicIndexResponse topicUpdateResponse = new TopicIndexResponse(topicId);

Long topic = topicFacade.create(topicCreateRequest);
TopicIndexResponse topicUpdateResponse = new TopicIndexResponse(topic);

return ResponseEntity.ok().body(
new SingleResponse<>(
Expand All @@ -72,8 +73,9 @@ public ResponseEntity<SingleResponse<TopicIndexResponse>> createTopic(
public ResponseEntity<SingleResponse<TopicIndexResponse>> updateTopic(
@PathVariable Long id,
@RequestBody TopicUpdateRequest topicUpdateRequest) {
Long topicId = topicService.updateTopic(id, topicUpdateRequest);
TopicIndexResponse topicUpdateResponse = new TopicIndexResponse(topicId);

Long updateTopic = topicFacade.update(id, topicUpdateRequest);
TopicIndexResponse topicUpdateResponse = new TopicIndexResponse(updateTopic);

return ResponseEntity.ok().body(
new SingleResponse<>(SUCCESS.getStatus(), SUCCESS.getMessage(), topicUpdateResponse)
Expand All @@ -83,7 +85,9 @@ public ResponseEntity<SingleResponse<TopicIndexResponse>> updateTopic(
// 토픽 삭제 요청
@DeleteMapping("/{id}")
public ResponseEntity<CommonResponse> deleteTopic(@PathVariable Long id) {
topicService.deleteTopic(id);

topicFacade.delete(id);

return ResponseEntity.ok().body(
new CommonResponse(SUCCESS.getStatus(), SUCCESS.getMessage())
);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.genius.gitget.admin.topic.domain;
package com.genius.gitget.topic.domain;

import com.genius.gitget.challenge.instance.domain.Instance;
import com.genius.gitget.global.file.domain.FileHolder;
Expand Down Expand Up @@ -60,7 +60,6 @@ public Topic(String title, String description, String tags, String notice, int p
this.pointPerPerson = pointPerPerson;
}

//== 비즈니스 로직 ==//
public void updateExistInstance(String description) {
this.description = description;
}
Expand Down
23 changes: 23 additions & 0 deletions src/main/java/com/genius/gitget/topic/dto/TopicCreateRequest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.genius.gitget.topic.dto;

import com.genius.gitget.topic.domain.Topic;
import lombok.Builder;

@Builder
public record TopicCreateRequest(
String title,
String tags,
String description,
int pointPerPerson,
String notice
) {
public static Topic from(TopicCreateRequest topicCreateRequest) {
return Topic.builder()
.title(topicCreateRequest.title())
.description(topicCreateRequest.description())
.tags(topicCreateRequest.tags())
.pointPerPerson(topicCreateRequest.pointPerPerson())
.notice(topicCreateRequest.notice())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.genius.gitget.admin.topic.dto;
package com.genius.gitget.topic.dto;

import com.genius.gitget.admin.topic.domain.Topic;
import com.genius.gitget.global.file.dto.FileResponse;
import com.genius.gitget.topic.domain.Topic;
import lombok.Builder;

@Builder
Expand All @@ -13,7 +13,8 @@ public record TopicDetailResponse(
String notice,
int pointPerPerson,
FileResponse fileResponse) {
public static TopicDetailResponse createByEntity(Topic topic, FileResponse fileResponse) {

public static TopicDetailResponse of(Topic topic, FileResponse fileResponse) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오! 정적 팩토리 메서드의 명명법을 따른 네이밍인가보네요! 👍

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이펙티브 자바에서 배운 걸 활용해봤습니다 ㅎ

return TopicDetailResponse.builder()
.topicId(topic.getId())
.title(topic.getTitle())
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.genius.gitget.admin.topic.dto;
package com.genius.gitget.topic.dto;

public record TopicIndexResponse(
Long topicId
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
package com.genius.gitget.admin.topic.dto;
package com.genius.gitget.topic.dto;

import com.genius.gitget.admin.topic.domain.Topic;
import com.genius.gitget.global.file.dto.FileResponse;
import com.genius.gitget.topic.domain.Topic;
import lombok.Builder;

@Builder
public record TopicPagingResponse(Long topicId, String title, FileResponse fileResponse) {

public static TopicPagingResponse createByEntity(Topic topic, FileResponse fileResponse) {
public static TopicPagingResponse of(Topic topic, FileResponse fileResponse) {
return TopicPagingResponse.builder()
.topicId(topic.getId())
.title(topic.getTitle())
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.genius.gitget.admin.topic.dto;
package com.genius.gitget.topic.dto;

import lombok.Builder;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.genius.gitget.admin.topic.repository;
package com.genius.gitget.topic.repository;

import com.genius.gitget.admin.topic.domain.Topic;
import com.genius.gitget.topic.domain.Topic;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
Expand Down
42 changes: 42 additions & 0 deletions src/main/java/com/genius/gitget/topic/service/TopicService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package com.genius.gitget.topic.service;

import com.genius.gitget.global.util.exception.BusinessException;
import com.genius.gitget.global.util.exception.ErrorCode;
import com.genius.gitget.topic.domain.Topic;
import com.genius.gitget.topic.repository.TopicRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
@Slf4j
@Transactional(readOnly = true)
public class TopicService {
private final TopicRepository topicRepository;

public Page<Topic> findTopics(Pageable pageable) {
return topicRepository.findAllById(pageable);
}

public Topic findOne(Long id) {
return topicRepository.findById(id)
.orElseThrow(() -> new BusinessException(ErrorCode.TOPIC_NOT_FOUND));
}

@Transactional
public Long create(Topic topic) {
Topic savedTopic = topicRepository.save(topic);
return savedTopic.getId();
}

@Transactional
public void delete(Long id) {
Topic topic = topicRepository.findById(id)
.orElseThrow(() -> new BusinessException(ErrorCode.TOPIC_NOT_FOUND));
topicRepository.delete(topic);
}
}
Loading