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
Original file line number Diff line number Diff line change
@@ -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);
}
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

admin 로그인도 auth 부분이라 auth_member에 있어도 될 것 같아요.

Original file line number Diff line number Diff line change
@@ -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<Void> 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();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.flytrap.venusplanner.api.admin.presentation.dto.request;

public record AdminSignInRequest(
String code
) {
}
2 changes: 1 addition & 1 deletion src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Original file line number Diff line number Diff line change
@@ -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);
}
}
15 changes: 13 additions & 2 deletions src/test/java/com/flytrap/venusplanner/global/AcceptanceTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -18,6 +21,9 @@
@Sql("classpath:reset.sql")
public abstract class AcceptanceTest {

@Autowired
protected AdminProperties adminProperties;

@LocalServerPort
private int port;

Expand All @@ -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<Response> 어드민_로그인_요청() {
return givenJsonRequest()
.body(new AdminSignInRequest(adminProperties.code()))
.when().post("/api/v1/admin/sign-in")
.then().log().all().extract();
}

protected void 응답_상태코드_검증(ExtractableResponse<Response> response, HttpStatus httpStatus) {
assertThat(response.statusCode()).isEqualTo(httpStatus.value());
}
Expand Down
2 changes: 1 addition & 1 deletion submodule