package roomescape.auth.web import io.swagger.v3.oas.annotations.Operation import io.swagger.v3.oas.annotations.Parameter import io.swagger.v3.oas.annotations.media.Content import io.swagger.v3.oas.annotations.media.Schema import io.swagger.v3.oas.annotations.responses.ApiResponse import io.swagger.v3.oas.annotations.responses.ApiResponses import io.swagger.v3.oas.annotations.tags.Tag import jakarta.servlet.http.HttpServletRequest import jakarta.servlet.http.HttpServletResponse import jakarta.validation.Valid import org.springframework.http.HttpStatus import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.ResponseStatus import roomescape.auth.web.support.LoginRequired import roomescape.auth.web.support.MemberId import roomescape.common.dto.response.RoomescapeErrorResponse import roomescape.common.dto.response.RoomescapeApiResponse @Tag(name = "1. 인증 / 인가 API", description = "로그인, 로그아웃 및 로그인 상태를 확인합니다") interface AuthAPI { @ResponseStatus(HttpStatus.OK) @Operation(summary = "로그인") @ApiResponses( ApiResponse( responseCode = "200", description = "로그인 성공시 쿠키에 토큰 정보를 저장합니다." ), ApiResponse( responseCode = "400", description = "존재하지 않는 회원이거나, 이메일 또는 비밀번호가 잘못 입력되었습니다.", content = [Content(schema = Schema(implementation = RoomescapeErrorResponse::class))] ) ) fun login( @Valid @RequestBody loginRequest: LoginRequest, response: HttpServletResponse ): RoomescapeApiResponse @ResponseStatus(HttpStatus.OK) @Operation(summary = "로그인 상태 확인") @ApiResponses( ApiResponse( responseCode = "200", description = "로그인 상태이며, 로그인된 회원의 이름을 반환합니다." ), ApiResponse( responseCode = "400", description = "쿠키에 있는 토큰 정보로 회원을 조회할 수 없습니다.", content = [Content(schema = Schema(implementation = RoomescapeErrorResponse::class))] ), ApiResponse( responseCode = "401", description = "토큰 정보가 없거나, 만료되었습니다.", content = [Content(schema = Schema(implementation = RoomescapeErrorResponse::class))] ) ) fun checkLogin(@MemberId @Parameter(hidden = true) memberId: Long): RoomescapeApiResponse @LoginRequired @ResponseStatus(HttpStatus.OK) @Operation(summary = "로그아웃", tags = ["로그인이 필요한 API"]) @ApiResponses(ApiResponse(responseCode = "200", description = "로그아웃 성공시 쿠키에 저장된 토큰 정보를 삭제합니다.")) fun logout(request: HttpServletRequest, response: HttpServletResponse): RoomescapeApiResponse }