Skip to content
Open
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: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -45,4 +45,4 @@ out/
application-mail.properties

### AWS S3 관련 정보 ###
application-S3.properties
application-S3.properties
Original file line number Diff line number Diff line change
Expand Up @@ -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/**", "/friendMail/**"};

@Bean
public PasswordEncoder passwordEncoder() {
Expand Down
31 changes: 31 additions & 0 deletions src/main/java/kwthon_1team/kwthon/controller/MailController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package kwthon_1team.kwthon.controller;

import kwthon_1team.kwthon.common.BaseResponse;
import kwthon_1team.kwthon.domian.dto.response.MailDetailResponse;
import kwthon_1team.kwthon.domian.dto.response.MailPagingResponse;
import kwthon_1team.kwthon.domian.dto.response.MailSummaryResponse;
import kwthon_1team.kwthon.service.MailService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
public class MailController {

private final MailService mailService;

@GetMapping("/friendMail/{memberId}")
public BaseResponse<MailPagingResponse<MailSummaryResponse>> inquiryMailByMemberId(
@PathVariable("memberId") Long memberId, int page, int size
){
return new BaseResponse(HttpStatus.OK.value(), "친구 메일이 검색 되었습니다.",mailService.inquiryMailByFriendId(memberId, page, size));
}

@GetMapping("/friendMail/detail/{mailId}")
public BaseResponse<MailDetailResponse> inquiryMailByMailId(@PathVariable("mailId") Long mailId){
return new BaseResponse(HttpStatus.OK.value(), "메일 정보를 불러왔습니다.", mailService.inquiryMailDetailByMailId(mailId));
}
}
Original file line number Diff line number Diff line change
@@ -1,19 +1,27 @@
package kwthon_1team.kwthon.controller;

import kwthon_1team.kwthon.common.BaseResponse;
import kwthon_1team.kwthon.domian.dto.response.SearchResponse;
import kwthon_1team.kwthon.domian.dto.request.AuthRequestDto;
import kwthon_1team.kwthon.service.MemberService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;


@RestController
@RequiredArgsConstructor
public class MemberController {
private final MemberService memberService;

@GetMapping("/search")
public BaseResponse<List<SearchResponse>> search(@RequestParam String keyword) {
return new BaseResponse(HttpStatus.OK.value(), "검색 결과를 불러왔습니다.",memberService.search(keyword));
@PostMapping("/auth/signUp")
public BaseResponse signUp(@RequestBody AuthRequestDto authRequestDto) {
memberService.join(authRequestDto);
Expand Down
53 changes: 53 additions & 0 deletions src/main/java/kwthon_1team/kwthon/converter/MailConverter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package kwthon_1team.kwthon.converter;

import kwthon_1team.kwthon.domian.dto.response.MailDetailResponse;
import kwthon_1team.kwthon.domian.dto.response.MailPagingResponse;
import kwthon_1team.kwthon.domian.dto.response.MailSummaryResponse;
import kwthon_1team.kwthon.domian.entity.Mail;
import kwthon_1team.kwthon.domian.entity.Photo;
import lombok.RequiredArgsConstructor;

import org.springframework.stereotype.Component;
import org.springframework.data.domain.Page;

@Component
@RequiredArgsConstructor
public class MailConverter {


public MailSummaryResponse toMailSummaryResponse(Mail mail, Photo Photo){
return MailSummaryResponse.builder()
.mailId(mail.getMailId())
.mailDate(mail.getMailDate())
.mailTitle(mail.getMailTitle())
.senderId(mail.getSender().getStudentId())
.senderName(mail.getSender().getName())
.isPublic(mail.getIsPublic())
.photo(Photo)
.build();
}

public MailDetailResponse toMailDetailResponse(Mail mail){
return MailDetailResponse.builder()
.mailId(mail.getMailId())
.mailText(mail.getMailText())
.mainTitle(mail.getMailTitle())
.senderId(mail.getSender().getStudentId())
.senderName(mail.getSender().getName())
.isPublic(mail.getIsPublic())
.mailDate(mail.getMailDate())
.build();
}

public <T> MailPagingResponse<T> toMailPagingResponse(Page<T> mails){
return MailPagingResponse.<T>builder()
.emails(mails.getContent())
.page(mails.getNumber())
.totalPages(mails.getTotalPages())
.isFirst(mails.isFirst())
.isLast(mails.isLast())
.totalElements(mails.getNumberOfElements())
.build();
}

}
20 changes: 20 additions & 0 deletions src/main/java/kwthon_1team/kwthon/converter/MemberConverter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package kwthon_1team.kwthon.converter;

import kwthon_1team.kwthon.domian.dto.response.SearchResponse;
import kwthon_1team.kwthon.domian.entity.Member;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;

@Component
@RequiredArgsConstructor
public class MemberConverter {

public SearchResponse toSearchResponse(Member member){
return SearchResponse.builder()
.studentId(member.getStudentId())
.department(member.getDepartment())
.name(member.getName())
.build();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package kwthon_1team.kwthon.domian.dto.response;


import kwthon_1team.kwthon.domian.entity.Photo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;

import java.time.LocalDateTime;
import java.util.List;

@Getter
@AllArgsConstructor
@Builder
public class MailDetailResponse {
private Long mailId;
private String mainTitle;
private String mailText;
private Boolean isPublic;
private Long senderId;
private String senderName;
private LocalDateTime mailDate;
private List<Photo> photos;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package kwthon_1team.kwthon.domian.dto.response;

import lombok.*;

import java.util.List;

@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class MailPagingResponse<T> {
private List<T> emails;
private int page;
private int totalPages;
private int totalElements;
private Boolean isFirst;
private Boolean isLast;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package kwthon_1team.kwthon.domian.dto.response;

import kwthon_1team.kwthon.domian.entity.Photo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;

import java.time.LocalDateTime;

@Getter
@AllArgsConstructor
@Builder
public class MailSummaryResponse {
private Long mailId;
private LocalDateTime mailDate;
private String mailTitle;
private Long senderId;
private String senderName;
private Boolean isPublic;
private Photo photo;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package kwthon_1team.kwthon.domian.dto.response;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;

@Getter
@Builder
@AllArgsConstructor
public class SearchResponse {
private Long studentId;
private String name;
private String department;
}
6 changes: 4 additions & 2 deletions src/main/java/kwthon_1team/kwthon/domian/entity/Mail.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
package kwthon_1team.kwthon.domian.entity;

import jakarta.persistence.*;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.*;

import java.time.LocalDateTime;
import java.util.ArrayList;
Expand All @@ -11,6 +10,9 @@
@Data
@NoArgsConstructor
@Entity
@Getter
@AllArgsConstructor
@Builder
public class Mail {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Expand Down
15 changes: 15 additions & 0 deletions src/main/java/kwthon_1team/kwthon/repository/MailRepository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package kwthon_1team.kwthon.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import kwthon_1team.kwthon.domian.entity.Mail;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Page;


public interface MailRepository extends JpaRepository<Mail,Long> {

@Query("SELECT m FROM Mail m JOIN m.sender s WHERE m.isPublic = true AND s.studentId = :memberId")
Page<Mail> findAllByFriendId(@Param("memberId") Long memberId, Pageable pageable);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,16 @@

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;

@Repository
public interface MemberRepository extends JpaRepository<Member, Long> {

@Query("SELECT m FROM Member m WHERE " +
"(m.name LIKE%:keyword% OR m.department LIKE%:keyword% OR CAST(m.studentId AS String) LIKE %:keyword%)")
List<Member> findAllByKeyword(@Param("keyword") String keyword);
}
11 changes: 11 additions & 0 deletions src/main/java/kwthon_1team/kwthon/service/MailService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package kwthon_1team.kwthon.service;

import kwthon_1team.kwthon.domian.dto.response.MailDetailResponse;
import kwthon_1team.kwthon.domian.dto.response.MailPagingResponse;
import kwthon_1team.kwthon.domian.dto.response.MailSummaryResponse;

public interface MailService {

MailPagingResponse<MailSummaryResponse> inquiryMailByFriendId(Long memberId, int page, int size);
MailDetailResponse inquiryMailDetailByMailId(Long mailId);
}
51 changes: 51 additions & 0 deletions src/main/java/kwthon_1team/kwthon/service/MailServiceImpl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package kwthon_1team.kwthon.service;


import kwthon_1team.kwthon.converter.MailConverter;
import kwthon_1team.kwthon.domian.dto.response.MailDetailResponse;
import kwthon_1team.kwthon.domian.dto.response.MailPagingResponse;
import kwthon_1team.kwthon.domian.dto.response.MailSummaryResponse;
import kwthon_1team.kwthon.domian.entity.Mail;
import kwthon_1team.kwthon.domian.entity.Photo;
import kwthon_1team.kwthon.exception.BadRequestException;
import kwthon_1team.kwthon.repository.MailRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Page;


@Service
@RequiredArgsConstructor
public class MailServiceImpl implements MailService {

private final MailRepository mailRepository;
private final MailConverter mailConverter;

/*
* 메일 검색
*/
@Override
public MailPagingResponse<MailSummaryResponse> inquiryMailByFriendId(Long memberId, int page, int size){
Pageable pageable = PageRequest.of(page, size);
Page<Mail> mailPage = mailRepository.findAllByFriendId(memberId, pageable);

Page<MailSummaryResponse> mailSummaryResponses = mailPage.map(mail->{
Photo firstPhoto = mail.getPhotos() != null && !mail.getPhotos().isEmpty()
? mail.getPhotos().get(0)
: null;
return mailConverter.toMailSummaryResponse(mail,firstPhoto);
});

return mailConverter.toMailPagingResponse(mailSummaryResponses);
}

@Override
public MailDetailResponse inquiryMailDetailByMailId(Long mailId){
Mail mail = mailRepository.findById(mailId)
.orElseThrow(()-> new BadRequestException("존재하지 않는 메일입니다."));
return mailConverter.toMailDetailResponse(mail);
}
}
8 changes: 8 additions & 0 deletions src/main/java/kwthon_1team/kwthon/service/MemberService.java
Original file line number Diff line number Diff line change
@@ -1,18 +1,22 @@
package kwthon_1team.kwthon.service;


import kwthon_1team.kwthon.domian.dto.request.AuthRequestDto;
import kwthon_1team.kwthon.domian.entity.Member;
import kwthon_1team.kwthon.exception.BadRequestException;
import kwthon_1team.kwthon.repository.MemberRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import kwthon_1team.kwthon.converter.MemberConverter;


@Service
@Transactional
@RequiredArgsConstructor
public class MemberService {
private final MemberRepository memberRepository;
private final MemberConverter memberConverter;

private String emailCode;

Expand Down Expand Up @@ -44,5 +48,9 @@ private void validateDuplicateEmail(String email) {

private Member converToMember(AuthRequestDto authRequestDto) {
return new Member(authRequestDto);

public List<SearchResponse> search(String keyword) {
List<Member> memberList = memberRepository.findAllByKeyword(keyword);
return memberList.stream().map(memberConverter::toSearchResponse).toList();
}
}