chore: sub-store Go 重写项目初始化

This commit is contained in:
2026-07-27 14:38:13 +08:00
commit 90e53aa754
85 changed files with 15271 additions and 0 deletions
+87
View File
@@ -0,0 +1,87 @@
#!/bin/bash
set -e
BASE="http://127.0.0.1:18300"
ADMIN="test-admin-token"
DL="test-download-token"
H="Authorization: Bearer $ADMIN"
CT="Content-Type: application/json"
echo "=== 1. 创建远程订阅源 (sslinks) ==="
curl -s -X POST -H "$H" -H "$CT" \
-d '{"name":"remote-sslinks","type":"remote","url":"https://sub.sslinks.co.in/em9knZQ6ximoi9hhnKzJT3FayVZSb2PxKmPWzhzk?token=a8483f280b990786fe607e04d2724dd2","enabled":true}' \
"$BASE/api/sources" | python3 -c "import sys,json; d=json.load(sys.stdin); print(f'status={d[\"status\"]}, id={d.get(\"data\",{}).get(\"id\",\"?\")}'); print(d.get('error',{}).get('message','')) if d['status']!='success' else None"
echo ""
echo "=== 2. 创建远程订阅源 (smallstrawberry) ==="
curl -s -X POST -H "$H" -H "$CT" \
-d '{"name":"remote-smallstrawberry","type":"remote","url":"https://sub2.smallstrawberry.com/api/v1/client/subscribe?token=012ebcb597340abd624d1b0b954b9b36","enabled":true}' \
"$BASE/api/sources" | python3 -c "import sys,json; d=json.load(sys.stdin); print(f'status={d[\"status\"]}, id={d.get(\"data\",{}).get(\"id\",\"?\")}'); print(d.get('error',{}).get('message','')) if d['status']!='success' else None"
echo ""
echo "=== 3. 创建远程订阅源 (aisaka) ==="
curl -s -X POST -H "$H" -H "$CT" \
-d '{"name":"remote-aisaka","type":"remote","url":"https://kaze1.aisaka-taiga.com/oosaka/f2d2c3464d989d7ef78f2b5e20fa1cf9","enabled":true}' \
"$BASE/api/sources" | python3 -c "import sys,json; d=json.load(sys.stdin); print(f'status={d[\"status\"]}, id={d.get(\"data\",{}).get(\"id\",\"?\")}'); print(d.get('error',{}).get('message','')) if d['status']!='success' else None"
echo ""
echo "=== 4. 创建本地订阅源 (本地 VLESS 节点) ==="
curl -s -X POST -H "$H" -H "$CT" \
-d '{"name":"local-vless","type":"local","content":"vless://a2ec9c21-1c51-46cc-8cbd-d9eb63ad412c@seoul-ali-01.20140202.xyz:443?encryption=none&security=tls&sni=seoul-ali-01.20140202.xyz&insecure=0&allowInsecure=0&type=ws&host=seoul-ali-01.20140202.xyz&path=%2F5b334b45ba04a58e#Seoul-ALIBABA\nvless://28f0f856-bcb3-4046-9aeb-785376c44505@us-la-01-racknerd.20140202.xyz:443?encryption=none&security=tls&sni=us-la-01-racknerd.20140202.xyz&insecure=0&allowInsecure=0&type=ws&host=us-la-01-racknerd.20140202.xyz&path=%2F6f6bbc94c6c76083#US-LA-RACKNERD","enabled":true}' \
"$BASE/api/sources" | python3 -c "import sys,json; d=json.load(sys.stdin); print(f'status={d[\"status\"]}, id={d.get(\"data\",{}).get(\"id\",\"?\")}'); print(d.get('error',{}).get('message','')) if d['status']!='success' else None"
echo ""
echo "=== 5. 列出所有源 ==="
curl -s -H "$H" "$BASE/api/sources" | python3 -c "import sys,json; d=json.load(sys.stdin); [print(f' {s[\"id\"]} ({s[\"type\"]}) enabled={s[\"enabled\"]}') for s in d['data']]"
echo ""
echo "=== 6. 下载本地源 — mihomo ==="
curl -s "$BASE/download/source/local-vless/mihomo?token=$DL" | head -30
echo ""
echo "=== 7. 下载本地源 — JSON ==="
curl -s "$BASE/download/source/local-vless/json?token=$DL" | python3 -c "import sys,json; d=json.load(sys.stdin); print(f'proxies={len(d.get(\"proxies\",[]))}'); [print(f' {p.get(\"name\")} ({p.get(\"type\")}) -> {p.get(\"server\")}:{p.get(\"port\")}') for p in d.get('proxies',[])]"
echo ""
echo "=== 8. 下载本地源 — sing-box ==="
curl -s "$BASE/download/source/local-vless/sing-box?token=$DL" | python3 -c "import sys,json; d=json.load(sys.stdin); print(f'outbounds={len(d.get(\"outbounds\",[]))}'); [print(f' {o.get(\"tag\",\"?\")} ({o.get(\"type\",\"?\")})') for o in d.get('outbounds',[])]"
echo ""
echo "=== 9. 下载本地源 — URI ==="
curl -s "$BASE/download/source/local-vless/uri?token=$DL"
echo ""
echo ""
echo "=== 10. 下载本地源 — surge ==="
curl -s "$BASE/download/source/local-vless/surge?token=$DL" | head -10
echo ""
echo "=== 11. 创建集合 (local-vless + remote-sslinks) ==="
curl -s -X POST -H "$H" -H "$CT" \
-d '{"name":"mixed-collection","sourceIds":["local-vless","remote-sslinks"],"templateId":"default","enabled":true}' \
"$BASE/api/collections" | python3 -c "import sys,json; d=json.load(sys.stdin); print(f'status={d[\"status\"]}, id={d.get(\"data\",{}).get(\"id\",\"?\")}'); print(d.get('error',{}).get('message','')) if d['status']!='success' else None"
echo ""
echo "=== 12. 下载集合 — mihomo ==="
curl -s "$BASE/download/collection/mixed-collection/mihomo?token=$DL" | head -40
echo ""
echo "=== 13. 远程源预览 — remote-sslinks ==="
curl -s -X POST -H "$H" -H "$CT" \
-d '{"name":"remote-sslinks","type":"remote","url":"https://sub.sslinks.co.in/em9knZQ6ximoi9hhnKzJT3FayVZSb2PxKmPWzhzk?token=a8483f280b990786fe607e04d2724dd2"}' \
"$BASE/api/preview/source" | python3 -c "import sys,json; d=json.load(sys.stdin); print(f'status={d[\"status\"]}'); data=d.get('data',{}); print(f'nodes={data.get(\"nodes\",\"?\")}'); print(d.get('error',{}).get('message','')) if d['status']!='success' else None"
echo ""
echo "=== 14. 远程源下载 — remote-sslinks mihomo ==="
curl -s "$BASE/download/source/remote-sslinks/mihomo?token=$DL" 2>&1 | head -30
echo ""
echo "=== 15. 远程源下载 — remote-smallstrawberry mihomo ==="
curl -s "$BASE/download/source/remote-smallstrawberry/mihomo?token=$DL" 2>&1 | head -30
echo ""
echo "=== 16. 远程源下载 — remote-aisaka mihomo ==="
curl -s "$BASE/download/source/remote-aisaka/mihomo?token=$DL" 2>&1 | head -30
echo ""
echo "=== ALL TESTS DONE ==="
+92
View File
@@ -0,0 +1,92 @@
#!/bin/bash
set -e
BASE="http://127.0.0.1:18300"
ADMIN="test-admin-token"
DL="test-download-token"
echo "=== 1. ENV ==="
curl -s -H "Authorization: Bearer $ADMIN" "$BASE/api/env" | python3 -m json.tool | head -20
echo ""
echo "=== 2. SETTINGS ==="
curl -s -H "Authorization: Bearer $ADMIN" "$BASE/api/settings" | python3 -c "import sys,json; d=json.load(sys.stdin); print(f'status={d[\"status\"]}, appName={d[\"data\"].get(\"appName\")}')"
echo ""
echo "=== 3. CREATE SOURCE ==="
curl -s -X POST -H "Authorization: Bearer $ADMIN" -H "Content-Type: application/json" \
-d '{"name":"test-source","type":"local","content":"ss://aes-256-gcm:password123@1.2.3.4:8388#HK-Node1\nss://aes-256-gcm:password456@5.6.7.8:8388#US-Node2\ntrojan://pass@9.10.11.12:443?sni=example.com#JP-Node3","enabled":true}' \
"$BASE/api/sources" | python3 -c "import sys,json; d=json.load(sys.stdin); print(f'status={d[\"status\"]}, id={d.get(\"data\",{}).get(\"id\")}')"
echo ""
echo "=== 4. LIST SOURCES ==="
curl -s -H "Authorization: Bearer $ADMIN" "$BASE/api/sources" | python3 -c "import sys,json; d=json.load(sys.stdin); print(f'count={len(d[\"data\"])}, first={d[\"data\"][0][\"id\"] if d[\"data\"] else \"none\"}')"
echo ""
echo "=== 5. GET SOURCE ==="
curl -s -H "Authorization: Bearer $ADMIN" "$BASE/api/sources/test-source" | python3 -c "import sys,json; d=json.load(sys.stdin); print(f'status={d[\"status\"]}, type={d[\"data\"][\"type\"]}')"
echo ""
echo "=== 6. CREATE COLLECTION ==="
curl -s -X POST -H "Authorization: Bearer $ADMIN" -H "Content-Type: application/json" \
-d '{"name":"test-collection","sourceIds":["test-source"],"templateId":"default","enabled":true}' \
"$BASE/api/collections" | python3 -c "import sys,json; d=json.load(sys.stdin); print(f'status={d[\"status\"]}, id={d.get(\"data\",{}).get(\"id\")}')"
echo ""
echo "=== 7. LIST TEMPLATES ==="
curl -s -H "Authorization: Bearer $ADMIN" "$BASE/api/templates" | python3 -c "import sys,json; d=json.load(sys.stdin); [print(f' - {t[\"id\"]} ({t.get(\"target\",\"?\")}) readonly={t.get(\"readonly\",False)}') for t in d['data']]"
echo ""
echo "=== 8. DOWNLOAD SOURCE (mihomo) ==="
curl -s "$BASE/download/source/test-source?token=$DL" | head -20
echo ""
echo "=== 9. DOWNLOAD SOURCE (json) ==="
curl -s "$BASE/download/source/test-source/json?token=$DL" | python3 -c "import sys,json; d=json.load(sys.stdin); print(f'proxies count={len(d.get(\"proxies\",[]))}')"
echo ""
echo "=== 10. DOWNLOAD COLLECTION (mihomo) ==="
curl -s "$BASE/download/collection/test-collection?token=$DL" | head -20
echo ""
echo "=== 11. PREVIEW SOURCE ==="
curl -s -X POST -H "Authorization: Bearer $ADMIN" -H "Content-Type: application/json" \
-d '{"type":"local","content":"ss://aes-256-gcm:pass@1.2.3.4:8388#Test1\nss://aes-256-gcm:pass@5.6.7.8:8388#Test2","filters":[{"type":"include","pattern":"Test1"}]}' \
"$BASE/api/preview/source" | python3 -c "import sys,json; d=json.load(sys.stdin); print(f'status={d[\"status\"]}'); data=d.get('data',{}); print(f'original={len(data.get(\"original\",[]))}, processed={len(data.get(\"processed\",[]))}' if 'original' in data else f'nodes={data.get(\"nodes\")}')"
echo ""
echo "=== 12. PROXY PARSE ==="
curl -s -X POST -H "Authorization: Bearer $ADMIN" -H "Content-Type: application/json" \
-d '{"client":"mihomo","data":"ss://aes-256-gcm:pass@1.2.3.4:8388#Test1"}' \
"$BASE/api/proxy/parse" | python3 -c "import sys,json; d=json.load(sys.stdin); print(f'status={d[\"status\"]}, parsed={d[\"data\"].get(\"parsed\")}, emitted={d[\"data\"].get(\"emitted\")}') if d['status']=='success' else print(f'error: {d}')"
echo ""
echo "=== 13. RULE PARSE ==="
curl -s -X POST -H "Authorization: Bearer $ADMIN" -H "Content-Type: application/json" \
-d '{"client":"mihomo","data":"DOMAIN-SUFFIX,google.com,PROXY\nGEOIP,CN,DIRECT\nMATCH,PROXY"}' \
"$BASE/api/rule/parse" | python3 -c "import sys,json; d=json.load(sys.stdin); print(f'status={d[\"status\"]}, parsed={d[\"data\"].get(\"parsed\")}, emitted={d[\"data\"].get(\"emitted\")}') if d['status']=='success' else print(f'error: {d}')"
echo ""
echo "=== 14. CREATE SHARE ==="
curl -s -X POST -H "Authorization: Bearer $ADMIN" -H "Content-Type: application/json" \
-d '{"resourceType":"source","resourceId":"test-source","target":"mihomo"}' \
"$BASE/api/shares" | python3 -c "import sys,json; d=json.load(sys.stdin); print(f'status={d[\"status\"]}, id={d[\"data\"].get(\"id\")}, url={d[\"data\"].get(\"url\",\"\")[:80]}') if d['status']=='success' else print(f'error: {d}')"
echo ""
echo "=== 15. LIST SHARES ==="
curl -s -H "Authorization: Bearer $ADMIN" "$BASE/api/shares" | python3 -c "import sys,json; d=json.load(sys.stdin); print(f'count={len(d[\"data\"])}')"
echo ""
echo "=== 16. DELETE SOURCE ==="
curl -s -X DELETE -H "Authorization: Bearer $ADMIN" "$BASE/api/sources/test-source" | python3 -c "import sys,json; d=json.load(sys.stdin); print(f'status={d[\"status\"]}')"
echo ""
echo "=== 17. RECYCLE BIN ==="
curl -s -H "Authorization: Bearer $ADMIN" "$BASE/api/recycle-bin" | python3 -c "import sys,json; d=json.load(sys.stdin); print(f'count={len(d[\"data\"])}'); [print(f' type={e.get(\"resourceType\")}, id={e.get(\"resourceId\")}') for e in d['data']]"
echo ""
echo "=== 18. EXPORT STORAGE ==="
curl -s -H "Authorization: Bearer $ADMIN" "$BASE/api/storage" | python3 -c "import sys,json; d=json.load(sys.stdin); print(f'sources={len(d.get(\"sources\",[]))}, collections={len(d.get(\"collections\",[]))}, templates={len(d.get(\"templates\",[]))}')"
echo ""
echo "=== ALL E2E TESTS DONE ==="