amanpay / scripts /d2_issue_customer_invites.py
MHamdan's picture
CI deploy 7ec800a
824d0dd verified
Raw
History Blame Contribute Delete
2.05 kB
#!/usr/bin/env python
"""Issue a batch of one-time D2 customer invitations. Prints codes exactly once.
Usage:
python scripts/d2_issue_customer_invites.py --db-path /tmp/amanpay-d2/amanpay.db \
--tenant event-alpha --count 25 [--ttl 86400] [--csv]
--csv emits id,code rows (still safe: codes are one-time and never re-derivable from the DB).
"""
from __future__ import annotations
import argparse
import csv
import sys
from amanpay.identity.cli import emit, open_storage, resolve_tenant_id, snapshot_best_effort
from amanpay.identity.service import IdentityService
def main(argv=None) -> int:
ap = argparse.ArgumentParser(description="Issue D2 customer invitations")
ap.add_argument("--db-path", required=True)
ap.add_argument("--tenant", required=True, help="tenant id or slug")
ap.add_argument("--count", type=int, default=1)
ap.add_argument("--ttl", type=int, default=86400)
ap.add_argument("--csv", action="store_true")
args = ap.parse_args(argv)
count = max(1, min(int(args.count), 500))
storage = open_storage(args.db_path)
try:
ident = IdentityService.from_storage(storage)
tenant_id = resolve_tenant_id(ident.repo, args.tenant)
pairs = []
for _ in range(count):
inv, code = ident.invites.create(tenant_id=tenant_id, role="customer",
ttl_seconds=args.ttl)
pairs.append((inv.id, code))
gen = snapshot_best_effort(storage)
if args.csv:
w = csv.writer(sys.stdout)
w.writerow(["invitation_id", "code"])
for iid, code in pairs:
w.writerow([iid, code])
else:
emit({"tenant_id": tenant_id, "count": len(pairs), "snapshot_generation": gen,
"invitations": [{"id": iid, "code": code} for iid, code in pairs],
"note": "Codes shown once — only hashes are stored."})
finally:
storage.close()
return 0
if __name__ == "__main__":
raise SystemExit(main())