Replace the mock test-payment button with a real manual Swish flow where the user sends a Swish payment with the order ID as message and confirms via a button. Admin verifies Swish and processes manually. Backend - Rename OrderStatus LOOKUP_STARTED to PROCESSING (Swedish: Hanteras) - Update V5 migration CHECK constraint from lookup_started to processing - Rename OrderService.markAsPaid() to confirmPayment(), sets PROCESSING instead of PAID, stop hardcoding amountPaid - Add GET /api/payment/swish-info endpoint returning swish number and letter price from app.payment config - Permit /api/payment/swish-info without authentication - Update UpdateStatusRequest regex to accept processing - Update PaymentControllerTest for renamed method, new status, and public swish-info endpoint test Frontend - Rewrite PaymentRedirect.vue: Swish number, order ID as message, Jag har betalat button with confirmation dialog - Add fetchSwishInfo() to api/payment.ts - AdminPage: rename Skickade stat to Att göra (processing orders), highlight processing rows with admin__row--todo - OrdersPage: update status labels/badge classes for new flow - Refactor ApiError in client.ts to property declaration syntax - Exclude __tests__ from tsconfig.app.json and Docker builds Tests - Rewrite PaymentRedirect.spec.ts for Swish info, confirmation dialog, cancel flow, and processing status - Update OrdersPage.spec.ts with processing status test - Update AdminDashboard.spec.ts with Att göra stat and row highlight - Add amountPaid to ComposePage.spec.ts mock Config - Add SWISH_NUMBER to .env.example and docker-compose.yml
55 lines
1.9 KiB
Java
55 lines
1.9 KiB
Java
package se.bilhalsning.controller;
|
|
|
|
import java.util.Map;
|
|
import java.util.UUID;
|
|
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
import org.springframework.http.ResponseEntity;
|
|
import org.springframework.web.bind.annotation.GetMapping;
|
|
import org.springframework.web.bind.annotation.PathVariable;
|
|
import org.springframework.web.bind.annotation.PostMapping;
|
|
import org.springframework.web.bind.annotation.RequestMapping;
|
|
import org.springframework.web.bind.annotation.RestController;
|
|
import se.bilhalsning.dto.OrderResponse;
|
|
import se.bilhalsning.entity.Order;
|
|
import se.bilhalsning.service.OrderService;
|
|
|
|
@RestController
|
|
@RequestMapping("/api/payment")
|
|
public class PaymentController {
|
|
|
|
private final OrderService orderService;
|
|
private final String swishNumber;
|
|
private final int letterPrice;
|
|
|
|
public PaymentController(
|
|
OrderService orderService,
|
|
@Value("${app.payment.swish-number}") String swishNumber,
|
|
@Value("${app.payment.letter-price}") int letterPrice) {
|
|
this.orderService = orderService;
|
|
this.swishNumber = swishNumber;
|
|
this.letterPrice = letterPrice;
|
|
}
|
|
|
|
@PostMapping("/{orderId}/pay")
|
|
public ResponseEntity<OrderResponse> pay(@PathVariable UUID orderId) {
|
|
Order order = orderService.confirmPayment(orderId);
|
|
return ResponseEntity.ok(toResponse(order));
|
|
}
|
|
|
|
@GetMapping("/swish-info")
|
|
public ResponseEntity<Map<String, Object>> swishInfo() {
|
|
return ResponseEntity.ok(Map.of("number", swishNumber, "amount", letterPrice));
|
|
}
|
|
|
|
private OrderResponse toResponse(Order order) {
|
|
return new OrderResponse(
|
|
order.getId(),
|
|
order.getPlate(),
|
|
order.getStatus().getValue(),
|
|
order.getTrackingId(),
|
|
order.getAmountPaid(),
|
|
order.getCreatedAt()
|
|
);
|
|
}
|
|
}
|