Skip to content

Commit

Permalink
fix: #234 conflict 해결
Browse files Browse the repository at this point in the history
  • Loading branch information
park0jae committed Jan 12, 2024
2 parents e76ce80 + 38c52e9 commit fffd096
Show file tree
Hide file tree
Showing 26 changed files with 419 additions and 123 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -25,17 +25,21 @@
import com.pgms.coredomain.response.ApiResponse;
import com.pgms.coresecurity.security.resolver.CurrentAccount;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;

@RestController
@RequestMapping("/api/v1/bookings")
@RequiredArgsConstructor
@Tag(name = "예매")
public class BookingController {

private final BookingService bookingService;

@Operation(summary = "예매 생성")
@PostMapping("/create")
public ResponseEntity<ApiResponse<BookingCreateResponse>> createBooking(
@CurrentAccount Long memberId,
Expand All @@ -52,6 +56,7 @@ public ResponseEntity<ApiResponse<BookingCreateResponse>> createBooking(
return ResponseEntity.created(location).body(response);
}

@Operation(summary = "예매 취소")
@PostMapping("/{id}/cancel")
public ResponseEntity<Void> cancelBooking(
@CurrentAccount Long memberId,
Expand All @@ -61,12 +66,14 @@ public ResponseEntity<Void> cancelBooking(
return ResponseEntity.noContent().build();
}

@Operation(summary = "예매 이탈")
@PostMapping("/{id}/exit")
public ResponseEntity<Void> exitBooking(@PathVariable String id) {
bookingService.exitBooking(id);
return ResponseEntity.noContent().build();
}

@Operation(summary = "내 예매 목록 조회")
@GetMapping
public ResponseEntity<ApiResponse<PageResponse<BookingsGetResponse>>> getBookings(
@CurrentAccount Long memberId,
Expand All @@ -78,6 +85,7 @@ public ResponseEntity<ApiResponse<PageResponse<BookingsGetResponse>>> getBooking
return ResponseEntity.ok().body(response);
}

@Operation(summary = "내 예매 상세 조회")
@GetMapping("/{id}")
public ResponseEntity<ApiResponse<BookingGetResponse>> getBooking(
@CurrentAccount Long memberId,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,41 +18,49 @@
import com.pgms.apibooking.domain.bookingqueue.service.BookingQueueService;
import com.pgms.coredomain.response.ApiResponse;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;

@RestController
@RequestMapping("/api/v1/bookings")
@RequiredArgsConstructor
@Tag(name = "예매 대기열")
public class BookingQueueController {

private final BookingQueueService bookingQueueService;

@Operation(summary = "세션 아이디 발급")
@PostMapping("/issue-session-id")
public ResponseEntity<ApiResponse<SessionIdIssueResponse>> issueSessionId() {
ApiResponse<SessionIdIssueResponse> response = ApiResponse.ok(bookingQueueService.issueSessionId());
return ResponseEntity.ok(response);
}

@Operation(summary = "대기열 진입")
@PostMapping("/enter-queue")
public ResponseEntity<Void> enterQueue(@RequestBody @Valid BookingQueueEnterRequest request, @RequestAttribute("bookingSessionId") String bookingSessionId) {
bookingQueueService.enterQueue(request, bookingSessionId);
return ResponseEntity.noContent().build();
}

@Operation(summary = "내 대기 순서 확인")
@GetMapping("/order-in-queue")
public ResponseEntity<ApiResponse<OrderInQueueGetResponse>> getOrderInQueue(@RequestParam Long eventId, @RequestAttribute("bookingSessionId") String bookingSessionId) {
ApiResponse<OrderInQueueGetResponse> response =
ApiResponse.ok(bookingQueueService.getOrderInQueue(eventId, bookingSessionId));
return ResponseEntity.ok(response);
}

@Operation(summary = "예매 토큰 발급")
@PostMapping("/issue-token")
public ResponseEntity<ApiResponse<TokenIssueResponse>> issueToken(@RequestBody @Valid TokenIssueRequest request, @RequestAttribute("bookingSessionId") String bookingSessionId) {
ApiResponse<TokenIssueResponse> response = ApiResponse.ok(bookingQueueService.issueToken(request, bookingSessionId));
return ResponseEntity.ok(response);
}

@Operation(summary = "대기열 이탈")
@PostMapping("/exit-queue")
public ResponseEntity<Void> exitQueue(@RequestBody @Valid BookingQueueExitRequest request, @RequestAttribute("bookingSessionId") String bookingSessionId) {
bookingQueueService.exitQueue(request, bookingSessionId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,19 @@
import com.pgms.apibooking.domain.payment.service.PaymentService;
import com.pgms.coredomain.response.ApiResponse;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;

@RestController
@RequestMapping("/api/v1/payments")
@RequiredArgsConstructor
@Tag(name = "결제")
public class PaymentController {

private final PaymentService paymentService;

@Operation(summary = "결제 성공 처리")
@GetMapping("/success")
public ResponseEntity<ApiResponse> confirmPaymentSuccess(
@RequestParam String paymentKey,
Expand All @@ -31,6 +35,7 @@ public ResponseEntity<ApiResponse> confirmPaymentSuccess(
return ResponseEntity.ok(ApiResponse.ok(paymentService.successPayment(paymentKey, bookingId, amount)));
}

@Operation(summary = "결제 실패 처리")
@GetMapping("/fail")
public ResponseEntity<ApiResponse> confirmPaymentFail(
@RequestParam(name = "code") String errorCode,
Expand All @@ -42,6 +47,7 @@ public ResponseEntity<ApiResponse> confirmPaymentFail(
return ResponseEntity.ok(response);
}

@Operation(summary = "가상계좌 입금 확인 웹훅")
@PostMapping("/virtual/income")
public ResponseEntity<Void> confirmVirtualAccountIncome(@RequestBody ConfirmVirtualIncomeRequest request) {
System.out.println(request.createdAt());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,28 +16,34 @@
import com.pgms.coredomain.response.ApiResponse;
import com.pgms.coresecurity.security.resolver.CurrentAccount;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;

@RestController
@RequestMapping("/api/v1/seats")
@RequiredArgsConstructor
@Tag(name = "좌석")
public class SeatController {

private final SeatService seatService;

@Operation(summary = "좌석 목록 조회")
@GetMapping
public ResponseEntity<ApiResponse<List<AreaResponse>>> getSeats(@ModelAttribute @Valid SeatsGetRequest request) {
ApiResponse<List<AreaResponse>> response = ApiResponse.ok(seatService.getSeats(request));
return ResponseEntity.ok().body(response);
}

@Operation(summary = "좌석 선택")
@PostMapping("/{seatId}/select")
public ResponseEntity<Void> selectSeat(@PathVariable Long seatId, @CurrentAccount Long memberId) {
seatService.selectSeat(seatId, memberId);
return ResponseEntity.noContent().build();
}

@Operation(summary = "좌석 선택 해제")
@PostMapping("/{seatId}/deselect")
public ResponseEntity<Void> deselectSeat(@PathVariable Long seatId, @CurrentAccount Long memberId) {
seatService.deselectSeat(seatId, memberId);
Expand Down
3 changes: 2 additions & 1 deletion api/api-member/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'

implementation 'org.springframework.boot:spring-boot-starter-mail:3.2.0'

// security
implementation 'org.springframework.boot:spring-boot-starter-security'
}
22 changes: 17 additions & 5 deletions api/api-member/http/test.http
Original file line number Diff line number Diff line change
Expand Up @@ -181,9 +181,21 @@ Content-Type: application/json

### 멤버 본인 탈퇴 (토큰 필요)
DELETE http://localhost:8081/api/v1/members/me
Authorization: Bearer {{token}}
Authorization: Bearer eyJhbGciOiJIUzM4NCJ9.eyJpZCI6Mywic3ViIjoiZGh4bDUwQG5hdmVyLmNvbSIsImlhdCI6MTcwNDk3MzE5OCwiZXhwIjoxNzA0OTc0OTk4LCJhdXRob3JpdHkiOiJST0xFX1VTRVIifQ.6QrGoK0YJ2P9idqh5gVYZVRbZX_pNdCLLdAI9W0-npQXy_JBNAMTP2QGfSK7F9CZ

### 멤버 계정 복구 (토큰 필요)
POST http://localhost:8081/api/v1/members/restore
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer {{token}}
### 멤버 계정 복구 이메일 전송
POST http://localhost:8081/api/v1/members/send-restore-email
Content-Type: application/json

{
"email": "[email protected]"
}

### 멤버 계정 복구 (이메일 코드 포함)
PATCH http://localhost:8081/api/v1/members/confirm-restore
Content-Type: application/json

{
"email": "[email protected]",
"code": "925340"
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import com.pgms.apimember.dto.request.RefreshTokenRequest;
import com.pgms.apimember.dto.response.AuthResponse;
import com.pgms.apimember.service.AuthService;
import com.pgms.coredomain.domain.member.enums.Role;
import com.pgms.coredomain.response.ApiResponse;

import jakarta.validation.Valid;
Expand All @@ -27,14 +28,14 @@ public class AuthController {
*/
@PostMapping("/admin/login")
public ResponseEntity<ApiResponse<AuthResponse>> adminLogin(@Valid @RequestBody LoginRequest request) {
AuthResponse response = authService.login(request, "admin");
AuthResponse response = authService.login(request, Role.ROLE_ADMIN);
return ResponseEntity.ok(ApiResponse.ok(response));
}

@PostMapping("/members/login")
public ResponseEntity<ApiResponse<AuthResponse>> memberLogin(@Valid @RequestBody LoginRequest request) {
// TODO: 나중에 enum으로..?
AuthResponse response = authService.login(request, "member");
AuthResponse response = authService.login(request, Role.ROLE_USER);
return ResponseEntity.ok(ApiResponse.ok(response));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,11 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.pgms.apimember.dto.request.ConfirmRestoreRequest;
import com.pgms.apimember.dto.request.MemberInfoUpdateRequest;
import com.pgms.apimember.dto.request.MemberPasswordUpdateRequest;
import com.pgms.apimember.dto.request.MemberPasswordVerifyRequest;
import com.pgms.apimember.dto.request.MemberRestoreRequest;
import com.pgms.apimember.dto.request.MemberSignUpRequest;
import com.pgms.apimember.dto.response.MemberDetailGetResponse;
import com.pgms.apimember.service.MemberService;
Expand Down Expand Up @@ -67,8 +69,15 @@ public ResponseEntity<ApiResponse<Void>> deleteMyAccount(@CurrentAccount Long me
return ResponseEntity.noContent().build();
}

@PostMapping("/restore")
public ResponseEntity<ApiResponse<Long>> restoreMember(@CurrentAccount Long memberId) {
return ResponseEntity.ok(ApiResponse.ok(memberService.restoreMember(memberId)));
@PostMapping("send-restore-email")
public ResponseEntity<ApiResponse<String>> sendRestoreEmail(@RequestBody @Valid MemberRestoreRequest requestDto) {
memberService.sendRestoreEmail(requestDto);
return ResponseEntity.noContent().build();
}

@PatchMapping("/confirm-restore")
public ResponseEntity<ApiResponse<Void>> confirmRestore(@RequestBody @Valid ConfirmRestoreRequest requestDto) {
memberService.confirmRestoreMember(requestDto);
return ResponseEntity.noContent().build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.pgms.apimember.dto.request;

import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;

public record ConfirmRestoreRequest(
@NotBlank(message = "이메일은 필수 항목입니다.")
@Email(message = "이메일 형식에 맞지 않습니다.")
String email,

@NotBlank(message = "인증 코드는 필수 항목입니다.")
@Size(min = 6, max = 6, message = "인증 코드는 6자리 입니다.")
String code
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.pgms.apimember.dto.request;

import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;

public record MemberRestoreRequest(
@NotBlank(message = "이메일은 필수 항목입니다.")
@Email(message = "이메일 형식에 맞지 않습니다.")
String email
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package com.pgms.apimember.email;

import java.util.Properties;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.JavaMailSenderImpl;

@Configuration
public class EmailConfig {

@Value("${spring.mail.host}")
private String host;

@Value("${spring.mail.port}")
private int port;

@Value("${spring.mail.username}")
private String username;

@Value("${spring.mail.password}")
private String password;

@Value("${spring.mail.properties.mail.smtp.auth}")
private boolean auth;

@Value("${spring.mail.properties.mail.smtp.starttls.enable}")
private boolean starttlsEnable;

@Value("${spring.mail.properties.mail.smtp.starttls.required}")
private boolean starttlsRequired;

@Value("${spring.mail.properties.mail.smtp.connectiontimeout}")
private int connectionTimeout;

@Value("${spring.mail.properties.mail.smtp.timeout}")
private int timeout;

@Value("${spring.mail.properties.mail.smtp.writetimeout}")
private int writeTimeout;

@Bean
public JavaMailSender javaMailSender() {
JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
mailSender.setHost(host);
mailSender.setPort(port);
mailSender.setUsername(username);
mailSender.setPassword(password);
mailSender.setDefaultEncoding("UTF-8");
mailSender.setJavaMailProperties(getMailProperties());

return mailSender;
}

private Properties getMailProperties() {
Properties properties = new Properties();
properties.put("mail.smtp.auth", auth);
properties.put("mail.smtp.starttls.enable", starttlsEnable);
properties.put("mail.smtp.starttls.required", starttlsRequired);
properties.put("mail.smtp.connectiontimeout", connectionTimeout);
properties.put("mail.smtp.timeout", timeout);
properties.put("mail.smtp.writetimeout", writeTimeout);

return properties;
}
}
Loading

0 comments on commit fffd096

Please sign in to comment.