goldenChat base source add

This commit is contained in:
aidev
2026-05-23 15:11:48 +09:00
commit a4ea7762b5
2081 changed files with 1155760 additions and 0 deletions
@@ -0,0 +1,137 @@
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.
*
* <p>프론트엔드 indicatorRegistry.ts 의 defaultParams 를 완전히 대체하는
* 사용자별 지표 파라미터를 저장/조회한다.</p>
*
* <pre>
* GET /indicator-settings — 전체 지표 파라미터 조회
* GET /indicator-settings/{type} — 특정 지표 파라미터 조회
* PUT /indicator-settings — 전체 지표 파라미터 저장 (덮어쓰기)
* PATCH /indicator-settings/{type} — 특정 지표 파라미터 병합 저장
* </pre>
*/
@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<Map<String, Map<String, Object>>> getAll(
@RequestHeader(value = "X-User-Id", required = false) String userIdHeader,
@RequestHeader(value = "X-Device-Id", required = false) String deviceId) {
Map<String, Map<String, Object>> result = service.getAll(userId(userIdHeader), deviceId);
return ResponseEntity.ok(result);
}
// ── GET: 특정 지표 파라미터 조회 ──────────────────────────────────────────
@GetMapping("/{indicatorType}")
public ResponseEntity<Map<String, Object>> 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<Void> saveAll(
@RequestHeader(value = "X-User-Id", required = false) String userIdHeader,
@RequestHeader(value = "X-Device-Id", required = false) String deviceId,
@RequestBody Map<String, Map<String, Object>> 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<Void> saveForType(
@PathVariable String indicatorType,
@RequestHeader(value = "X-User-Id", required = false) String userIdHeader,
@RequestHeader(value = "X-Device-Id", required = false) String deviceId,
@RequestBody Map<String, Object> params) {
service.saveForType(userId(userIdHeader), deviceId, indicatorType, params);
return ResponseEntity.noContent().build();
}
// ── GET: 전체 시각 설정 조회 ───────────────────────────────────────────────
/**
* 모든 지표의 시각 설정(색상·선굵기·수평선)을 반환.
* 프론트엔드 앱 시작 시 호출하여 전역 시각 설정을 로드한다.
*
* GET /indicator-settings/visual
*/
@GetMapping("/visual")
public ResponseEntity<Map<String, Map<String, Object>>> 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<Void> saveVisualForType(
@PathVariable String indicatorType,
@RequestHeader(value = "X-User-Id", required = false) String userIdHeader,
@RequestHeader(value = "X-Device-Id", required = false) String deviceId,
@RequestBody Map<String, Object> visual) {
service.saveVisualForType(userId(userIdHeader), deviceId, indicatorType, visual);
return ResponseEntity.noContent().build();
}
}