Skip to content

Commit

Permalink
Merge pull request #104 from Codiary-UMC-6th/feature/#51-team-image
Browse files Browse the repository at this point in the history
Feat: 팀 관련 이미지 저장 기능
  • Loading branch information
lee-haeseung authored Aug 8, 2024
2 parents 6461bfd + 53be6c7 commit 76cbebb
Show file tree
Hide file tree
Showing 15 changed files with 286 additions and 26 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@ public void init() {

@Bean
public AmazonS3Client amazonS3Client() {
BasicAWSCredentials awsCredentials1 = new BasicAWSCredentials(accessKey, secretKey);
return (AmazonS3Client) AmazonS3ClientBuilder.standard()
.withRegion(region)
.withCredentials(new AWSStaticCredentialsProvider(awsCredentials))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@ public static TeamResponseDTO.CreateTeamResponseDTO toCreateMemberDTO(Team team)
.teamId(team.getTeamId())
.name(team.getName())
.intro(team.getIntro())
.profilePhoto(team.getProfilePhoto())
.bannerImageUrl(team.getBannerImage().getImageUrl())
.profileImageUrl(team.getProfileImage().getImageUrl())
.build();
}

Expand All @@ -28,7 +29,8 @@ public static TeamResponseDTO.TeamCheckResponseDTO toTeamCheckResponseDTO(Team t
.teamId(team.getTeamId())
.name(team.getName())
.intro(team.getIntro())
.profilePhoto(team.getProfilePhoto())
.bannerImageUrl(team.getBannerImage().getImageUrl())
.profileImageUrl(team.getProfileImage().getImageUrl())
.github(team.getGithub())
.email(team.getEmail())
.linkedIn(team.getLinkedin())
Expand All @@ -41,7 +43,8 @@ public static TeamResponseDTO.UpdateTeamDTO toUpdateTeamDTO(Team team) {
return TeamResponseDTO.UpdateTeamDTO.builder()
.name(team.getName())
.intro(team.getIntro())
.profilePhoto(team.getProfilePhoto())
.bannerImageUrl(team.getBannerImage().getImageUrl())
.profileImageUrl(team.getProfileImage().getImageUrl())
.github(team.getGithub())
.linkedIn(team.getLinkedin())
.discord(team.getDiscord())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,6 @@ public class Team {
@Column(name = "intro", columnDefinition = "varchar(256)")
private String intro;

@Column(name = "profilePhoto", columnDefinition = "varchar(256)")
private String profilePhoto;

@Column(name = "github", columnDefinition = "varchar(256)")
private String github;

Expand All @@ -53,4 +50,10 @@ public class Team {
@OneToMany(mappedBy = "team", cascade = CascadeType.ALL, orphanRemoval = true)
private List<TeamMember> teamMemberList = new ArrayList<>();

@OneToOne(mappedBy = "team", cascade = CascadeType.ALL)
private TeamBannerImage bannerImage;

@OneToOne(mappedBy = "team", cascade = CascadeType.ALL)
private TeamProfileImage profileImage;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.codiary.backend.global.domain.entity;

import jakarta.persistence.*;
import lombok.*;

@Entity
@Builder
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
public class TeamBannerImage {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "team_banner_image_id", nullable = false, columnDefinition = "bigint")
private Long teamBannerImageId;

@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "team_id")
private Team team;

@Column(name = "image_url", nullable = false, columnDefinition = "varchar(500)")
private String imageUrl;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.codiary.backend.global.domain.entity;

import jakarta.persistence.*;
import lombok.*;

@Entity
@Builder
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
public class TeamProfileImage {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "team_profile_image_id", nullable = false, columnDefinition = "bigint")
private Long teamProfileImageId;

@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "team_id")
private Team team;

@Column(name = "image_url", nullable = false, columnDefinition = "varchar(500)")
private String imageUrl;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.codiary.backend.global.repository;

import com.codiary.backend.global.domain.entity.TeamBannerImage;
import org.springframework.data.jpa.repository.JpaRepository;

public interface TeamBannerImageRepository extends JpaRepository<TeamBannerImage, Long> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.codiary.backend.global.repository;

import com.codiary.backend.global.domain.entity.TeamProfileImage;
import org.springframework.data.jpa.repository.JpaRepository;

public interface TeamProfileImageRepository extends JpaRepository<TeamProfileImage, Long> {
}
12 changes: 12 additions & 0 deletions src/main/java/com/codiary/backend/global/s3/AmazonS3Manager.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.codiary.backend.global.s3;

import com.amazonaws.SdkClientException;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.model.ObjectMetadata;
import com.amazonaws.services.s3.model.PutObjectRequest;
Expand Down Expand Up @@ -36,6 +37,17 @@ public String uploadFile(String keyName, MultipartFile file) {
return amazonS3.getUrl(s3Config.getBucket(), keyName).toString();
}

public void deleteFile(String fileUrl) {
String[] segments = fileUrl.split("/");
String keyName = s3Config.getFilesPath() + '/' + segments[segments.length - 1];

try {
amazonS3.deleteObject(s3Config.getBucket(), keyName);
} catch (Exception e) {
log.error("error at AmazonS3Manager deleteFile : {}", (Object) e.getStackTrace());
}
}

public String generatePostName(Uuid uuid) {
return s3Config.getFilesPath() + '/' + uuid.getUuid();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package com.codiary.backend.global.service.TeamService;

import com.codiary.backend.global.apiPayload.ApiResponse;
import com.codiary.backend.global.domain.entity.Team;
import com.codiary.backend.global.web.dto.Team.TeamRequestDTO;
import com.codiary.backend.global.web.dto.Team.TeamResponseDTO;
import com.codiary.backend.global.web.dto.TeamMember.TeamMemberRequestDTO;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
Expand All @@ -14,5 +16,7 @@ public interface TeamCommandService {
// 팀 프로필 수정
Team updateTeam(Long teamId, TeamRequestDTO.UpdateTeamDTO request);

ApiResponse<TeamResponseDTO.TeamImageDTO> updateTeamBannerImage(Long teamId, TeamRequestDTO.TeamImageRequestDTO request);

ApiResponse<TeamResponseDTO.TeamImageDTO> updateTeamProfileImage(Long teamId, TeamRequestDTO.TeamImageRequestDTO request);
}
Original file line number Diff line number Diff line change
@@ -1,31 +1,69 @@
package com.codiary.backend.global.service.TeamService;

import com.codiary.backend.global.domain.entity.Team;
import com.codiary.backend.global.apiPayload.ApiResponse;
import com.codiary.backend.global.apiPayload.code.status.SuccessStatus;
import com.codiary.backend.global.domain.entity.*;
import com.codiary.backend.global.repository.TeamBannerImageRepository;
import com.codiary.backend.global.repository.TeamProfileImageRepository;
import com.codiary.backend.global.repository.TeamRepository;
import com.codiary.backend.global.repository.UuidRepository;
import com.codiary.backend.global.s3.AmazonS3Manager;
import com.codiary.backend.global.web.dto.Member.MemberResponseDTO;
import com.codiary.backend.global.web.dto.Team.TeamRequestDTO;
import com.codiary.backend.global.web.dto.Team.TeamResponseDTO;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.UUID;

@RequiredArgsConstructor
@Service
public class TeamCommandServiceImpl implements TeamCommandService {

private final TeamRepository teamRepository;
private final UuidRepository uuidRepository;
private final AmazonS3Manager s3Manager;
private final TeamBannerImageRepository bannerImageRepository;
private final TeamProfileImageRepository profileImageRepository;
private final TeamProfileImageRepository teamProfileImageRepository;
private final TeamBannerImageRepository teamBannerImageRepository;

@Override
@Transactional
public Team createTeam(TeamRequestDTO.CreateTeamRequestDTO request) {
Team team = Team.builder()
.name(request.getName())
.intro(request.getIntro())
.profilePhoto(request.getProfilePhoto())
.github(request.getGithub())
.email(request.getEmail())
.linkedin(request.getLinkedIn())
.instagram(request.getInstagram())
.build();

return teamRepository.save(team);
Team savedTeam = teamRepository.save(team);

// 배너 이미지 저장
String bannerUuid = UUID.randomUUID().toString();
Uuid savedBannerUuid = uuidRepository.save(Uuid.builder().uuid(bannerUuid).build());
String bannerImageUrl = s3Manager.uploadFile(s3Manager.generatePostName(savedBannerUuid), request.getBannerPhoto());
TeamBannerImage bannerImage = TeamBannerImage.builder()
.imageUrl(bannerImageUrl)
.team(savedTeam)
.build();
savedTeam.setBannerImage(bannerImageRepository.save(bannerImage));

// 프로필 이미지 저장
String profileUuid = UUID.randomUUID().toString();
Uuid savedProfileUuid = uuidRepository.save(Uuid.builder().uuid(profileUuid).build());
String profileImageUrl = s3Manager.uploadFile(s3Manager.generatePostName(savedProfileUuid), request.getProfilePhoto());
TeamProfileImage profileImage = TeamProfileImage.builder()
.imageUrl(profileImageUrl)
.team(savedTeam)
.build();
savedTeam.setProfileImage(profileImageRepository.save(profileImage));

return teamRepository.save(savedTeam);
}

@Override
Expand All @@ -42,4 +80,47 @@ public Team updateTeam(Long teamId, TeamRequestDTO.UpdateTeamDTO request) {
return teamRepository.save(team);
}

@Override
public ApiResponse<TeamResponseDTO.TeamImageDTO> updateTeamBannerImage(Long teamId, TeamRequestDTO.TeamImageRequestDTO request) {
Team team = teamRepository.findById(teamId).orElseThrow(); // 예외 처리 필요

s3Manager.deleteFile(team.getBannerImage().getImageUrl());
teamBannerImageRepository.delete(team.getBannerImage());

String uuid = UUID.randomUUID().toString();
Uuid savedUuid = uuidRepository.save(Uuid.builder().uuid(uuid).build());
String fileUrl = s3Manager.uploadFile(s3Manager.generatePostName(savedUuid), request.getImage());

TeamBannerImage bannerImage = TeamBannerImage.builder()
.imageUrl(fileUrl)
.team(team)
.build();

TeamBannerImage savedImage = bannerImageRepository.save(bannerImage);
TeamResponseDTO.TeamImageDTO response = new TeamResponseDTO.TeamImageDTO(savedImage.getImageUrl());
return ApiResponse.onSuccess(SuccessStatus.TEAM_OK, response);
}

@Override
public ApiResponse<TeamResponseDTO.TeamImageDTO> updateTeamProfileImage(Long teamId, TeamRequestDTO.TeamImageRequestDTO request) {
Team team = teamRepository.findById(teamId).orElseThrow(); // 예외 처리 필요

s3Manager.deleteFile(team.getProfileImage().getImageUrl());
teamProfileImageRepository.delete(team.getProfileImage());

String uuid = UUID.randomUUID().toString();
Uuid savedUuid = uuidRepository.save(Uuid.builder().uuid(uuid).build());
String fileUrl = s3Manager.uploadFile(s3Manager.generatePostName(savedUuid), request.getImage());

TeamProfileImage profileImage = TeamProfileImage.builder()
.imageUrl(fileUrl)
.team(team)
.build();

TeamProfileImage savedImage = profileImageRepository.save(profileImage);
TeamResponseDTO.TeamImageDTO response = new TeamResponseDTO.TeamImageDTO(savedImage.getImageUrl());
return ApiResponse.onSuccess(SuccessStatus.TEAM_OK, response);
}


}
Original file line number Diff line number Diff line change
@@ -1,7 +1,16 @@
package com.codiary.backend.global.service.TeamService;

import com.codiary.backend.global.apiPayload.ApiResponse;
import com.codiary.backend.global.web.dto.Team.TeamResponseDTO;
import org.springframework.stereotype.Service;
import com.codiary.backend.global.web.dto.Team.TeamResponseDTO;

@Service
public interface TeamQueryService {
TeamResponseDTO.TeamCheckResponseDTO getTeamById(Long teamId);

ApiResponse<TeamResponseDTO.TeamImageDTO> getBannerImage(Long teamId);

ApiResponse<TeamResponseDTO.TeamImageDTO> getProfileImage(Long teamId);

TeamResponseDTO.TeamCheckResponseDTO getTeamById(Long teamId);
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
package com.codiary.backend.global.service.TeamService;

import com.codiary.backend.global.apiPayload.ApiResponse;
import com.codiary.backend.global.apiPayload.code.status.SuccessStatus;
import com.codiary.backend.global.domain.entity.Team;
import com.codiary.backend.global.repository.TeamBannerImageRepository;
import com.codiary.backend.global.repository.TeamProfileImageRepository;
import com.codiary.backend.global.converter.TeamConverter;
import com.codiary.backend.global.domain.entity.Team;
import com.codiary.backend.global.repository.TeamRepository;
Expand All @@ -11,13 +16,31 @@
@Service
public class TeamQueryServiceImpl implements TeamQueryService {

private final TeamRepository teamRepository;
private final TeamRepository teamRepository;

@Override
public ApiResponse<TeamResponseDTO.TeamImageDTO> getBannerImage(Long teamId) {
Team team = teamRepository.findById(teamId).orElseThrow(); // 예외 처리 필요

TeamResponseDTO.TeamImageDTO response = new TeamResponseDTO.TeamImageDTO(team.getBannerImage().getImageUrl());

return ApiResponse.onSuccess(SuccessStatus.TEAM_OK, response);
}

@Override
public ApiResponse<TeamResponseDTO.TeamImageDTO> getProfileImage(Long teamId) {
Team team = teamRepository.findById(teamId).orElseThrow(); // 예외 처리 필요

TeamResponseDTO.TeamImageDTO response = new TeamResponseDTO.TeamImageDTO(team.getProfileImage().getImageUrl());

return ApiResponse.onSuccess(SuccessStatus.TEAM_OK, response);
}

@Override
public TeamResponseDTO.TeamCheckResponseDTO getTeamById(Long teamId) {
Team team = teamRepository.findById(teamId)
@Override
public TeamResponseDTO.TeamCheckResponseDTO getTeamById(Long teamId) {
Team team = teamRepository.findById(teamId)
.orElseThrow(() -> new IllegalArgumentException("Invalid team ID"));

return TeamConverter.toTeamCheckResponseDTO(team);
return TeamConverter.toTeamCheckResponseDTO(team);
}
}
Loading

0 comments on commit 76cbebb

Please sign in to comment.