Skip to content

Commit

Permalink
Merge pull request #162 from urinaner/feature/154
Browse files Browse the repository at this point in the history
[BE] User, Reservation, SeminarRoom 엔티티 설계
  • Loading branch information
urinaner authored Nov 23, 2024
2 parents 395ce24 + d05b407 commit d6df703
Show file tree
Hide file tree
Showing 6 changed files with 182 additions and 33 deletions.
Original file line number Diff line number Diff line change
@@ -1,14 +1,7 @@
package org.example.backend.global.config;

import static org.example.backend.professor.exception.ProfessorExceptionType.NOT_FOUND_FILE;

import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.PutObjectRequest;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Objects;
import java.util.Optional;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.example.backend.professor.exception.ProfessorException;
Expand All @@ -17,60 +10,73 @@
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Objects;
import java.util.Optional;

import static org.example.backend.professor.exception.ProfessorExceptionType.NOT_FOUND_FILE;

@Slf4j
@Component
@RequiredArgsConstructor
public class S3Uploader {

private static final String FILE_DELETE_SUCCESS = "파일이 삭제되었습니다.";
private static final String FILE_DELETE_FAILURE = "파일 삭제에 실패했습니다.";
private static final String FILE_CONVERSION_ERROR = "파일 변환 중 에러가 발생했습니다.";

private final AmazonS3Client amazonS3Client;

@Value("${cloud.aws.s3.bucket}")
public String bucket;
private String bucket;

@Transactional
public String upload(MultipartFile multipartFile, String dirName) {
File uploadFile = convert(multipartFile)
File convertedFile = convertToFile(multipartFile)
.orElseThrow(() -> new ProfessorException(NOT_FOUND_FILE));

return upload(uploadFile, dirName);
}
String fileName = generateFileName(dirName, convertedFile.getName());
String uploadUrl = uploadToS3(convertedFile, fileName);

private String upload(File uploadFile, String dirName) {
String fileName = dirName + "/" + uploadFile.getName();
String uploadImageUrl = putS3(uploadFile, fileName);
removeNewFile(uploadFile);
deleteLocalFile(convertedFile);
return uploadUrl;
}

return uploadImageUrl;
private String generateFileName(String dirName, String originalFileName) {
return String.format("%s/%s", dirName, originalFileName);
}

private String putS3(File uploadFile, String fileName) {
log.info("S3Uploader putS3");
amazonS3Client.putObject(new PutObjectRequest(bucket, fileName, uploadFile));
private String uploadToS3(File file, String fileName) {
log.info("S3Uploader: 파일을 S3에 업로드 중 - 파일 이름: {}", fileName);
amazonS3Client.putObject(new PutObjectRequest(bucket, fileName, file));
return amazonS3Client.getUrl(bucket, fileName).toString();
}

private void removeNewFile(File targetFile) {
log.info("S3Uploader removeNewFile");
if (targetFile.delete()) {
log.info("파일이 삭제되었습니다.");
private void deleteLocalFile(File file) {
if (file.delete()) {
log.info(FILE_DELETE_SUCCESS);
} else {
log.info("파일이 삭제되지 못했습니다.");
log.warn(FILE_DELETE_FAILURE);
}
}

private Optional<File> convert(MultipartFile file) {
if (file.isEmpty()) {
private Optional<File> convertToFile(MultipartFile multipartFile) {
if (multipartFile.isEmpty()) {
log.warn("빈 파일입니다.");
return Optional.empty();
}

File convertedFile = new File(Objects.requireNonNull(file.getOriginalFilename()));
try (FileOutputStream fos = new FileOutputStream(convertedFile)) {
fos.write(file.getBytes());
String originalFileName = Objects.requireNonNull(multipartFile.getOriginalFilename());
File file = new File(originalFileName);

try (FileOutputStream fos = new FileOutputStream(file)) {
fos.write(multipartFile.getBytes());
return Optional.of(file);
} catch (IOException e) {
log.error("파일 전환 중 에러 발생", e);
log.error(FILE_CONVERSION_ERROR, e);
return Optional.empty();
}

return Optional.of(convertedFile);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package org.example.backend.reservation.domain;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import java.util.Date;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.example.backend.seminarRoom.domain.SeminarRoom;
import org.example.backend.user.domain.entity.User;

@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Table(name = "reservation")
public class Reservation {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "reservation_id")
private Long id;

@Column(name = "start_date")
private Date startDate;

@Column(name = "end_date")
private Date endDate;

@Column(name = "purpose")
private ReservationPurpose purpose;

@Column(name = "etc")
private String etc;

@Column(name = "status")
private ReservationStatus status;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id", nullable = false)
private User user;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "seminar_room", nullable = false)
private SeminarRoom seminarRoom;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package org.example.backend.reservation.domain;

public enum ReservationPurpose {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package org.example.backend.reservation.domain;

public enum ReservationStatus {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package org.example.backend.seminarRoom.domain;

import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;
import java.util.ArrayList;
import java.util.List;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.example.backend.reservation.domain.Reservation;

@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Table(name = "seminar_room")
public class SeminarRoom {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "seminar_room_id")
private Long id;

@Column(name = "name")
private String name;

@Column(name = "person_capacity")
private Integer personCapacity;

@Column(name = "place")
private String place;

@Column(name = "image")
private String image;

@OneToMany(mappedBy = "seminar_room", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Reservation> reservations = new ArrayList<>();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package org.example.backend.user.domain.entity;

import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;
import java.util.ArrayList;
import java.util.List;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.example.backend.reservation.domain.Reservation;

@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Table(name = "user")
public class User {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_id")
private Long id;

@Column(name = "name")
private String name;

@Column(name = "major")
private String major;

@Column(name = "phone", unique = true)
private String phoneN;

@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Reservation> reservations = new ArrayList<>();
}

0 comments on commit d6df703

Please sign in to comment.