diff --git a/build.gradle b/build.gradle index aa1eaa8..6a11087 100644 --- a/build.gradle +++ b/build.gradle @@ -55,6 +55,7 @@ sonarqube { property "sonar.projectKey", "syncd" property "sonar.projectName", "syncd" + property "sonar.gradle.skipCompile", "true" property "sonar.modules", subprojects.collect { it.name }.join(',') subprojects.forEach { subproject -> property "sonar.${subproject.name}.coverage.jacoco.xmlReportPaths", "${subproject.layout.buildDirectory.get()}/$customJacocoReportDir/xml/jacoco.xml" diff --git a/src/main/java/com/syncd/adapter/in/web/UserController.java b/src/main/java/com/syncd/adapter/in/web/UserController.java index 1927c1c..0006fa9 100644 --- a/src/main/java/com/syncd/adapter/in/web/UserController.java +++ b/src/main/java/com/syncd/adapter/in/web/UserController.java @@ -1,7 +1,9 @@ package com.syncd.adapter.in.web; import com.syncd.application.port.in.GetUserInfoUsecase; +import com.syncd.application.port.in.UpdateUserInfoUsecase; import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; import com.syncd.application.service.JwtService; @@ -11,6 +13,7 @@ @RequestMapping("/v1/user") public class UserController { private final GetUserInfoUsecase getUserInfoUsecase; + private final UpdateUserInfoUsecase updateUserInfoUsecase; private final JwtService jwtService; // @PostMapping("/register") @@ -23,5 +26,12 @@ public GetUserInfoUsecase.GetUserInfoResponseDto getUserInfo(HttpServletRequest String token = jwtService.resolveToken(request); return getUserInfoUsecase.getUserInfo(jwtService.getUserIdFromToken(token)); } + + @PostMapping("/update") + public UpdateUserInfoUsecase.UpdateUserInfoResponseDto updateUserInfo(HttpServletRequest request, @Valid @ModelAttribute UpdateUserInfoUsecase.UpdateUserInfoRequestDto requestDto){ + + String token = jwtService.resolveToken(request); + return updateUserInfoUsecase.updateUserInfo(jwtService.getUserIdFromToken(token), requestDto.name(), requestDto.img()); + } } diff --git a/src/main/java/com/syncd/adapter/out/s3/S3UploaderAdaptor.java b/src/main/java/com/syncd/adapter/out/s3/S3UploaderAdaptor.java index b06f5f2..f4e53e4 100644 --- a/src/main/java/com/syncd/adapter/out/s3/S3UploaderAdaptor.java +++ b/src/main/java/com/syncd/adapter/out/s3/S3UploaderAdaptor.java @@ -24,7 +24,7 @@ public class S3UploaderAdaptor implements S3Port { @Value("${cloud.aws.s3.bucket}") private String bucket; - public Optional uploadMultipartFileToS3(MultipartFile multipartFile, String name, String id) { + public Optional uploadMultipartFileToS3(MultipartFile multipartFile) { try { String originalFilename = multipartFile.getOriginalFilename(); String fileExtension = originalFilename.substring(originalFilename.lastIndexOf(".")); diff --git a/src/main/java/com/syncd/application/port/in/UpdateUserInfoUsecase.java b/src/main/java/com/syncd/application/port/in/UpdateUserInfoUsecase.java new file mode 100644 index 0000000..05e201c --- /dev/null +++ b/src/main/java/com/syncd/application/port/in/UpdateUserInfoUsecase.java @@ -0,0 +1,37 @@ +package com.syncd.application.port.in; + +import com.syncd.exceptions.ValidationMessages; +import jakarta.validation.constraints.NotBlank; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +public interface UpdateUserInfoUsecase { + // ====================================== + // METHOD + // ====================================== + UpdateUserInfoResponseDto updateUserInfo( + @NotBlank(message = ValidationMessages.USER_ID_NOT_BLANK) + String userId, + String name, + MultipartFile img + ); + + // ====================================== + // DTO + // ====================================== + record UpdateUserInfoRequestDto( + String name, + MultipartFile img + ) { + } + + record UpdateUserInfoResponseDto( + String userId, + String name, + String img + ) { + } + + +} \ No newline at end of file diff --git a/src/main/java/com/syncd/application/port/out/persistence/user/WriteUserPort.java b/src/main/java/com/syncd/application/port/out/persistence/user/WriteUserPort.java index bb779fc..0fcf114 100644 --- a/src/main/java/com/syncd/application/port/out/persistence/user/WriteUserPort.java +++ b/src/main/java/com/syncd/application/port/out/persistence/user/WriteUserPort.java @@ -5,7 +5,7 @@ import com.syncd.dto.UserId; public interface WriteUserPort { - UserId createUser(String userName, String email,String img); + UserId createUser(String userName, String email, String img); UserId updateUser(User user); } diff --git a/src/main/java/com/syncd/application/port/out/s3/S3Port.java b/src/main/java/com/syncd/application/port/out/s3/S3Port.java index 7bba988..fc0fb0d 100644 --- a/src/main/java/com/syncd/application/port/out/s3/S3Port.java +++ b/src/main/java/com/syncd/application/port/out/s3/S3Port.java @@ -8,6 +8,6 @@ public interface S3Port { - public Optional uploadMultipartFileToS3(MultipartFile multipartFile, String name, String id); + public Optional uploadMultipartFileToS3(MultipartFile multipartFile); public Optional deleteFileFromS3(String filename); } diff --git a/src/main/java/com/syncd/application/service/ProjectService.java b/src/main/java/com/syncd/application/service/ProjectService.java index 67b412d..5f43bdc 100644 --- a/src/main/java/com/syncd/application/service/ProjectService.java +++ b/src/main/java/com/syncd/application/service/ProjectService.java @@ -50,13 +50,16 @@ public CreateProjectResponseDto createProject(String hostId, String hostName, St String imgURL = ""; System.out.println(hostName); if (img != null && !img.isEmpty()) { - Optional optionalImgURL = s3Port.uploadMultipartFileToS3(img, hostName, projectName); + Optional optionalImgURL = s3Port.uploadMultipartFileToS3(img); imgURL = optionalImgURL.orElseThrow(() -> new IllegalStateException("Failed to upload image to S3")); } Project project = new Project(); project = project.createProjectDomain(projectName, description, imgURL, hostId); - project.addUsers(userInProjectFromEmail(userEmails)); + if (userEmails != null && !userEmails.isEmpty()){ + project.addUsers(userInProjectFromEmail(userEmails)); + sendMailPort.sendIviteMailBatch(hostName, projectName, userEmails, project.getId()); + } CreateProjectResponseDto createProjectResponseDto = new CreateProjectResponseDto(writeProjectPort.CreateProject(project)); User host = readUserPort.findByUserId(hostId); @@ -67,7 +70,6 @@ public CreateProjectResponseDto createProject(String hostId, String hostName, St // .collect(Collectors.toList()); // } - sendMailPort.sendIviteMailBatch(hostName, projectName, userEmails, project.getId()); return createProjectResponseDto; } diff --git a/src/main/java/com/syncd/application/service/UserService.java b/src/main/java/com/syncd/application/service/UserService.java index 4ee31bd..ea62a6f 100644 --- a/src/main/java/com/syncd/application/service/UserService.java +++ b/src/main/java/com/syncd/application/service/UserService.java @@ -3,9 +3,11 @@ import com.syncd.application.port.in.GetAllRoomsByUserIdUsecase; import com.syncd.application.port.in.GetUserInfoUsecase; //import com.syncd.application.port.in.RegitsterUserUsecase; +import com.syncd.application.port.in.UpdateUserInfoUsecase; import com.syncd.application.port.out.autentication.AuthenticationPort; import com.syncd.application.port.out.persistence.user.ReadUserPort; import com.syncd.application.port.out.persistence.user.WriteUserPort; +import com.syncd.application.port.out.s3.S3Port; import com.syncd.domain.user.User; //import com.syncd.dto.TokenDto; //import com.syncd.dto.UserForTokenDto; @@ -14,17 +16,19 @@ //import org.springframework.security.core.userdetails.UserDetails; //import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.util.Optional; @Service @Primary @RequiredArgsConstructor -public class UserService implements GetUserInfoUsecase { +public class UserService implements GetUserInfoUsecase, UpdateUserInfoUsecase { private final ReadUserPort readUserPort; private final WriteUserPort writeUserPort; - private final AuthenticationPort authenticationPort; - + private final S3Port s3Port; private final GetAllRoomsByUserIdUsecase getAllRoomsByUserIdUsecase; // @Override @@ -48,6 +52,30 @@ public GetUserInfoResponseDto getUserInfo(String userId) { } + @Override + public UpdateUserInfoResponseDto updateUserInfo(String userId, String name, MultipartFile img) { + User user = readUserPort.findByUserId(userId); + + if (user == null) { + throw new RuntimeException("User not found with ID: " + userId); + } + + if (name != null && !name.isEmpty()) { + user.setName(name); + } + + String imgURL = ""; + if (img != null && !img.isEmpty()) { + Optional optionalImgURL = s3Port.uploadMultipartFileToS3(img); + imgURL = optionalImgURL.orElseThrow(() -> new IllegalStateException("Failed to upload image to S3")); + user.setProfileImg(imgURL); + } + + writeUserPort.updateUser(user); + + return new UpdateUserInfoResponseDto(userId, user.getName(), user.getProfileImg()); + } + // public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { // // 데이터베이스에서 사용자 정보를 조회하는 로직을 구현합니다. // User user = readUserPort.findByUsername(username); diff --git a/src/main/java/com/syncd/domain/project/Project.java b/src/main/java/com/syncd/domain/project/Project.java index d3537fd..728b8e4 100644 --- a/src/main/java/com/syncd/domain/project/Project.java +++ b/src/main/java/com/syncd/domain/project/Project.java @@ -94,7 +94,7 @@ private List userInProjectsFromUsers(String hostId){ public String getImgFileName() { try { - URL url = new URL(img); + URL url = new URL("https://" + img); String path = url.getPath(); return path.substring(path.lastIndexOf('/') + 1); } catch (Exception e) { diff --git a/src/test/java/Dummy/Stub/application/out/s3/StubS3Port.java b/src/test/java/Dummy/Stub/application/out/s3/StubS3Port.java index cd01eca..e3948a1 100644 --- a/src/test/java/Dummy/Stub/application/out/s3/StubS3Port.java +++ b/src/test/java/Dummy/Stub/application/out/s3/StubS3Port.java @@ -8,8 +8,9 @@ public class StubS3Port implements S3Port { + @Override - public Optional uploadMultipartFileToS3(MultipartFile multipartFile, String name, String id) { + public Optional uploadMultipartFileToS3(MultipartFile multipartFile) { return Optional.of(Consistent.S3Link.getValue()); }