Skip to content
41 changes: 40 additions & 1 deletion src/main/java/flipnote/group/adapter/in/web/GroupController.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,21 @@
package flipnote.group.adapter.in.web;

import org.springframework.http.ResponseEntity;
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.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import flipnote.group.api.dto.request.ChangeGroupRequestDto;
import flipnote.group.api.dto.request.CreateGroupRequestDto;
import flipnote.group.api.dto.response.ChangeGroupResponseDto;
import flipnote.group.api.dto.response.CreateGroupResponseDto;
import flipnote.group.application.port.in.ChangeGroupUseCase;
import flipnote.group.application.port.in.CreateGroupUseCase;
import flipnote.group.application.port.in.command.ChangeGroupCommand;
import flipnote.group.application.port.in.command.CreateGroupCommand;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
Expand All @@ -20,6 +26,7 @@
public class GroupController {

private final CreateGroupUseCase createGroupUseCase;
private final ChangeGroupUseCase changeGroupUseCase;

/**
* 그룹 생성 API
Expand All @@ -33,6 +40,7 @@ public ResponseEntity<CreateGroupResponseDto> createGroup(
@RequestBody @Valid CreateGroupRequestDto req) {

CreateGroupCommand cmd = new CreateGroupCommand(
userId,
req.name(),
req.category(),
req.description(),
Expand All @@ -42,9 +50,40 @@ public ResponseEntity<CreateGroupResponseDto> createGroup(
req.imageRefId()
);

var result = createGroupUseCase.create(cmd, userId);
var result = createGroupUseCase.create(cmd);
CreateGroupResponseDto res = CreateGroupResponseDto.from(result.groupId());
return ResponseEntity.ok(res);
}

/**
* 그룹 수정 API
* @param userId
* @param groupId
* @param req
* @return
*/
@PutMapping("/{groupId}")
public ResponseEntity<ChangeGroupResponseDto> changeGroup(
@RequestHeader("X-USER-ID") Long userId,
@PathVariable Long groupId,
@RequestBody @Valid ChangeGroupRequestDto req) {

ChangeGroupCommand cmd = new ChangeGroupCommand(
groupId,
userId,
req.name(),
req.category(),
req.description(),
req.joinPolicy(),
req.visibility(),
req.maxMember(),
req.imageRefId()
);

var result = changeGroupUseCase.change(cmd);

ChangeGroupResponseDto res = ChangeGroupResponseDto.from(result);
return ResponseEntity.ok(res);
}

}
17 changes: 17 additions & 0 deletions src/main/java/flipnote/group/adapter/out/entity/GroupEntity.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package flipnote.group.adapter.out.entity;

import flipnote.group.application.port.in.command.ChangeGroupCommand;
import flipnote.group.application.port.in.command.CreateGroupCommand;
import flipnote.group.domain.model.BaseEntity;
import flipnote.group.domain.model.group.Category;
Expand Down Expand Up @@ -66,4 +67,20 @@ private GroupEntity(String name, Category category, String description, JoinPoli
this.imageRefId = imageRefId;
this.memberCount = memberCount;
}

/**
* 업데이트
* @param cmd
*/
public void change(
ChangeGroupCommand cmd
) {
this.name = cmd.name();
this.category = cmd.category();
this.description = cmd.description();
this.joinPolicy = cmd.joinPolicy();
this.visibility = cmd.visibility();
this.maxMember = cmd.maxMember();
this.imageRefId = cmd.imageRefId();
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package flipnote.group.adapter.out.persistence;

import java.util.Optional;

import org.springframework.stereotype.Repository;

import flipnote.group.adapter.out.entity.GroupEntity;
Expand All @@ -15,9 +17,47 @@ public class GroupRepositoryAdapter implements GroupRepositoryPort {

private final GroupRepository groupRepository;

/**
* 그룹 저장
* @param group
* @return
*/
@Override
public Long saveNewGroup(Group group) {
GroupEntity entity = GroupMapper.createNewEntity(group);
return groupRepository.save(entity).getId();
}

@Override
public Group findById(Long id) {
GroupEntity groupEntity = groupRepository.findById(id).orElseThrow(
() -> new IllegalArgumentException("Group not Exist")
);
return GroupMapper.toDomain(groupEntity);
}

/**
* 그룹 수정
* @param group
*/
@Override
public Group update(Group group) {

GroupEntity groupEntity = groupRepository.findById(group.getId()).orElseThrow(
() -> new IllegalArgumentException("group not Exist")
);

groupEntity.change(
group.getName(),
group.getCategory(),
group.getDescription(),
group.getJoinPolicy(),
group.getVisibility(),
group.getMaxMember(),
group.getImageRefId()
);

return GroupMapper.toDomain(groupEntity);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,25 @@ public static GroupEntity createNewEntity(Group domain) {
.memberCount(domain.getMemberCount())
.build();
}

/**
* 엔티티 -> 도메인
* @param e
* @return
*/
public static Group toDomain(GroupEntity e) {
return Group.restore(
e.getId(),
e.getName(),
e.getCategory(),
e.getDescription(),
e.getJoinPolicy(),
e.getVisibility(),
e.getMaxMember(),
e.getImageRefId(),
e.getMemberCount(),
e.getCreatedAt(),
e.getModifiedAt()
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package flipnote.group.api.dto.request;

import flipnote.group.domain.model.group.Category;
import flipnote.group.domain.model.group.JoinPolicy;
import flipnote.group.domain.model.group.Visibility;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;

public record ChangeGroupRequestDto(
@NotBlank String name,
@NotNull Category category,
@NotBlank String description,
@NotNull JoinPolicy joinPolicy,
@NotNull Visibility visibility,
@NotNull @Min(1) @Max(100) Integer maxMember,
Long imageRefId
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package flipnote.group.api.dto.response;

import java.time.LocalDateTime;

import flipnote.group.application.port.in.result.ChangeGroupResult;
import flipnote.group.domain.model.group.Category;
import flipnote.group.domain.model.group.Group;
import flipnote.group.domain.model.group.JoinPolicy;
import flipnote.group.domain.model.group.Visibility;

public record ChangeGroupResponseDto(
String name,

Category category,

String description,

JoinPolicy joinPolicy,

Visibility visibility,

Integer maxMember,

Long imageRefId,

LocalDateTime createdAt,

LocalDateTime modifiedAt
) {
public static ChangeGroupResponseDto from(ChangeGroupResult result) {

Group group = result.group();

return new ChangeGroupResponseDto(
group.getName(),
group.getCategory(),
group.getDescription(),
group.getJoinPolicy(),
group.getVisibility(),
group.getMaxMember(),
group.getImageRefId(),
group.getCreatedAt(),
group.getModifiedAt()
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package flipnote.group.application.port.in;

import flipnote.group.application.port.in.command.ChangeGroupCommand;
import flipnote.group.application.port.in.result.ChangeGroupResult;

public interface ChangeGroupUseCase {
ChangeGroupResult change(ChangeGroupCommand cmd);
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,5 @@
import flipnote.group.application.port.in.result.CreateGroupResult;

public interface CreateGroupUseCase {
CreateGroupResult create(CreateGroupCommand cmd, Long userId);
CreateGroupResult create(CreateGroupCommand cmd);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package flipnote.group.application.port.in.command;

import flipnote.group.domain.model.group.Category;
import flipnote.group.domain.model.group.JoinPolicy;
import flipnote.group.domain.model.group.Visibility;

public record ChangeGroupCommand(
Long groupId,
Long userId,
String name,
Category category,
String description,
JoinPolicy joinPolicy,
Visibility visibility,
int maxMember,
Long imageRefId
) {

}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import flipnote.group.domain.model.group.Visibility;

public record CreateGroupCommand(
Long userId,
String name,
Category category,
String description,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package flipnote.group.application.port.in.result;

import flipnote.group.domain.model.group.Group;

public record ChangeGroupResult(
Group group
) {
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package flipnote.group.application.port.out;

import flipnote.group.domain.model.member.GroupMemberRole;

public interface GroupMemberRepositoryPort {
void saveOwner(Long groupId, Long userId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,8 @@

public interface GroupRepositoryPort {
Long saveNewGroup(Group group);

Group findById(Long id);

Group update(Group group);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package flipnote.group.application.service;

import java.util.Optional;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import flipnote.group.adapter.out.entity.GroupEntity;
import flipnote.group.adapter.out.persistence.mapper.GroupMapper;
import flipnote.group.application.port.in.ChangeGroupUseCase;
import flipnote.group.application.port.in.command.ChangeGroupCommand;
import flipnote.group.application.port.in.result.ChangeGroupResult;
import flipnote.group.application.port.out.GroupRepositoryPort;
import flipnote.group.domain.model.group.Group;
import flipnote.group.infrastructure.persistence.jpa.GroupRepository;
import lombok.RequiredArgsConstructor;

@Service
@RequiredArgsConstructor
public class ChangeGroupService implements ChangeGroupUseCase {

private final GroupRepository jpaGroupRepository;

/**
* 그룹 수정
* @param cmd
* @return
*/
@Override
@Transactional
public ChangeGroupResult change(ChangeGroupCommand cmd) {

GroupEntity entity = jpaGroupRepository.findById(cmd.groupId()).orElseThrow(
() -> new IllegalArgumentException("group not Exists")
);

entity.change(cmd);

return new ChangeGroupResult(GroupMapper.toDomain(entity));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,11 @@ public class CreateGroupService implements CreateGroupUseCase {
/**
* 그룹 생성
* @param cmd
* @param userId
* @return
*/
@Override
@Transactional
public CreateGroupResult create(CreateGroupCommand cmd, Long userId) {
public CreateGroupResult create(CreateGroupCommand cmd) {

//도메인 생성 및 검증
var domainGroup = Group.create(cmd);
Expand All @@ -36,7 +35,7 @@ public CreateGroupResult create(CreateGroupCommand cmd, Long userId) {
Long groupId = groupRepository.saveNewGroup(domainGroup);

//그룹 멤버 저장
groupMemberRepository.saveOwner(groupId, userId);
groupMemberRepository.saveOwner(groupId, cmd.userId());

return new CreateGroupResult(groupId);
}
Expand Down
Loading