Skip to content

Commit e060afc

Browse files
committed
feat: 유저 로그인 기능 구현
1 parent a5c228b commit e060afc

File tree

15 files changed

+262
-2
lines changed

15 files changed

+262
-2
lines changed

src/main/java/com/ftm/server/adapter/controller/auth/.gitkeep

Whitespace-only changes.
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.ftm.server.adapter.controller.auth;
2+
3+
import com.ftm.server.adapter.dto.request.UserLoginRequest;
4+
import com.ftm.server.adapter.dto.response.UserLoginResponse;
5+
import com.ftm.server.common.response.ApiResponse;
6+
import com.ftm.server.common.response.enums.SuccessResponseCode;
7+
import com.ftm.server.domain.dto.command.UserLoginCommand;
8+
import com.ftm.server.domain.usecase.auth.UserLoginUseCase;
9+
import jakarta.servlet.http.HttpServletRequest;
10+
import jakarta.servlet.http.HttpServletResponse;
11+
import lombok.RequiredArgsConstructor;
12+
import org.springframework.http.HttpStatus;
13+
import org.springframework.http.ResponseEntity;
14+
import org.springframework.web.bind.annotation.PostMapping;
15+
import org.springframework.web.bind.annotation.RequestBody;
16+
import org.springframework.web.bind.annotation.RestController;
17+
18+
@RestController
19+
@RequiredArgsConstructor
20+
public class UserLoginController {
21+
22+
private final UserLoginUseCase loginUseCase;
23+
24+
@PostMapping("/api/auth/login")
25+
public ResponseEntity<ApiResponse<UserLoginResponse>> login(
26+
@RequestBody UserLoginRequest request,
27+
HttpServletRequest req,
28+
HttpServletResponse res) {
29+
return ResponseEntity.status(HttpStatus.OK)
30+
.body(
31+
ApiResponse.success(
32+
SuccessResponseCode.OK,
33+
UserLoginResponse.from(
34+
loginUseCase.login(
35+
UserLoginCommand.from(request), req, res))));
36+
}
37+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.ftm.server.adapter.dto.request;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Getter;
5+
6+
@Getter
7+
@AllArgsConstructor
8+
public class UserLoginRequest {
9+
10+
private final String email;
11+
private final String password;
12+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.ftm.server.adapter.dto.response;
2+
3+
import com.fasterxml.jackson.annotation.JsonFormat;
4+
import com.ftm.server.domain.dto.vo.UserSummaryVo;
5+
import java.time.LocalDateTime;
6+
import lombok.Getter;
7+
8+
@Getter
9+
public class UserLoginResponse {
10+
11+
private final Long id;
12+
private final String nickname;
13+
private final String profileImageUrl;
14+
private final String mildLevelName;
15+
private final String spicyLevelName;
16+
17+
@JsonFormat(pattern = "yyyy-MM-dd HH:mm", shape = JsonFormat.Shape.STRING)
18+
private final LocalDateTime loginTime;
19+
20+
UserLoginResponse(UserSummaryVo userSummaryVo) {
21+
this.id = userSummaryVo.getId();
22+
this.nickname = userSummaryVo.getNickname();
23+
this.profileImageUrl = userSummaryVo.getProfileImageUrl();
24+
this.mildLevelName = userSummaryVo.getMildLevelName();
25+
this.spicyLevelName = userSummaryVo.getSpicyLevelName();
26+
this.loginTime = LocalDateTime.now();
27+
}
28+
29+
public static UserLoginResponse from(UserSummaryVo userSummaryVo) {
30+
return new UserLoginResponse(userSummaryVo);
31+
}
32+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.ftm.server.adapter.gateway.repository;
2+
3+
import com.ftm.server.entity.entities.UserImage;
4+
import java.util.Optional;
5+
import org.springframework.data.jpa.repository.JpaRepository;
6+
7+
public interface UserImageRepository extends JpaRepository<UserImage, Long> {
8+
9+
Optional<UserImage> findByUserId(Long userId);
10+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package com.ftm.server.adapter.gateway.repository;
22

33
import com.ftm.server.entity.entities.User;
4+
import java.util.Optional;
45
import org.springframework.data.jpa.repository.JpaRepository;
56

67
public interface UserRepository extends JpaRepository<User, Long> {
78

89
Boolean existsByEmail(String email);
10+
11+
Optional<User> findByEmail(String email);
912
}

src/main/java/com/ftm/server/common/response/enums/ErrorResponseCode.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ public enum ErrorResponseCode {
1212

1313
// 401번
1414
NOT_AUTHENTICATED(HttpStatus.UNAUTHORIZED, "E401_001", "인증되지 않은 사용자입니다."),
15+
INVALID_CREDENTIALS(HttpStatus.UNAUTHORIZED, "E401_002", "인증에 실패하였습니다."),
1516

1617
// 403번
1718
NOT_AUTHORIZATION(HttpStatus.FORBIDDEN, "E403_001", "인증된 사용자이나 해당 자원에 대한 접근 권한이 없습니다."),
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.ftm.server.domain.dto.command;
2+
3+
import com.ftm.server.adapter.dto.request.UserLoginRequest;
4+
import lombok.Getter;
5+
6+
@Getter
7+
public class UserLoginCommand {
8+
9+
private final String email;
10+
private final String password;
11+
12+
private UserLoginCommand(String email, String password) {
13+
this.email = email;
14+
this.password = password;
15+
}
16+
17+
public static UserLoginCommand from(UserLoginRequest request) {
18+
return new UserLoginCommand(request.getEmail(), request.getPassword());
19+
}
20+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.ftm.server.domain.dto.query;
2+
3+
import lombok.Getter;
4+
5+
@Getter
6+
public class FindByIdQuery {
7+
8+
private final Long id;
9+
10+
private FindByIdQuery(Long id) {
11+
this.id = id;
12+
}
13+
14+
public static FindByIdQuery of(Long id) {
15+
return new FindByIdQuery(id);
16+
}
17+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.ftm.server.domain.dto.query;
2+
3+
import lombok.Getter;
4+
5+
@Getter
6+
public class FindByUserIdQuery {
7+
8+
private final Long userId;
9+
10+
private FindByUserIdQuery(Long userId) {
11+
this.userId = userId;
12+
}
13+
14+
public static FindByUserIdQuery of(Long userId) {
15+
return new FindByUserIdQuery(userId);
16+
}
17+
}

0 commit comments

Comments
 (0)