Skip to content

Commit

Permalink
refactor: admin 패키지 분리
Browse files Browse the repository at this point in the history
- admin 패키지를 분리
- admin api의 uri 수정

#156
  • Loading branch information
amaran-th committed Nov 18, 2023
1 parent b9d5cfe commit 8a95686
Show file tree
Hide file tree
Showing 22 changed files with 187 additions and 165 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import com.emmsale.activity.application.dto.ActivityAddRequest;
import com.emmsale.activity.application.dto.ActivityResponse;
import com.emmsale.activity.domain.ActivityType;
import com.emmsale.admin.activity.api.AdminActivityApi;
import java.util.List;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
Expand All @@ -27,64 +28,64 @@
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;

@WebMvcTest(ActivityApi.class)
@WebMvcTest({ActivityApi.class, AdminActivityApi.class}) // TODO: 2023/11/18 Admin API Test 분리하기
class ActivityApiTest extends MockMvcTestHelper {

@Test
@DisplayName("Activity를 전제 조회할 수 있으면 200 OK를 반환한다.")
void findAll() throws Exception {
// given
final ResponseFieldsSnippet responseFields = PayloadDocumentation.responseFields(
fieldWithPath("[].id").type(JsonFieldType.NUMBER).description("activity id"),
fieldWithPath("[].activityType").type(JsonFieldType.STRING).description("activity 분류"),
fieldWithPath("[].name").type(JsonFieldType.STRING).description("activity 이름")
fieldWithPath("[].id").type(JsonFieldType.NUMBER).description("activity id"),
fieldWithPath("[].activityType").type(JsonFieldType.STRING).description("activity 분류"),
fieldWithPath("[].name").type(JsonFieldType.STRING).description("activity 이름")
);

final List<ActivityResponse> expected = List.of(
new ActivityResponse(1L, "동아리", "YAPP"),
new ActivityResponse(2L, "동아리", "DND"),
new ActivityResponse(3L, "동아리", "nexters"),
new ActivityResponse(4L, "컨퍼런스", "인프콘"),
new ActivityResponse(5L, "교육", "우아한테크코스"),
new ActivityResponse(6L, "직무", "Backend")
new ActivityResponse(1L, "동아리", "YAPP"),
new ActivityResponse(2L, "동아리", "DND"),
new ActivityResponse(3L, "동아리", "nexters"),
new ActivityResponse(4L, "컨퍼런스", "인프콘"),
new ActivityResponse(5L, "교육", "우아한테크코스"),
new ActivityResponse(6L, "직무", "Backend")
);

Mockito.when(activityQueryService.findAll()).thenReturn(expected);

// when & then
mockMvc.perform(MockMvcRequestBuilders.get("/activities"))
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(MockMvcRestDocumentation.document("find-all-activities", responseFields));
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(MockMvcRestDocumentation.document("find-all-activities", responseFields));
}

@Test
@DisplayName("새로운 활동을 생성할 수 있다.")
void addTag() throws Exception {
//given
final RequestFieldsSnippet requestFields = requestFields(
fieldWithPath("activityType").type(JsonFieldType.STRING).description("활동 유형"),
fieldWithPath("name").type(JsonFieldType.STRING).description("활동 이름")
fieldWithPath("activityType").type(JsonFieldType.STRING).description("활동 유형"),
fieldWithPath("name").type(JsonFieldType.STRING).description("활동 이름")
);

final ActivityAddRequest request = new ActivityAddRequest(ActivityType.CLUB, "DND");
final ActivityResponse response = new ActivityResponse(3L,
ActivityType.CLUB.getValue(),
"DND"
ActivityType.CLUB.getValue(),
"DND"
);

when(activityCommandService.addActivity(any(ActivityAddRequest.class))).thenReturn(response);

final ResponseFieldsSnippet responseFields = responseFields(
fieldWithPath("id").type(JsonFieldType.NUMBER).description("활동 식별자"),
fieldWithPath("activityType").type(JsonFieldType.STRING).description("활동 종류"),
fieldWithPath("name").type(JsonFieldType.STRING).description("활동 이름")
fieldWithPath("id").type(JsonFieldType.NUMBER).description("활동 식별자"),
fieldWithPath("activityType").type(JsonFieldType.STRING).description("활동 종류"),
fieldWithPath("name").type(JsonFieldType.STRING).description("활동 이름")
);

//when & then
mockMvc.perform(post("/activities")
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(request)))
.andExpect(status().isCreated())
.andDo(document("add-activity", requestFields, responseFields));
mockMvc.perform(post("/admin/activities")
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(request)))
.andExpect(status().isCreated())
.andDo(document("add-activity", requestFields, responseFields));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.multipart;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

import com.emmsale.admin.event.api.AdminEventApi;
import com.emmsale.event.EventFixture;
import com.emmsale.event.api.EventApi;
import com.emmsale.event.application.dto.EventDetailRequest;
Expand Down Expand Up @@ -52,7 +53,7 @@
import org.springframework.test.web.servlet.request.MockMultipartHttpServletRequestBuilder;
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;

@WebMvcTest(EventApi.class)
@WebMvcTest({EventApi.class, AdminEventApi.class})
class EventApiTest extends MockMvcTestHelper {

private static final ResponseFieldsSnippet EVENT_DETAIL_RESPONSE_FILED = PayloadDocumentation.responseFields(
Expand Down Expand Up @@ -259,7 +260,7 @@ void updateEventTest() throws Exception {

//when
final MockMultipartHttpServletRequestBuilder builder = multipart(HttpMethod.PUT,
"/events/" + eventId)
"/admin/events/" + eventId)
.file("images", image1.getBytes())
.file("images", image2.getBytes())
.file(new MockMultipartFile("request", "", "application/json", contents.getBytes(
Expand All @@ -285,7 +286,7 @@ void deleteEventTest() throws Exception {
Mockito.doNothing().when(eventCommandService).deleteEvent(eventId);
//when
final ResultActions result = mockMvc.perform(
delete("/events/" + eventId));
delete("/admin/events/" + eventId));

//then
result.andExpect(status().isNoContent())
Expand Down Expand Up @@ -360,7 +361,7 @@ void addEventTest() throws Exception {
);

//when
final MockMultipartHttpServletRequestBuilder builder = multipart("/events")
final MockMultipartHttpServletRequestBuilder builder = multipart("/admin/events")
.file("images", image1.getBytes())
.file("images", image2.getBytes())
.file(new MockMultipartFile("request", "", "application/json", contents.getBytes(
Expand Down Expand Up @@ -407,7 +408,7 @@ void addEventWithEmptyNameTest(final String eventName) throws Exception {
event.getPaymentType(), event.getOrganization());
final String contents = objectMapper.writeValueAsString(request);
//when & then
mockMvc.perform(multipart("/events")
mockMvc.perform(multipart("/admin/events")
.file("images", image1.getBytes())
.file("images", image2.getBytes())
.file(new MockMultipartFile("request", "", "application/json", contents.getBytes(
Expand Down Expand Up @@ -448,7 +449,7 @@ void addEventWithEmptyLocationTest(final String eventLocation) throws Exception
event.getPaymentType(), event.getOrganization());
final String contents = objectMapper.writeValueAsString(request);
//when & then
mockMvc.perform(multipart("/events")
mockMvc.perform(multipart("/admin/events")
.file("images", image1.getBytes())
.file("images", image2.getBytes())
.file(new MockMultipartFile("request", "", "application/json", contents.getBytes(
Expand Down Expand Up @@ -490,7 +491,7 @@ void addEventWithInvalidInformationUrlTest(final String informationUrl) throws E
event.getPaymentType(), event.getOrganization());
final String contents = objectMapper.writeValueAsString(request);
//when & then
mockMvc.perform(multipart("/events")
mockMvc.perform(multipart("/admin/events")
.file("images", image1.getBytes())
.file("images", image2.getBytes())
.file(new MockMultipartFile("request", "", "application/json", contents.getBytes(
Expand Down Expand Up @@ -538,7 +539,7 @@ void addEventWithUnformattedStartDateTimeTest(final String startDateTime)

final String contents = objectMapper.writeValueAsString(request);
//when & then
mockMvc.perform(multipart("/events")
mockMvc.perform(multipart("/admin/events")
.file("images", image1.getBytes())
.file("images", image2.getBytes())
.file(new MockMultipartFile("request", "", "application/json", contents.getBytes(
Expand Down Expand Up @@ -585,7 +586,7 @@ void addEventWithUnformattedEndDateTimeTest(final String endDateTime) throws Exc

final String contents = objectMapper.writeValueAsString(request);
//when & then
mockMvc.perform(multipart("/events")
mockMvc.perform(multipart("/admin/events")
.file("images", image1.getBytes())
.file("images", image2.getBytes())
.file(new MockMultipartFile("request", "", "application/json", contents.getBytes(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,15 @@
import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.documentationConfiguration;
import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint;

import com.emmsale.activity.application.ActivityCommandService;
import com.emmsale.activity.application.ActivityQueryService;
import com.emmsale.admin.activity.application.ActivityCommandService;
import com.emmsale.admin.event.application.EventCommandService;
import com.emmsale.admin.report.application.ReportQueryService;
import com.emmsale.admin.tag.application.TagCommandService;
import com.emmsale.block.application.BlockCommandService;
import com.emmsale.block.application.BlockQueryService;
import com.emmsale.comment.application.CommentCommandService;
import com.emmsale.comment.application.CommentQueryService;
import com.emmsale.event.application.EventCommandService;
import com.emmsale.event.application.EventQueryService;
import com.emmsale.event.application.RecruitmentPostCommandService;
import com.emmsale.event.application.RecruitmentPostQueryService;
Expand All @@ -27,11 +29,9 @@
import com.emmsale.notification.application.NotificationCommandService;
import com.emmsale.notification.application.NotificationQueryService;
import com.emmsale.report.application.ReportCommandService;
import com.emmsale.report.application.ReportQueryService;
import com.emmsale.resolver.MemberArgumentResolver;
import com.emmsale.scrap.application.ScrapCommandService;
import com.emmsale.scrap.application.ScrapQueryService;
import com.emmsale.tag.application.TagCommandService;
import com.emmsale.tag.application.TagQueryService;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.BeforeEach;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

import com.emmsale.admin.report.api.AdminReportApi;
import com.emmsale.report.api.ReportApi;
import com.emmsale.report.application.dto.ReportCreateRequest;
import com.emmsale.report.application.dto.ReportCreateResponse;
Expand All @@ -25,7 +26,7 @@
import org.springframework.restdocs.payload.RequestFieldsSnippet;
import org.springframework.restdocs.payload.ResponseFieldsSnippet;

@WebMvcTest(ReportApi.class)
@WebMvcTest({ReportApi.class, AdminReportApi.class})
class ReportApiTest extends MockMvcTestHelper {

@Test
Expand Down Expand Up @@ -100,7 +101,7 @@ void findReports() throws Exception {
when(reportQueryService.findReports()).thenReturn(reportFindResponse);

// when & then
mockMvc.perform(get("/reports"))
mockMvc.perform(get("/admin/reports"))
.andExpect(status().isOk())
.andDo(document("find-reports", responseFields));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

import com.emmsale.admin.tag.api.AdminTagApi;
import com.emmsale.tag.api.TagApi;
import com.emmsale.tag.application.dto.TagRequest;
import com.emmsale.tag.application.dto.TagResponse;
Expand All @@ -22,7 +23,7 @@
import org.springframework.restdocs.payload.RequestFieldsSnippet;
import org.springframework.restdocs.payload.ResponseFieldsSnippet;

@WebMvcTest(TagApi.class)
@WebMvcTest({TagApi.class, AdminTagApi.class})
class TagApiTest extends MockMvcTestHelper {

@Test
Expand Down Expand Up @@ -66,7 +67,7 @@ void addTag() throws Exception {
);

//when & then
mockMvc.perform(post("/tags")
mockMvc.perform(post("/admin/tags")
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(request)))
.andExpect(status().isCreated())
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,11 @@
package com.emmsale.activity.api;

import com.emmsale.activity.application.ActivityCommandService;
import com.emmsale.activity.application.ActivityQueryService;
import com.emmsale.activity.application.dto.ActivityAddRequest;
import com.emmsale.activity.application.dto.ActivityResponse;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

Expand All @@ -20,18 +15,9 @@
public class ActivityApi {

private final ActivityQueryService activityQueryService;
private final ActivityCommandService activityCommandService;

@GetMapping
public ResponseEntity<List<ActivityResponse>> findAll() {
return ResponseEntity.ok(activityQueryService.findAll());
}

@PostMapping
public ResponseEntity<ActivityResponse> create(
@RequestBody final ActivityAddRequest request
) {
return ResponseEntity.status(HttpStatus.CREATED)
.body(activityCommandService.addActivity(request));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.emmsale.admin.activity.api;

import com.emmsale.activity.application.dto.ActivityAddRequest;
import com.emmsale.activity.application.dto.ActivityResponse;
import com.emmsale.admin.activity.application.ActivityCommandService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/admin/activities")
@RequiredArgsConstructor
public class AdminActivityApi {

private final ActivityCommandService activityCommandService;

@PostMapping
public ResponseEntity<ActivityResponse> create(
@RequestBody final ActivityAddRequest request
) {
return ResponseEntity.status(HttpStatus.CREATED)
.body(activityCommandService.addActivity(request));
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.emmsale.activity.application;
package com.emmsale.admin.activity.application;

import com.emmsale.activity.application.dto.ActivityAddRequest;
import com.emmsale.activity.application.dto.ActivityResponse;
Expand Down Expand Up @@ -30,4 +30,3 @@ private void validateAlreadyExist(final String name) {
}
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package com.emmsale.admin.event.api;

import com.emmsale.admin.event.application.EventCommandService;
import com.emmsale.event.application.dto.EventDetailRequest;
import com.emmsale.event.application.dto.EventResponse;
import java.util.List;
import javax.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

@RestController
@RequestMapping("/admin/events")
@RequiredArgsConstructor
public class AdminEventApi {

private final EventCommandService eventCommandService;

@PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@ResponseStatus(HttpStatus.CREATED)
public EventResponse addEvent(@RequestPart @Valid final EventDetailRequest request,
@RequestPart final List<MultipartFile> images) {
return eventCommandService.addEvent(request, images);
}

@PutMapping(path = "/{eventId}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@ResponseStatus(HttpStatus.OK)
public EventResponse updateEvent(@PathVariable final Long eventId,
@RequestPart @Valid final EventDetailRequest request,
@RequestPart final List<MultipartFile> images) {
return eventCommandService.updateEvent(eventId, request, images);
}

@DeleteMapping("/{eventId}")
@ResponseStatus(HttpStatus.NO_CONTENT)
public void deleteEvent(@PathVariable final Long eventId) {
eventCommandService.deleteEvent(eventId);
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.emmsale.event.application;
package com.emmsale.admin.event.application;

import static com.emmsale.event.exception.EventExceptionType.NOT_FOUND_EVENT;
import static java.util.stream.Collectors.toList;
Expand Down
Loading

0 comments on commit 8a95686

Please sign in to comment.