Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
## 4.3.0 [unreleased]

### Features
1. [#327](https://github.com/influxdata/influxdb-client-csharp/pull/327): Add interfaces to client's APIs

## 4.2.0 [2022-05-20]

### Features
Expand Down
111 changes: 110 additions & 1 deletion Client.Legacy/FluxClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,116 @@

namespace InfluxDB.Client.Flux
{
public class FluxClient : AbstractQueryClient, IDisposable
public interface IFluxClient : IDisposable
{
/// <summary>
/// Executes the Flux query against the InfluxDB and asynchronously map whole response to <see cref="List{FluxTable}"/>.
/// </summary>
/// <para>
/// NOTE: This method is not intended for large query results.
/// Use <see cref="FluxClient.QueryAsync(string,System.Action{InfluxDB.Client.Core.Flux.Domain.FluxRecord},System.Action{System.Exception},System.Action,System.Threading.CancellationToken)"/> for large data streaming.
/// </para>
/// <param name="query">the flux query to execute</param>
/// <param name="cancellationToken">Token that enables callers to cancel the request.</param>
/// <returns><see cref="List{FluxTable}"/> which are matched the query</returns>
Task<List<FluxTable>> QueryAsync(string query, CancellationToken cancellationToken = default);

/// <summary>
/// Executes the Flux query against the InfluxDB and asynchronously map whole response to list of object with
/// given type.
/// <para>
/// NOTE: This method is not intended for large query results.
/// Use <see cref="FluxClient.QueryAsync{T}(string,System.Action{T},System.Action{System.Exception},System.Action,System.Threading.CancellationToken)"/> for large data streaming.
/// </para>
/// </summary>
/// <param name="query">the flux query to execute</param>
/// <param name="cancellationToken">Token that enables callers to cancel the request.</param>
/// <typeparam name="T">the type of measurement</typeparam>
/// <returns><see cref="List{T}"/> which are matched the query</returns>
Task<List<T>> QueryAsync<T>(string query, CancellationToken cancellationToken = default);

/// <summary>
/// Executes the Flux query against the InfluxDB and asynchronously stream <see cref="FluxRecord"/> to <see cref="onNext"/> consumer.
/// </summary>
/// <param name="query">the flux query to execute</param>
/// <param name="onNext">the callback to consume the FluxRecord result</param>
/// <param name="onError">the callback to consume any error notification</param>
/// <param name="onComplete">the callback to consume a notification about successfully end of stream</param>
/// <param name="cancellationToken">Token that enables callers to cancel the request.</param>
/// <returns>async task</returns>
Task QueryAsync(string query, Action<FluxRecord> onNext, Action<Exception> onError = null,
Action onComplete = null, CancellationToken cancellationToken = default);

/// <summary>
/// Executes the Flux query against the InfluxDB and asynchronously stream result as POCO.
/// </summary>
/// <param name="query">the flux query to execute</param>
/// <param name="onNext">the callback to consume the FluxRecord result</param>
/// <param name="onError">the callback to consume any error notification</param>
/// <param name="onComplete">the callback to consume a notification about successfully end of stream</param>
/// <param name="cancellationToken">Token that enables callers to cancel the request.</param>
/// <typeparam name="T">the type of measurement</typeparam>
/// <returns>async task</returns>
Task QueryAsync<T>(string query, Action<T> onNext, Action<Exception> onError = null,
Action onComplete = null, CancellationToken cancellationToken = default);

/// <summary>
/// Executes the Flux query against the InfluxDB and synchronously map whole response to <see cref="string"/> result.
/// <para>
/// NOTE: This method is not intended for large responses, that do not fit into memory.
/// Use <see cref="FluxClient.QueryRawAsync(string,System.Action{string},string,System.Action{System.Exception},System.Action,System.Threading.CancellationToken)"/>
/// </para>
/// </summary>
/// <param name="query">the flux query to execute></param>
/// <param name="dialect">Dialect is an object defining the options to use when encoding the response.
/// <a href="http://bit.ly/flux-dialect">See dialect SPEC.</a></param>
/// <param name="cancellationToken">Token that enables callers to cancel the request.</param>
/// <returns>the raw response that matched the query</returns>
Task<string> QueryRawAsync(string query, string dialect = null,
CancellationToken cancellationToken = default);

/// <summary>
/// Executes the Flux query against the InfluxDB and asynchronously stream response (line by line) to <see cref="onResponse"/>.
/// </summary>
/// <param name="query">the flux query to execute</param>
/// <param name="onResponse">the callback to consume the response line by line</param>
/// <param name="dialect">Dialect is an object defining the options to use when encoding the response. <a href="http://bit.ly/flux-dialect">See dialect SPEC.</a></param>
/// <param name="onError">the callback to consume any error notification</param>
/// <param name="onComplete">the callback to consume a notification about successfully end of stream</param>
/// <param name="cancellationToken">Token that enables callers to cancel the request.</param>
/// <returns>async task</returns>
Task QueryRawAsync(string query, Action<string> onResponse, string dialect = null,
Action<Exception> onError = null, Action onComplete = null, CancellationToken cancellationToken = default);

/// <summary>
/// Check the status of InfluxDB Server.
/// </summary>
/// <param name="cancellationToken">Cancellation token</param>
/// <returns>true if server is healthy otherwise return false</returns>
Task<bool> PingAsync(CancellationToken cancellationToken = default);

/// <summary>
/// Return the version of the connected InfluxDB Server.
/// </summary>
/// <param name="cancellationToken">Cancellation token</param>
/// <returns>the version String, otherwise unknown</returns>
/// <exception cref="InfluxException">throws when request did not succesfully ends</exception>
Task<string> VersionAsync(CancellationToken cancellationToken = default);

/// <summary>
/// Set the log level for the request and response information.
/// </summary>
/// <param name="logLevel">the log level to set</param>
void SetLogLevel(LogLevel logLevel);

/// <summary>
/// Set the <see cref="LogLevel"/> that is used for logging requests and responses.
/// </summary>
/// <returns>Log Level</returns>
LogLevel GetLogLevel();
}

public class FluxClient : AbstractQueryClient, IFluxClient
{
private readonly LoggingHandler _loggingHandler;

Expand Down
23 changes: 23 additions & 0 deletions Client.Test/InfluxDbClientTest.cs
Original file line number Diff line number Diff line change
@@ -1,15 +1,19 @@
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Reflection;
using System.Threading;
using System.Threading.Tasks;
using InfluxDB.Client.Api.Client;
using InfluxDB.Client.Api.Domain;
using InfluxDB.Client.Api.Service;
using InfluxDB.Client.Core;
using InfluxDB.Client.Core.Exceptions;
using InfluxDB.Client.Core.Flux.Domain;
using InfluxDB.Client.Core.Test;
using Moq;
using NUnit.Framework;
using WireMock.RequestBuilders;
using WireMock.ResponseBuilders;
Expand Down Expand Up @@ -393,5 +397,24 @@ public async Task CustomCertificateValidationCallback()

Assert.IsTrue(reached);
}

[Test]
public void TestMocking()
{
var mockClient = new Mock<IInfluxDBClient>();
var mockQueryApi = new Mock<IQueryApiSync>();

mockClient
.Setup(library => library.GetQueryApiSync(null))
.Returns(mockQueryApi.Object);

var mockTables = new List<FluxTable> { new FluxTable() };
mockQueryApi
.Setup(api => api.QuerySync("from(...", "my-org", CancellationToken.None))
.Returns(mockTables);

var tables = mockClient.Object.GetQueryApiSync().QuerySync("from(...", "my-org");
Assert.AreEqual(mockTables, tables);
}
}
}
129 changes: 128 additions & 1 deletion Client/AuthorizationsApi.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,134 @@

namespace InfluxDB.Client
{
public class AuthorizationsApi
public interface IAuthorizationsApi
{
/// <summary>
/// Create an authorization with defined permissions.
/// </summary>
/// <param name="organization">the owner of the authorization</param>
/// <param name="permissions">the permissions for the authorization</param>
/// <param name="cancellationToken">Cancellation token</param>
/// <returns>the created authorization</returns>
Task<Authorization> CreateAuthorizationAsync(Organization organization, List<Permission> permissions,
CancellationToken cancellationToken = default);

/// <summary>
/// Create an authorization with defined permissions.
/// </summary>
/// <param name="orgId">the owner id of the authorization</param>
/// <param name="permissions">the permissions for the authorization</param>
/// <param name="cancellationToken">Cancellation token</param>
/// <returns>the created authorization</returns>
Task<Authorization> CreateAuthorizationAsync(string orgId, List<Permission> permissions,
CancellationToken cancellationToken = default);

/// <summary>
/// Create an authorization with defined permissions.
/// </summary>
/// <param name="authorization">authorization to create</param>
/// <param name="cancellationToken">Cancellation token</param>
/// <returns>the created authorization</returns>
Task<Authorization> CreateAuthorizationAsync(Authorization authorization,
CancellationToken cancellationToken = default);

/// <summary>
/// Create an authorization with defined permissions.
/// </summary>
/// <param name="authorization">authorization to create</param>
/// <param name="cancellationToken">Cancellation token</param>
/// <returns>the created authorization</returns>
Task<Authorization> CreateAuthorizationAsync(AuthorizationPostRequest authorization,
CancellationToken cancellationToken = default);

/// <summary>
/// Updates the status of the authorization. Useful for setting an authorization to inactive or active.
/// </summary>
/// <param name="authorization">the authorization with updated status</param>
/// <param name="cancellationToken">Cancellation token</param>
/// <returns>the updated authorization</returns>
Task<Authorization> UpdateAuthorizationAsync(Authorization authorization,
CancellationToken cancellationToken = default);

/// <summary>
/// Delete an authorization.
/// </summary>
/// <param name="authorization">authorization to delete</param>
/// <param name="cancellationToken">Cancellation token</param>
/// <returns>authorization deleted</returns>
Task DeleteAuthorizationAsync(Authorization authorization, CancellationToken cancellationToken = default);

/// <summary>
/// Delete an authorization.
/// </summary>
/// <param name="authorizationId">ID of authorization to delete</param>
/// <param name="cancellationToken">Cancellation token</param>
/// <returns>authorization deleted</returns>
Task DeleteAuthorizationAsync(string authorizationId, CancellationToken cancellationToken = default);

/// <summary>
/// Clone an authorization.
/// </summary>
/// <param name="authorizationId">ID of authorization to clone</param>
/// <param name="cancellationToken">Cancellation token</param>
/// <returns>cloned authorization</returns>
Task<Authorization> CloneAuthorizationAsync(string authorizationId,
CancellationToken cancellationToken = default);

/// <summary>
/// Clone an authorization.
/// </summary>
/// <param name="authorization">authorization to clone</param>
/// <param name="cancellationToken">Cancellation token</param>
/// <returns>cloned authorization</returns>
Task<Authorization> CloneAuthorizationAsync(Authorization authorization,
CancellationToken cancellationToken = default);

/// <summary>
/// Retrieve an authorization.
/// </summary>
/// <param name="authorizationId">ID of authorization to get</param>
/// <param name="cancellationToken">Cancellation token</param>
/// <returns>authorization details</returns>
Task<Authorization> FindAuthorizationByIdAsync(string authorizationId,
CancellationToken cancellationToken = default);

/// <summary>
/// List all authorizations.
/// </summary>
/// <param name="cancellationToken">Cancellation token</param>
/// <returns>List all authorizations.</returns>
Task<List<Authorization>> FindAuthorizationsAsync(CancellationToken cancellationToken = default);

/// <summary>
/// List all authorizations belonging to specified user.
/// </summary>
/// <param name="user">user</param>
/// <param name="cancellationToken">Cancellation token</param>
/// <returns>A list of authorizations</returns>
Task<List<Authorization>> FindAuthorizationsByUserAsync(User user,
CancellationToken cancellationToken = default);

/// <summary>
/// List all authorizations belonging to specified user.
/// </summary>
/// <param name="userId">ID of user</param>
/// <param name="cancellationToken">Cancellation token</param>
/// <returns>A list of authorizations</returns>
Task<List<Authorization>> FindAuthorizationsByUserIdAsync(string userId,
CancellationToken cancellationToken = default);

/// <summary>
/// List all authorizations belonging to specified user.
/// </summary>
/// <param name="userName">Name of User</param>
/// <param name="cancellationToken">Cancellation token</param>
/// <returns>A list of authorizations</returns>
Task<List<Authorization>> FindAuthorizationsByUserNameAsync(string userName,
CancellationToken cancellationToken = default);
}

public class AuthorizationsApi : IAuthorizationsApi
{
private readonly AuthorizationsService _service;

Expand Down
Loading