diff --git a/src/main/java/kwthon_1team/kwthon/config/SecurityConfig.java b/src/main/java/kwthon_1team/kwthon/config/SecurityConfig.java index 1d1a069..e32c8ff 100644 --- a/src/main/java/kwthon_1team/kwthon/config/SecurityConfig.java +++ b/src/main/java/kwthon_1team/kwthon/config/SecurityConfig.java @@ -15,7 +15,7 @@ @EnableWebSecurity public class SecurityConfig { private final String[] possibleAccess = {"/api/auth/signUp", "/api/auth/emailVerification", "/api/auth/login", - "/api/error", "/api", "/error", "/auth/**"}; + "/api/error", "/api", "/error", "/auth/**", "/api/kwTree/**", "/kwTree/**", "/api/tree/**", "/tree/**"}; @Bean public PasswordEncoder passwordEncoder() { diff --git a/src/main/java/kwthon_1team/kwthon/controller/MailController.java b/src/main/java/kwthon_1team/kwthon/controller/MailController.java new file mode 100644 index 0000000..5f07210 --- /dev/null +++ b/src/main/java/kwthon_1team/kwthon/controller/MailController.java @@ -0,0 +1,22 @@ +package kwthon_1team.kwthon.controller; + +import kwthon_1team.kwthon.domian.dto.response.MailBoxResponseDto; +import kwthon_1team.kwthon.service.MailService; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class MailController { + + private final MailService mailService; + + public MailController(MailService mailService) { + this.mailService = mailService; + } + + @GetMapping("/kwTree/mailBoxList") + public MailBoxResponseDto getMailBoxList() { + return mailService.getMailBoxList(); // studentId를 전달하지 않음 + } +} diff --git a/src/main/java/kwthon_1team/kwthon/controller/TreeController.java b/src/main/java/kwthon_1team/kwthon/controller/TreeController.java new file mode 100644 index 0000000..d0b274f --- /dev/null +++ b/src/main/java/kwthon_1team/kwthon/controller/TreeController.java @@ -0,0 +1,31 @@ +package kwthon_1team.kwthon.controller; + +import kwthon_1team.kwthon.common.BaseErrorResponse; +import kwthon_1team.kwthon.domian.dto.response.TreeResponseDto; +import kwthon_1team.kwthon.exception.BaseException; +import kwthon_1team.kwthon.service.TreeService; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/tree") +public class TreeController { + + private final TreeService treeService; + + public TreeController(TreeService treeService) { + this.treeService = treeService; + } + + @GetMapping("/{studentId}") + public ResponseEntity getTreeInfo(@PathVariable Long studentId) { + try { + TreeResponseDto responseDto = treeService.getTreeInfo(studentId); + return new ResponseEntity<>(responseDto, HttpStatus.valueOf(responseDto.getStatus())); + } catch (Exception e) { + TreeResponseDto errorResponse = new TreeResponseDto(500, "서버 오류가 발생했습니다. 잠시 후 다시 시도해 주세요.", null); + return new ResponseEntity<>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR); + } + } +} \ No newline at end of file diff --git a/src/main/java/kwthon_1team/kwthon/domian/dto/response/MailBoxResponseDto.java b/src/main/java/kwthon_1team/kwthon/domian/dto/response/MailBoxResponseDto.java new file mode 100644 index 0000000..e177431 --- /dev/null +++ b/src/main/java/kwthon_1team/kwthon/domian/dto/response/MailBoxResponseDto.java @@ -0,0 +1,20 @@ +package kwthon_1team.kwthon.domian.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.List; + +@Getter +@AllArgsConstructor +public class MailBoxResponseDto { + private int status; + private String message; + private MailBoxDataDto data; + + @Getter + @AllArgsConstructor + public static class MailBoxDataDto { + private List mails; + } +} diff --git a/src/main/java/kwthon_1team/kwthon/domian/dto/response/MailDto.java b/src/main/java/kwthon_1team/kwthon/domian/dto/response/MailDto.java new file mode 100644 index 0000000..b44563d --- /dev/null +++ b/src/main/java/kwthon_1team/kwthon/domian/dto/response/MailDto.java @@ -0,0 +1,15 @@ +package kwthon_1team.kwthon.domian.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class MailDto { + private String mailDate; + private String mailName; + private Long senderId; + private String name; // 송신자 이름 + private Long photoId; + private String photoUrl; +} \ No newline at end of file diff --git a/src/main/java/kwthon_1team/kwthon/domian/dto/response/TreeDataDto.java b/src/main/java/kwthon_1team/kwthon/domian/dto/response/TreeDataDto.java new file mode 100644 index 0000000..0ef3db5 --- /dev/null +++ b/src/main/java/kwthon_1team/kwthon/domian/dto/response/TreeDataDto.java @@ -0,0 +1,13 @@ +package kwthon_1team.kwthon.domian.dto.response; + +import lombok.*; + +@Data +public class TreeDataDto { + private int treeLevel; + + public TreeDataDto(int treeLevel) { + this.treeLevel = treeLevel; + } + +} diff --git a/src/main/java/kwthon_1team/kwthon/domian/dto/response/TreeResponseDto.java b/src/main/java/kwthon_1team/kwthon/domian/dto/response/TreeResponseDto.java new file mode 100644 index 0000000..6a767d6 --- /dev/null +++ b/src/main/java/kwthon_1team/kwthon/domian/dto/response/TreeResponseDto.java @@ -0,0 +1,17 @@ +package kwthon_1team.kwthon.domian.dto.response; + +import lombok.*; + +@Data +public class TreeResponseDto { + private int status; + private String message; + private TreeDataDto data; + + public TreeResponseDto(int status, String message, TreeDataDto data) { + this.status = status; + this.message = message; + this.data = data; + } + +} \ No newline at end of file diff --git a/src/main/java/kwthon_1team/kwthon/domian/entity/Mail.java b/src/main/java/kwthon_1team/kwthon/domian/entity/Mail.java index 48fac11..6588efa 100644 --- a/src/main/java/kwthon_1team/kwthon/domian/entity/Mail.java +++ b/src/main/java/kwthon_1team/kwthon/domian/entity/Mail.java @@ -32,7 +32,7 @@ public class Mail { @JoinColumn (name = "sender") private Member sender; - @ManyToOne (fetch = FetchType.LAZY) // 여기가... 문제 + @ManyToOne (fetch = FetchType.LAZY) @JoinColumn (name = "receiver") private Member receiver; diff --git a/src/main/java/kwthon_1team/kwthon/domian/entity/Member.java b/src/main/java/kwthon_1team/kwthon/domian/entity/Member.java index 2d574b0..5ca4703 100644 --- a/src/main/java/kwthon_1team/kwthon/domian/entity/Member.java +++ b/src/main/java/kwthon_1team/kwthon/domian/entity/Member.java @@ -23,18 +23,12 @@ public class Member { @Column (nullable = false) private String name; - @Column + @Column (name = "email", unique = true) private String email; @Column private String password; - @Column - private Boolean isPublic; - - @Column - private Integer authentication; // 이메일 인증번호 - @Column (nullable = false) private Integer treeLevel = 0; diff --git a/src/main/java/kwthon_1team/kwthon/repository/MailRepository.java b/src/main/java/kwthon_1team/kwthon/repository/MailRepository.java new file mode 100644 index 0000000..6a1bead --- /dev/null +++ b/src/main/java/kwthon_1team/kwthon/repository/MailRepository.java @@ -0,0 +1,16 @@ +package kwthon_1team.kwthon.repository; + +import kwthon_1team.kwthon.domian.entity.Mail; +import kwthon_1team.kwthon.domian.entity.Member; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; +import java.util.List; +import java.util.Optional; + +@Repository +public interface MailRepository extends JpaRepository { + // 공개된 메일만 조회 + List findByIsPublic(boolean isPublic); +} \ No newline at end of file diff --git a/src/main/java/kwthon_1team/kwthon/repository/MemberRepository.java b/src/main/java/kwthon_1team/kwthon/repository/MemberRepository.java index 4822d86..76bc282 100644 --- a/src/main/java/kwthon_1team/kwthon/repository/MemberRepository.java +++ b/src/main/java/kwthon_1team/kwthon/repository/MemberRepository.java @@ -3,7 +3,9 @@ import kwthon_1team.kwthon.domian.entity.Member; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.Optional; @Repository public interface MemberRepository extends JpaRepository { + Member findByStudentId(Long studentId); // studentId로 수정 } diff --git a/src/main/java/kwthon_1team/kwthon/service/MailService.java b/src/main/java/kwthon_1team/kwthon/service/MailService.java new file mode 100644 index 0000000..666ea4d --- /dev/null +++ b/src/main/java/kwthon_1team/kwthon/service/MailService.java @@ -0,0 +1,65 @@ +package kwthon_1team.kwthon.service; + +import kwthon_1team.kwthon.domian.dto.response.MailBoxResponseDto; +import kwthon_1team.kwthon.domian.dto.response.MailDto; +import kwthon_1team.kwthon.domian.entity.Mail; +import kwthon_1team.kwthon.domian.entity.Member; +import kwthon_1team.kwthon.repository.MailRepository; +import kwthon_1team.kwthon.repository.MemberRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; +import java.util.Random; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +public class MailService { + + private final MailRepository mailRepository; + private final MemberRepository memberRepository; // MemberRepository 추가 + + // studentId 파라미터 없이 전체 메일을 반환 + public MailBoxResponseDto getMailBoxList() { + // public 메일 조회 + List mails = mailRepository.findByIsPublic(true); + + if (mails.isEmpty()) { + return new MailBoxResponseDto(404, "메일 정보를 찾을 수 없습니다.", null); + } + + // MailDto로 변환 + List mailDtos = mails.stream() + .map(mail -> { + // 송신자 이름 가져오기 + String senderName = memberRepository.findByStudentId(mail.getSender().getStudentId()).getName(); + + // 사진 중 하나 랜덤으로 선택 + String randomPhotoUrl = getRandomPhotoUrl(mail); + Long randomPhotoId = getRandomPhotoId(mail); + + return new MailDto( + mail.getMailDate().toString(), + mail.getMailTitle(), + mail.getSender().getStudentId(), + senderName, + randomPhotoId, // 랜덤 사진 ID + randomPhotoUrl // 랜덤 사진 URL + ); + }) + .collect(Collectors.toList()); + + MailBoxResponseDto.MailBoxDataDto data = new MailBoxResponseDto.MailBoxDataDto(mailDtos); + return new MailBoxResponseDto(200, "광운 메일 정보를 불러왔습니다", data); + } + + private String getRandomPhotoUrl(Mail mail) { + return mail.getPhotos().isEmpty() ? null : mail.getPhotos().get((int) (Math.random() * mail.getPhotos().size())).getPhotoUrl(); + } + + private Long getRandomPhotoId(Mail mail) { + return mail.getPhotos().isEmpty() ? null : mail.getPhotos().get((int) (Math.random() * mail.getPhotos().size())).getPhotoId(); + } +} \ No newline at end of file diff --git a/src/main/java/kwthon_1team/kwthon/service/TreeService.java b/src/main/java/kwthon_1team/kwthon/service/TreeService.java new file mode 100644 index 0000000..9c5b5e7 --- /dev/null +++ b/src/main/java/kwthon_1team/kwthon/service/TreeService.java @@ -0,0 +1,40 @@ +package kwthon_1team.kwthon.service; + +import kwthon_1team.kwthon.domian.dto.response.TreeDataDto; +import kwthon_1team.kwthon.domian.dto.response.TreeResponseDto; +import kwthon_1team.kwthon.domian.entity.Member; +import kwthon_1team.kwthon.repository.MemberRepository; +import org.springframework.stereotype.Service; + +@Service +public class TreeService { + + private final MemberRepository memberRepository; + + public TreeService(MemberRepository memberRepository) { + this.memberRepository = memberRepository; + } + + public TreeResponseDto getTreeInfo(Long studentId) { + // 접근 권한 검증 로직 + boolean hasAccess = checkAccessPermission(String.valueOf(studentId)); + if (!hasAccess) { + return new TreeResponseDto(403, "이 트리 정보에 대한 접근 권한이 없습니다.", null); + } + + // 트리 데이터를 데이터베이스에서 불러오기 + Member member = memberRepository.findByStudentId(studentId); // memberId로 조회 + if (member == null) { + return new TreeResponseDto(404, "트리 정보를 찾을 수 없습니다.", null); + } + + // 트리 레벨을 TreeDataDto로 반환 + TreeDataDto treeData = new TreeDataDto(member.getTreeLevel()); + return new TreeResponseDto(200, "내 트리 정보를 불러왔습니다", treeData); + } + + private boolean checkAccessPermission(String memberId) { // String으로 변경 + // 접근 권한 검증 로직 + return memberId != null && !memberId.isEmpty(); + } +} \ No newline at end of file diff --git a/src/main/resources/application-db.properties b/src/main/resources/application-db.properties new file mode 100644 index 0000000..3010120 --- /dev/null +++ b/src/main/resources/application-db.properties @@ -0,0 +1,4 @@ +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +spring.datasource.url=jdbc:mysql://localhost:3306/kwtree?useSSL=false&useUnicode=true&serverTimezone=Asia/Seoul&allowPublicKeyRetrieval=true +spring.datasource.username=root +spring.datasource.password=1234 \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..424c51e --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,17 @@ +spring.application.name=kwthon + +#properties +spring.profiles.include=db, email, S3 + +# Security : temporary password +spring.security.user.password=1 + +server.port=8080 +server.address=0.0.0.0 + +#hibernate +spring.jpa.properties.hibernate.format_sql=true +spring.jpa.properties.hibernate.show_sql=true +spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQLDialect +spring.jpa.hibernate.ddl-auto=update +spring.session.store-type=jdbc \ No newline at end of file