모의투자 로직 변경

This commit is contained in:
Macbook
2026-05-31 14:05:46 +09:00
parent ead97dad5d
commit d6eedf19bb
33 changed files with 1456 additions and 330 deletions
@@ -8,6 +8,7 @@ import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
/**
* 투자전략 CRUD REST API.
@@ -29,14 +30,17 @@ public class StrategyController {
/** 전략 목록 조회 */
@GetMapping
public ResponseEntity<List<StrategyDto>> list(
@RequestHeader(value = "X-User-Id", required = false) String userIdHeader,
@RequestHeader(value = "X-Device-Id", required = false) String deviceId) {
return ResponseEntity.ok(service.list(parseUserId(userIdHeader), deviceId));
@RequestHeader Map<String, String> headers) {
long uid = TradingControllerSupport.requireRegisteredUser(headers);
return ResponseEntity.ok(service.list(uid, null));
}
/** 단일 전략 조회 */
@GetMapping("/{id}")
public ResponseEntity<StrategyDto> get(@PathVariable Long id) {
public ResponseEntity<StrategyDto> get(
@PathVariable Long id,
@RequestHeader Map<String, String> headers) {
TradingControllerSupport.requireRegisteredUser(headers);
return service.findById(id)
.map(ResponseEntity::ok)
.orElse(ResponseEntity.notFound().build());
@@ -46,20 +50,26 @@ public class StrategyController {
@PostMapping
public ResponseEntity<StrategyDto> save(
@RequestBody StrategyDto dto,
@RequestHeader(value = "X-User-Id", required = false) String userIdHeader,
@RequestHeader(value = "X-Device-Id", required = false) String deviceId) {
return ResponseEntity.ok(service.save(dto, parseUserId(userIdHeader), deviceId));
@RequestHeader Map<String, String> headers) {
long uid = TradingControllerSupport.requireRegisteredUser(headers);
return ResponseEntity.ok(service.save(dto, uid, null));
}
/** 전략 DSL에 포함된 평가 시간봉 목록 */
@GetMapping("/{id}/timeframes")
public ResponseEntity<List<String>> timeframes(@PathVariable Long id) {
public ResponseEntity<List<String>> timeframes(
@PathVariable Long id,
@RequestHeader Map<String, String> headers) {
TradingControllerSupport.requireRegisteredUser(headers);
return ResponseEntity.ok(conditionTimeframes.collectForStrategyList(id));
}
/** TIMEFRAME 래핑 누락 DSL 보정 (3분봉 전략이 1분봉으로 평가되는 경우) */
@PostMapping("/{id}/repair-timeframes")
public ResponseEntity<StrategyDto> repairTimeframes(@PathVariable Long id) {
public ResponseEntity<StrategyDto> repairTimeframes(
@PathVariable Long id,
@RequestHeader Map<String, String> headers) {
TradingControllerSupport.requireRegisteredUser(headers);
return service.repairTimeframeWrappers(id)
.map(ResponseEntity::ok)
.orElse(ResponseEntity.notFound().build());
@@ -67,13 +77,11 @@ public class StrategyController {
/** 전략 삭제 */
@DeleteMapping("/{id}")
public ResponseEntity<Void> delete(@PathVariable Long id) {
public ResponseEntity<Void> delete(
@PathVariable Long id,
@RequestHeader Map<String, String> headers) {
TradingControllerSupport.requireRegisteredUser(headers);
service.delete(id);
return ResponseEntity.noContent().build();
}
private Long parseUserId(String header) {
if (header == null || header.isBlank()) return null;
try { return Long.parseLong(header); } catch (NumberFormatException e) { return null; }
}
}