Skip to content

Commit d41914a

Browse files
authored
Merge pull request #15 from Dalguring/feature/auth
feat : auth/me api 뼈대 및 문서화
2 parents 52e6edd + 6eee8db commit d41914a

File tree

5 files changed

+128
-0
lines changed

5 files changed

+128
-0
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.rentify.rentify_api.user.controller;
2+
3+
import com.rentify.rentify_api.user.dto.AuthMeResponse;
4+
import io.swagger.v3.oas.annotations.Operation;
5+
import io.swagger.v3.oas.annotations.media.Content;
6+
import io.swagger.v3.oas.annotations.media.Schema;
7+
import io.swagger.v3.oas.annotations.responses.ApiResponse;
8+
import io.swagger.v3.oas.annotations.responses.ApiResponses;
9+
import io.swagger.v3.oas.annotations.tags.Tag;
10+
import org.springframework.http.ResponseEntity;
11+
12+
@Tag(name = "Auth", description = "인증 API")
13+
public interface AuthApi {
14+
15+
@Operation(summary = "내 정보 조회", description = "JWT로 현재 로그인 사용자 확인")
16+
@ApiResponses({
17+
@ApiResponse(responseCode = "200", description = "인증 성공"),
18+
@ApiResponse(responseCode = "401", description = "Access Token 만료",
19+
content = @Content(schema = @Schema(example = """
20+
{
21+
"code": "TOKEN_EXPIRED",
22+
"message": "Access token expired"
23+
}
24+
"""))),
25+
@ApiResponse(responseCode = "401", description = "유효하지 않은 토큰",
26+
content = @Content(schema = @Schema(example = """
27+
{
28+
"code": "INVALID_TOKEN",
29+
"message": "Invalid token"
30+
}
31+
""")))
32+
})
33+
ResponseEntity<AuthMeResponse> me();
34+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.rentify.rentify_api.user.controller;
2+
3+
4+
import com.rentify.rentify_api.user.dto.AuthMeResponse;
5+
import com.rentify.rentify_api.user.service.AuthService;
6+
import lombok.RequiredArgsConstructor;
7+
import org.springframework.http.ResponseEntity;
8+
import org.springframework.web.bind.annotation.GetMapping;
9+
import org.springframework.web.bind.annotation.RequestMapping;
10+
import org.springframework.web.bind.annotation.RestController;
11+
12+
@RestController
13+
@RequiredArgsConstructor
14+
@RequestMapping("/auth")
15+
public class AuthController implements AuthApi {
16+
17+
private final AuthService authService;
18+
19+
@Override
20+
@GetMapping("/me")
21+
public ResponseEntity<AuthMeResponse> me() {
22+
return ResponseEntity.ok(authService.getMe());
23+
}
24+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.rentify.rentify_api.user.dto;
2+
3+
import com.rentify.rentify_api.user.entity.User;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Getter;
6+
7+
@Getter
8+
@AllArgsConstructor
9+
public class AuthMeResponse {
10+
11+
private Long userId;
12+
private String email;
13+
private String name;
14+
15+
public static AuthMeResponse from(User user) {
16+
return new AuthMeResponse(
17+
user.getId(),
18+
user.getEmail(),
19+
user.getName()
20+
);
21+
}
22+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.rentify.rentify_api.user.exception;
2+
3+
public class UnauthenticatedException extends RuntimeException {
4+
5+
public UnauthenticatedException() {
6+
super("인증되지 않은 사용자입ㄴ디ㅏ.");
7+
}
8+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.rentify.rentify_api.user.service;
2+
3+
import com.rentify.rentify_api.user.dto.AuthMeResponse;
4+
import com.rentify.rentify_api.user.entity.User;
5+
import com.rentify.rentify_api.user.exception.UnauthenticatedException;
6+
import com.rentify.rentify_api.user.exception.UserNotFoundException;
7+
import com.rentify.rentify_api.user.repository.UserRepository;
8+
import lombok.RequiredArgsConstructor;
9+
import org.springframework.security.core.Authentication;
10+
import org.springframework.security.core.context.SecurityContextHolder;
11+
import org.springframework.stereotype.Service;
12+
import org.springframework.transaction.annotation.Transactional;
13+
14+
@Service
15+
@RequiredArgsConstructor
16+
@Transactional(readOnly = true)
17+
public class AuthService {
18+
19+
private final UserRepository userRepository;
20+
21+
public AuthMeResponse getMe() {
22+
Long userId = getCurrentUserId();
23+
24+
User user = userRepository.findById(userId)
25+
.orElseThrow(UserNotFoundException::new);
26+
27+
return AuthMeResponse.from(user);
28+
}
29+
30+
private Long getCurrentUserId() {
31+
Authentication authentication =
32+
SecurityContextHolder.getContext().getAuthentication();
33+
34+
if (authentication == null || !authentication.isAuthenticated()) {
35+
throw new UnauthenticatedException();
36+
}
37+
38+
return (Long) authentication.getPrincipal();
39+
}
40+
}

0 commit comments

Comments
 (0)