lotto lab API 정리
- API 스펙 정리 문서 업로드 - 스펙 다운로드 기능 추가 나스 배포 오류 수정
This commit is contained in:
@@ -7,7 +7,7 @@
|
||||
"dev": "vite",
|
||||
"clean": "rimraf dist",
|
||||
"build": "npm run clean && vite build",
|
||||
"deploy:nas": "node -e 'const isWin = process.platform === \"win32\"; const src = \"dist\"; const dstWin = \"Z:\\\\docker\\\\webpage\\\\frontend\\\\\"; const dstMac = \"/Volumes/gahusb.synology.me/docker/webpage/frontend/\"; const dst = isWin ? dstWin : dstMac; const fs = require(\"fs\"); if (!fs.existsSync(src)) { console.error(\"dist not found. Run build first.\"); process.exit(1); } if (!fs.existsSync(dst)) { console.error(\"NAS path not found. Check mount: \" + dst); process.exit(1); } if (isWin) { const cmd = \"powershell -NoProfile -ExecutionPolicy Bypass -Command \\\"$ErrorActionPreference=\\\"Stop\\\"; $src=\\\"dist\\\"; $dst=\\\"Z:\\\\docker\\\\webpage\\\\frontend\\\\\\\"; if(!(Test-Path $src)){ throw \\\"dist not found. Run build first.\\\" }; if(!(Test-Path $dst)){ throw \\\"NAS drive not found. Check Z: mapping.\\\" }; robocopy $src $dst /MIR /R:1 /W:1 /E /NFL /NDL /NP; if($LASTEXITCODE -ge 8){ exit $LASTEXITCODE }\\\"\"; require(\"child_process\").execSync(cmd); } else { require(\"child_process\").execSync(\"rsync -av --delete --delete-delay --inplace dist/ \" + dst); }'",
|
||||
"deploy:nas": "node scripts/deploy-nas.cjs",
|
||||
"release:nas": "npm run build && npm run deploy:nas",
|
||||
"lint": "eslint .",
|
||||
"preview": "vite preview"
|
||||
|
||||
63
public/lotto-api.md
Normal file
63
public/lotto-api.md
Normal file
@@ -0,0 +1,63 @@
|
||||
# Lotto API 스펙 (프론트 참고)
|
||||
|
||||
## 추천 1개 생성
|
||||
|
||||
요청:
|
||||
|
||||
GET /api/lotto/recommend?recent_window=200&recent_weight=2.0&avoid_recent_k=5&sum_min=120&sum_max=180&max_overlap_latest=1
|
||||
|
||||
응답 핵심:
|
||||
|
||||
{
|
||||
"id": 123,
|
||||
"saved": true,
|
||||
"deduped": false,
|
||||
"numbers": [1,2,3,4,5,6],
|
||||
"based_on_latest_draw": 1145,
|
||||
"explain": {...},
|
||||
"metrics": {...},
|
||||
"recent_overlap": {...},
|
||||
"params": {...}
|
||||
}
|
||||
|
||||
## 히스토리 목록 (페이지/필터/검색)
|
||||
|
||||
기본: GET /api/history?limit=30&offset=0
|
||||
즐겨찾기만: GET /api/history?favorite=true
|
||||
태그 필터: GET /api/history?tag=jeju
|
||||
메모 검색: GET /api/history?q=맛집
|
||||
정렬: GET /api/history?sort=favorite_desc
|
||||
|
||||
응답:
|
||||
|
||||
{
|
||||
"items": [
|
||||
{
|
||||
"id": 123,
|
||||
"created_at": "...",
|
||||
"numbers": [...],
|
||||
"params": {...},
|
||||
"based_on_draw": 1145,
|
||||
"favorite": false,
|
||||
"note": null,
|
||||
"tags": [],
|
||||
"metrics": {...},
|
||||
"recent_overlap": {...}
|
||||
}
|
||||
],
|
||||
"limit": 30,
|
||||
"offset": 0,
|
||||
"filters": {...}
|
||||
}
|
||||
|
||||
## 히스토리 수정 (즐겨찾기/메모/태그)
|
||||
|
||||
요청:
|
||||
|
||||
PATCH /api/history/{id}
|
||||
|
||||
{
|
||||
"favorite": true,
|
||||
"note": "이번주는 이 조합",
|
||||
"tags": ["jeju","safe"]
|
||||
}
|
||||
27
scripts/deploy-nas.cjs
Normal file
27
scripts/deploy-nas.cjs
Normal file
@@ -0,0 +1,27 @@
|
||||
const { execSync } = require("child_process");
|
||||
const fs = require("fs");
|
||||
|
||||
const isWin = process.platform === "win32";
|
||||
const src = "dist";
|
||||
const dstWin = "Z:\\docker\\webpage\\frontend\\";
|
||||
const dstMac = "/Volumes/gahusb.synology.me/docker/webpage/frontend/";
|
||||
const dst = isWin ? dstWin : dstMac;
|
||||
|
||||
if (!fs.existsSync(src)) {
|
||||
console.error("dist not found. Run build first.");
|
||||
process.exit(1);
|
||||
}
|
||||
if (!fs.existsSync(dst)) {
|
||||
console.error("NAS path not found. Check mount: " + dst);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
if (isWin) {
|
||||
const cmd =
|
||||
'powershell -NoProfile -ExecutionPolicy Bypass -Command "$ErrorActionPreference=\\"Stop\\"; $src=\\"dist\\"; $dst=\\"Z:\\\\docker\\\\webpage\\\\frontend\\\\\\"; if(!(Test-Path $src)){ throw \\"dist not found. Run build first.\\" }; if(!(Test-Path $dst)){ throw \\"NAS drive not found. Check Z: mapping.\\" }; $log = Join-Path (Get-Location) \\"robocopy.log\\"; robocopy $src $dst /MIR /R:1 /W:1 /E /NFL /NDL /NP /V /TEE /LOG:$log; $rc = $LASTEXITCODE; if($rc -ge 8){ Write-Host \\"robocopy failed with code $rc. See $log\\"; exit $rc } else { exit 0 }"';
|
||||
execSync(cmd, { stdio: "inherit" });
|
||||
} else {
|
||||
execSync(`rsync -av --delete --delete-delay --inplace ${src}/ ${dst}`, {
|
||||
stdio: "inherit",
|
||||
});
|
||||
}
|
||||
@@ -360,7 +360,10 @@ export default function Functions() {
|
||||
</section>
|
||||
|
||||
<footer className="lotto-foot">
|
||||
backend: FastAPI / nginx proxy / DB: sqlite
|
||||
backend: FastAPI / nginx proxy / DB: sqlite •{' '}
|
||||
<a className="lotto-foot__link" href="/lotto-api.md" download>
|
||||
API 스펙 다운로드
|
||||
</a>
|
||||
</footer>
|
||||
</div>
|
||||
);
|
||||
|
||||
@@ -322,6 +322,10 @@
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.lotto-foot__link {
|
||||
color: var(--accent);
|
||||
}
|
||||
|
||||
.button.danger {
|
||||
border-color: rgba(247, 116, 125, 0.5);
|
||||
color: #fbc4c8;
|
||||
|
||||
Reference in New Issue
Block a user