package com.goldenchart.controller; import com.goldenchart.dto.StrategyDto; import com.goldenchart.service.StrategyConditionTimeframeService; import com.goldenchart.service.StrategyService; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Map; /** * 투자전략 CRUD REST API. * *

헤더: *

*/ @RestController @RequestMapping("/strategies") @RequiredArgsConstructor public class StrategyController { private final StrategyService service; private final StrategyConditionTimeframeService conditionTimeframes; /** 전략 목록 조회 */ @GetMapping public ResponseEntity> list( @RequestHeader Map headers) { long uid = TradingControllerSupport.requireRegisteredUser(headers); return ResponseEntity.ok(service.list(uid, null)); } /** 단일 전략 조회 */ @GetMapping("/{id}") public ResponseEntity get( @PathVariable Long id, @RequestHeader Map headers) { TradingControllerSupport.requireRegisteredUser(headers); return service.findById(id) .map(ResponseEntity::ok) .orElse(ResponseEntity.notFound().build()); } /** 전략 저장 (id 없으면 생성, 있으면 수정) */ @PostMapping public ResponseEntity save( @RequestBody StrategyDto dto, @RequestHeader Map headers) { long uid = TradingControllerSupport.requireRegisteredUser(headers); return ResponseEntity.ok(service.save(dto, uid, null)); } /** 전략 DSL에 포함된 평가 시간봉 목록 */ @GetMapping("/{id}/timeframes") public ResponseEntity> timeframes( @PathVariable Long id, @RequestHeader Map headers) { TradingControllerSupport.requireRegisteredUser(headers); return ResponseEntity.ok(conditionTimeframes.collectForStrategyList(id)); } /** TIMEFRAME 래핑 누락 DSL 보정 (3분봉 전략이 1분봉으로 평가되는 경우) */ @PostMapping("/{id}/repair-timeframes") public ResponseEntity repairTimeframes( @PathVariable Long id, @RequestHeader Map headers) { TradingControllerSupport.requireRegisteredUser(headers); return service.repairTimeframeWrappers(id) .map(ResponseEntity::ok) .orElse(ResponseEntity.notFound().build()); } /** 전략 삭제 */ @DeleteMapping("/{id}") public ResponseEntity delete( @PathVariable Long id, @RequestHeader Map headers) { TradingControllerSupport.requireRegisteredUser(headers); service.delete(id); return ResponseEntity.noContent().build(); } }