Adds an anonymous guest checkout flow so a customer can order a bilhälsning without creating an account. Payment via Swish (QR + payment link). Backend: - GuestOrderController: POST /api/guest-orders (public, no auth) - CreateGuestOrderRequest / GuestOrderResponse DTOs - Order entity: guest_email, guest_token (UUID), nullable user_id - OrderRepository: findByGuestToken, findByGuestEmail - OrderService: createGuestOrder, getGuestOrder by token - SecurityConfig: /api/guest-orders/** permitAll - V12 migration: drops user_id NOT NULL, adds guest_email + guest_token with partial unique index (backfill-safe for existing user orders) Frontend: - GuestCheckoutPage: plate lookup + order form (no login) - GuestPaymentRedirect: Swish QR + payment link + status polling - GuestOrderPage: order status by guest token - guestOrders.ts API client - router: /guest/* public routes - vite.config: dev proxy for /api/guest-orders Verification: - [x] vue-tsc type-check passes (exit 0) - [ ] Backend Java compiles (no JDK/docker in agent sandbox) - [ ] Flyway V12 migration applies cleanly - [ ] End-to-end POST /api/guest-orders -> 201 -> Swish -> status Frontend type-checks but backend has NOT been compiled or run yet. This PR is for review; backend smoke test pending in a docker environment.
24 lines
682 B
Java
24 lines
682 B
Java
package se.bilhalsning.dto;
|
|
|
|
import java.math.BigDecimal;
|
|
import java.time.Instant;
|
|
import java.util.UUID;
|
|
|
|
/**
|
|
* Response shape for guest-order endpoints.
|
|
*
|
|
* Identical to {@link OrderResponse} plus {@link #guestToken}, which the
|
|
* client needs to (a) build the payment page URL and (b) look up the
|
|
* order again without an account. Token is returned only on create and
|
|
* by-token lookup — it is never re-exposed by order ID alone.
|
|
*/
|
|
public record GuestOrderResponse(
|
|
UUID id,
|
|
String plate,
|
|
String letterText,
|
|
String status,
|
|
String trackingId,
|
|
BigDecimal amountPaid,
|
|
Instant createdAt,
|
|
UUID guestToken
|
|
) {}
|