Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
92b5256
CLAP-172 Remove: 알림 설정 엔티티 삭제
joowojr Jan 29, 2025
07e11c2
CLAP-172 Feat: 웹훅 및 이메일 알림 설정에 대한 필드 추가
joowojr Jan 29, 2025
e15fd42
Merge branch 'develop' into CLAP-172
joowojr Jan 29, 2025
4935baf
CLAP-172 Refactor: usecase 세분화
joowojr Jan 30, 2025
4c92c66
CLAP-172 Config: apache tika 의존성 추가
joowojr Jan 30, 2025
a6a38be
CLAP-172 Config: 이미지 파일인지 검증하는 유틸 클래스 생성
joowojr Jan 30, 2025
b4f731b
CLAP-172 Feat: 회원 정보 상세 조회 API 구현
joowojr Jan 30, 2025
9657de7
CLAP-172 Feat: 관리자 회원 정보 수정 메서드 이름 변경
joowojr Jan 30, 2025
c00e9ab
CLAP-172 Fix: port를 호출하도록 수정
joowojr Jan 30, 2025
a776b1c
CLAP-172 Rename: 클래스명 수정
joowojr Jan 30, 2025
254752e
CLAP-172 Feat: 회원 정보 수정 API 구현
joowojr Jan 30, 2025
c42ad70
CLAP-172 Feat: 첨부파일에 관한 에러코드 클래스명 수정
joowojr Jan 30, 2025
672c005
CLAP-172 Rename: 클래스명 수정
joowojr Jan 30, 2025
dd22e37
CLAP-172 Feat: 회원 등록과정에 알림 설정 로직 추가
joowojr Jan 30, 2025
10a0b87
CLAP-172 Fix: 오타 수정
joowojr Jan 30, 2025
ea4a2d5
CLAP-172 Rename: dto명 수정
joowojr Jan 30, 2025
c6dbe49
CLAP-172 Feat: 이미지가 null 또는 empty일 때 예외처리
joowojr Jan 30, 2025
06c57a4
CLAP-172 Feat: 파일을 선택적으로 받도록 수정
joowojr Jan 30, 2025
b1d2436
CLAP-172 Feat: 회원 정보 수정 API 구현
joowojr Jan 30, 2025
0e1319b
Merge branch 'develop' into CLAP-172
joowojr Jan 30, 2025
0a8fc37
CLAP-172 Feat: merge conflict slove
joowojr Jan 30, 2025
559cee0
Merge branch 'develop' into CLAP-172
joowojr Jan 30, 2025
a5d081f
CLAP-172 Remove: 불필요한 코드 제거
joowojr Jan 30, 2025
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
4 changes: 4 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,10 @@ dependencies {
implementation 'software.amazon.awssdk:s3'
implementation 'ch.qos.logback:logback-classic:1.4.12'

// Apache Tika
implementation 'org.apache.tika:tika-core:2.9.0'
implementation 'org.apache.tika:tika-parsers:2.9.0'

}

tasks.named('test') {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
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.adapter.inbound.web.dto.admin.UpdateMemberRequest;
import clap.server.application.port.inbound.admin.UpdateMemberUsecase;
import clap.server.common.annotation.architecture.WebAdapter;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
Expand All @@ -20,14 +20,14 @@
@RequiredArgsConstructor
@RequestMapping("/api/managements/members")
public class ManageMemberController {
private final ManageMemberUsecase manageMemberUsecase;
private final UpdateMemberUsecase updateMemberUsecase;

@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);
@RequestBody @Valid UpdateMemberRequest request){
updateMemberUsecase.updateMemberInfo(userInfo.getUserId(), memberId, request);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
import clap.server.adapter.inbound.security.SecurityUserDetails;
import clap.server.adapter.inbound.web.dto.auth.LoginRequest;
import clap.server.adapter.inbound.web.dto.auth.LoginResponse;
import clap.server.application.port.inbound.auth.AuthUsecase;
import clap.server.application.port.inbound.auth.LoginUsecase;
import clap.server.application.port.inbound.auth.LogoutUsecase;
import clap.server.common.annotation.architecture.WebAdapter;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
Expand All @@ -23,15 +24,16 @@
@RequiredArgsConstructor
@RequestMapping("/api/auths")
public class AuthController {
private final AuthUsecase authUsecase;
private final LoginUsecase loginUsecase;
private final LogoutUsecase logoutUsecase;

@Operation(summary = "로그인 API")
@PostMapping("/login")
public ResponseEntity<LoginResponse> login(@RequestHeader(name = "sessionId") String sessionId,
@RequestBody LoginRequest request,
HttpServletRequest httpRequest) {
String clientIp = getClientIp(httpRequest);
LoginResponse response = authUsecase.login(request.nickname(), request.password(), sessionId, clientIp);
LoginResponse response = loginUsecase.login(request.nickname(), request.password(), sessionId, clientIp);
return ResponseEntity.ok(response);
}

Expand All @@ -41,7 +43,7 @@ public void logout(@AuthenticationPrincipal SecurityUserDetails userInfo,
@Parameter(hidden = true) @RequestHeader(value = "Authorization") String authHeader,
@RequestHeader(value = "refreshToken") String refreshToken) {
String accessToken = authHeader.split(" ")[1];
authUsecase.logout(userInfo.getUserId(), accessToken, refreshToken);
logoutUsecase.logout(userInfo.getUserId(), accessToken, refreshToken);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;

public record UpdateMemberInfoRequest(
public record UpdateMemberRequest(
@NotBlank @Schema(description = "회원 이름", example = "서주원")
String name,
@NotBlank
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package clap.server.adapter.inbound.web.dto.member;

import clap.server.adapter.outbound.persistense.entity.member.constant.MemberRole;
import io.swagger.v3.oas.annotations.media.Schema;

public record MemberDetailInfoResponse(
String profileImageUrl,
@Schema(description = "회원 이름", example = "서주원")
String name,
@Schema(description = "회원 아이디", example = "siena.it")
String nicknanme,
@Schema(description = "회원 이메일", example = "siena.it@gmail.com")
String email,
@Schema(description = "승인 권한 여부")
Boolean isReviewer,
@Schema(description = "회원 역할")
MemberRole role,
@Schema(description = "부서")
String departmentName,
@Schema(description = "직책")
String departmentRole,
@Schema(description = "알림 수신 여부")
NotificationSettingInfoResponse notificationSettingInfo
) {
public static record NotificationSettingInfoResponse(
@Schema(description = "아지트 알림 수신 여부")
boolean agit,
@Schema(description = "이메일 알림 수신 여부")
boolean email,
@Schema(description = "카카오 워크 알림 수신 여부")
boolean kakaoWork
) {
}
}



Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package clap.server.adapter.inbound.web.dto.member;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;

public record UpdateMemberInfoRequest(
@NotBlank @Schema(description = "이름")
String name,
@Schema(description = "아지트 알림 수신 여부")
boolean agitNotification,
@Schema(description = "이메일 알림 수신 여부")
boolean emailNotification,
@Schema(description = "카카오 워크 알림 수신 여부")
boolean kakaoWorkNotification
) {
}



Original file line number Diff line number Diff line change
@@ -1,28 +1,54 @@
package clap.server.adapter.inbound.web.member;

import clap.server.adapter.inbound.security.SecurityUserDetails;
import clap.server.adapter.inbound.web.dto.member.MemberDetailInfoResponse;
import clap.server.adapter.inbound.web.dto.member.MemberProfileResponse;
import clap.server.application.port.inbound.member.MemberInfoUsecase;
import clap.server.adapter.inbound.web.dto.member.UpdateMemberInfoRequest;
import clap.server.application.port.inbound.member.UpdateMemberInfoUsecase;
import clap.server.application.port.inbound.member.MemberDetailInfoUsecase;
import clap.server.application.port.inbound.member.MemberProfileUsecase;
import clap.server.common.annotation.architecture.WebAdapter;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;

@Tag(name = "01. Member", description = "회원 정보 조회 및 수정 API")
@WebAdapter
@RequiredArgsConstructor
@RequestMapping("/api/members")
public class MemberInfoController {
private final MemberInfoUsecase memberInfoUsecase;
private final MemberProfileUsecase memberProfileUsecase;
private final MemberDetailInfoUsecase memberDetailInfoUsecase;
private final UpdateMemberInfoUsecase updateMemberInfoUsecase;

@Operation(summary = "회원 프로필을 조회합니다. 활성화된 회원만 조회 가능합니다.")
@Operation(summary = "회원 프로필 조회 API")
@GetMapping("/profile")
public ResponseEntity<MemberProfileResponse> getMemberProfile(@AuthenticationPrincipal SecurityUserDetails userInfo) {
return ResponseEntity.ok(memberInfoUsecase.getMemberProfile(userInfo.getUserId()));
return ResponseEntity.ok(memberProfileUsecase.getMemberProfile(userInfo.getUserId()));
}

@Operation(summary = "회원 상세 정보 조회 API")
@GetMapping("/info")
public ResponseEntity<MemberDetailInfoResponse> getMemberDetailInfo(@AuthenticationPrincipal SecurityUserDetails userInfo) {
return ResponseEntity.ok(memberDetailInfoUsecase.getMemberInfo(userInfo.getUserId()));
}

@Operation(summary = "회원 정보 수정 API", description = "이미지 수정이 없을 시에는 profileImage를 보내지 않습니다.")
@PatchMapping(value = "/info", consumes = {MediaType.MULTIPART_FORM_DATA_VALUE, MediaType.APPLICATION_JSON_VALUE})
public void updateMemberDetailInfo(
@RequestPart(name = "memberInfo") UpdateMemberInfoRequest request,
@RequestPart(name = "profileImage", required = false) MultipartFile profileImage,
@AuthenticationPrincipal SecurityUserDetails userInfo) throws IOException {
updateMemberInfoUsecase.updateMemberInfo(userInfo.getUserId(), request, profileImage);
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package clap.server.adapter.inbound.web.member;

import clap.server.adapter.inbound.security.SecurityUserDetails;
import clap.server.application.port.inbound.member.ResetInitialPasswordUsecase;
import clap.server.application.port.inbound.member.ResetPasswordUsecase;
import clap.server.common.annotation.architecture.WebAdapter;
import clap.server.common.annotation.validation.password.ValidPassword;
Expand All @@ -19,12 +20,13 @@
@RequestMapping("/api")
public class ResetPasswordController {
private final ResetPasswordUsecase resetPasswordUsecase;
private final ResetInitialPasswordUsecase resetInitialPasswordUsecase;

@Operation(summary = "초기 로그인 후 비밀번호 재설정 API", description = "swagger에서 따옴표를 포함하지 않고 요청합니다.")
@PatchMapping("/members/initial-password")
public void resetPasswordAndActivateMember(@AuthenticationPrincipal SecurityUserDetails userInfo,
@RequestBody @NotBlank @ValidPassword String password) {
resetPasswordUsecase.resetPasswordAndActivateMember(userInfo.getUserId(), password);
resetInitialPasswordUsecase.resetPasswordAndActivateMember(userInfo.getUserId(), password);
}

@Operation(summary = "비밀번호 재설정 API", description = "swagger에서 따옴표를 포함하지 않고 요청합니다.")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public class ManagementTaskController {
@Secured({"ROLE_MANAGER", "ROLE_USER"})
public ResponseEntity<CreateTaskResponse> createTask(
@RequestPart(name = "taskInfo") @Valid CreateTaskRequest createTaskRequest,
@RequestPart(name = "attachment") @NotNull List<MultipartFile> attachments,
@RequestPart(name = "attachment", required = false) @NotNull List<MultipartFile> attachments,
@AuthenticationPrincipal SecurityUserDetails userInfo
){
return ResponseEntity.ok(createTaskUsecase.createTask(userInfo.getUserId(), createTaskRequest, attachments));
Expand All @@ -46,7 +46,7 @@ public ResponseEntity<CreateTaskResponse> createTask(
public ResponseEntity<UpdateTaskResponse> updateTask(
@PathVariable @NotNull Long taskId,
@RequestPart(name = "taskInfo") @Valid UpdateTaskRequest updateTaskRequest,
@RequestPart(name = "attachment") @NotNull List<MultipartFile> attachments,
@RequestPart(name = "attachment", required = false) @NotNull List<MultipartFile> attachments,
@AuthenticationPrincipal SecurityUserDetails userInfo){
return ResponseEntity.ok(updateTaskUsecase.updateTask(userInfo.getUserId(), taskId, updateTaskRequest, attachments));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import clap.server.config.s3.KakaoS3Config;
import clap.server.common.constants.FilePathConstants;
import clap.server.exception.S3Exception;
import clap.server.exception.code.S3Errorcode;
import clap.server.exception.code.AttachmentErrorcode;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.multipart.MultipartFile;
Expand Down Expand Up @@ -34,11 +34,12 @@ public String uploadSingleFile(FilePathConstants filePrefix, MultipartFile file)
try {
Path filePath = getFilePath(file);
String objectKey = createObjectKey(filePrefix.getPath(), file.getOriginalFilename());

uploadToS3(objectKey, filePath);
Files.delete(filePath);
return getFileUrl(objectKey);
} catch (IOException e) {
throw new S3Exception(S3Errorcode.FILE_UPLOAD_REQUEST_FAILED);
throw new S3Exception(AttachmentErrorcode.FILE_UPLOAD_REQUEST_FAILED);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,15 +45,18 @@ public class MemberEntity extends BaseTimeEntity {
@Column(nullable = false)
private MemberStatus status;

// TODO: spring security 적용 예정
@Column(nullable = false)
private String password;

@Column
private String imageUrl;

@Column
private Boolean notificationEnabled;
private Boolean kakaoWorkNotificationEnabled;
@Column
private Boolean agitNotificationEnabled;
@Column
private Boolean emailNotificationEnabled;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "admin_id")
Expand Down

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

Loading