package com.goldenchart.controller; import com.goldenchart.service.IndicatorSettingsService; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.util.Map; /** * 전역 지표 파라미터 CRUD REST API. * *

프론트엔드 indicatorRegistry.ts 의 defaultParams 를 완전히 대체하는 * 사용자별 지표 파라미터를 저장/조회한다.

* *
 * GET    /indicator-settings          — 전체 지표 파라미터 조회
 * GET    /indicator-settings/{type}   — 특정 지표 파라미터 조회
 * PUT    /indicator-settings          — 전체 지표 파라미터 저장 (덮어쓰기)
 * PATCH  /indicator-settings/{type}   — 특정 지표 파라미터 병합 저장
 * 
*/ @RestController @RequestMapping("/indicator-settings") @RequiredArgsConstructor public class IndicatorSettingsController { private final IndicatorSettingsService service; // ── 헤더 파싱 헬퍼 ──────────────────────────────────────────────────────── private Long userId(String userIdHeader) { if (userIdHeader == null || userIdHeader.isBlank()) return null; try { return Long.parseLong(userIdHeader); } catch (NumberFormatException e) { return null; } } // ── GET: 전체 파라미터 조회 ──────────────────────────────────────────────── /** * 이 장치/사용자의 모든 지표 파라미터를 반환. * 프론트엔드 앱 시작 시 호출하여 전역 설정을 로드한다. */ @GetMapping public ResponseEntity>> getAll( @RequestHeader(value = "X-User-Id", required = false) String userIdHeader, @RequestHeader(value = "X-Device-Id", required = false) String deviceId) { Map> result = service.getAll(userId(userIdHeader), deviceId); return ResponseEntity.ok(result); } // ── GET: 특정 지표 파라미터 조회 ────────────────────────────────────────── @GetMapping("/{indicatorType}") public ResponseEntity> getForType( @PathVariable String indicatorType, @RequestHeader(value = "X-User-Id", required = false) String userIdHeader, @RequestHeader(value = "X-Device-Id", required = false) String deviceId) { return ResponseEntity.ok(service.getForType(userId(userIdHeader), deviceId, indicatorType)); } // ── PUT: 전체 파라미터 저장 ──────────────────────────────────────────────── /** * 모든 지표 파라미터를 한 번에 저장(덮어쓰기). * * Request body: * { * "RSI": {"length": 9, "src": "close"}, * "MACD": {"fastLength": 12, "slowLength": 26, "signalLength": 9}, * "BollingerBands":{"length": 20, "mult": 2.0}, * ... * } */ @PutMapping public ResponseEntity saveAll( @RequestHeader(value = "X-User-Id", required = false) String userIdHeader, @RequestHeader(value = "X-Device-Id", required = false) String deviceId, @RequestBody Map> allParams) { service.saveAll(userId(userIdHeader), deviceId, allParams); return ResponseEntity.noContent().build(); } // ── PATCH: 특정 지표 파라미터 병합 저장 ──────────────────────────────────── /** * 특정 지표의 파라미터만 업데이트. * 나머지 지표 설정은 유지된다. * * PATCH /indicator-settings/RSI * Body: {"length": 14, "src": "close"} */ @PatchMapping("/{indicatorType}") public ResponseEntity saveForType( @PathVariable String indicatorType, @RequestHeader(value = "X-User-Id", required = false) String userIdHeader, @RequestHeader(value = "X-Device-Id", required = false) String deviceId, @RequestBody Map params) { service.saveForType(userId(userIdHeader), deviceId, indicatorType, params); return ResponseEntity.noContent().build(); } // ── GET: 전체 시각 설정 조회 ─────────────────────────────────────────────── /** * 모든 지표의 시각 설정(색상·선굵기·수평선)을 반환. * 프론트엔드 앱 시작 시 호출하여 전역 시각 설정을 로드한다. * * GET /indicator-settings/visual */ @GetMapping("/visual") public ResponseEntity>> getAllVisual( @RequestHeader(value = "X-User-Id", required = false) String userIdHeader, @RequestHeader(value = "X-Device-Id", required = false) String deviceId) { return ResponseEntity.ok(service.getAllVisual(userId(userIdHeader), deviceId)); } // ── PATCH: 특정 지표 시각 설정 저장 ─────────────────────────────────────── /** * 특정 지표의 시각 설정(색상·선굵기·수평선)을 병합 저장. * * PATCH /indicator-settings/RSI/visual * Body: { * "plots": [{"id":"plot0","color":"#ff0000","lineWidth":2,"type":"line"}], * "hlines": [{"price":70,"color":"#EF5350","visible":true}] * } */ @PatchMapping("/{indicatorType}/visual") public ResponseEntity saveVisualForType( @PathVariable String indicatorType, @RequestHeader(value = "X-User-Id", required = false) String userIdHeader, @RequestHeader(value = "X-Device-Id", required = false) String deviceId, @RequestBody Map visual) { service.saveVisualForType(userId(userIdHeader), deviceId, indicatorType, visual); return ResponseEntity.noContent().build(); } }