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
12 changes: 11 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,21 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-validation'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.mysql:mysql-connector-j'
runtimeOnly 'com.h2database:h2'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.security:spring-security-test'
implementation group: 'io.springfox', name: 'springfox-swagger2', version: '2.9.2'
implementation group: 'io.springfox', name: 'springfox-swagger-ui', version: '2.9.2'
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
implementation 'io.jsonwebtoken:jjwt:0.9.1'
implementation group: 'io.jsonwebtoken', name: 'jjwt-api', version: '0.11.5'
runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-impl', version: '0.11.5'
runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-jackson', version: '0.11.5'

implementation 'org.apache.httpcomponents:httpclient:4.5.7'
}

tasks.named('test') {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package com.dku.springstudy.controller;


import java.security.Timestamp;

import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import com.dku.springstudy.dto.user.request.LoginRequestDTO;
import com.dku.springstudy.dto.user.request.SignUpRequestDTO;
import com.dku.springstudy.dto.user.response.LoginResponseDTO;
import com.dku.springstudy.dto.user.response.LogoutResponseDTO;
import com.dku.springstudy.dto.user.response.SignUpResponseDTO;
import com.dku.springstudy.model.User;
import com.dku.springstudy.security.CustomUserDetails;
import com.dku.springstudy.security.jwt.JwtProvider;
import com.dku.springstudy.service.UserService;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;

// why not commit

@RestController
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
private final JwtProvider jwtProvider;

// private Long id;
// private String name;
// private String email;
// private String password;


// final Long ID = 30L;
// final String NAME = "kangho";
// final String EMAIL = "kangho@gmail.com";
// final String PASSWORD = "kangho";

// User user = User.builder()
// .id(ID)
// .name(NAME)
// .email(EMAIL)
// .password(PASSWORD)
// .build();

@PostMapping("/user/signUpTest")
public SignUpResponseDTO SignUpTest(@Valid @RequestBody SignUpRequestDTO signUpRequestDTO) {
return userService.signUp(signUpRequestDTO);
}

@PostMapping("/user/login")
public LoginResponseDTO login(@Valid @RequestBody LoginRequestDTO loginRequest) {
return userService.login(loginRequest);
}

@PostMapping("/user/logout")
public LogoutResponseDTO logout(@AuthenticationPrincipal CustomUserDetails customUserDetails, HttpServletRequest request) {
User user = customUserDetails.getUser();
String accessToken = jwtProvider.resolveToken(request);
return userService.logout(user, accessToken);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.dku.springstudy.dto.common;

import lombok.Getter;

@Getter
public class ErrorResponseDTO<T> extends ResponseDTO{
private final T data;

public ErrorResponseDTO(T data) {
super(false);
this.data = data;
}
}
25 changes: 25 additions & 0 deletions src/main/java/com/dku/springstudy/dto/common/ExceptionDTO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.dku.springstudy.dto.common;

import com.dku.springstudy.exception.CustomException;
import lombok.Getter;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.MethodArgumentNotValidException;

@Getter
public class ExceptionDTO {
private final HttpStatus error;
private final Integer status;
private final String message;

public ExceptionDTO(CustomException e) {
this.status = e.getErrorCode().getStatus();
this.error = e.getErrorCode().getError();
this.message = e.getErrorCode().getMessage();
}

public ExceptionDTO(MethodArgumentNotValidException e) {
this.error = (HttpStatus) e.getStatusCode();
this.status = this.error.value();
this.message = e.getBindingResult().getAllErrors().get(0).getDefaultMessage();
}
}
10 changes: 10 additions & 0 deletions src/main/java/com/dku/springstudy/dto/common/ResponseDTO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.dku.springstudy.dto.common;

import lombok.AllArgsConstructor;
import lombok.Getter;

@AllArgsConstructor
@Getter
public class ResponseDTO {
private boolean isSuccessful;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.dku.springstudy.dto.common;

import lombok.Getter;

@Getter
public class SuccessResponseDTO<T> extends ResponseDTO{
private final T data;

public SuccessResponseDTO(T data) {
super(true);
this.data = data;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.dku.springstudy.dto.user.request;

import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import lombok.Getter;
import lombok.NoArgsConstructor;

@NoArgsConstructor
@Getter
public class LoginRequestDTO {

@Email(message = "Email format does not match")
@NotBlank(message = "Please input email")
private String email;

@NotBlank(message = "Please input password")
private String password;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.dku.springstudy.dto.user.request;

// import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor
public class LogoutRequestDTO {
private String token;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.dku.springstudy.dto.user.request;

import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import lombok.Getter;
import lombok.NoArgsConstructor;

@NoArgsConstructor
@Getter
public class SignUpRequestDTO {

@Email(message = "Email format does not match")
@NotBlank(message = "Please input email")
private String email;

@NotBlank(message = "Please input password")
private String password;

@NotBlank(message = "Please input name")
private String name;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.dku.springstudy.dto.user.response;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public class LoginResponseDTO {
private String accessToken;
private String refreshToken;

public LoginResponseDTO LoginResponse(String accessToken, String refreshToken) {
return new LoginResponseDTO(accessToken,refreshToken);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.dku.springstudy.dto.user.response;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor
public class LogoutResponseDTO {
private boolean success;
private String message = "";

public LogoutResponseDTO(boolean success){
this.success = success;
}

public LogoutResponseDTO(boolean success, String message){
this.success = success;
this.message = message;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.dku.springstudy.dto.user.response;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public class SignUpResponseDTO {
private String accessToken;
private String refreshToken;

public SignUpResponseDTO LoginResponse(String accessToken, String refreshToken) {
return new SignUpResponseDTO(accessToken,refreshToken);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.dku.springstudy.dto.user.response;

import lombok.Data;

@Data
public class TokenResponseDTO {
private final String atk;
private final String rtk;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.dku.springstudy.exception;

import lombok.AllArgsConstructor;
import lombok.Getter;

@AllArgsConstructor
@Getter
public class CustomException extends RuntimeException {
ErrorCode errorCode;
}
20 changes: 20 additions & 0 deletions src/main/java/com/dku/springstudy/exception/ErrorCode.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.dku.springstudy.exception;

import lombok.AllArgsConstructor;
import lombok.Getter;
import org.springframework.http.HttpStatus;

@Getter
@AllArgsConstructor
public enum ErrorCode {
USER_NOT_FOUND_ERROR(HttpStatus.BAD_REQUEST, HttpStatus.BAD_REQUEST.value(), "User not found"),
USER_ALREADY_EXIST_ERROR(HttpStatus.BAD_REQUEST, HttpStatus.BAD_REQUEST.value(), "User already exist"),
USER_PASSWORD_INCORRECT_ERROR(HttpStatus.BAD_REQUEST, HttpStatus.BAD_REQUEST.value(), "User password incorrect"),
EXPIRED_TOKEN_ERROR(HttpStatus.BAD_REQUEST, HttpStatus.BAD_REQUEST.value(), "Expired JWT token"),
INVALID_TOKEN_ERROR(HttpStatus.BAD_REQUEST, HttpStatus.BAD_REQUEST.value(), "Invalid JWT token")
;

private final HttpStatus error;
private final Integer status;
private final String message;
}
12 changes: 12 additions & 0 deletions src/main/java/com/dku/springstudy/exception/JwtTokenError.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.dku.springstudy.exception;

import lombok.AllArgsConstructor;
import lombok.Getter;
import org.springframework.http.HttpStatus;

@Getter
@AllArgsConstructor
public class JwtTokenError {
private String message;
private HttpStatus status;
}
9 changes: 9 additions & 0 deletions src/main/java/com/dku/springstudy/exception/Message.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.dku.springstudy.exception;

public class Message {
public static final String JWT_TOKEN_EXPIRED = "만료된 JWT 토큰 만료";
public static final String JWT_UNSUPPORTED = "미지원하는 JWT 토큰 미지원";
public static final String JWT_MALFORMED = "올바르지 않은 JWT 토큰";
public static final String JWT_SIGNATURE = "올바르지 않은 Signature";
public static final String JWT_ILLEGAL_ARGUMENT = "올바르지 않은 정보";
}
34 changes: 34 additions & 0 deletions src/main/java/com/dku/springstudy/model/User.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.dku.springstudy.model;

import jakarta.persistence.*;
import lombok.*;

import java.sql.Timestamp;

@Entity
@Getter //Lombok
@Setter //Lombok
@ToString //Lombok
@Table(name = "USERS")
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class User {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
private Long id;
@Column(name = "Name")
private String name;
@Column(name = "Email")
private String email;
@Column(name = "Password")
private String password;
@Column(name = "Image")
private String imageURL;
@Column(name = "Created")
private Timestamp created;
@Column(name = "Updated")
private Timestamp updated;
@Column(name = "Status")
private String status;
}
Loading