Skip to content
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
2 changes: 2 additions & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -70,13 +70,15 @@ dependencies {
testImplementation("net.ttddyy:datasource-proxy:1.8.1")
testImplementation("org.testcontainers:junit-jupiter:1.19.3")
testRuntimeOnly("org.junit.platform:junit-platform-launcher")
testImplementation ("io.findify:s3mock_2.13:0.2.6")

// Redis
implementation("org.springframework.boot:spring-boot-starter-data-redis")
implementation("com.github.codemonstur:embedded-redis:1.4.3")

// AWS S3
implementation ("org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE")

}

tasks.withType<Test> {
Expand Down
76 changes: 66 additions & 10 deletions src/main/java/com/back/domain/file/controller/FileController.java
Original file line number Diff line number Diff line change
@@ -1,27 +1,83 @@
package com.back.domain.file.controller;

import com.back.domain.file.dto.*;
import com.back.domain.file.entity.EntityType;
import com.back.domain.file.service.FileService;
import com.back.global.common.dto.RsData;
import com.back.global.security.user.CustomUserDetails;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;

@RestController
@RequiredArgsConstructor
@RequestMapping("/file")
@RequestMapping("/api/file")
public class FileController {
private final FileService fileService;

@PostMapping
public ResponseEntity<RsData<String>> uploadFile(MultipartFile multipartFile) {
@PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ResponseEntity<RsData<FileUploadResponseDto>> uploadFile(
@ModelAttribute FileUploadRequestDto req,
@AuthenticationPrincipal CustomUserDetails user
) {
FileUploadResponseDto res = fileService.uploadFile(
req.getMultipartFile(),
req.getEntityType(),
req.getEntityId(),
user.getUserId()
);

return ResponseEntity
.status(HttpStatus.OK)
.body(RsData.success("파일 업로드 성공", res));
}

@GetMapping(value = "/read")
public ResponseEntity<RsData<FileReadResponseDto>> getFile(
@RequestParam("entityType") EntityType entityType,
@RequestParam("entityId") Long entityId
) {
FileReadResponseDto res = fileService.getFile(entityType, entityId);

return ResponseEntity
.status(HttpStatus.OK)
.body(RsData.success("파일 조회 성공", res));
}

@PutMapping(value = "/update", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ResponseEntity<RsData<Void>> updateFile(
@ModelAttribute FileUpdateRequestDto req,
@AuthenticationPrincipal CustomUserDetails user
) {
fileService.updateFile(
req.getMultipartFile(),
req.getEntityType(),
req.getEntityId(),
user.getUserId()
);

return ResponseEntity
.status(HttpStatus.OK)
.body(RsData.success("파일 업데이트 성공"));
}

@DeleteMapping(value = "/delete")
public ResponseEntity<RsData<Void>> deleteFile(
@RequestParam("entityType") EntityType entityType,
@RequestParam("entityId") Long entityId,
@AuthenticationPrincipal CustomUserDetails user
) {
fileService.deleteFile(
entityType,
entityId,
user.getUserId()
);

return ResponseEntity
.status(HttpStatus.OK)
.body(RsData.success("파일 업로드 성공", fileService.uploadFile(multipartFile)));
.body(RsData.success("파일 삭제 성공"));
}
}
12 changes: 12 additions & 0 deletions src/main/java/com/back/domain/file/dto/FileReadResponseDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.back.domain.file.dto;

import lombok.Data;

@Data
public class FileReadResponseDto {
private String imageUrl;

public FileReadResponseDto(String imageUrl) {
this.imageUrl = imageUrl;
}
}
12 changes: 12 additions & 0 deletions src/main/java/com/back/domain/file/dto/FileUpdateRequestDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.back.domain.file.dto;

import com.back.domain.file.entity.EntityType;
import lombok.Data;
import org.springframework.web.multipart.MultipartFile;

@Data
public class FileUpdateRequestDto {
private MultipartFile multipartFile;
private EntityType entityType;
private Long entityId;
}
13 changes: 13 additions & 0 deletions src/main/java/com/back/domain/file/dto/FileUploadRequestDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.back.domain.file.dto;

import com.back.domain.file.entity.EntityType;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import org.springframework.web.multipart.MultipartFile;

@Data
public class FileUploadRequestDto {
private MultipartFile multipartFile;
private EntityType entityType;
private Long entityId;
}
12 changes: 12 additions & 0 deletions src/main/java/com/back/domain/file/dto/FileUploadResponseDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.back.domain.file.dto;

import lombok.Data;

@Data
public class FileUploadResponseDto {
private String imageUrl;

public FileUploadResponseDto(String imageUrl) {
this.imageUrl = imageUrl;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,10 @@ public class AttachmentMapping extends BaseEntity {
private EntityType entityType;

private Long entityId;

public AttachmentMapping(FileAttachment fileAttachment, EntityType entityType, Long entityId) {
this.fileAttachment = fileAttachment;
this.entityType = entityType;
this.entityId = entityId;
}
}
32 changes: 29 additions & 3 deletions src/main/java/com/back/domain/file/entity/FileAttachment.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.springframework.web.multipart.MultipartFile;

import java.util.ArrayList;
import java.util.List;
Expand All @@ -19,10 +20,9 @@ public class FileAttachment extends BaseEntity {

private String filePath;

private int fileSize;
private long fileSize;

@Enumerated(EnumType.STRING)
private MimeType mimeType;
private String contentType;

// 업로드 유저
@ManyToOne(fetch = FetchType.LAZY)
Expand All @@ -31,4 +31,30 @@ public class FileAttachment extends BaseEntity {

@OneToMany(mappedBy = "fileAttachment", cascade = CascadeType.ALL, orphanRemoval = true)
private List<AttachmentMapping> attachmentMappings = new ArrayList<>();

public FileAttachment(
String storedName,
MultipartFile multipartFile,
User user,
EntityType entityType,
Long entityId,
String filePath
) {
this.storedName = storedName;
originalName = multipartFile.getOriginalFilename();
this.filePath = filePath;
fileSize = multipartFile.getSize();
this.contentType = multipartFile.getContentType();
this.user = user;

attachmentMappings.add(new AttachmentMapping(this ,entityType, entityId));
}

public void update(String storedName, MultipartFile multipartFile, String filePath) {
this.storedName = storedName;
originalName = multipartFile.getOriginalFilename();
this.filePath = filePath;
fileSize = multipartFile.getSize();
this.contentType = multipartFile.getContentType();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.back.domain.file.repository;

import com.back.domain.file.entity.AttachmentMapping;
import com.back.domain.file.entity.EntityType;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.Optional;

public interface AttachmentMappingRepository extends JpaRepository<AttachmentMapping, Long> {
Optional<AttachmentMapping> findByEntityTypeAndEntityId(EntityType entityType, Long entityID);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.back.domain.file.repository;

import com.back.domain.file.entity.FileAttachment;
import org.springframework.data.jpa.repository.JpaRepository;

public interface FileAttachmentRepository extends JpaRepository<FileAttachment, Long> {
}
Loading