Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

좋아요 기능 구현 및 테스트 구현 #73

Merged
merged 10 commits into from
Jun 19, 2024
6 changes: 5 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -64,14 +64,18 @@ dependencies {
//firebase
implementation 'com.google.firebase:firebase-admin:6.8.1'
//okhttp
implementation group: 'com.squareup.okhttp3', name: 'okhttp', version: '4.2.2'
implementation group: 'com.squareup.okhttp3', name: 'okhttp', version: '3.2.0'

//Query Dsl
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"

//feign
implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
implementation platform("org.springframework.cloud:spring-cloud-dependencies:2023.0.1")

}

tasks.named('test') {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,14 @@
import java.util.TimeZone;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.scheduling.annotation.EnableAsync;

@EnableAsync
@EnableJpaAuditing
@SpringBootApplication
@EnableFeignClients
public class GraduateMinionsApplication {
public static void main(String[] args) {
SpringApplication.run(GraduateMinionsApplication.class, args);
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/com/example/jolvre/auth/api/AuthController.java
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ public ResponseEntity<TokenResponse> refresh(@RequestBody RefreshRequest request
@GetMapping("/pw/email/{email}")
public ResponseEntity<Void> sendPwFindAuthEmail(@PathVariable String email) {
mailService.sendFindPwEmail(email);
log.info("[EMAIL] {}님 비밀번호 찾기 메일 발송 완료", email);
return ResponseEntity.ok().build();
}

Expand All @@ -63,6 +64,7 @@ public ResponseEntity<Void> sendPwFindAuthEmail(@PathVariable String email) {
public ResponseEntity<FindPwEmailVerifyResponse> verifyPwFindAuthEmail(@RequestBody EmailVerifyRequest request) {
FindPwEmailVerifyResponse response = mailVerifyService.CheckFindPwAuthNum(request.getEmail(),
request.getAuthNum());
log.info("[EMAIL] {}님 비밀번호 찾기 메일 검증 완료", request.getEmail());

return ResponseEntity.ok().body(response);
}
Expand All @@ -72,6 +74,8 @@ public ResponseEntity<FindPwEmailVerifyResponse> verifyPwFindAuthEmail(@RequestB
public ResponseEntity<Void> updatePw(@AuthenticationPrincipal PrincipalDetails principalDetails,
@RequestBody PasswordUpdateRequest request) {
userService.updatePassword(principalDetails.getId(), request.getPassword());
log.info("[EMAIL] {}님 비밀번호 찾기 메일 검증 완료", principalDetails.getUser().getEmail());

return ResponseEntity.ok().build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@ public class SignUpController {
@Operation(summary = "회원 가입")
@PostMapping
public ResponseEntity<TokenResponse> signUpBasic(@Valid @RequestBody BasicSignUpRequest request) {
log.info("[AUTH] : 기본 회원가입");
TokenResponse response = signUpService.signUpBasic(request);
log.info("[AUTH] {}님 기본 회원가입 완료", request.getEmail());

return ResponseEntity.ok(response);
}
Expand All @@ -62,6 +62,7 @@ public ResponseEntity<String> signUpOauth(@AuthenticationPrincipal PrincipalDeta
@GetMapping("/check/nickname/{nickname}")
public ResponseEntity<DuplicateNicknameResponse> checkDuplicateNickname(@PathVariable String nickname) {
DuplicateNicknameResponse response = signUpService.checkDuplicateNickname(nickname);
log.info("[AUTH] {} 닉네임 중복 체크 완료", nickname);

return ResponseEntity.ok(response);
}
Expand All @@ -70,6 +71,7 @@ public ResponseEntity<DuplicateNicknameResponse> checkDuplicateNickname(@PathVar
@GetMapping("/check/email/{email}")
public ResponseEntity<DuplicateEmailResponse> checkDuplicateEmail(@PathVariable String email) {
DuplicateEmailResponse response = signUpService.checkDuplicateEmail(email);
log.info("[AUTH] {} 닉네임 중복 체크 완료", email);

return ResponseEntity.ok(response);
}
Expand All @@ -78,6 +80,7 @@ public ResponseEntity<DuplicateEmailResponse> checkDuplicateEmail(@PathVariable
@GetMapping("/email/{email}")
public ResponseEntity<EmailSendResponse> sendSignUpAuthEmail(@PathVariable String email) {
mailService.sendSignUpEmail(email);
log.info("[EMAIL] {}님 회원가입 인증 메일 발송 완료", email);

return ResponseEntity.ok().body(null);
}
Expand All @@ -87,6 +90,7 @@ public ResponseEntity<EmailSendResponse> sendSignUpAuthEmail(@PathVariable Strin
public ResponseEntity<SignUpEmailVerifyResponse> verifySingUpAuthEmail(@RequestBody EmailVerifyRequest request) {
SignUpEmailVerifyResponse response = mailVerifyService.CheckSignUpAuthNum(request.getEmail(),
request.getAuthNum());
log.info("[EMAIL] {}님 회원가입 인증 메일 검증 완료", request.getEmail());

return ResponseEntity.ok().body(response);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.example.jolvre.auth.email.service;

import com.example.jolvre.common.util.RedisUtil;
import com.example.jolvre.user.repository.UserRepository;
import jakarta.mail.MessagingException;
import jakarta.mail.internet.MimeMessage;
import java.util.Random;
Expand All @@ -17,10 +16,9 @@ public class MailService {
private final JavaMailSender mailSender;
private int authNumber;
private final RedisUtil redisUtil;
private final UserRepository userRepository;

//임의의 6자리 양수를 반환합니다.
public void makeRandomNumber() {
private void makeRandomNumber() {
Random r = new Random();
String randomNumber = "";
for (int i = 0; i < 6; i++) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ public void checkRefreshTokenAndReIssueAccessToken(HttpServletResponse response,
reIssuedRefreshToken);
});
}


/**
* [리프레시 토큰 재발급 & DB에 리프레시 토큰 업데이트 메소드] jwtService.createRefreshToken()으로 리프레시 토큰 재발급 후 DB에 재발급한 리프레시 토큰 업데이트 후
Expand All @@ -95,7 +95,6 @@ private String reIssueRefreshToken(User user) {
*/
public void checkAccessTokenAndAuthentication(HttpServletRequest request, HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException {
log.info("[AUTH] : checkAccessTokenAndAuthentication() 호출");
jwtService.extractAccessToken(request)
.filter(jwtService::isTokenValid)
.ifPresent(accessToken -> jwtService.extractEmail(accessToken)
Expand Down
21 changes: 21 additions & 0 deletions src/main/java/com/example/jolvre/common/config/RedisConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class RedisConfig {
Expand All @@ -17,4 +19,23 @@ public class RedisConfig {
public RedisConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory(host, port);
}

@Bean
public RedisTemplate redisTemplate() {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory());

// 일반적인 key:value의 경우 시리얼라이저
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());

// Hash를 사용할 경우 시리얼라이저
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new StringRedisSerializer());

// 모든 경우
redisTemplate.setDefaultSerializer(new StringRedisSerializer());

return redisTemplate;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ public enum ErrorCode {
USER_ALREADY_EXIST("U03", "User is already exists.", HttpStatus.BAD_REQUEST.value()),
//Exhibit
EXHIBIT_NOT_FOUND("E01", "Exhibit is not found", HttpStatus.BAD_REQUEST.value()),
EXHIBIT_LIKE_DUPLICATION("E02", "ExhibitLike is Duplicate", HttpStatus.BAD_REQUEST.value()),
//Diary
DIARY_NOT_FOUND("D01", "Diary is not found", HttpStatus.BAD_REQUEST.value()),
//Group Exhibit
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.example.jolvre.common.error.exhibition;

import com.example.jolvre.common.error.EntityNotFoundException;
import com.example.jolvre.common.error.ErrorCode;

public class ExhibitLikeDuplicationException extends EntityNotFoundException {
public ExhibitLikeDuplicationException() {
super(ErrorCode.EXHIBIT_LIKE_DUPLICATION);
}
}
Original file line number Diff line number Diff line change
@@ -1,28 +1,28 @@
package com.example.jolvre.common.firebase.DTO;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;

@Builder
@AllArgsConstructor
@Getter
public class FCMMessage {
private boolean validate_only;
private Message message;

@Builder
@AllArgsConstructor
@Getter
public static class Message {
private Notification notification;
private String token;
}

@Builder
@AllArgsConstructor
@Getter
public static class Notification {
private String title;
private String body;
}
}
//package com.example.jolvre.common.firebase.DTO;
//import lombok.AllArgsConstructor;
//import lombok.Builder;
//import lombok.Getter;
//
//@Builder
//@AllArgsConstructor
//@Getter
//public class FCMMessage {
// private boolean validate_only;
// private Message message;
//
// @Builder
// @AllArgsConstructor
// @Getter
// public static class Message {
// private Notification notification;
// private String token;
// }
//
// @Builder
// @AllArgsConstructor
// @Getter
// public static class Notification {
// private String title;
// private String body;
// }
//}
Original file line number Diff line number Diff line change
@@ -1,37 +1,37 @@
package com.example.jolvre.common.firebase.Entity;

import com.example.jolvre.user.entity.User;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.OneToOne;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Entity
@Getter
@Setter
@NoArgsConstructor
public class UserFcmToken {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long userFcmTokenId;

@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "user_id")
private User user;

private String token;

@Builder
public UserFcmToken(String token, User user) {
this.token = token;
this.user = user;
}
}
//package com.example.jolvre.common.firebase.Entity;
//
//import com.example.jolvre.user.entity.User;
//import jakarta.persistence.Entity;
//import jakarta.persistence.FetchType;
//import jakarta.persistence.GeneratedValue;
//import jakarta.persistence.GenerationType;
//import jakarta.persistence.Id;
//import jakarta.persistence.JoinColumn;
//import jakarta.persistence.OneToOne;
//import lombok.Builder;
//import lombok.Getter;
//import lombok.NoArgsConstructor;
//import lombok.Setter;
//
//@Entity
//@Getter
//@Setter
//@NoArgsConstructor
//public class UserFcmToken {
//
// @Id
// @GeneratedValue(strategy = GenerationType.IDENTITY)
// private Long userFcmTokenId;
//
// @OneToOne(fetch = FetchType.EAGER)
// @JoinColumn(name = "user_id")
// private User user;
//
// private String token;
//
// @Builder
// public UserFcmToken(String token, User user) {
// this.token = token;
// this.user = user;
// }
//}
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package com.example.jolvre.common.firebase.Repository;
import com.example.jolvre.common.firebase.Entity.UserFcmToken;
import com.example.jolvre.user.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.Optional;

public interface UserFcmTokenRepository extends JpaRepository<UserFcmToken, Long> {
Optional<UserFcmToken> findByUser(User user);
boolean existsByUser(User user);
}
//package com.example.jolvre.common.firebase.Repository;
//import com.example.jolvre.common.firebase.Entity.UserFcmToken;
//import com.example.jolvre.user.entity.User;
//import org.springframework.data.jpa.repository.JpaRepository;
//
//import java.util.Optional;
//
//public interface UserFcmTokenRepository extends JpaRepository<UserFcmToken, Long> {
// Optional<UserFcmToken> findByUser(User user);
// boolean existsByUser(User user);
//}
Loading
Loading