Skip to content

Commit

Permalink
Merge pull request #76 from HongDam-org/feat/plan-group-api
Browse files Browse the repository at this point in the history
[FEAT] 누락된 api 구현
  • Loading branch information
ohksj77 authored Dec 11, 2023
2 parents 1a74d0a + e42e593 commit 0ea2357
Show file tree
Hide file tree
Showing 27 changed files with 504 additions and 21 deletions.
6 changes: 6 additions & 0 deletions backend/src/docs/group.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -28,3 +28,9 @@ operation::get share[snippets='http-request,http-response']

=== 자신의 소속 그룹 정보 반환
operation::get myGroups[snippets='http-request,http-response']

=== 그룹 자신 위치 수정
operation::post update group member location[snippets='http-request,http-response']

=== 그룹 탈퇴
operation::post out group[snippets='http-request,http-response']
3 changes: 3 additions & 0 deletions backend/src/docs/plan.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,6 @@ operation::post out plan[snippets='http-request,http-response']

=== 본인이 속한 계획 전체 조회
operation::get all plans[snippets='http-request,http-response']

=== 본인이 속한 계획 전체 조회
operation::post update plan[snippets='http-request,http-response']
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,8 @@ public SecurityFilterChain configure(HttpSecurity http) throws Exception {
"auth/save",
"auth/login",
"member/duplicate/**",
"plan/**",
"actuator/**")
.permitAll())
.authorizeHttpRequests(
x -> x.requestMatchers("/test/**").permitAll().anyRequest().authenticated())
.sessionManagement(x -> x.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class)
.exceptionHandling(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,20 @@
import com.twtw.backend.domain.group.dto.request.InviteGroupRequest;
import com.twtw.backend.domain.group.dto.request.JoinGroupRequest;
import com.twtw.backend.domain.group.dto.request.MakeGroupRequest;
import com.twtw.backend.domain.group.dto.request.OutGroupRequest;
import com.twtw.backend.domain.group.dto.request.UpdateLocationRequest;
import com.twtw.backend.domain.group.dto.response.GroupInfoResponse;
import com.twtw.backend.domain.group.dto.response.ShareInfoResponse;
import com.twtw.backend.domain.group.dto.response.SimpleGroupInfoResponse;
import com.twtw.backend.domain.group.service.GroupService;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
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;

import java.util.List;
import java.util.UUID;
Expand Down Expand Up @@ -67,4 +74,17 @@ public ResponseEntity<ShareInfoResponse> getShare(@PathVariable UUID id) {
public ResponseEntity<List<GroupInfoResponse>> getMyGroups() {
return ResponseEntity.ok(groupService.getMyGroups());
}

@PostMapping("location")
public ResponseEntity<Void> updateLocation(
@RequestBody final UpdateLocationRequest updateLocationRequest) {
groupService.updateLocation(updateLocationRequest);
return ResponseEntity.noContent().build();
}

@PostMapping("out")
public ResponseEntity<Void> outGroup(@RequestBody final OutGroupRequest outGroupRequest) {
groupService.outGroup(outGroupRequest);
return ResponseEntity.noContent().build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.twtw.backend.domain.group.controller.advice;

import com.twtw.backend.domain.group.exception.IllegalGroupMemberException;
import com.twtw.backend.global.advice.ErrorResponse;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
public class GroupControllerAdvice {

@ExceptionHandler(IllegalGroupMemberException.class)
public ResponseEntity<ErrorResponse> invalidFriendMember(final IllegalGroupMemberException e) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST)
.body(new ErrorResponse(e.getMessage()));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.twtw.backend.domain.group.dto.request;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.UUID;

@Getter
@NoArgsConstructor
@AllArgsConstructor
public class OutGroupRequest {
private UUID groupId;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.twtw.backend.domain.group.dto.request;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.UUID;

@Getter
@NoArgsConstructor
@AllArgsConstructor
public class UpdateLocationRequest {
private UUID groupId;
private Double longitude;
private Double latitude;
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.twtw.backend.domain.group.entity;

import com.twtw.backend.domain.group.exception.IllegalGroupMemberException;
import com.twtw.backend.domain.member.entity.Member;
import com.twtw.backend.domain.plan.entity.Plan;
import com.twtw.backend.global.audit.AuditListener;
Expand Down Expand Up @@ -75,4 +76,28 @@ public void inviteAll(final List<Member> friends) {
private boolean addGroupMember(final GroupMember groupMember) {
return this.groupMembers.add(groupMember);
}

public void updateMemberLocation(
final Member member, final Double longitude, final Double latitude) {
final GroupMember groupMember = getGroupMember(member);
groupMember.updateCoordinate(longitude, latitude);
}

private GroupMember getGroupMember(final Member member) {
return this.groupMembers.stream()
.filter(groupMember -> groupMember.isSameMember(member))
.findAny()
.orElseThrow(IllegalGroupMemberException::new);
}

public void outGroup(final Member member) {
this.groupMembers.removeIf(groupMember -> groupMember.isSameMember(member));
if (hasNoLeader()) {
this.leaderId = this.groupMembers.get(0).getMember().getId();
}
}

private boolean hasNoLeader() {
return this.groupMembers.stream().noneMatch(GroupMember::isLeader);
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.twtw.backend.domain.group.entity;

import com.twtw.backend.domain.member.entity.Member;
import com.twtw.backend.domain.place.entity.Coordinate;
import com.twtw.backend.global.audit.AuditListener;
import com.twtw.backend.global.audit.Auditable;
import com.twtw.backend.global.audit.BaseTime;
Expand Down Expand Up @@ -31,6 +32,7 @@
@EntityListeners(AuditListener.class)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class GroupMember implements Auditable {

@Id
@GeneratedValue(generator = "uuid2")
@Column(name = "id", columnDefinition = "BINARY(16)")
Expand All @@ -44,6 +46,8 @@ public class GroupMember implements Auditable {
@JoinColumn(name = "member_id")
private Member member;

@Embedded private Coordinate coordinate;

private Boolean share;

@Enumerated(EnumType.STRING)
Expand Down Expand Up @@ -77,4 +81,25 @@ public void acceptInvite() {
public UUID getGroupId() {
return this.group.getId();
}

public Coordinate getCoordinate() {
if (share) {
return coordinate;
}
return Coordinate.empty();
}

public void updateCoordinate(final Double longitude, final Double latitude) {
if (share) {
this.coordinate = new Coordinate(longitude, latitude);
}
}

public boolean isSameMember(final Member member) {
return this.member.getId().equals(member.getId());
}

public boolean isLeader() {
return this.group.getLeaderId().equals(this.member.getId());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.twtw.backend.domain.group.exception;

public class IllegalGroupMemberException extends IllegalArgumentException {

private static final String MESSAGE = "그룹에 포함되지 않은 멤버입니다.";

public IllegalGroupMemberException() {
super(MESSAGE);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import com.twtw.backend.domain.group.dto.request.InviteGroupRequest;
import com.twtw.backend.domain.group.dto.request.JoinGroupRequest;
import com.twtw.backend.domain.group.dto.request.MakeGroupRequest;
import com.twtw.backend.domain.group.dto.request.OutGroupRequest;
import com.twtw.backend.domain.group.dto.request.UpdateLocationRequest;
import com.twtw.backend.domain.group.dto.response.GroupInfoResponse;
import com.twtw.backend.domain.group.dto.response.ShareInfoResponse;
import com.twtw.backend.domain.group.dto.response.SimpleGroupInfoResponse;
Expand Down Expand Up @@ -131,4 +133,19 @@ public List<GroupInfoResponse> getMyGroups() {

return groupMapper.toMyGroupsInfo(loginMember.getGroupMembers());
}

@Transactional
public void updateLocation(final UpdateLocationRequest updateLocationRequest) {
final Member member = authService.getMemberByJwt();
final Group group = getGroupEntity(updateLocationRequest.getGroupId());
group.updateMemberLocation(
member, updateLocationRequest.getLongitude(), updateLocationRequest.getLatitude());
}

@Transactional
public void outGroup(final OutGroupRequest outGroupRequest) {
final Member member = authService.getMemberByJwt();
final Group group = getGroupEntity(outGroupRequest.getGroupId());
group.outGroup(member);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ public void share(
@DestinationVariable final UUID planId,
@Payload final LocationRequest locationRequest) {
rabbitTemplate.convertAndSend(
EXCHANGE_NAME, ROUTING_KEY + planId, locationService.addInfo(locationRequest));
EXCHANGE_NAME,
ROUTING_KEY + planId,
locationService.addInfo(planId, locationRequest));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.twtw.backend.domain.location.dto.response;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class AverageCoordinate {
private Double longitude;
private Double latitude;
private Double distance;
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,6 @@ public class LocationResponse {
private String nickname;
private Double longitude;
private Double latitude;
private AverageCoordinate averageCoordinate;
private LocalDateTime time;
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,21 @@
package com.twtw.backend.domain.location.mapper;

import com.twtw.backend.domain.location.dto.request.LocationRequest;
import com.twtw.backend.domain.location.dto.response.AverageCoordinate;
import com.twtw.backend.domain.location.dto.response.LocationResponse;

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingConstants;

import java.time.LocalDateTime;

@Mapper(componentModel = MappingConstants.ComponentModel.SPRING)
public interface LocationMapper {
LocationResponse toResponse(LocationRequest locationRequest, LocalDateTime time);
@Mapping(target = "longitude", source = "locationRequest.longitude")
@Mapping(target = "latitude", source = "locationRequest.latitude")
LocationResponse toResponse(
LocationRequest locationRequest,
AverageCoordinate averageCoordinate,
LocalDateTime time);
}
Loading

0 comments on commit 0ea2357

Please sign in to comment.