Repository files navigation

InfinityFlow.DigitalOcean.Client

GitHub Actions Workflow StatusGitHub ReleaseGitHub LicenseNuGet

Discord

A strongly-typed .NET client for the DigitalOcean API, generated using Microsoft's Kiota SDK generator. This client provides a simple and intuitive way to interact with DigitalOcean's services from .NET applications.

Architecture Overview

graph TD
A[Client Application] -->|Uses| B[DigitalOceanClient]
B -->|Authenticates via| C[ITokenProvider]
C -->|Implements| D[StaticTokenProvider]
C -->|Can implement| E[Custom Token Provider]
B -->|Makes requests to| F[DigitalOcean API]
B -->|Uses| G[Strongly-typed Models]
G -->|Includes| H[Account, Droplet, etc.]
Loading

Features

  • Complete coverage of the DigitalOcean API v2
  • Strongly-typed models for all API entities
  • Asynchronous API for non-blocking operations
  • Authentication options for API tokens
  • Easy integration with dependency injection
  • Generated from the OpenAPI specification
  • Comprehensive error handling

Installation

Install the package from NuGet:

dotnet add package InfinityFlow.DigitalOcean.Client

Quick Start

Basic Usage

// Create a client with an API tokenvartokenProvider=newStaticTokenProvider("your-digitalocean-api-token");varhttpClient=newHttpClient();varclient=newDigitalOceanClient(httpClient,tokenProvider);// Get account informationvaraccount=awaitclient.Account.GetAsync();Console.WriteLine($"Account: {account.Email}, {account.Status}");// List all dropletsvardroplets=awaitclient.Droplets.GetAsync();foreach(vardropletindroplets.Droplets){Console.WriteLine($"Droplet: {droplet.Name}, {droplet.Status}");}

Dependency Injection Setup

// In Program.cs or Startup.csservices.AddDigitalOceanClient(options =>{options.Token=Configuration["DigitalOcean:ApiToken"];});// In your servicepublicclassMyService{privatereadonlyDigitalOceanClient_client;publicMyService(DigitalOceanClientclient){_client=client;}publicasyncTaskDoSomethingAsync(){vardroplets=await_client.Droplets.GetAsync();// ...}}

API Coverage

This client covers all DigitalOcean API endpoints:

  • Account
  • Actions
  • Apps
  • Billing
  • Block Storage
  • CDN Endpoints
  • Certificates
  • Container Registry
  • Databases
  • DNS (Domains)
  • Droplets
  • Firewalls
  • Floating IPs
  • Kubernetes
  • Load Balancers
  • Monitoring
  • Projects
  • Regions
  • Reserved IPs
  • Sizes
  • Snapshots
  • SSH Keys
  • Tags
  • VPCs

Authentication

The client supports authentication using a DigitalOcean API token:

// Static token provider (simple approach)vartokenProvider=newStaticTokenProvider("your-api-token");// For more dynamic scenarios, implement ITokenProviderpublicclassMyTokenProvider:ITokenProvider{publicTask<string>GetTokenAsync(CancellationTokencancellationToken){// Get token from a secure storage or servicereturnTask.FromResult(GetSecureToken());}}

Advanced Usage

Request Options

You can customize requests with options:

// Get droplets with pagingvaroptions=newDropletsRequestBuilder.GetRequestConfiguration{QueryParameters=newDropletsRequestBuilder.GetQueryParameters{Page=2,PerPage=25}};vardroplets=awaitclient.Droplets.GetAsync(requestConfiguration:options);

Error Handling

The client throws strongly-typed exceptions for API errors:

try{vardroplet=awaitclient.Droplets.ByDropletId(123456).GetAsync();// Process droplet}catch(DigitalOceanApiExceptionex)when(ex.StatusCode==404){Console.WriteLine("Droplet not found");}catch(DigitalOceanApiExceptionex){Console.WriteLine($"API error: {ex.StatusCode}, {ex.Message}");}catch(Exceptionex){Console.WriteLine($"Unexpected error: {ex.Message}");}

Creating Resources

Creating resources is type-safe and intuitive:

// Create a new dropletvarnewDroplet=newDroplet{Name="example-droplet",Region="nyc3",Size="s-1vcpu-1gb",Image=123456789,// Ubuntu image IDSshKeys=newList<int>{123456},// SSH key IDBackups=false,Ipv6=true,Monitoring=true,Tags=newList<string>{"web","production"}};varcreatedDroplet=awaitclient.Droplets.PostAsync(newDroplet);Console.WriteLine($"Created droplet with ID: {createdDroplet.Id}");

Models

The client includes strongly-typed models for all DigitalOcean entities. Here are some key models:

// Account informationpublicclassAccount{publicstringEmail{get;set;}publicstringStatus{get;set;}publicAccount_statusStatus_enum{get;set;}publicboolDroplet_limit{get;set;}publicboolEmail_verified{get;set;}publicAccount_teamTeam{get;set;}publicDateTimeOffsetCreated_at{get;set;}}// Droplet configurationpublicclassDroplet{publicintId{get;set;}publicstringName{get;set;}publicintMemory{get;set;}publicintVcpus{get;set;}publicintDisk{get;set;}publicstringRegion{get;set;}publicstringSize{get;set;}publicstringStatus{get;set;}// Additional properties...}// Many other models available...

Development

Building from Source

git clone https://github.com/InfinityFlowApp/InfinityFlow.DigitalOcean.Client.git
cd InfinityFlow.DigitalOcean.Client
dotnet build

Running Tests

dotnet test

Generating a New Client

The client is generated using Kiota:

# Install Kiota
dotnet tool install -g Microsoft.OpenAPI.Kiota
# Get the OpenAPI specification
curl -o openapi.json https://raw.githubusercontent.com/digitalocean/openapi/master/specification/DigitalOcean-public.v2.yaml
# Generate the client
kiota generate --language CSharp --namespace InfinityFlow.DigitalOcean.Client --output-dir ./src/InfinityFlow.DigitalOcean.Client --openapi openapi.json --class-name DigitalOceanClient --clean-output

Contributing

We welcome contributions! Please feel free to submit a Pull Request.

  1. Fork the repository
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create a new Pull Request

License

This project is licensed under the MIT License - see the LICENSE file for details.

Acknowledgments

Troubleshooting

Common Issues and Solutions

IssueSolution
401 UnauthorizedVerify your API token is valid and has the required scopes
429 Too Many RequestsImplement rate limiting or exponential backoff in your application
Connection timeoutCheck your network connection and DigitalOcean status page
Serialization errorsEnsure you're using the latest client version compatible with the API

Debugging

Enable detailed logging by configuring your logger:

// Setup logging (using Microsoft.Extensions.Logging)services.AddLogging(builder =>{builder.AddConsole();builder.AddDebug();builder.SetMinimumLevel(LogLevel.Debug);});// Add client with loggingservices.AddDigitalOceanClient(options =>{options.Token=Configuration["DigitalOcean:ApiToken"];options.EnableDebugLogging=true;});

Rate Limiting

The DigitalOcean API implements rate limiting. You can handle this by checking response headers:

try{varresult=awaitclient.Droplets.GetAsync();// Process result}catch(DigitalOceanApiExceptionex)when(ex.StatusCode==429){// Get rate limit headersvarrateLimit=ex.ResponseHeaders.GetValueOrDefault("RateLimit-Limit");varrateLimitRemaining=ex.ResponseHeaders.GetValueOrDefault("RateLimit-Remaining");varrateLimitReset=ex.ResponseHeaders.GetValueOrDefault("RateLimit-Reset");// Implement backoff strategyvarresetTime=DateTimeOffset.FromUnixTimeSeconds(long.Parse(rateLimitReset));varwaitTime=resetTime-DateTimeOffset.UtcNow;Console.WriteLine($"Rate limited. Waiting for {waitTime.TotalSeconds} seconds before retrying.");awaitTask.Delay(waitTime);// Retry the requestresult=awaitclient.Droplets.GetAsync();}

About

A generated .NET Client for DigitalOcean's API.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks"); } } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); } })(); (function(){ try { var __m = "github.com"; var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

InfinityFlow.DigitalOcean.Client

GitHub Actions Workflow StatusGitHub ReleaseGitHub LicenseNuGet

Discord

A strongly-typed .NET client for the DigitalOcean API, generated using Microsoft's Kiota SDK generator. This client provides a simple and intuitive way to interact with DigitalOcean's services from .NET applications.

Architecture Overview

graph TD
A[Client Application] -->|Uses| B[DigitalOceanClient]
B -->|Authenticates via| C[ITokenProvider]
C -->|Implements| D[StaticTokenProvider]
C -->|Can implement| E[Custom Token Provider]
B -->|Makes requests to| F[DigitalOcean API]
B -->|Uses| G[Strongly-typed Models]
G -->|Includes| H[Account, Droplet, etc.]
Loading

Features

  • Complete coverage of the DigitalOcean API v2
  • Strongly-typed models for all API entities
  • Asynchronous API for non-blocking operations
  • Authentication options for API tokens
  • Easy integration with dependency injection
  • Generated from the OpenAPI specification
  • Comprehensive error handling

Installation

Install the package from NuGet:

dotnet add package InfinityFlow.DigitalOcean.Client

Quick Start

Basic Usage

// Create a client with an API tokenvartokenProvider=newStaticTokenProvider("your-digitalocean-api-token");varhttpClient=newHttpClient();varclient=newDigitalOceanClient(httpClient,tokenProvider);// Get account informationvaraccount=awaitclient.Account.GetAsync();Console.WriteLine($"Account: {account.Email}, {account.Status}");// List all dropletsvardroplets=awaitclient.Droplets.GetAsync();foreach(vardropletindroplets.Droplets){Console.WriteLine($"Droplet: {droplet.Name}, {droplet.Status}");}

Dependency Injection Setup

// In Program.cs or Startup.csservices.AddDigitalOceanClient(options =>{options.Token=Configuration["DigitalOcean:ApiToken"];});// In your servicepublicclassMyService{privatereadonlyDigitalOceanClient_client;publicMyService(DigitalOceanClientclient){_client=client;}publicasyncTaskDoSomethingAsync(){vardroplets=await_client.Droplets.GetAsync();// ...}}

API Coverage

This client covers all DigitalOcean API endpoints:

  • Account
  • Actions
  • Apps
  • Billing
  • Block Storage
  • CDN Endpoints
  • Certificates
  • Container Registry
  • Databases
  • DNS (Domains)
  • Droplets
  • Firewalls
  • Floating IPs
  • Kubernetes
  • Load Balancers
  • Monitoring
  • Projects
  • Regions
  • Reserved IPs
  • Sizes
  • Snapshots
  • SSH Keys
  • Tags
  • VPCs

Authentication

The client supports authentication using a DigitalOcean API token:

// Static token provider (simple approach)vartokenProvider=newStaticTokenProvider("your-api-token");// For more dynamic scenarios, implement ITokenProviderpublicclassMyTokenProvider:ITokenProvider{publicTask<string>GetTokenAsync(CancellationTokencancellationToken){// Get token from a secure storage or servicereturnTask.FromResult(GetSecureToken());}}

Advanced Usage

Request Options

You can customize requests with options:

// Get droplets with pagingvaroptions=newDropletsRequestBuilder.GetRequestConfiguration{QueryParameters=newDropletsRequestBuilder.GetQueryParameters{Page=2,PerPage=25}};vardroplets=awaitclient.Droplets.GetAsync(requestConfiguration:options);

Error Handling

The client throws strongly-typed exceptions for API errors:

try{vardroplet=awaitclient.Droplets.ByDropletId(123456).GetAsync();// Process droplet}catch(DigitalOceanApiExceptionex)when(ex.StatusCode==404){Console.WriteLine("Droplet not found");}catch(DigitalOceanApiExceptionex){Console.WriteLine($"API error: {ex.StatusCode}, {ex.Message}");}catch(Exceptionex){Console.WriteLine($"Unexpected error: {ex.Message}");}

Creating Resources

Creating resources is type-safe and intuitive:

// Create a new dropletvarnewDroplet=newDroplet{Name="example-droplet",Region="nyc3",Size="s-1vcpu-1gb",Image=123456789,// Ubuntu image IDSshKeys=newList<int>{123456},// SSH key IDBackups=false,Ipv6=true,Monitoring=true,Tags=newList<string>{"web","production"}};varcreatedDroplet=awaitclient.Droplets.PostAsync(newDroplet);Console.WriteLine($"Created droplet with ID: {createdDroplet.Id}");

Models

The client includes strongly-typed models for all DigitalOcean entities. Here are some key models:

// Account informationpublicclassAccount{publicstringEmail{get;set;}publicstringStatus{get;set;}publicAccount_statusStatus_enum{get;set;}publicboolDroplet_limit{get;set;}publicboolEmail_verified{get;set;}publicAccount_teamTeam{get;set;}publicDateTimeOffsetCreated_at{get;set;}}// Droplet configurationpublicclassDroplet{publicintId{get;set;}publicstringName{get;set;}publicintMemory{get;set;}publicintVcpus{get;set;}publicintDisk{get;set;}publicstringRegion{get;set;}publicstringSize{get;set;}publicstringStatus{get;set;}// Additional properties...}// Many other models available...

Development

Building from Source

git clone https://github.com/InfinityFlowApp/InfinityFlow.DigitalOcean.Client.git
cd InfinityFlow.DigitalOcean.Client
dotnet build

Running Tests

dotnet test

Generating a New Client

The client is generated using Kiota:

# Install Kiota
dotnet tool install -g Microsoft.OpenAPI.Kiota
# Get the OpenAPI specification
curl -o openapi.json https://raw.githubusercontent.com/digitalocean/openapi/master/specification/DigitalOcean-public.v2.yaml
# Generate the client
kiota generate --language CSharp --namespace InfinityFlow.DigitalOcean.Client --output-dir ./src/InfinityFlow.DigitalOcean.Client --openapi openapi.json --class-name DigitalOceanClient --clean-output

Contributing

We welcome contributions! Please feel free to submit a Pull Request.

  1. Fork the repository
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create a new Pull Request

License

This project is licensed under the MIT License - see the LICENSE file for details.

Acknowledgments

Troubleshooting

Common Issues and Solutions

IssueSolution
401 UnauthorizedVerify your API token is valid and has the required scopes
429 Too Many RequestsImplement rate limiting or exponential backoff in your application
Connection timeoutCheck your network connection and DigitalOcean status page
Serialization errorsEnsure you're using the latest client version compatible with the API

Debugging

Enable detailed logging by configuring your logger:

// Setup logging (using Microsoft.Extensions.Logging)services.AddLogging(builder =>{builder.AddConsole();builder.AddDebug();builder.SetMinimumLevel(LogLevel.Debug);});// Add client with loggingservices.AddDigitalOceanClient(options =>{options.Token=Configuration["DigitalOcean:ApiToken"];options.EnableDebugLogging=true;});

Rate Limiting

The DigitalOcean API implements rate limiting. You can handle this by checking response headers:

try{varresult=awaitclient.Droplets.GetAsync();// Process result}catch(DigitalOceanApiExceptionex)when(ex.StatusCode==429){// Get rate limit headersvarrateLimit=ex.ResponseHeaders.GetValueOrDefault("RateLimit-Limit");varrateLimitRemaining=ex.ResponseHeaders.GetValueOrDefault("RateLimit-Remaining");varrateLimitReset=ex.ResponseHeaders.GetValueOrDefault("RateLimit-Reset");// Implement backoff strategyvarresetTime=DateTimeOffset.FromUnixTimeSeconds(long.Parse(rateLimitReset));varwaitTime=resetTime-DateTimeOffset.UtcNow;Console.WriteLine($"Rate limited. Waiting for {waitTime.TotalSeconds} seconds before retrying.");awaitTask.Delay(waitTime);// Retry the requestresult=awaitclient.Droplets.GetAsync();}

About

A generated .NET Client for DigitalOcean's API.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

InfinityFlow.DigitalOcean.Client

GitHub Actions Workflow StatusGitHub ReleaseGitHub LicenseNuGet

Discord

A strongly-typed .NET client for the DigitalOcean API, generated using Microsoft's Kiota SDK generator. This client provides a simple and intuitive way to interact with DigitalOcean's services from .NET applications.

Architecture Overview

graph TD
A[Client Application] -->|Uses| B[DigitalOceanClient]
B -->|Authenticates via| C[ITokenProvider]
C -->|Implements| D[StaticTokenProvider]
C -->|Can implement| E[Custom Token Provider]
B -->|Makes requests to| F[DigitalOcean API]
B -->|Uses| G[Strongly-typed Models]
G -->|Includes| H[Account, Droplet, etc.]
Loading

Features

  • Complete coverage of the DigitalOcean API v2
  • Strongly-typed models for all API entities
  • Asynchronous API for non-blocking operations
  • Authentication options for API tokens
  • Easy integration with dependency injection
  • Generated from the OpenAPI specification
  • Comprehensive error handling

Installation

Install the package from NuGet:

dotnet add package InfinityFlow.DigitalOcean.Client

Quick Start

Basic Usage

// Create a client with an API tokenvartokenProvider=newStaticTokenProvider("your-digitalocean-api-token");varhttpClient=newHttpClient();varclient=newDigitalOceanClient(httpClient,tokenProvider);// Get account informationvaraccount=awaitclient.Account.GetAsync();Console.WriteLine($"Account: {account.Email}, {account.Status}");// List all dropletsvardroplets=awaitclient.Droplets.GetAsync();foreach(vardropletindroplets.Droplets){Console.WriteLine($"Droplet: {droplet.Name}, {droplet.Status}");}

Dependency Injection Setup

// In Program.cs or Startup.csservices.AddDigitalOceanClient(options =>{options.Token=Configuration["DigitalOcean:ApiToken"];});// In your servicepublicclassMyService{privatereadonlyDigitalOceanClient_client;publicMyService(DigitalOceanClientclient){_client=client;}publicasyncTaskDoSomethingAsync(){vardroplets=await_client.Droplets.GetAsync();// ...}}

API Coverage

This client covers all DigitalOcean API endpoints:

  • Account
  • Actions
  • Apps
  • Billing
  • Block Storage
  • CDN Endpoints
  • Certificates
  • Container Registry
  • Databases
  • DNS (Domains)
  • Droplets
  • Firewalls
  • Floating IPs
  • Kubernetes
  • Load Balancers
  • Monitoring
  • Projects
  • Regions
  • Reserved IPs
  • Sizes
  • Snapshots
  • SSH Keys
  • Tags
  • VPCs

Authentication

The client supports authentication using a DigitalOcean API token:

// Static token provider (simple approach)vartokenProvider=newStaticTokenProvider("your-api-token");// For more dynamic scenarios, implement ITokenProviderpublicclassMyTokenProvider:ITokenProvider{publicTask<string>GetTokenAsync(CancellationTokencancellationToken){// Get token from a secure storage or servicereturnTask.FromResult(GetSecureToken());}}

Advanced Usage

Request Options

You can customize requests with options:

// Get droplets with pagingvaroptions=newDropletsRequestBuilder.GetRequestConfiguration{QueryParameters=newDropletsRequestBuilder.GetQueryParameters{Page=2,PerPage=25}};vardroplets=awaitclient.Droplets.GetAsync(requestConfiguration:options);

Error Handling

The client throws strongly-typed exceptions for API errors:

try{vardroplet=awaitclient.Droplets.ByDropletId(123456).GetAsync();// Process droplet}catch(DigitalOceanApiExceptionex)when(ex.StatusCode==404){Console.WriteLine("Droplet not found");}catch(DigitalOceanApiExceptionex){Console.WriteLine($"API error: {ex.StatusCode}, {ex.Message}");}catch(Exceptionex){Console.WriteLine($"Unexpected error: {ex.Message}");}

Creating Resources

Creating resources is type-safe and intuitive:

// Create a new dropletvarnewDroplet=newDroplet{Name="example-droplet",Region="nyc3",Size="s-1vcpu-1gb",Image=123456789,// Ubuntu image IDSshKeys=newList<int>{123456},// SSH key IDBackups=false,Ipv6=true,Monitoring=true,Tags=newList<string>{"web","production"}};varcreatedDroplet=awaitclient.Droplets.PostAsync(newDroplet);Console.WriteLine($"Created droplet with ID: {createdDroplet.Id}");

Models

The client includes strongly-typed models for all DigitalOcean entities. Here are some key models:

// Account informationpublicclassAccount{publicstringEmail{get;set;}publicstringStatus{get;set;}publicAccount_statusStatus_enum{get;set;}publicboolDroplet_limit{get;set;}publicboolEmail_verified{get;set;}publicAccount_teamTeam{get;set;}publicDateTimeOffsetCreated_at{get;set;}}// Droplet configurationpublicclassDroplet{publicintId{get;set;}publicstringName{get;set;}publicintMemory{get;set;}publicintVcpus{get;set;}publicintDisk{get;set;}publicstringRegion{get;set;}publicstringSize{get;set;}publicstringStatus{get;set;}// Additional properties...}// Many other models available...

Development

Building from Source

git clone https://github.com/InfinityFlowApp/InfinityFlow.DigitalOcean.Client.git
cd InfinityFlow.DigitalOcean.Client
dotnet build

Running Tests

dotnet test

Generating a New Client

The client is generated using Kiota:

# Install Kiota
dotnet tool install -g Microsoft.OpenAPI.Kiota
# Get the OpenAPI specification
curl -o openapi.json https://raw.githubusercontent.com/digitalocean/openapi/master/specification/DigitalOcean-public.v2.yaml
# Generate the client
kiota generate --language CSharp --namespace InfinityFlow.DigitalOcean.Client --output-dir ./src/InfinityFlow.DigitalOcean.Client --openapi openapi.json --class-name DigitalOceanClient --clean-output

Contributing

We welcome contributions! Please feel free to submit a Pull Request.

  1. Fork the repository
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create a new Pull Request

License

This project is licensed under the MIT License - see the LICENSE file for details.

Acknowledgments

Troubleshooting

Common Issues and Solutions

IssueSolution
401 UnauthorizedVerify your API token is valid and has the required scopes
429 Too Many RequestsImplement rate limiting or exponential backoff in your application
Connection timeoutCheck your network connection and DigitalOcean status page
Serialization errorsEnsure you're using the latest client version compatible with the API

Debugging

Enable detailed logging by configuring your logger:

// Setup logging (using Microsoft.Extensions.Logging)services.AddLogging(builder =>{builder.AddConsole();builder.AddDebug();builder.SetMinimumLevel(LogLevel.Debug);});// Add client with loggingservices.AddDigitalOceanClient(options =>{options.Token=Configuration["DigitalOcean:ApiToken"];options.EnableDebugLogging=true;});

Rate Limiting

The DigitalOcean API implements rate limiting. You can handle this by checking response headers:

try{varresult=awaitclient.Droplets.GetAsync();// Process result}catch(DigitalOceanApiExceptionex)when(ex.StatusCode==429){// Get rate limit headersvarrateLimit=ex.ResponseHeaders.GetValueOrDefault("RateLimit-Limit");varrateLimitRemaining=ex.ResponseHeaders.GetValueOrDefault("RateLimit-Remaining");varrateLimitReset=ex.ResponseHeaders.GetValueOrDefault("RateLimit-Reset");// Implement backoff strategyvarresetTime=DateTimeOffset.FromUnixTimeSeconds(long.Parse(rateLimitReset));varwaitTime=resetTime-DateTimeOffset.UtcNow;Console.WriteLine($"Rate limited. Waiting for {waitTime.TotalSeconds} seconds before retrying.");awaitTask.Delay(waitTime);// Retry the requestresult=awaitclient.Droplets.GetAsync();}

About

A generated .NET Client for DigitalOcean's API.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length \u003e 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

InfinityFlow.DigitalOcean.Client

GitHub Actions Workflow StatusGitHub ReleaseGitHub LicenseNuGet

Discord

A strongly-typed .NET client for the DigitalOcean API, generated using Microsoft's Kiota SDK generator. This client provides a simple and intuitive way to interact with DigitalOcean's services from .NET applications.

Architecture Overview

graph TD
A[Client Application] -->|Uses| B[DigitalOceanClient]
B -->|Authenticates via| C[ITokenProvider]
C -->|Implements| D[StaticTokenProvider]
C -->|Can implement| E[Custom Token Provider]
B -->|Makes requests to| F[DigitalOcean API]
B -->|Uses| G[Strongly-typed Models]
G -->|Includes| H[Account, Droplet, etc.]
Loading

Features

  • Complete coverage of the DigitalOcean API v2
  • Strongly-typed models for all API entities
  • Asynchronous API for non-blocking operations
  • Authentication options for API tokens
  • Easy integration with dependency injection
  • Generated from the OpenAPI specification
  • Comprehensive error handling

Installation

Install the package from NuGet:

dotnet add package InfinityFlow.DigitalOcean.Client

Quick Start

Basic Usage

// Create a client with an API tokenvartokenProvider=newStaticTokenProvider("your-digitalocean-api-token");varhttpClient=newHttpClient();varclient=newDigitalOceanClient(httpClient,tokenProvider);// Get account informationvaraccount=awaitclient.Account.GetAsync();Console.WriteLine($"Account: {account.Email}, {account.Status}");// List all dropletsvardroplets=awaitclient.Droplets.GetAsync();foreach(vardropletindroplets.Droplets){Console.WriteLine($"Droplet: {droplet.Name}, {droplet.Status}");}

Dependency Injection Setup

// In Program.cs or Startup.csservices.AddDigitalOceanClient(options =>{options.Token=Configuration["DigitalOcean:ApiToken"];});// In your servicepublicclassMyService{privatereadonlyDigitalOceanClient_client;publicMyService(DigitalOceanClientclient){_client=client;}publicasyncTaskDoSomethingAsync(){vardroplets=await_client.Droplets.GetAsync();// ...}}

API Coverage

This client covers all DigitalOcean API endpoints:

  • Account
  • Actions
  • Apps
  • Billing
  • Block Storage
  • CDN Endpoints
  • Certificates
  • Container Registry
  • Databases
  • DNS (Domains)
  • Droplets
  • Firewalls
  • Floating IPs
  • Kubernetes
  • Load Balancers
  • Monitoring
  • Projects
  • Regions
  • Reserved IPs
  • Sizes
  • Snapshots
  • SSH Keys
  • Tags
  • VPCs

Authentication

The client supports authentication using a DigitalOcean API token:

// Static token provider (simple approach)vartokenProvider=newStaticTokenProvider("your-api-token");// For more dynamic scenarios, implement ITokenProviderpublicclassMyTokenProvider:ITokenProvider{publicTask<string>GetTokenAsync(CancellationTokencancellationToken){// Get token from a secure storage or servicereturnTask.FromResult(GetSecureToken());}}

Advanced Usage

Request Options

You can customize requests with options:

// Get droplets with pagingvaroptions=newDropletsRequestBuilder.GetRequestConfiguration{QueryParameters=newDropletsRequestBuilder.GetQueryParameters{Page=2,PerPage=25}};vardroplets=awaitclient.Droplets.GetAsync(requestConfiguration:options);

Error Handling

The client throws strongly-typed exceptions for API errors:

try{vardroplet=awaitclient.Droplets.ByDropletId(123456).GetAsync();// Process droplet}catch(DigitalOceanApiExceptionex)when(ex.StatusCode==404){Console.WriteLine("Droplet not found");}catch(DigitalOceanApiExceptionex){Console.WriteLine($"API error: {ex.StatusCode}, {ex.Message}");}catch(Exceptionex){Console.WriteLine($"Unexpected error: {ex.Message}");}

Creating Resources

Creating resources is type-safe and intuitive:

// Create a new dropletvarnewDroplet=newDroplet{Name="example-droplet",Region="nyc3",Size="s-1vcpu-1gb",Image=123456789,// Ubuntu image IDSshKeys=newList<int>{123456},// SSH key IDBackups=false,Ipv6=true,Monitoring=true,Tags=newList<string>{"web","production"}};varcreatedDroplet=awaitclient.Droplets.PostAsync(newDroplet);Console.WriteLine($"Created droplet with ID: {createdDroplet.Id}");

Models

The client includes strongly-typed models for all DigitalOcean entities. Here are some key models:

// Account informationpublicclassAccount{publicstringEmail{get;set;}publicstringStatus{get;set;}publicAccount_statusStatus_enum{get;set;}publicboolDroplet_limit{get;set;}publicboolEmail_verified{get;set;}publicAccount_teamTeam{get;set;}publicDateTimeOffsetCreated_at{get;set;}}// Droplet configurationpublicclassDroplet{publicintId{get;set;}publicstringName{get;set;}publicintMemory{get;set;}publicintVcpus{get;set;}publicintDisk{get;set;}publicstringRegion{get;set;}publicstringSize{get;set;}publicstringStatus{get;set;}// Additional properties...}// Many other models available...

Development

Building from Source

git clone https://github.com/InfinityFlowApp/InfinityFlow.DigitalOcean.Client.git
cd InfinityFlow.DigitalOcean.Client
dotnet build

Running Tests

dotnet test

Generating a New Client

The client is generated using Kiota:

# Install Kiota
dotnet tool install -g Microsoft.OpenAPI.Kiota
# Get the OpenAPI specification
curl -o openapi.json https://raw.githubusercontent.com/digitalocean/openapi/master/specification/DigitalOcean-public.v2.yaml
# Generate the client
kiota generate --language CSharp --namespace InfinityFlow.DigitalOcean.Client --output-dir ./src/InfinityFlow.DigitalOcean.Client --openapi openapi.json --class-name DigitalOceanClient --clean-output

Contributing

We welcome contributions! Please feel free to submit a Pull Request.

  1. Fork the repository
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create a new Pull Request

License

This project is licensed under the MIT License - see the LICENSE file for details.

Acknowledgments

Troubleshooting

Common Issues and Solutions

IssueSolution
401 UnauthorizedVerify your API token is valid and has the required scopes
429 Too Many RequestsImplement rate limiting or exponential backoff in your application
Connection timeoutCheck your network connection and DigitalOcean status page
Serialization errorsEnsure you're using the latest client version compatible with the API

Debugging

Enable detailed logging by configuring your logger:

// Setup logging (using Microsoft.Extensions.Logging)services.AddLogging(builder =>{builder.AddConsole();builder.AddDebug();builder.SetMinimumLevel(LogLevel.Debug);});// Add client with loggingservices.AddDigitalOceanClient(options =>{options.Token=Configuration["DigitalOcean:ApiToken"];options.EnableDebugLogging=true;});

Rate Limiting

The DigitalOcean API implements rate limiting. You can handle this by checking response headers:

try{varresult=awaitclient.Droplets.GetAsync();// Process result}catch(DigitalOceanApiExceptionex)when(ex.StatusCode==429){// Get rate limit headersvarrateLimit=ex.ResponseHeaders.GetValueOrDefault("RateLimit-Limit");varrateLimitRemaining=ex.ResponseHeaders.GetValueOrDefault("RateLimit-Remaining");varrateLimitReset=ex.ResponseHeaders.GetValueOrDefault("RateLimit-Reset");// Implement backoff strategyvarresetTime=DateTimeOffset.FromUnixTimeSeconds(long.Parse(rateLimitReset));varwaitTime=resetTime-DateTimeOffset.UtcNow;Console.WriteLine($"Rate limited. Waiting for {waitTime.TotalSeconds} seconds before retrying.");awaitTask.Delay(waitTime);// Retry the requestresult=awaitclient.Droplets.GetAsync();}

About

A generated .NET Client for DigitalOcean's API.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

InfinityFlow.DigitalOcean.Client

GitHub Actions Workflow StatusGitHub ReleaseGitHub LicenseNuGet

Discord

A strongly-typed .NET client for the DigitalOcean API, generated using Microsoft's Kiota SDK generator. This client provides a simple and intuitive way to interact with DigitalOcean's services from .NET applications.

Architecture Overview

graph TD
A[Client Application] -->|Uses| B[DigitalOceanClient]
B -->|Authenticates via| C[ITokenProvider]
C -->|Implements| D[StaticTokenProvider]
C -->|Can implement| E[Custom Token Provider]
B -->|Makes requests to| F[DigitalOcean API]
B -->|Uses| G[Strongly-typed Models]
G -->|Includes| H[Account, Droplet, etc.]
Loading

Features

  • Complete coverage of the DigitalOcean API v2
  • Strongly-typed models for all API entities
  • Asynchronous API for non-blocking operations
  • Authentication options for API tokens
  • Easy integration with dependency injection
  • Generated from the OpenAPI specification
  • Comprehensive error handling

Installation

Install the package from NuGet:

dotnet add package InfinityFlow.DigitalOcean.Client

Quick Start

Basic Usage

// Create a client with an API tokenvartokenProvider=newStaticTokenProvider("your-digitalocean-api-token");varhttpClient=newHttpClient();varclient=newDigitalOceanClient(httpClient,tokenProvider);// Get account informationvaraccount=awaitclient.Account.GetAsync();Console.WriteLine($"Account: {account.Email}, {account.Status}");// List all dropletsvardroplets=awaitclient.Droplets.GetAsync();foreach(vardropletindroplets.Droplets){Console.WriteLine($"Droplet: {droplet.Name}, {droplet.Status}");}

Dependency Injection Setup

// In Program.cs or Startup.csservices.AddDigitalOceanClient(options =>{options.Token=Configuration["DigitalOcean:ApiToken"];});// In your servicepublicclassMyService{privatereadonlyDigitalOceanClient_client;publicMyService(DigitalOceanClientclient){_client=client;}publicasyncTaskDoSomethingAsync(){vardroplets=await_client.Droplets.GetAsync();// ...}}

API Coverage

This client covers all DigitalOcean API endpoints:

  • Account
  • Actions
  • Apps
  • Billing
  • Block Storage
  • CDN Endpoints
  • Certificates
  • Container Registry
  • Databases
  • DNS (Domains)
  • Droplets
  • Firewalls
  • Floating IPs
  • Kubernetes
  • Load Balancers
  • Monitoring
  • Projects
  • Regions
  • Reserved IPs
  • Sizes
  • Snapshots
  • SSH Keys
  • Tags
  • VPCs

Authentication

The client supports authentication using a DigitalOcean API token:

// Static token provider (simple approach)vartokenProvider=newStaticTokenProvider("your-api-token");// For more dynamic scenarios, implement ITokenProviderpublicclassMyTokenProvider:ITokenProvider{publicTask<string>GetTokenAsync(CancellationTokencancellationToken){// Get token from a secure storage or servicereturnTask.FromResult(GetSecureToken());}}

Advanced Usage

Request Options

You can customize requests with options:

// Get droplets with pagingvaroptions=newDropletsRequestBuilder.GetRequestConfiguration{QueryParameters=newDropletsRequestBuilder.GetQueryParameters{Page=2,PerPage=25}};vardroplets=awaitclient.Droplets.GetAsync(requestConfiguration:options);

Error Handling

The client throws strongly-typed exceptions for API errors:

try{vardroplet=awaitclient.Droplets.ByDropletId(123456).GetAsync();// Process droplet}catch(DigitalOceanApiExceptionex)when(ex.StatusCode==404){Console.WriteLine("Droplet not found");}catch(DigitalOceanApiExceptionex){Console.WriteLine($"API error: {ex.StatusCode}, {ex.Message}");}catch(Exceptionex){Console.WriteLine($"Unexpected error: {ex.Message}");}

Creating Resources

Creating resources is type-safe and intuitive:

// Create a new dropletvarnewDroplet=newDroplet{Name="example-droplet",Region="nyc3",Size="s-1vcpu-1gb",Image=123456789,// Ubuntu image IDSshKeys=newList<int>{123456},// SSH key IDBackups=false,Ipv6=true,Monitoring=true,Tags=newList<string>{"web","production"}};varcreatedDroplet=awaitclient.Droplets.PostAsync(newDroplet);Console.WriteLine($"Created droplet with ID: {createdDroplet.Id}");

Models

The client includes strongly-typed models for all DigitalOcean entities. Here are some key models:

// Account informationpublicclassAccount{publicstringEmail{get;set;}publicstringStatus{get;set;}publicAccount_statusStatus_enum{get;set;}publicboolDroplet_limit{get;set;}publicboolEmail_verified{get;set;}publicAccount_teamTeam{get;set;}publicDateTimeOffsetCreated_at{get;set;}}// Droplet configurationpublicclassDroplet{publicintId{get;set;}publicstringName{get;set;}publicintMemory{get;set;}publicintVcpus{get;set;}publicintDisk{get;set;}publicstringRegion{get;set;}publicstringSize{get;set;}publicstringStatus{get;set;}// Additional properties...}// Many other models available...

Development

Building from Source

git clone https://github.com/InfinityFlowApp/InfinityFlow.DigitalOcean.Client.git
cd InfinityFlow.DigitalOcean.Client
dotnet build

Running Tests

dotnet test

Generating a New Client

The client is generated using Kiota:

# Install Kiota
dotnet tool install -g Microsoft.OpenAPI.Kiota
# Get the OpenAPI specification
curl -o openapi.json https://raw.githubusercontent.com/digitalocean/openapi/master/specification/DigitalOcean-public.v2.yaml
# Generate the client
kiota generate --language CSharp --namespace InfinityFlow.DigitalOcean.Client --output-dir ./src/InfinityFlow.DigitalOcean.Client --openapi openapi.json --class-name DigitalOceanClient --clean-output

Contributing

We welcome contributions! Please feel free to submit a Pull Request.

  1. Fork the repository
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create a new Pull Request

License

This project is licensed under the MIT License - see the LICENSE file for details.

Acknowledgments

Troubleshooting

Common Issues and Solutions

IssueSolution
401 UnauthorizedVerify your API token is valid and has the required scopes
429 Too Many RequestsImplement rate limiting or exponential backoff in your application
Connection timeoutCheck your network connection and DigitalOcean status page
Serialization errorsEnsure you're using the latest client version compatible with the API

Debugging

Enable detailed logging by configuring your logger:

// Setup logging (using Microsoft.Extensions.Logging)services.AddLogging(builder =>{builder.AddConsole();builder.AddDebug();builder.SetMinimumLevel(LogLevel.Debug);});// Add client with loggingservices.AddDigitalOceanClient(options =>{options.Token=Configuration["DigitalOcean:ApiToken"];options.EnableDebugLogging=true;});

Rate Limiting

The DigitalOcean API implements rate limiting. You can handle this by checking response headers:

try{varresult=awaitclient.Droplets.GetAsync();// Process result}catch(DigitalOceanApiExceptionex)when(ex.StatusCode==429){// Get rate limit headersvarrateLimit=ex.ResponseHeaders.GetValueOrDefault("RateLimit-Limit");varrateLimitRemaining=ex.ResponseHeaders.GetValueOrDefault("RateLimit-Remaining");varrateLimitReset=ex.ResponseHeaders.GetValueOrDefault("RateLimit-Reset");// Implement backoff strategyvarresetTime=DateTimeOffset.FromUnixTimeSeconds(long.Parse(rateLimitReset));varwaitTime=resetTime-DateTimeOffset.UtcNow;Console.WriteLine($"Rate limited. Waiting for {waitTime.TotalSeconds} seconds before retrying.");awaitTask.Delay(waitTime);// Retry the requestresult=awaitclient.Droplets.GetAsync();}

About

A generated .NET Client for DigitalOcean's API.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

InfinityFlow.DigitalOcean.Client

GitHub Actions Workflow StatusGitHub ReleaseGitHub LicenseNuGet

Discord

A strongly-typed .NET client for the DigitalOcean API, generated using Microsoft's Kiota SDK generator. This client provides a simple and intuitive way to interact with DigitalOcean's services from .NET applications.

Architecture Overview

graph TD
A[Client Application] -->|Uses| B[DigitalOceanClient]
B -->|Authenticates via| C[ITokenProvider]
C -->|Implements| D[StaticTokenProvider]
C -->|Can implement| E[Custom Token Provider]
B -->|Makes requests to| F[DigitalOcean API]
B -->|Uses| G[Strongly-typed Models]
G -->|Includes| H[Account, Droplet, etc.]
Loading

Features

  • Complete coverage of the DigitalOcean API v2
  • Strongly-typed models for all API entities
  • Asynchronous API for non-blocking operations
  • Authentication options for API tokens
  • Easy integration with dependency injection
  • Generated from the OpenAPI specification
  • Comprehensive error handling

Installation

Install the package from NuGet:

dotnet add package InfinityFlow.DigitalOcean.Client

Quick Start

Basic Usage

// Create a client with an API tokenvartokenProvider=newStaticTokenProvider("your-digitalocean-api-token");varhttpClient=newHttpClient();varclient=newDigitalOceanClient(httpClient,tokenProvider);// Get account informationvaraccount=awaitclient.Account.GetAsync();Console.WriteLine($"Account: {account.Email}, {account.Status}");// List all dropletsvardroplets=awaitclient.Droplets.GetAsync();foreach(vardropletindroplets.Droplets){Console.WriteLine($"Droplet: {droplet.Name}, {droplet.Status}");}

Dependency Injection Setup

// In Program.cs or Startup.csservices.AddDigitalOceanClient(options =>{options.Token=Configuration["DigitalOcean:ApiToken"];});// In your servicepublicclassMyService{privatereadonlyDigitalOceanClient_client;publicMyService(DigitalOceanClientclient){_client=client;}publicasyncTaskDoSomethingAsync(){vardroplets=await_client.Droplets.GetAsync();// ...}}

API Coverage

This client covers all DigitalOcean API endpoints:

  • Account
  • Actions
  • Apps
  • Billing
  • Block Storage
  • CDN Endpoints
  • Certificates
  • Container Registry
  • Databases
  • DNS (Domains)
  • Droplets
  • Firewalls
  • Floating IPs
  • Kubernetes
  • Load Balancers
  • Monitoring
  • Projects
  • Regions
  • Reserved IPs
  • Sizes
  • Snapshots
  • SSH Keys
  • Tags
  • VPCs

Authentication

The client supports authentication using a DigitalOcean API token:

// Static token provider (simple approach)vartokenProvider=newStaticTokenProvider("your-api-token");// For more dynamic scenarios, implement ITokenProviderpublicclassMyTokenProvider:ITokenProvider{publicTask<string>GetTokenAsync(CancellationTokencancellationToken){// Get token from a secure storage or servicereturnTask.FromResult(GetSecureToken());}}

Advanced Usage

Request Options

You can customize requests with options:

// Get droplets with pagingvaroptions=newDropletsRequestBuilder.GetRequestConfiguration{QueryParameters=newDropletsRequestBuilder.GetQueryParameters{Page=2,PerPage=25}};vardroplets=awaitclient.Droplets.GetAsync(requestConfiguration:options);

Error Handling

The client throws strongly-typed exceptions for API errors:

try{vardroplet=awaitclient.Droplets.ByDropletId(123456).GetAsync();// Process droplet}catch(DigitalOceanApiExceptionex)when(ex.StatusCode==404){Console.WriteLine("Droplet not found");}catch(DigitalOceanApiExceptionex){Console.WriteLine($"API error: {ex.StatusCode}, {ex.Message}");}catch(Exceptionex){Console.WriteLine($"Unexpected error: {ex.Message}");}

Creating Resources

Creating resources is type-safe and intuitive:

// Create a new dropletvarnewDroplet=newDroplet{Name="example-droplet",Region="nyc3",Size="s-1vcpu-1gb",Image=123456789,// Ubuntu image IDSshKeys=newList<int>{123456},// SSH key IDBackups=false,Ipv6=true,Monitoring=true,Tags=newList<string>{"web","production"}};varcreatedDroplet=awaitclient.Droplets.PostAsync(newDroplet);Console.WriteLine($"Created droplet with ID: {createdDroplet.Id}");

Models

The client includes strongly-typed models for all DigitalOcean entities. Here are some key models:

// Account informationpublicclassAccount{publicstringEmail{get;set;}publicstringStatus{get;set;}publicAccount_statusStatus_enum{get;set;}publicboolDroplet_limit{get;set;}publicboolEmail_verified{get;set;}publicAccount_teamTeam{get;set;}publicDateTimeOffsetCreated_at{get;set;}}// Droplet configurationpublicclassDroplet{publicintId{get;set;}publicstringName{get;set;}publicintMemory{get;set;}publicintVcpus{get;set;}publicintDisk{get;set;}publicstringRegion{get;set;}publicstringSize{get;set;}publicstringStatus{get;set;}// Additional properties...}// Many other models available...

Development

Building from Source

git clone https://github.com/InfinityFlowApp/InfinityFlow.DigitalOcean.Client.git
cd InfinityFlow.DigitalOcean.Client
dotnet build

Running Tests

dotnet test

Generating a New Client

The client is generated using Kiota:

# Install Kiota
dotnet tool install -g Microsoft.OpenAPI.Kiota
# Get the OpenAPI specification
curl -o openapi.json https://raw.githubusercontent.com/digitalocean/openapi/master/specification/DigitalOcean-public.v2.yaml
# Generate the client
kiota generate --language CSharp --namespace InfinityFlow.DigitalOcean.Client --output-dir ./src/InfinityFlow.DigitalOcean.Client --openapi openapi.json --class-name DigitalOceanClient --clean-output

Contributing

We welcome contributions! Please feel free to submit a Pull Request.

  1. Fork the repository
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create a new Pull Request

License

This project is licensed under the MIT License - see the LICENSE file for details.

Acknowledgments

Troubleshooting

Common Issues and Solutions

IssueSolution
401 UnauthorizedVerify your API token is valid and has the required scopes
429 Too Many RequestsImplement rate limiting or exponential backoff in your application
Connection timeoutCheck your network connection and DigitalOcean status page
Serialization errorsEnsure you're using the latest client version compatible with the API

Debugging

Enable detailed logging by configuring your logger:

// Setup logging (using Microsoft.Extensions.Logging)services.AddLogging(builder =>{builder.AddConsole();builder.AddDebug();builder.SetMinimumLevel(LogLevel.Debug);});// Add client with loggingservices.AddDigitalOceanClient(options =>{options.Token=Configuration["DigitalOcean:ApiToken"];options.EnableDebugLogging=true;});

Rate Limiting

The DigitalOcean API implements rate limiting. You can handle this by checking response headers:

try{varresult=awaitclient.Droplets.GetAsync();// Process result}catch(DigitalOceanApiExceptionex)when(ex.StatusCode==429){// Get rate limit headersvarrateLimit=ex.ResponseHeaders.GetValueOrDefault("RateLimit-Limit");varrateLimitRemaining=ex.ResponseHeaders.GetValueOrDefault("RateLimit-Remaining");varrateLimitReset=ex.ResponseHeaders.GetValueOrDefault("RateLimit-Reset");// Implement backoff strategyvarresetTime=DateTimeOffset.FromUnixTimeSeconds(long.Parse(rateLimitReset));varwaitTime=resetTime-DateTimeOffset.UtcNow;Console.WriteLine($"Rate limited. Waiting for {waitTime.TotalSeconds} seconds before retrying.");awaitTask.Delay(waitTime);// Retry the requestresult=awaitclient.Droplets.GetAsync();}

About

A generated .NET Client for DigitalOcean's API.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

InfinityFlow.DigitalOcean.Client

GitHub Actions Workflow StatusGitHub ReleaseGitHub LicenseNuGet

Discord

A strongly-typed .NET client for the DigitalOcean API, generated using Microsoft's Kiota SDK generator. This client provides a simple and intuitive way to interact with DigitalOcean's services from .NET applications.

Architecture Overview

graph TD
A[Client Application] -->|Uses| B[DigitalOceanClient]
B -->|Authenticates via| C[ITokenProvider]
C -->|Implements| D[StaticTokenProvider]
C -->|Can implement| E[Custom Token Provider]
B -->|Makes requests to| F[DigitalOcean API]
B -->|Uses| G[Strongly-typed Models]
G -->|Includes| H[Account, Droplet, etc.]
Loading

Features

  • Complete coverage of the DigitalOcean API v2
  • Strongly-typed models for all API entities
  • Asynchronous API for non-blocking operations
  • Authentication options for API tokens
  • Easy integration with dependency injection
  • Generated from the OpenAPI specification
  • Comprehensive error handling

Installation

Install the package from NuGet:

dotnet add package InfinityFlow.DigitalOcean.Client

Quick Start

Basic Usage

// Create a client with an API tokenvartokenProvider=newStaticTokenProvider("your-digitalocean-api-token");varhttpClient=newHttpClient();varclient=newDigitalOceanClient(httpClient,tokenProvider);// Get account informationvaraccount=awaitclient.Account.GetAsync();Console.WriteLine($"Account: {account.Email}, {account.Status}");// List all dropletsvardroplets=awaitclient.Droplets.GetAsync();foreach(vardropletindroplets.Droplets){Console.WriteLine($"Droplet: {droplet.Name}, {droplet.Status}");}

Dependency Injection Setup

// In Program.cs or Startup.csservices.AddDigitalOceanClient(options =>{options.Token=Configuration["DigitalOcean:ApiToken"];});// In your servicepublicclassMyService{privatereadonlyDigitalOceanClient_client;publicMyService(DigitalOceanClientclient){_client=client;}publicasyncTaskDoSomethingAsync(){vardroplets=await_client.Droplets.GetAsync();// ...}}

API Coverage

This client covers all DigitalOcean API endpoints:

  • Account
  • Actions
  • Apps
  • Billing
  • Block Storage
  • CDN Endpoints
  • Certificates
  • Container Registry
  • Databases
  • DNS (Domains)
  • Droplets
  • Firewalls
  • Floating IPs
  • Kubernetes
  • Load Balancers
  • Monitoring
  • Projects
  • Regions
  • Reserved IPs
  • Sizes
  • Snapshots
  • SSH Keys
  • Tags
  • VPCs

Authentication

The client supports authentication using a DigitalOcean API token:

// Static token provider (simple approach)vartokenProvider=newStaticTokenProvider("your-api-token");// For more dynamic scenarios, implement ITokenProviderpublicclassMyTokenProvider:ITokenProvider{publicTask<string>GetTokenAsync(CancellationTokencancellationToken){// Get token from a secure storage or servicereturnTask.FromResult(GetSecureToken());}}

Advanced Usage

Request Options

You can customize requests with options:

// Get droplets with pagingvaroptions=newDropletsRequestBuilder.GetRequestConfiguration{QueryParameters=newDropletsRequestBuilder.GetQueryParameters{Page=2,PerPage=25}};vardroplets=awaitclient.Droplets.GetAsync(requestConfiguration:options);

Error Handling

The client throws strongly-typed exceptions for API errors:

try{vardroplet=awaitclient.Droplets.ByDropletId(123456).GetAsync();// Process droplet}catch(DigitalOceanApiExceptionex)when(ex.StatusCode==404){Console.WriteLine("Droplet not found");}catch(DigitalOceanApiExceptionex){Console.WriteLine($"API error: {ex.StatusCode}, {ex.Message}");}catch(Exceptionex){Console.WriteLine($"Unexpected error: {ex.Message}");}

Creating Resources

Creating resources is type-safe and intuitive:

// Create a new dropletvarnewDroplet=newDroplet{Name="example-droplet",Region="nyc3",Size="s-1vcpu-1gb",Image=123456789,// Ubuntu image IDSshKeys=newList<int>{123456},// SSH key IDBackups=false,Ipv6=true,Monitoring=true,Tags=newList<string>{"web","production"}};varcreatedDroplet=awaitclient.Droplets.PostAsync(newDroplet);Console.WriteLine($"Created droplet with ID: {createdDroplet.Id}");

Models

The client includes strongly-typed models for all DigitalOcean entities. Here are some key models:

// Account informationpublicclassAccount{publicstringEmail{get;set;}publicstringStatus{get;set;}publicAccount_statusStatus_enum{get;set;}publicboolDroplet_limit{get;set;}publicboolEmail_verified{get;set;}publicAccount_teamTeam{get;set;}publicDateTimeOffsetCreated_at{get;set;}}// Droplet configurationpublicclassDroplet{publicintId{get;set;}publicstringName{get;set;}publicintMemory{get;set;}publicintVcpus{get;set;}publicintDisk{get;set;}publicstringRegion{get;set;}publicstringSize{get;set;}publicstringStatus{get;set;}// Additional properties...}// Many other models available...

Development

Building from Source

git clone https://github.com/InfinityFlowApp/InfinityFlow.DigitalOcean.Client.git
cd InfinityFlow.DigitalOcean.Client
dotnet build

Running Tests

dotnet test

Generating a New Client

The client is generated using Kiota:

# Install Kiota
dotnet tool install -g Microsoft.OpenAPI.Kiota
# Get the OpenAPI specification
curl -o openapi.json https://raw.githubusercontent.com/digitalocean/openapi/master/specification/DigitalOcean-public.v2.yaml
# Generate the client
kiota generate --language CSharp --namespace InfinityFlow.DigitalOcean.Client --output-dir ./src/InfinityFlow.DigitalOcean.Client --openapi openapi.json --class-name DigitalOceanClient --clean-output

Contributing

We welcome contributions! Please feel free to submit a Pull Request.

  1. Fork the repository
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create a new Pull Request

License

This project is licensed under the MIT License - see the LICENSE file for details.

Acknowledgments

Troubleshooting

Common Issues and Solutions

IssueSolution
401 UnauthorizedVerify your API token is valid and has the required scopes
429 Too Many RequestsImplement rate limiting or exponential backoff in your application
Connection timeoutCheck your network connection and DigitalOcean status page
Serialization errorsEnsure you're using the latest client version compatible with the API

Debugging

Enable detailed logging by configuring your logger:

// Setup logging (using Microsoft.Extensions.Logging)services.AddLogging(builder =>{builder.AddConsole();builder.AddDebug();builder.SetMinimumLevel(LogLevel.Debug);});// Add client with loggingservices.AddDigitalOceanClient(options =>{options.Token=Configuration["DigitalOcean:ApiToken"];options.EnableDebugLogging=true;});

Rate Limiting

The DigitalOcean API implements rate limiting. You can handle this by checking response headers:

try{varresult=awaitclient.Droplets.GetAsync();// Process result}catch(DigitalOceanApiExceptionex)when(ex.StatusCode==429){// Get rate limit headersvarrateLimit=ex.ResponseHeaders.GetValueOrDefault("RateLimit-Limit");varrateLimitRemaining=ex.ResponseHeaders.GetValueOrDefault("RateLimit-Remaining");varrateLimitReset=ex.ResponseHeaders.GetValueOrDefault("RateLimit-Reset");// Implement backoff strategyvarresetTime=DateTimeOffset.FromUnixTimeSeconds(long.Parse(rateLimitReset));varwaitTime=resetTime-DateTimeOffset.UtcNow;Console.WriteLine($"Rate limited. Waiting for {waitTime.TotalSeconds} seconds before retrying.");awaitTask.Delay(waitTime);// Retry the requestresult=awaitclient.Droplets.GetAsync();}

About

A generated .NET Client for DigitalOcean's API.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

InfinityFlow.DigitalOcean.Client

GitHub Actions Workflow StatusGitHub ReleaseGitHub LicenseNuGet

Discord

A strongly-typed .NET client for the DigitalOcean API, generated using Microsoft's Kiota SDK generator. This client provides a simple and intuitive way to interact with DigitalOcean's services from .NET applications.

Architecture Overview

graph TD
A[Client Application] -->|Uses| B[DigitalOceanClient]
B -->|Authenticates via| C[ITokenProvider]
C -->|Implements| D[StaticTokenProvider]
C -->|Can implement| E[Custom Token Provider]
B -->|Makes requests to| F[DigitalOcean API]
B -->|Uses| G[Strongly-typed Models]
G -->|Includes| H[Account, Droplet, etc.]
Loading

Features

  • Complete coverage of the DigitalOcean API v2
  • Strongly-typed models for all API entities
  • Asynchronous API for non-blocking operations
  • Authentication options for API tokens
  • Easy integration with dependency injection
  • Generated from the OpenAPI specification
  • Comprehensive error handling

Installation

Install the package from NuGet:

dotnet add package InfinityFlow.DigitalOcean.Client

Quick Start

Basic Usage

// Create a client with an API tokenvartokenProvider=newStaticTokenProvider("your-digitalocean-api-token");varhttpClient=newHttpClient();varclient=newDigitalOceanClient(httpClient,tokenProvider);// Get account informationvaraccount=awaitclient.Account.GetAsync();Console.WriteLine($"Account: {account.Email}, {account.Status}");// List all dropletsvardroplets=awaitclient.Droplets.GetAsync();foreach(vardropletindroplets.Droplets){Console.WriteLine($"Droplet: {droplet.Name}, {droplet.Status}");}

Dependency Injection Setup

// In Program.cs or Startup.csservices.AddDigitalOceanClient(options =>{options.Token=Configuration["DigitalOcean:ApiToken"];});// In your servicepublicclassMyService{privatereadonlyDigitalOceanClient_client;publicMyService(DigitalOceanClientclient){_client=client;}publicasyncTaskDoSomethingAsync(){vardroplets=await_client.Droplets.GetAsync();// ...}}

API Coverage

This client covers all DigitalOcean API endpoints:

  • Account
  • Actions
  • Apps
  • Billing
  • Block Storage
  • CDN Endpoints
  • Certificates
  • Container Registry
  • Databases
  • DNS (Domains)
  • Droplets
  • Firewalls
  • Floating IPs
  • Kubernetes
  • Load Balancers
  • Monitoring
  • Projects
  • Regions
  • Reserved IPs
  • Sizes
  • Snapshots
  • SSH Keys
  • Tags
  • VPCs

Authentication

The client supports authentication using a DigitalOcean API token:

// Static token provider (simple approach)vartokenProvider=newStaticTokenProvider("your-api-token");// For more dynamic scenarios, implement ITokenProviderpublicclassMyTokenProvider:ITokenProvider{publicTask<string>GetTokenAsync(CancellationTokencancellationToken){// Get token from a secure storage or servicereturnTask.FromResult(GetSecureToken());}}

Advanced Usage

Request Options

You can customize requests with options:

// Get droplets with pagingvaroptions=newDropletsRequestBuilder.GetRequestConfiguration{QueryParameters=newDropletsRequestBuilder.GetQueryParameters{Page=2,PerPage=25}};vardroplets=awaitclient.Droplets.GetAsync(requestConfiguration:options);

Error Handling

The client throws strongly-typed exceptions for API errors:

try{vardroplet=awaitclient.Droplets.ByDropletId(123456).GetAsync();// Process droplet}catch(DigitalOceanApiExceptionex)when(ex.StatusCode==404){Console.WriteLine("Droplet not found");}catch(DigitalOceanApiExceptionex){Console.WriteLine($"API error: {ex.StatusCode}, {ex.Message}");}catch(Exceptionex){Console.WriteLine($"Unexpected error: {ex.Message}");}

Creating Resources

Creating resources is type-safe and intuitive:

// Create a new dropletvarnewDroplet=newDroplet{Name="example-droplet",Region="nyc3",Size="s-1vcpu-1gb",Image=123456789,// Ubuntu image IDSshKeys=newList<int>{123456},// SSH key IDBackups=false,Ipv6=true,Monitoring=true,Tags=newList<string>{"web","production"}};varcreatedDroplet=awaitclient.Droplets.PostAsync(newDroplet);Console.WriteLine($"Created droplet with ID: {createdDroplet.Id}");

Models

The client includes strongly-typed models for all DigitalOcean entities. Here are some key models:

// Account informationpublicclassAccount{publicstringEmail{get;set;}publicstringStatus{get;set;}publicAccount_statusStatus_enum{get;set;}publicboolDroplet_limit{get;set;}publicboolEmail_verified{get;set;}publicAccount_teamTeam{get;set;}publicDateTimeOffsetCreated_at{get;set;}}// Droplet configurationpublicclassDroplet{publicintId{get;set;}publicstringName{get;set;}publicintMemory{get;set;}publicintVcpus{get;set;}publicintDisk{get;set;}publicstringRegion{get;set;}publicstringSize{get;set;}publicstringStatus{get;set;}// Additional properties...}// Many other models available...

Development

Building from Source

git clone https://github.com/InfinityFlowApp/InfinityFlow.DigitalOcean.Client.git
cd InfinityFlow.DigitalOcean.Client
dotnet build

Running Tests

dotnet test

Generating a New Client

The client is generated using Kiota:

# Install Kiota
dotnet tool install -g Microsoft.OpenAPI.Kiota
# Get the OpenAPI specification
curl -o openapi.json https://raw.githubusercontent.com/digitalocean/openapi/master/specification/DigitalOcean-public.v2.yaml
# Generate the client
kiota generate --language CSharp --namespace InfinityFlow.DigitalOcean.Client --output-dir ./src/InfinityFlow.DigitalOcean.Client --openapi openapi.json --class-name DigitalOceanClient --clean-output

Contributing

We welcome contributions! Please feel free to submit a Pull Request.

  1. Fork the repository
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create a new Pull Request

License

This project is licensed under the MIT License - see the LICENSE file for details.

Acknowledgments

Troubleshooting

Common Issues and Solutions

IssueSolution
401 UnauthorizedVerify your API token is valid and has the required scopes
429 Too Many RequestsImplement rate limiting or exponential backoff in your application
Connection timeoutCheck your network connection and DigitalOcean status page
Serialization errorsEnsure you're using the latest client version compatible with the API

Debugging

Enable detailed logging by configuring your logger:

// Setup logging (using Microsoft.Extensions.Logging)services.AddLogging(builder =>{builder.AddConsole();builder.AddDebug();builder.SetMinimumLevel(LogLevel.Debug);});// Add client with loggingservices.AddDigitalOceanClient(options =>{options.Token=Configuration["DigitalOcean:ApiToken"];options.EnableDebugLogging=true;});

Rate Limiting

The DigitalOcean API implements rate limiting. You can handle this by checking response headers:

try{varresult=awaitclient.Droplets.GetAsync();// Process result}catch(DigitalOceanApiExceptionex)when(ex.StatusCode==429){// Get rate limit headersvarrateLimit=ex.ResponseHeaders.GetValueOrDefault("RateLimit-Limit");varrateLimitRemaining=ex.ResponseHeaders.GetValueOrDefault("RateLimit-Remaining");varrateLimitReset=ex.ResponseHeaders.GetValueOrDefault("RateLimit-Reset");// Implement backoff strategyvarresetTime=DateTimeOffset.FromUnixTimeSeconds(long.Parse(rateLimitReset));varwaitTime=resetTime-DateTimeOffset.UtcNow;Console.WriteLine($"Rate limited. Waiting for {waitTime.TotalSeconds} seconds before retrying.");awaitTask.Delay(waitTime);// Retry the requestresult=awaitclient.Droplets.GetAsync();}

About

A generated .NET Client for DigitalOcean's API.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages