feat(bitdefender): complete Companies module (build-out 2/N)

- Completed Companies module for bitdefender GravityZone Public API
- Implemented: getCompanyDetails, getCompanyDetailsByUser, createCompany, suspendCompany, activateCompany, deleteCompany
- Discovered updateCompany and getCompaniesList not available; companies retrieved via network inventory
- Company types: 0=Partner, 1=Customer; createCompany accepts nested licenseSubscription via JSON passthrough
- All write operations require --confirm; raw also restricts createCompany/suspendCompany/activateCompany
- selftest 49 -> 55 passing

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-21 10:26:14 -07:00
parent 8a64bc48e6
commit 2a1ffab19f
5 changed files with 168 additions and 8 deletions

View File

@@ -254,6 +254,61 @@ class GravityZoneClient:
def get_own_company(self) -> dict:
return self._jsonrpc_request("companies", "getCompanyDetails", {}) or {}
def get_company_details(self, company_id: Optional[str] = None) -> dict:
"""Company detail (companies.getCompanyDetails). No id ⇒ own company."""
params: dict = {}
if company_id:
params["companyId"] = company_id
return self._jsonrpc_request("companies", "getCompanyDetails", params) or {}
def get_company_by_user(self, username: str) -> dict:
"""Company that owns a given user (companies.getCompanyDetailsByUser)."""
return self._jsonrpc_request(
"companies", "getCompanyDetailsByUser", {"username": username}
) or {}
def create_company(
self,
company_type: int,
name: str,
parent_id: Optional[str] = None,
extra: Optional[dict] = None,
) -> Any:
"""Create a company (companies.createCompany). STATE-CHANGING.
Required (verified): `type` (0=Partner, 1=Customer) and `name`. Documented
optional params: parentId, address, country, state, phone, industry,
canBeManagedByAbove, assignedProductType, and a nested `licenseSubscription`
{type (3=monthly subscription, 4=monthly trial), reservedSlots,
endSubscription, autoRenewPeriod, ...}. Pass those via `extra`. Gate at
the call site behind --confirm.
Docs: bitdefender.com/business/support/en/77211-126236-createcompany.html
"""
params: dict = {"type": company_type, "name": name}
if parent_id is not None:
params["parentId"] = parent_id
if extra:
params.update(extra)
return self._jsonrpc_request("companies", "createCompany", params)
def suspend_company(self, company_id: str) -> Any:
"""Suspend a company (companies.suspendCompany). STATE-CHANGING. Gated."""
return self._jsonrpc_request(
"companies", "suspendCompany", {"companyId": company_id}
)
def activate_company(self, company_id: str) -> Any:
"""Activate a suspended company (companies.activateCompany). STATE-CHANGING."""
return self._jsonrpc_request(
"companies", "activateCompany", {"companyId": company_id}
)
def delete_company(self, company_id: str) -> Any:
"""Delete a company (companies.deleteCompany). STATE-CHANGING. Gated."""
return self._jsonrpc_request(
"companies", "deleteCompany", {"companyId": company_id}
)
def list_companies(self, page: int = 1, per_page: int = 100) -> dict:
result = self._jsonrpc_request(
"network",