Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
ecd3b56
프로핈 수정
mintaek22 Mar 4, 2023
5b86d18
메세지 수정
mintaek22 Mar 4, 2023
eece72e
자잘한 오류 수정
mintaek22 Mar 4, 2023
7861185
내 작업물 등록
MIN0225 Mar 4, 2023
a8a552e
pushh
MIN0225 Mar 4, 2023
4316c3c
cors 해결
mintaek22 Mar 4, 2023
c075d80
Merge pull request #8 from ProjectFRIDAY/reference
mintaek22 Mar 4, 2023
00510ec
cors 수정ㅇ
mintaek22 Mar 4, 2023
3cfc5ab
http only 변경
mintaek22 Mar 4, 2023
a75cc10
로그아웃 기능 구현 완료
mintaek22 Mar 5, 2023
1d2ddf3
닉네임 중복시 임의 닉네임(유저-{kakaoId}) 생성
jayrhie Mar 4, 2023
ab20695
카카오 로그인 한글 깨짐 문제 수정
jayrhie Mar 5, 2023
4f2ba71
클래스 세분화 및 file 일대일 대응
mintaek22 Mar 6, 2023
d61e260
Post File 일대다 재수정, Post에 File 저장되지 않는 문제 해결, 코드 정리
jayrhie Mar 7, 2023
b761e7c
테스트 코드 제거
jayrhie Mar 7, 2023
9650808
for->forEach 변경
jayrhie Mar 7, 2023
544d41e
내 작업물 목록 페이지 구현, Post 작성시 postingTime 등 초기 값 설정, 오탈자 수정(regist->regis…
jayrhie Mar 7, 2023
5f8d5de
Merge pull request #10 from ProjectFRIDAY/myReference
mintaek22 Mar 8, 2023
bda1209
remoa-BE 제거
mintaek22 Mar 8, 2023
f7da5fd
레퍼런스 등록에 썸네일 추가
mintaek22 Mar 9, 2023
f085b02
프로필 사진 확인 수정, aws에 저장
jeonkwanghwi Mar 11, 2023
aa0c2bf
Merge branch 'dev' into profile
mintaek22 Mar 11, 2023
050ba8a
Merge pull request #11 from ProjectFRIDAY/profile
mintaek22 Mar 11, 2023
5ba0614
프로필 사진관련 로직 ㅇ완료
mintaek22 Mar 11, 2023
79f28a5
Delete 오민택.jpg
mintaek22 Mar 11, 2023
37cb0bb
ResFeedbackDto 추가
MIN0225 Mar 11, 2023
d5fef39
fix: comment등록 post, member 등록하도록 수정. comment&feedback 등록시 반환되는 dto 삭제
MIN0225 Mar 12, 2023
27b9573
레퍼런스 등록 jpg도 가능
mintaek22 Mar 12, 2023
3b7154e
fix: comment&feedback 예외처리추가
MIN0225 Mar 12, 2023
e7e61b4
코멘트 예외처리 수정
mintaek22 Mar 12, 2023
162ee8a
comment에 대한 reply 기능 구현
jayrhie Mar 12, 2023
704ece4
Delete 오민택.jpg
mintaek22 Mar 12, 2023
d870743
comment, feedback에 reply 기능 추가
jayrhie Mar 12, 2023
e321f50
fix: feedback 등록시 페이지 수 예외처리 추가
MIN0225 Mar 12, 2023
1af38f1
kakaoController의 getCI 메서드의 로그인 처리시 member를 그대로 return해 무한 재귀호출되는 오류 …
jayrhie Mar 12, 2023
37e19f5
kakaoController의 getCI 메서드의 로그인 처리시 member를 그대로 return해 무한 재귀호출되는 오류 …
jayrhie Mar 12, 2023
ee6df44
사진 다운로드 문제 변경
mintaek22 Mar 12, 2023
e51806c
feat: comment 수정 기능 구현
MIN0225 Mar 12, 2023
ca62a3c
reply 기능 추가
jayrhie Mar 12, 2023
adce5e3
dev pull 하기 전 commit
MIN0225 Mar 12, 2023
52735e4
merge전 커밋
MIN0225 Mar 12, 2023
5dd7c65
refactor: comment 수정
MIN0225 Mar 12, 2023
73baf67
comment 삭제 구현
MIN0225 Mar 12, 2023
b5c23de
post, comment, feedback 초기 값 설정, ThumbnailReferenceDto에 memberId 추가
jayrhie Mar 12, 2023
f40c3b5
검색기능 추가
jeonkwanghwi Mar 12, 2023
3b910f1
Merge pull request #14 from ProjectFRIDAY/comment
mintaek22 Mar 12, 2023
2e050d6
검색 기능 추가 & 수정
jeonkwanghwi Mar 13, 2023
3fd8d94
Merge pull request #15 from ProjectFRIDAY/searchPost
mintaek22 Mar 13, 2023
dd1df21
레퍼런스 목록 보기 수정
mintaek22 Mar 14, 2023
24e53b8
paging기능 jpa 이용해서 구현, sorting 기능을 위해 Post/Comment/Feedback 작성 시간 Stri…
jayrhie Mar 14, 2023
daa4e99
주석 추가, paging 관련 로직 일부 수정
jayrhie Mar 14, 2023
7b2e51d
미사용 import문 소거
jayrhie Mar 14, 2023
31868cb
paging 구현, 시간 관련 필드 String->LocalDateTime으로 수정
jayrhie Mar 15, 2023
10dba68
paging 구현, 시간 관련 필드 String->LocalDateTime으로 수정
jayrhie Mar 15, 2023
cd79959
jar bug fix
mintaek22 Mar 16, 2023
a329e61
Revert "jar bug fix"
mintaek22 Mar 16, 2023
95d81c8
상수명 변경
jayrhie Mar 16, 2023
ef30bc7
homepage 제작 완료
jayrhie Mar 16, 2023
69df9cb
내 레퍼런스 목록 category로 정렬 추가
jayrhie Mar 17, 2023
78db31a
/reference 페이징 추가해서 수정, 카카오 회원가입시 닉네임 중복되면 '유저-{6자리 난수}'로 설정, kakaoId…
jayrhie Mar 17, 2023
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
Binary file modified .DS_Store
Binary file not shown.
8 changes: 6 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,12 @@ dependencies {
// S3
implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'

// h2 db 추가
implementation "com.h2database:h2"

//ModelMapper 라이브러리 추가
implementation 'org.modelmapper:modelmapper:2.4.2'

//파일 관련
implementation 'org.apache.pdfbox:pdfbox:2.0.24'
}

tasks.named('test') {
Expand Down
Binary file removed build/libs/BE-ver_230228.jar
Binary file not shown.
Binary file removed build/libs/BE-ver_230301.jar
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,13 @@
import Remoa.BE.Member.Service.FollowService;
import Remoa.BE.Member.Service.MemberService;
import Remoa.BE.exception.CustomMessage;
import Remoa.BE.exception.response.ErrorResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import java.util.Arrays;
import java.util.List;
import java.util.Objects;

Expand All @@ -27,7 +22,6 @@
@RestController
@Slf4j
@RequiredArgsConstructor
@CrossOrigin(origins = "*")
public class FollowController {

private final FollowService followService;
Expand Down
88 changes: 36 additions & 52 deletions src/main/java/Remoa/BE/Member/Controller/KakaoController.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,21 +5,21 @@
import Remoa.BE.Member.Dto.Res.ResSignupDto;
import Remoa.BE.Member.Service.KakaoService;
import Remoa.BE.Member.Service.MemberService;
import Remoa.BE.Member.Service.ProfileService;
import Remoa.BE.exception.CustomMessage;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Map;
import java.util.Optional;
import java.util.Random;

import static Remoa.BE.exception.CustomBody.*;
import static Remoa.BE.utill.MemberInfo.*;
Expand All @@ -28,12 +28,13 @@
@RestController
@Slf4j
@RequiredArgsConstructor
@CrossOrigin(origins = "*") // 프론트에서 추가 요청
public class KakaoController {



private final KakaoService ks;
private final MemberService memberService;
private final HttpSession httpSession;
private final ProfileService profileService;

/**
* 카카오 로그인을 통해 code를 query string으로 받아오면, 코드를 통해 토큰, 토큰을 통해 사용자 정보를 얻어와 db에 해당 사용자가 존재하는지 여부를
Expand Down Expand Up @@ -62,41 +63,41 @@ public ResponseEntity<Object> getCI(@RequestParam String code, HttpServletReques
if (member.isPresent()) {
securityLoginWithoutLoginForm(member.get(), request);
//if문에 걸리지 않았다면 이미 회원가입이 진행돼 db에 kakaoId가 있는 유저이므로 kakaoMember가 존재하므로 LoginController처럼 로그인 처리 하면 됩니다.
return successResponse(CustomMessage.OK, userInfo);
return successResponse(CustomMessage.OK, member.get().getNickname());

} else {
//kakaoId가 db에 없으므로 kakaoMember가 null이므로 회원가입하지 않은 회원. 따라서 회원가입이 필요하므로 회원가입하는 uri로 redirect 시켜주어야 함.
return successResponse(CustomMessage.OK_SIGNUP, userInfo);
}
}

/**
* 카카오 로그인을 우회해 테스트 하기 위한 용도로 추가됨.
* @param kakaoId
* @return ResponseEntity
*/
@PostMapping("/login/kakao/test")
public ResponseEntity<Object> testLogin(@RequestBody Integer kakaoId, HttpServletRequest request) {
log.warn("kakaoId = {}", kakaoId);
Optional<Member> findMember = memberService.findByKakaoId(Long.valueOf(kakaoId));
if (findMember.isPresent()) {
Member member = findMember.get();
securityLoginWithoutLoginForm(member, request);
return successResponse(CustomMessage.OK, member);
}
return failResponse(CustomMessage.VALIDATED, "User Not Exist");
}

/**
* front-end에서 회원가입에 필요한 정보를 넘겨주면 KakaoSignupForm으로 받아 회원가입을 진행시켜줌
*/
@PostMapping("/signup/kakao")
public ResponseEntity<Object> signupKakaoMember(@RequestBody @Validated ReqSignupDto form, HttpServletRequest request) {
public ResponseEntity<Object> signupKakaoMember(@RequestBody @Validated ReqSignupDto form, HttpServletRequest request) throws IOException {

Member member = new Member();

member.setNickname(form.getNickname());

//닉네임 사용 가능하면 그대로 진행, 불가능하면 임의 닉네임 "유저-{randomInt}로 지정.
Boolean nicknameDuplicate = memberService.isNicknameDuplicate(form.getNickname());
while (nicknameDuplicate) { //특수문자는 닉네임에 사용할 수 없으나 임의로 지정하는 닉네임에는 사용 가능하게 해서 또 다른 중복 문제 없게끔.
Random random = new Random();
String randomNumber = Integer.toString((random.nextInt(900_000) + 100_000)); // 100_000 ~ 999_999
nicknameDuplicate = memberService.isNicknameDuplicate("유저-" + randomNumber);
member.setNickname("유저-" + randomNumber);
}

form.setProfileImage(profileService.editProfileImg(form.getNickname(), form.getProfileImage()));

//카카오에서 받은 프로필 사진 url 링크를 토대로 s3에 저장
if (memberService.findByKakaoId(form.getKakaoId()).isPresent()) {
return failResponse(CustomMessage.VALIDATED, "kakaoId가 이미 가입되어 있습니다.");
}
member.setKakaoId(form.getKakaoId());
member.setEmail(form.getEmail());
member.setNickname(form.getNickname());
member.setProfileImage(form.getProfileImage());
member.setTermConsent(form.getTermConsent());

Expand All @@ -114,39 +115,22 @@ public ResponseEntity<Object> signupKakaoMember(@RequestBody @Validated ReqSignu
return successResponse(CustomMessage.OK,result);
}

/**
*자동 로그인 추후에
*/
/*
@GetMapping("/login")
public ResponseEntity<Object> autoLogin(){
Long kaKaoId = getKaKaoId();
Optional<Member> member = memberService.findByKakaoId(kaKaoId);
if(member.isPresent()){
return successResponse(CustomMessage.OK,member);
}
else{
return errorResponse(CustomMessage.UNAUTHORIZED);
}

}
*/

/**
* 로그아웃 기능
세션무효화, jsession쿠키를 제거,
*/
@PostMapping("/user/logout")
public ResponseEntity<Object> logout(HttpServletResponse response){
@PostMapping ("/user/logout")
public ResponseEntity<Object> logout(HttpServletRequest request){
if(authorized(request)) {

SecurityContextHolder.clearContext();
request.getSession().invalidate();

SecurityContextHolder.clearContext(); // 현재 SecurityContext를 제거합니다.
httpSession.invalidate(); // HttpSession을 무효화합니다.
return new ResponseEntity<>(HttpStatus.OK);

}

Cookie myCookie = new Cookie("JSESSIONID", null);
myCookie.setMaxAge(0); // 쿠키의 expiration 타임을 0으로 하여 없앤다.
myCookie.setPath("/"); // 모든 경로에서 삭제 됬음을 알린다.
response.addCookie(myCookie);
return successResponse(CustomMessage.OK,myCookie);
return errorResponse(CustomMessage.UNAUTHORIZED);
}


Expand Down
138 changes: 106 additions & 32 deletions src/main/java/Remoa/BE/Member/Controller/ProfileController.java
Original file line number Diff line number Diff line change
@@ -1,74 +1,148 @@
package Remoa.BE.Member.Controller;

import Remoa.BE.Member.Domain.AwsS3;
import Remoa.BE.Member.Domain.Member;
import Remoa.BE.Member.Dto.Req.EditProfileForm;
import Remoa.BE.Member.Dto.Res.ResUserInfoDto;
//import Remoa.BE.Member.Service.ImageService;
import Remoa.BE.Member.Service.AwsS3Service;
import Remoa.BE.Member.Service.MemberService;
import Remoa.BE.Member.Service.ProfileService;
import Remoa.BE.exception.CustomMessage;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;


import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.net.MalformedURLException;


import static Remoa.BE.exception.CustomBody.*;
import static Remoa.BE.utill.MemberInfo.authorized;
import static Remoa.BE.utill.MemberInfo.getMemberId;

@Slf4j
@RestController
@RequiredArgsConstructor
@CrossOrigin(origins = "*")
public class ProfileController {

private final ProfileService profileService;

private final MemberService memberService;
private final AwsS3Service awsS3Service;

// 프로필 수정 범위 : 닉네임(중복확인), 핸드폰번호, 대학교, 한줄소개
@GetMapping("/user")
public ResponseEntity<Object> userHome(HttpServletRequest request) {

HttpSession session = request.getSession();
// 현재 로그인한 사용자의 세션 가져오기
Member loginMember = (Member) session.getAttribute("loginMember");

// 세션이 없으면 로그인 페이지로 이동
if (loginMember == null) {
return failResponse(CustomMessage.VALIDATED, "redirect:/login/kakao");
public ResponseEntity<Object> userInfo(HttpServletRequest request) {

if(authorized(request)) {
Long memberId = getMemberId();
// 로그인된 사용자의 정보를 db에서 다시 불러와 띄워줌.
Member member = memberService.findOne(memberId);
ResUserInfoDto resUserInfoDto = ResUserInfoDto.builder()
.email(member.getEmail())
.nickname(member.getNickname())
.phoneNumber(member.getPhoneNumber())
.university(member.getUniversity())
.oneLineIntroduction(member.getOneLineIntroduction())
.build();
return successResponse(CustomMessage.OK, resUserInfoDto);
}

// 로그인된 사용자의 정보를 db에서 다시 불러와 띄워줌.
Member member = memberService.findOne(loginMember.getMemberId());
return successResponse(CustomMessage.OK, member);
return errorResponse(CustomMessage.UNAUTHORIZED);

}

// RESTful API에서 PUT 매핑은 수정할 리소스를 명확하게 지정해야 하는데 이 경우에는 URL에 리소스 ID를 명시하는 것이 일반적이다.
// 그런데 우리는 수정할 사용자의 정보를 모두 입력받아 수정하는 형태이기 때문에
// URL에 리소스 ID를 명시할 필요가 없어서 PUT대신 POST 매핑을 사용하였습니다.
@PostMapping("/user")
@PutMapping("/user")
public ResponseEntity<Object> editProfile(@RequestBody EditProfileForm form, HttpServletRequest request) {
HttpSession session = request.getSession();
Member loginMember = (Member) session.getAttribute("loginMember");

if (loginMember == null) {
// 로그인되어 있지 않은 경우 로그인 페이지로 이동
return failResponse(CustomMessage.VALIDATED, "로그인하지 않은 회원입니다. <redirect:/login/kakao> 로 redirect");
if(authorized(request)){
Long memberId = getMemberId();

Member myMember = memberService.findOne(memberId);
log.info(myMember.getNickname());
if(memberService.isNicknameDuplicate(myMember.getNickname())) {

// 사용자의 입력 정보를 DTO에 담아 서비스로 전달
profileService.editProfile(memberId, form);
ResUserInfoDto resUserInfoDto = ResUserInfoDto.builder()
.email(myMember.getEmail())
.nickname(myMember.getNickname())
.phoneNumber(myMember.getPhoneNumber())
.university(myMember.getUniversity())
.oneLineIntroduction(myMember.getOneLineIntroduction())
.build();

return successResponse(CustomMessage.OK, resUserInfoDto);
}

return errorResponse(CustomMessage.BAD_DUPLICATE);

}

if (memberService.isNicknameDuplicate(form.getNickname())) {
return failResponse(CustomMessage.VALIDATED, "닉네임이 중복됩니다.");
// 수정이 완료되면 프로필 페이지로 이동
return errorResponse(CustomMessage.UNAUTHORIZED);
}


// 프로필 사진 불러오기
@GetMapping("/user/img")
public ResponseEntity<Object> showImage(HttpServletRequest request) {
if(authorized(request)) {
Long memberId = getMemberId();
Member myMember = memberService.findOne(memberId);
return successResponse(CustomMessage.OK, myMember.getProfileImage());
}
return errorResponse(CustomMessage.UNAUTHORIZED);
}

// 사용자의 입력 정보를 DTO에 담아 서비스로 전달
EditProfileForm profileInfo = new EditProfileForm(
form.getNickname(), form.getPhoneNumber(), form.getUniversity(), form.getOneLineIntroduction());
profileService.editProfile(loginMember.getMemberId(), profileInfo);
// 프로필 사진 업로드
@PutMapping("/user/img")
public ResponseEntity<Object> upload(@RequestPart("file") MultipartFile multipartFile, HttpServletRequest request) throws IOException {

// 수정이 완료되면 프로필 페이지로 이동
return successResponse(CustomMessage.OK, "redirect:/user");
if(authorized(request)) {

Long memberId = getMemberId();
Member myMember = memberService.findOne(memberId);;

String editProfileImg = awsS3Service.editProfileImg(myMember.getProfileImage(), multipartFile);
myMember.setProfileImage(editProfileImg);
memberService.join(myMember);
return new ResponseEntity<>(HttpStatus.OK);
}
return errorResponse(CustomMessage.UNAUTHORIZED);
}

// 프로필 사진 삭제
@DeleteMapping("/user/img")
public ResponseEntity<Object> remove(HttpServletRequest request) throws MalformedURLException {
if(authorized(request)) {

Long memberId = getMemberId();
Member myMember = memberService.findOne(memberId);
if(myMember.getProfileImage() == null){
return errorResponse(CustomMessage.BAD_PROFILE_IMG);
}

awsS3Service.removeProfileUrl(myMember.getProfileImage());
myMember.setProfileImage(null);
memberService.join(myMember);
return new ResponseEntity<>(HttpStatus.OK);
}
return errorResponse(CustomMessage.UNAUTHORIZED);
}




/**
* 프론트에서 닉네임 중복 검사를 할 때 사용할 메서드
* @param nickname
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
@RestController
@Slf4j
@RequiredArgsConstructor
@CrossOrigin(origins = "*")
public class WithdrewController {

private final WithdrewService withdrewService;
Expand Down
Loading