Skip to content

Commit

Permalink
Merge pull request #47 from DEPthes/feat/council
Browse files Browse the repository at this point in the history
[FEAT] 소개이미지 API
  • Loading branch information
ibaesuyeon authored Dec 6, 2024
2 parents 7082755 + ba06f3f commit 9e1b4db
Show file tree
Hide file tree
Showing 7 changed files with 172 additions and 27 deletions.
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
package depth.mju.council.domain.user.controller;

import depth.mju.council.domain.committe.dto.req.CreateCommitteeReq;
import depth.mju.council.domain.user.dto.req.UpdateCouncilReq;
import depth.mju.council.domain.user.service.CouncilService;
import depth.mju.council.domain.user.service.UserService;
import depth.mju.council.global.config.UserPrincipal;
import depth.mju.council.global.payload.ApiResult;
import io.swagger.v3.oas.annotations.Operation;
Expand Down Expand Up @@ -45,4 +43,58 @@ public ResponseEntity<?> updateCouncil(
.build()
);
}

@Operation(summary = "소개이미지 조회")
@GetMapping("/images")
public ResponseEntity<ApiResult> getCouncilImages() {
ApiResult apiResult = ApiResult.builder()
.check(true)
.information(councilService.getAllCouncilImages())
.message("소개이미지를 성공적으로 조회했습니다.")
.build();
return ResponseEntity.ok(apiResult);
}

@Operation(summary = "소개이미지 등록")
@PostMapping("/images")
public ResponseEntity<?> createCouncilImage(
@RequestPart("description") String description,
@RequestPart(value = "image") MultipartFile image,
@AuthenticationPrincipal UserPrincipal userPrincipal) {
councilService.createCouncilImage(description, image, userPrincipal);
return ResponseEntity.ok(
ApiResult.builder()
.check(true)
.message("소개이미지가 등록되었습니다.")
.build()
);
}
@Operation(summary = "소개이미지 수정")
@PutMapping("/images/{councilImageId}")
public ResponseEntity<?> updateCouncilImage(
@PathVariable Long councilImageId,
@RequestPart("description") String description,
@RequestPart(value = "image") MultipartFile image,
@AuthenticationPrincipal UserPrincipal userPrincipal) {
councilService.updateCouncilImage(councilImageId, description, image, userPrincipal);
return ResponseEntity.ok(
ApiResult.builder()
.check(true)
.message("소개이미지가 수정되었습니다.")
.build()
);
}

@Operation(summary = "소개이미지 삭제")
@DeleteMapping("/images/{councilImageId}")
public ResponseEntity<?> deleteCouncilImage(@PathVariable Long councilImageId,
@AuthenticationPrincipal UserPrincipal userPrincipal) {
councilService.deleteCouncilImage(councilImageId, userPrincipal);
return ResponseEntity.ok(
ApiResult.builder()
.check(true)
.message("소개이미지가 삭제되었습니다.")
.build()
);
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package depth.mju.council.domain.user.dto.res;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@Builder
@AllArgsConstructor
@RequiredArgsConstructor
public class CouncilImageRes {

@Schema(type = "Long", example = "1", description = "소개이미지 ID")
public Long councilImageId;

@Schema(type = "String", example = "어떤 이미지에 대한 설명입니다.", description = "소개 이미지 설명.")
public String description;

@Schema(type = "String", example = "https://council-s3-bucket.s3.amazonaws.com/image/79fdc2c6-02e42b-ffb2fde8b189.png", description = "이미지/파일의 주소")
public String imgUrl;

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,18 @@

import depth.mju.council.domain.common.BaseEntity;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@Entity
@Builder
@AllArgsConstructor
@RequiredArgsConstructor
@Table(name = "user_image")
public class UserImage extends BaseEntity {
public class CouncilImage extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
Expand All @@ -20,4 +26,9 @@ public class UserImage extends BaseEntity {
@ManyToOne
@JoinColumn(name = "user_id", nullable = false)
private UserEntity userEntity;

public void updateDescriptionAndImgUrl(String description, String newImageUrl) {
this.description = description;
this.imgUrl = newImageUrl;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package depth.mju.council.domain.user.repository;

import depth.mju.council.domain.user.entity.CouncilImage;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface CouncilImageRepository extends JpaRepository<CouncilImage, Long> {
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
package depth.mju.council.domain.user.service;

import depth.mju.council.domain.committe.dto.req.CreateCommitteeReq;
import depth.mju.council.domain.committe.entity.Committee;
import depth.mju.council.domain.user.dto.req.UpdateCouncilReq;
import depth.mju.council.domain.user.dto.res.CouncilImageRes;
import depth.mju.council.domain.user.dto.res.CouncilRes;
import depth.mju.council.domain.user.entity.CouncilImage;
import depth.mju.council.domain.user.entity.UserEntity;
import depth.mju.council.domain.user.repository.CouncilImageRepository;
import depth.mju.council.domain.user.repository.UserRepository;
import depth.mju.council.global.config.UserPrincipal;
import depth.mju.council.global.error.DefaultException;
Expand All @@ -15,13 +16,17 @@
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.stream.Collectors;

@Service
@RequiredArgsConstructor
@Transactional
public class CouncilService {

private final UserRepository userRepository;
private final S3Service s3Service;
private final CouncilImageRepository councilImageRepository;

@Transactional(readOnly = true)
public CouncilRes getCouncil() {
Expand Down Expand Up @@ -55,4 +60,70 @@ public void updateCouncil(UpdateCouncilReq request, MultipartFile image,

userRepository.save(user);
}

@Transactional(readOnly = true)
public List<CouncilImageRes> getAllCouncilImages() {
List<CouncilImage> councilImages = councilImageRepository.findAll();

return councilImages.stream()
.map(councilImage -> CouncilImageRes.builder()
.councilImageId(councilImage.getId())
.description(councilImage.getDescription())
.imgUrl(councilImage.getImgUrl())
.build())
.collect(Collectors.toList());
}

@Transactional
public void createCouncilImage(String description, MultipartFile image, UserPrincipal userPrincipal) {
UserEntity user = userRepository.findById(userPrincipal.getId())
.orElseThrow(() -> new DefaultException(ErrorCode.USER_NOT_FOUND));

String imgUrl = s3Service.uploadImage(image);
CouncilImage councilImage = CouncilImage.builder()
.description(description)
.imgUrl(imgUrl)
.userEntity(user)
.build();
councilImageRepository.save(councilImage);
}

@Transactional
public void updateCouncilImage(Long councilImageId, String description, MultipartFile image,
UserPrincipal userPrincipal) {
CouncilImage councilImage = councilImageRepository.findById(councilImageId)
.orElseThrow(() -> new DefaultException(ErrorCode.CONTENTS_NOT_FOUND, "소개이미지를 찾을 수 없습니다."));
userRepository.findById(userPrincipal.getId())
.orElseThrow(() -> new DefaultException(ErrorCode.USER_NOT_FOUND));

// 기존 이미지 삭제
String oldImageUrl = councilImage.getImgUrl();
if (oldImageUrl != null) {
String oldImageName = s3Service.extractImageNameFromUrl(oldImageUrl);
s3Service.deleteImage(oldImageName);
}
// 새 이미지 업로드
String newImageUrl = s3Service.uploadImage(image);
councilImage.updateDescriptionAndImgUrl(description, newImageUrl);

councilImageRepository.save(councilImage);
}

@Transactional
public void deleteCouncilImage(Long councilImageId, UserPrincipal userPrincipal) {
CouncilImage councilImage = councilImageRepository.findById(councilImageId)
.orElseThrow(() -> new DefaultException(ErrorCode.CONTENTS_NOT_FOUND, "소개이미지를 찾을 수 없습니다."));
userRepository.findById(userPrincipal.getId())
.orElseThrow(() -> new DefaultException(ErrorCode.USER_NOT_FOUND));

// 이미지 삭제
String imageUrl = councilImage.getImgUrl();
if (imageUrl != null) {
String imageName = s3Service.extractImageNameFromUrl(imageUrl);
s3Service.deleteImage(imageName);
}

// 소개이미지 삭제
councilImageRepository.delete(councilImage);
}
}

This file was deleted.

0 comments on commit 9e1b4db

Please sign in to comment.