package com.goldenchart.controller; import com.goldenchart.service.AppSettingsService; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.util.Map; /** * 앱 전역 차트 기본 설정 REST API. * *

프론트엔드에 하드코딩된 기본값들(기본 심볼·타임프레임·테마·캔들 색상 등)을 * 장치/사용자별로 DB 에서 관리한다.

* *
 * GET  /app-settings   — 현재 기본 설정 로드 (앱 시작 시 호출)
 * PUT  /app-settings   — 기본 설정 저장
 * 
* * 반환 구조: *
 * {
 *   "defaultSymbol":    "KRW-BTC",
 *   "defaultTimeframe": "1D",
 *   "defaultChartType": "candlestick",
 *   "defaultTheme":     "dark",
 *   "defaultLogScale":  false,
 *   "defaultLayoutId":  "1",
 *   "mainChartStyle":   { "upColor":"#ff6b6b", "downColor":"#4dabf7", ... },
 *   "syncOptions":      { "symbol":false, "interval":false, "crosshair":true, ... }
 * }
 * 
*/ @RestController @RequestMapping("/app-settings") @RequiredArgsConstructor public class AppSettingsController { private final AppSettingsService service; // ── GET ─────────────────────────────────────────────────────────────────── /** * 앱 시작 시 기본 설정 로드. * DB 에 데이터가 없으면 엔티티 기본값(hardcoded fallback)을 반환한다. */ @GetMapping public ResponseEntity> get( @RequestHeader(value = "X-User-Id", required = false) String userIdHeader, @RequestHeader(value = "X-Device-Id", required = false) String deviceId) { return ResponseEntity.ok(service.get(parseUserId(userIdHeader), deviceId)); } // ── PUT ─────────────────────────────────────────────────────────────────── /** * 기본 설정 저장. * 변경된 필드만 보내도 되며, 없는 키는 기존 값 유지. * *

프론트엔드에서 호출해야 하는 시점: *

*/ @PutMapping public ResponseEntity> save( @RequestHeader(value = "X-User-Id", required = false) String userIdHeader, @RequestHeader(value = "X-Device-Id", required = false) String deviceId, @RequestBody Map data) { return ResponseEntity.ok(service.save(parseUserId(userIdHeader), deviceId, data)); } // ── helpers ─────────────────────────────────────────────────────────────── private Long parseUserId(String header) { if (header == null || header.isBlank()) return null; try { return Long.parseLong(header); } catch (NumberFormatException e) { return null; } } }