feat(scripts): automate real-host access prep closure
This commit is contained in:
99
scripts/host_access_prep_lib.sh
Normal file
99
scripts/host_access_prep_lib.sh
Normal file
@@ -0,0 +1,99 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
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_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
|
||||
}
|
||||
Reference in New Issue
Block a user