Skip to content

Commit

Permalink
Merge pull request #33 from dnd-side-project/feat/#32-update-group-me…
Browse files Browse the repository at this point in the history
…mber

참여자 추가 기능
  • Loading branch information
sudhdkso authored Feb 7, 2025
2 parents 7ff1b02 + 0352d99 commit 54a0baf
Show file tree
Hide file tree
Showing 24 changed files with 491 additions and 99 deletions.
8 changes: 4 additions & 4 deletions .github/workflows/pull-request.yml
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ jobs:
with:
report_paths: '**/build/test-results/test/TEST-*.xml'
token: ${{ secrets.GITHUB_TOKEN }}

#테스트 커버리지 리포트 생성 확인
- name: Check if coverage report exists and is valid
id: check_coverage
Expand All @@ -63,7 +63,7 @@ jobs:
echo "Coverage report exists but has no coverage or is empty."
echo "::set-output name=exists::false"
fi
#테스트 커버리지 리포트 출력
- name: Add coverage to PR
if: steps.check_coverage.outputs.exists == 'true'
Expand All @@ -73,5 +73,5 @@ jobs:
title: 📝 테스트 커버리지 리포트입니다!
paths: ${{ github.workspace }}/build/reports/jacoco/test/jacocoTestReport.xml
token: ${{ secrets.GITHUB_TOKEN }}
min-coverage-overall: 50
min-coverage-changed-files: 50
min-coverage-overall: 80
min-coverage-changed-files: 80
Original file line number Diff line number Diff line change
Expand Up @@ -29,41 +29,39 @@ public class ExpenseController {
private final QueryExpenseService queryExpenseService;

@PostMapping
public ResponseEntity<ExpensesResponse> saveExpenses(@RequestParam("groupId") String token,
public ResponseEntity<ExpensesResponse> saveExpenses(@RequestParam("groupId") Long groupId,
@RequestBody ExpensesRequest request) {
Long groupId = 1L;
ExpensesResponse response = commandExpenseService.createExpenses(groupId, request);
return ResponseEntity.ok(response);
}

@GetMapping
public ResponseEntity<ExpensesResponse> getAllByGroupId(@RequestParam("groupId") String token) {
Long groupId = 1L;
public ResponseEntity<ExpensesResponse> getAllByGroupId(@RequestParam("groupId") Long groupId) {
ExpensesResponse response = queryExpenseService.findAllByGroupId(groupId);
return ResponseEntity.ok(response);
}

@GetMapping("/{expenseId}")
public ResponseEntity<ExpenseResponse> getByExpenseId(@RequestParam("groupId") String token,
public ResponseEntity<ExpenseResponse> getByExpenseId(@RequestParam("groupId") Long groupId,
@PathVariable("expenseId") Long expenseId) {
ExpenseResponse response = queryExpenseService.findOneByExpenseId(expenseId);
return ResponseEntity.ok(response);

}

@PutMapping("/{expenseId}")
public ResponseEntity<ExpenseResponse> updateByExpenseId(@RequestParam("groupId") String token,
public ResponseEntity<ExpenseResponse> updateByExpenseId(@RequestParam("groupId") Long groupId,
@PathVariable("expenseId") Long expenseId,
@RequestBody ExpenseRequest request) {
ExpenseResponse response = commandExpenseService.updateExpense(expenseId, request);
ExpenseResponse response = commandExpenseService.update(expenseId, request);
return ResponseEntity.ok(response);

}

@DeleteMapping("/{expenseId}")
public ResponseEntity<Void> deleteByExpenseId(@RequestParam("groupId") String token,
public ResponseEntity<Void> deleteByExpenseId(@RequestParam("groupId") Long groupId,
@PathVariable("expenseId") Long expenseId) {
commandExpenseService.deleteExpense(expenseId);
commandExpenseService.delete(expenseId);
return ResponseEntity.noContent().build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,8 @@
import com.dnd.moddo.domain.expense.service.implementation.ExpenseCreator;
import com.dnd.moddo.domain.expense.service.implementation.ExpenseDeleter;
import com.dnd.moddo.domain.expense.service.implementation.ExpenseUpdater;
import com.dnd.moddo.domain.groupMember.entity.GroupMember;
import com.dnd.moddo.domain.groupMember.service.implementation.GroupMemberReader;
import com.dnd.moddo.domain.memberExpense.dto.response.MemberExpenseResponse;
import com.dnd.moddo.domain.memberExpense.service.implementation.MemberExpenseCreator;
import com.dnd.moddo.domain.memberExpense.service.CommandMemberExpenseService;

import lombok.RequiredArgsConstructor;

Expand All @@ -25,8 +23,7 @@ public class CommandExpenseService {
private final ExpenseCreator expenseCreator;
private final ExpenseUpdater expenseUpdater;
private final ExpenseDeleter expenseDeleter;
private final MemberExpenseCreator memberExpenseCreator;
private final GroupMemberReader groupMemberReader;
private final CommandMemberExpenseService commandMemberExpenseService;

public ExpensesResponse createExpenses(Long groupId, ExpensesRequest request) {
List<ExpenseResponse> expenses = request.expenses()
Expand All @@ -38,22 +35,18 @@ public ExpensesResponse createExpenses(Long groupId, ExpensesRequest request) {

private ExpenseResponse createExpense(Long groupId, ExpenseRequest request) {
Expense expense = expenseCreator.create(groupId, request);
List<MemberExpenseResponse> memberExpensesResponses = request.memberExpenses().stream()
.map(m -> {
GroupMember groupMember = groupMemberReader.getByGroupMemberId(m.memberId());
return MemberExpenseResponse.of(memberExpenseCreator.create(expense, groupMember, m));
}).toList();

return ExpenseResponse.of(expense, memberExpensesResponses);
List<MemberExpenseResponse> memberExpenseResponses = commandMemberExpenseService.create(expense,
request.memberExpenses());
return ExpenseResponse.of(expense, memberExpenseResponses);
}

public ExpenseResponse updateExpense(Long expenseId, ExpenseRequest request) {
public ExpenseResponse update(Long expenseId, ExpenseRequest request) {
Expense expense = expenseUpdater.update(expenseId, request);
return ExpenseResponse.of(expense);

}

public void deleteExpense(Long expenseId) {
public void delete(Long expenseId) {
//TODO 삭제하는 사람이 정산자인지 확인 로직 필요
expenseDeleter.delete(expenseId);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,15 @@
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.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.dnd.moddo.domain.groupMember.dto.request.GroupMemberSaveRequest;
import com.dnd.moddo.domain.groupMember.dto.request.GroupMembersSaveRequest;
import com.dnd.moddo.domain.groupMember.dto.response.GroupMemberResponse;
import com.dnd.moddo.domain.groupMember.dto.response.GroupMembersResponse;
import com.dnd.moddo.domain.groupMember.service.CommandGroupMemberService;
import com.dnd.moddo.domain.groupMember.service.QueryGroupMemberService;
Expand All @@ -25,20 +28,28 @@ public class GroupMemberController {

@PostMapping
public ResponseEntity<GroupMembersResponse> saveGroupMembers(
@RequestParam("groupId") String token,
@RequestParam("groupId") Long groupId,
@Valid @RequestBody GroupMembersSaveRequest request
) {
Long groupId = 1L; //mock value
GroupMembersResponse response = commandGroupMemberService.createGroupMembers(groupId, request);
GroupMembersResponse response = commandGroupMemberService.create(groupId, request);
return ResponseEntity.ok(response);
}

@GetMapping
public ResponseEntity<GroupMembersResponse> getGroupMembers(
@RequestParam("groupId") String token
@RequestParam("groupId") Long groupId
) {
Long groupId = 1L;
GroupMembersResponse response = queryGroupMemberService.findAll(groupId);
return ResponseEntity.ok(response);
}

@PutMapping
public ResponseEntity<GroupMemberResponse> addGroupMember(
@RequestParam("groupId") Long groupId,
@Valid @RequestBody GroupMemberSaveRequest request
) {
GroupMemberResponse response = commandGroupMemberService.addGroupMember(groupId, request);
return ResponseEntity.ok(response);
}

}
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
package com.dnd.moddo.domain.groupMember.dto.request;

import com.dnd.moddo.domain.group.entity.Group;
import com.dnd.moddo.domain.groupMember.entity.GroupMember;

import jakarta.validation.constraints.NotBlank;

public record GroupMemberSaveRequest(
@NotBlank(message = "참여자 이름으로 공백은 입력할 수 없습니다.")
String name
) {

public GroupMember toEntity(Group group) {
return new GroupMember(name(), group);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,15 @@

import java.util.List;

import com.dnd.moddo.domain.group.entity.Group;
import com.dnd.moddo.domain.groupMember.entity.GroupMember;

public record GroupMembersSaveRequest(
List<GroupMemberSaveRequest> members
) {
public List<GroupMember> toEntity(Long groupId) {
public List<GroupMember> toEntity(Group group) {
return members.stream()
.map(m -> new GroupMember(m.name(), groupId))
.map(m -> m.toEntity(group))
.toList();
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
package com.dnd.moddo.domain.groupMember.entity;

import com.dnd.moddo.domain.group.entity.Group;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import lombok.AccessLevel;
import lombok.Getter;
Expand All @@ -26,25 +31,26 @@ public class GroupMember {
@Column(name = "profile_id")
private Integer profileId;

@Column(name = "meet_id", updatable = false, nullable = false)
private Long groupId;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "group_id")
private Group group;

@Column(name = "is_paid", nullable = false)
private boolean isPaid;

public GroupMember(String name, Long groupId) {
this(null, name, null, groupId, false);
public GroupMember(String name, Group group) {
this(null, name, null, group, false);
}

public GroupMember(String name, Integer profileId, Long groupId) {
this(null, name, profileId, groupId, false);
public GroupMember(String name, Integer profileId, Group group) {
this(null, name, profileId, group, false);
}

public GroupMember(Long id, String name, Integer profileId, Long groupId, boolean isPaid) {
public GroupMember(Long id, String name, Integer profileId, Group group, boolean isPaid) {
this.id = id;
this.name = name;
this.profileId = profileId;
this.groupId = groupId;
this.group = group;
this.isPaid = isPaid;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.dnd.moddo.domain.groupMember.exception;

import org.springframework.http.HttpStatus;

import com.dnd.moddo.global.exception.ModdoException;

public class GroupMemberDuplicateNameException extends ModdoException {
public GroupMemberDuplicateNameException() {
super(HttpStatus.CONFLICT, "중복된 참여자의 이름은 저장할 수 없습니다.");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@

import org.springframework.stereotype.Service;

import com.dnd.moddo.domain.groupMember.dto.request.GroupMemberSaveRequest;
import com.dnd.moddo.domain.groupMember.dto.request.GroupMembersSaveRequest;
import com.dnd.moddo.domain.groupMember.dto.response.GroupMemberResponse;
import com.dnd.moddo.domain.groupMember.dto.response.GroupMembersResponse;
import com.dnd.moddo.domain.groupMember.entity.GroupMember;
import com.dnd.moddo.domain.groupMember.service.implementation.GroupMemberCreator;
Expand All @@ -18,8 +20,14 @@ public class CommandGroupMemberService {
private final GroupMemberCreator groupMemberCreator;
private final GroupMemberUpdater groupMemberUpdater;

public GroupMembersResponse createGroupMembers(Long groupId, GroupMembersSaveRequest request) {
List<GroupMember> members = groupMemberCreator.createGroupMember(groupId, request);
public GroupMembersResponse create(Long groupId, GroupMembersSaveRequest request) {
List<GroupMember> members = groupMemberCreator.create(groupId, request);
return GroupMembersResponse.of(members);
}

public GroupMemberResponse addGroupMember(Long groupId, GroupMemberSaveRequest request) {
GroupMember groupMember = groupMemberUpdater.addToGroup(groupId, request);
return GroupMemberResponse.of(groupMember);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public class QueryGroupMemberService {
private final GroupMemberReader groupMemberReader;

public GroupMembersResponse findAll(Long groupId) {
List<GroupMember> members = groupMemberReader.getAllByGroupId(groupId);
List<GroupMember> members = groupMemberReader.findAllByGroupId(groupId);
return GroupMembersResponse.of(members);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.dnd.moddo.domain.group.entity.Group;
import com.dnd.moddo.domain.group.repository.GroupRepository;
import com.dnd.moddo.domain.groupMember.dto.request.GroupMemberSaveRequest;
import com.dnd.moddo.domain.groupMember.dto.request.GroupMembersSaveRequest;
import com.dnd.moddo.domain.groupMember.entity.GroupMember;
import com.dnd.moddo.domain.groupMember.repository.GroupMemberRepository;
Expand All @@ -13,12 +16,21 @@

@RequiredArgsConstructor
@Service
@Transactional
public class GroupMemberCreator {
private final GroupMemberRepository groupMemberRepository;
private final GroupMemberValidator groupMemberValidator;
private final GroupRepository groupRepository; //추후 grouopReader나 다른것으로 수정할 예정

@Transactional
public List<GroupMember> createGroupMember(Long groupId, GroupMembersSaveRequest request) {
List<GroupMember> groupMembers = request.toEntity(groupId);
return groupMemberRepository.saveAll(groupMembers);
public List<GroupMember> create(Long groupId, GroupMembersSaveRequest request) {
Group group = groupRepository.getById(groupId);

List<String> requestNames = request.members().stream().map(GroupMemberSaveRequest::name).toList();

groupMemberValidator.validateMemberNamesNotDuplicate(requestNames);

List<GroupMember> newMembers = request.toEntity(group);
return groupMemberRepository.saveAll(newMembers);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,17 @@

import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class GroupMemberReader {
private final GroupMemberRepository groupMemberRepository;

public List<GroupMember> getAllByGroupId(Long groupId) {
public List<GroupMember> findAllByGroupId(Long groupId) {
return groupMemberRepository.findByGroupId(groupId);
}

public GroupMember getByGroupMemberId(Long groupMemberId) {
public GroupMember findByGroupMemberId(Long groupMemberId) {
return groupMemberRepository.getById(groupMemberId);
}

Expand Down
Loading

0 comments on commit 54a0baf

Please sign in to comment.