Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat#49 멤버 조회 및 프로필 사진 수정 api 추가 #52

Merged
merged 4 commits into from
Nov 12, 2024
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,6 +1,7 @@
package com.leets.team2.xclone.domain.member.controller;

import com.leets.team2.xclone.common.ApiData;
import com.leets.team2.xclone.domain.member.dto.MemberDTO;
import com.leets.team2.xclone.domain.member.dto.requests.CheckTagDuplicationGetRequest;
import com.leets.team2.xclone.domain.member.dto.requests.MemberFindGetRequest;
import com.leets.team2.xclone.domain.member.dto.responses.CheckTagDuplicationGetResponse;
Expand All @@ -10,6 +11,9 @@
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.multipart.MultipartFile;

public interface MemberController {

Expand All @@ -18,7 +22,10 @@ public interface MemberController {
ResponseEntity<ApiData<CheckTagDuplicationGetResponse>> getCheckTagDuplication(
CheckTagDuplicationGetRequest request);

@Operation(summary = "멤버 정보 가져오기 API", description = "Tag로 멤버 정보를 가져옵니다.")
@ApiResponse(responseCode = "200", description = "멤버 정보 가져오기 성공", content = @Content(schema = @Schema(implementation = MemberFindGetResponse.class)))
ResponseEntity<ApiData<MemberFindGetResponse>> getMember(MemberFindGetRequest request);
@Operation(summary = "멤버 정보 가져오기 API", description = "Tag로 멤버 정보를 찾습니다.")
ResponseEntity<ApiData<MemberDTO.Response>> getMemberInfo(@RequestParam String tag);

@Operation(summary = "프로필 사진 수정 API", description = "자신의 프로필 사진을 수정합니다.")
ResponseEntity<ApiData<MemberDTO.Response>> updateProfilePicture(@RequestPart(value="image",required = false) MultipartFile image);

}
Original file line number Diff line number Diff line change
@@ -1,18 +1,20 @@
package com.leets.team2.xclone.domain.member.controller;

import com.leets.team2.xclone.common.ApiData;
import com.leets.team2.xclone.common.auth.MemberContext;
import com.leets.team2.xclone.common.auth.annotations.UseGuards;
import com.leets.team2.xclone.common.auth.guards.MemberGuard;
import com.leets.team2.xclone.domain.member.dto.MemberDTO;
import com.leets.team2.xclone.domain.member.dto.requests.CheckTagDuplicationGetRequest;
import com.leets.team2.xclone.domain.member.dto.requests.MemberFindGetRequest;
import com.leets.team2.xclone.domain.member.dto.responses.CheckTagDuplicationGetResponse;
import com.leets.team2.xclone.domain.member.dto.responses.MemberFindGetResponse;
import com.leets.team2.xclone.domain.member.entities.Member;
import com.leets.team2.xclone.domain.member.service.MemberService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

@Controller
@RequestMapping("/api/members")
Expand All @@ -31,11 +33,26 @@ public ResponseEntity<ApiData<CheckTagDuplicationGetResponse>> getCheckTagDuplic
}

@Override
@GetMapping
public ResponseEntity<ApiData<MemberFindGetResponse>> getMember(
@ModelAttribute MemberFindGetRequest request) {
return ApiData.ok(
this.memberService.findMembersByTag(request.tag())
);
@GetMapping("")
public ResponseEntity<ApiData<MemberDTO.Response>> getMemberInfo(@RequestParam String tag) {
Member targetMember = memberService.findMemberByTag(tag);
MemberDTO.Response response = MemberDTO.Response.builder()
.birthDate(targetMember.getBirthDate())
.tag(targetMember.getTag())
.nickname(targetMember.getNickname())
.introduction(targetMember.getIntroduction())
.build();

return ApiData.ok(response);
}

@Override
@UseGuards({MemberGuard.class})
@PatchMapping("/profile/picture")
public ResponseEntity<ApiData<MemberDTO.Response>> updateProfilePicture(@RequestPart(value="image",required = false) MultipartFile image){
Member currentMember = MemberContext.getMember();
MemberDTO.Response response = memberService.updateProfilePicture(currentMember, image);
return ApiData.ok(response);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.leets.team2.xclone.domain.member.dto;

import lombok.Builder;

import java.time.LocalDateTime;

public class MemberDTO {
@Builder
public record Response(
LocalDateTime birthDate,
String tag,
String nickname,
String introduction,
String profilePicture
){}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
package com.leets.team2.xclone.domain.member.entities;

import com.leets.team2.xclone.common.entity.AbstractEntity;
import com.leets.team2.xclone.image.converter.ImageListConverter;
import jakarta.persistence.Column;
import jakarta.persistence.Convert;
import jakarta.persistence.Entity;
import jakarta.persistence.Table;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
Expand Down Expand Up @@ -33,4 +38,16 @@ public class Member extends AbstractEntity {

@Column(name = "kakao_id", nullable = false, unique = true)
private Long kakaoId;

@Column(name="image_url")
@Convert(converter = ImageListConverter.class)
private List<String> imageUrl = new ArrayList<>();

public void setImage(String profileImageUrl) {
if (this.imageUrl == null) {
this.imageUrl = new ArrayList<>(); // Initialize if it's null
}
this.imageUrl.clear();
this.imageUrl.add(profileImageUrl);
}
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,20 @@
package com.leets.team2.xclone.domain.member.service;

import com.leets.team2.xclone.domain.member.dto.MemberDTO;
import com.leets.team2.xclone.domain.member.dto.responses.MemberFindGetResponse;
import com.leets.team2.xclone.domain.member.entities.Member;
import com.leets.team2.xclone.domain.member.repository.MemberRepository;
import com.leets.team2.xclone.exception.NoSuchMemberException;

import java.util.List;
import java.util.Optional;

import com.leets.team2.xclone.image.service.ImageSaveService;
import lombok.RequiredArgsConstructor;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.util.NoSuchElementException;

Expand All @@ -19,6 +24,7 @@ public class MemberService {

private static final Log log = LogFactory.getLog(MemberService.class);
private final MemberRepository memberRepository;
private final ImageSaveService imageSaveService;

public boolean checkMemberExistsBy(String nickname, Long kakaoId) {
return this.memberRepository.existsByNicknameAndKakaoId(nickname, kakaoId);
Expand Down Expand Up @@ -56,4 +62,20 @@ public MemberFindGetResponse findMembersByTag(String tag) {
this.memberRepository.findByTagContaining(tag).forEach(memberFindGetResponse::add);
return memberFindGetResponse;
}

public MemberDTO.Response updateProfilePicture(Member currentMember, MultipartFile image) {

if(!image.isEmpty()){
List<String> imageUrl = imageSaveService.uploadImages(List.of(image));
currentMember.setImage(imageUrl.get(0));
}
memberRepository.save(currentMember);
return MemberDTO.Response.builder()
.birthDate(currentMember.getBirthDate())
.tag(currentMember.getTag())
.nickname(currentMember.getNickname())
.introduction(currentMember.getIntroduction())
.profilePicture(currentMember.getImageUrl().get(0))
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.persistence.AttributeConverter;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class ImageListConverter implements AttributeConverter<List<String>, String> {
Expand All @@ -16,6 +16,9 @@ public class ImageListConverter implements AttributeConverter<List<String>, Stri

@Override
public String convertToDatabaseColumn(List<String> attribute) {
if (attribute == null || attribute.isEmpty()) {
return "";
}
try {
return mapper.writeValueAsString(attribute);
} catch (JsonProcessingException e) {
Expand All @@ -25,6 +28,9 @@ public String convertToDatabaseColumn(List<String> attribute) {

@Override
public List<String> convertToEntityAttribute(String dbData) {
if (dbData == null || dbData.isEmpty()) {
return new ArrayList<>(); // Return an empty list if dbData is null or empty
}
try {
return mapper.readValue(dbData, new TypeReference<>() {});
} catch (IOException e) {
Expand Down
Loading