Skip to content

Commit bf9d869

Browse files
chore: keep chat-api config script in contracts repo
1 parent d120a39 commit bf9d869

1 file changed

Lines changed: 143 additions & 0 deletions

File tree

Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
#!/usr/bin/env bash
2+
set -euo pipefail
3+
4+
# Configure chat-api system configs for House-of-Stake payments.
5+
#
6+
# Required:
7+
# ADMIN_SESSION_TOKEN=sess_... ./scripts/configure_chat_api_hos_system_configs.sh
8+
#
9+
# Optional:
10+
# CHAT_API_URL=http://localhost:8080
11+
# DRY_RUN=1
12+
#
13+
# Optional Stripe preservation/addition:
14+
# STRIPE_STARTER_PRICE_ID=price_...
15+
# STRIPE_BASIC_PRICE_ID=price_...
16+
# STRIPE_PRO_PRICE_ID=price_...
17+
# STRIPE_CREDIT_PRICE_ID=price_...
18+
19+
CHAT_API_URL="${CHAT_API_URL:-http://localhost:8080}"
20+
ADMIN_SESSION_TOKEN="${ADMIN_SESSION_TOKEN:-}"
21+
22+
HOS_AGENT_STARTER_PRICE_ID="${HOS_AGENT_STARTER_PRICE_ID:-price_RjiajH4KEZ43w68DgY5xVaVU}"
23+
HOS_AGENT_BASIC_PRICE_ID="${HOS_AGENT_BASIC_PRICE_ID:-price_h577VYQUEynPA3uQt1u1neGn}"
24+
HOS_AGENT_PRO_PRICE_ID="${HOS_AGENT_PRO_PRICE_ID:-price_7EAls0E844ULR06EEl53fQoI}"
25+
HOS_CREDIT_PRICE_ID="${HOS_CREDIT_PRICE_ID:-price_z2EbTifr7Nyqwt6v5kFqSiUb}"
26+
27+
DEFAULT_CREDITS_PROVIDER="${DEFAULT_CREDITS_PROVIDER:-stripe}"
28+
DRY_RUN="${DRY_RUN:-0}"
29+
30+
if [[ -z "$ADMIN_SESSION_TOKEN" ]]; then
31+
echo "ADMIN_SESSION_TOKEN is required" >&2
32+
exit 1
33+
fi
34+
35+
export HOS_AGENT_STARTER_PRICE_ID
36+
export HOS_AGENT_BASIC_PRICE_ID
37+
export HOS_AGENT_PRO_PRICE_ID
38+
export HOS_CREDIT_PRICE_ID
39+
export DEFAULT_CREDITS_PROVIDER
40+
41+
python3 - "$CHAT_API_URL" "$ADMIN_SESSION_TOKEN" "$DRY_RUN" <<'PY'
42+
import json
43+
import os
44+
import sys
45+
import urllib.error
46+
import urllib.request
47+
48+
chat_api_url = sys.argv[1].rstrip("/")
49+
admin_session_token = sys.argv[2]
50+
dry_run = sys.argv[3] == "1"
51+
52+
53+
def request_json(method, path, body=None):
54+
data = None
55+
headers = {
56+
"Authorization": f"Bearer {admin_session_token}",
57+
"Accept": "application/json",
58+
}
59+
if body is not None:
60+
data = json.dumps(body, sort_keys=True).encode("utf-8")
61+
headers["Content-Type"] = "application/json"
62+
63+
request = urllib.request.Request(
64+
f"{chat_api_url}{path}",
65+
data=data,
66+
headers=headers,
67+
method=method,
68+
)
69+
try:
70+
with urllib.request.urlopen(request, timeout=30) as response:
71+
raw = response.read().decode("utf-8")
72+
return json.loads(raw) if raw else None
73+
except urllib.error.HTTPError as error:
74+
details = error.read().decode("utf-8", errors="replace")
75+
raise SystemExit(
76+
f"{method} {path} failed with HTTP {error.code}: {details}"
77+
) from error
78+
79+
80+
def env(name, default=None):
81+
value = os.environ.get(name, default)
82+
return value.strip() if isinstance(value, str) else value
83+
84+
85+
current = request_json("GET", "/v1/admin/configs") or {}
86+
subscription_plans = current.get("subscription_plans") or {}
87+
88+
hos_plans = {
89+
"starter": {
90+
"price_id": env("HOS_AGENT_STARTER_PRICE_ID"),
91+
"agent_instances": {"max": 1},
92+
},
93+
"basic": {
94+
"price_id": env("HOS_AGENT_BASIC_PRICE_ID"),
95+
"agent_instances": {"max": 2},
96+
},
97+
"pro": {
98+
"price_id": env("HOS_AGENT_PRO_PRICE_ID"),
99+
"agent_instances": {"max": 5},
100+
},
101+
}
102+
103+
stripe_plan_env = {
104+
"starter": env("STRIPE_STARTER_PRICE_ID", ""),
105+
"basic": env("STRIPE_BASIC_PRICE_ID", ""),
106+
"pro": env("STRIPE_PRO_PRICE_ID", ""),
107+
}
108+
109+
for plan_name, hos_config in hos_plans.items():
110+
plan = dict(subscription_plans.get(plan_name) or {})
111+
providers = dict(plan.get("providers") or {})
112+
providers["house-of-stake"] = {"price_id": hos_config["price_id"]}
113+
stripe_price_id = stripe_plan_env.get(plan_name)
114+
if stripe_price_id:
115+
providers["stripe"] = {"price_id": stripe_price_id}
116+
plan["providers"] = providers
117+
plan["agent_instances"] = hos_config["agent_instances"]
118+
subscription_plans[plan_name] = plan
119+
120+
credits = dict(current.get("credits") or {})
121+
credit_providers = dict(credits.get("providers") or {})
122+
credit_providers["house-of-stake"] = {"price_id": env("HOS_CREDIT_PRICE_ID")}
123+
stripe_credit_price_id = env("STRIPE_CREDIT_PRICE_ID", "")
124+
if stripe_credit_price_id:
125+
credit_providers["stripe"] = {"price_id": stripe_credit_price_id}
126+
credits["providers"] = credit_providers
127+
credits["default_provider"] = env("DEFAULT_CREDITS_PROVIDER", "stripe")
128+
129+
payload = {
130+
"subscription_plans": subscription_plans,
131+
"credits": credits,
132+
}
133+
134+
print(json.dumps(payload, indent=2, sort_keys=True))
135+
136+
if dry_run:
137+
print("DRY_RUN=1; not PATCHing /v1/admin/configs")
138+
raise SystemExit(0)
139+
140+
updated = request_json("PATCH", "/v1/admin/configs", payload)
141+
print("Updated /v1/admin/configs")
142+
print(json.dumps(updated, indent=2, sort_keys=True))
143+
PY

0 commit comments

Comments
 (0)