diff --git a/src/main/java/com/flytrap/venusplanner/api/admin/domain/AdminProperties.java b/src/main/java/com/flytrap/venusplanner/api/admin/domain/AdminProperties.java new file mode 100644 index 0000000..54f19bf --- /dev/null +++ b/src/main/java/com/flytrap/venusplanner/api/admin/domain/AdminProperties.java @@ -0,0 +1,19 @@ +package com.flytrap.venusplanner.api.admin.domain; + +import com.flytrap.venusplanner.global.auth.dto.SessionMember; +import org.springframework.boot.context.properties.ConfigurationProperties; + +@ConfigurationProperties(prefix = "admin") +public record AdminProperties( + String code, + Long id +) { + + public boolean isAdminCode(String code) { + return this.code.equals(code); + } + + public SessionMember toSessionMember() { + return new SessionMember(id); + } +} diff --git a/src/main/java/com/flytrap/venusplanner/api/admin/presentation/controller/AdminController.java b/src/main/java/com/flytrap/venusplanner/api/admin/presentation/controller/AdminController.java new file mode 100644 index 0000000..4086e50 --- /dev/null +++ b/src/main/java/com/flytrap/venusplanner/api/admin/presentation/controller/AdminController.java @@ -0,0 +1,31 @@ +package com.flytrap.venusplanner.api.admin.presentation.controller; + +import com.flytrap.venusplanner.api.admin.domain.AdminProperties; +import com.flytrap.venusplanner.api.admin.presentation.dto.request.AdminSignInRequest; +import jakarta.servlet.http.HttpSession; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +public class AdminController { + + private final AdminProperties adminProperties; + + @PostMapping("/api/v1/admin/sign-in") + public ResponseEntity signIn( + @RequestBody AdminSignInRequest request, + HttpSession httpSession + ) { + if (adminProperties.isAdminCode(request.code())) { + httpSession.setAttribute("admin", adminProperties.toSessionMember()); + + return ResponseEntity.ok().build(); + } + return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); + } +} diff --git a/src/main/java/com/flytrap/venusplanner/api/admin/presentation/dto/request/AdminSignInRequest.java b/src/main/java/com/flytrap/venusplanner/api/admin/presentation/dto/request/AdminSignInRequest.java new file mode 100644 index 0000000..eb92975 --- /dev/null +++ b/src/main/java/com/flytrap/venusplanner/api/admin/presentation/dto/request/AdminSignInRequest.java @@ -0,0 +1,6 @@ +package com.flytrap.venusplanner.api.admin.presentation.dto.request; + +public record AdminSignInRequest( + String code +) { +} diff --git a/src/test/resources/application.yml b/src/main/resources/application-test.yml similarity index 100% rename from src/test/resources/application.yml rename to src/main/resources/application-test.yml diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 189506c..36913b8 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -4,6 +4,6 @@ spring: group: local: [ local, oauth-local ] # localhost prod: [ prod ] # aws ec2 - include: [ auth ] + include: [ auth, admin ] jpa: open-in-view: false diff --git a/src/test/java/com/flytrap/venusplanner/acceptance/admin/AdminTest.java b/src/test/java/com/flytrap/venusplanner/acceptance/admin/AdminTest.java new file mode 100644 index 0000000..f2c8190 --- /dev/null +++ b/src/test/java/com/flytrap/venusplanner/acceptance/admin/AdminTest.java @@ -0,0 +1,32 @@ +package com.flytrap.venusplanner.acceptance.admin; + +import com.flytrap.venusplanner.api.admin.presentation.dto.request.AdminSignInRequest; +import com.flytrap.venusplanner.global.AcceptanceTest; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.http.HttpStatus; + +@DisplayName("[인수테스트] Admin 로그인 성공/실패 케이스") +public class AdminTest extends AcceptanceTest { + + @Test + void 어드민_로그인_시_성공한다() { + // when + var response = 어드민_로그인_요청(); + + // then + 응답_상태코드_검증(response, HttpStatus.OK); + } + + @Test + void 어드민_로그인_시_잘못된_코드로_요청하면_실패한다() { + // when + var response = givenJsonRequest() + .body(new AdminSignInRequest("code")) + .when().post("/api/v1/admin/sign-in") + .then().log().all().extract(); + + // then + 응답_상태코드_검증(response, HttpStatus.UNAUTHORIZED); + } +} diff --git a/src/test/java/com/flytrap/venusplanner/global/AcceptanceTest.java b/src/test/java/com/flytrap/venusplanner/global/AcceptanceTest.java index 5d4267a..8e47d39 100644 --- a/src/test/java/com/flytrap/venusplanner/global/AcceptanceTest.java +++ b/src/test/java/com/flytrap/venusplanner/global/AcceptanceTest.java @@ -2,11 +2,14 @@ import static org.assertj.core.api.Assertions.assertThat; +import com.flytrap.venusplanner.api.admin.domain.AdminProperties; +import com.flytrap.venusplanner.api.admin.presentation.dto.request.AdminSignInRequest; import io.restassured.RestAssured; import io.restassured.response.ExtractableResponse; import io.restassured.response.Response; import io.restassured.specification.RequestSpecification; import org.junit.jupiter.api.BeforeEach; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.boot.test.web.server.LocalServerPort; @@ -18,6 +21,9 @@ @Sql("classpath:reset.sql") public abstract class AcceptanceTest { + @Autowired + protected AdminProperties adminProperties; + @LocalServerPort private int port; @@ -26,14 +32,19 @@ void setUp() { RestAssured.port = port; } - // TODO:로그인 로직 - protected static RequestSpecification givenJsonRequest() { return RestAssured.given().log().all() .accept(MediaType.APPLICATION_JSON_VALUE) .contentType(MediaType.APPLICATION_JSON_VALUE); } + protected ExtractableResponse 어드민_로그인_요청() { + return givenJsonRequest() + .body(new AdminSignInRequest(adminProperties.code())) + .when().post("/api/v1/admin/sign-in") + .then().log().all().extract(); + } + protected void 응답_상태코드_검증(ExtractableResponse response, HttpStatus httpStatus) { assertThat(response.statusCode()).isEqualTo(httpStatus.value()); } diff --git a/submodule b/submodule index ca9c9a9..7ff88ee 160000 --- a/submodule +++ b/submodule @@ -1 +1 @@ -Subproject commit ca9c9a9e02ea18d94add396db543bd4318cb427e +Subproject commit 7ff88ee9285d6464e78637864b2abb46bb83ec7d