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
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,21 @@ public static DocumentType from(String type) {
throw new IllegalArgumentException("정의되지 않은 문서 타입: " + type);
}
}

public String getKoreanFolderName() {
switch (this) {
case RESUME:
return "이력서";
case CERTIFICATE:
return "재직증명서";
case CONSENT:
return "위임장";
case SELF_INTRO:
return "자기소개서";
case REPORT:
return "업무보고서";
default:
return "기타";
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,10 @@

import java.io.IOException;
import java.io.InputStream;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;

@Service
Expand All @@ -42,7 +45,6 @@ public class DocumentServiceImpl implements DocumentService {
private final PdfService pdfService;
private final FormRepository formRepository;
private final FlaskService flaskService;
private final FieldLabelMapper fieldLabelMapper;

/**
* 사용자의 문서 하나 상세 조회
Expand Down Expand Up @@ -109,6 +111,7 @@ public GetSummaryRes getSummary(UserPrincipal userPrincipal, Long id) {
@Override
@Transactional
public WriteDocsRes writeDocument(UserPrincipal userPrincipal, Long formId, List<WriteDocsReq> writeDocsReqList) throws IOException {
System.out.println("리스트 : " + writeDocsReqList);
// 사용자가 존재하지 않을 경우 -> UserNotFoundException
User user = userRepository.getUserById(userPrincipal.getId());

Expand All @@ -124,15 +127,16 @@ public WriteDocsRes writeDocument(UserPrincipal userPrincipal, Long formId, List
// pdf url
byte[] imgToPdf = pdfService.convertImageToPdf(s3Service.downloadFile(imgUrl));

DocumentType documentType = DocumentType.valueOf(form.getFormType().name());

// S3에 pdf 업로드
String fileName = s3Service.generatePdfFileName();
int dotIndex = fileName.lastIndexOf('.');
String nameOnly = (dotIndex != -1) ? fileName.substring(0, dotIndex) : fileName;
String pdfUrl = s3Service.uploadPdfBytes(fileName, imgToPdf);

DocumentType documentType = DocumentType.valueOf(form.getFormType().name());
String displayName = "["+ LocalDate.now()+"] " + documentType.getKoreanFolderName();

Document document = Document.toEntity(documentType, imgUrl, pdfUrl, form, nameOnly, user);
Document document = Document.toEntity(documentType, imgUrl, pdfUrl, form, displayName, user);
documentRepository.save(document);

return WriteDocsRes.from(document);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,6 @@
@RequestMapping("/api/document")
public class DocumentController {
private final DocumentService documentService;
private final FlaskService flaskService;
private final PdfService pdfService;
private final S3Service s3Service;

// 문서 업로드
@PostMapping
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/Sprout_Squad/EyeOn/domain/user/entity/User.java
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,9 @@ public class User extends BaseEntity {
@Column(name="is_blind", nullable = false)
private TF isBlind;

public void modifyUserInfo(ModifyUserInfoReq modifyUserInfoReq) {
public void modifyUserInfo(ModifyUserInfoReq modifyUserInfoReq, String profileImageUrl) {
this.address = modifyUserInfoReq.address();
this.profileImageUrl = modifyUserInfoReq.profileImageUrl();
this.profileImageUrl = profileImageUrl;
}

public static User toEntity(SignUpReq signUpReq, Gender gender) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;

public interface UserService {
SignUpRes signUp(SignUpReq signUpReq);
void modifyUserInfo(ModifyUserInfoReq modifyUserInfoReq, @AuthenticationPrincipal UserPrincipal userPrincipal);
ModifyUserInfoRes modifyUserInfo(ModifyUserInfoReq modifyUserInfoReq, MultipartFile file, @AuthenticationPrincipal UserPrincipal userPrincipal) throws IOException;
GetUserInfoRes getUserInfo(@AuthenticationPrincipal UserPrincipal userPrincipal);
GetResidentInfoRes getResidentInfo(MultipartFile multipartFile);
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,13 @@
import Sprout_Squad.EyeOn.global.auth.jwt.JwtTokenProvider;
import Sprout_Squad.EyeOn.global.converter.OcrResultConverter;
import Sprout_Squad.EyeOn.global.external.service.NaverOcrService;
import Sprout_Squad.EyeOn.global.external.service.S3Service;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.Optional;

@Service
Expand All @@ -22,6 +24,7 @@ public class UserServiceImpl implements UserService {
private final UserRepository userRepository;
private final JwtTokenProvider jwtTokenProvider;
private final NaverOcrService naverOcrService;
private final S3Service s3Service;

/**
* 회원가입
Expand Down Expand Up @@ -58,10 +61,15 @@ public SignUpRes signUp(SignUpReq signUpReq) {
*/
@Override
@Transactional
public void modifyUserInfo(ModifyUserInfoReq modifyUserInfoReq, UserPrincipal userPrincipal) {
public ModifyUserInfoRes modifyUserInfo(ModifyUserInfoReq modifyUserInfoReq, MultipartFile file, UserPrincipal userPrincipal) throws IOException {
// 사용자가 존재하지 않을 경우 -> UserNotFoundException
User user = userRepository.getUserById(userPrincipal.getId());
user.modifyUserInfo(modifyUserInfoReq);

String fileName = s3Service.generateFileName(file);
String fileUrl = s3Service.uploadFile(fileName, file);

user.modifyUserInfo(modifyUserInfoReq, fileUrl);
return ModifyUserInfoRes.from(user);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/user")
Expand All @@ -24,10 +26,12 @@ public ResponseEntity<SuccessResponse<SignUpRes>> signUp(@RequestBody @Valid Sig
}

@PutMapping("/modify")
public ResponseEntity<SuccessResponse<Void>> modifyUserInfo(
@AuthenticationPrincipal UserPrincipal userPrincipal, @RequestBody @Valid ModifyUserInfoReq modifyUserInfoReq) {
userService.modifyUserInfo(modifyUserInfoReq, userPrincipal);
return ResponseEntity.ok(SuccessResponse.empty());
public ResponseEntity<SuccessResponse<ModifyUserInfoRes>> modifyUserInfo(
@AuthenticationPrincipal UserPrincipal userPrincipal,
@RequestPart("file") MultipartFile file,
@RequestPart("data") @Valid ModifyUserInfoReq modifyUserInfoReq) throws IOException {
ModifyUserInfoRes modifyUserInfoRes = userService.modifyUserInfo(modifyUserInfoReq, file, userPrincipal);
return ResponseEntity.ok(SuccessResponse.from(modifyUserInfoRes));
}

@GetMapping("/info")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@

public record ModifyUserInfoReq(
@NotBlank(message = "주소를 입력해주세요.")
String address,

String profileImageUrl
String address
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package Sprout_Squad.EyeOn.domain.user.web.dto;

import Sprout_Squad.EyeOn.domain.user.entity.User;
import com.nimbusds.openid.connect.sdk.claims.UserInfo;

public record ModifyUserInfoRes(
String address,
String imgUrl
) {
public static ModifyUserInfoRes from(User user) {
return new ModifyUserInfoRes(user.getAddress(), user.getProfileImageUrl());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.URL;
import java.time.LocalDate;
import java.util.List;
import java.util.UUID;
Expand Down Expand Up @@ -161,21 +162,51 @@ public String fillImageFromS3(String s3ImageUrl, List<WriteDocsReq> fields) {
float x1 = bbox.get(2).floatValue() * imgWidth / 1000; // x1
float y1 = bbox.get(3).floatValue() * imgHeight / 1000; // y1

// 텍스트를 박스 안에 적절히 배치 (좌표 보정)
float boxWidth = x1 - x0;
float boxHeight = y1 - y0;
x0 += 15f;
y0 += boxHeight * 0.75f; // 텍스트를 박스의 적절한 위치로 이동 (상단보다는 조금 아래쪽)


g.setColor(Color.BLACK);
//g.drawRect((int) x0, (int) y0, (int) (x1 - x0), (int) boxHeight); // 디버깅용 사각형 그리기

// 폰트 크기를 bbox 높이에 맞춰 동적으로 설정 (선택 사항)
Font dynamicFont = font.deriveFont( 20f); // 박스 높이에 맞춰 폰트 크기 조정
g.setFont(dynamicFont);

// 텍스트 삽입
g.drawString(field.value(), x0, y0);
if("B-PERSONAL-PHOTO".equals(field.field())){
// 이미지 URL 또는 경로로 BufferedImage 로드
BufferedImage personalPhoto = null;
try {
// URL에서 불러오기
URL url = new URL(field.value());
personalPhoto = ImageIO.read(url);
} catch (Exception e) {
e.printStackTrace();
continue; // 이미지 못 불러오면 건너뜀
}
// 이미지 크기 (원본)
int imgW = personalPhoto.getWidth();
int imgH = personalPhoto.getHeight();

// 박스 크기보다 작게 줄일 비율
double scale = 0.95;

int drawW = (int)(boxWidth * scale);
int drawH = (int)(boxHeight * scale);

// 중앙 위치 계산
int drawX = (int) (x0 + ((int)boxWidth - drawW) / 2.0);
int drawY = (int) (y0 + ((int)boxHeight - drawH) / 2.0);

// 이미지 그리기
g.drawImage(personalPhoto, drawX, drawY, drawW, drawH, null);
g.setColor(Color.BLUE); // 테두리 색 지정
g.drawRect(drawX, drawY, drawW, drawH);
} else { // 텍스트를 박스 안에 적절히 배치 (좌표 보정)
x0 += 15f;
y0 += boxHeight * 0.75f; // 텍스트를 박스의 적절한 위치로 이동 (상단보다는 조금 아래쪽)

g.setColor(Color.BLACK);

// 폰트 크기를 bbox 높이에 맞춰 동적으로 설정
Font dynamicFont = font.deriveFont(20f); // 박스 높이에 맞춰 폰트 크기 조정
g.setFont(dynamicFont);

// 텍스트 삽입
g.drawString(field.value(), x0, y0);
}
}

g.dispose();
Expand Down
Loading