Files
sub2api-cn-relay-manager/scripts/acceptance/host_access_prep_lib.sh
2026-05-27 09:39:05 +08:00

120 lines
2.4 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bash
set -euo pipefail
# SQL 和缓存 key 组装 helper供 remote acceptance 脚本复用。
sql_escape_literal() {
local value="$1"
local squote="'"
value=${value//$squote/$squote$squote}
printf '%s' "$value"
}
sql_literal() {
printf "'%s'" "$(sql_escape_literal "$1")"
}
build_top_up_user_balance_sql() {
local user_id="$1"
local min_balance="$2"
cat <<SQL
UPDATE users
SET balance = CASE WHEN balance < ${min_balance} THEN ${min_balance} ELSE balance END,
updated_at = now()
WHERE id = ${user_id};
SQL
}
build_bind_api_key_group_sql() {
local api_key="$1"
local group_id="$2"
cat <<SQL
UPDATE api_keys
SET group_id = ${group_id},
updated_at = now()
WHERE key = $(sql_literal "$api_key");
SQL
}
build_api_key_auth_cache_key() {
local api_key="$1"
local digest
digest="$(printf '%s' "$api_key" | sha256sum | awk '{print $1}')"
printf 'apikey:auth:%s' "$digest"
}
build_user_balance_cache_key() {
local user_id="$1"
printf 'billing:balance:%s' "$user_id"
}
build_subscription_billing_cache_key() {
local user_id="$1"
local group_id="$2"
printf 'billing:sub:%s:%s' "$user_id" "$group_id"
}
build_upsert_subscription_sql() {
local user_id="$1"
local group_id="$2"
local duration_days="$3"
local assigned_by="$4"
local notes="$5"
cat <<SQL
INSERT INTO user_subscriptions (
user_id,
group_id,
starts_at,
expires_at,
status,
assigned_by,
assigned_at,
notes,
created_at,
updated_at,
deleted_at
)
VALUES (
${user_id},
${group_id},
now(),
now() + interval '$(sql_escape_literal "$duration_days") days',
'active',
${assigned_by},
now(),
$(sql_literal "$notes"),
now(),
now(),
NULL
)
ON CONFLICT (user_id, group_id) WHERE deleted_at IS NULL
DO UPDATE SET
starts_at = EXCLUDED.starts_at,
expires_at = EXCLUDED.expires_at,
status = 'active',
assigned_by = EXCLUDED.assigned_by,
assigned_at = EXCLUDED.assigned_at,
notes = EXCLUDED.notes,
updated_at = now(),
deleted_at = NULL;
SQL
}
build_subscription_access_prep_sql() {
local user_id="$1"
local api_key="$2"
local group_id="$3"
local min_balance="$4"
local duration_days="$5"
local assigned_by="$6"
local notes="$7"
cat <<SQL
BEGIN;
$(build_top_up_user_balance_sql "$user_id" "$min_balance")
$(build_bind_api_key_group_sql "$api_key" "$group_id")
$(build_upsert_subscription_sql "$user_id" "$group_id" "$duration_days" "$assigned_by" "$notes")
COMMIT;
SQL
}