C# Management Client
The TerraScale Management Client provides access to user accounts, organizations, billing, and administrative operations.
Installation
Section titled “Installation”dotnet add package TerraScale.Management.ClientConfiguration
Section titled “Configuration”using TerraScale.Management.Client;
// Create the management clientvar client = new ManagementClient(new ManagementClientOptions{ ApiBaseUrl = "https://api.terrascale.io"});
// Set access token after loginclient.SetAccessToken("eyJhbGci...");Available Sub-Clients
Section titled “Available Sub-Clients”| Sub-Client | Interface | Purpose |
|---|---|---|
Auth | IAuthClient | Login, signup, token refresh, MFA |
Users | IUserClient | User profile management |
Organizations | IOrganizationClient | Organization and team management |
Databases | IDatabaseClient | Database provisioning |
ApiKeys | IApiKeyClient | API key management |
Payment | IPaymentClient | Subscriptions and billing |
Plans | IPlanClient | Available plans |
Items | IItemClient | Database item operations |
Repositories | IRepositoryClient | Repository operations |
Authentication
Section titled “Authentication”Login with Password
Section titled “Login with Password”var loginResult = await client.Auth.LoginWithPasswordAsync(new PasswordLoginRequest( Email: "john@example.com", Password: "SecurePassword123!"));
if (loginResult.IsSuccess && loginResult.Value.Status == PasswordLoginStatus.Success){ client.SetAccessToken(loginResult.Value.AuthResponse!.AccessToken); Console.WriteLine($"Logged in as {loginResult.Value.AuthResponse.Email}");}Handle MFA
Section titled “Handle MFA”if (loginResult.Value.Status == PasswordLoginStatus.MfaRequired){ var pendingInfo = loginResult.Value.PendingInfo!;
// Get code from user Console.Write("Enter MFA code: "); var code = Console.ReadLine();
// Verify MFA var mfaResult = await client.Auth.VerifyMfaAsync(new MfaVerifyRequest( PendingAuthenticationToken: pendingInfo.PendingAuthenticationToken, ChallengeId: pendingInfo.Challenge!.Id, Code: code! ));
if (mfaResult.IsSuccess) { client.SetAccessToken(mfaResult.Value.AccessToken); }}Refresh Token
Section titled “Refresh Token”var refreshResult = await client.Auth.RefreshTokenAsync(new RefreshTokenRequest( RefreshToken: "rt_abc123..."));
if (refreshResult.IsSuccess){ client.SetAccessToken(refreshResult.Value.AccessToken);}Switch Organization
Section titled “Switch Organization”var switchResult = await client.Auth.SwitchOrganizationAsync(new SwitchOrganizationRequest( OrganizationId: "org_def456"));User Operations
Section titled “User Operations”Get Profile
Section titled “Get Profile”var userResult = await client.Users.GetCurrentUserAsync();
if (userResult.IsSuccess){ Console.WriteLine($"Hello, {userResult.Value.Name}!"); Console.WriteLine($"Email: {userResult.Value.Email}"); Console.WriteLine($"Theme: {userResult.Value.Preferences.Theme}");}Update Profile
Section titled “Update Profile”var updateResult = await client.Users.UpdateCurrentUserAsync(new UpdateUserRequest( Name: "John D. Doe", AvatarUrl: "https://example.com/avatar.jpg"));Update Preferences
Section titled “Update Preferences”var prefsResult = await client.Users.UpdatePreferencesAsync(new UpdateUserPreferencesRequest( Theme: "dark", Timezone: "America/New_York", DefaultRegion: "us-east-1"));Organization Operations
Section titled “Organization Operations”Create Organization
Section titled “Create Organization”var createOrgResult = await client.Organizations.CreateAsync(new CreateOrganizationRequest( Name: "Acme Corporation", Slug: "acme-corp", BillingEmail: "billing@acme.com"));List Organizations
Section titled “List Organizations”var listResult = await client.Organizations.ListAsync();
foreach (var org in listResult.Value.Organizations){ Console.WriteLine($"{org.OrganizationName} ({org.Role})");}Manage Members
Section titled “Manage Members”// List membersvar membersResult = await client.Organizations.ListMembersAsync("org_abc123");
// Invite membervar inviteResult = await client.Organizations.AddMemberAsync("org_abc123", new AddMemberRequest( Email: "newmember@example.com", Role: "member"));
// Update rolevar roleResult = await client.Organizations.UpdateMemberAsync("org_abc123", "usr_def456", new UpdateMemberRequest(Role: "admin"));
// Remove membervar removeResult = await client.Organizations.RemoveMemberAsync("org_abc123", "usr_def456");Database Operations
Section titled “Database Operations”Create Database
Section titled “Create Database”var createResult = await client.Databases.CreateAsync(new CreateDatabaseRequest( Name: "my-production-db", Region: "us-east-1"));
if (createResult.IsSuccess){ Console.WriteLine($"Database created: {createResult.Value.DatabaseId}");}List Databases
Section titled “List Databases”var listResult = await client.Databases.ListAsync();
foreach (var db in listResult.Value.Databases){ Console.WriteLine($"{db.Name} - {db.Status} ({db.Region})");}Delete Database
Section titled “Delete Database”var deleteResult = await client.Databases.DeleteAsync("db_abc123");API Key Operations
Section titled “API Key Operations”Create API Key
Section titled “Create API Key”var createResult = await client.ApiKeys.CreateAsync(new CreateApiKeyRequest( Name: "Production API Key", Scopes: new[] { "database:read", "database:write" }, ExpiresAt: DateTime.UtcNow.AddYears(1)));
if (createResult.IsSuccess){ // Important: Save this key - it's only shown once! Console.WriteLine($"API Key: {createResult.Value.ApiKey}");}List API Keys
Section titled “List API Keys”var listResult = await client.ApiKeys.ListAsync();
foreach (var key in listResult.Value.Keys){ Console.WriteLine($"{key.Name} ({key.KeyPrefix}...)");}Revoke API Key
Section titled “Revoke API Key”var revokeResult = await client.ApiKeys.RevokeAsync("key_abc123");Payment Operations
Section titled “Payment Operations”Get Subscription Info
Section titled “Get Subscription Info”var paymentInfo = await client.Payment.GetPaymentInfoAsync();
if (paymentInfo.IsSuccess){ Console.WriteLine($"Plan: {paymentInfo.Value.PlanName}"); Console.WriteLine($"Status: {paymentInfo.Value.Status}");}Get Usage
Section titled “Get Usage”var usageResult = await client.Payment.GetUsageAsync();
if (usageResult.IsSuccess){ Console.WriteLine($"Databases: {usageResult.Value.DatabaseCount}"); Console.WriteLine($"Storage: {usageResult.Value.TotalStorageGb} GB"); Console.WriteLine($"Requests: {usageResult.Value.TotalRequests}");}Create Checkout
Section titled “Create Checkout”var checkoutResult = await client.Payment.CreateCheckoutAsync(new CreateCheckoutRequest("pro"));
if (checkoutResult.IsSuccess){ // Redirect user to checkout URL Console.WriteLine($"Checkout: {checkoutResult.Value.CheckoutUrl}");}Get Billing Portal
Section titled “Get Billing Portal”var portalResult = await client.Payment.GetPortalUrlAsync();
if (portalResult.IsSuccess){ Console.WriteLine($"Portal: {portalResult.Value.PortalUrl}");}Plans Operations
Section titled “Plans Operations”List Plans
Section titled “List Plans”var plansResult = await client.Plans.ListAsync();
if (plansResult.IsSuccess){ foreach (var plan in plansResult.Value) { Console.WriteLine($"{plan.Name}: ${plan.MonthlyPriceCents / 100}/month"); foreach (var feature in plan.Features) { Console.WriteLine($" - {feature.Name}"); } }}Get Plan Details
Section titled “Get Plan Details”var planResult = await client.Plans.GetAsync("plan_pro");Complete Login Example
Section titled “Complete Login Example”using TerraScale.Management.Client;
var client = new ManagementClient(new ManagementClientOptions{ ApiBaseUrl = "https://api.terrascale.io"});
// Loginvar loginResult = await client.Auth.LoginWithPasswordAsync(new PasswordLoginRequest( Email: "john@example.com", Password: "SecurePassword123!"));
if (!loginResult.IsSuccess){ Console.WriteLine("Login failed"); return;}
switch (loginResult.Value.Status){ case PasswordLoginStatus.Success: client.SetAccessToken(loginResult.Value.AuthResponse!.AccessToken); break;
case PasswordLoginStatus.MfaRequired: Console.Write("Enter MFA code: "); var code = Console.ReadLine();
var mfaResult = await client.Auth.VerifyMfaAsync(new MfaVerifyRequest( PendingAuthenticationToken: loginResult.Value.PendingInfo!.PendingAuthenticationToken, ChallengeId: loginResult.Value.PendingInfo.Challenge!.Id, Code: code! ));
if (mfaResult.IsSuccess) { client.SetAccessToken(mfaResult.Value.AccessToken); } break;
case PasswordLoginStatus.EmailVerificationRequired: Console.WriteLine("Please verify your email first"); return;
default: Console.WriteLine("Login failed"); return;}
// Now use the clientvar userResult = await client.Users.GetCurrentUserAsync();Console.WriteLine($"Welcome, {userResult.Value.Name}!");
// Cleanupawait client.DisposeAsync();Next Steps
Section titled “Next Steps”- C# Database Client - Database operations
- Organizations - Organization management
- Billing - Subscription details