package com.goldenchart.controller; import com.goldenchart.dto.*; import com.goldenchart.service.PaperTradingService; import lombok.RequiredArgsConstructor; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; import java.util.Map; @RestController @RequestMapping("/paper") @RequiredArgsConstructor public class PaperTradingController { private final PaperTradingService paperTradingService; @GetMapping("/summary") public ResponseEntity summary(@RequestHeader Map h) { long uid = TradingControllerSupport.requireRegisteredUser(h); return ResponseEntity.ok(paperTradingService.getSummary(uid, null)); } @PostMapping("/summary") public ResponseEntity summaryWithMarks( @RequestHeader Map h, @RequestBody(required = false) Map markPrices) { long uid = TradingControllerSupport.requireRegisteredUser(h); return ResponseEntity.ok(paperTradingService.getSummary(uid, markPrices)); } @GetMapping("/allocations") public ResponseEntity> allocations(@RequestHeader Map h) { long uid = TradingControllerSupport.requireRegisteredUser(h); return ResponseEntity.ok(paperTradingService.listAllocations(uid, null)); } @PutMapping("/allocations/bulk") public ResponseEntity> bulkAllocations( @RequestHeader Map h, @RequestBody PaperAllocationBulkRequest body) { long uid = TradingControllerSupport.requireRegisteredUser(h); return ResponseEntity.ok(paperTradingService.bulkAllocations(uid, body)); } @PatchMapping("/allocations/{symbol}") public ResponseEntity patchAllocation( @RequestHeader Map h, @PathVariable String symbol, @RequestBody PaperAllocationPatchRequest body) { long uid = TradingControllerSupport.requireRegisteredUser(h); return ResponseEntity.ok(paperTradingService.patchAllocation(uid, symbol, body)); } @GetMapping("/trades") public ResponseEntity trades( @RequestHeader Map h, @RequestParam(required = false) String symbol, @RequestParam(required = false) String side, @RequestParam(required = false) String source, @RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime from, @RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime to, @RequestParam(defaultValue = "0") int page, @RequestParam(required = false) Integer size) { long uid = TradingControllerSupport.requireRegisteredUser(h); if (size == null && symbol == null && side == null && source == null && from == null && to == null) { return ResponseEntity.ok(paperTradingService.listTradesLegacy(uid)); } int pageSize = size != null ? size : 50; return ResponseEntity.ok(paperTradingService.listTrades( uid, symbol, side, source, from, to, page, pageSize)); } @GetMapping("/ledger") public ResponseEntity> ledger( @RequestHeader Map h, @RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime from, @RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime to, @RequestParam(defaultValue = "0") int page, @RequestParam(defaultValue = "50") int size) { long uid = TradingControllerSupport.requireRegisteredUser(h); return ResponseEntity.ok(paperTradingService.listLedger(uid, from, to, page, size)); } @GetMapping("/snapshots/daily") public ResponseEntity> dailySnapshots( @RequestHeader Map h, @RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate from, @RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate to) { long uid = TradingControllerSupport.requireRegisteredUser(h); return ResponseEntity.ok(paperTradingService.listDailySnapshots(uid, from, to)); } @GetMapping("/orders") public ResponseEntity> pendingOrders(@RequestHeader Map h) { long uid = TradingControllerSupport.requireRegisteredUser(h); return ResponseEntity.ok(paperTradingService.listPendingOrders(uid)); } @PostMapping("/orders") public ResponseEntity placeOrder( @RequestHeader Map h, @RequestBody PaperOrderRequest body) { long uid = TradingControllerSupport.requireRegisteredUser(h); return ResponseEntity.ok(paperTradingService.placeOrder(uid, body)); } @PostMapping("/orders/{id}/cancel") public ResponseEntity cancelOrder( @RequestHeader Map h, @PathVariable Long id) { long uid = TradingControllerSupport.requireRegisteredUser(h); return ResponseEntity.ok(paperTradingService.cancelOrder(uid, id)); } @PostMapping("/reset") public ResponseEntity reset(@RequestHeader Map h) { long uid = TradingControllerSupport.requireRegisteredUser(h); return ResponseEntity.ok(paperTradingService.resetAccount(uid)); } }