Skip to content
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
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
package clap.server.adapter.inbound.web.admin;

import clap.server.adapter.inbound.security.SecurityUserDetails;
import clap.server.adapter.inbound.web.dto.AddSubCategoryRequest;
import clap.server.adapter.inbound.web.dto.admin.AddSubCategoryRequest;
import clap.server.adapter.inbound.web.dto.admin.AddMainCategoryRequest;
import clap.server.application.port.inbound.management.AddMainCategoryUsecase;
import clap.server.application.port.inbound.management.AddSubCategoryUsecase;
import clap.server.application.port.inbound.admin.AddCategoryUsecase;
import clap.server.common.annotation.architecture.WebAdapter;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
Expand All @@ -14,26 +13,27 @@
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;

@Tag(name = "카테고리 추가")
@WebAdapter
@RequiredArgsConstructor
@RequestMapping("/api/managements")
public class AddCategoryController {
private final AddMainCategoryUsecase addMainCategoryUsecase;
private final AddSubCategoryUsecase addSubCategoryUsecase;
private final AddCategoryUsecase addCategoryUsecase;

@Operation(summary = "1차 카테고리 추가")
@PostMapping("/api/maincategory")
@PostMapping("/main-category")
@Secured("ROLE_ADMIN")
public void addMainCategory(@AuthenticationPrincipal SecurityUserDetails userInfo, @Valid @RequestBody AddMainCategoryRequest addMainCategoryRequest) {
addMainCategoryUsecase.addMainCategory(userInfo.getUserId(), addMainCategoryRequest.code(), addMainCategoryRequest.name());
addCategoryUsecase.addMainCategory(userInfo.getUserId(), addMainCategoryRequest.code(), addMainCategoryRequest.name());
}

@Operation(summary = "2차 카테고리 추가")
@PostMapping("/api/subcategory")
@PostMapping("/sub-category")
@Secured("ROLE_ADMIN")
public void addSubCategory(@AuthenticationPrincipal SecurityUserDetails userInfo, @Valid @RequestBody AddSubCategoryRequest addCategoryRequest) {
addSubCategoryUsecase.addSubCategory(userInfo.getUserId(), addCategoryRequest.mainCategoryId(), addCategoryRequest.code(), addCategoryRequest.name());
addCategoryUsecase.addSubCategory(userInfo.getUserId(), addCategoryRequest.mainCategoryId(), addCategoryRequest.code(), addCategoryRequest.name());
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package clap.server.adapter.inbound.web.admin;

import clap.server.adapter.inbound.security.SecurityUserDetails;
import clap.server.adapter.inbound.web.dto.admin.UpdateMemberInfoRequest;
import clap.server.application.port.inbound.admin.ManageMemberUsecase;
import clap.server.common.annotation.architecture.WebAdapter;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.security.access.annotation.Secured;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
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;

@Tag(name = "회원 관리 - 수정/ 삭제")
@WebAdapter
@RequiredArgsConstructor
@RequestMapping("/api/managements/members")
public class ManageMemberController {
private final ManageMemberUsecase manageMemberUsecase;

@Operation(summary = "단일 회원 등록 API")
@PostMapping("/{memberId}")
@Secured("ROLE_ADMIN")
public void registerMember(@AuthenticationPrincipal SecurityUserDetails userInfo,
@PathVariable Long memberId,
@RequestBody @Valid UpdateMemberInfoRequest request){
manageMemberUsecase.updateMemberInfo(memberId, request);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import clap.server.adapter.inbound.security.SecurityUserDetails;
import clap.server.adapter.inbound.web.dto.admin.RegisterMemberRequest;
import clap.server.application.port.inbound.management.RegisterMemberUsecase;
import clap.server.application.port.inbound.admin.RegisterMemberUsecase;
import clap.server.common.annotation.architecture.WebAdapter;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package clap.server.adapter.inbound.web.dto;
package clap.server.adapter.inbound.web.dto.admin;

import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package clap.server.adapter.inbound.web.dto.admin;

import clap.server.adapter.outbound.persistense.entity.member.constant.MemberRole;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;

public record UpdateMemberInfoRequest(
@NotBlank @Schema(description = "회원 이름", example = "서주원")
String name,
@NotBlank
@Pattern(regexp = "^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,7}$",
message = "올바른 이메일 형식이 아닙니다.")
@Schema(description = "회원 이메일", example = "siena@gmail.com")
String email,
@NotNull @Schema(description = "승인 권한 여부")
Boolean isReviewer,
@NotNull @Schema(description = "부서 ID")
Long departmentId,
@NotNull @Schema(description = "회원 역할")
MemberRole role,
@NotBlank @Schema(description = "회원 직책")
String departmentRole
) {
}

13 changes: 0 additions & 13 deletions src/main/java/clap/server/application/mapper/MemberMapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,19 +18,6 @@ public static Member toMember(MemberInfo memberInfo) {
.build();
}

public static MemberInfo toMemberInfo(String name, String email, String nickname, boolean isReviewer,
Department department, MemberRole role, String departmentRole) {
return MemberInfo.builder()
.name(name)
.email(email)
.nickname(nickname)
.isReviewer(isReviewer)
.department(department)
.role(role)
.departmentRole(departmentRole)
.build();
}

public static MemberProfileResponse toMemberProfileResponse(Member member) {
return new MemberProfileResponse(
member.getMemberId(),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package clap.server.application.port.inbound.admin;

public interface AddCategoryUsecase {
void addMainCategory(Long adminId, String code, String name);
void addSubCategory(Long adminId, Long mainCategoryId, String code, String name);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package clap.server.application.port.inbound.admin;

import clap.server.adapter.inbound.web.dto.admin.UpdateMemberInfoRequest;

public interface ManageMemberUsecase {
void updateMemberInfo(Long memberId, UpdateMemberInfoRequest request);
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package clap.server.application.port.inbound.management;
package clap.server.application.port.inbound.admin;

import clap.server.adapter.inbound.web.dto.admin.RegisterMemberRequest;

Expand Down

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package clap.server.application.service.admin;

import clap.server.application.port.inbound.management.AddSubCategoryUsecase;
import clap.server.application.port.inbound.admin.AddCategoryUsecase;
import clap.server.application.port.outbound.member.LoadMemberPort;
import clap.server.application.port.outbound.task.CommandCategoryPort;
import clap.server.application.port.outbound.task.LoadCategoryPort;
Expand All @@ -17,10 +17,19 @@

@ApplicationService
@RequiredArgsConstructor
public class AddSubCategoryService implements AddSubCategoryUsecase {
public class AddCategoryService implements AddCategoryUsecase {
private final CommandCategoryPort commandCategoryPort;
private final LoadMemberPort loadMemberPort;
private final LoadCategoryPort loadCategoryPort;
private final LoadMemberPort loadMemberPort;

@Override
public void addMainCategory(Long adminId, String code, String name) {
Optional<Member> activeMember = loadMemberPort.findActiveMemberById(adminId);
Category mainCategory = Category.createMainCategory(
activeMember.orElseThrow(() -> new ApplicationException(ACTIVE_MEMBER_NOT_FOUND)),
code, name);
commandCategoryPort.save(mainCategory);
}

@Override
public void addSubCategory(Long adminId, Long mainCategoryId, String code, String name) {
Expand All @@ -33,4 +42,4 @@ public void addSubCategory(Long adminId, Long mainCategoryId, String code, Strin
code, name);
commandCategoryPort.save(subCategory);
}
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package clap.server.application.service.admin;

import clap.server.adapter.inbound.web.dto.admin.UpdateMemberInfoRequest;
import clap.server.application.port.inbound.admin.ManageMemberUsecase;
import clap.server.application.port.inbound.domain.MemberService;
import clap.server.application.port.outbound.member.CommandMemberPort;
import clap.server.application.port.outbound.member.LoadDepartmentPort;
import clap.server.common.annotation.architecture.ApplicationService;
import clap.server.domain.model.member.Department;
import clap.server.domain.model.member.Member;
import clap.server.exception.ApplicationException;
import clap.server.exception.code.DepartmentErrorCode;
import lombok.RequiredArgsConstructor;
import org.springframework.transaction.annotation.Transactional;

@ApplicationService
@RequiredArgsConstructor
@Transactional
class ManageMemberService implements ManageMemberUsecase {
private final MemberService memberService;
private final CommandMemberPort commandMemberPort;
private final LoadDepartmentPort loadDepartmentPort;

@Override
public void updateMemberInfo(Long memberId, UpdateMemberInfoRequest request) {
Member member = memberService.findActiveMember(memberId);
Department department = loadDepartmentPort.findById(request.departmentId()).orElseThrow(() -> new ApplicationException(DepartmentErrorCode.DEPARTMENT_NOT_FOUND));

//TODO: 인프라팀만 담당자가 될 수 있도록 수정해야함
member.getMemberInfo().updateMemberInfo(
request.name(), request.email(), request.isReviewer(),
department, request.role(), request.departmentRole());
commandMemberPort.save(member);
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package clap.server.application.service.admin;

import clap.server.adapter.inbound.web.dto.admin.RegisterMemberRequest;
import clap.server.application.port.inbound.admin.RegisterMemberUsecase;
import clap.server.application.port.inbound.domain.MemberService;
import clap.server.application.port.inbound.management.RegisterMemberUsecase;
import clap.server.application.port.outbound.member.CommandMemberPort;
import clap.server.application.port.outbound.member.LoadDepartmentPort;
import clap.server.common.annotation.architecture.ApplicationService;
Expand All @@ -15,9 +15,6 @@
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.transaction.annotation.Transactional;

import static clap.server.application.mapper.MemberMapper.toMemberInfo;
import static clap.server.application.mapper.MemberMapper.toMember;

@ApplicationService
@RequiredArgsConstructor
class RegisterMemberService implements RegisterMemberUsecase {
Expand All @@ -30,11 +27,13 @@ class RegisterMemberService implements RegisterMemberUsecase {
@Transactional
public void registerMember(Long adminId, RegisterMemberRequest request) {
Member admin = memberService.findActiveMember(adminId);
Department department = loadDepartmentPort.findById(request.departmentId()).orElseThrow(()-> new ApplicationException(DepartmentErrorCode.DEPARTMENT_NOT_FOUND));
MemberInfo memberInfo = toMemberInfo(request.name(), request.email(), request.nickname(), request.isReviewer(),
Department department = loadDepartmentPort.findById(request.departmentId()).orElseThrow(()->
new ApplicationException(DepartmentErrorCode.DEPARTMENT_NOT_FOUND));

//TODO: 인프라팀만 담당자가 될 수 있도록 수정해야함
MemberInfo memberInfo = MemberInfo.toMemberInfo(request.name(), request.email(), request.nickname(), request.isReviewer(),
department, request.role(), request.departmentRole());
Member member = toMember(memberInfo);
member.register(admin);
Member member = Member.createMember(admin, memberInfo);
commandMemberPort.save(member);
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package clap.server.application;
package clap.server.application.statistics;

import clap.server.application.port.outbound.task.LoadTaskPort;
import clap.server.application.port.outbound.task.TaskDocumentPort;
Expand Down
17 changes: 11 additions & 6 deletions src/main/java/clap/server/domain/model/member/Member.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package clap.server.domain.model.member;

import clap.server.adapter.outbound.persistense.entity.member.constant.MemberRole;
import clap.server.adapter.outbound.persistense.entity.member.constant.MemberStatus;
import clap.server.domain.model.common.BaseTime;
import lombok.*;
Expand Down Expand Up @@ -29,12 +30,15 @@ public Member(MemberInfo memberInfo, Boolean notificationEnabled, Member admin,
this.password = password;
}

public void register(Member admin) {
this.admin = admin;
this.notificationEnabled = null;
this.imageUrl = null;
this.status = MemberStatus.PENDING;
this.password = null;
public static Member createMember(Member admin, MemberInfo memberInfo) {
return Member.builder()
.memberInfo(memberInfo)
.notificationEnabled(null)
.admin(admin)
.imageUrl(null)
.status(MemberStatus.PENDING)
.password(null)
.build();
}

public void resetPassword(String newEncodedPassword) {
Expand All @@ -45,6 +49,7 @@ public void resetPasswordAndActivateMember(String newEncodedPassword) {
this.password = newEncodedPassword;
this.status = MemberStatus.ACTIVE;
}

public String getNickname() {
return memberInfo != null ? memberInfo.getNickname() : null;
}
Expand Down
Loading
Loading