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

Feature/#182 이미 참여한 이벤트인지 확인하는 기능 추가 #183

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions backend/emm-sale/src/docs/asciidoc/index.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,14 @@ include::{snippets}/participate-event-cancel/http-request.adoc[]
.HTTP response
include::{snippets}/participate-event-cancel/http-response.adoc[]

=== `GET`: Event에 이미 참여한 멤버인지 확인

.HTTP request
include::{snippets}/check-already-participate/http-request.adoc[]

.HTTP response
include::{snippets}/check-already-participate/http-response.adoc[]

=== `GET`: 행사 목록 조회

.HTTP request
Expand Down
18 changes: 13 additions & 5 deletions backend/emm-sale/src/main/java/com/emmsale/event/api/EventApi.java
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ public ResponseEntity<EventDetailResponse> findEventById(@PathVariable final Lon
}

@PostMapping("/{eventId}/participants")
Copy link
Collaborator

Choose a reason for hiding this comment

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

아래에는 event-id 로 되어있고, 현재는 eventId가 되어있는데 하나로 통일해보는게 어떨까요?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

eventid로 통일했습니다

public ResponseEntity<String> participateEvent(
public ResponseEntity<Void> participateEvent(
@PathVariable final Long eventId,
@RequestBody final EventParticipateRequest request,
final Member member
Expand Down Expand Up @@ -88,16 +88,24 @@ public EventDetailResponse addEvent(
return eventService.addEvent(request, LocalDate.now());
}

@PutMapping("/{event-id}")
@PutMapping("/{eventId}")
@ResponseStatus(HttpStatus.OK)
public EventDetailResponse updateEvent(@PathVariable(name = "event-id") final Long eventId,
public EventDetailResponse updateEvent(@PathVariable final Long eventId,
@RequestBody @Valid final EventDetailRequest request) {
return eventService.updateEvent(eventId, request, LocalDate.now());
}

@DeleteMapping("/{event-id}")
@DeleteMapping("/{eventId}")
@ResponseStatus(HttpStatus.NO_CONTENT)
public void deleteEvent(@PathVariable(name = "event-id") final Long eventId) {
public void deleteEvent(@PathVariable final Long eventId) {
eventService.deleteEvent(eventId);
}

@GetMapping("/{eventId}/participants/already-participate")
public ResponseEntity<Boolean> isAlreadyParticipate(
@PathVariable final Long eventId,
@RequestParam(name = "member-id") final Long memberId
) {
return ResponseEntity.ok(eventService.isAlreadyParticipate(eventId, memberId));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -249,4 +249,8 @@ private List<Tag> findAllPersistTagsOrElseThrow(final List<TagRequest> tags) {
.orElseThrow(() -> new EventException(EventExceptionType.NOT_FOUND_TAG)))
.collect(toList());
}

public Boolean isAlreadyParticipate(final Long eventId, final Long memberId) {
return participantRepository.existsByEventIdAndMemberId(eventId, memberId);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,6 @@
public interface ParticipantRepository extends JpaRepository<Participant, Long> {

Optional<Participant> findByMemberIdAndEventId(final Long memberId, final Long eventId);

Boolean existsByEventIdAndMemberId(final Long eventId, final Long memberId);
}
3 changes: 3 additions & 0 deletions backend/emm-sale/src/main/resources/http/event.http
Original file line number Diff line number Diff line change
Expand Up @@ -46,3 +46,6 @@ Authorization: bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxIiwiaWF0IjoxNjkwMTk2OTY5L

### 행사 참여자 목록 조회
GET http://localhost:8080/events/1/participants

### 멤버가 행사에 참여했는지 확인
GET http://localhost:8080/events/1/participants/already-participate?member-id=1
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.when;
import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document;
Expand Down Expand Up @@ -448,4 +449,20 @@ void addEventWithUnformattedEndDateTimeTest(final String endDateTime) throws Exc
result.andExpect(status().isBadRequest());
}
}

@Test
@DisplayName("이미 Event에 멤버가 참여헀는지 확인할 수 있다.")
void isAlreadyParticipate() throws Exception {
//given
final Long memberId = 2L;
final Long eventId = 3L;
given(eventService.isAlreadyParticipate(eventId, memberId)).willReturn(true);

//when && then
mockMvc.perform(
get("/events/{eventId}/participants/already-participate?member-id={memberId}"
, eventId, memberId)
)
.andDo(document("check-already-participate"));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import static com.emmsale.event.exception.EventExceptionType.NOT_FOUND_PARTICIPANT;
import static com.emmsale.event.exception.EventExceptionType.NOT_FOUND_TAG;
import static com.emmsale.event.exception.EventExceptionType.START_DATE_TIME_AFTER_END_DATE_TIME;
import static com.emmsale.member.MemberFixture.memberFixture;
import static com.emmsale.tag.TagFixture.AI;
import static com.emmsale.tag.TagFixture.IOS;
import static com.emmsale.tag.TagFixture.백엔드;
Expand Down Expand Up @@ -804,5 +805,38 @@ void deleteEventWithNotExistsEventTest() {
}
}

@Nested
@DisplayName("이벤트에 이미 참가한 멤버인지 확인할 수 있다.")
class isAlreadyParticipate {

@Test
@DisplayName("이벤트에 이미 참가한 경우 true를 반환한다.")
void alreadyParticipateThenTrue() {
//given
final Event 인프콘 = eventRepository.save(인프콘_2023());
final Member 멤버 = memberRepository.save(memberFixture());
eventService.participate(인프콘.getId(), 멤버.getId(), 멤버);

//when
final Boolean actual = eventService.isAlreadyParticipate(인프콘.getId(), 멤버.getId());

//then
assertThat(actual).isTrue();
}

@Test
@DisplayName("이벤트에 참가히자 않은 경우 false를 반환한다.")
void isNotAlreadyParticipateThenFalse() {
//given
final Event 인프콘 = eventRepository.save(인프콘_2023());
final Member 멤버 = memberRepository.save(memberFixture());

//when
final Boolean actual = eventService.isAlreadyParticipate(인프콘.getId(), 멤버.getId());

//then
assertThat(actual).isFalse();
}
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package com.emmsale.event.domain.repository;

import static com.emmsale.event.EventFixture.인프콘_2023;
import static com.emmsale.member.MemberFixture.memberFixture;
import static org.assertj.core.api.Assertions.assertThat;

import com.emmsale.event.domain.Event;
import com.emmsale.event.domain.Participant;
import com.emmsale.member.domain.Member;
import com.emmsale.member.domain.MemberRepository;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase.Replace;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.test.context.jdbc.Sql;

@Sql("/data-test.sql")
@AutoConfigureTestDatabase(replace = Replace.NONE)
@DataJpaTest
class ParticipantRepositoryTest {

@Autowired
private ParticipantRepository participantRepository;
@Autowired
private MemberRepository memberRepository;
@Autowired
private EventRepository eventRepository;

@Nested
@DisplayName("eventId와 memberId로 Participant가 존재하는 지 확인할 수 있다.")
class ExistsByEventIdAndMemberId {

@Test
@DisplayName("Participant가 존재하는 경우 true를 반환한다.")
void alreadyParticipateThenTrue() {
//given
final Event 인프콘 = eventRepository.save(인프콘_2023());
final Member 멤버 = memberRepository.save(memberFixture());
participantRepository.save(new Participant(멤버, 인프콘));

//when
final Boolean actual = participantRepository.existsByEventIdAndMemberId(인프콘.getId(),
멤버.getId());

//then
assertThat(actual).isTrue();
}

@Test
@DisplayName("Particpant가 존재하지 않는 false를 반환한다.")
void isNotAlreadyParticipateThenFalse() {
//given
final Event 인프콘 = eventRepository.save(인프콘_2023());
final Member 멤버 = memberRepository.save(memberFixture());

//when
final Boolean actual = participantRepository.existsByEventIdAndMemberId(인프콘.getId(),
멤버.getId());

//then
assertThat(actual).isFalse();
}
}
}
Loading