Skip to content

Commit

Permalink
#26 Refactor: Passport 신원 인증 및 메타 데이터 관리 기능 추가 & 메타데이터 로직 개선 & Wallet…
Browse files Browse the repository at this point in the history
… 인증서별 관리 기능 및 Attribute 수정 [박한솔]
  • Loading branch information
pjhcsols committed Nov 1, 2024
1 parent 6afe894 commit 48f5c7c
Show file tree
Hide file tree
Showing 17 changed files with 434 additions and 106 deletions.
Binary file added .DS_Store
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ cloud.aws.credentials-accessKey=
cloud.aws.credentials-secretKey=
cloud.aws.stack.auto=false

#passport
#passport codef
passport.client-secret=
passport.public-key-str=

Expand Down
16 changes: 11 additions & 5 deletions web3-credential-server/build/resources/main/data.sql
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,17 @@ INSERT INTO users (email, password)
VALUES
('[email protected]', '$2a$10$ENYqGvZ3p6LvtsBnRWINSOJHKlMt1Ykgb3.jCnoKkrhMihviXhkDu'),
('[email protected]', '$2a$10$EXAMPLEHASHFORUSERPASSWORD'),
('3751271433', '$2a$10$skVt4kLn.95UGnrasmxQku5AGhhg6fESNtg/Ndw3iBQin.SqHrIdK');
('3751271433', '$2a$10$ENYqGvZ3p6LvtsBnRWINSOJHKlMt1Ykgb3.jCnoKkrhMihviXhkDu');

INSERT INTO wallets (user_id, private_key, public_key)
VALUES
(1, 'privateKeyForUser1', 'publicKeyForUser1'),
(2, 'privateKeyForUser2', 'publicKeyForUser2'),
(3, 'privateKeyForUser3', 'publicKeyForUser3');

INSERT INTO wallets (user_id, pdfUrl,privateKey, publicKey)
INSERT INTO wallet_pdf_urls (wallet_id, certificate_type, pdf_url)
VALUES
(1,'https://basilium-product-bucket.s3.ap-northeast-2.amazonaws.com/1_certifications.pdf','privateKeyForUser1', 'publicKeyForUser1'),
(2,null,'privateKeyForUser2', 'publicKeyForUser2'),
(3,null,'privateKeyForUser2', 'publicKeyForUser2');
(1, '재학증_1', 'https://basilium-product-bucket.s3.ap-northeast-2.amazonaws.com/1_student_certifications.pdf'),
(1, '여권_1', 'https://s3.ap-northeast-2.amazonaws.com/basilium-product-bucket/1_passport_certification.pdf'),
(2, '재학증_2', null);

13 changes: 10 additions & 3 deletions web3-credential-server/build/resources/main/schema.sql
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
DROP TABLE IF EXISTS wallet_pdf_urls;
DROP TABLE IF EXISTS wallets;
DROP TABLE IF EXISTS users;

Expand All @@ -10,9 +11,15 @@ CREATE TABLE users (
CREATE TABLE wallets (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
user_id BIGINT NOT NULL,
pdfUrl VARCHAR(255),
privateKey VARCHAR(255) NOT NULL,
publicKey VARCHAR(255) NOT NULL,
private_key VARCHAR(255) NOT NULL,
public_key VARCHAR(255) NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(id)
);

CREATE TABLE wallet_pdf_urls (
wallet_id BIGINT,
certificate_type VARCHAR(255),
pdf_url VARCHAR(255),
PRIMARY KEY (wallet_id, certificate_type),
FOREIGN KEY (wallet_id) REFERENCES wallets(id)
);
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,14 @@
import org.springframework.web.multipart.MultipartFile;
import web3.domain.wallet.Wallet;
import web3.exception.S3.S3UploadException;
import web3.s3Storage.dto.DeleteCertRequest;
import web3.service.Identity.IdentityService;
import web3.service.dto.Identity.PassportCertificationDto;
import web3.service.dto.Identity.StudentCertificationDto;
import web3.service.wallet.WalletService;

import java.io.IOException;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.*;

@RestController
@RequestMapping("/api/certifications")
Expand All @@ -46,28 +43,78 @@ public ResponseEntity<String> registerCertification(
@RequestParam("univName") String univName,
@RequestParam("univCheck") Boolean univCheck) {

LocalDateTime certifiedDate = LocalDateTime.now(); // 현재 시간
StudentCertificationDto certificationDto = new StudentCertificationDto(email, univName, univCheck, certifiedDate);
StudentCertificationDto certificationDto = new StudentCertificationDto(email, univName, univCheck, LocalDateTime.now());
identityService.registerStudentCertification(walletId, certificationDto, file);

return ResponseEntity.ok("재학증이 성공적으로 등록되었습니다.");
}

@Operation(summary = "pdf 대체하기",description = "원하는 페이지를 원하는 pdf로 대체합니다.")
@PostMapping("/register-passport-certification")
public ResponseEntity<String> registerPassportCertification(
@RequestParam("file") MultipartFile file, //추가 등록
@RequestParam("walletId") Long walletId,
@RequestParam("certFile") MultipartFile certFile,
@RequestParam("keyFile") MultipartFile keyFile,
@RequestParam("certPassword") String certPassword, //직접입력
@RequestParam("userName") String userName,
@RequestParam("identity") String identity,
@RequestParam("passportNo") String passportNo,
@RequestParam("issueDate") String issueDate,
@RequestParam("expirationDate") String expirationDate,
@RequestParam("birthDate") String birthDate) {

// PassportCertificationDto 생성, 파일을 Base64로 인코딩
PassportCertificationDto passportCertificationDto = new PassportCertificationDto(
PassportCertificationDto.encodeFileToBase64(certFile),
PassportCertificationDto.encodeFileToBase64(keyFile),
certPassword,
userName,
identity,
passportNo,
issueDate,
expirationDate,
birthDate,
LocalDateTime.now() // 현재 시간을 직접 호출
);
// 여권 인증 등록
identityService.registerPassportCertification(walletId, passportCertificationDto, file);

return ResponseEntity.ok("여권 인증이 성공적으로 등록되었습니다.");
}

@Operation(summary = "PDF 대체하기", description = "지정된 페이지를 새 PDF 파일로 대체합니다.")
@PostMapping("/replace-pdf")
public ResponseEntity<String> replacePdf(
@Parameter(description = "pdf 파일",required = true)
@Parameter(description = "PDF 파일", required = true)
@RequestParam("file") MultipartFile file,
@Parameter(description = "페이지 번호",required = true)
@Parameter(description = "페이지 번호", required = true)
@RequestParam("page") int page,
@Parameter(description = "사용자 지갑ID",required = true)
@RequestParam("walletId") Long walletId) throws IOException {
Wallet wallet = walletService.getWalletById(walletId).orElseThrow(()-> new EntityNotFoundException("Wallet does not exist"));
String pdfUrl = identityService.replacePdfPage(wallet, page, file);
@Parameter(description = "사용자 지갑 ID", required = true)
@RequestParam("walletId") Long walletId,
@Parameter(description = "인증서 이름", required = true)
@RequestParam("certificateName") String certificateName) throws IOException {

Wallet wallet = walletService.getWalletById(walletId)
.orElseThrow(() -> new EntityNotFoundException("Wallet does not exist"));
String certificateType = certificateName + "_" + walletId;
// 인증서 타입에 따라 페이지를 교체
String pdfUrl = identityService.replacePdfPage(wallet, certificateType, page, file);

return ResponseEntity.ok(pdfUrl);
}

@Operation(summary = "사용자의 등록된 인증서 key 목록 전체 얻기", description = "사용자의 등록된 인증서 이름 목록을 전체를 가져옵니다.")
//주요로직
@Operation(summary = "특정 wallet의 인증서 이름 목록 얻기", description = "주어진 walletId에 해당하는 지갑의 인증서 이름 목록을 반환합니다.")
@GetMapping("/cert-names")
public ResponseEntity<Set<String>> getCertNamesByWalletId(
@Parameter(description = "지갑 ID", required = true)
@RequestParam Long walletId) {
Set<String> certNames = identityService.getCertNamesByWalletId(walletId);

return ResponseEntity.ok().body(certNames);
}

@Operation(summary = "특정 지갑의 pdf의 특정 인증서 key 목록 얻기", description = "사용자의 등록된 인증서 이름 목록을 전체를 가져옵니다.")
@GetMapping("/get-cert-names")
public ResponseEntity<Set<String>> getCertNames(
@Parameter(description = "pdf 파일 경로", required = true)
Expand All @@ -79,7 +126,21 @@ public ResponseEntity<Set<String>> getCertNames(
return ResponseEntity.ok().body(certNames);
}

@Operation(summary = "인증서 리스트 얻기",description = "개인의 인증서{(key : value)..(key : value)}들을 모두 가져옵니다.")
//"특정 wallet의 인증서 리스트 얻기"만들기 //walletId로 순회
//주요로직
@Operation(summary = "특정 wallet의 인증서 리스트 얻기", description = "주어진 walletId에 대한 인증서 리스트를 반환합니다.")
@GetMapping("/wallet-list/certs")
public ResponseEntity<HashMap<String, String>> getCertListByWalletId(
@Parameter(description = "사용자 지갑 ID", required = true)
@RequestParam Long walletId) {
HashMap<String, String> certList = identityService.getCertListByWalletId(walletId);
HashMap<String, String> decodedMetadata = identityService.decodeMetadata(certList);

return ResponseEntity.ok().body(decodedMetadata);
}


@Operation(summary = "특정 인증서 리스트 얻기",description = "개인의 인증서{(key : value)..(key : value)}들을 모두 가져옵니다.")
@GetMapping("/certs")
public ResponseEntity<HashMap<String,String>> getCertList(
@Parameter(description = "pdf 파일 경로",required = true)
Expand All @@ -91,7 +152,7 @@ public ResponseEntity<HashMap<String,String>> getCertList(

}

@Operation(summary = "사용자의 해당되는 인증서의 특정 value 얻기",description = "사용자의 인증서 목록중 원하는 인증서의 내용들을 가져옵니다.")
@Operation(summary = "특정 인증서의 value 얻기",description = "사용자의 인증서 목록중 원하는 인증서의 내용들을 가져옵니다.")
@GetMapping("/get-content")
public ResponseEntity<List<Map.Entry<String, String>>> getPdfKey(
@Parameter(description = "pdf 파일 경로",required = true)
Expand All @@ -105,7 +166,7 @@ public ResponseEntity<List<Map.Entry<String, String>>> getPdfKey(
return ResponseEntity.ok().body(contentsForCertName);
}

@Operation(summary = "인증서 리스트 얻기 - pdf 형식",description = "개인의 인증서들을 pdf의 형식으로 모두 가져옵니다.")
@Operation(summary = "특정 인증서 리스트 얻기 - pdf 형식",description = "개인의 인증서들을 pdf의 형식으로 모두 가져옵니다.")
@GetMapping("/get-pdf")
public ResponseEntity<byte[]> getPdf(
@Parameter(description = "pdf 파일 경로",required = true)
Expand All @@ -119,30 +180,48 @@ public ResponseEntity<byte[]> getPdf(
}
}

@Operation(summary = "특정 인증서 삭제",description = "지갑에서 특정 인증서를 삭제합니다. 즉,S3 스토리지에 pdf 파일에서 특정 페이지를 삭제합니다.")
@PatchMapping ("/delete-one")
@Operation(summary = "특정 인증서의 페이지 삭제", description = "지갑에서 특정 인증서를 삭제합니다. 즉, S3 스토리지에 pdf 파일에서 특정 페이지를 삭제합니다.")
@PatchMapping("/delete-one")
public ResponseEntity<Void> deleteCertForPage(
@Parameter(description = "walletId와 삭제할 page가 담긴 Dto",required = true)
@RequestBody DeleteCertRequest request
@Parameter(description = "walletId", required = true)
@RequestParam("walletId") Long walletId,
@Parameter(description = "인증서 이름", required = true)
@RequestParam("certificateName") String certificateName,
@Parameter(description = "삭제할 페이지 번호", required = true)
@RequestParam("page") int page // page 변수를 이곳에 선언
) throws IOException, S3UploadException {
Long walletId = request.getWalletId();
int page = request.getPage();
Wallet wallet = walletService.getWalletById(walletId).orElseThrow(()-> new EntityNotFoundException("Wallet does not exist"));
identityService.deletePdfForPage(wallet,page);
Wallet wallet = walletService.getWalletById(walletId)
.orElseThrow(() -> new EntityNotFoundException("Wallet does not exist"));
String certificateType = certificateName + "_" + walletId;
identityService.deletePdfForPage(wallet, certificateType, page);

return ResponseEntity.noContent().build();
}

@Operation(summary = "모든 인증서 삭제(지갑 삭제)",description = "모든 인증서를 삭제합니다. 즉,s3 스토리지에 pdf 파일을 모두 삭제합니다.")

@Operation(summary = "사용자 특정 인증서 삭제(지갑 삭제)",description = "모든 인증서를 삭제합니다. 즉,s3 스토리지에 사용자 pdf 파일을 모두 삭제합니다.")
@DeleteMapping("/delete-pdf")
public ResponseEntity<Void> deleteWallet(
@Parameter(description = "지울 pdf 파일 경로 관련 Dto",required = true)
@Parameter(description = "지울 pdf 파일 경로",required = true)
@RequestParam("pdfUrl") String pdfUrl,
@RequestParam("walletId") Long walletId) {
identityService.deletePdf(pdfUrl, walletId);
@RequestParam("walletId") Long walletId,
@Parameter(description = "인증서 이름", required = true)
@RequestParam("certificateName") String certificateName) {
String certificateType = certificateName + "_" + walletId;
identityService.deletePdf(pdfUrl, walletId, certificateType);
return ResponseEntity.noContent().build();
}

@Operation(summary = "사용자 지갑의 모든 인증서 삭제", description = "지갑 ID에 해당하는 모든 인증서를 S3에서 삭제합니다.")
@DeleteMapping("/delete-wallet-certificates")
public ResponseEntity<Void> deleteWalletCertificates(
@Parameter(description = "지갑 ID", required = true) @RequestParam("walletId") Long walletId) {
identityService.deleteWalletCertificates(walletId);
return ResponseEntity.noContent().build();
}

@Operation(summary = "PDF 페이지 수 얻기", description = "특정 PDF의 총 페이지 수 반환")

@Operation(summary = "특정 PDF 페이지 수 얻기", description = "특정 PDF의 총 페이지 수 반환")
@GetMapping("/get-pdf-page-count")
public ResponseEntity<Integer> getPdfPageCount(
@Parameter(description = "PDF file URL", required = true)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public PassportController(PassportService passportService) {
this.passportService = passportService;
}

@Operation(summary = "여권 유효성 검사", description = "여권의 유효성을 검사합니다.")
@Operation(summary = "여권 유효성 검사", description = "여권의 유효성을 검사합니다.1")
@PostMapping("/check-validity")
public Mono<ResponseEntity<String>> checkPassportValidity(
@Parameter(description = "여권 요청 정보", required = true)
Expand All @@ -46,6 +46,27 @@ public Mono<ResponseEntity<String>> checkPassportValidity(
.onErrorReturn(ResponseEntity.badRequest().body("여권 유효성 검사에 실패했습니다."));
}

@Operation(summary = "여권 유효성 검사 인코딩 값", description = "여권의 유효성을 검사합니다.2")
@PostMapping("/check-validity_2")
public Mono<ResponseEntity<String>> checkPassportValidity(
@Parameter(description = "여권 요청 정보", required = true)
@RequestParam("certFile") String certFile,
@RequestParam("keyFile") String keyFile,
@RequestParam("certPassword") String certPassword,
@RequestParam("userName") String userName,
@RequestParam("identity") String identity,
@RequestParam("passportNo") String passportNo,
@RequestParam("issueDate") String issueDate,
@RequestParam("expirationDate") String expirationDate,
@RequestParam("birthDate") String birthDate) {

PassportRequestDto passportRequestDto = new PassportRequestDto(certFile, keyFile, certPassword, userName, identity, passportNo, issueDate, expirationDate, birthDate);

return passportService.checkPassportValidity(passportRequestDto)
.map(response -> ResponseEntity.ok("여권 유효성 검사 성공: " + response))
.onErrorReturn(ResponseEntity.badRequest().body("여권 유효성 검사에 실패했습니다."));
}

private String encodeFileToBase64(MultipartFile file) {
try {
byte[] fileContent = file.getBytes();
Expand Down
Loading

0 comments on commit 48f5c7c

Please sign in to comment.