diff --git a/README.md b/README.md new file mode 100644 index 000000000..52d7d85ac --- /dev/null +++ b/README.md @@ -0,0 +1,17 @@ +## package + +### `auth` +auth(인증)와 관련된 기능을 담당하는 패키지 +- auth.package + - AdminAccessInterceptor + - JwtAuthConfig + - JwtAuthManager + - LoginMemberArgumentResolver + +### `roomescape` +방탈출 예약과 관련된 모든 기능을 담당하는 패키지 +- roomescape.package + - config.package + - controller.package + - domain.package + - exception.package \ No newline at end of file diff --git a/build.gradle b/build.gradle index 9bc129a0e..0d4d3c993 100644 --- a/build.gradle +++ b/build.gradle @@ -8,6 +8,12 @@ group = 'nextstep' version = '0.0.1-SNAPSHOT' sourceCompatibility = '17' +jar { + manifest { + attributes 'Main-Class': 'roomescape.RoomescapeApplication' + } +} + repositories { mavenCentral() } diff --git a/src/main/java/roomescape/authentication/AdminAccessInterceptor.java b/src/main/java/auth/AdminAccessInterceptor.java similarity index 79% rename from src/main/java/roomescape/authentication/AdminAccessInterceptor.java rename to src/main/java/auth/AdminAccessInterceptor.java index 2623b62a1..1f1cf228a 100644 --- a/src/main/java/roomescape/authentication/AdminAccessInterceptor.java +++ b/src/main/java/auth/AdminAccessInterceptor.java @@ -1,4 +1,4 @@ -package roomescape.authentication; +package auth; import jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpServletRequest; @@ -6,7 +6,7 @@ import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; import roomescape.exception.AuthorizationException; -import roomescape.domain.member.Member; +import roomescape.service.AuthService; import java.util.Arrays; @@ -21,16 +21,11 @@ public AdminAccessInterceptor(AuthService authService) { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String token = extractTokenFromCookies(request.getCookies()); + authService.validateToken(token); - String email = authService.getEmailFromToken(token); - Member member = authService.findLoginMemberByEmail(email); + String role = authService.extractRole(token); - if (member == null) { - response.setStatus(401); - return false; - } - - if (!"ADMIN".equals(member.getRole())) { + if (!"ADMIN".equals(role)) { response.setStatus(401); response.getWriter().write("권한이 없습니다."); return false; diff --git a/src/main/java/auth/JwtAuthConfig.java b/src/main/java/auth/JwtAuthConfig.java new file mode 100644 index 000000000..7551202b0 --- /dev/null +++ b/src/main/java/auth/JwtAuthConfig.java @@ -0,0 +1,21 @@ +package auth; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import roomescape.domain.member.MemberRepository; + +@Configuration +@ComponentScan(basePackages = {"roomescape", "auth"}) +public class JwtAuthConfig { + private final MemberRepository memberRepository; + + public JwtAuthConfig(MemberRepository memberRepository) { + this.memberRepository = memberRepository; + } + + @Bean + public JwtAuthManager jwtAuthManager() { + return new JwtAuthManager(memberRepository); + } +} diff --git a/src/main/java/auth/JwtAuthManager.java b/src/main/java/auth/JwtAuthManager.java new file mode 100644 index 000000000..2822f2231 --- /dev/null +++ b/src/main/java/auth/JwtAuthManager.java @@ -0,0 +1,76 @@ +package auth; + +import io.jsonwebtoken.*; +import org.springframework.beans.factory.annotation.Value; +import roomescape.domain.member.Member; +import roomescape.domain.member.MemberRepository; +import roomescape.exception.AuthorizationException; + +import java.util.Date; + +public class JwtAuthManager { + + @Value("${roomescape.auth.jwt.secret}") + private String secretKey; + + @Value("${roomescape.auth.jwt.expire-length}") + private long validityInMilliseconds; + + private final MemberRepository memberRepository; + + public JwtAuthManager(MemberRepository memberRepository) { + this.memberRepository = memberRepository; + } + + public String createToken(String email, String password) { + Member member = memberRepository.findByEmailAndPassword(email, password) + .orElseThrow(() -> new AuthorizationException("유효한 이메일이 아닙니다.")); + + Long memberId = member.getId(); + String role = member.getRole(); + + Claims claims = Jwts.claims().setSubject(String.valueOf(memberId)); + claims.put("role", role); + + Date now = new Date(); + Date validity = new Date(now.getTime() + validityInMilliseconds); + + return Jwts.builder() + .setClaims(claims) + .setIssuedAt(now) + .setExpiration(validity) + .signWith(SignatureAlgorithm.HS256, secretKey) + .compact(); + } + + public Long getId(String token) { + JwtParser parser = Jwts.parserBuilder() + .setSigningKey(secretKey) + .build(); + + Claims claims = parser.parseClaimsJws(token).getBody(); + return Long.parseLong(claims.getSubject()); + } + + public String getRole(String token) { + JwtParser parser = Jwts.parserBuilder() + .setSigningKey(secretKey) + .build(); + + Claims claims = parser.parseClaimsJws(token).getBody(); + return claims.get("role", String.class); + } + + public void validateToken(String token) { + try { + Jws claims = Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token); + + if (claims.getBody().getExpiration().before(new Date())) { + + throw new IllegalArgumentException("토큰이 만료되었습니다."); + } + } catch (JwtException | IllegalArgumentException e) { + throw new IllegalArgumentException("유효하지 않은 토큰입니다.", e); + } + } +} diff --git a/src/main/java/roomescape/authentication/LoginMemberArgumentResolver.java b/src/main/java/auth/LoginMemberArgumentResolver.java similarity index 87% rename from src/main/java/roomescape/authentication/LoginMemberArgumentResolver.java rename to src/main/java/auth/LoginMemberArgumentResolver.java index 32c688e6b..d204a6bf8 100644 --- a/src/main/java/roomescape/authentication/LoginMemberArgumentResolver.java +++ b/src/main/java/auth/LoginMemberArgumentResolver.java @@ -1,19 +1,18 @@ -package roomescape.authentication; +package auth; import jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpServletRequest; import org.springframework.core.MethodParameter; -import org.springframework.stereotype.Component; import org.springframework.web.bind.support.WebDataBinderFactory; import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.method.support.ModelAndViewContainer; -import roomescape.exception.AuthorizationException; import roomescape.domain.member.Member; +import roomescape.exception.AuthorizationException; +import roomescape.service.AuthService; import java.util.Arrays; -@Component public class LoginMemberArgumentResolver implements HandlerMethodArgumentResolver { private final AuthService authService; @@ -34,12 +33,11 @@ public Object resolveArgument(MethodParameter parameter, HttpServletRequest request = (HttpServletRequest) webRequest.getNativeRequest(); String token = extractTokenFromCookies(request.getCookies()); + authService.validateToken(token); - authService.verifyToken(token); - - String email = authService.getEmailFromToken(token); + Long id = authService.extractMemberId(token); - return authService.findLoginMemberByEmail(email); + return authService.findMemberById(id); } private String extractTokenFromCookies(Cookie[] cookies) { diff --git a/src/main/java/roomescape/DataLoader.java b/src/main/java/roomescape/DataLoader.java new file mode 100644 index 000000000..df8f624b0 --- /dev/null +++ b/src/main/java/roomescape/DataLoader.java @@ -0,0 +1,28 @@ +package roomescape; + +import org.springframework.boot.CommandLineRunner; +import org.springframework.context.annotation.Profile; +import org.springframework.stereotype.Component; +import roomescape.domain.member.Member; +import roomescape.domain.member.MemberRepository; + +@Profile("default") // 배포 환경 -> "prod", 로컬 환경 -> "default" +@Component +public class DataLoader implements CommandLineRunner { + private final MemberRepository memberRepository; + + public DataLoader(MemberRepository memberRepository) { + this.memberRepository = memberRepository; + } + + @Override + public void run(String... args) throws Exception { + if (memberRepository.count() == 0) { + Member admin = new Member("어드민", "admin@email.com", "password", "ADMIN"); + Member brown = new Member("브라운", "brown@email.com", "password", "USER"); + memberRepository.save(admin); + memberRepository.save(brown); + System.out.println("초기 사용자 정보가 등록되었습니다."); + } + } +} diff --git a/src/main/java/roomescape/UI/TokenLoginController.java b/src/main/java/roomescape/UI/TokenLoginController.java deleted file mode 100644 index 7c288a485..000000000 --- a/src/main/java/roomescape/UI/TokenLoginController.java +++ /dev/null @@ -1,45 +0,0 @@ -package roomescape.UI; - -import jakarta.servlet.http.Cookie; -import jakarta.servlet.http.HttpServletResponse; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; -import roomescape.application.AuthService; -import roomescape.dto.TokenRequest; -import roomescape.dto.TokenResponse; -import roomescape.member.LoginMember; -import roomescape.member.MemberResponse; - -@RestController -public class TokenLoginController { - private final AuthService authService; - - public TokenLoginController(AuthService authService) { - this.authService = authService; - } - - @PostMapping("/login") - public ResponseEntity tokenLogin(@RequestBody TokenRequest tokenRequest, HttpServletResponse response){ - TokenResponse tokenResponse = authService.createToken(tokenRequest); - - Cookie cookie = new Cookie("token", tokenResponse.getAccessToken()); - cookie.setHttpOnly(true); - cookie.setPath("/"); - response.addCookie(cookie); - - return ResponseEntity.ok().body(tokenResponse); - } - - @GetMapping("/login/check") - public ResponseEntity checkLogin(LoginMember loginMember) { - MemberResponse memberResponse = new MemberResponse( - loginMember.getId(), - loginMember.getName(), - loginMember.getEmail() - ); - return ResponseEntity.ok(memberResponse); - } -} diff --git a/src/main/java/roomescape/application/AuthService.java b/src/main/java/roomescape/application/AuthService.java deleted file mode 100644 index 71dc3b79d..000000000 --- a/src/main/java/roomescape/application/AuthService.java +++ /dev/null @@ -1,58 +0,0 @@ -package roomescape.application; - -import org.springframework.stereotype.Service; -import roomescape.dto.TokenRequest; -import roomescape.dto.TokenResponse; -import roomescape.infrastructure.JwtTokenProvider; -import roomescape.member.LoginMember; -import roomescape.member.Member; -import roomescape.member.MemberDao; - -import static org.springframework.http.HttpStatus.*; - -@Service -public class AuthService { - private final JwtTokenProvider jwtTokenProvider; - private final MemberDao memberDao; - - public AuthService(JwtTokenProvider jwtTokenProvider, MemberDao memberDao) { - this.jwtTokenProvider = jwtTokenProvider; - this.memberDao = memberDao; - } - - public LoginMember findLoginMemberByEmail(String email) { - Member member = memberDao.findByEmail(email); - if (member == null) { - throw new AuthorizationException("사용자를 찾을 수 없습니다.", NOT_FOUND); - } - return new LoginMember(member.getId(), member.getName(), member.getEmail(), member.getRole()); - } - - public String getEmailFromToken(String token) { - return jwtTokenProvider.getPayload(token); - } - - public TokenResponse createToken(TokenRequest tokenRequest) { - if (checkInvalidLogin(tokenRequest.getEmail(), tokenRequest.getPassword())) { - throw new AuthorizationException("유효한 로그인 정보가 아닙니다.", BAD_REQUEST); - } - String accessToken = jwtTokenProvider.createToken(tokenRequest.getEmail()); - return new TokenResponse(accessToken); - } - - public boolean checkInvalidLogin(String email, String password) { - Member member = memberDao.findByEmailAndPassword(email, password); - if (member == null) { - throw new AuthorizationException("이메일 또는 비밀번호가 잘못되었습니다.", UNAUTHORIZED); - } - return false; - } - - public boolean verifyToken(String token) { - try { - return jwtTokenProvider.validateToken(token); - } catch (Exception e) { - return false; - } - } -} diff --git a/src/main/java/roomescape/application/AuthorizationException.java b/src/main/java/roomescape/application/AuthorizationException.java deleted file mode 100644 index 73f6456db..000000000 --- a/src/main/java/roomescape/application/AuthorizationException.java +++ /dev/null @@ -1,18 +0,0 @@ -package roomescape.application; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus -public class AuthorizationException extends RuntimeException { - private final HttpStatus httpStatus; - - public AuthorizationException(String message, HttpStatus httpStatus) { - super(message); - this.httpStatus = httpStatus; - } - - public HttpStatus getHttpStatus() { - return httpStatus; - } -} diff --git a/src/main/java/roomescape/application/GlobalExceptionHandler.java b/src/main/java/roomescape/application/GlobalExceptionHandler.java deleted file mode 100644 index 6387fd40a..000000000 --- a/src/main/java/roomescape/application/GlobalExceptionHandler.java +++ /dev/null @@ -1,16 +0,0 @@ -package roomescape.application; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.RestControllerAdvice; - -@RestControllerAdvice -public class GlobalExceptionHandler { - - @ExceptionHandler(AuthorizationException.class) - public ResponseEntity handleAuthorizationException(AuthorizationException ex) { - return ResponseEntity - .status(ex.getHttpStatus()) - .body("Unauthorized: " + ex.getMessage()); - } -} diff --git a/src/main/java/roomescape/authentication/AuthService.java b/src/main/java/roomescape/authentication/AuthService.java deleted file mode 100644 index fc9eb4c96..000000000 --- a/src/main/java/roomescape/authentication/AuthService.java +++ /dev/null @@ -1,44 +0,0 @@ -package roomescape.authentication; - -import org.springframework.stereotype.Service; -import roomescape.domain.token.TokenRequest; -import roomescape.domain.token.TokenResponse; -import roomescape.exception.AuthorizationException; -import roomescape.domain.member.Member; -import roomescape.domain.member.MemberRepository; - -@Service -public class AuthService { - private final JwtTokenProvider jwtTokenProvider; - private final MemberRepository memberRepository; - - public AuthService(JwtTokenProvider jwtTokenProvider, MemberRepository memberRepository) { - this.jwtTokenProvider = jwtTokenProvider; - this.memberRepository = memberRepository; - } - - public Member findLoginMemberByEmail(String email) { - return memberRepository.findByEmail(email) - .orElseThrow(() -> new AuthorizationException("사용자를 찾을 수 없습니다.")); - } - - public String getEmailFromToken(String token) { - return jwtTokenProvider.getPayload(token); - } - - public TokenResponse createToken(TokenRequest tokenRequest) { - checkInvalidLogin(tokenRequest.getEmail(), tokenRequest.getPassword()); - - String accessToken = jwtTokenProvider.createToken(tokenRequest.getEmail()); - return new TokenResponse(accessToken); - } - - public void checkInvalidLogin(String email, String password) { - Member member = memberRepository.findByEmailAndPassword(email, password) - .orElseThrow(() -> new AuthorizationException("이메일 또는 비밀번호가 잘못되었습니다.")); - } - - public void verifyToken(String token) { - jwtTokenProvider.validateToken(token); - } -} diff --git a/src/main/java/roomescape/authentication/AuthorizationExtractor.java b/src/main/java/roomescape/authentication/AuthorizationExtractor.java deleted file mode 100644 index f175b39b3..000000000 --- a/src/main/java/roomescape/authentication/AuthorizationExtractor.java +++ /dev/null @@ -1,9 +0,0 @@ -package roomescape.authentication; - -import jakarta.servlet.http.HttpServletRequest; - -public interface AuthorizationExtractor { - String AUTHORIZATION = "Authorization"; - - T extract(HttpServletRequest request); -} diff --git a/src/main/java/roomescape/authentication/BearerAuthorizationExtractor.java b/src/main/java/roomescape/authentication/BearerAuthorizationExtractor.java deleted file mode 100644 index 5be0b482a..000000000 --- a/src/main/java/roomescape/authentication/BearerAuthorizationExtractor.java +++ /dev/null @@ -1,28 +0,0 @@ -package roomescape.authentication; - -import jakarta.servlet.http.HttpServletRequest; - -import java.util.Enumeration; - -public class BearerAuthorizationExtractor implements AuthorizationExtractor { - private static final String BEARER_TYPE = "Bearer"; - private static final String ACCESS_TOKEN_TYPE = BearerAuthorizationExtractor.class.getSimpleName() + ".ACCESS_TOKEN_TYPE"; - - @Override - public String extract(HttpServletRequest request) { - Enumeration headers = request.getHeaders(AUTHORIZATION); - while (headers.hasMoreElements()) { - String value = headers.nextElement(); - if ((value.toLowerCase().startsWith(BEARER_TYPE.toLowerCase()))) { - String authHeaderValue = value.substring(BEARER_TYPE.length()).trim(); - request.setAttribute(ACCESS_TOKEN_TYPE, value.substring(0, BEARER_TYPE.length()).trim()); - int commaIndex = authHeaderValue.indexOf(','); - if (commaIndex > 0) { - authHeaderValue = authHeaderValue.substring(0, commaIndex); - } - return authHeaderValue; - } - } - return null; - } -} diff --git a/src/main/java/roomescape/authentication/JwtTokenProvider.java b/src/main/java/roomescape/authentication/JwtTokenProvider.java deleted file mode 100644 index 69551306e..000000000 --- a/src/main/java/roomescape/authentication/JwtTokenProvider.java +++ /dev/null @@ -1,44 +0,0 @@ -package roomescape.authentication; - -import io.jsonwebtoken.*; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import java.util.Date; - -@Component -public class JwtTokenProvider { - @Value("${roomescape.auth.jwt.secret}") - private String secretKey; - - @Value("${roomescape.auth.jwt.expire-length}") - private long validityInMilliseconds; - - public String createToken(String payload) { - Claims claims = Jwts.claims().setSubject(payload); - Date now = new Date(); - Date validity = new Date(now.getTime() + validityInMilliseconds); - return Jwts.builder() - .setClaims(claims) - .setIssuedAt(now) - .setExpiration(validity) - .signWith(SignatureAlgorithm.HS256, secretKey) - .compact(); - } - - public String getPayload(String token) { - return Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token).getBody().getSubject(); - } - - public void validateToken(String token) { - try { - Jws claims = Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token); - if (claims.getBody().getExpiration().before(new Date())) { - throw new IllegalArgumentException("토큰이 만료되었습니다."); - } - } catch (JwtException | IllegalArgumentException e) { - throw new IllegalArgumentException("유효하지 않은 토큰 입니다.", e); - } - } - -} diff --git a/src/main/java/roomescape/config/WebConfig.java b/src/main/java/roomescape/config/WebConfig.java deleted file mode 100644 index 5920a6199..000000000 --- a/src/main/java/roomescape/config/WebConfig.java +++ /dev/null @@ -1,32 +0,0 @@ -package roomescape.config; - -import org.springframework.context.annotation.Configuration; -import org.springframework.web.method.support.HandlerMethodArgumentResolver; -import org.springframework.web.servlet.config.annotation.InterceptorRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import roomescape.application.AuthService; -import roomescape.security.AdminAccessInterceptor; -import roomescape.web.LoginMemberArgumentResolver; - -import java.util.List; - -@Configuration -public class WebConfig implements WebMvcConfigurer { - private final AuthService authService; - - public WebConfig(AuthService authService) { - this.authService = authService; - } - - @Override - public void addArgumentResolvers(List resolvers) { - resolvers.add(new LoginMemberArgumentResolver(authService)); - } - - @Override - public void addInterceptors(InterceptorRegistry registry) { - registry.addInterceptor(new AdminAccessInterceptor(authService)) - .addPathPatterns("/admin/**") - .excludePathPatterns("/login"); - } -} diff --git a/src/main/java/roomescape/config/WebMvcConfig.java b/src/main/java/roomescape/config/WebMvcConfig.java index c0082a487..cce94af0b 100644 --- a/src/main/java/roomescape/config/WebMvcConfig.java +++ b/src/main/java/roomescape/config/WebMvcConfig.java @@ -1,16 +1,18 @@ package roomescape.config; +import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import roomescape.authentication.AuthService; -import roomescape.authentication.AdminAccessInterceptor; -import roomescape.authentication.LoginMemberArgumentResolver; +import auth.AdminAccessInterceptor; +import auth.LoginMemberArgumentResolver; +import roomescape.service.AuthService; import java.util.List; -@Configuration // -> class level, @Bean -> method level +@Configuration +@ComponentScan(basePackages = {"roomescape", "auth"}) public class WebMvcConfig implements WebMvcConfigurer { private final AuthService authService; @@ -26,7 +28,6 @@ public void addArgumentResolvers(List resolvers) @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new AdminAccessInterceptor(authService)) - .addPathPatterns("/admin/**") - .excludePathPatterns("/login"); + .addPathPatterns("/admin/**"); } } diff --git a/src/main/java/roomescape/controller/LoginController.java b/src/main/java/roomescape/controller/LoginController.java new file mode 100644 index 000000000..87c03a6b6 --- /dev/null +++ b/src/main/java/roomescape/controller/LoginController.java @@ -0,0 +1,55 @@ +package roomescape.controller; + +import auth.JwtAuthManager; +import jakarta.servlet.http.Cookie; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import roomescape.domain.login.LoginCheckResponse; +import roomescape.domain.login.LoginRequest; +import roomescape.domain.member.Member; +import roomescape.service.LoginService; + +@RestController +public class LoginController { + private final JwtAuthManager jwtAuthManager; + private final LoginService loginService; + + public LoginController(JwtAuthManager jwtAuthManager, LoginService loginService) { + this.jwtAuthManager = jwtAuthManager; + this.loginService = loginService; + } + + @PostMapping("/login") + public ResponseEntity login(@RequestBody LoginRequest loginRequest, HttpServletResponse response) { + String token = jwtAuthManager.createToken(loginRequest.email(), loginRequest.password()); + + Cookie cookie = new Cookie("token", token); + cookie.setHttpOnly(true); + cookie.setPath("/"); + response.addCookie(cookie); + + return ResponseEntity.ok().build(); + } + + @GetMapping("/login/check") + public ResponseEntity checkLogin(Member loginMember) { + + LoginCheckResponse loginCheckResponse = new LoginCheckResponse(loginService.findMemberName(loginMember.getId())); + + return ResponseEntity.ok().body(loginCheckResponse); + } + + @PostMapping("/logout") + public ResponseEntity logout(HttpServletResponse response) { + Cookie cookie = new Cookie("token", ""); + cookie.setHttpOnly(true); + cookie.setPath("/"); + cookie.setMaxAge(0); + response.addCookie(cookie); + return ResponseEntity.ok().build(); + } +} diff --git a/src/main/java/roomescape/controller/MemberController.java b/src/main/java/roomescape/controller/MemberController.java index 4c2bf555e..dd94f2dbe 100644 --- a/src/main/java/roomescape/controller/MemberController.java +++ b/src/main/java/roomescape/controller/MemberController.java @@ -1,7 +1,5 @@ package roomescape.controller; -import jakarta.servlet.http.Cookie; -import jakarta.servlet.http.HttpServletResponse; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -23,16 +21,6 @@ public MemberController(MemberService memberService) { @PostMapping("/members") public ResponseEntity createMember(@RequestBody MemberRequest memberRequest) { MemberResponse member = memberService.createMember(memberRequest); - return ResponseEntity.created(URI.create("/members/" + member.getId())).body(member); - } - - @PostMapping("/logout") - public ResponseEntity logout(HttpServletResponse response) { - Cookie cookie = new Cookie("token", ""); - cookie.setHttpOnly(true); - cookie.setPath("/"); - cookie.setMaxAge(0); - response.addCookie(cookie); - return ResponseEntity.ok().build(); + return ResponseEntity.created(URI.create("/members/" + member.id())).body(member); } } diff --git a/src/main/java/roomescape/controller/ReservationController.java b/src/main/java/roomescape/controller/ReservationController.java index b74f9cb84..f126abc7c 100644 --- a/src/main/java/roomescape/controller/ReservationController.java +++ b/src/main/java/roomescape/controller/ReservationController.java @@ -40,20 +40,13 @@ public List myList(Member loginMember) { @PostMapping("/reservations") public ResponseEntity create(@RequestBody ReservationRequest reservationRequest, Member loginMember) { - reservationService.checkReservationRequest(reservationRequest); - - reservationService.checkNameExistence(reservationRequest, loginMember); - reservationService.validateReservationRequest(reservationRequest); - Member member = memberRepository.findByName(reservationRequest.getName()) - .orElseThrow(() -> new IllegalArgumentException("해당 이름을 가진 사용자를 찾을 수 없습니다.")); - - reservationRequest.setMemberId(member.getId()); + reservationService.checkReservationRequest(reservationRequest); - ReservationResponse reservation = reservationService.save(reservationRequest); + ReservationResponse reservationResponse = reservationService.save(reservationRequest, loginMember); - return ResponseEntity.created(URI.create("/reservations/" + reservation.getId())).body(reservation); + return ResponseEntity.created(URI.create("/reservations/" + reservationResponse.id())).body(reservationResponse); } @DeleteMapping("/reservations/{id}") diff --git a/src/main/java/roomescape/domain/theme/ThemeController.java b/src/main/java/roomescape/controller/ThemeController.java similarity index 91% rename from src/main/java/roomescape/domain/theme/ThemeController.java rename to src/main/java/roomescape/controller/ThemeController.java index 1599d2967..f0ba155d5 100644 --- a/src/main/java/roomescape/domain/theme/ThemeController.java +++ b/src/main/java/roomescape/controller/ThemeController.java @@ -1,4 +1,4 @@ -package roomescape.domain.theme; +package roomescape.controller; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; @@ -7,6 +7,8 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; +import roomescape.domain.theme.Theme; +import roomescape.domain.theme.ThemeRepository; import java.net.URI; import java.util.List; @@ -19,17 +21,17 @@ public ThemeController(ThemeRepository themeRepository) { this.themeRepository = themeRepository; } + @GetMapping("/themes") + public ResponseEntity> list() { + return ResponseEntity.ok(themeRepository.findAll()); + } + @PostMapping("/themes") public ResponseEntity createTheme(@RequestBody Theme theme) { Theme newTheme = themeRepository.save(theme); return ResponseEntity.created(URI.create("/themes/" + newTheme.getId())).body(newTheme); } - @GetMapping("/themes") - public ResponseEntity> list() { - return ResponseEntity.ok(themeRepository.findAll()); - } - @DeleteMapping("/themes/{id}") public ResponseEntity deleteTheme(@PathVariable Long id) { themeRepository.deleteById(id); diff --git a/src/main/java/roomescape/domain/time/TimeController.java b/src/main/java/roomescape/controller/TimeController.java similarity index 87% rename from src/main/java/roomescape/domain/time/TimeController.java rename to src/main/java/roomescape/controller/TimeController.java index e7411130e..d89671fc7 100644 --- a/src/main/java/roomescape/domain/time/TimeController.java +++ b/src/main/java/roomescape/controller/TimeController.java @@ -1,4 +1,4 @@ -package roomescape.domain.time; +package roomescape.controller; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; @@ -8,6 +8,9 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import roomescape.domain.time.AvailableTime; +import roomescape.domain.time.Time; +import roomescape.domain.time.TimeService; import java.net.URI; import java.util.List; @@ -27,7 +30,7 @@ public List