diff --git a/Source/Clients/CSharp/Topica.Client/.gitignore b/Source/Clients/CSharp/Topica.Client/.gitignore new file mode 100644 index 0000000..1ee5385 --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/.gitignore @@ -0,0 +1,362 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd diff --git a/Source/Clients/CSharp/Topica.Client/.openapi-generator-ignore b/Source/Clients/CSharp/Topica.Client/.openapi-generator-ignore new file mode 100644 index 0000000..7484ee5 --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/.openapi-generator-ignore @@ -0,0 +1,23 @@ +# OpenAPI Generator Ignore +# Generated by openapi-generator https://github.com/openapitools/openapi-generator + +# Use this file to prevent files from being overwritten by the generator. +# The patterns follow closely to .gitignore or .dockerignore. + +# As an example, the C# client generator defines ApiClient.cs. +# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line: +#ApiClient.cs + +# You can match any string of characters against a directory, file or extension with a single asterisk (*): +#foo/*/qux +# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux + +# You can recursively match patterns against a directory, file or extension with a double asterisk (**): +#foo/**/qux +# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux + +# You can also negate patterns with an exclamation (!). +# For example, you can ignore all files in a docs folder with the file extension .md: +#docs/*.md +# Then explicitly reverse the ignore rule for a single file: +#!docs/README.md diff --git a/Source/Clients/CSharp/Topica.Client/.openapi-generator/FILES b/Source/Clients/CSharp/Topica.Client/.openapi-generator/FILES new file mode 100644 index 0000000..3e6319f --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/.openapi-generator/FILES @@ -0,0 +1,53 @@ +.gitignore +.openapi-generator-ignore +README.md +Topica.Client.sln +api/openapi.yaml +appveyor.yml +docs/Entry.md +docs/LoginApi.md +docs/LoginModel.md +docs/MessagesApi.md +docs/ProblemDetails.md +docs/Topic.md +docs/TopicMeta.md +docs/TopicMetaPaginatedResponse.md +docs/TopicsApi.md +git_push.sh +src/Topica.Client.Test/Api/LoginApiTests.cs +src/Topica.Client.Test/Api/MessagesApiTests.cs +src/Topica.Client.Test/Api/TopicsApiTests.cs +src/Topica.Client.Test/Model/EntryTests.cs +src/Topica.Client.Test/Model/LoginModelTests.cs +src/Topica.Client.Test/Model/ProblemDetailsTests.cs +src/Topica.Client.Test/Model/TopicMetaPaginatedResponseTests.cs +src/Topica.Client.Test/Model/TopicMetaTests.cs +src/Topica.Client.Test/Model/TopicTests.cs +src/Topica.Client.Test/Topica.Client.Test.csproj +src/Topica.Client/Api/LoginApi.cs +src/Topica.Client/Api/MessagesApi.cs +src/Topica.Client/Api/TopicsApi.cs +src/Topica.Client/Client/ApiClient.cs +src/Topica.Client/Client/ApiException.cs +src/Topica.Client/Client/ApiResponse.cs +src/Topica.Client/Client/ClientUtils.cs +src/Topica.Client/Client/Configuration.cs +src/Topica.Client/Client/ExceptionFactory.cs +src/Topica.Client/Client/GlobalConfiguration.cs +src/Topica.Client/Client/HttpMethod.cs +src/Topica.Client/Client/IApiAccessor.cs +src/Topica.Client/Client/IAsynchronousClient.cs +src/Topica.Client/Client/IReadableConfiguration.cs +src/Topica.Client/Client/ISynchronousClient.cs +src/Topica.Client/Client/Multimap.cs +src/Topica.Client/Client/OpenAPIDateConverter.cs +src/Topica.Client/Client/RequestOptions.cs +src/Topica.Client/Client/RetryConfiguration.cs +src/Topica.Client/Model/AbstractOpenAPISchema.cs +src/Topica.Client/Model/Entry.cs +src/Topica.Client/Model/LoginModel.cs +src/Topica.Client/Model/ProblemDetails.cs +src/Topica.Client/Model/Topic.cs +src/Topica.Client/Model/TopicMeta.cs +src/Topica.Client/Model/TopicMetaPaginatedResponse.cs +src/Topica.Client/Topica.Client.csproj diff --git a/Source/Clients/CSharp/Topica.Client/.openapi-generator/VERSION b/Source/Clients/CSharp/Topica.Client/.openapi-generator/VERSION new file mode 100644 index 0000000..4b49d9b --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/.openapi-generator/VERSION @@ -0,0 +1 @@ +7.2.0 \ No newline at end of file diff --git a/Source/Clients/CSharp/Topica.Client/README.md b/Source/Clients/CSharp/Topica.Client/README.md new file mode 100644 index 0000000..65d4e08 --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/README.md @@ -0,0 +1,171 @@ +# Topica.Client - the C# library for the Topica.Server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + +No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + +This C# SDK is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: + +- API version: 1.0 +- SDK version: 0.0.1 +- Build package: org.openapitools.codegen.languages.CSharpClientCodegen + + +## Frameworks supported + + +## Dependencies + +- [RestSharp](https://www.nuget.org/packages/RestSharp) - 106.13.0 or later +- [Json.NET](https://www.nuget.org/packages/Newtonsoft.Json/) - 13.0.2 or later +- [JsonSubTypes](https://www.nuget.org/packages/JsonSubTypes/) - 1.8.0 or later +- [System.ComponentModel.Annotations](https://www.nuget.org/packages/System.ComponentModel.Annotations) - 5.0.0 or later + +The DLLs included in the package may not be the latest version. We recommend using [NuGet](https://docs.nuget.org/consume/installing-nuget) to obtain the latest version of the packages: +``` +Install-Package RestSharp +Install-Package Newtonsoft.Json +Install-Package JsonSubTypes +Install-Package System.ComponentModel.Annotations +``` + +NOTE: RestSharp versions greater than 105.1.0 have a bug which causes file uploads to fail. See [RestSharp#742](https://github.com/restsharp/RestSharp/issues/742). +NOTE: RestSharp for .Net Core creates a new socket for each api call, which can lead to a socket exhaustion problem. See [RestSharp#1406](https://github.com/restsharp/RestSharp/issues/1406). + + +## Installation +Run the following command to generate the DLL +- [Mac/Linux] `/bin/sh build.sh` +- [Windows] `build.bat` + +Then include the DLL (under the `bin` folder) in the C# project, and use the namespaces: +```csharp +using Topica.Client.Api; +using Topica.Client.Client; +using Topica.Client.Model; +``` + +## Packaging + +A `.nuspec` is included with the project. You can follow the Nuget quickstart to [create](https://docs.microsoft.com/en-us/nuget/quickstart/create-and-publish-a-package#create-the-package) and [publish](https://docs.microsoft.com/en-us/nuget/quickstart/create-and-publish-a-package#publish-the-package) packages. + +This `.nuspec` uses placeholders from the `.csproj`, so build the `.csproj` directly: + +``` +nuget pack -Build -OutputDirectory out Topica.Client.csproj +``` + +Then, publish to a [local feed](https://docs.microsoft.com/en-us/nuget/hosting-packages/local-feeds) or [other host](https://docs.microsoft.com/en-us/nuget/hosting-packages/overview) and consume the new package via Nuget as usual. + + +## Usage + +To use the API client with a HTTP proxy, setup a `System.Net.WebProxy` +```csharp +Configuration c = new Configuration(); +System.Net.WebProxy webProxy = new System.Net.WebProxy("http://myProxyUrl:80/"); +webProxy.Credentials = System.Net.CredentialCache.DefaultCredentials; +c.Proxy = webProxy; +``` + + +## Getting Started + +```csharp +using System.Collections.Generic; +using System.Diagnostics; +using Topica.Client.Api; +using Topica.Client.Client; +using Topica.Client.Model; + +namespace Example +{ + public class Example + { + public static void Main() + { + + Configuration config = new Configuration(); + config.BasePath = "http://localhost"; + // Configure HTTP basic authorization: Basic + config.Username = "YOUR_USERNAME"; + config.Password = "YOUR_PASSWORD"; + // Configure API key authorization: ApiKey + config.ApiKey.Add("X-API-KEY", "YOUR_API_KEY"); + // Uncomment below to setup prefix (e.g. Bearer) for API key, if needed + // config.ApiKeyPrefix.Add("X-API-KEY", "Bearer"); + // Configure API key authorization: Bearer + config.ApiKey.Add("Authorization", "YOUR_API_KEY"); + // Uncomment below to setup prefix (e.g. Bearer) for API key, if needed + // config.ApiKeyPrefix.Add("Authorization", "Bearer"); + + var apiInstance = new LoginApi(config); + var loginModel = new LoginModel?(); // LoginModel? | (optional) + + try + { + string result = apiInstance.Login(loginModel); + Debug.WriteLine(result); + } + catch (ApiException e) + { + Debug.Print("Exception when calling LoginApi.Login: " + e.Message ); + Debug.Print("Status Code: "+ e.ErrorCode); + Debug.Print(e.StackTrace); + } + + } + } +} +``` + + +## Documentation for API Endpoints + +All URIs are relative to *http://localhost* + +Class | Method | HTTP request | Description +------------ | ------------- | ------------- | ------------- +*LoginApi* | [**Login**](docs/LoginApi.md#login) | **POST** /api/Login | +*MessagesApi* | [**AddMessage**](docs/MessagesApi.md#addmessage) | **POST** /api/Messages | Creates a message under topic id. +*TopicsApi* | [**CreateTopic**](docs/TopicsApi.md#createtopic) | **PUT** /api/Topics | +*TopicsApi* | [**DeleteMessage**](docs/TopicsApi.md#deletemessage) | **DELETE** /api/Topics/{topicId}/messages/{messageId} | +*TopicsApi* | [**DeleteTopic**](docs/TopicsApi.md#deletetopic) | **DELETE** /api/Topics/{topicId} | +*TopicsApi* | [**GetTopic**](docs/TopicsApi.md#gettopic) | **GET** /api/Topics/{topicId} | +*TopicsApi* | [**GetTopics**](docs/TopicsApi.md#gettopics) | **GET** /api/Topics | +*TopicsApi* | [**GetTotal**](docs/TopicsApi.md#gettotal) | **GET** /api/Topics/Total | + + + +## Documentation for Models + + - [Model.Entry](docs/Entry.md) + - [Model.LoginModel](docs/LoginModel.md) + - [Model.ProblemDetails](docs/ProblemDetails.md) + - [Model.Topic](docs/Topic.md) + - [Model.TopicMeta](docs/TopicMeta.md) + - [Model.TopicMetaPaginatedResponse](docs/TopicMetaPaginatedResponse.md) + + + +## Documentation for Authorization + + +Authentication schemes defined for the API: + +### Basic + +- **Type**: HTTP basic authentication + + +### ApiKey + +- **Type**: API key +- **API key parameter name**: X-API-KEY +- **Location**: HTTP header + + +### Bearer + +- **Type**: API key +- **API key parameter name**: Authorization +- **Location**: HTTP header + diff --git a/Source/Clients/CSharp/Topica.Client/Topica.Client.sln b/Source/Clients/CSharp/Topica.Client/Topica.Client.sln new file mode 100644 index 0000000..90be967 --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/Topica.Client.sln @@ -0,0 +1,27 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2012 +VisualStudioVersion = 12.0.0.0 +MinimumVisualStudioVersion = 10.0.0.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Topica.Client", "src\Topica.Client\Topica.Client.csproj", "{012DBA44-E1FB-47C3-B755-9BC9373901A6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Topica.Client.Test", "src\Topica.Client.Test\Topica.Client.Test.csproj", "{19F1DEBC-DE5E-4517-8062-F000CD499087}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {012DBA44-E1FB-47C3-B755-9BC9373901A6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {012DBA44-E1FB-47C3-B755-9BC9373901A6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {012DBA44-E1FB-47C3-B755-9BC9373901A6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {012DBA44-E1FB-47C3-B755-9BC9373901A6}.Release|Any CPU.Build.0 = Release|Any CPU + {19F1DEBC-DE5E-4517-8062-F000CD499087}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {19F1DEBC-DE5E-4517-8062-F000CD499087}.Debug|Any CPU.Build.0 = Debug|Any CPU + {19F1DEBC-DE5E-4517-8062-F000CD499087}.Release|Any CPU.ActiveCfg = Release|Any CPU + {19F1DEBC-DE5E-4517-8062-F000CD499087}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal \ No newline at end of file diff --git a/Source/Clients/CSharp/Topica.Client/api/openapi.yaml b/Source/Clients/CSharp/Topica.Client/api/openapi.yaml new file mode 100644 index 0000000..88ba946 --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/api/openapi.yaml @@ -0,0 +1,416 @@ +openapi: 3.0.1 +info: + title: "Topica.Server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + version: "1.0" +servers: +- url: / +security: +- Basic: [] + ApiKey: [] + Bearer: [] +paths: + /api/Login: + post: + operationId: Login + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/LoginModel' + text/json: + schema: + $ref: '#/components/schemas/LoginModel' + application/*+json: + schema: + $ref: '#/components/schemas/LoginModel' + responses: + "200": + content: + text/plain: + schema: + type: string + application/json: + schema: + type: string + text/json: + schema: + type: string + description: Success + tags: + - Login + /api/Messages: + post: + operationId: AddMessage + parameters: + - description: "If topicId is null, a new Topic will be generated with a random\ + \ GUID" + explode: true + in: query + name: topicId + required: false + schema: + type: string + style: form + requestBody: + content: + application/json: + schema: + type: string + text/json: + schema: + type: string + application/*+json: + schema: + type: string + description: "" + responses: + "200": + content: + text/plain: + schema: + type: string + application/json: + schema: + type: string + text/json: + schema: + type: string + description: Success + summary: Creates a message under topic id. + tags: + - Messages + /api/Topics: + get: + operationId: GetTopics + parameters: + - explode: true + in: query + name: page + required: false + schema: + default: 0 + format: int32 + type: integer + style: form + - explode: true + in: query + name: pageSize + required: false + schema: + default: 25 + format: int32 + type: integer + style: form + - explode: true + in: query + name: search + required: false + schema: + type: string + style: form + responses: + "404": + content: + text/plain: + schema: + $ref: '#/components/schemas/ProblemDetails' + application/json: + schema: + $ref: '#/components/schemas/ProblemDetails' + text/json: + schema: + $ref: '#/components/schemas/ProblemDetails' + description: Not Found + "200": + content: + text/plain: + schema: + $ref: '#/components/schemas/TopicMetaPaginatedResponse' + application/json: + schema: + $ref: '#/components/schemas/TopicMetaPaginatedResponse' + text/json: + schema: + $ref: '#/components/schemas/TopicMetaPaginatedResponse' + description: Success + tags: + - Topics + put: + operationId: CreateTopic + parameters: + - explode: true + in: query + name: topicId + required: false + schema: + type: string + style: form + responses: + "400": + content: + text/plain: + schema: + type: string + application/json: + schema: + type: string + text/json: + schema: + type: string + description: Bad Request + "200": + content: + text/plain: + schema: + type: string + application/json: + schema: + type: string + text/json: + schema: + type: string + description: Success + tags: + - Topics + /api/Topics/Total: + get: + operationId: GetTotal + responses: + "404": + content: + text/plain: + schema: + $ref: '#/components/schemas/ProblemDetails' + application/json: + schema: + $ref: '#/components/schemas/ProblemDetails' + text/json: + schema: + $ref: '#/components/schemas/ProblemDetails' + description: Not Found + "200": + content: + text/plain: + schema: + format: int32 + type: integer + application/json: + schema: + format: int32 + type: integer + text/json: + schema: + format: int32 + type: integer + description: Success + tags: + - Topics + /api/Topics/{topicId}: + delete: + operationId: DeleteTopic + parameters: + - explode: false + in: path + name: topicId + required: true + schema: + type: string + style: simple + responses: + "200": + description: Success + tags: + - Topics + get: + operationId: GetTopic + parameters: + - explode: false + in: path + name: topicId + required: true + schema: + type: string + style: simple + responses: + "404": + content: + text/plain: + schema: + $ref: '#/components/schemas/ProblemDetails' + application/json: + schema: + $ref: '#/components/schemas/ProblemDetails' + text/json: + schema: + $ref: '#/components/schemas/ProblemDetails' + description: Not Found + "200": + content: + text/plain: + schema: + $ref: '#/components/schemas/Topic' + application/json: + schema: + $ref: '#/components/schemas/Topic' + text/json: + schema: + $ref: '#/components/schemas/Topic' + description: Success + tags: + - Topics + /api/Topics/{topicId}/messages/{messageId}: + delete: + operationId: DeleteMessage + parameters: + - explode: false + in: path + name: topicId + required: true + schema: + type: string + style: simple + - explode: false + in: path + name: messageId + required: true + schema: + format: uuid + type: string + style: simple + responses: + "200": + description: Success + tags: + - Topics +components: + schemas: + Entry: + additionalProperties: false + example: + createdOn: 2000-01-23T04:56:07.000+00:00 + content: content + entryId: 046b6c7f-0b8a-43b9-b35d-6489e6daee91 + properties: + createdOn: + format: date-time + type: string + content: + nullable: true + type: string + entryId: + format: uuid + type: string + type: object + LoginModel: + additionalProperties: false + example: + password: password + username: username + properties: + username: + nullable: true + type: string + password: + nullable: true + type: string + type: object + ProblemDetails: + additionalProperties: {} + properties: + type: + nullable: true + type: string + title: + nullable: true + type: string + status: + format: int32 + nullable: true + type: integer + detail: + nullable: true + type: string + instance: + nullable: true + type: string + type: object + Topic: + additionalProperties: false + example: + id: id + history: + - createdOn: 2000-01-23T04:56:07.000+00:00 + content: content + entryId: 046b6c7f-0b8a-43b9-b35d-6489e6daee91 + - createdOn: 2000-01-23T04:56:07.000+00:00 + content: content + entryId: 046b6c7f-0b8a-43b9-b35d-6489e6daee91 + createdOn: 2000-01-23T04:56:07.000+00:00 + properties: + id: + nullable: true + type: string + createdOn: + format: date-time + type: string + history: + items: + $ref: '#/components/schemas/Entry' + nullable: true + type: array + type: object + TopicMeta: + additionalProperties: false + example: + id: id + createdOn: 2000-01-23T04:56:07.000+00:00 + properties: + id: + nullable: true + type: string + createdOn: + format: date-time + type: string + type: object + TopicMetaPaginatedResponse: + additionalProperties: false + example: + total: 1 + data: + - id: id + createdOn: 2000-01-23T04:56:07.000+00:00 + - id: id + createdOn: 2000-01-23T04:56:07.000+00:00 + pageSize: 6 + page: 0 + properties: + data: + items: + $ref: '#/components/schemas/TopicMeta' + nullable: true + type: array + page: + format: int32 + type: integer + pageSize: + format: int32 + type: integer + total: + format: int32 + type: integer + type: object + securitySchemes: + Basic: + description: Basic Authorization header + scheme: Basic + type: http + ApiKey: + in: header + name: X-API-KEY + type: apiKey + Bearer: + description: JWT Authorization header using the Bearer scheme. + in: header + name: Authorization + type: apiKey + diff --git a/Source/Clients/CSharp/Topica.Client/appveyor.yml b/Source/Clients/CSharp/Topica.Client/appveyor.yml new file mode 100644 index 0000000..4bca600 --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/appveyor.yml @@ -0,0 +1,9 @@ +# auto-generated by OpenAPI Generator (https://github.com/OpenAPITools/openapi-generator) +# +image: Visual Studio 2019 +clone_depth: 1 +build_script: +- dotnet build -c Release +- dotnet test -c Release +after_build: +- dotnet pack .\src\Topica.Client\Topica.Client.csproj -o ../../output -c Release --no-build diff --git a/Source/Clients/CSharp/Topica.Client/docs/Entry.md b/Source/Clients/CSharp/Topica.Client/docs/Entry.md new file mode 100644 index 0000000..16581ae --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/docs/Entry.md @@ -0,0 +1,12 @@ +# Topica.Client.Model.Entry + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**CreatedOn** | **DateTime** | | [optional] +**Content** | **string** | | [optional] +**EntryId** | **Guid** | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + diff --git a/Source/Clients/CSharp/Topica.Client/docs/LoginApi.md b/Source/Clients/CSharp/Topica.Client/docs/LoginApi.md new file mode 100644 index 0000000..c72e3b7 --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/docs/LoginApi.md @@ -0,0 +1,107 @@ +# Topica.Client.Api.LoginApi + +All URIs are relative to *http://localhost* + +| Method | HTTP request | Description | +|--------|--------------|-------------| +| [**Login**](LoginApi.md#login) | **POST** /api/Login | | + + +# **Login** +> string Login (LoginModel? loginModel = null) + + + +### Example +```csharp +using System.Collections.Generic; +using System.Diagnostics; +using Topica.Client.Api; +using Topica.Client.Client; +using Topica.Client.Model; + +namespace Example +{ + public class LoginExample + { + public static void Main() + { + Configuration config = new Configuration(); + config.BasePath = "http://localhost"; + // Configure HTTP basic authorization: Basic + config.Username = "YOUR_USERNAME"; + config.Password = "YOUR_PASSWORD"; + // Configure API key authorization: ApiKey + config.AddApiKey("X-API-KEY", "YOUR_API_KEY"); + // Uncomment below to setup prefix (e.g. Bearer) for API key, if needed + // config.AddApiKeyPrefix("X-API-KEY", "Bearer"); + // Configure API key authorization: Bearer + config.AddApiKey("Authorization", "YOUR_API_KEY"); + // Uncomment below to setup prefix (e.g. Bearer) for API key, if needed + // config.AddApiKeyPrefix("Authorization", "Bearer"); + + var apiInstance = new LoginApi(config); + var loginModel = new LoginModel?(); // LoginModel? | (optional) + + try + { + string result = apiInstance.Login(loginModel); + Debug.WriteLine(result); + } + catch (ApiException e) + { + Debug.Print("Exception when calling LoginApi.Login: " + e.Message); + Debug.Print("Status Code: " + e.ErrorCode); + Debug.Print(e.StackTrace); + } + } + } +} +``` + +#### Using the LoginWithHttpInfo variant +This returns an ApiResponse object which contains the response data, status code and headers. + +```csharp +try +{ + ApiResponse response = apiInstance.LoginWithHttpInfo(loginModel); + Debug.Write("Status Code: " + response.StatusCode); + Debug.Write("Response Headers: " + response.Headers); + Debug.Write("Response Body: " + response.Data); +} +catch (ApiException e) +{ + Debug.Print("Exception when calling LoginApi.LoginWithHttpInfo: " + e.Message); + Debug.Print("Status Code: " + e.ErrorCode); + Debug.Print(e.StackTrace); +} +``` + +### Parameters + +| Name | Type | Description | Notes | +|------|------|-------------|-------| +| **loginModel** | [**LoginModel?**](LoginModel?.md) | | [optional] | + +### Return type + +**string** + +### Authorization + +[Basic](../README.md#Basic), [ApiKey](../README.md#ApiKey), [Bearer](../README.md#Bearer) + +### HTTP request headers + + - **Content-Type**: application/json, text/json, application/*+json + - **Accept**: text/plain, application/json, text/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +| **200** | Success | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/Source/Clients/CSharp/Topica.Client/docs/LoginModel.md b/Source/Clients/CSharp/Topica.Client/docs/LoginModel.md new file mode 100644 index 0000000..cd4ab9c --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/docs/LoginModel.md @@ -0,0 +1,11 @@ +# Topica.Client.Model.LoginModel + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**Username** | **string** | | [optional] +**Password** | **string** | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + diff --git a/Source/Clients/CSharp/Topica.Client/docs/MessagesApi.md b/Source/Clients/CSharp/Topica.Client/docs/MessagesApi.md new file mode 100644 index 0000000..0582c52 --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/docs/MessagesApi.md @@ -0,0 +1,111 @@ +# Topica.Client.Api.MessagesApi + +All URIs are relative to *http://localhost* + +| Method | HTTP request | Description | +|--------|--------------|-------------| +| [**AddMessage**](MessagesApi.md#addmessage) | **POST** /api/Messages | Creates a message under topic id. | + + +# **AddMessage** +> string AddMessage (string? topicId = null, string? body = null) + +Creates a message under topic id. + +### Example +```csharp +using System.Collections.Generic; +using System.Diagnostics; +using Topica.Client.Api; +using Topica.Client.Client; +using Topica.Client.Model; + +namespace Example +{ + public class AddMessageExample + { + public static void Main() + { + Configuration config = new Configuration(); + config.BasePath = "http://localhost"; + // Configure HTTP basic authorization: Basic + config.Username = "YOUR_USERNAME"; + config.Password = "YOUR_PASSWORD"; + // Configure API key authorization: ApiKey + config.AddApiKey("X-API-KEY", "YOUR_API_KEY"); + // Uncomment below to setup prefix (e.g. Bearer) for API key, if needed + // config.AddApiKeyPrefix("X-API-KEY", "Bearer"); + // Configure API key authorization: Bearer + config.AddApiKey("Authorization", "YOUR_API_KEY"); + // Uncomment below to setup prefix (e.g. Bearer) for API key, if needed + // config.AddApiKeyPrefix("Authorization", "Bearer"); + + var apiInstance = new MessagesApi(config); + var topicId = "topicId_example"; // string? | If topicId is null, a new Topic will be generated with a random GUID (optional) + var body = "body_example"; // string? | (optional) + + try + { + // Creates a message under topic id. + string result = apiInstance.AddMessage(topicId, body); + Debug.WriteLine(result); + } + catch (ApiException e) + { + Debug.Print("Exception when calling MessagesApi.AddMessage: " + e.Message); + Debug.Print("Status Code: " + e.ErrorCode); + Debug.Print(e.StackTrace); + } + } + } +} +``` + +#### Using the AddMessageWithHttpInfo variant +This returns an ApiResponse object which contains the response data, status code and headers. + +```csharp +try +{ + // Creates a message under topic id. + ApiResponse response = apiInstance.AddMessageWithHttpInfo(topicId, body); + Debug.Write("Status Code: " + response.StatusCode); + Debug.Write("Response Headers: " + response.Headers); + Debug.Write("Response Body: " + response.Data); +} +catch (ApiException e) +{ + Debug.Print("Exception when calling MessagesApi.AddMessageWithHttpInfo: " + e.Message); + Debug.Print("Status Code: " + e.ErrorCode); + Debug.Print(e.StackTrace); +} +``` + +### Parameters + +| Name | Type | Description | Notes | +|------|------|-------------|-------| +| **topicId** | **string?** | If topicId is null, a new Topic will be generated with a random GUID | [optional] | +| **body** | **string?** | | [optional] | + +### Return type + +**string** + +### Authorization + +[Basic](../README.md#Basic), [ApiKey](../README.md#ApiKey), [Bearer](../README.md#Bearer) + +### HTTP request headers + + - **Content-Type**: application/json, text/json, application/*+json + - **Accept**: text/plain, application/json, text/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +| **200** | Success | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/Source/Clients/CSharp/Topica.Client/docs/ProblemDetails.md b/Source/Clients/CSharp/Topica.Client/docs/ProblemDetails.md new file mode 100644 index 0000000..8b615cd --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/docs/ProblemDetails.md @@ -0,0 +1,14 @@ +# Topica.Client.Model.ProblemDetails + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**Type** | **string** | | [optional] +**Title** | **string** | | [optional] +**Status** | **int?** | | [optional] +**Detail** | **string** | | [optional] +**Instance** | **string** | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + diff --git a/Source/Clients/CSharp/Topica.Client/docs/Topic.md b/Source/Clients/CSharp/Topica.Client/docs/Topic.md new file mode 100644 index 0000000..9912e23 --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/docs/Topic.md @@ -0,0 +1,12 @@ +# Topica.Client.Model.Topic + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**Id** | **string** | | [optional] +**CreatedOn** | **DateTime** | | [optional] +**History** | [**List<Entry>**](Entry.md) | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + diff --git a/Source/Clients/CSharp/Topica.Client/docs/TopicMeta.md b/Source/Clients/CSharp/Topica.Client/docs/TopicMeta.md new file mode 100644 index 0000000..b3c2472 --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/docs/TopicMeta.md @@ -0,0 +1,11 @@ +# Topica.Client.Model.TopicMeta + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**Id** | **string** | | [optional] +**CreatedOn** | **DateTime** | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + diff --git a/Source/Clients/CSharp/Topica.Client/docs/TopicMetaPaginatedResponse.md b/Source/Clients/CSharp/Topica.Client/docs/TopicMetaPaginatedResponse.md new file mode 100644 index 0000000..0b621c0 --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/docs/TopicMetaPaginatedResponse.md @@ -0,0 +1,13 @@ +# Topica.Client.Model.TopicMetaPaginatedResponse + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**Data** | [**List<TopicMeta>**](TopicMeta.md) | | [optional] +**Page** | **int** | | [optional] +**PageSize** | **int** | | [optional] +**Total** | **int** | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + diff --git a/Source/Clients/CSharp/Topica.Client/docs/TopicsApi.md b/Source/Clients/CSharp/Topica.Client/docs/TopicsApi.md new file mode 100644 index 0000000..07c4aaa --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/docs/TopicsApi.md @@ -0,0 +1,604 @@ +# Topica.Client.Api.TopicsApi + +All URIs are relative to *http://localhost* + +| Method | HTTP request | Description | +|--------|--------------|-------------| +| [**CreateTopic**](TopicsApi.md#createtopic) | **PUT** /api/Topics | | +| [**DeleteMessage**](TopicsApi.md#deletemessage) | **DELETE** /api/Topics/{topicId}/messages/{messageId} | | +| [**DeleteTopic**](TopicsApi.md#deletetopic) | **DELETE** /api/Topics/{topicId} | | +| [**GetTopic**](TopicsApi.md#gettopic) | **GET** /api/Topics/{topicId} | | +| [**GetTopics**](TopicsApi.md#gettopics) | **GET** /api/Topics | | +| [**GetTotal**](TopicsApi.md#gettotal) | **GET** /api/Topics/Total | | + + +# **CreateTopic** +> string CreateTopic (string? topicId = null) + + + +### Example +```csharp +using System.Collections.Generic; +using System.Diagnostics; +using Topica.Client.Api; +using Topica.Client.Client; +using Topica.Client.Model; + +namespace Example +{ + public class CreateTopicExample + { + public static void Main() + { + Configuration config = new Configuration(); + config.BasePath = "http://localhost"; + // Configure HTTP basic authorization: Basic + config.Username = "YOUR_USERNAME"; + config.Password = "YOUR_PASSWORD"; + // Configure API key authorization: ApiKey + config.AddApiKey("X-API-KEY", "YOUR_API_KEY"); + // Uncomment below to setup prefix (e.g. Bearer) for API key, if needed + // config.AddApiKeyPrefix("X-API-KEY", "Bearer"); + // Configure API key authorization: Bearer + config.AddApiKey("Authorization", "YOUR_API_KEY"); + // Uncomment below to setup prefix (e.g. Bearer) for API key, if needed + // config.AddApiKeyPrefix("Authorization", "Bearer"); + + var apiInstance = new TopicsApi(config); + var topicId = "topicId_example"; // string? | (optional) + + try + { + string result = apiInstance.CreateTopic(topicId); + Debug.WriteLine(result); + } + catch (ApiException e) + { + Debug.Print("Exception when calling TopicsApi.CreateTopic: " + e.Message); + Debug.Print("Status Code: " + e.ErrorCode); + Debug.Print(e.StackTrace); + } + } + } +} +``` + +#### Using the CreateTopicWithHttpInfo variant +This returns an ApiResponse object which contains the response data, status code and headers. + +```csharp +try +{ + ApiResponse response = apiInstance.CreateTopicWithHttpInfo(topicId); + Debug.Write("Status Code: " + response.StatusCode); + Debug.Write("Response Headers: " + response.Headers); + Debug.Write("Response Body: " + response.Data); +} +catch (ApiException e) +{ + Debug.Print("Exception when calling TopicsApi.CreateTopicWithHttpInfo: " + e.Message); + Debug.Print("Status Code: " + e.ErrorCode); + Debug.Print(e.StackTrace); +} +``` + +### Parameters + +| Name | Type | Description | Notes | +|------|------|-------------|-------| +| **topicId** | **string?** | | [optional] | + +### Return type + +**string** + +### Authorization + +[Basic](../README.md#Basic), [ApiKey](../README.md#ApiKey), [Bearer](../README.md#Bearer) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: text/plain, application/json, text/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +| **400** | Bad Request | - | +| **200** | Success | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +# **DeleteMessage** +> void DeleteMessage (string topicId, Guid messageId) + + + +### Example +```csharp +using System.Collections.Generic; +using System.Diagnostics; +using Topica.Client.Api; +using Topica.Client.Client; +using Topica.Client.Model; + +namespace Example +{ + public class DeleteMessageExample + { + public static void Main() + { + Configuration config = new Configuration(); + config.BasePath = "http://localhost"; + // Configure HTTP basic authorization: Basic + config.Username = "YOUR_USERNAME"; + config.Password = "YOUR_PASSWORD"; + // Configure API key authorization: ApiKey + config.AddApiKey("X-API-KEY", "YOUR_API_KEY"); + // Uncomment below to setup prefix (e.g. Bearer) for API key, if needed + // config.AddApiKeyPrefix("X-API-KEY", "Bearer"); + // Configure API key authorization: Bearer + config.AddApiKey("Authorization", "YOUR_API_KEY"); + // Uncomment below to setup prefix (e.g. Bearer) for API key, if needed + // config.AddApiKeyPrefix("Authorization", "Bearer"); + + var apiInstance = new TopicsApi(config); + var topicId = "topicId_example"; // string | + var messageId = "messageId_example"; // Guid | + + try + { + apiInstance.DeleteMessage(topicId, messageId); + } + catch (ApiException e) + { + Debug.Print("Exception when calling TopicsApi.DeleteMessage: " + e.Message); + Debug.Print("Status Code: " + e.ErrorCode); + Debug.Print(e.StackTrace); + } + } + } +} +``` + +#### Using the DeleteMessageWithHttpInfo variant +This returns an ApiResponse object which contains the response data, status code and headers. + +```csharp +try +{ + apiInstance.DeleteMessageWithHttpInfo(topicId, messageId); +} +catch (ApiException e) +{ + Debug.Print("Exception when calling TopicsApi.DeleteMessageWithHttpInfo: " + e.Message); + Debug.Print("Status Code: " + e.ErrorCode); + Debug.Print(e.StackTrace); +} +``` + +### Parameters + +| Name | Type | Description | Notes | +|------|------|-------------|-------| +| **topicId** | **string** | | | +| **messageId** | **Guid** | | | + +### Return type + +void (empty response body) + +### Authorization + +[Basic](../README.md#Basic), [ApiKey](../README.md#ApiKey), [Bearer](../README.md#Bearer) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: Not defined + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +| **200** | Success | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +# **DeleteTopic** +> void DeleteTopic (string topicId) + + + +### Example +```csharp +using System.Collections.Generic; +using System.Diagnostics; +using Topica.Client.Api; +using Topica.Client.Client; +using Topica.Client.Model; + +namespace Example +{ + public class DeleteTopicExample + { + public static void Main() + { + Configuration config = new Configuration(); + config.BasePath = "http://localhost"; + // Configure HTTP basic authorization: Basic + config.Username = "YOUR_USERNAME"; + config.Password = "YOUR_PASSWORD"; + // Configure API key authorization: ApiKey + config.AddApiKey("X-API-KEY", "YOUR_API_KEY"); + // Uncomment below to setup prefix (e.g. Bearer) for API key, if needed + // config.AddApiKeyPrefix("X-API-KEY", "Bearer"); + // Configure API key authorization: Bearer + config.AddApiKey("Authorization", "YOUR_API_KEY"); + // Uncomment below to setup prefix (e.g. Bearer) for API key, if needed + // config.AddApiKeyPrefix("Authorization", "Bearer"); + + var apiInstance = new TopicsApi(config); + var topicId = "topicId_example"; // string | + + try + { + apiInstance.DeleteTopic(topicId); + } + catch (ApiException e) + { + Debug.Print("Exception when calling TopicsApi.DeleteTopic: " + e.Message); + Debug.Print("Status Code: " + e.ErrorCode); + Debug.Print(e.StackTrace); + } + } + } +} +``` + +#### Using the DeleteTopicWithHttpInfo variant +This returns an ApiResponse object which contains the response data, status code and headers. + +```csharp +try +{ + apiInstance.DeleteTopicWithHttpInfo(topicId); +} +catch (ApiException e) +{ + Debug.Print("Exception when calling TopicsApi.DeleteTopicWithHttpInfo: " + e.Message); + Debug.Print("Status Code: " + e.ErrorCode); + Debug.Print(e.StackTrace); +} +``` + +### Parameters + +| Name | Type | Description | Notes | +|------|------|-------------|-------| +| **topicId** | **string** | | | + +### Return type + +void (empty response body) + +### Authorization + +[Basic](../README.md#Basic), [ApiKey](../README.md#ApiKey), [Bearer](../README.md#Bearer) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: Not defined + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +| **200** | Success | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +# **GetTopic** +> Topic GetTopic (string topicId) + + + +### Example +```csharp +using System.Collections.Generic; +using System.Diagnostics; +using Topica.Client.Api; +using Topica.Client.Client; +using Topica.Client.Model; + +namespace Example +{ + public class GetTopicExample + { + public static void Main() + { + Configuration config = new Configuration(); + config.BasePath = "http://localhost"; + // Configure HTTP basic authorization: Basic + config.Username = "YOUR_USERNAME"; + config.Password = "YOUR_PASSWORD"; + // Configure API key authorization: ApiKey + config.AddApiKey("X-API-KEY", "YOUR_API_KEY"); + // Uncomment below to setup prefix (e.g. Bearer) for API key, if needed + // config.AddApiKeyPrefix("X-API-KEY", "Bearer"); + // Configure API key authorization: Bearer + config.AddApiKey("Authorization", "YOUR_API_KEY"); + // Uncomment below to setup prefix (e.g. Bearer) for API key, if needed + // config.AddApiKeyPrefix("Authorization", "Bearer"); + + var apiInstance = new TopicsApi(config); + var topicId = "topicId_example"; // string | + + try + { + Topic result = apiInstance.GetTopic(topicId); + Debug.WriteLine(result); + } + catch (ApiException e) + { + Debug.Print("Exception when calling TopicsApi.GetTopic: " + e.Message); + Debug.Print("Status Code: " + e.ErrorCode); + Debug.Print(e.StackTrace); + } + } + } +} +``` + +#### Using the GetTopicWithHttpInfo variant +This returns an ApiResponse object which contains the response data, status code and headers. + +```csharp +try +{ + ApiResponse response = apiInstance.GetTopicWithHttpInfo(topicId); + Debug.Write("Status Code: " + response.StatusCode); + Debug.Write("Response Headers: " + response.Headers); + Debug.Write("Response Body: " + response.Data); +} +catch (ApiException e) +{ + Debug.Print("Exception when calling TopicsApi.GetTopicWithHttpInfo: " + e.Message); + Debug.Print("Status Code: " + e.ErrorCode); + Debug.Print(e.StackTrace); +} +``` + +### Parameters + +| Name | Type | Description | Notes | +|------|------|-------------|-------| +| **topicId** | **string** | | | + +### Return type + +[**Topic**](Topic.md) + +### Authorization + +[Basic](../README.md#Basic), [ApiKey](../README.md#ApiKey), [Bearer](../README.md#Bearer) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: text/plain, application/json, text/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +| **404** | Not Found | - | +| **200** | Success | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +# **GetTopics** +> TopicMetaPaginatedResponse GetTopics (int? page = null, int? pageSize = null, string? search = null) + + + +### Example +```csharp +using System.Collections.Generic; +using System.Diagnostics; +using Topica.Client.Api; +using Topica.Client.Client; +using Topica.Client.Model; + +namespace Example +{ + public class GetTopicsExample + { + public static void Main() + { + Configuration config = new Configuration(); + config.BasePath = "http://localhost"; + // Configure HTTP basic authorization: Basic + config.Username = "YOUR_USERNAME"; + config.Password = "YOUR_PASSWORD"; + // Configure API key authorization: ApiKey + config.AddApiKey("X-API-KEY", "YOUR_API_KEY"); + // Uncomment below to setup prefix (e.g. Bearer) for API key, if needed + // config.AddApiKeyPrefix("X-API-KEY", "Bearer"); + // Configure API key authorization: Bearer + config.AddApiKey("Authorization", "YOUR_API_KEY"); + // Uncomment below to setup prefix (e.g. Bearer) for API key, if needed + // config.AddApiKeyPrefix("Authorization", "Bearer"); + + var apiInstance = new TopicsApi(config); + var page = 0; // int? | (optional) (default to 0) + var pageSize = 25; // int? | (optional) (default to 25) + var search = "search_example"; // string? | (optional) + + try + { + TopicMetaPaginatedResponse result = apiInstance.GetTopics(page, pageSize, search); + Debug.WriteLine(result); + } + catch (ApiException e) + { + Debug.Print("Exception when calling TopicsApi.GetTopics: " + e.Message); + Debug.Print("Status Code: " + e.ErrorCode); + Debug.Print(e.StackTrace); + } + } + } +} +``` + +#### Using the GetTopicsWithHttpInfo variant +This returns an ApiResponse object which contains the response data, status code and headers. + +```csharp +try +{ + ApiResponse response = apiInstance.GetTopicsWithHttpInfo(page, pageSize, search); + Debug.Write("Status Code: " + response.StatusCode); + Debug.Write("Response Headers: " + response.Headers); + Debug.Write("Response Body: " + response.Data); +} +catch (ApiException e) +{ + Debug.Print("Exception when calling TopicsApi.GetTopicsWithHttpInfo: " + e.Message); + Debug.Print("Status Code: " + e.ErrorCode); + Debug.Print(e.StackTrace); +} +``` + +### Parameters + +| Name | Type | Description | Notes | +|------|------|-------------|-------| +| **page** | **int?** | | [optional] [default to 0] | +| **pageSize** | **int?** | | [optional] [default to 25] | +| **search** | **string?** | | [optional] | + +### Return type + +[**TopicMetaPaginatedResponse**](TopicMetaPaginatedResponse.md) + +### Authorization + +[Basic](../README.md#Basic), [ApiKey](../README.md#ApiKey), [Bearer](../README.md#Bearer) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: text/plain, application/json, text/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +| **404** | Not Found | - | +| **200** | Success | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +# **GetTotal** +> int GetTotal () + + + +### Example +```csharp +using System.Collections.Generic; +using System.Diagnostics; +using Topica.Client.Api; +using Topica.Client.Client; +using Topica.Client.Model; + +namespace Example +{ + public class GetTotalExample + { + public static void Main() + { + Configuration config = new Configuration(); + config.BasePath = "http://localhost"; + // Configure HTTP basic authorization: Basic + config.Username = "YOUR_USERNAME"; + config.Password = "YOUR_PASSWORD"; + // Configure API key authorization: ApiKey + config.AddApiKey("X-API-KEY", "YOUR_API_KEY"); + // Uncomment below to setup prefix (e.g. Bearer) for API key, if needed + // config.AddApiKeyPrefix("X-API-KEY", "Bearer"); + // Configure API key authorization: Bearer + config.AddApiKey("Authorization", "YOUR_API_KEY"); + // Uncomment below to setup prefix (e.g. Bearer) for API key, if needed + // config.AddApiKeyPrefix("Authorization", "Bearer"); + + var apiInstance = new TopicsApi(config); + + try + { + int result = apiInstance.GetTotal(); + Debug.WriteLine(result); + } + catch (ApiException e) + { + Debug.Print("Exception when calling TopicsApi.GetTotal: " + e.Message); + Debug.Print("Status Code: " + e.ErrorCode); + Debug.Print(e.StackTrace); + } + } + } +} +``` + +#### Using the GetTotalWithHttpInfo variant +This returns an ApiResponse object which contains the response data, status code and headers. + +```csharp +try +{ + ApiResponse response = apiInstance.GetTotalWithHttpInfo(); + Debug.Write("Status Code: " + response.StatusCode); + Debug.Write("Response Headers: " + response.Headers); + Debug.Write("Response Body: " + response.Data); +} +catch (ApiException e) +{ + Debug.Print("Exception when calling TopicsApi.GetTotalWithHttpInfo: " + e.Message); + Debug.Print("Status Code: " + e.ErrorCode); + Debug.Print(e.StackTrace); +} +``` + +### Parameters +This endpoint does not need any parameter. +### Return type + +**int** + +### Authorization + +[Basic](../README.md#Basic), [ApiKey](../README.md#ApiKey), [Bearer](../README.md#Bearer) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: text/plain, application/json, text/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +| **404** | Not Found | - | +| **200** | Success | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/Source/Clients/CSharp/Topica.Client/git_push.sh b/Source/Clients/CSharp/Topica.Client/git_push.sh new file mode 100644 index 0000000..f53a75d --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/git_push.sh @@ -0,0 +1,57 @@ +#!/bin/sh +# ref: https://help.github.com/articles/adding-an-existing-project-to-github-using-the-command-line/ +# +# Usage example: /bin/sh ./git_push.sh wing328 openapi-petstore-perl "minor update" "gitlab.com" + +git_user_id=$1 +git_repo_id=$2 +release_note=$3 +git_host=$4 + +if [ "$git_host" = "" ]; then + git_host="github.com" + echo "[INFO] No command line input provided. Set \$git_host to $git_host" +fi + +if [ "$git_user_id" = "" ]; then + git_user_id="GIT_USER_ID" + echo "[INFO] No command line input provided. Set \$git_user_id to $git_user_id" +fi + +if [ "$git_repo_id" = "" ]; then + git_repo_id="GIT_REPO_ID" + echo "[INFO] No command line input provided. Set \$git_repo_id to $git_repo_id" +fi + +if [ "$release_note" = "" ]; then + release_note="Minor update" + echo "[INFO] No command line input provided. Set \$release_note to $release_note" +fi + +# Initialize the local directory as a Git repository +git init + +# Adds the files in the local repository and stages them for commit. +git add . + +# Commits the tracked changes and prepares them to be pushed to a remote repository. +git commit -m "$release_note" + +# Sets the new remote +git_remote=$(git remote) +if [ "$git_remote" = "" ]; then # git remote not defined + + if [ "$GIT_TOKEN" = "" ]; then + echo "[INFO] \$GIT_TOKEN (environment variable) is not set. Using the git credential in your environment." + git remote add origin https://${git_host}/${git_user_id}/${git_repo_id}.git + else + git remote add origin https://${git_user_id}:"${GIT_TOKEN}"@${git_host}/${git_user_id}/${git_repo_id}.git + fi + +fi + +git pull origin master + +# Pushes (Forces) the changes in the local repository up to the remote repository +echo "Git pushing to https://${git_host}/${git_user_id}/${git_repo_id}.git" +git push origin master 2>&1 | grep -v 'To https' diff --git a/Source/Clients/CSharp/Topica.Client/src/Topica.Client.Test/Api/LoginApiTests.cs b/Source/Clients/CSharp/Topica.Client/src/Topica.Client.Test/Api/LoginApiTests.cs new file mode 100644 index 0000000..8cb199f --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/src/Topica.Client.Test/Api/LoginApiTests.cs @@ -0,0 +1,69 @@ +/* + * Topica.Server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + * + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + +using System; +using System.IO; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Reflection; +using RestSharp; +using Xunit; + +using Topica.Client.Client; +using Topica.Client.Api; +// uncomment below to import models +//using Topica.Client.Model; + +namespace Topica.Client.Test.Api +{ + /// + /// Class for testing LoginApi + /// + /// + /// This file is automatically generated by OpenAPI Generator (https://openapi-generator.tech). + /// Please update the test case below to test the API endpoint. + /// + public class LoginApiTests : IDisposable + { + private LoginApi instance; + + public LoginApiTests() + { + instance = new LoginApi(); + } + + public void Dispose() + { + // Cleanup when everything is done. + } + + /// + /// Test an instance of LoginApi + /// + [Fact] + public void InstanceTest() + { + // TODO uncomment below to test 'IsType' LoginApi + //Assert.IsType(instance); + } + + /// + /// Test Login + /// + [Fact] + public void LoginTest() + { + // TODO uncomment below to test the method and replace null with proper value + //LoginModel? loginModel = null; + //var response = instance.Login(loginModel); + //Assert.IsType(response); + } + } +} diff --git a/Source/Clients/CSharp/Topica.Client/src/Topica.Client.Test/Api/MessagesApiTests.cs b/Source/Clients/CSharp/Topica.Client/src/Topica.Client.Test/Api/MessagesApiTests.cs new file mode 100644 index 0000000..9d83499 --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/src/Topica.Client.Test/Api/MessagesApiTests.cs @@ -0,0 +1,68 @@ +/* + * Topica.Server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + * + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + +using System; +using System.IO; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Reflection; +using RestSharp; +using Xunit; + +using Topica.Client.Client; +using Topica.Client.Api; + +namespace Topica.Client.Test.Api +{ + /// + /// Class for testing MessagesApi + /// + /// + /// This file is automatically generated by OpenAPI Generator (https://openapi-generator.tech). + /// Please update the test case below to test the API endpoint. + /// + public class MessagesApiTests : IDisposable + { + private MessagesApi instance; + + public MessagesApiTests() + { + instance = new MessagesApi(); + } + + public void Dispose() + { + // Cleanup when everything is done. + } + + /// + /// Test an instance of MessagesApi + /// + [Fact] + public void InstanceTest() + { + // TODO uncomment below to test 'IsType' MessagesApi + //Assert.IsType(instance); + } + + /// + /// Test AddMessage + /// + [Fact] + public void AddMessageTest() + { + // TODO uncomment below to test the method and replace null with proper value + //string? topicId = null; + //string? body = null; + //var response = instance.AddMessage(topicId, body); + //Assert.IsType(response); + } + } +} diff --git a/Source/Clients/CSharp/Topica.Client/src/Topica.Client.Test/Api/TopicsApiTests.cs b/Source/Clients/CSharp/Topica.Client/src/Topica.Client.Test/Api/TopicsApiTests.cs new file mode 100644 index 0000000..89c10ac --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/src/Topica.Client.Test/Api/TopicsApiTests.cs @@ -0,0 +1,129 @@ +/* + * Topica.Server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + * + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + +using System; +using System.IO; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Reflection; +using RestSharp; +using Xunit; + +using Topica.Client.Client; +using Topica.Client.Api; +// uncomment below to import models +//using Topica.Client.Model; + +namespace Topica.Client.Test.Api +{ + /// + /// Class for testing TopicsApi + /// + /// + /// This file is automatically generated by OpenAPI Generator (https://openapi-generator.tech). + /// Please update the test case below to test the API endpoint. + /// + public class TopicsApiTests : IDisposable + { + private TopicsApi instance; + + public TopicsApiTests() + { + instance = new TopicsApi(); + } + + public void Dispose() + { + // Cleanup when everything is done. + } + + /// + /// Test an instance of TopicsApi + /// + [Fact] + public void InstanceTest() + { + // TODO uncomment below to test 'IsType' TopicsApi + //Assert.IsType(instance); + } + + /// + /// Test CreateTopic + /// + [Fact] + public void CreateTopicTest() + { + // TODO uncomment below to test the method and replace null with proper value + //string? topicId = null; + //var response = instance.CreateTopic(topicId); + //Assert.IsType(response); + } + + /// + /// Test DeleteMessage + /// + [Fact] + public void DeleteMessageTest() + { + // TODO uncomment below to test the method and replace null with proper value + //string topicId = null; + //Guid messageId = null; + //instance.DeleteMessage(topicId, messageId); + } + + /// + /// Test DeleteTopic + /// + [Fact] + public void DeleteTopicTest() + { + // TODO uncomment below to test the method and replace null with proper value + //string topicId = null; + //instance.DeleteTopic(topicId); + } + + /// + /// Test GetTopic + /// + [Fact] + public void GetTopicTest() + { + // TODO uncomment below to test the method and replace null with proper value + //string topicId = null; + //var response = instance.GetTopic(topicId); + //Assert.IsType(response); + } + + /// + /// Test GetTopics + /// + [Fact] + public void GetTopicsTest() + { + // TODO uncomment below to test the method and replace null with proper value + //int? page = null; + //int? pageSize = null; + //string? search = null; + //var response = instance.GetTopics(page, pageSize, search); + //Assert.IsType(response); + } + + /// + /// Test GetTotal + /// + [Fact] + public void GetTotalTest() + { + // TODO uncomment below to test the method and replace null with proper value + //var response = instance.GetTotal(); + //Assert.IsType(response); + } + } +} diff --git a/Source/Clients/CSharp/Topica.Client/src/Topica.Client.Test/Model/EntryTests.cs b/Source/Clients/CSharp/Topica.Client/src/Topica.Client.Test/Model/EntryTests.cs new file mode 100644 index 0000000..0499b4a --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/src/Topica.Client.Test/Model/EntryTests.cs @@ -0,0 +1,84 @@ +/* + * Topica.Server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + * + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + + +using Xunit; + +using System; +using System.Linq; +using System.IO; +using System.Collections.Generic; +using Topica.Client.Model; +using Topica.Client.Client; +using System.Reflection; +using Newtonsoft.Json; + +namespace Topica.Client.Test.Model +{ + /// + /// Class for testing Entry + /// + /// + /// This file is automatically generated by OpenAPI Generator (https://openapi-generator.tech). + /// Please update the test case below to test the model. + /// + public class EntryTests : IDisposable + { + // TODO uncomment below to declare an instance variable for Entry + //private Entry instance; + + public EntryTests() + { + // TODO uncomment below to create an instance of Entry + //instance = new Entry(); + } + + public void Dispose() + { + // Cleanup when everything is done. + } + + /// + /// Test an instance of Entry + /// + [Fact] + public void EntryInstanceTest() + { + // TODO uncomment below to test "IsType" Entry + //Assert.IsType(instance); + } + + /// + /// Test the property 'CreatedOn' + /// + [Fact] + public void CreatedOnTest() + { + // TODO unit test for the property 'CreatedOn' + } + + /// + /// Test the property 'Content' + /// + [Fact] + public void ContentTest() + { + // TODO unit test for the property 'Content' + } + + /// + /// Test the property 'EntryId' + /// + [Fact] + public void EntryIdTest() + { + // TODO unit test for the property 'EntryId' + } + } +} diff --git a/Source/Clients/CSharp/Topica.Client/src/Topica.Client.Test/Model/LoginModelTests.cs b/Source/Clients/CSharp/Topica.Client/src/Topica.Client.Test/Model/LoginModelTests.cs new file mode 100644 index 0000000..9994575 --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/src/Topica.Client.Test/Model/LoginModelTests.cs @@ -0,0 +1,75 @@ +/* + * Topica.Server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + * + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + + +using Xunit; + +using System; +using System.Linq; +using System.IO; +using System.Collections.Generic; +using Topica.Client.Model; +using Topica.Client.Client; +using System.Reflection; +using Newtonsoft.Json; + +namespace Topica.Client.Test.Model +{ + /// + /// Class for testing LoginModel + /// + /// + /// This file is automatically generated by OpenAPI Generator (https://openapi-generator.tech). + /// Please update the test case below to test the model. + /// + public class LoginModelTests : IDisposable + { + // TODO uncomment below to declare an instance variable for LoginModel + //private LoginModel instance; + + public LoginModelTests() + { + // TODO uncomment below to create an instance of LoginModel + //instance = new LoginModel(); + } + + public void Dispose() + { + // Cleanup when everything is done. + } + + /// + /// Test an instance of LoginModel + /// + [Fact] + public void LoginModelInstanceTest() + { + // TODO uncomment below to test "IsType" LoginModel + //Assert.IsType(instance); + } + + /// + /// Test the property 'Username' + /// + [Fact] + public void UsernameTest() + { + // TODO unit test for the property 'Username' + } + + /// + /// Test the property 'Password' + /// + [Fact] + public void PasswordTest() + { + // TODO unit test for the property 'Password' + } + } +} diff --git a/Source/Clients/CSharp/Topica.Client/src/Topica.Client.Test/Model/ProblemDetailsTests.cs b/Source/Clients/CSharp/Topica.Client/src/Topica.Client.Test/Model/ProblemDetailsTests.cs new file mode 100644 index 0000000..1084b83 --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/src/Topica.Client.Test/Model/ProblemDetailsTests.cs @@ -0,0 +1,102 @@ +/* + * Topica.Server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + * + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + + +using Xunit; + +using System; +using System.Linq; +using System.IO; +using System.Collections.Generic; +using Topica.Client.Model; +using Topica.Client.Client; +using System.Reflection; +using Newtonsoft.Json; + +namespace Topica.Client.Test.Model +{ + /// + /// Class for testing ProblemDetails + /// + /// + /// This file is automatically generated by OpenAPI Generator (https://openapi-generator.tech). + /// Please update the test case below to test the model. + /// + public class ProblemDetailsTests : IDisposable + { + // TODO uncomment below to declare an instance variable for ProblemDetails + //private ProblemDetails instance; + + public ProblemDetailsTests() + { + // TODO uncomment below to create an instance of ProblemDetails + //instance = new ProblemDetails(); + } + + public void Dispose() + { + // Cleanup when everything is done. + } + + /// + /// Test an instance of ProblemDetails + /// + [Fact] + public void ProblemDetailsInstanceTest() + { + // TODO uncomment below to test "IsType" ProblemDetails + //Assert.IsType(instance); + } + + /// + /// Test the property 'Type' + /// + [Fact] + public void TypeTest() + { + // TODO unit test for the property 'Type' + } + + /// + /// Test the property 'Title' + /// + [Fact] + public void TitleTest() + { + // TODO unit test for the property 'Title' + } + + /// + /// Test the property 'Status' + /// + [Fact] + public void StatusTest() + { + // TODO unit test for the property 'Status' + } + + /// + /// Test the property 'Detail' + /// + [Fact] + public void DetailTest() + { + // TODO unit test for the property 'Detail' + } + + /// + /// Test the property 'Instance' + /// + [Fact] + public void InstanceTest() + { + // TODO unit test for the property 'Instance' + } + } +} diff --git a/Source/Clients/CSharp/Topica.Client/src/Topica.Client.Test/Model/TopicMetaPaginatedResponseTests.cs b/Source/Clients/CSharp/Topica.Client/src/Topica.Client.Test/Model/TopicMetaPaginatedResponseTests.cs new file mode 100644 index 0000000..402811c --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/src/Topica.Client.Test/Model/TopicMetaPaginatedResponseTests.cs @@ -0,0 +1,93 @@ +/* + * Topica.Server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + * + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + + +using Xunit; + +using System; +using System.Linq; +using System.IO; +using System.Collections.Generic; +using Topica.Client.Model; +using Topica.Client.Client; +using System.Reflection; +using Newtonsoft.Json; + +namespace Topica.Client.Test.Model +{ + /// + /// Class for testing TopicMetaPaginatedResponse + /// + /// + /// This file is automatically generated by OpenAPI Generator (https://openapi-generator.tech). + /// Please update the test case below to test the model. + /// + public class TopicMetaPaginatedResponseTests : IDisposable + { + // TODO uncomment below to declare an instance variable for TopicMetaPaginatedResponse + //private TopicMetaPaginatedResponse instance; + + public TopicMetaPaginatedResponseTests() + { + // TODO uncomment below to create an instance of TopicMetaPaginatedResponse + //instance = new TopicMetaPaginatedResponse(); + } + + public void Dispose() + { + // Cleanup when everything is done. + } + + /// + /// Test an instance of TopicMetaPaginatedResponse + /// + [Fact] + public void TopicMetaPaginatedResponseInstanceTest() + { + // TODO uncomment below to test "IsType" TopicMetaPaginatedResponse + //Assert.IsType(instance); + } + + /// + /// Test the property 'Data' + /// + [Fact] + public void DataTest() + { + // TODO unit test for the property 'Data' + } + + /// + /// Test the property 'Page' + /// + [Fact] + public void PageTest() + { + // TODO unit test for the property 'Page' + } + + /// + /// Test the property 'PageSize' + /// + [Fact] + public void PageSizeTest() + { + // TODO unit test for the property 'PageSize' + } + + /// + /// Test the property 'Total' + /// + [Fact] + public void TotalTest() + { + // TODO unit test for the property 'Total' + } + } +} diff --git a/Source/Clients/CSharp/Topica.Client/src/Topica.Client.Test/Model/TopicMetaTests.cs b/Source/Clients/CSharp/Topica.Client/src/Topica.Client.Test/Model/TopicMetaTests.cs new file mode 100644 index 0000000..abd5de7 --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/src/Topica.Client.Test/Model/TopicMetaTests.cs @@ -0,0 +1,75 @@ +/* + * Topica.Server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + * + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + + +using Xunit; + +using System; +using System.Linq; +using System.IO; +using System.Collections.Generic; +using Topica.Client.Model; +using Topica.Client.Client; +using System.Reflection; +using Newtonsoft.Json; + +namespace Topica.Client.Test.Model +{ + /// + /// Class for testing TopicMeta + /// + /// + /// This file is automatically generated by OpenAPI Generator (https://openapi-generator.tech). + /// Please update the test case below to test the model. + /// + public class TopicMetaTests : IDisposable + { + // TODO uncomment below to declare an instance variable for TopicMeta + //private TopicMeta instance; + + public TopicMetaTests() + { + // TODO uncomment below to create an instance of TopicMeta + //instance = new TopicMeta(); + } + + public void Dispose() + { + // Cleanup when everything is done. + } + + /// + /// Test an instance of TopicMeta + /// + [Fact] + public void TopicMetaInstanceTest() + { + // TODO uncomment below to test "IsType" TopicMeta + //Assert.IsType(instance); + } + + /// + /// Test the property 'Id' + /// + [Fact] + public void IdTest() + { + // TODO unit test for the property 'Id' + } + + /// + /// Test the property 'CreatedOn' + /// + [Fact] + public void CreatedOnTest() + { + // TODO unit test for the property 'CreatedOn' + } + } +} diff --git a/Source/Clients/CSharp/Topica.Client/src/Topica.Client.Test/Model/TopicTests.cs b/Source/Clients/CSharp/Topica.Client/src/Topica.Client.Test/Model/TopicTests.cs new file mode 100644 index 0000000..7d925df --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/src/Topica.Client.Test/Model/TopicTests.cs @@ -0,0 +1,84 @@ +/* + * Topica.Server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + * + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + + +using Xunit; + +using System; +using System.Linq; +using System.IO; +using System.Collections.Generic; +using Topica.Client.Model; +using Topica.Client.Client; +using System.Reflection; +using Newtonsoft.Json; + +namespace Topica.Client.Test.Model +{ + /// + /// Class for testing Topic + /// + /// + /// This file is automatically generated by OpenAPI Generator (https://openapi-generator.tech). + /// Please update the test case below to test the model. + /// + public class TopicTests : IDisposable + { + // TODO uncomment below to declare an instance variable for Topic + //private Topic instance; + + public TopicTests() + { + // TODO uncomment below to create an instance of Topic + //instance = new Topic(); + } + + public void Dispose() + { + // Cleanup when everything is done. + } + + /// + /// Test an instance of Topic + /// + [Fact] + public void TopicInstanceTest() + { + // TODO uncomment below to test "IsType" Topic + //Assert.IsType(instance); + } + + /// + /// Test the property 'Id' + /// + [Fact] + public void IdTest() + { + // TODO unit test for the property 'Id' + } + + /// + /// Test the property 'CreatedOn' + /// + [Fact] + public void CreatedOnTest() + { + // TODO unit test for the property 'CreatedOn' + } + + /// + /// Test the property 'History' + /// + [Fact] + public void HistoryTest() + { + // TODO unit test for the property 'History' + } + } +} diff --git a/Source/Clients/CSharp/Topica.Client/src/Topica.Client.Test/Topica.Client.Test.csproj b/Source/Clients/CSharp/Topica.Client/src/Topica.Client.Test/Topica.Client.Test.csproj new file mode 100644 index 0000000..1b1ffaf --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/src/Topica.Client.Test/Topica.Client.Test.csproj @@ -0,0 +1,20 @@ + + + + Topica.Client.Test + Topica.Client.Test + net8.0 + false + annotations + + + + + + + + + + + + diff --git a/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Api/LoginApi.cs b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Api/LoginApi.cs new file mode 100644 index 0000000..cf9ad94 --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Api/LoginApi.cs @@ -0,0 +1,378 @@ +/* + * Topica.Server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + * + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + + +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Net; +using System.Net.Mime; +using Topica.Client.Client; +using Topica.Client.Model; + +namespace Topica.Client.Api +{ + + /// + /// Represents a collection of functions to interact with the API endpoints + /// + public interface ILoginApiSync : IApiAccessor + { + #region Synchronous Operations + /// + /// + /// + /// Thrown when fails to make API call + /// (optional) + /// Index associated with the operation. + /// string + string Login(LoginModel? loginModel = default(LoginModel?), int operationIndex = 0); + + /// + /// + /// + /// + /// + /// + /// Thrown when fails to make API call + /// (optional) + /// Index associated with the operation. + /// ApiResponse of string + ApiResponse LoginWithHttpInfo(LoginModel? loginModel = default(LoginModel?), int operationIndex = 0); + #endregion Synchronous Operations + } + + /// + /// Represents a collection of functions to interact with the API endpoints + /// + public interface ILoginApiAsync : IApiAccessor + { + #region Asynchronous Operations + /// + /// + /// + /// + /// + /// + /// Thrown when fails to make API call + /// (optional) + /// Index associated with the operation. + /// Cancellation Token to cancel the request. + /// Task of string + System.Threading.Tasks.Task LoginAsync(LoginModel? loginModel = default(LoginModel?), int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)); + + /// + /// + /// + /// + /// + /// + /// Thrown when fails to make API call + /// (optional) + /// Index associated with the operation. + /// Cancellation Token to cancel the request. + /// Task of ApiResponse (string) + System.Threading.Tasks.Task> LoginWithHttpInfoAsync(LoginModel? loginModel = default(LoginModel?), int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)); + #endregion Asynchronous Operations + } + + /// + /// Represents a collection of functions to interact with the API endpoints + /// + public interface ILoginApi : ILoginApiSync, ILoginApiAsync + { + + } + + /// + /// Represents a collection of functions to interact with the API endpoints + /// + public partial class LoginApi : ILoginApi + { + private Topica.Client.Client.ExceptionFactory _exceptionFactory = (name, response) => null; + + /// + /// Initializes a new instance of the class. + /// + /// + public LoginApi() : this((string)null) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// + public LoginApi(string basePath) + { + this.Configuration = Topica.Client.Client.Configuration.MergeConfigurations( + Topica.Client.Client.GlobalConfiguration.Instance, + new Topica.Client.Client.Configuration { BasePath = basePath } + ); + this.Client = new Topica.Client.Client.ApiClient(this.Configuration.BasePath); + this.AsynchronousClient = new Topica.Client.Client.ApiClient(this.Configuration.BasePath); + this.ExceptionFactory = Topica.Client.Client.Configuration.DefaultExceptionFactory; + } + + /// + /// Initializes a new instance of the class + /// using Configuration object + /// + /// An instance of Configuration + /// + public LoginApi(Topica.Client.Client.Configuration configuration) + { + if (configuration == null) throw new ArgumentNullException("configuration"); + + this.Configuration = Topica.Client.Client.Configuration.MergeConfigurations( + Topica.Client.Client.GlobalConfiguration.Instance, + configuration + ); + this.Client = new Topica.Client.Client.ApiClient(this.Configuration.BasePath); + this.AsynchronousClient = new Topica.Client.Client.ApiClient(this.Configuration.BasePath); + ExceptionFactory = Topica.Client.Client.Configuration.DefaultExceptionFactory; + } + + /// + /// Initializes a new instance of the class + /// using a Configuration object and client instance. + /// + /// The client interface for synchronous API access. + /// The client interface for asynchronous API access. + /// The configuration object. + public LoginApi(Topica.Client.Client.ISynchronousClient client, Topica.Client.Client.IAsynchronousClient asyncClient, Topica.Client.Client.IReadableConfiguration configuration) + { + if (client == null) throw new ArgumentNullException("client"); + if (asyncClient == null) throw new ArgumentNullException("asyncClient"); + if (configuration == null) throw new ArgumentNullException("configuration"); + + this.Client = client; + this.AsynchronousClient = asyncClient; + this.Configuration = configuration; + this.ExceptionFactory = Topica.Client.Client.Configuration.DefaultExceptionFactory; + } + + /// + /// The client for accessing this underlying API asynchronously. + /// + public Topica.Client.Client.IAsynchronousClient AsynchronousClient { get; set; } + + /// + /// The client for accessing this underlying API synchronously. + /// + public Topica.Client.Client.ISynchronousClient Client { get; set; } + + /// + /// Gets the base path of the API client. + /// + /// The base path + public string GetBasePath() + { + return this.Configuration.BasePath; + } + + /// + /// Gets or sets the configuration object + /// + /// An instance of the Configuration + public Topica.Client.Client.IReadableConfiguration Configuration { get; set; } + + /// + /// Provides a factory method hook for the creation of exceptions. + /// + public Topica.Client.Client.ExceptionFactory ExceptionFactory + { + get + { + if (_exceptionFactory != null && _exceptionFactory.GetInvocationList().Length > 1) + { + throw new InvalidOperationException("Multicast delegate for ExceptionFactory is unsupported."); + } + return _exceptionFactory; + } + set { _exceptionFactory = value; } + } + + /// + /// + /// + /// Thrown when fails to make API call + /// (optional) + /// Index associated with the operation. + /// string + public string Login(LoginModel? loginModel = default(LoginModel?), int operationIndex = 0) + { + Topica.Client.Client.ApiResponse localVarResponse = LoginWithHttpInfo(loginModel); + return localVarResponse.Data; + } + + /// + /// + /// + /// Thrown when fails to make API call + /// (optional) + /// Index associated with the operation. + /// ApiResponse of string + public Topica.Client.Client.ApiResponse LoginWithHttpInfo(LoginModel? loginModel = default(LoginModel?), int operationIndex = 0) + { + Topica.Client.Client.RequestOptions localVarRequestOptions = new Topica.Client.Client.RequestOptions(); + + string[] _contentTypes = new string[] { + "application/json", + "text/json", + "application/*+json" + }; + + // to determine the Accept header + string[] _accepts = new string[] { + "text/plain", + "application/json", + "text/json" + }; + + var localVarContentType = Topica.Client.Client.ClientUtils.SelectHeaderContentType(_contentTypes); + if (localVarContentType != null) + { + localVarRequestOptions.HeaderParameters.Add("Content-Type", localVarContentType); + } + + var localVarAccept = Topica.Client.Client.ClientUtils.SelectHeaderAccept(_accepts); + if (localVarAccept != null) + { + localVarRequestOptions.HeaderParameters.Add("Accept", localVarAccept); + } + + localVarRequestOptions.Data = loginModel; + + localVarRequestOptions.Operation = "LoginApi.Login"; + localVarRequestOptions.OperationIndex = operationIndex; + + // authentication (Basic) required + // http basic authentication required + if (!string.IsNullOrEmpty(this.Configuration.Username) || !string.IsNullOrEmpty(this.Configuration.Password) && !localVarRequestOptions.HeaderParameters.ContainsKey("Authorization")) + { + localVarRequestOptions.HeaderParameters.Add("Authorization", "Basic " + Topica.Client.Client.ClientUtils.Base64Encode(this.Configuration.Username + ":" + this.Configuration.Password)); + } + // authentication (ApiKey) required + if (!string.IsNullOrEmpty(this.Configuration.GetApiKeyWithPrefix("X-API-KEY"))) + { + localVarRequestOptions.HeaderParameters.Add("X-API-KEY", this.Configuration.GetApiKeyWithPrefix("X-API-KEY")); + } + // authentication (Bearer) required + if (!string.IsNullOrEmpty(this.Configuration.GetApiKeyWithPrefix("Authorization"))) + { + localVarRequestOptions.HeaderParameters.Add("Authorization", this.Configuration.GetApiKeyWithPrefix("Authorization")); + } + + // make the HTTP request + var localVarResponse = this.Client.Post("/api/Login", localVarRequestOptions, this.Configuration); + if (this.ExceptionFactory != null) + { + Exception _exception = this.ExceptionFactory("Login", localVarResponse); + if (_exception != null) + { + throw _exception; + } + } + + return localVarResponse; + } + + /// + /// + /// + /// Thrown when fails to make API call + /// (optional) + /// Index associated with the operation. + /// Cancellation Token to cancel the request. + /// Task of string + public async System.Threading.Tasks.Task LoginAsync(LoginModel? loginModel = default(LoginModel?), int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) + { + Topica.Client.Client.ApiResponse localVarResponse = await LoginWithHttpInfoAsync(loginModel, operationIndex, cancellationToken).ConfigureAwait(false); + return localVarResponse.Data; + } + + /// + /// + /// + /// Thrown when fails to make API call + /// (optional) + /// Index associated with the operation. + /// Cancellation Token to cancel the request. + /// Task of ApiResponse (string) + public async System.Threading.Tasks.Task> LoginWithHttpInfoAsync(LoginModel? loginModel = default(LoginModel?), int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) + { + + Topica.Client.Client.RequestOptions localVarRequestOptions = new Topica.Client.Client.RequestOptions(); + + string[] _contentTypes = new string[] { + "application/json", + "text/json", + "application/*+json" + }; + + // to determine the Accept header + string[] _accepts = new string[] { + "text/plain", + "application/json", + "text/json" + }; + + var localVarContentType = Topica.Client.Client.ClientUtils.SelectHeaderContentType(_contentTypes); + if (localVarContentType != null) + { + localVarRequestOptions.HeaderParameters.Add("Content-Type", localVarContentType); + } + + var localVarAccept = Topica.Client.Client.ClientUtils.SelectHeaderAccept(_accepts); + if (localVarAccept != null) + { + localVarRequestOptions.HeaderParameters.Add("Accept", localVarAccept); + } + + localVarRequestOptions.Data = loginModel; + + localVarRequestOptions.Operation = "LoginApi.Login"; + localVarRequestOptions.OperationIndex = operationIndex; + + // authentication (Basic) required + // http basic authentication required + if (!string.IsNullOrEmpty(this.Configuration.Username) || !string.IsNullOrEmpty(this.Configuration.Password) && !localVarRequestOptions.HeaderParameters.ContainsKey("Authorization")) + { + localVarRequestOptions.HeaderParameters.Add("Authorization", "Basic " + Topica.Client.Client.ClientUtils.Base64Encode(this.Configuration.Username + ":" + this.Configuration.Password)); + } + // authentication (ApiKey) required + if (!string.IsNullOrEmpty(this.Configuration.GetApiKeyWithPrefix("X-API-KEY"))) + { + localVarRequestOptions.HeaderParameters.Add("X-API-KEY", this.Configuration.GetApiKeyWithPrefix("X-API-KEY")); + } + // authentication (Bearer) required + if (!string.IsNullOrEmpty(this.Configuration.GetApiKeyWithPrefix("Authorization"))) + { + localVarRequestOptions.HeaderParameters.Add("Authorization", this.Configuration.GetApiKeyWithPrefix("Authorization")); + } + + // make the HTTP request + var localVarResponse = await this.AsynchronousClient.PostAsync("/api/Login", localVarRequestOptions, this.Configuration, cancellationToken).ConfigureAwait(false); + + if (this.ExceptionFactory != null) + { + Exception _exception = this.ExceptionFactory("Login", localVarResponse); + if (_exception != null) + { + throw _exception; + } + } + + return localVarResponse; + } + + } +} diff --git a/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Api/MessagesApi.cs b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Api/MessagesApi.cs new file mode 100644 index 0000000..229b166 --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Api/MessagesApi.cs @@ -0,0 +1,393 @@ +/* + * Topica.Server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + * + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + + +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Net; +using System.Net.Mime; +using Topica.Client.Client; + +namespace Topica.Client.Api +{ + + /// + /// Represents a collection of functions to interact with the API endpoints + /// + public interface IMessagesApiSync : IApiAccessor + { + #region Synchronous Operations + /// + /// Creates a message under topic id. + /// + /// Thrown when fails to make API call + /// If topicId is null, a new Topic will be generated with a random GUID (optional) + /// (optional) + /// Index associated with the operation. + /// string + string AddMessage(string? topicId = default(string?), string? body = default(string?), int operationIndex = 0); + + /// + /// Creates a message under topic id. + /// + /// + /// + /// + /// Thrown when fails to make API call + /// If topicId is null, a new Topic will be generated with a random GUID (optional) + /// (optional) + /// Index associated with the operation. + /// ApiResponse of string + ApiResponse AddMessageWithHttpInfo(string? topicId = default(string?), string? body = default(string?), int operationIndex = 0); + #endregion Synchronous Operations + } + + /// + /// Represents a collection of functions to interact with the API endpoints + /// + public interface IMessagesApiAsync : IApiAccessor + { + #region Asynchronous Operations + /// + /// Creates a message under topic id. + /// + /// + /// + /// + /// Thrown when fails to make API call + /// If topicId is null, a new Topic will be generated with a random GUID (optional) + /// (optional) + /// Index associated with the operation. + /// Cancellation Token to cancel the request. + /// Task of string + System.Threading.Tasks.Task AddMessageAsync(string? topicId = default(string?), string? body = default(string?), int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)); + + /// + /// Creates a message under topic id. + /// + /// + /// + /// + /// Thrown when fails to make API call + /// If topicId is null, a new Topic will be generated with a random GUID (optional) + /// (optional) + /// Index associated with the operation. + /// Cancellation Token to cancel the request. + /// Task of ApiResponse (string) + System.Threading.Tasks.Task> AddMessageWithHttpInfoAsync(string? topicId = default(string?), string? body = default(string?), int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)); + #endregion Asynchronous Operations + } + + /// + /// Represents a collection of functions to interact with the API endpoints + /// + public interface IMessagesApi : IMessagesApiSync, IMessagesApiAsync + { + + } + + /// + /// Represents a collection of functions to interact with the API endpoints + /// + public partial class MessagesApi : IMessagesApi + { + private Topica.Client.Client.ExceptionFactory _exceptionFactory = (name, response) => null; + + /// + /// Initializes a new instance of the class. + /// + /// + public MessagesApi() : this((string)null) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// + public MessagesApi(string basePath) + { + this.Configuration = Topica.Client.Client.Configuration.MergeConfigurations( + Topica.Client.Client.GlobalConfiguration.Instance, + new Topica.Client.Client.Configuration { BasePath = basePath } + ); + this.Client = new Topica.Client.Client.ApiClient(this.Configuration.BasePath); + this.AsynchronousClient = new Topica.Client.Client.ApiClient(this.Configuration.BasePath); + this.ExceptionFactory = Topica.Client.Client.Configuration.DefaultExceptionFactory; + } + + /// + /// Initializes a new instance of the class + /// using Configuration object + /// + /// An instance of Configuration + /// + public MessagesApi(Topica.Client.Client.Configuration configuration) + { + if (configuration == null) throw new ArgumentNullException("configuration"); + + this.Configuration = Topica.Client.Client.Configuration.MergeConfigurations( + Topica.Client.Client.GlobalConfiguration.Instance, + configuration + ); + this.Client = new Topica.Client.Client.ApiClient(this.Configuration.BasePath); + this.AsynchronousClient = new Topica.Client.Client.ApiClient(this.Configuration.BasePath); + ExceptionFactory = Topica.Client.Client.Configuration.DefaultExceptionFactory; + } + + /// + /// Initializes a new instance of the class + /// using a Configuration object and client instance. + /// + /// The client interface for synchronous API access. + /// The client interface for asynchronous API access. + /// The configuration object. + public MessagesApi(Topica.Client.Client.ISynchronousClient client, Topica.Client.Client.IAsynchronousClient asyncClient, Topica.Client.Client.IReadableConfiguration configuration) + { + if (client == null) throw new ArgumentNullException("client"); + if (asyncClient == null) throw new ArgumentNullException("asyncClient"); + if (configuration == null) throw new ArgumentNullException("configuration"); + + this.Client = client; + this.AsynchronousClient = asyncClient; + this.Configuration = configuration; + this.ExceptionFactory = Topica.Client.Client.Configuration.DefaultExceptionFactory; + } + + /// + /// The client for accessing this underlying API asynchronously. + /// + public Topica.Client.Client.IAsynchronousClient AsynchronousClient { get; set; } + + /// + /// The client for accessing this underlying API synchronously. + /// + public Topica.Client.Client.ISynchronousClient Client { get; set; } + + /// + /// Gets the base path of the API client. + /// + /// The base path + public string GetBasePath() + { + return this.Configuration.BasePath; + } + + /// + /// Gets or sets the configuration object + /// + /// An instance of the Configuration + public Topica.Client.Client.IReadableConfiguration Configuration { get; set; } + + /// + /// Provides a factory method hook for the creation of exceptions. + /// + public Topica.Client.Client.ExceptionFactory ExceptionFactory + { + get + { + if (_exceptionFactory != null && _exceptionFactory.GetInvocationList().Length > 1) + { + throw new InvalidOperationException("Multicast delegate for ExceptionFactory is unsupported."); + } + return _exceptionFactory; + } + set { _exceptionFactory = value; } + } + + /// + /// Creates a message under topic id. + /// + /// Thrown when fails to make API call + /// If topicId is null, a new Topic will be generated with a random GUID (optional) + /// (optional) + /// Index associated with the operation. + /// string + public string AddMessage(string? topicId = default(string?), string? body = default(string?), int operationIndex = 0) + { + Topica.Client.Client.ApiResponse localVarResponse = AddMessageWithHttpInfo(topicId, body); + return localVarResponse.Data; + } + + /// + /// Creates a message under topic id. + /// + /// Thrown when fails to make API call + /// If topicId is null, a new Topic will be generated with a random GUID (optional) + /// (optional) + /// Index associated with the operation. + /// ApiResponse of string + public Topica.Client.Client.ApiResponse AddMessageWithHttpInfo(string? topicId = default(string?), string? body = default(string?), int operationIndex = 0) + { + Topica.Client.Client.RequestOptions localVarRequestOptions = new Topica.Client.Client.RequestOptions(); + + string[] _contentTypes = new string[] { + "application/json", + "text/json", + "application/*+json" + }; + + // to determine the Accept header + string[] _accepts = new string[] { + "text/plain", + "application/json", + "text/json" + }; + + var localVarContentType = Topica.Client.Client.ClientUtils.SelectHeaderContentType(_contentTypes); + if (localVarContentType != null) + { + localVarRequestOptions.HeaderParameters.Add("Content-Type", localVarContentType); + } + + var localVarAccept = Topica.Client.Client.ClientUtils.SelectHeaderAccept(_accepts); + if (localVarAccept != null) + { + localVarRequestOptions.HeaderParameters.Add("Accept", localVarAccept); + } + + if (topicId != null) + { + localVarRequestOptions.QueryParameters.Add(Topica.Client.Client.ClientUtils.ParameterToMultiMap("", "topicId", topicId)); + } + localVarRequestOptions.Data = body; + + localVarRequestOptions.Operation = "MessagesApi.AddMessage"; + localVarRequestOptions.OperationIndex = operationIndex; + + // authentication (Basic) required + // http basic authentication required + if (!string.IsNullOrEmpty(this.Configuration.Username) || !string.IsNullOrEmpty(this.Configuration.Password) && !localVarRequestOptions.HeaderParameters.ContainsKey("Authorization")) + { + localVarRequestOptions.HeaderParameters.Add("Authorization", "Basic " + Topica.Client.Client.ClientUtils.Base64Encode(this.Configuration.Username + ":" + this.Configuration.Password)); + } + // authentication (ApiKey) required + if (!string.IsNullOrEmpty(this.Configuration.GetApiKeyWithPrefix("X-API-KEY"))) + { + localVarRequestOptions.HeaderParameters.Add("X-API-KEY", this.Configuration.GetApiKeyWithPrefix("X-API-KEY")); + } + // authentication (Bearer) required + if (!string.IsNullOrEmpty(this.Configuration.GetApiKeyWithPrefix("Authorization"))) + { + localVarRequestOptions.HeaderParameters.Add("Authorization", this.Configuration.GetApiKeyWithPrefix("Authorization")); + } + + // make the HTTP request + var localVarResponse = this.Client.Post("/api/Messages", localVarRequestOptions, this.Configuration); + if (this.ExceptionFactory != null) + { + Exception _exception = this.ExceptionFactory("AddMessage", localVarResponse); + if (_exception != null) + { + throw _exception; + } + } + + return localVarResponse; + } + + /// + /// Creates a message under topic id. + /// + /// Thrown when fails to make API call + /// If topicId is null, a new Topic will be generated with a random GUID (optional) + /// (optional) + /// Index associated with the operation. + /// Cancellation Token to cancel the request. + /// Task of string + public async System.Threading.Tasks.Task AddMessageAsync(string? topicId = default(string?), string? body = default(string?), int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) + { + Topica.Client.Client.ApiResponse localVarResponse = await AddMessageWithHttpInfoAsync(topicId, body, operationIndex, cancellationToken).ConfigureAwait(false); + return localVarResponse.Data; + } + + /// + /// Creates a message under topic id. + /// + /// Thrown when fails to make API call + /// If topicId is null, a new Topic will be generated with a random GUID (optional) + /// (optional) + /// Index associated with the operation. + /// Cancellation Token to cancel the request. + /// Task of ApiResponse (string) + public async System.Threading.Tasks.Task> AddMessageWithHttpInfoAsync(string? topicId = default(string?), string? body = default(string?), int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) + { + + Topica.Client.Client.RequestOptions localVarRequestOptions = new Topica.Client.Client.RequestOptions(); + + string[] _contentTypes = new string[] { + "application/json", + "text/json", + "application/*+json" + }; + + // to determine the Accept header + string[] _accepts = new string[] { + "text/plain", + "application/json", + "text/json" + }; + + var localVarContentType = Topica.Client.Client.ClientUtils.SelectHeaderContentType(_contentTypes); + if (localVarContentType != null) + { + localVarRequestOptions.HeaderParameters.Add("Content-Type", localVarContentType); + } + + var localVarAccept = Topica.Client.Client.ClientUtils.SelectHeaderAccept(_accepts); + if (localVarAccept != null) + { + localVarRequestOptions.HeaderParameters.Add("Accept", localVarAccept); + } + + if (topicId != null) + { + localVarRequestOptions.QueryParameters.Add(Topica.Client.Client.ClientUtils.ParameterToMultiMap("", "topicId", topicId)); + } + localVarRequestOptions.Data = body; + + localVarRequestOptions.Operation = "MessagesApi.AddMessage"; + localVarRequestOptions.OperationIndex = operationIndex; + + // authentication (Basic) required + // http basic authentication required + if (!string.IsNullOrEmpty(this.Configuration.Username) || !string.IsNullOrEmpty(this.Configuration.Password) && !localVarRequestOptions.HeaderParameters.ContainsKey("Authorization")) + { + localVarRequestOptions.HeaderParameters.Add("Authorization", "Basic " + Topica.Client.Client.ClientUtils.Base64Encode(this.Configuration.Username + ":" + this.Configuration.Password)); + } + // authentication (ApiKey) required + if (!string.IsNullOrEmpty(this.Configuration.GetApiKeyWithPrefix("X-API-KEY"))) + { + localVarRequestOptions.HeaderParameters.Add("X-API-KEY", this.Configuration.GetApiKeyWithPrefix("X-API-KEY")); + } + // authentication (Bearer) required + if (!string.IsNullOrEmpty(this.Configuration.GetApiKeyWithPrefix("Authorization"))) + { + localVarRequestOptions.HeaderParameters.Add("Authorization", this.Configuration.GetApiKeyWithPrefix("Authorization")); + } + + // make the HTTP request + var localVarResponse = await this.AsynchronousClient.PostAsync("/api/Messages", localVarRequestOptions, this.Configuration, cancellationToken).ConfigureAwait(false); + + if (this.ExceptionFactory != null) + { + Exception _exception = this.ExceptionFactory("AddMessage", localVarResponse); + if (_exception != null) + { + throw _exception; + } + } + + return localVarResponse; + } + + } +} diff --git a/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Api/TopicsApi.cs b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Api/TopicsApi.cs new file mode 100644 index 0000000..552a97c --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Api/TopicsApi.cs @@ -0,0 +1,1501 @@ +/* + * Topica.Server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + * + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + + +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Net; +using System.Net.Mime; +using Topica.Client.Client; +using Topica.Client.Model; + +namespace Topica.Client.Api +{ + + /// + /// Represents a collection of functions to interact with the API endpoints + /// + public interface ITopicsApiSync : IApiAccessor + { + #region Synchronous Operations + /// + /// + /// + /// Thrown when fails to make API call + /// (optional) + /// Index associated with the operation. + /// string + string CreateTopic(string? topicId = default(string?), int operationIndex = 0); + + /// + /// + /// + /// + /// + /// + /// Thrown when fails to make API call + /// (optional) + /// Index associated with the operation. + /// ApiResponse of string + ApiResponse CreateTopicWithHttpInfo(string? topicId = default(string?), int operationIndex = 0); + /// + /// + /// + /// Thrown when fails to make API call + /// + /// + /// Index associated with the operation. + /// + void DeleteMessage(string topicId, Guid messageId, int operationIndex = 0); + + /// + /// + /// + /// + /// + /// + /// Thrown when fails to make API call + /// + /// + /// Index associated with the operation. + /// ApiResponse of Object(void) + ApiResponse DeleteMessageWithHttpInfo(string topicId, Guid messageId, int operationIndex = 0); + /// + /// + /// + /// Thrown when fails to make API call + /// + /// Index associated with the operation. + /// + void DeleteTopic(string topicId, int operationIndex = 0); + + /// + /// + /// + /// + /// + /// + /// Thrown when fails to make API call + /// + /// Index associated with the operation. + /// ApiResponse of Object(void) + ApiResponse DeleteTopicWithHttpInfo(string topicId, int operationIndex = 0); + /// + /// + /// + /// Thrown when fails to make API call + /// + /// Index associated with the operation. + /// Topic + Topic GetTopic(string topicId, int operationIndex = 0); + + /// + /// + /// + /// + /// + /// + /// Thrown when fails to make API call + /// + /// Index associated with the operation. + /// ApiResponse of Topic + ApiResponse GetTopicWithHttpInfo(string topicId, int operationIndex = 0); + /// + /// + /// + /// Thrown when fails to make API call + /// (optional, default to 0) + /// (optional, default to 25) + /// (optional) + /// Index associated with the operation. + /// TopicMetaPaginatedResponse + TopicMetaPaginatedResponse GetTopics(int? page = default(int?), int? pageSize = default(int?), string? search = default(string?), int operationIndex = 0); + + /// + /// + /// + /// + /// + /// + /// Thrown when fails to make API call + /// (optional, default to 0) + /// (optional, default to 25) + /// (optional) + /// Index associated with the operation. + /// ApiResponse of TopicMetaPaginatedResponse + ApiResponse GetTopicsWithHttpInfo(int? page = default(int?), int? pageSize = default(int?), string? search = default(string?), int operationIndex = 0); + /// + /// + /// + /// Thrown when fails to make API call + /// Index associated with the operation. + /// int + int GetTotal(int operationIndex = 0); + + /// + /// + /// + /// + /// + /// + /// Thrown when fails to make API call + /// Index associated with the operation. + /// ApiResponse of int + ApiResponse GetTotalWithHttpInfo(int operationIndex = 0); + #endregion Synchronous Operations + } + + /// + /// Represents a collection of functions to interact with the API endpoints + /// + public interface ITopicsApiAsync : IApiAccessor + { + #region Asynchronous Operations + /// + /// + /// + /// + /// + /// + /// Thrown when fails to make API call + /// (optional) + /// Index associated with the operation. + /// Cancellation Token to cancel the request. + /// Task of string + System.Threading.Tasks.Task CreateTopicAsync(string? topicId = default(string?), int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)); + + /// + /// + /// + /// + /// + /// + /// Thrown when fails to make API call + /// (optional) + /// Index associated with the operation. + /// Cancellation Token to cancel the request. + /// Task of ApiResponse (string) + System.Threading.Tasks.Task> CreateTopicWithHttpInfoAsync(string? topicId = default(string?), int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)); + /// + /// + /// + /// + /// + /// + /// Thrown when fails to make API call + /// + /// + /// Index associated with the operation. + /// Cancellation Token to cancel the request. + /// Task of void + System.Threading.Tasks.Task DeleteMessageAsync(string topicId, Guid messageId, int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)); + + /// + /// + /// + /// + /// + /// + /// Thrown when fails to make API call + /// + /// + /// Index associated with the operation. + /// Cancellation Token to cancel the request. + /// Task of ApiResponse + System.Threading.Tasks.Task> DeleteMessageWithHttpInfoAsync(string topicId, Guid messageId, int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)); + /// + /// + /// + /// + /// + /// + /// Thrown when fails to make API call + /// + /// Index associated with the operation. + /// Cancellation Token to cancel the request. + /// Task of void + System.Threading.Tasks.Task DeleteTopicAsync(string topicId, int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)); + + /// + /// + /// + /// + /// + /// + /// Thrown when fails to make API call + /// + /// Index associated with the operation. + /// Cancellation Token to cancel the request. + /// Task of ApiResponse + System.Threading.Tasks.Task> DeleteTopicWithHttpInfoAsync(string topicId, int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)); + /// + /// + /// + /// + /// + /// + /// Thrown when fails to make API call + /// + /// Index associated with the operation. + /// Cancellation Token to cancel the request. + /// Task of Topic + System.Threading.Tasks.Task GetTopicAsync(string topicId, int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)); + + /// + /// + /// + /// + /// + /// + /// Thrown when fails to make API call + /// + /// Index associated with the operation. + /// Cancellation Token to cancel the request. + /// Task of ApiResponse (Topic) + System.Threading.Tasks.Task> GetTopicWithHttpInfoAsync(string topicId, int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)); + /// + /// + /// + /// + /// + /// + /// Thrown when fails to make API call + /// (optional, default to 0) + /// (optional, default to 25) + /// (optional) + /// Index associated with the operation. + /// Cancellation Token to cancel the request. + /// Task of TopicMetaPaginatedResponse + System.Threading.Tasks.Task GetTopicsAsync(int? page = default(int?), int? pageSize = default(int?), string? search = default(string?), int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)); + + /// + /// + /// + /// + /// + /// + /// Thrown when fails to make API call + /// (optional, default to 0) + /// (optional, default to 25) + /// (optional) + /// Index associated with the operation. + /// Cancellation Token to cancel the request. + /// Task of ApiResponse (TopicMetaPaginatedResponse) + System.Threading.Tasks.Task> GetTopicsWithHttpInfoAsync(int? page = default(int?), int? pageSize = default(int?), string? search = default(string?), int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)); + /// + /// + /// + /// + /// + /// + /// Thrown when fails to make API call + /// Index associated with the operation. + /// Cancellation Token to cancel the request. + /// Task of int + System.Threading.Tasks.Task GetTotalAsync(int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)); + + /// + /// + /// + /// + /// + /// + /// Thrown when fails to make API call + /// Index associated with the operation. + /// Cancellation Token to cancel the request. + /// Task of ApiResponse (int) + System.Threading.Tasks.Task> GetTotalWithHttpInfoAsync(int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)); + #endregion Asynchronous Operations + } + + /// + /// Represents a collection of functions to interact with the API endpoints + /// + public interface ITopicsApi : ITopicsApiSync, ITopicsApiAsync + { + + } + + /// + /// Represents a collection of functions to interact with the API endpoints + /// + public partial class TopicsApi : ITopicsApi + { + private Topica.Client.Client.ExceptionFactory _exceptionFactory = (name, response) => null; + + /// + /// Initializes a new instance of the class. + /// + /// + public TopicsApi() : this((string)null) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// + public TopicsApi(string basePath) + { + this.Configuration = Topica.Client.Client.Configuration.MergeConfigurations( + Topica.Client.Client.GlobalConfiguration.Instance, + new Topica.Client.Client.Configuration { BasePath = basePath } + ); + this.Client = new Topica.Client.Client.ApiClient(this.Configuration.BasePath); + this.AsynchronousClient = new Topica.Client.Client.ApiClient(this.Configuration.BasePath); + this.ExceptionFactory = Topica.Client.Client.Configuration.DefaultExceptionFactory; + } + + /// + /// Initializes a new instance of the class + /// using Configuration object + /// + /// An instance of Configuration + /// + public TopicsApi(Topica.Client.Client.Configuration configuration) + { + if (configuration == null) throw new ArgumentNullException("configuration"); + + this.Configuration = Topica.Client.Client.Configuration.MergeConfigurations( + Topica.Client.Client.GlobalConfiguration.Instance, + configuration + ); + this.Client = new Topica.Client.Client.ApiClient(this.Configuration.BasePath); + this.AsynchronousClient = new Topica.Client.Client.ApiClient(this.Configuration.BasePath); + ExceptionFactory = Topica.Client.Client.Configuration.DefaultExceptionFactory; + } + + /// + /// Initializes a new instance of the class + /// using a Configuration object and client instance. + /// + /// The client interface for synchronous API access. + /// The client interface for asynchronous API access. + /// The configuration object. + public TopicsApi(Topica.Client.Client.ISynchronousClient client, Topica.Client.Client.IAsynchronousClient asyncClient, Topica.Client.Client.IReadableConfiguration configuration) + { + if (client == null) throw new ArgumentNullException("client"); + if (asyncClient == null) throw new ArgumentNullException("asyncClient"); + if (configuration == null) throw new ArgumentNullException("configuration"); + + this.Client = client; + this.AsynchronousClient = asyncClient; + this.Configuration = configuration; + this.ExceptionFactory = Topica.Client.Client.Configuration.DefaultExceptionFactory; + } + + /// + /// The client for accessing this underlying API asynchronously. + /// + public Topica.Client.Client.IAsynchronousClient AsynchronousClient { get; set; } + + /// + /// The client for accessing this underlying API synchronously. + /// + public Topica.Client.Client.ISynchronousClient Client { get; set; } + + /// + /// Gets the base path of the API client. + /// + /// The base path + public string GetBasePath() + { + return this.Configuration.BasePath; + } + + /// + /// Gets or sets the configuration object + /// + /// An instance of the Configuration + public Topica.Client.Client.IReadableConfiguration Configuration { get; set; } + + /// + /// Provides a factory method hook for the creation of exceptions. + /// + public Topica.Client.Client.ExceptionFactory ExceptionFactory + { + get + { + if (_exceptionFactory != null && _exceptionFactory.GetInvocationList().Length > 1) + { + throw new InvalidOperationException("Multicast delegate for ExceptionFactory is unsupported."); + } + return _exceptionFactory; + } + set { _exceptionFactory = value; } + } + + /// + /// + /// + /// Thrown when fails to make API call + /// (optional) + /// Index associated with the operation. + /// string + public string CreateTopic(string? topicId = default(string?), int operationIndex = 0) + { + Topica.Client.Client.ApiResponse localVarResponse = CreateTopicWithHttpInfo(topicId); + return localVarResponse.Data; + } + + /// + /// + /// + /// Thrown when fails to make API call + /// (optional) + /// Index associated with the operation. + /// ApiResponse of string + public Topica.Client.Client.ApiResponse CreateTopicWithHttpInfo(string? topicId = default(string?), int operationIndex = 0) + { + Topica.Client.Client.RequestOptions localVarRequestOptions = new Topica.Client.Client.RequestOptions(); + + string[] _contentTypes = new string[] { + }; + + // to determine the Accept header + string[] _accepts = new string[] { + "text/plain", + "application/json", + "text/json" + }; + + var localVarContentType = Topica.Client.Client.ClientUtils.SelectHeaderContentType(_contentTypes); + if (localVarContentType != null) + { + localVarRequestOptions.HeaderParameters.Add("Content-Type", localVarContentType); + } + + var localVarAccept = Topica.Client.Client.ClientUtils.SelectHeaderAccept(_accepts); + if (localVarAccept != null) + { + localVarRequestOptions.HeaderParameters.Add("Accept", localVarAccept); + } + + if (topicId != null) + { + localVarRequestOptions.QueryParameters.Add(Topica.Client.Client.ClientUtils.ParameterToMultiMap("", "topicId", topicId)); + } + + localVarRequestOptions.Operation = "TopicsApi.CreateTopic"; + localVarRequestOptions.OperationIndex = operationIndex; + + // authentication (Basic) required + // http basic authentication required + if (!string.IsNullOrEmpty(this.Configuration.Username) || !string.IsNullOrEmpty(this.Configuration.Password) && !localVarRequestOptions.HeaderParameters.ContainsKey("Authorization")) + { + localVarRequestOptions.HeaderParameters.Add("Authorization", "Basic " + Topica.Client.Client.ClientUtils.Base64Encode(this.Configuration.Username + ":" + this.Configuration.Password)); + } + // authentication (ApiKey) required + if (!string.IsNullOrEmpty(this.Configuration.GetApiKeyWithPrefix("X-API-KEY"))) + { + localVarRequestOptions.HeaderParameters.Add("X-API-KEY", this.Configuration.GetApiKeyWithPrefix("X-API-KEY")); + } + // authentication (Bearer) required + if (!string.IsNullOrEmpty(this.Configuration.GetApiKeyWithPrefix("Authorization"))) + { + localVarRequestOptions.HeaderParameters.Add("Authorization", this.Configuration.GetApiKeyWithPrefix("Authorization")); + } + + // make the HTTP request + var localVarResponse = this.Client.Put("/api/Topics", localVarRequestOptions, this.Configuration); + if (this.ExceptionFactory != null) + { + Exception _exception = this.ExceptionFactory("CreateTopic", localVarResponse); + if (_exception != null) + { + throw _exception; + } + } + + return localVarResponse; + } + + /// + /// + /// + /// Thrown when fails to make API call + /// (optional) + /// Index associated with the operation. + /// Cancellation Token to cancel the request. + /// Task of string + public async System.Threading.Tasks.Task CreateTopicAsync(string? topicId = default(string?), int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) + { + Topica.Client.Client.ApiResponse localVarResponse = await CreateTopicWithHttpInfoAsync(topicId, operationIndex, cancellationToken).ConfigureAwait(false); + return localVarResponse.Data; + } + + /// + /// + /// + /// Thrown when fails to make API call + /// (optional) + /// Index associated with the operation. + /// Cancellation Token to cancel the request. + /// Task of ApiResponse (string) + public async System.Threading.Tasks.Task> CreateTopicWithHttpInfoAsync(string? topicId = default(string?), int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) + { + + Topica.Client.Client.RequestOptions localVarRequestOptions = new Topica.Client.Client.RequestOptions(); + + string[] _contentTypes = new string[] { + }; + + // to determine the Accept header + string[] _accepts = new string[] { + "text/plain", + "application/json", + "text/json" + }; + + var localVarContentType = Topica.Client.Client.ClientUtils.SelectHeaderContentType(_contentTypes); + if (localVarContentType != null) + { + localVarRequestOptions.HeaderParameters.Add("Content-Type", localVarContentType); + } + + var localVarAccept = Topica.Client.Client.ClientUtils.SelectHeaderAccept(_accepts); + if (localVarAccept != null) + { + localVarRequestOptions.HeaderParameters.Add("Accept", localVarAccept); + } + + if (topicId != null) + { + localVarRequestOptions.QueryParameters.Add(Topica.Client.Client.ClientUtils.ParameterToMultiMap("", "topicId", topicId)); + } + + localVarRequestOptions.Operation = "TopicsApi.CreateTopic"; + localVarRequestOptions.OperationIndex = operationIndex; + + // authentication (Basic) required + // http basic authentication required + if (!string.IsNullOrEmpty(this.Configuration.Username) || !string.IsNullOrEmpty(this.Configuration.Password) && !localVarRequestOptions.HeaderParameters.ContainsKey("Authorization")) + { + localVarRequestOptions.HeaderParameters.Add("Authorization", "Basic " + Topica.Client.Client.ClientUtils.Base64Encode(this.Configuration.Username + ":" + this.Configuration.Password)); + } + // authentication (ApiKey) required + if (!string.IsNullOrEmpty(this.Configuration.GetApiKeyWithPrefix("X-API-KEY"))) + { + localVarRequestOptions.HeaderParameters.Add("X-API-KEY", this.Configuration.GetApiKeyWithPrefix("X-API-KEY")); + } + // authentication (Bearer) required + if (!string.IsNullOrEmpty(this.Configuration.GetApiKeyWithPrefix("Authorization"))) + { + localVarRequestOptions.HeaderParameters.Add("Authorization", this.Configuration.GetApiKeyWithPrefix("Authorization")); + } + + // make the HTTP request + var localVarResponse = await this.AsynchronousClient.PutAsync("/api/Topics", localVarRequestOptions, this.Configuration, cancellationToken).ConfigureAwait(false); + + if (this.ExceptionFactory != null) + { + Exception _exception = this.ExceptionFactory("CreateTopic", localVarResponse); + if (_exception != null) + { + throw _exception; + } + } + + return localVarResponse; + } + + /// + /// + /// + /// Thrown when fails to make API call + /// + /// + /// Index associated with the operation. + /// + public void DeleteMessage(string topicId, Guid messageId, int operationIndex = 0) + { + DeleteMessageWithHttpInfo(topicId, messageId); + } + + /// + /// + /// + /// Thrown when fails to make API call + /// + /// + /// Index associated with the operation. + /// ApiResponse of Object(void) + public Topica.Client.Client.ApiResponse DeleteMessageWithHttpInfo(string topicId, Guid messageId, int operationIndex = 0) + { + // verify the required parameter 'topicId' is set + if (topicId == null) + { + throw new Topica.Client.Client.ApiException(400, "Missing required parameter 'topicId' when calling TopicsApi->DeleteMessage"); + } + + Topica.Client.Client.RequestOptions localVarRequestOptions = new Topica.Client.Client.RequestOptions(); + + string[] _contentTypes = new string[] { + }; + + // to determine the Accept header + string[] _accepts = new string[] { + }; + + var localVarContentType = Topica.Client.Client.ClientUtils.SelectHeaderContentType(_contentTypes); + if (localVarContentType != null) + { + localVarRequestOptions.HeaderParameters.Add("Content-Type", localVarContentType); + } + + var localVarAccept = Topica.Client.Client.ClientUtils.SelectHeaderAccept(_accepts); + if (localVarAccept != null) + { + localVarRequestOptions.HeaderParameters.Add("Accept", localVarAccept); + } + + localVarRequestOptions.PathParameters.Add("topicId", Topica.Client.Client.ClientUtils.ParameterToString(topicId)); // path parameter + localVarRequestOptions.PathParameters.Add("messageId", Topica.Client.Client.ClientUtils.ParameterToString(messageId)); // path parameter + + localVarRequestOptions.Operation = "TopicsApi.DeleteMessage"; + localVarRequestOptions.OperationIndex = operationIndex; + + // authentication (Basic) required + // http basic authentication required + if (!string.IsNullOrEmpty(this.Configuration.Username) || !string.IsNullOrEmpty(this.Configuration.Password) && !localVarRequestOptions.HeaderParameters.ContainsKey("Authorization")) + { + localVarRequestOptions.HeaderParameters.Add("Authorization", "Basic " + Topica.Client.Client.ClientUtils.Base64Encode(this.Configuration.Username + ":" + this.Configuration.Password)); + } + // authentication (ApiKey) required + if (!string.IsNullOrEmpty(this.Configuration.GetApiKeyWithPrefix("X-API-KEY"))) + { + localVarRequestOptions.HeaderParameters.Add("X-API-KEY", this.Configuration.GetApiKeyWithPrefix("X-API-KEY")); + } + // authentication (Bearer) required + if (!string.IsNullOrEmpty(this.Configuration.GetApiKeyWithPrefix("Authorization"))) + { + localVarRequestOptions.HeaderParameters.Add("Authorization", this.Configuration.GetApiKeyWithPrefix("Authorization")); + } + + // make the HTTP request + var localVarResponse = this.Client.Delete("/api/Topics/{topicId}/messages/{messageId}", localVarRequestOptions, this.Configuration); + if (this.ExceptionFactory != null) + { + Exception _exception = this.ExceptionFactory("DeleteMessage", localVarResponse); + if (_exception != null) + { + throw _exception; + } + } + + return localVarResponse; + } + + /// + /// + /// + /// Thrown when fails to make API call + /// + /// + /// Index associated with the operation. + /// Cancellation Token to cancel the request. + /// Task of void + public async System.Threading.Tasks.Task DeleteMessageAsync(string topicId, Guid messageId, int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) + { + await DeleteMessageWithHttpInfoAsync(topicId, messageId, operationIndex, cancellationToken).ConfigureAwait(false); + } + + /// + /// + /// + /// Thrown when fails to make API call + /// + /// + /// Index associated with the operation. + /// Cancellation Token to cancel the request. + /// Task of ApiResponse + public async System.Threading.Tasks.Task> DeleteMessageWithHttpInfoAsync(string topicId, Guid messageId, int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) + { + // verify the required parameter 'topicId' is set + if (topicId == null) + { + throw new Topica.Client.Client.ApiException(400, "Missing required parameter 'topicId' when calling TopicsApi->DeleteMessage"); + } + + + Topica.Client.Client.RequestOptions localVarRequestOptions = new Topica.Client.Client.RequestOptions(); + + string[] _contentTypes = new string[] { + }; + + // to determine the Accept header + string[] _accepts = new string[] { + }; + + var localVarContentType = Topica.Client.Client.ClientUtils.SelectHeaderContentType(_contentTypes); + if (localVarContentType != null) + { + localVarRequestOptions.HeaderParameters.Add("Content-Type", localVarContentType); + } + + var localVarAccept = Topica.Client.Client.ClientUtils.SelectHeaderAccept(_accepts); + if (localVarAccept != null) + { + localVarRequestOptions.HeaderParameters.Add("Accept", localVarAccept); + } + + localVarRequestOptions.PathParameters.Add("topicId", Topica.Client.Client.ClientUtils.ParameterToString(topicId)); // path parameter + localVarRequestOptions.PathParameters.Add("messageId", Topica.Client.Client.ClientUtils.ParameterToString(messageId)); // path parameter + + localVarRequestOptions.Operation = "TopicsApi.DeleteMessage"; + localVarRequestOptions.OperationIndex = operationIndex; + + // authentication (Basic) required + // http basic authentication required + if (!string.IsNullOrEmpty(this.Configuration.Username) || !string.IsNullOrEmpty(this.Configuration.Password) && !localVarRequestOptions.HeaderParameters.ContainsKey("Authorization")) + { + localVarRequestOptions.HeaderParameters.Add("Authorization", "Basic " + Topica.Client.Client.ClientUtils.Base64Encode(this.Configuration.Username + ":" + this.Configuration.Password)); + } + // authentication (ApiKey) required + if (!string.IsNullOrEmpty(this.Configuration.GetApiKeyWithPrefix("X-API-KEY"))) + { + localVarRequestOptions.HeaderParameters.Add("X-API-KEY", this.Configuration.GetApiKeyWithPrefix("X-API-KEY")); + } + // authentication (Bearer) required + if (!string.IsNullOrEmpty(this.Configuration.GetApiKeyWithPrefix("Authorization"))) + { + localVarRequestOptions.HeaderParameters.Add("Authorization", this.Configuration.GetApiKeyWithPrefix("Authorization")); + } + + // make the HTTP request + var localVarResponse = await this.AsynchronousClient.DeleteAsync("/api/Topics/{topicId}/messages/{messageId}", localVarRequestOptions, this.Configuration, cancellationToken).ConfigureAwait(false); + + if (this.ExceptionFactory != null) + { + Exception _exception = this.ExceptionFactory("DeleteMessage", localVarResponse); + if (_exception != null) + { + throw _exception; + } + } + + return localVarResponse; + } + + /// + /// + /// + /// Thrown when fails to make API call + /// + /// Index associated with the operation. + /// + public void DeleteTopic(string topicId, int operationIndex = 0) + { + DeleteTopicWithHttpInfo(topicId); + } + + /// + /// + /// + /// Thrown when fails to make API call + /// + /// Index associated with the operation. + /// ApiResponse of Object(void) + public Topica.Client.Client.ApiResponse DeleteTopicWithHttpInfo(string topicId, int operationIndex = 0) + { + // verify the required parameter 'topicId' is set + if (topicId == null) + { + throw new Topica.Client.Client.ApiException(400, "Missing required parameter 'topicId' when calling TopicsApi->DeleteTopic"); + } + + Topica.Client.Client.RequestOptions localVarRequestOptions = new Topica.Client.Client.RequestOptions(); + + string[] _contentTypes = new string[] { + }; + + // to determine the Accept header + string[] _accepts = new string[] { + }; + + var localVarContentType = Topica.Client.Client.ClientUtils.SelectHeaderContentType(_contentTypes); + if (localVarContentType != null) + { + localVarRequestOptions.HeaderParameters.Add("Content-Type", localVarContentType); + } + + var localVarAccept = Topica.Client.Client.ClientUtils.SelectHeaderAccept(_accepts); + if (localVarAccept != null) + { + localVarRequestOptions.HeaderParameters.Add("Accept", localVarAccept); + } + + localVarRequestOptions.PathParameters.Add("topicId", Topica.Client.Client.ClientUtils.ParameterToString(topicId)); // path parameter + + localVarRequestOptions.Operation = "TopicsApi.DeleteTopic"; + localVarRequestOptions.OperationIndex = operationIndex; + + // authentication (Basic) required + // http basic authentication required + if (!string.IsNullOrEmpty(this.Configuration.Username) || !string.IsNullOrEmpty(this.Configuration.Password) && !localVarRequestOptions.HeaderParameters.ContainsKey("Authorization")) + { + localVarRequestOptions.HeaderParameters.Add("Authorization", "Basic " + Topica.Client.Client.ClientUtils.Base64Encode(this.Configuration.Username + ":" + this.Configuration.Password)); + } + // authentication (ApiKey) required + if (!string.IsNullOrEmpty(this.Configuration.GetApiKeyWithPrefix("X-API-KEY"))) + { + localVarRequestOptions.HeaderParameters.Add("X-API-KEY", this.Configuration.GetApiKeyWithPrefix("X-API-KEY")); + } + // authentication (Bearer) required + if (!string.IsNullOrEmpty(this.Configuration.GetApiKeyWithPrefix("Authorization"))) + { + localVarRequestOptions.HeaderParameters.Add("Authorization", this.Configuration.GetApiKeyWithPrefix("Authorization")); + } + + // make the HTTP request + var localVarResponse = this.Client.Delete("/api/Topics/{topicId}", localVarRequestOptions, this.Configuration); + if (this.ExceptionFactory != null) + { + Exception _exception = this.ExceptionFactory("DeleteTopic", localVarResponse); + if (_exception != null) + { + throw _exception; + } + } + + return localVarResponse; + } + + /// + /// + /// + /// Thrown when fails to make API call + /// + /// Index associated with the operation. + /// Cancellation Token to cancel the request. + /// Task of void + public async System.Threading.Tasks.Task DeleteTopicAsync(string topicId, int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) + { + await DeleteTopicWithHttpInfoAsync(topicId, operationIndex, cancellationToken).ConfigureAwait(false); + } + + /// + /// + /// + /// Thrown when fails to make API call + /// + /// Index associated with the operation. + /// Cancellation Token to cancel the request. + /// Task of ApiResponse + public async System.Threading.Tasks.Task> DeleteTopicWithHttpInfoAsync(string topicId, int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) + { + // verify the required parameter 'topicId' is set + if (topicId == null) + { + throw new Topica.Client.Client.ApiException(400, "Missing required parameter 'topicId' when calling TopicsApi->DeleteTopic"); + } + + + Topica.Client.Client.RequestOptions localVarRequestOptions = new Topica.Client.Client.RequestOptions(); + + string[] _contentTypes = new string[] { + }; + + // to determine the Accept header + string[] _accepts = new string[] { + }; + + var localVarContentType = Topica.Client.Client.ClientUtils.SelectHeaderContentType(_contentTypes); + if (localVarContentType != null) + { + localVarRequestOptions.HeaderParameters.Add("Content-Type", localVarContentType); + } + + var localVarAccept = Topica.Client.Client.ClientUtils.SelectHeaderAccept(_accepts); + if (localVarAccept != null) + { + localVarRequestOptions.HeaderParameters.Add("Accept", localVarAccept); + } + + localVarRequestOptions.PathParameters.Add("topicId", Topica.Client.Client.ClientUtils.ParameterToString(topicId)); // path parameter + + localVarRequestOptions.Operation = "TopicsApi.DeleteTopic"; + localVarRequestOptions.OperationIndex = operationIndex; + + // authentication (Basic) required + // http basic authentication required + if (!string.IsNullOrEmpty(this.Configuration.Username) || !string.IsNullOrEmpty(this.Configuration.Password) && !localVarRequestOptions.HeaderParameters.ContainsKey("Authorization")) + { + localVarRequestOptions.HeaderParameters.Add("Authorization", "Basic " + Topica.Client.Client.ClientUtils.Base64Encode(this.Configuration.Username + ":" + this.Configuration.Password)); + } + // authentication (ApiKey) required + if (!string.IsNullOrEmpty(this.Configuration.GetApiKeyWithPrefix("X-API-KEY"))) + { + localVarRequestOptions.HeaderParameters.Add("X-API-KEY", this.Configuration.GetApiKeyWithPrefix("X-API-KEY")); + } + // authentication (Bearer) required + if (!string.IsNullOrEmpty(this.Configuration.GetApiKeyWithPrefix("Authorization"))) + { + localVarRequestOptions.HeaderParameters.Add("Authorization", this.Configuration.GetApiKeyWithPrefix("Authorization")); + } + + // make the HTTP request + var localVarResponse = await this.AsynchronousClient.DeleteAsync("/api/Topics/{topicId}", localVarRequestOptions, this.Configuration, cancellationToken).ConfigureAwait(false); + + if (this.ExceptionFactory != null) + { + Exception _exception = this.ExceptionFactory("DeleteTopic", localVarResponse); + if (_exception != null) + { + throw _exception; + } + } + + return localVarResponse; + } + + /// + /// + /// + /// Thrown when fails to make API call + /// + /// Index associated with the operation. + /// Topic + public Topic GetTopic(string topicId, int operationIndex = 0) + { + Topica.Client.Client.ApiResponse localVarResponse = GetTopicWithHttpInfo(topicId); + return localVarResponse.Data; + } + + /// + /// + /// + /// Thrown when fails to make API call + /// + /// Index associated with the operation. + /// ApiResponse of Topic + public Topica.Client.Client.ApiResponse GetTopicWithHttpInfo(string topicId, int operationIndex = 0) + { + // verify the required parameter 'topicId' is set + if (topicId == null) + { + throw new Topica.Client.Client.ApiException(400, "Missing required parameter 'topicId' when calling TopicsApi->GetTopic"); + } + + Topica.Client.Client.RequestOptions localVarRequestOptions = new Topica.Client.Client.RequestOptions(); + + string[] _contentTypes = new string[] { + }; + + // to determine the Accept header + string[] _accepts = new string[] { + "text/plain", + "application/json", + "text/json" + }; + + var localVarContentType = Topica.Client.Client.ClientUtils.SelectHeaderContentType(_contentTypes); + if (localVarContentType != null) + { + localVarRequestOptions.HeaderParameters.Add("Content-Type", localVarContentType); + } + + var localVarAccept = Topica.Client.Client.ClientUtils.SelectHeaderAccept(_accepts); + if (localVarAccept != null) + { + localVarRequestOptions.HeaderParameters.Add("Accept", localVarAccept); + } + + localVarRequestOptions.PathParameters.Add("topicId", Topica.Client.Client.ClientUtils.ParameterToString(topicId)); // path parameter + + localVarRequestOptions.Operation = "TopicsApi.GetTopic"; + localVarRequestOptions.OperationIndex = operationIndex; + + // authentication (Basic) required + // http basic authentication required + if (!string.IsNullOrEmpty(this.Configuration.Username) || !string.IsNullOrEmpty(this.Configuration.Password) && !localVarRequestOptions.HeaderParameters.ContainsKey("Authorization")) + { + localVarRequestOptions.HeaderParameters.Add("Authorization", "Basic " + Topica.Client.Client.ClientUtils.Base64Encode(this.Configuration.Username + ":" + this.Configuration.Password)); + } + // authentication (ApiKey) required + if (!string.IsNullOrEmpty(this.Configuration.GetApiKeyWithPrefix("X-API-KEY"))) + { + localVarRequestOptions.HeaderParameters.Add("X-API-KEY", this.Configuration.GetApiKeyWithPrefix("X-API-KEY")); + } + // authentication (Bearer) required + if (!string.IsNullOrEmpty(this.Configuration.GetApiKeyWithPrefix("Authorization"))) + { + localVarRequestOptions.HeaderParameters.Add("Authorization", this.Configuration.GetApiKeyWithPrefix("Authorization")); + } + + // make the HTTP request + var localVarResponse = this.Client.Get("/api/Topics/{topicId}", localVarRequestOptions, this.Configuration); + if (this.ExceptionFactory != null) + { + Exception _exception = this.ExceptionFactory("GetTopic", localVarResponse); + if (_exception != null) + { + throw _exception; + } + } + + return localVarResponse; + } + + /// + /// + /// + /// Thrown when fails to make API call + /// + /// Index associated with the operation. + /// Cancellation Token to cancel the request. + /// Task of Topic + public async System.Threading.Tasks.Task GetTopicAsync(string topicId, int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) + { + Topica.Client.Client.ApiResponse localVarResponse = await GetTopicWithHttpInfoAsync(topicId, operationIndex, cancellationToken).ConfigureAwait(false); + return localVarResponse.Data; + } + + /// + /// + /// + /// Thrown when fails to make API call + /// + /// Index associated with the operation. + /// Cancellation Token to cancel the request. + /// Task of ApiResponse (Topic) + public async System.Threading.Tasks.Task> GetTopicWithHttpInfoAsync(string topicId, int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) + { + // verify the required parameter 'topicId' is set + if (topicId == null) + { + throw new Topica.Client.Client.ApiException(400, "Missing required parameter 'topicId' when calling TopicsApi->GetTopic"); + } + + + Topica.Client.Client.RequestOptions localVarRequestOptions = new Topica.Client.Client.RequestOptions(); + + string[] _contentTypes = new string[] { + }; + + // to determine the Accept header + string[] _accepts = new string[] { + "text/plain", + "application/json", + "text/json" + }; + + var localVarContentType = Topica.Client.Client.ClientUtils.SelectHeaderContentType(_contentTypes); + if (localVarContentType != null) + { + localVarRequestOptions.HeaderParameters.Add("Content-Type", localVarContentType); + } + + var localVarAccept = Topica.Client.Client.ClientUtils.SelectHeaderAccept(_accepts); + if (localVarAccept != null) + { + localVarRequestOptions.HeaderParameters.Add("Accept", localVarAccept); + } + + localVarRequestOptions.PathParameters.Add("topicId", Topica.Client.Client.ClientUtils.ParameterToString(topicId)); // path parameter + + localVarRequestOptions.Operation = "TopicsApi.GetTopic"; + localVarRequestOptions.OperationIndex = operationIndex; + + // authentication (Basic) required + // http basic authentication required + if (!string.IsNullOrEmpty(this.Configuration.Username) || !string.IsNullOrEmpty(this.Configuration.Password) && !localVarRequestOptions.HeaderParameters.ContainsKey("Authorization")) + { + localVarRequestOptions.HeaderParameters.Add("Authorization", "Basic " + Topica.Client.Client.ClientUtils.Base64Encode(this.Configuration.Username + ":" + this.Configuration.Password)); + } + // authentication (ApiKey) required + if (!string.IsNullOrEmpty(this.Configuration.GetApiKeyWithPrefix("X-API-KEY"))) + { + localVarRequestOptions.HeaderParameters.Add("X-API-KEY", this.Configuration.GetApiKeyWithPrefix("X-API-KEY")); + } + // authentication (Bearer) required + if (!string.IsNullOrEmpty(this.Configuration.GetApiKeyWithPrefix("Authorization"))) + { + localVarRequestOptions.HeaderParameters.Add("Authorization", this.Configuration.GetApiKeyWithPrefix("Authorization")); + } + + // make the HTTP request + var localVarResponse = await this.AsynchronousClient.GetAsync("/api/Topics/{topicId}", localVarRequestOptions, this.Configuration, cancellationToken).ConfigureAwait(false); + + if (this.ExceptionFactory != null) + { + Exception _exception = this.ExceptionFactory("GetTopic", localVarResponse); + if (_exception != null) + { + throw _exception; + } + } + + return localVarResponse; + } + + /// + /// + /// + /// Thrown when fails to make API call + /// (optional, default to 0) + /// (optional, default to 25) + /// (optional) + /// Index associated with the operation. + /// TopicMetaPaginatedResponse + public TopicMetaPaginatedResponse GetTopics(int? page = default(int?), int? pageSize = default(int?), string? search = default(string?), int operationIndex = 0) + { + Topica.Client.Client.ApiResponse localVarResponse = GetTopicsWithHttpInfo(page, pageSize, search); + return localVarResponse.Data; + } + + /// + /// + /// + /// Thrown when fails to make API call + /// (optional, default to 0) + /// (optional, default to 25) + /// (optional) + /// Index associated with the operation. + /// ApiResponse of TopicMetaPaginatedResponse + public Topica.Client.Client.ApiResponse GetTopicsWithHttpInfo(int? page = default(int?), int? pageSize = default(int?), string? search = default(string?), int operationIndex = 0) + { + Topica.Client.Client.RequestOptions localVarRequestOptions = new Topica.Client.Client.RequestOptions(); + + string[] _contentTypes = new string[] { + }; + + // to determine the Accept header + string[] _accepts = new string[] { + "text/plain", + "application/json", + "text/json" + }; + + var localVarContentType = Topica.Client.Client.ClientUtils.SelectHeaderContentType(_contentTypes); + if (localVarContentType != null) + { + localVarRequestOptions.HeaderParameters.Add("Content-Type", localVarContentType); + } + + var localVarAccept = Topica.Client.Client.ClientUtils.SelectHeaderAccept(_accepts); + if (localVarAccept != null) + { + localVarRequestOptions.HeaderParameters.Add("Accept", localVarAccept); + } + + if (page != null) + { + localVarRequestOptions.QueryParameters.Add(Topica.Client.Client.ClientUtils.ParameterToMultiMap("", "page", page)); + } + if (pageSize != null) + { + localVarRequestOptions.QueryParameters.Add(Topica.Client.Client.ClientUtils.ParameterToMultiMap("", "pageSize", pageSize)); + } + if (search != null) + { + localVarRequestOptions.QueryParameters.Add(Topica.Client.Client.ClientUtils.ParameterToMultiMap("", "search", search)); + } + + localVarRequestOptions.Operation = "TopicsApi.GetTopics"; + localVarRequestOptions.OperationIndex = operationIndex; + + // authentication (Basic) required + // http basic authentication required + if (!string.IsNullOrEmpty(this.Configuration.Username) || !string.IsNullOrEmpty(this.Configuration.Password) && !localVarRequestOptions.HeaderParameters.ContainsKey("Authorization")) + { + localVarRequestOptions.HeaderParameters.Add("Authorization", "Basic " + Topica.Client.Client.ClientUtils.Base64Encode(this.Configuration.Username + ":" + this.Configuration.Password)); + } + // authentication (ApiKey) required + if (!string.IsNullOrEmpty(this.Configuration.GetApiKeyWithPrefix("X-API-KEY"))) + { + localVarRequestOptions.HeaderParameters.Add("X-API-KEY", this.Configuration.GetApiKeyWithPrefix("X-API-KEY")); + } + // authentication (Bearer) required + if (!string.IsNullOrEmpty(this.Configuration.GetApiKeyWithPrefix("Authorization"))) + { + localVarRequestOptions.HeaderParameters.Add("Authorization", this.Configuration.GetApiKeyWithPrefix("Authorization")); + } + + // make the HTTP request + var localVarResponse = this.Client.Get("/api/Topics", localVarRequestOptions, this.Configuration); + if (this.ExceptionFactory != null) + { + Exception _exception = this.ExceptionFactory("GetTopics", localVarResponse); + if (_exception != null) + { + throw _exception; + } + } + + return localVarResponse; + } + + /// + /// + /// + /// Thrown when fails to make API call + /// (optional, default to 0) + /// (optional, default to 25) + /// (optional) + /// Index associated with the operation. + /// Cancellation Token to cancel the request. + /// Task of TopicMetaPaginatedResponse + public async System.Threading.Tasks.Task GetTopicsAsync(int? page = default(int?), int? pageSize = default(int?), string? search = default(string?), int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) + { + Topica.Client.Client.ApiResponse localVarResponse = await GetTopicsWithHttpInfoAsync(page, pageSize, search, operationIndex, cancellationToken).ConfigureAwait(false); + return localVarResponse.Data; + } + + /// + /// + /// + /// Thrown when fails to make API call + /// (optional, default to 0) + /// (optional, default to 25) + /// (optional) + /// Index associated with the operation. + /// Cancellation Token to cancel the request. + /// Task of ApiResponse (TopicMetaPaginatedResponse) + public async System.Threading.Tasks.Task> GetTopicsWithHttpInfoAsync(int? page = default(int?), int? pageSize = default(int?), string? search = default(string?), int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) + { + + Topica.Client.Client.RequestOptions localVarRequestOptions = new Topica.Client.Client.RequestOptions(); + + string[] _contentTypes = new string[] { + }; + + // to determine the Accept header + string[] _accepts = new string[] { + "text/plain", + "application/json", + "text/json" + }; + + var localVarContentType = Topica.Client.Client.ClientUtils.SelectHeaderContentType(_contentTypes); + if (localVarContentType != null) + { + localVarRequestOptions.HeaderParameters.Add("Content-Type", localVarContentType); + } + + var localVarAccept = Topica.Client.Client.ClientUtils.SelectHeaderAccept(_accepts); + if (localVarAccept != null) + { + localVarRequestOptions.HeaderParameters.Add("Accept", localVarAccept); + } + + if (page != null) + { + localVarRequestOptions.QueryParameters.Add(Topica.Client.Client.ClientUtils.ParameterToMultiMap("", "page", page)); + } + if (pageSize != null) + { + localVarRequestOptions.QueryParameters.Add(Topica.Client.Client.ClientUtils.ParameterToMultiMap("", "pageSize", pageSize)); + } + if (search != null) + { + localVarRequestOptions.QueryParameters.Add(Topica.Client.Client.ClientUtils.ParameterToMultiMap("", "search", search)); + } + + localVarRequestOptions.Operation = "TopicsApi.GetTopics"; + localVarRequestOptions.OperationIndex = operationIndex; + + // authentication (Basic) required + // http basic authentication required + if (!string.IsNullOrEmpty(this.Configuration.Username) || !string.IsNullOrEmpty(this.Configuration.Password) && !localVarRequestOptions.HeaderParameters.ContainsKey("Authorization")) + { + localVarRequestOptions.HeaderParameters.Add("Authorization", "Basic " + Topica.Client.Client.ClientUtils.Base64Encode(this.Configuration.Username + ":" + this.Configuration.Password)); + } + // authentication (ApiKey) required + if (!string.IsNullOrEmpty(this.Configuration.GetApiKeyWithPrefix("X-API-KEY"))) + { + localVarRequestOptions.HeaderParameters.Add("X-API-KEY", this.Configuration.GetApiKeyWithPrefix("X-API-KEY")); + } + // authentication (Bearer) required + if (!string.IsNullOrEmpty(this.Configuration.GetApiKeyWithPrefix("Authorization"))) + { + localVarRequestOptions.HeaderParameters.Add("Authorization", this.Configuration.GetApiKeyWithPrefix("Authorization")); + } + + // make the HTTP request + var localVarResponse = await this.AsynchronousClient.GetAsync("/api/Topics", localVarRequestOptions, this.Configuration, cancellationToken).ConfigureAwait(false); + + if (this.ExceptionFactory != null) + { + Exception _exception = this.ExceptionFactory("GetTopics", localVarResponse); + if (_exception != null) + { + throw _exception; + } + } + + return localVarResponse; + } + + /// + /// + /// + /// Thrown when fails to make API call + /// Index associated with the operation. + /// int + public int GetTotal(int operationIndex = 0) + { + Topica.Client.Client.ApiResponse localVarResponse = GetTotalWithHttpInfo(); + return localVarResponse.Data; + } + + /// + /// + /// + /// Thrown when fails to make API call + /// Index associated with the operation. + /// ApiResponse of int + public Topica.Client.Client.ApiResponse GetTotalWithHttpInfo(int operationIndex = 0) + { + Topica.Client.Client.RequestOptions localVarRequestOptions = new Topica.Client.Client.RequestOptions(); + + string[] _contentTypes = new string[] { + }; + + // to determine the Accept header + string[] _accepts = new string[] { + "text/plain", + "application/json", + "text/json" + }; + + var localVarContentType = Topica.Client.Client.ClientUtils.SelectHeaderContentType(_contentTypes); + if (localVarContentType != null) + { + localVarRequestOptions.HeaderParameters.Add("Content-Type", localVarContentType); + } + + var localVarAccept = Topica.Client.Client.ClientUtils.SelectHeaderAccept(_accepts); + if (localVarAccept != null) + { + localVarRequestOptions.HeaderParameters.Add("Accept", localVarAccept); + } + + + localVarRequestOptions.Operation = "TopicsApi.GetTotal"; + localVarRequestOptions.OperationIndex = operationIndex; + + // authentication (Basic) required + // http basic authentication required + if (!string.IsNullOrEmpty(this.Configuration.Username) || !string.IsNullOrEmpty(this.Configuration.Password) && !localVarRequestOptions.HeaderParameters.ContainsKey("Authorization")) + { + localVarRequestOptions.HeaderParameters.Add("Authorization", "Basic " + Topica.Client.Client.ClientUtils.Base64Encode(this.Configuration.Username + ":" + this.Configuration.Password)); + } + // authentication (ApiKey) required + if (!string.IsNullOrEmpty(this.Configuration.GetApiKeyWithPrefix("X-API-KEY"))) + { + localVarRequestOptions.HeaderParameters.Add("X-API-KEY", this.Configuration.GetApiKeyWithPrefix("X-API-KEY")); + } + // authentication (Bearer) required + if (!string.IsNullOrEmpty(this.Configuration.GetApiKeyWithPrefix("Authorization"))) + { + localVarRequestOptions.HeaderParameters.Add("Authorization", this.Configuration.GetApiKeyWithPrefix("Authorization")); + } + + // make the HTTP request + var localVarResponse = this.Client.Get("/api/Topics/Total", localVarRequestOptions, this.Configuration); + if (this.ExceptionFactory != null) + { + Exception _exception = this.ExceptionFactory("GetTotal", localVarResponse); + if (_exception != null) + { + throw _exception; + } + } + + return localVarResponse; + } + + /// + /// + /// + /// Thrown when fails to make API call + /// Index associated with the operation. + /// Cancellation Token to cancel the request. + /// Task of int + public async System.Threading.Tasks.Task GetTotalAsync(int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) + { + Topica.Client.Client.ApiResponse localVarResponse = await GetTotalWithHttpInfoAsync(operationIndex, cancellationToken).ConfigureAwait(false); + return localVarResponse.Data; + } + + /// + /// + /// + /// Thrown when fails to make API call + /// Index associated with the operation. + /// Cancellation Token to cancel the request. + /// Task of ApiResponse (int) + public async System.Threading.Tasks.Task> GetTotalWithHttpInfoAsync(int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) + { + + Topica.Client.Client.RequestOptions localVarRequestOptions = new Topica.Client.Client.RequestOptions(); + + string[] _contentTypes = new string[] { + }; + + // to determine the Accept header + string[] _accepts = new string[] { + "text/plain", + "application/json", + "text/json" + }; + + var localVarContentType = Topica.Client.Client.ClientUtils.SelectHeaderContentType(_contentTypes); + if (localVarContentType != null) + { + localVarRequestOptions.HeaderParameters.Add("Content-Type", localVarContentType); + } + + var localVarAccept = Topica.Client.Client.ClientUtils.SelectHeaderAccept(_accepts); + if (localVarAccept != null) + { + localVarRequestOptions.HeaderParameters.Add("Accept", localVarAccept); + } + + + localVarRequestOptions.Operation = "TopicsApi.GetTotal"; + localVarRequestOptions.OperationIndex = operationIndex; + + // authentication (Basic) required + // http basic authentication required + if (!string.IsNullOrEmpty(this.Configuration.Username) || !string.IsNullOrEmpty(this.Configuration.Password) && !localVarRequestOptions.HeaderParameters.ContainsKey("Authorization")) + { + localVarRequestOptions.HeaderParameters.Add("Authorization", "Basic " + Topica.Client.Client.ClientUtils.Base64Encode(this.Configuration.Username + ":" + this.Configuration.Password)); + } + // authentication (ApiKey) required + if (!string.IsNullOrEmpty(this.Configuration.GetApiKeyWithPrefix("X-API-KEY"))) + { + localVarRequestOptions.HeaderParameters.Add("X-API-KEY", this.Configuration.GetApiKeyWithPrefix("X-API-KEY")); + } + // authentication (Bearer) required + if (!string.IsNullOrEmpty(this.Configuration.GetApiKeyWithPrefix("Authorization"))) + { + localVarRequestOptions.HeaderParameters.Add("Authorization", this.Configuration.GetApiKeyWithPrefix("Authorization")); + } + + // make the HTTP request + var localVarResponse = await this.AsynchronousClient.GetAsync("/api/Topics/Total", localVarRequestOptions, this.Configuration, cancellationToken).ConfigureAwait(false); + + if (this.ExceptionFactory != null) + { + Exception _exception = this.ExceptionFactory("GetTotal", localVarResponse); + if (_exception != null) + { + throw _exception; + } + } + + return localVarResponse; + } + + } +} diff --git a/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Client/ApiClient.cs b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Client/ApiClient.cs new file mode 100644 index 0000000..740fc9a --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Client/ApiClient.cs @@ -0,0 +1,833 @@ +/* + * Topica.Server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + * + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Net; +using System.Reflection; +using System.Runtime.Serialization; +using System.Runtime.Serialization.Formatters; +using System.Text; +using System.Threading; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using System.Web; +using Newtonsoft.Json; +using Newtonsoft.Json.Serialization; +using RestSharp; +using RestSharp.Serializers; +using RestSharpMethod = RestSharp.Method; +using Polly; + +namespace Topica.Client.Client +{ + /// + /// Allows RestSharp to Serialize/Deserialize JSON using our custom logic, but only when ContentType is JSON. + /// + internal class CustomJsonCodec : IRestSerializer, ISerializer, IDeserializer + { + private readonly IReadableConfiguration _configuration; + private readonly JsonSerializerSettings _serializerSettings = new JsonSerializerSettings + { + // OpenAPI generated types generally hide default constructors. + ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor, + ContractResolver = new DefaultContractResolver + { + NamingStrategy = new CamelCaseNamingStrategy + { + OverrideSpecifiedNames = false + } + } + }; + + public CustomJsonCodec(IReadableConfiguration configuration) + { + _configuration = configuration; + } + + public CustomJsonCodec(JsonSerializerSettings serializerSettings, IReadableConfiguration configuration) + { + _serializerSettings = serializerSettings; + _configuration = configuration; + } + + /// + /// Serialize the object into a JSON string. + /// + /// Object to be serialized. + /// A JSON string. + public string Serialize(object obj) + { + if (obj != null && obj is Topica.Client.Model.AbstractOpenAPISchema) + { + // the object to be serialized is an oneOf/anyOf schema + return ((Topica.Client.Model.AbstractOpenAPISchema)obj).ToJson(); + } + else + { + return JsonConvert.SerializeObject(obj, _serializerSettings); + } + } + + public string Serialize(Parameter bodyParameter) => Serialize(bodyParameter.Value); + + public T Deserialize(RestResponse response) + { + var result = (T)Deserialize(response, typeof(T)); + return result; + } + + /// + /// Deserialize the JSON string into a proper object. + /// + /// The HTTP response. + /// Object type. + /// Object representation of the JSON string. + internal object Deserialize(RestResponse response, Type type) + { + if (type == typeof(byte[])) // return byte array + { + return response.RawBytes; + } + + // TODO: ? if (type.IsAssignableFrom(typeof(Stream))) + if (type == typeof(Stream)) + { + var bytes = response.RawBytes; + if (response.Headers != null) + { + var filePath = string.IsNullOrEmpty(_configuration.TempFolderPath) + ? Path.GetTempPath() + : _configuration.TempFolderPath; + var regex = new Regex(@"Content-Disposition=.*filename=['""]?([^'""\s]+)['""]?$"); + foreach (var header in response.Headers) + { + var match = regex.Match(header.ToString()); + if (match.Success) + { + string fileName = filePath + ClientUtils.SanitizeFilename(match.Groups[1].Value.Replace("\"", "").Replace("'", "")); + File.WriteAllBytes(fileName, bytes); + return new FileStream(fileName, FileMode.Open); + } + } + } + var stream = new MemoryStream(bytes); + return stream; + } + + if (type.Name.StartsWith("System.Nullable`1[[System.DateTime")) // return a datetime object + { + return DateTime.Parse(response.Content, null, System.Globalization.DateTimeStyles.RoundtripKind); + } + + if (type == typeof(string) || type.Name.StartsWith("System.Nullable")) // return primitive type + { + return Convert.ChangeType(response.Content, type); + } + + // at this point, it must be a model (json) + try + { + return JsonConvert.DeserializeObject(response.Content, type, _serializerSettings); + } + catch (Exception e) + { + throw new ApiException(500, e.Message); + } + } + + public ISerializer Serializer => this; + public IDeserializer Deserializer => this; + + public string[] AcceptedContentTypes => RestSharp.ContentType.JsonAccept; + + public SupportsContentType SupportsContentType => contentType => + contentType.Value.EndsWith("json", StringComparison.InvariantCultureIgnoreCase) || + contentType.Value.EndsWith("javascript", StringComparison.InvariantCultureIgnoreCase); + + public ContentType ContentType { get; set; } = RestSharp.ContentType.Json; + + public DataFormat DataFormat => DataFormat.Json; + } + /// + /// Provides a default implementation of an Api client (both synchronous and asynchronous implementations), + /// encapsulating general REST accessor use cases. + /// + public partial class ApiClient : ISynchronousClient, IAsynchronousClient + { + private readonly string _baseUrl; + + /// + /// Specifies the settings on a object. + /// These settings can be adjusted to accommodate custom serialization rules. + /// + public JsonSerializerSettings SerializerSettings { get; set; } = new JsonSerializerSettings + { + // OpenAPI generated types generally hide default constructors. + ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor, + ContractResolver = new DefaultContractResolver + { + NamingStrategy = new CamelCaseNamingStrategy + { + OverrideSpecifiedNames = false + } + } + }; + + /// + /// Allows for extending request processing for generated code. + /// + /// The RestSharp request object + partial void InterceptRequest(RestRequest request); + + /// + /// Allows for extending response processing for generated code. + /// + /// The RestSharp request object + /// The RestSharp response object + partial void InterceptResponse(RestRequest request, RestResponse response); + + /// + /// Initializes a new instance of the , defaulting to the global configurations' base url. + /// + public ApiClient() + { + _baseUrl = Topica.Client.Client.GlobalConfiguration.Instance.BasePath; + } + + /// + /// Initializes a new instance of the + /// + /// The target service's base path in URL format. + /// + public ApiClient(string basePath) + { + if (string.IsNullOrEmpty(basePath)) + throw new ArgumentException("basePath cannot be empty"); + + _baseUrl = basePath; + } + + /// + /// Constructs the RestSharp version of an http method + /// + /// Swagger Client Custom HttpMethod + /// RestSharp's HttpMethod instance. + /// + private RestSharpMethod Method(HttpMethod method) + { + RestSharpMethod other; + switch (method) + { + case HttpMethod.Get: + other = RestSharpMethod.Get; + break; + case HttpMethod.Post: + other = RestSharpMethod.Post; + break; + case HttpMethod.Put: + other = RestSharpMethod.Put; + break; + case HttpMethod.Delete: + other = RestSharpMethod.Delete; + break; + case HttpMethod.Head: + other = RestSharpMethod.Head; + break; + case HttpMethod.Options: + other = RestSharpMethod.Options; + break; + case HttpMethod.Patch: + other = RestSharpMethod.Patch; + break; + default: + throw new ArgumentOutOfRangeException("method", method, null); + } + + return other; + } + + /// + /// Provides all logic for constructing a new RestSharp . + /// At this point, all information for querying the service is known. Here, it is simply + /// mapped into the RestSharp request. + /// + /// The http verb. + /// The target path (or resource). + /// The additional request options. + /// A per-request configuration object. It is assumed that any merge with + /// GlobalConfiguration has been done before calling this method. + /// [private] A new RestRequest instance. + /// + private RestRequest NewRequest( + HttpMethod method, + string path, + RequestOptions options, + IReadableConfiguration configuration) + { + if (path == null) throw new ArgumentNullException("path"); + if (options == null) throw new ArgumentNullException("options"); + if (configuration == null) throw new ArgumentNullException("configuration"); + + RestRequest request = new RestRequest(path, Method(method)); + + if (options.PathParameters != null) + { + foreach (var pathParam in options.PathParameters) + { + request.AddParameter(pathParam.Key, pathParam.Value, ParameterType.UrlSegment); + } + } + + if (options.QueryParameters != null) + { + foreach (var queryParam in options.QueryParameters) + { + foreach (var value in queryParam.Value) + { + request.AddQueryParameter(queryParam.Key, value); + } + } + } + + if (configuration.DefaultHeaders != null) + { + foreach (var headerParam in configuration.DefaultHeaders) + { + request.AddHeader(headerParam.Key, headerParam.Value); + } + } + + if (options.HeaderParameters != null) + { + foreach (var headerParam in options.HeaderParameters) + { + foreach (var value in headerParam.Value) + { + request.AddHeader(headerParam.Key, value); + } + } + } + + if (options.FormParameters != null) + { + foreach (var formParam in options.FormParameters) + { + request.AddParameter(formParam.Key, formParam.Value); + } + } + + if (options.Data != null) + { + if (options.Data is Stream stream) + { + var contentType = "application/octet-stream"; + if (options.HeaderParameters != null) + { + var contentTypes = options.HeaderParameters["Content-Type"]; + contentType = contentTypes[0]; + } + + var bytes = ClientUtils.ReadAsBytes(stream); + request.AddParameter(contentType, bytes, ParameterType.RequestBody); + } + else + { + if (options.HeaderParameters != null) + { + var contentTypes = options.HeaderParameters["Content-Type"]; + if (contentTypes == null || contentTypes.Any(header => header.Contains("application/json"))) + { + request.RequestFormat = DataFormat.Json; + } + else + { + // TODO: Generated client user should add additional handlers. RestSharp only supports XML and JSON, with XML as default. + } + } + else + { + // Here, we'll assume JSON APIs are more common. XML can be forced by adding produces/consumes to openapi spec explicitly. + request.RequestFormat = DataFormat.Json; + } + + request.AddJsonBody(options.Data); + } + } + + if (options.FileParameters != null) + { + foreach (var fileParam in options.FileParameters) + { + foreach (var file in fileParam.Value) + { + var bytes = ClientUtils.ReadAsBytes(file); + var fileStream = file as FileStream; + if (fileStream != null) + request.AddFile(fileParam.Key, bytes, System.IO.Path.GetFileName(fileStream.Name)); + else + request.AddFile(fileParam.Key, bytes, "no_file_name_provided"); + } + } + } + + return request; + } + + private ApiResponse ToApiResponse(RestResponse response) + { + T result = response.Data; + string rawContent = response.Content; + + var transformed = new ApiResponse(response.StatusCode, new Multimap(), result, rawContent) + { + ErrorText = response.ErrorMessage, + Cookies = new List() + }; + + if (response.Headers != null) + { + foreach (var responseHeader in response.Headers) + { + transformed.Headers.Add(responseHeader.Name, ClientUtils.ParameterToString(responseHeader.Value)); + } + } + + if (response.ContentHeaders != null) + { + foreach (var responseHeader in response.ContentHeaders) + { + transformed.Headers.Add(responseHeader.Name, ClientUtils.ParameterToString(responseHeader.Value)); + } + } + + if (response.Cookies != null) + { + foreach (var responseCookies in response.Cookies.Cast()) + { + transformed.Cookies.Add( + new Cookie( + responseCookies.Name, + responseCookies.Value, + responseCookies.Path, + responseCookies.Domain) + ); + } + } + + return transformed; + } + + private ApiResponse Exec(RestRequest request, RequestOptions options, IReadableConfiguration configuration) + { + var baseUrl = configuration.GetOperationServerUrl(options.Operation, options.OperationIndex) ?? _baseUrl; + + var cookies = new CookieContainer(); + + if (options.Cookies != null && options.Cookies.Count > 0) + { + foreach (var cookie in options.Cookies) + { + cookies.Add(new Cookie(cookie.Name, cookie.Value)); + } + } + + var clientOptions = new RestClientOptions(baseUrl) + { + ClientCertificates = configuration.ClientCertificates, + CookieContainer = cookies, + MaxTimeout = configuration.Timeout, + Proxy = configuration.Proxy, + UserAgent = configuration.UserAgent, + UseDefaultCredentials = configuration.UseDefaultCredentials, + RemoteCertificateValidationCallback = configuration.RemoteCertificateValidationCallback + }; + + using (RestClient client = new RestClient(clientOptions, + configureSerialization: serializerConfig => serializerConfig.UseSerializer(() => new CustomJsonCodec(SerializerSettings, configuration)))) + { + InterceptRequest(request); + + RestResponse response; + if (RetryConfiguration.RetryPolicy != null) + { + var policy = RetryConfiguration.RetryPolicy; + var policyResult = policy.ExecuteAndCapture(() => client.Execute(request)); + response = (policyResult.Outcome == OutcomeType.Successful) ? client.Deserialize(policyResult.Result) : new RestResponse(request) + { + ErrorException = policyResult.FinalException + }; + } + else + { + response = client.Execute(request); + } + + // if the response type is oneOf/anyOf, call FromJSON to deserialize the data + if (typeof(Topica.Client.Model.AbstractOpenAPISchema).IsAssignableFrom(typeof(T))) + { + try + { + response.Data = (T) typeof(T).GetMethod("FromJson").Invoke(null, new object[] { response.Content }); + } + catch (Exception ex) + { + throw ex.InnerException != null ? ex.InnerException : ex; + } + } + else if (typeof(T).Name == "Stream") // for binary response + { + response.Data = (T)(object)new MemoryStream(response.RawBytes); + } + else if (typeof(T).Name == "Byte[]") // for byte response + { + response.Data = (T)(object)response.RawBytes; + } + else if (typeof(T).Name == "String") // for string response + { + response.Data = (T)(object)response.Content; + } + + InterceptResponse(request, response); + + var result = ToApiResponse(response); + if (response.ErrorMessage != null) + { + result.ErrorText = response.ErrorMessage; + } + + if (response.Cookies != null && response.Cookies.Count > 0) + { + if (result.Cookies == null) result.Cookies = new List(); + foreach (var restResponseCookie in response.Cookies.Cast()) + { + var cookie = new Cookie( + restResponseCookie.Name, + restResponseCookie.Value, + restResponseCookie.Path, + restResponseCookie.Domain + ) + { + Comment = restResponseCookie.Comment, + CommentUri = restResponseCookie.CommentUri, + Discard = restResponseCookie.Discard, + Expired = restResponseCookie.Expired, + Expires = restResponseCookie.Expires, + HttpOnly = restResponseCookie.HttpOnly, + Port = restResponseCookie.Port, + Secure = restResponseCookie.Secure, + Version = restResponseCookie.Version + }; + + result.Cookies.Add(cookie); + } + } + return result; + } + } + + private async Task> ExecAsync(RestRequest request, RequestOptions options, IReadableConfiguration configuration, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) + { + var baseUrl = configuration.GetOperationServerUrl(options.Operation, options.OperationIndex) ?? _baseUrl; + + var clientOptions = new RestClientOptions(baseUrl) + { + ClientCertificates = configuration.ClientCertificates, + MaxTimeout = configuration.Timeout, + Proxy = configuration.Proxy, + UserAgent = configuration.UserAgent, + UseDefaultCredentials = configuration.UseDefaultCredentials, + RemoteCertificateValidationCallback = configuration.RemoteCertificateValidationCallback + }; + + using (RestClient client = new RestClient(clientOptions, + configureSerialization: serializerConfig => serializerConfig.UseSerializer(() => new CustomJsonCodec(SerializerSettings, configuration)))) + { + InterceptRequest(request); + + RestResponse response; + if (RetryConfiguration.AsyncRetryPolicy != null) + { + var policy = RetryConfiguration.AsyncRetryPolicy; + var policyResult = await policy.ExecuteAndCaptureAsync((ct) => client.ExecuteAsync(request, ct), cancellationToken).ConfigureAwait(false); + response = (policyResult.Outcome == OutcomeType.Successful) ? client.Deserialize(policyResult.Result) : new RestResponse(request) + { + ErrorException = policyResult.FinalException + }; + } + else + { + response = await client.ExecuteAsync(request, cancellationToken).ConfigureAwait(false); + } + + // if the response type is oneOf/anyOf, call FromJSON to deserialize the data + if (typeof(Topica.Client.Model.AbstractOpenAPISchema).IsAssignableFrom(typeof(T))) + { + response.Data = (T) typeof(T).GetMethod("FromJson").Invoke(null, new object[] { response.Content }); + } + else if (typeof(T).Name == "Stream") // for binary response + { + response.Data = (T)(object)new MemoryStream(response.RawBytes); + } + else if (typeof(T).Name == "Byte[]") // for byte response + { + response.Data = (T)(object)response.RawBytes; + } + + InterceptResponse(request, response); + + var result = ToApiResponse(response); + if (response.ErrorMessage != null) + { + result.ErrorText = response.ErrorMessage; + } + + if (response.Cookies != null && response.Cookies.Count > 0) + { + if (result.Cookies == null) result.Cookies = new List(); + foreach (var restResponseCookie in response.Cookies.Cast()) + { + var cookie = new Cookie( + restResponseCookie.Name, + restResponseCookie.Value, + restResponseCookie.Path, + restResponseCookie.Domain + ) + { + Comment = restResponseCookie.Comment, + CommentUri = restResponseCookie.CommentUri, + Discard = restResponseCookie.Discard, + Expired = restResponseCookie.Expired, + Expires = restResponseCookie.Expires, + HttpOnly = restResponseCookie.HttpOnly, + Port = restResponseCookie.Port, + Secure = restResponseCookie.Secure, + Version = restResponseCookie.Version + }; + + result.Cookies.Add(cookie); + } + } + return result; + } + } + + #region IAsynchronousClient + /// + /// Make a HTTP GET request (async). + /// + /// The target path (or resource). + /// The additional request options. + /// A per-request configuration object. It is assumed that any merge with + /// GlobalConfiguration has been done before calling this method. + /// Token that enables callers to cancel the request. + /// A Task containing ApiResponse + public Task> GetAsync(string path, RequestOptions options, IReadableConfiguration configuration = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) + { + var config = configuration ?? GlobalConfiguration.Instance; + return ExecAsync(NewRequest(HttpMethod.Get, path, options, config), options, config, cancellationToken); + } + + /// + /// Make a HTTP POST request (async). + /// + /// The target path (or resource). + /// The additional request options. + /// A per-request configuration object. It is assumed that any merge with + /// GlobalConfiguration has been done before calling this method. + /// Token that enables callers to cancel the request. + /// A Task containing ApiResponse + public Task> PostAsync(string path, RequestOptions options, IReadableConfiguration configuration = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) + { + var config = configuration ?? GlobalConfiguration.Instance; + return ExecAsync(NewRequest(HttpMethod.Post, path, options, config), options, config, cancellationToken); + } + + /// + /// Make a HTTP PUT request (async). + /// + /// The target path (or resource). + /// The additional request options. + /// A per-request configuration object. It is assumed that any merge with + /// GlobalConfiguration has been done before calling this method. + /// Token that enables callers to cancel the request. + /// A Task containing ApiResponse + public Task> PutAsync(string path, RequestOptions options, IReadableConfiguration configuration = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) + { + var config = configuration ?? GlobalConfiguration.Instance; + return ExecAsync(NewRequest(HttpMethod.Put, path, options, config), options, config, cancellationToken); + } + + /// + /// Make a HTTP DELETE request (async). + /// + /// The target path (or resource). + /// The additional request options. + /// A per-request configuration object. It is assumed that any merge with + /// GlobalConfiguration has been done before calling this method. + /// Token that enables callers to cancel the request. + /// A Task containing ApiResponse + public Task> DeleteAsync(string path, RequestOptions options, IReadableConfiguration configuration = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) + { + var config = configuration ?? GlobalConfiguration.Instance; + return ExecAsync(NewRequest(HttpMethod.Delete, path, options, config), options, config, cancellationToken); + } + + /// + /// Make a HTTP HEAD request (async). + /// + /// The target path (or resource). + /// The additional request options. + /// A per-request configuration object. It is assumed that any merge with + /// GlobalConfiguration has been done before calling this method. + /// Token that enables callers to cancel the request. + /// A Task containing ApiResponse + public Task> HeadAsync(string path, RequestOptions options, IReadableConfiguration configuration = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) + { + var config = configuration ?? GlobalConfiguration.Instance; + return ExecAsync(NewRequest(HttpMethod.Head, path, options, config), options, config, cancellationToken); + } + + /// + /// Make a HTTP OPTION request (async). + /// + /// The target path (or resource). + /// The additional request options. + /// A per-request configuration object. It is assumed that any merge with + /// GlobalConfiguration has been done before calling this method. + /// Token that enables callers to cancel the request. + /// A Task containing ApiResponse + public Task> OptionsAsync(string path, RequestOptions options, IReadableConfiguration configuration = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) + { + var config = configuration ?? GlobalConfiguration.Instance; + return ExecAsync(NewRequest(HttpMethod.Options, path, options, config), options, config, cancellationToken); + } + + /// + /// Make a HTTP PATCH request (async). + /// + /// The target path (or resource). + /// The additional request options. + /// A per-request configuration object. It is assumed that any merge with + /// GlobalConfiguration has been done before calling this method. + /// Token that enables callers to cancel the request. + /// A Task containing ApiResponse + public Task> PatchAsync(string path, RequestOptions options, IReadableConfiguration configuration = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) + { + var config = configuration ?? GlobalConfiguration.Instance; + return ExecAsync(NewRequest(HttpMethod.Patch, path, options, config), options, config, cancellationToken); + } + #endregion IAsynchronousClient + + #region ISynchronousClient + /// + /// Make a HTTP GET request (synchronous). + /// + /// The target path (or resource). + /// The additional request options. + /// A per-request configuration object. It is assumed that any merge with + /// GlobalConfiguration has been done before calling this method. + /// A Task containing ApiResponse + public ApiResponse Get(string path, RequestOptions options, IReadableConfiguration configuration = null) + { + var config = configuration ?? GlobalConfiguration.Instance; + return Exec(NewRequest(HttpMethod.Get, path, options, config), options, config); + } + + /// + /// Make a HTTP POST request (synchronous). + /// + /// The target path (or resource). + /// The additional request options. + /// A per-request configuration object. It is assumed that any merge with + /// GlobalConfiguration has been done before calling this method. + /// A Task containing ApiResponse + public ApiResponse Post(string path, RequestOptions options, IReadableConfiguration configuration = null) + { + var config = configuration ?? GlobalConfiguration.Instance; + return Exec(NewRequest(HttpMethod.Post, path, options, config), options, config); + } + + /// + /// Make a HTTP PUT request (synchronous). + /// + /// The target path (or resource). + /// The additional request options. + /// A per-request configuration object. It is assumed that any merge with + /// GlobalConfiguration has been done before calling this method. + /// A Task containing ApiResponse + public ApiResponse Put(string path, RequestOptions options, IReadableConfiguration configuration = null) + { + var config = configuration ?? GlobalConfiguration.Instance; + return Exec(NewRequest(HttpMethod.Put, path, options, config), options, config); + } + + /// + /// Make a HTTP DELETE request (synchronous). + /// + /// The target path (or resource). + /// The additional request options. + /// A per-request configuration object. It is assumed that any merge with + /// GlobalConfiguration has been done before calling this method. + /// A Task containing ApiResponse + public ApiResponse Delete(string path, RequestOptions options, IReadableConfiguration configuration = null) + { + var config = configuration ?? GlobalConfiguration.Instance; + return Exec(NewRequest(HttpMethod.Delete, path, options, config), options, config); + } + + /// + /// Make a HTTP HEAD request (synchronous). + /// + /// The target path (or resource). + /// The additional request options. + /// A per-request configuration object. It is assumed that any merge with + /// GlobalConfiguration has been done before calling this method. + /// A Task containing ApiResponse + public ApiResponse Head(string path, RequestOptions options, IReadableConfiguration configuration = null) + { + var config = configuration ?? GlobalConfiguration.Instance; + return Exec(NewRequest(HttpMethod.Head, path, options, config), options, config); + } + + /// + /// Make a HTTP OPTION request (synchronous). + /// + /// The target path (or resource). + /// The additional request options. + /// A per-request configuration object. It is assumed that any merge with + /// GlobalConfiguration has been done before calling this method. + /// A Task containing ApiResponse + public ApiResponse Options(string path, RequestOptions options, IReadableConfiguration configuration = null) + { + var config = configuration ?? GlobalConfiguration.Instance; + return Exec(NewRequest(HttpMethod.Options, path, options, config), options, config); + } + + /// + /// Make a HTTP PATCH request (synchronous). + /// + /// The target path (or resource). + /// The additional request options. + /// A per-request configuration object. It is assumed that any merge with + /// GlobalConfiguration has been done before calling this method. + /// A Task containing ApiResponse + public ApiResponse Patch(string path, RequestOptions options, IReadableConfiguration configuration = null) + { + var config = configuration ?? GlobalConfiguration.Instance; + return Exec(NewRequest(HttpMethod.Patch, path, options, config), options, config); + } + #endregion ISynchronousClient + } +} diff --git a/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Client/ApiException.cs b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Client/ApiException.cs new file mode 100644 index 0000000..7ac716f --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Client/ApiException.cs @@ -0,0 +1,68 @@ +/* + * Topica.Server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + * + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + + +using System; + +namespace Topica.Client.Client +{ + /// + /// API Exception + /// + public class ApiException : Exception + { + /// + /// Gets or sets the error code (HTTP status code) + /// + /// The error code (HTTP status code). + public int ErrorCode { get; set; } + + /// + /// Gets or sets the error content (body json object) + /// + /// The error content (Http response body). + public object ErrorContent { get; private set; } + + /// + /// Gets or sets the HTTP headers + /// + /// HTTP headers + public Multimap Headers { get; private set; } + + /// + /// Initializes a new instance of the class. + /// + public ApiException() { } + + /// + /// Initializes a new instance of the class. + /// + /// HTTP status code. + /// Error message. + public ApiException(int errorCode, string message) : base(message) + { + this.ErrorCode = errorCode; + } + + /// + /// Initializes a new instance of the class. + /// + /// HTTP status code. + /// Error message. + /// Error content. + /// HTTP Headers. + public ApiException(int errorCode, string message, object errorContent = null, Multimap headers = null) : base(message) + { + this.ErrorCode = errorCode; + this.ErrorContent = errorContent; + this.Headers = headers; + } + } + +} diff --git a/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Client/ApiResponse.cs b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Client/ApiResponse.cs new file mode 100644 index 0000000..94cb49a --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Client/ApiResponse.cs @@ -0,0 +1,166 @@ +/* + * Topica.Server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + * + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + + +using System; +using System.Collections.Generic; +using System.Net; + +namespace Topica.Client.Client +{ + /// + /// Provides a non-generic contract for the ApiResponse wrapper. + /// + public interface IApiResponse + { + /// + /// The data type of + /// + Type ResponseType { get; } + + /// + /// The content of this response + /// + Object Content { get; } + + /// + /// Gets or sets the status code (HTTP status code) + /// + /// The status code. + HttpStatusCode StatusCode { get; } + + /// + /// Gets or sets the HTTP headers + /// + /// HTTP headers + Multimap Headers { get; } + + /// + /// Gets or sets any error text defined by the calling client. + /// + string ErrorText { get; set; } + + /// + /// Gets or sets any cookies passed along on the response. + /// + List Cookies { get; set; } + + /// + /// The raw content of this response + /// + string RawContent { get; } + } + + /// + /// API Response + /// + public class ApiResponse : IApiResponse + { + #region Properties + + /// + /// Gets or sets the status code (HTTP status code) + /// + /// The status code. + public HttpStatusCode StatusCode { get; } + + /// + /// Gets or sets the HTTP headers + /// + /// HTTP headers + public Multimap Headers { get; } + + /// + /// Gets or sets the data (parsed HTTP body) + /// + /// The data. + public T Data { get; } + + /// + /// Gets or sets any error text defined by the calling client. + /// + public string ErrorText { get; set; } + + /// + /// Gets or sets any cookies passed along on the response. + /// + public List Cookies { get; set; } + + /// + /// The content of this response + /// + public Type ResponseType + { + get { return typeof(T); } + } + + /// + /// The data type of + /// + public object Content + { + get { return Data; } + } + + /// + /// The raw content + /// + public string RawContent { get; } + + #endregion Properties + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + /// HTTP status code. + /// HTTP headers. + /// Data (parsed HTTP body) + /// Raw content. + public ApiResponse(HttpStatusCode statusCode, Multimap headers, T data, string rawContent) + { + StatusCode = statusCode; + Headers = headers; + Data = data; + RawContent = rawContent; + } + + /// + /// Initializes a new instance of the class. + /// + /// HTTP status code. + /// HTTP headers. + /// Data (parsed HTTP body) + public ApiResponse(HttpStatusCode statusCode, Multimap headers, T data) : this(statusCode, headers, data, null) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// HTTP status code. + /// Data (parsed HTTP body) + /// Raw content. + public ApiResponse(HttpStatusCode statusCode, T data, string rawContent) : this(statusCode, null, data, rawContent) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// HTTP status code. + /// Data (parsed HTTP body) + public ApiResponse(HttpStatusCode statusCode, T data) : this(statusCode, data, null) + { + } + + #endregion Constructors + } +} diff --git a/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Client/ClientUtils.cs b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Client/ClientUtils.cs new file mode 100644 index 0000000..946225b --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Client/ClientUtils.cs @@ -0,0 +1,247 @@ +/* + * Topica.Server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + * + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Runtime.Serialization; +using System.Text; +using System.Text.RegularExpressions; + +namespace Topica.Client.Client +{ + /// + /// Utility functions providing some benefit to API client consumers. + /// + public static class ClientUtils + { + /// + /// Sanitize filename by removing the path + /// + /// Filename + /// Filename + public static string SanitizeFilename(string filename) + { + Match match = Regex.Match(filename, @".*[/\\](.*)$"); + return match.Success ? match.Groups[1].Value : filename; + } + + /// + /// Convert params to key/value pairs. + /// Use collectionFormat to properly format lists and collections. + /// + /// The swagger-supported collection format, one of: csv, tsv, ssv, pipes, multi + /// Key name. + /// Value object. + /// A multimap of keys with 1..n associated values. + public static Multimap ParameterToMultiMap(string collectionFormat, string name, object value) + { + var parameters = new Multimap(); + + if (value is ICollection collection && collectionFormat == "multi") + { + foreach (var item in collection) + { + parameters.Add(name, ParameterToString(item)); + } + } + else if (value is IDictionary dictionary) + { + if(collectionFormat == "deepObject") { + foreach (DictionaryEntry entry in dictionary) + { + parameters.Add(name + "[" + entry.Key + "]", ParameterToString(entry.Value)); + } + } + else { + foreach (DictionaryEntry entry in dictionary) + { + parameters.Add(entry.Key.ToString(), ParameterToString(entry.Value)); + } + } + } + else + { + parameters.Add(name, ParameterToString(value)); + } + + return parameters; + } + + /// + /// If parameter is DateTime, output in a formatted string (default ISO 8601), customizable with Configuration.DateTime. + /// If parameter is a list, join the list with ",". + /// Otherwise just return the string. + /// + /// The parameter (header, path, query, form). + /// An optional configuration instance, providing formatting options used in processing. + /// Formatted string. + public static string ParameterToString(object obj, IReadableConfiguration configuration = null) + { + if (obj is DateTime dateTime) + // Return a formatted date string - Can be customized with Configuration.DateTimeFormat + // Defaults to an ISO 8601, using the known as a Round-trip date/time pattern ("o") + // https://msdn.microsoft.com/en-us/library/az4se3k1(v=vs.110).aspx#Anchor_8 + // For example: 2009-06-15T13:45:30.0000000 + return dateTime.ToString((configuration ?? GlobalConfiguration.Instance).DateTimeFormat); + if (obj is DateTimeOffset dateTimeOffset) + // Return a formatted date string - Can be customized with Configuration.DateTimeFormat + // Defaults to an ISO 8601, using the known as a Round-trip date/time pattern ("o") + // https://msdn.microsoft.com/en-us/library/az4se3k1(v=vs.110).aspx#Anchor_8 + // For example: 2009-06-15T13:45:30.0000000 + return dateTimeOffset.ToString((configuration ?? GlobalConfiguration.Instance).DateTimeFormat); + if (obj is bool boolean) + return boolean ? "true" : "false"; + if (obj is ICollection collection) { + List entries = new List(); + foreach (var entry in collection) + entries.Add(ParameterToString(entry, configuration)); + return string.Join(",", entries); + } + if (obj is Enum && HasEnumMemberAttrValue(obj)) + return GetEnumMemberAttrValue(obj); + + return Convert.ToString(obj, CultureInfo.InvariantCulture); + } + + /// + /// Serializes the given object when not null. Otherwise return null. + /// + /// The object to serialize. + /// Serialized string. + public static string Serialize(object obj) + { + return obj != null ? Newtonsoft.Json.JsonConvert.SerializeObject(obj) : null; + } + + /// + /// Encode string in base64 format. + /// + /// string to be encoded. + /// Encoded string. + public static string Base64Encode(string text) + { + return Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(text)); + } + + /// + /// Convert stream to byte array + /// + /// Input stream to be converted + /// Byte array + public static byte[] ReadAsBytes(Stream inputStream) + { + using (var ms = new MemoryStream()) + { + inputStream.CopyTo(ms); + return ms.ToArray(); + } + } + + /// + /// Select the Content-Type header's value from the given content-type array: + /// if JSON type exists in the given array, use it; + /// otherwise use the first one defined in 'consumes' + /// + /// The Content-Type array to select from. + /// The Content-Type header to use. + public static string SelectHeaderContentType(string[] contentTypes) + { + if (contentTypes.Length == 0) + return null; + + foreach (var contentType in contentTypes) + { + if (IsJsonMime(contentType)) + return contentType; + } + + return contentTypes[0]; // use the first content type specified in 'consumes' + } + + /// + /// Select the Accept header's value from the given accepts array: + /// if JSON exists in the given array, use it; + /// otherwise use all of them (joining into a string) + /// + /// The accepts array to select from. + /// The Accept header to use. + public static string SelectHeaderAccept(string[] accepts) + { + if (accepts.Length == 0) + return null; + + if (accepts.Contains("application/json", StringComparer.OrdinalIgnoreCase)) + return "application/json"; + + return string.Join(",", accepts); + } + + /// + /// Provides a case-insensitive check that a provided content type is a known JSON-like content type. + /// + public static readonly Regex JsonRegex = new Regex("(?i)^(application/json|[^;/ \t]+/[^;/ \t]+[+]json)[ \t]*(;.*)?$"); + + /// + /// Check if the given MIME is a JSON MIME. + /// JSON MIME examples: + /// application/json + /// application/json; charset=UTF8 + /// APPLICATION/JSON + /// application/vnd.company+json + /// + /// MIME + /// Returns True if MIME type is json. + public static bool IsJsonMime(string mime) + { + if (string.IsNullOrWhiteSpace(mime)) return false; + + return JsonRegex.IsMatch(mime) || mime.Equals("application/json-patch+json"); + } + + /// + /// Is the Enum decorated with EnumMember Attribute + /// + /// + /// true if found + private static bool HasEnumMemberAttrValue(object enumVal) + { + if (enumVal == null) + throw new ArgumentNullException(nameof(enumVal)); + var enumType = enumVal.GetType(); + var memInfo = enumType.GetMember(enumVal.ToString() ?? throw new InvalidOperationException()); + var attr = memInfo.FirstOrDefault()?.GetCustomAttributes(false).OfType().FirstOrDefault(); + if (attr != null) return true; + return false; + } + + /// + /// Get the EnumMember value + /// + /// + /// EnumMember value as string otherwise null + private static string GetEnumMemberAttrValue(object enumVal) + { + if (enumVal == null) + throw new ArgumentNullException(nameof(enumVal)); + var enumType = enumVal.GetType(); + var memInfo = enumType.GetMember(enumVal.ToString() ?? throw new InvalidOperationException()); + var attr = memInfo.FirstOrDefault()?.GetCustomAttributes(false).OfType().FirstOrDefault(); + if (attr != null) + { + return attr.Value; + } + return null; + } + } +} diff --git a/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Client/Configuration.cs b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Client/Configuration.cs new file mode 100644 index 0000000..fd977ce --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Client/Configuration.cs @@ -0,0 +1,612 @@ +/* + * Topica.Server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + * + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + + +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net; +using System.Reflection; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Net.Http; +using System.Net.Security; + +namespace Topica.Client.Client +{ + /// + /// Represents a set of configuration settings + /// + public class Configuration : IReadableConfiguration + { + #region Constants + + /// + /// Version of the package. + /// + /// Version of the package. + public const string Version = "0.0.1"; + + /// + /// Identifier for ISO 8601 DateTime Format + /// + /// See https://msdn.microsoft.com/en-us/library/az4se3k1(v=vs.110).aspx#Anchor_8 for more information. + // ReSharper disable once InconsistentNaming + public const string ISO8601_DATETIME_FORMAT = "o"; + + #endregion Constants + + #region Static Members + + /// + /// Default creation of exceptions for a given method name and response object + /// + public static readonly ExceptionFactory DefaultExceptionFactory = (methodName, response) => + { + var status = (int)response.StatusCode; + if (status >= 400) + { + return new ApiException(status, + string.Format("Error calling {0}: {1}", methodName, response.RawContent), + response.RawContent, response.Headers); + } + if (status == 0) + { + return new ApiException(status, + string.Format("Error calling {0}: {1}", methodName, response.ErrorText), response.ErrorText); + } + return null; + }; + + #endregion Static Members + + #region Private Members + + /// + /// Defines the base path of the target API server. + /// Example: http://localhost:3000/v1/ + /// + private string _basePath; + + private bool _useDefaultCredentials = false; + + /// + /// Gets or sets the API key based on the authentication name. + /// This is the key and value comprising the "secret" for accessing an API. + /// + /// The API key. + private IDictionary _apiKey; + + /// + /// Gets or sets the prefix (e.g. Token) of the API key based on the authentication name. + /// + /// The prefix of the API key. + private IDictionary _apiKeyPrefix; + + private string _dateTimeFormat = ISO8601_DATETIME_FORMAT; + private string _tempFolderPath = Path.GetTempPath(); + + /// + /// Gets or sets the servers defined in the OpenAPI spec. + /// + /// The servers + private IList> _servers; + + /// + /// Gets or sets the operation servers defined in the OpenAPI spec. + /// + /// The operation servers + private IReadOnlyDictionary>> _operationServers; + + #endregion Private Members + + #region Constructors + + /// + /// Initializes a new instance of the class + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage("ReSharper", "VirtualMemberCallInConstructor")] + public Configuration() + { + Proxy = null; + UserAgent = WebUtility.UrlEncode("OpenAPI-Generator/0.0.1/csharp"); + BasePath = "http://localhost"; + DefaultHeaders = new ConcurrentDictionary(); + ApiKey = new ConcurrentDictionary(); + ApiKeyPrefix = new ConcurrentDictionary(); + Servers = new List>() + { + { + new Dictionary { + {"url", ""}, + {"description", "No description provided"}, + } + } + }; + OperationServers = new Dictionary>>() + { + }; + + // Setting Timeout has side effects (forces ApiClient creation). + Timeout = 100000; + } + + /// + /// Initializes a new instance of the class + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage("ReSharper", "VirtualMemberCallInConstructor")] + public Configuration( + IDictionary defaultHeaders, + IDictionary apiKey, + IDictionary apiKeyPrefix, + string basePath = "http://localhost") : this() + { + if (string.IsNullOrWhiteSpace(basePath)) + throw new ArgumentException("The provided basePath is invalid.", "basePath"); + if (defaultHeaders == null) + throw new ArgumentNullException("defaultHeaders"); + if (apiKey == null) + throw new ArgumentNullException("apiKey"); + if (apiKeyPrefix == null) + throw new ArgumentNullException("apiKeyPrefix"); + + BasePath = basePath; + + foreach (var keyValuePair in defaultHeaders) + { + DefaultHeaders.Add(keyValuePair); + } + + foreach (var keyValuePair in apiKey) + { + ApiKey.Add(keyValuePair); + } + + foreach (var keyValuePair in apiKeyPrefix) + { + ApiKeyPrefix.Add(keyValuePair); + } + } + + #endregion Constructors + + #region Properties + + /// + /// Gets or sets the base path for API access. + /// + public virtual string BasePath + { + get { return _basePath; } + set { _basePath = value; } + } + + /// + /// Determine whether or not the "default credentials" (e.g. the user account under which the current process is running) will be sent along to the server. The default is false. + /// + public virtual bool UseDefaultCredentials + { + get { return _useDefaultCredentials; } + set { _useDefaultCredentials = value; } + } + + /// + /// Gets or sets the default header. + /// + [Obsolete("Use DefaultHeaders instead.")] + public virtual IDictionary DefaultHeader + { + get + { + return DefaultHeaders; + } + set + { + DefaultHeaders = value; + } + } + + /// + /// Gets or sets the default headers. + /// + public virtual IDictionary DefaultHeaders { get; set; } + + /// + /// Gets or sets the HTTP timeout (milliseconds) of ApiClient. Default to 100000 milliseconds. + /// + public virtual int Timeout { get; set; } + + /// + /// Gets or sets the proxy + /// + /// Proxy. + public virtual WebProxy Proxy { get; set; } + + /// + /// Gets or sets the HTTP user agent. + /// + /// Http user agent. + public virtual string UserAgent { get; set; } + + /// + /// Gets or sets the username (HTTP basic authentication). + /// + /// The username. + public virtual string Username { get; set; } + + /// + /// Gets or sets the password (HTTP basic authentication). + /// + /// The password. + public virtual string Password { get; set; } + + /// + /// Gets the API key with prefix. + /// + /// API key identifier (authentication scheme). + /// API key with prefix. + public string GetApiKeyWithPrefix(string apiKeyIdentifier) + { + string apiKeyValue; + ApiKey.TryGetValue(apiKeyIdentifier, out apiKeyValue); + string apiKeyPrefix; + if (ApiKeyPrefix.TryGetValue(apiKeyIdentifier, out apiKeyPrefix)) + { + return apiKeyPrefix + " " + apiKeyValue; + } + + return apiKeyValue; + } + + /// + /// Gets or sets certificate collection to be sent with requests. + /// + /// X509 Certificate collection. + public X509CertificateCollection ClientCertificates { get; set; } + + /// + /// Gets or sets the access token for OAuth2 authentication. + /// + /// This helper property simplifies code generation. + /// + /// The access token. + public virtual string AccessToken { get; set; } + + /// + /// Gets or sets the temporary folder path to store the files downloaded from the server. + /// + /// Folder path. + public virtual string TempFolderPath + { + get { return _tempFolderPath; } + + set + { + if (string.IsNullOrEmpty(value)) + { + _tempFolderPath = Path.GetTempPath(); + return; + } + + // create the directory if it does not exist + if (!Directory.Exists(value)) + { + Directory.CreateDirectory(value); + } + + // check if the path contains directory separator at the end + if (value[value.Length - 1] == Path.DirectorySeparatorChar) + { + _tempFolderPath = value; + } + else + { + _tempFolderPath = value + Path.DirectorySeparatorChar; + } + } + } + + /// + /// Gets or sets the date time format used when serializing in the ApiClient + /// By default, it's set to ISO 8601 - "o", for others see: + /// https://msdn.microsoft.com/en-us/library/az4se3k1(v=vs.110).aspx + /// and https://msdn.microsoft.com/en-us/library/8kb3ddd4(v=vs.110).aspx + /// No validation is done to ensure that the string you're providing is valid + /// + /// The DateTimeFormat string + public virtual string DateTimeFormat + { + get { return _dateTimeFormat; } + set + { + if (string.IsNullOrEmpty(value)) + { + // Never allow a blank or null string, go back to the default + _dateTimeFormat = ISO8601_DATETIME_FORMAT; + return; + } + + // Caution, no validation when you choose date time format other than ISO 8601 + // Take a look at the above links + _dateTimeFormat = value; + } + } + + /// + /// Gets or sets the prefix (e.g. Token) of the API key based on the authentication name. + /// + /// Whatever you set here will be prepended to the value defined in AddApiKey. + /// + /// An example invocation here might be: + /// + /// ApiKeyPrefix["Authorization"] = "Bearer"; + /// + /// … where ApiKey["Authorization"] would then be used to set the value of your bearer token. + /// + /// + /// OAuth2 workflows should set tokens via AccessToken. + /// + /// + /// The prefix of the API key. + public virtual IDictionary ApiKeyPrefix + { + get { return _apiKeyPrefix; } + set + { + if (value == null) + { + throw new InvalidOperationException("ApiKeyPrefix collection may not be null."); + } + _apiKeyPrefix = value; + } + } + + /// + /// Gets or sets the API key based on the authentication name. + /// + /// The API key. + public virtual IDictionary ApiKey + { + get { return _apiKey; } + set + { + if (value == null) + { + throw new InvalidOperationException("ApiKey collection may not be null."); + } + _apiKey = value; + } + } + + /// + /// Gets or sets the servers. + /// + /// The servers. + public virtual IList> Servers + { + get { return _servers; } + set + { + if (value == null) + { + throw new InvalidOperationException("Servers may not be null."); + } + _servers = value; + } + } + + /// + /// Gets or sets the operation servers. + /// + /// The operation servers. + public virtual IReadOnlyDictionary>> OperationServers + { + get { return _operationServers; } + set + { + if (value == null) + { + throw new InvalidOperationException("Operation servers may not be null."); + } + _operationServers = value; + } + } + + /// + /// Returns URL based on server settings without providing values + /// for the variables + /// + /// Array index of the server settings. + /// The server URL. + public string GetServerUrl(int index) + { + return GetServerUrl(Servers, index, null); + } + + /// + /// Returns URL based on server settings. + /// + /// Array index of the server settings. + /// Dictionary of the variables and the corresponding values. + /// The server URL. + public string GetServerUrl(int index, Dictionary inputVariables) + { + return GetServerUrl(Servers, index, inputVariables); + } + + /// + /// Returns URL based on operation server settings. + /// + /// Operation associated with the request path. + /// Array index of the server settings. + /// The operation server URL. + public string GetOperationServerUrl(string operation, int index) + { + return GetOperationServerUrl(operation, index, null); + } + + /// + /// Returns URL based on operation server settings. + /// + /// Operation associated with the request path. + /// Array index of the server settings. + /// Dictionary of the variables and the corresponding values. + /// The operation server URL. + public string GetOperationServerUrl(string operation, int index, Dictionary inputVariables) + { + if (operation != null && OperationServers.TryGetValue(operation, out var operationServer)) + { + return GetServerUrl(operationServer, index, inputVariables); + } + + return null; + } + + /// + /// Returns URL based on server settings. + /// + /// Dictionary of server settings. + /// Array index of the server settings. + /// Dictionary of the variables and the corresponding values. + /// The server URL. + private string GetServerUrl(IList> servers, int index, Dictionary inputVariables) + { + if (index < 0 || index >= servers.Count) + { + throw new InvalidOperationException($"Invalid index {index} when selecting the server. Must be less than {servers.Count}."); + } + + if (inputVariables == null) + { + inputVariables = new Dictionary(); + } + + IReadOnlyDictionary server = servers[index]; + string url = (string)server["url"]; + + if (server.ContainsKey("variables")) + { + // go through each variable and assign a value + foreach (KeyValuePair variable in (IReadOnlyDictionary)server["variables"]) + { + + IReadOnlyDictionary serverVariables = (IReadOnlyDictionary)(variable.Value); + + if (inputVariables.ContainsKey(variable.Key)) + { + if (((List)serverVariables["enum_values"]).Contains(inputVariables[variable.Key])) + { + url = url.Replace("{" + variable.Key + "}", inputVariables[variable.Key]); + } + else + { + throw new InvalidOperationException($"The variable `{variable.Key}` in the server URL has invalid value #{inputVariables[variable.Key]}. Must be {(List)serverVariables["enum_values"]}"); + } + } + else + { + // use default value + url = url.Replace("{" + variable.Key + "}", (string)serverVariables["default_value"]); + } + } + } + + return url; + } + + /// + /// Gets and Sets the RemoteCertificateValidationCallback + /// + public RemoteCertificateValidationCallback RemoteCertificateValidationCallback { get; set; } + + #endregion Properties + + #region Methods + + /// + /// Returns a string with essential information for debugging. + /// + public static string ToDebugReport() + { + string report = "C# SDK (Topica.Client) Debug Report:\n"; + report += " OS: " + System.Environment.OSVersion + "\n"; + report += " .NET Framework Version: " + System.Environment.Version + "\n"; + report += " Version of the API: 1.0\n"; + report += " SDK Package Version: 0.0.1\n"; + + return report; + } + + /// + /// Add Api Key Header. + /// + /// Api Key name. + /// Api Key value. + /// + public void AddApiKey(string key, string value) + { + ApiKey[key] = value; + } + + /// + /// Sets the API key prefix. + /// + /// Api Key name. + /// Api Key value. + public void AddApiKeyPrefix(string key, string value) + { + ApiKeyPrefix[key] = value; + } + + #endregion Methods + + #region Static Members + /// + /// Merge configurations. + /// + /// First configuration. + /// Second configuration. + /// Merged configuration. + public static IReadableConfiguration MergeConfigurations(IReadableConfiguration first, IReadableConfiguration second) + { + if (second == null) return first ?? GlobalConfiguration.Instance; + + Dictionary apiKey = first.ApiKey.ToDictionary(kvp => kvp.Key, kvp => kvp.Value); + Dictionary apiKeyPrefix = first.ApiKeyPrefix.ToDictionary(kvp => kvp.Key, kvp => kvp.Value); + Dictionary defaultHeaders = first.DefaultHeaders.ToDictionary(kvp => kvp.Key, kvp => kvp.Value); + + foreach (var kvp in second.ApiKey) apiKey[kvp.Key] = kvp.Value; + foreach (var kvp in second.ApiKeyPrefix) apiKeyPrefix[kvp.Key] = kvp.Value; + foreach (var kvp in second.DefaultHeaders) defaultHeaders[kvp.Key] = kvp.Value; + + var config = new Configuration + { + ApiKey = apiKey, + ApiKeyPrefix = apiKeyPrefix, + DefaultHeaders = defaultHeaders, + BasePath = second.BasePath ?? first.BasePath, + Timeout = second.Timeout, + Proxy = second.Proxy ?? first.Proxy, + UserAgent = second.UserAgent ?? first.UserAgent, + Username = second.Username ?? first.Username, + Password = second.Password ?? first.Password, + AccessToken = second.AccessToken ?? first.AccessToken, + TempFolderPath = second.TempFolderPath ?? first.TempFolderPath, + DateTimeFormat = second.DateTimeFormat ?? first.DateTimeFormat, + ClientCertificates = second.ClientCertificates ?? first.ClientCertificates, + UseDefaultCredentials = second.UseDefaultCredentials, + RemoteCertificateValidationCallback = second.RemoteCertificateValidationCallback ?? first.RemoteCertificateValidationCallback, + }; + return config; + } + #endregion Static Members + } +} diff --git a/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Client/ExceptionFactory.cs b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Client/ExceptionFactory.cs new file mode 100644 index 0000000..0b4747a --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Client/ExceptionFactory.cs @@ -0,0 +1,22 @@ +/* + * Topica.Server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + * + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + + +using System; + +namespace Topica.Client.Client +{ + /// + /// A delegate to ExceptionFactory method + /// + /// Method name + /// Response + /// Exceptions + public delegate Exception ExceptionFactory(string methodName, IApiResponse response); +} diff --git a/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Client/GlobalConfiguration.cs b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Client/GlobalConfiguration.cs new file mode 100644 index 0000000..905ce6b --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Client/GlobalConfiguration.cs @@ -0,0 +1,67 @@ +/* + * Topica.Server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + * + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + + +using System.Collections.Generic; + +namespace Topica.Client.Client +{ + /// + /// provides a compile-time extension point for globally configuring + /// API Clients. + /// + /// + /// A customized implementation via partial class may reside in another file and may + /// be excluded from automatic generation via a .openapi-generator-ignore file. + /// + public partial class GlobalConfiguration : Configuration + { + #region Private Members + + private static readonly object GlobalConfigSync = new { }; + private static IReadableConfiguration _globalConfiguration; + + #endregion Private Members + + #region Constructors + + /// + private GlobalConfiguration() + { + } + + /// + public GlobalConfiguration(IDictionary defaultHeader, IDictionary apiKey, IDictionary apiKeyPrefix, string basePath = "http://localhost:3000/api") : base(defaultHeader, apiKey, apiKeyPrefix, basePath) + { + } + + static GlobalConfiguration() + { + Instance = new GlobalConfiguration(); + } + + #endregion Constructors + + /// + /// Gets or sets the default Configuration. + /// + /// Configuration. + public static IReadableConfiguration Instance + { + get { return _globalConfiguration; } + set + { + lock (GlobalConfigSync) + { + _globalConfiguration = value; + } + } + } + } +} diff --git a/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Client/HttpMethod.cs b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Client/HttpMethod.cs new file mode 100644 index 0000000..2e47131 --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Client/HttpMethod.cs @@ -0,0 +1,33 @@ +/* + * Topica.Server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + * + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + + +namespace Topica.Client.Client +{ + /// + /// Http methods supported by swagger + /// + public enum HttpMethod + { + /// HTTP GET request. + Get, + /// HTTP POST request. + Post, + /// HTTP PUT request. + Put, + /// HTTP DELETE request. + Delete, + /// HTTP HEAD request. + Head, + /// HTTP OPTIONS request. + Options, + /// HTTP PATCH request. + Patch + } +} diff --git a/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Client/IApiAccessor.cs b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Client/IApiAccessor.cs new file mode 100644 index 0000000..57fb26f --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Client/IApiAccessor.cs @@ -0,0 +1,37 @@ +/* + * Topica.Server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + * + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + + +using System; + +namespace Topica.Client.Client +{ + /// + /// Represents configuration aspects required to interact with the API endpoints. + /// + public interface IApiAccessor + { + /// + /// Gets or sets the configuration object + /// + /// An instance of the Configuration + IReadableConfiguration Configuration { get; set; } + + /// + /// Gets the base path of the API client. + /// + /// The base path + string GetBasePath(); + + /// + /// Provides a factory method hook for the creation of exceptions. + /// + ExceptionFactory ExceptionFactory { get; set; } + } +} diff --git a/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Client/IAsynchronousClient.cs b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Client/IAsynchronousClient.cs new file mode 100644 index 0000000..4db7316 --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Client/IAsynchronousClient.cs @@ -0,0 +1,100 @@ +/* + * Topica.Server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + * + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + + +using System; +using System.Threading.Tasks; + +namespace Topica.Client.Client +{ + /// + /// Contract for Asynchronous RESTful API interactions. + /// + /// This interface allows consumers to provide a custom API accessor client. + /// + public interface IAsynchronousClient + { + /// + /// Executes a non-blocking call to some using the GET http verb. + /// + /// The relative path to invoke. + /// The request parameters to pass along to the client. + /// Per-request configurable settings. + /// Cancellation Token to cancel the request. + /// The return type. + /// A task eventually representing the response data, decorated with + Task> GetAsync(string path, RequestOptions options, IReadableConfiguration configuration = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)); + + /// + /// Executes a non-blocking call to some using the POST http verb. + /// + /// The relative path to invoke. + /// The request parameters to pass along to the client. + /// Per-request configurable settings. + /// Cancellation Token to cancel the request. + /// The return type. + /// A task eventually representing the response data, decorated with + Task> PostAsync(string path, RequestOptions options, IReadableConfiguration configuration = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)); + + /// + /// Executes a non-blocking call to some using the PUT http verb. + /// + /// The relative path to invoke. + /// The request parameters to pass along to the client. + /// Per-request configurable settings. + /// Cancellation Token to cancel the request. + /// The return type. + /// A task eventually representing the response data, decorated with + Task> PutAsync(string path, RequestOptions options, IReadableConfiguration configuration = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)); + + /// + /// Executes a non-blocking call to some using the DELETE http verb. + /// + /// The relative path to invoke. + /// The request parameters to pass along to the client. + /// Per-request configurable settings. + /// Cancellation Token to cancel the request. + /// The return type. + /// A task eventually representing the response data, decorated with + Task> DeleteAsync(string path, RequestOptions options, IReadableConfiguration configuration = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)); + + /// + /// Executes a non-blocking call to some using the HEAD http verb. + /// + /// The relative path to invoke. + /// The request parameters to pass along to the client. + /// Per-request configurable settings. + /// Cancellation Token to cancel the request. + /// The return type. + /// A task eventually representing the response data, decorated with + Task> HeadAsync(string path, RequestOptions options, IReadableConfiguration configuration = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)); + + /// + /// Executes a non-blocking call to some using the OPTIONS http verb. + /// + /// The relative path to invoke. + /// The request parameters to pass along to the client. + /// Per-request configurable settings. + /// Cancellation Token to cancel the request. + /// The return type. + /// A task eventually representing the response data, decorated with + Task> OptionsAsync(string path, RequestOptions options, IReadableConfiguration configuration = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)); + + /// + /// Executes a non-blocking call to some using the PATCH http verb. + /// + /// The relative path to invoke. + /// The request parameters to pass along to the client. + /// Per-request configurable settings. + /// Cancellation Token to cancel the request. + /// The return type. + /// A task eventually representing the response data, decorated with + Task> PatchAsync(string path, RequestOptions options, IReadableConfiguration configuration = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)); + } +} diff --git a/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Client/IReadableConfiguration.cs b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Client/IReadableConfiguration.cs new file mode 100644 index 0000000..9e52317 --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Client/IReadableConfiguration.cs @@ -0,0 +1,141 @@ +/* + * Topica.Server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + * + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + + +using System; +using System.Collections.Generic; +using System.Net; +using System.Net.Security; +using System.Security.Cryptography.X509Certificates; + +namespace Topica.Client.Client +{ + /// + /// Represents a readable-only configuration contract. + /// + public interface IReadableConfiguration + { + /// + /// Gets the access token. + /// + /// Access token. + string AccessToken { get; } + + /// + /// Gets the API key. + /// + /// API key. + IDictionary ApiKey { get; } + + /// + /// Gets the API key prefix. + /// + /// API key prefix. + IDictionary ApiKeyPrefix { get; } + + /// + /// Gets the base path. + /// + /// Base path. + string BasePath { get; } + + /// + /// Gets the date time format. + /// + /// Date time format. + string DateTimeFormat { get; } + + /// + /// Gets the default header. + /// + /// Default header. + [Obsolete("Use DefaultHeaders instead.")] + IDictionary DefaultHeader { get; } + + /// + /// Gets the default headers. + /// + /// Default headers. + IDictionary DefaultHeaders { get; } + + /// + /// Gets the temp folder path. + /// + /// Temp folder path. + string TempFolderPath { get; } + + /// + /// Gets the HTTP connection timeout (in milliseconds) + /// + /// HTTP connection timeout. + int Timeout { get; } + + /// + /// Gets the proxy. + /// + /// Proxy. + WebProxy Proxy { get; } + + /// + /// Gets the user agent. + /// + /// User agent. + string UserAgent { get; } + + /// + /// Gets the username. + /// + /// Username. + string Username { get; } + + /// + /// Gets the password. + /// + /// Password. + string Password { get; } + + /// + /// Determine whether or not the "default credentials" (e.g. the user account under which the current process is running) will be sent along to the server. The default is false. + /// + bool UseDefaultCredentials { get; } + + /// + /// Get the servers associated with the operation. + /// + /// Operation servers. + IReadOnlyDictionary>> OperationServers { get; } + + /// + /// Gets the API key with prefix. + /// + /// API key identifier (authentication scheme). + /// API key with prefix. + string GetApiKeyWithPrefix(string apiKeyIdentifier); + + /// + /// Gets the Operation server url at the provided index. + /// + /// Operation server name. + /// Index of the operation server settings. + /// + string GetOperationServerUrl(string operation, int index); + + /// + /// Gets certificate collection to be sent with requests. + /// + /// X509 Certificate collection. + X509CertificateCollection ClientCertificates { get; } + + /// + /// Callback function for handling the validation of remote certificates. Useful for certificate pinning and + /// overriding certificate errors in the scope of a request. + /// + RemoteCertificateValidationCallback RemoteCertificateValidationCallback { get; } + } +} diff --git a/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Client/ISynchronousClient.cs b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Client/ISynchronousClient.cs new file mode 100644 index 0000000..216fa93 --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Client/ISynchronousClient.cs @@ -0,0 +1,93 @@ +/* + * Topica.Server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + * + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + + +using System; +using System.IO; + +namespace Topica.Client.Client +{ + /// + /// Contract for Synchronous RESTful API interactions. + /// + /// This interface allows consumers to provide a custom API accessor client. + /// + public interface ISynchronousClient + { + /// + /// Executes a blocking call to some using the GET http verb. + /// + /// The relative path to invoke. + /// The request parameters to pass along to the client. + /// Per-request configurable settings. + /// The return type. + /// The response data, decorated with + ApiResponse Get(string path, RequestOptions options, IReadableConfiguration configuration = null); + + /// + /// Executes a blocking call to some using the POST http verb. + /// + /// The relative path to invoke. + /// The request parameters to pass along to the client. + /// Per-request configurable settings. + /// The return type. + /// The response data, decorated with + ApiResponse Post(string path, RequestOptions options, IReadableConfiguration configuration = null); + + /// + /// Executes a blocking call to some using the PUT http verb. + /// + /// The relative path to invoke. + /// The request parameters to pass along to the client. + /// Per-request configurable settings. + /// The return type. + /// The response data, decorated with + ApiResponse Put(string path, RequestOptions options, IReadableConfiguration configuration = null); + + /// + /// Executes a blocking call to some using the DELETE http verb. + /// + /// The relative path to invoke. + /// The request parameters to pass along to the client. + /// Per-request configurable settings. + /// The return type. + /// The response data, decorated with + ApiResponse Delete(string path, RequestOptions options, IReadableConfiguration configuration = null); + + /// + /// Executes a blocking call to some using the HEAD http verb. + /// + /// The relative path to invoke. + /// The request parameters to pass along to the client. + /// Per-request configurable settings. + /// The return type. + /// The response data, decorated with + ApiResponse Head(string path, RequestOptions options, IReadableConfiguration configuration = null); + + /// + /// Executes a blocking call to some using the OPTIONS http verb. + /// + /// The relative path to invoke. + /// The request parameters to pass along to the client. + /// Per-request configurable settings. + /// The return type. + /// The response data, decorated with + ApiResponse Options(string path, RequestOptions options, IReadableConfiguration configuration = null); + + /// + /// Executes a blocking call to some using the PATCH http verb. + /// + /// The relative path to invoke. + /// The request parameters to pass along to the client. + /// Per-request configurable settings. + /// The return type. + /// The response data, decorated with + ApiResponse Patch(string path, RequestOptions options, IReadableConfiguration configuration = null); + } +} diff --git a/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Client/Multimap.cs b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Client/Multimap.cs new file mode 100644 index 0000000..7b622d0 --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Client/Multimap.cs @@ -0,0 +1,295 @@ +/* + * Topica.Server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + * + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + + +using System; +using System.Collections; +using System.Collections.Generic; + +namespace Topica.Client.Client +{ + /// + /// A dictionary in which one key has many associated values. + /// + /// The type of the key + /// The type of the value associated with the key. + public class Multimap : IDictionary> + { + #region Private Fields + + private readonly Dictionary> _dictionary; + + #endregion Private Fields + + #region Constructors + + /// + /// Empty Constructor. + /// + public Multimap() + { + _dictionary = new Dictionary>(); + } + + /// + /// Constructor with comparer. + /// + /// + public Multimap(IEqualityComparer comparer) + { + _dictionary = new Dictionary>(comparer); + } + + #endregion Constructors + + #region Enumerators + + /// + /// To get the enumerator. + /// + /// Enumerator + public IEnumerator>> GetEnumerator() + { + return _dictionary.GetEnumerator(); + } + + /// + /// To get the enumerator. + /// + /// Enumerator + IEnumerator IEnumerable.GetEnumerator() + { + return _dictionary.GetEnumerator(); + } + + #endregion Enumerators + + #region Public Members + /// + /// Add values to Multimap + /// + /// Key value pair + public void Add(KeyValuePair> item) + { + if (!TryAdd(item.Key, item.Value)) + throw new InvalidOperationException("Could not add values to Multimap."); + } + + /// + /// Add Multimap to Multimap + /// + /// Multimap + public void Add(Multimap multimap) + { + foreach (var item in multimap) + { + if (!TryAdd(item.Key, item.Value)) + throw new InvalidOperationException("Could not add values to Multimap."); + } + } + + /// + /// Clear Multimap + /// + public void Clear() + { + _dictionary.Clear(); + } + + /// + /// Determines whether Multimap contains the specified item. + /// + /// Key value pair + /// Method needs to be implemented + /// true if the Multimap contains the item; otherwise, false. + public bool Contains(KeyValuePair> item) + { + throw new NotImplementedException(); + } + + /// + /// Copy items of the Multimap to an array, + /// starting at a particular array index. + /// + /// The array that is the destination of the items copied + /// from Multimap. The array must have zero-based indexing. + /// The zero-based index in array at which copying begins. + /// Method needs to be implemented + public void CopyTo(KeyValuePair>[] array, int arrayIndex) + { + throw new NotImplementedException(); + } + + /// + /// Removes the specified item from the Multimap. + /// + /// Key value pair + /// true if the item is successfully removed; otherwise, false. + /// Method needs to be implemented + public bool Remove(KeyValuePair> item) + { + throw new NotImplementedException(); + } + + /// + /// Gets the number of items contained in the Multimap. + /// + public int Count => _dictionary.Count; + + /// + /// Gets a value indicating whether the Multimap is read-only. + /// + public bool IsReadOnly => false; + + /// + /// Adds an item with the provided key and value to the Multimap. + /// + /// The object to use as the key of the item to add. + /// The object to use as the value of the item to add. + /// Thrown when couldn't add the value to Multimap. + public void Add(TKey key, IList value) + { + if (value != null && value.Count > 0) + { + if (_dictionary.TryGetValue(key, out var list)) + { + foreach (var k in value) list.Add(k); + } + else + { + list = new List(value); + if (!TryAdd(key, list)) + throw new InvalidOperationException("Could not add values to Multimap."); + } + } + } + + /// + /// Determines whether the Multimap contains an item with the specified key. + /// + /// The key to locate in the Multimap. + /// true if the Multimap contains an item with + /// the key; otherwise, false. + public bool ContainsKey(TKey key) + { + return _dictionary.ContainsKey(key); + } + + /// + /// Removes item with the specified key from the Multimap. + /// + /// The key to locate in the Multimap. + /// true if the item is successfully removed; otherwise, false. + public bool Remove(TKey key) + { + return TryRemove(key, out var _); + } + + /// + /// Gets the value associated with the specified key. + /// + /// The key whose value to get. + /// When this method returns, the value associated with the specified key, if the + /// key is found; otherwise, the default value for the type of the value parameter. + /// This parameter is passed uninitialized. + /// true if the object that implements Multimap contains + /// an item with the specified key; otherwise, false. + public bool TryGetValue(TKey key, out IList value) + { + return _dictionary.TryGetValue(key, out value); + } + + /// + /// Gets or sets the item with the specified key. + /// + /// The key of the item to get or set. + /// The value of the specified key. + public IList this[TKey key] + { + get => _dictionary[key]; + set => _dictionary[key] = value; + } + + /// + /// Gets a System.Collections.Generic.ICollection containing the keys of the Multimap. + /// + public ICollection Keys => _dictionary.Keys; + + /// + /// Gets a System.Collections.Generic.ICollection containing the values of the Multimap. + /// + public ICollection> Values => _dictionary.Values; + + /// + /// Copy the items of the Multimap to an System.Array, + /// starting at a particular System.Array index. + /// + /// The one-dimensional System.Array that is the destination of the items copied + /// from Multimap. The System.Array must have zero-based indexing. + /// The zero-based index in array at which copying begins. + public void CopyTo(Array array, int index) + { + ((ICollection)_dictionary).CopyTo(array, index); + } + + /// + /// Adds an item with the provided key and value to the Multimap. + /// + /// The object to use as the key of the item to add. + /// The object to use as the value of the item to add. + /// Thrown when couldn't add value to Multimap. + public void Add(TKey key, TValue value) + { + if (value != null) + { + if (_dictionary.TryGetValue(key, out var list)) + { + list.Add(value); + } + else + { + list = new List { value }; + if (!TryAdd(key, list)) + throw new InvalidOperationException("Could not add value to Multimap."); + } + } + } + + #endregion Public Members + + #region Private Members + + /** + * Helper method to encapsulate generator differences between dictionary types. + */ + private bool TryRemove(TKey key, out IList value) + { + _dictionary.TryGetValue(key, out value); + return _dictionary.Remove(key); + } + + /** + * Helper method to encapsulate generator differences between dictionary types. + */ + private bool TryAdd(TKey key, IList value) + { + try + { + _dictionary.Add(key, value); + } + catch (ArgumentException) + { + return false; + } + + return true; + } + #endregion Private Members + } +} diff --git a/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Client/OpenAPIDateConverter.cs b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Client/OpenAPIDateConverter.cs new file mode 100644 index 0000000..1d602e5 --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Client/OpenAPIDateConverter.cs @@ -0,0 +1,29 @@ +/* + * Topica.Server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + * + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + +using Newtonsoft.Json.Converters; + +namespace Topica.Client.Client +{ + /// + /// Formatter for 'date' openapi formats ss defined by full-date - RFC3339 + /// see https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md#data-types + /// + public class OpenAPIDateConverter : IsoDateTimeConverter + { + /// + /// Initializes a new instance of the class. + /// + public OpenAPIDateConverter() + { + // full-date = date-fullyear "-" date-month "-" date-mday + DateTimeFormat = "yyyy-MM-dd"; + } + } +} diff --git a/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Client/RequestOptions.cs b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Client/RequestOptions.cs new file mode 100644 index 0000000..16f4448 --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Client/RequestOptions.cs @@ -0,0 +1,84 @@ +/* + * Topica.Server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + * + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + + +using System; +using System.Collections.Generic; +using System.IO; +using System.Net; + +namespace Topica.Client.Client +{ + /// + /// A container for generalized request inputs. This type allows consumers to extend the request functionality + /// by abstracting away from the default (built-in) request framework (e.g. RestSharp). + /// + public class RequestOptions + { + /// + /// Parameters to be bound to path parts of the Request's URL + /// + public Dictionary PathParameters { get; set; } + + /// + /// Query parameters to be applied to the request. + /// Keys may have 1 or more values associated. + /// + public Multimap QueryParameters { get; set; } + + /// + /// Header parameters to be applied to the request. + /// Keys may have 1 or more values associated. + /// + public Multimap HeaderParameters { get; set; } + + /// + /// Form parameters to be sent along with the request. + /// + public Dictionary FormParameters { get; set; } + + /// + /// File parameters to be sent along with the request. + /// + public Multimap FileParameters { get; set; } + + /// + /// Cookies to be sent along with the request. + /// + public List Cookies { get; set; } + + /// + /// Operation associated with the request path. + /// + public string Operation { get; set; } + + /// + /// Index associated with the operation. + /// + public int OperationIndex { get; set; } + + /// + /// Any data associated with a request body. + /// + public Object Data { get; set; } + + /// + /// Constructs a new instance of + /// + public RequestOptions() + { + PathParameters = new Dictionary(); + QueryParameters = new Multimap(); + HeaderParameters = new Multimap(); + FormParameters = new Dictionary(); + FileParameters = new Multimap(); + Cookies = new List(); + } + } +} diff --git a/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Client/RetryConfiguration.cs b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Client/RetryConfiguration.cs new file mode 100644 index 0000000..a17f2a2 --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Client/RetryConfiguration.cs @@ -0,0 +1,31 @@ +/* + * Topica.Server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + * + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + + +using Polly; +using RestSharp; + +namespace Topica.Client.Client +{ + /// + /// Configuration class to set the polly retry policies to be applied to the requests. + /// + public static class RetryConfiguration + { + /// + /// Retry policy + /// + public static Policy RetryPolicy { get; set; } + + /// + /// Async retry policy + /// + public static AsyncPolicy AsyncRetryPolicy { get; set; } + } +} diff --git a/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Model/AbstractOpenAPISchema.cs b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Model/AbstractOpenAPISchema.cs new file mode 100644 index 0000000..12fd883 --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Model/AbstractOpenAPISchema.cs @@ -0,0 +1,76 @@ +/* + * Topica.Server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + * + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + + +using System; +using Newtonsoft.Json; +using Newtonsoft.Json.Serialization; + +namespace Topica.Client.Model +{ + /// + /// Abstract base class for oneOf, anyOf schemas in the OpenAPI specification + /// + public abstract partial class AbstractOpenAPISchema + { + /// + /// Custom JSON serializer + /// + static public readonly JsonSerializerSettings SerializerSettings = new JsonSerializerSettings + { + // OpenAPI generated types generally hide default constructors. + ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor, + MissingMemberHandling = MissingMemberHandling.Error, + ContractResolver = new DefaultContractResolver + { + NamingStrategy = new CamelCaseNamingStrategy + { + OverrideSpecifiedNames = false + } + } + }; + + /// + /// Custom JSON serializer for objects with additional properties + /// + static public readonly JsonSerializerSettings AdditionalPropertiesSerializerSettings = new JsonSerializerSettings + { + // OpenAPI generated types generally hide default constructors. + ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor, + MissingMemberHandling = MissingMemberHandling.Ignore, + ContractResolver = new DefaultContractResolver + { + NamingStrategy = new CamelCaseNamingStrategy + { + OverrideSpecifiedNames = false + } + } + }; + + /// + /// Gets or Sets the actual instance + /// + public abstract Object ActualInstance { get; set; } + + /// + /// Gets or Sets IsNullable to indicate whether the instance is nullable + /// + public bool IsNullable { get; protected set; } + + /// + /// Gets or Sets the schema type, which can be either `oneOf` or `anyOf` + /// + public string SchemaType { get; protected set; } + + /// + /// Converts the instance into JSON string. + /// + public abstract string ToJson(); + } +} diff --git a/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Model/Entry.cs b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Model/Entry.cs new file mode 100644 index 0000000..fe4e9ba --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Model/Entry.cs @@ -0,0 +1,100 @@ +/* + * Topica.Server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + * + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.IO; +using System.Runtime.Serialization; +using System.Text; +using System.Text.RegularExpressions; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; +using Newtonsoft.Json.Linq; +using System.ComponentModel.DataAnnotations; +using OpenAPIDateConverter = Topica.Client.Client.OpenAPIDateConverter; + +namespace Topica.Client.Model +{ + /// + /// Entry + /// + [DataContract(Name = "Entry")] + public partial class Entry : IValidatableObject + { + /// + /// Initializes a new instance of the class. + /// + /// createdOn. + /// content. + /// entryId. + public Entry(DateTime createdOn = default(DateTime), string content = default(string), Guid entryId = default(Guid)) + { + this.CreatedOn = createdOn; + this.Content = content; + this.EntryId = entryId; + } + + /// + /// Gets or Sets CreatedOn + /// + [DataMember(Name = "createdOn", EmitDefaultValue = false)] + public DateTime CreatedOn { get; set; } + + /// + /// Gets or Sets Content + /// + [DataMember(Name = "content", EmitDefaultValue = true)] + public string Content { get; set; } + + /// + /// Gets or Sets EntryId + /// + [DataMember(Name = "entryId", EmitDefaultValue = false)] + public Guid EntryId { get; set; } + + /// + /// Returns the string presentation of the object + /// + /// String presentation of the object + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + sb.Append("class Entry {\n"); + sb.Append(" CreatedOn: ").Append(CreatedOn).Append("\n"); + sb.Append(" Content: ").Append(Content).Append("\n"); + sb.Append(" EntryId: ").Append(EntryId).Append("\n"); + sb.Append("}\n"); + return sb.ToString(); + } + + /// + /// Returns the JSON string presentation of the object + /// + /// JSON string presentation of the object + public virtual string ToJson() + { + return Newtonsoft.Json.JsonConvert.SerializeObject(this, Newtonsoft.Json.Formatting.Indented); + } + + /// + /// To validate all properties of the instance + /// + /// Validation context + /// Validation Result + IEnumerable IValidatableObject.Validate(ValidationContext validationContext) + { + yield break; + } + } + +} diff --git a/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Model/LoginModel.cs b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Model/LoginModel.cs new file mode 100644 index 0000000..03e4188 --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Model/LoginModel.cs @@ -0,0 +1,91 @@ +/* + * Topica.Server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + * + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.IO; +using System.Runtime.Serialization; +using System.Text; +using System.Text.RegularExpressions; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; +using Newtonsoft.Json.Linq; +using System.ComponentModel.DataAnnotations; +using OpenAPIDateConverter = Topica.Client.Client.OpenAPIDateConverter; + +namespace Topica.Client.Model +{ + /// + /// LoginModel + /// + [DataContract(Name = "LoginModel")] + public partial class LoginModel : IValidatableObject + { + /// + /// Initializes a new instance of the class. + /// + /// username. + /// password. + public LoginModel(string username = default(string), string password = default(string)) + { + this.Username = username; + this.Password = password; + } + + /// + /// Gets or Sets Username + /// + [DataMember(Name = "username", EmitDefaultValue = true)] + public string Username { get; set; } + + /// + /// Gets or Sets Password + /// + [DataMember(Name = "password", EmitDefaultValue = true)] + public string Password { get; set; } + + /// + /// Returns the string presentation of the object + /// + /// String presentation of the object + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + sb.Append("class LoginModel {\n"); + sb.Append(" Username: ").Append(Username).Append("\n"); + sb.Append(" Password: ").Append(Password).Append("\n"); + sb.Append("}\n"); + return sb.ToString(); + } + + /// + /// Returns the JSON string presentation of the object + /// + /// JSON string presentation of the object + public virtual string ToJson() + { + return Newtonsoft.Json.JsonConvert.SerializeObject(this, Newtonsoft.Json.Formatting.Indented); + } + + /// + /// To validate all properties of the instance + /// + /// Validation context + /// Validation Result + IEnumerable IValidatableObject.Validate(ValidationContext validationContext) + { + yield break; + } + } + +} diff --git a/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Model/ProblemDetails.cs b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Model/ProblemDetails.cs new file mode 100644 index 0000000..48af250 --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Model/ProblemDetails.cs @@ -0,0 +1,126 @@ +/* + * Topica.Server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + * + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.IO; +using System.Runtime.Serialization; +using System.Text; +using System.Text.RegularExpressions; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; +using Newtonsoft.Json.Linq; +using System.ComponentModel.DataAnnotations; +using OpenAPIDateConverter = Topica.Client.Client.OpenAPIDateConverter; + +namespace Topica.Client.Model +{ + /// + /// ProblemDetails + /// + [DataContract(Name = "ProblemDetails")] + public partial class ProblemDetails : IValidatableObject + { + /// + /// Initializes a new instance of the class. + /// + /// type. + /// title. + /// status. + /// detail. + /// instance. + public ProblemDetails(string type = default(string), string title = default(string), int? status = default(int?), string detail = default(string), string instance = default(string)) + { + this.Type = type; + this.Title = title; + this.Status = status; + this.Detail = detail; + this.Instance = instance; + this.AdditionalProperties = new Dictionary(); + } + + /// + /// Gets or Sets Type + /// + [DataMember(Name = "type", EmitDefaultValue = true)] + public string Type { get; set; } + + /// + /// Gets or Sets Title + /// + [DataMember(Name = "title", EmitDefaultValue = true)] + public string Title { get; set; } + + /// + /// Gets or Sets Status + /// + [DataMember(Name = "status", EmitDefaultValue = true)] + public int? Status { get; set; } + + /// + /// Gets or Sets Detail + /// + [DataMember(Name = "detail", EmitDefaultValue = true)] + public string Detail { get; set; } + + /// + /// Gets or Sets Instance + /// + [DataMember(Name = "instance", EmitDefaultValue = true)] + public string Instance { get; set; } + + /// + /// Gets or Sets additional properties + /// + [JsonExtensionData] + public IDictionary AdditionalProperties { get; set; } + + /// + /// Returns the string presentation of the object + /// + /// String presentation of the object + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + sb.Append("class ProblemDetails {\n"); + sb.Append(" Type: ").Append(Type).Append("\n"); + sb.Append(" Title: ").Append(Title).Append("\n"); + sb.Append(" Status: ").Append(Status).Append("\n"); + sb.Append(" Detail: ").Append(Detail).Append("\n"); + sb.Append(" Instance: ").Append(Instance).Append("\n"); + sb.Append(" AdditionalProperties: ").Append(AdditionalProperties).Append("\n"); + sb.Append("}\n"); + return sb.ToString(); + } + + /// + /// Returns the JSON string presentation of the object + /// + /// JSON string presentation of the object + public virtual string ToJson() + { + return Newtonsoft.Json.JsonConvert.SerializeObject(this, Newtonsoft.Json.Formatting.Indented); + } + + /// + /// To validate all properties of the instance + /// + /// Validation context + /// Validation Result + IEnumerable IValidatableObject.Validate(ValidationContext validationContext) + { + yield break; + } + } + +} diff --git a/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Model/Topic.cs b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Model/Topic.cs new file mode 100644 index 0000000..ce9c29e --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Model/Topic.cs @@ -0,0 +1,100 @@ +/* + * Topica.Server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + * + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.IO; +using System.Runtime.Serialization; +using System.Text; +using System.Text.RegularExpressions; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; +using Newtonsoft.Json.Linq; +using System.ComponentModel.DataAnnotations; +using OpenAPIDateConverter = Topica.Client.Client.OpenAPIDateConverter; + +namespace Topica.Client.Model +{ + /// + /// Topic + /// + [DataContract(Name = "Topic")] + public partial class Topic : IValidatableObject + { + /// + /// Initializes a new instance of the class. + /// + /// id. + /// createdOn. + /// history. + public Topic(string id = default(string), DateTime createdOn = default(DateTime), List history = default(List)) + { + this.Id = id; + this.CreatedOn = createdOn; + this.History = history; + } + + /// + /// Gets or Sets Id + /// + [DataMember(Name = "id", EmitDefaultValue = true)] + public string Id { get; set; } + + /// + /// Gets or Sets CreatedOn + /// + [DataMember(Name = "createdOn", EmitDefaultValue = false)] + public DateTime CreatedOn { get; set; } + + /// + /// Gets or Sets History + /// + [DataMember(Name = "history", EmitDefaultValue = true)] + public List History { get; set; } + + /// + /// Returns the string presentation of the object + /// + /// String presentation of the object + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + sb.Append("class Topic {\n"); + sb.Append(" Id: ").Append(Id).Append("\n"); + sb.Append(" CreatedOn: ").Append(CreatedOn).Append("\n"); + sb.Append(" History: ").Append(History).Append("\n"); + sb.Append("}\n"); + return sb.ToString(); + } + + /// + /// Returns the JSON string presentation of the object + /// + /// JSON string presentation of the object + public virtual string ToJson() + { + return Newtonsoft.Json.JsonConvert.SerializeObject(this, Newtonsoft.Json.Formatting.Indented); + } + + /// + /// To validate all properties of the instance + /// + /// Validation context + /// Validation Result + IEnumerable IValidatableObject.Validate(ValidationContext validationContext) + { + yield break; + } + } + +} diff --git a/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Model/TopicMeta.cs b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Model/TopicMeta.cs new file mode 100644 index 0000000..000544d --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Model/TopicMeta.cs @@ -0,0 +1,91 @@ +/* + * Topica.Server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + * + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.IO; +using System.Runtime.Serialization; +using System.Text; +using System.Text.RegularExpressions; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; +using Newtonsoft.Json.Linq; +using System.ComponentModel.DataAnnotations; +using OpenAPIDateConverter = Topica.Client.Client.OpenAPIDateConverter; + +namespace Topica.Client.Model +{ + /// + /// TopicMeta + /// + [DataContract(Name = "TopicMeta")] + public partial class TopicMeta : IValidatableObject + { + /// + /// Initializes a new instance of the class. + /// + /// id. + /// createdOn. + public TopicMeta(string id = default(string), DateTime createdOn = default(DateTime)) + { + this.Id = id; + this.CreatedOn = createdOn; + } + + /// + /// Gets or Sets Id + /// + [DataMember(Name = "id", EmitDefaultValue = true)] + public string Id { get; set; } + + /// + /// Gets or Sets CreatedOn + /// + [DataMember(Name = "createdOn", EmitDefaultValue = false)] + public DateTime CreatedOn { get; set; } + + /// + /// Returns the string presentation of the object + /// + /// String presentation of the object + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + sb.Append("class TopicMeta {\n"); + sb.Append(" Id: ").Append(Id).Append("\n"); + sb.Append(" CreatedOn: ").Append(CreatedOn).Append("\n"); + sb.Append("}\n"); + return sb.ToString(); + } + + /// + /// Returns the JSON string presentation of the object + /// + /// JSON string presentation of the object + public virtual string ToJson() + { + return Newtonsoft.Json.JsonConvert.SerializeObject(this, Newtonsoft.Json.Formatting.Indented); + } + + /// + /// To validate all properties of the instance + /// + /// Validation context + /// Validation Result + IEnumerable IValidatableObject.Validate(ValidationContext validationContext) + { + yield break; + } + } + +} diff --git a/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Model/TopicMetaPaginatedResponse.cs b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Model/TopicMetaPaginatedResponse.cs new file mode 100644 index 0000000..94b89fa --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Model/TopicMetaPaginatedResponse.cs @@ -0,0 +1,109 @@ +/* + * Topica.Server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + * + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0 + * Generated by: https://github.com/openapitools/openapi-generator.git + */ + + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.IO; +using System.Runtime.Serialization; +using System.Text; +using System.Text.RegularExpressions; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; +using Newtonsoft.Json.Linq; +using System.ComponentModel.DataAnnotations; +using OpenAPIDateConverter = Topica.Client.Client.OpenAPIDateConverter; + +namespace Topica.Client.Model +{ + /// + /// TopicMetaPaginatedResponse + /// + [DataContract(Name = "TopicMetaPaginatedResponse")] + public partial class TopicMetaPaginatedResponse : IValidatableObject + { + /// + /// Initializes a new instance of the class. + /// + /// data. + /// page. + /// pageSize. + /// total. + public TopicMetaPaginatedResponse(List data = default(List), int page = default(int), int pageSize = default(int), int total = default(int)) + { + this.Data = data; + this.Page = page; + this.PageSize = pageSize; + this.Total = total; + } + + /// + /// Gets or Sets Data + /// + [DataMember(Name = "data", EmitDefaultValue = true)] + public List Data { get; set; } + + /// + /// Gets or Sets Page + /// + [DataMember(Name = "page", EmitDefaultValue = false)] + public int Page { get; set; } + + /// + /// Gets or Sets PageSize + /// + [DataMember(Name = "pageSize", EmitDefaultValue = false)] + public int PageSize { get; set; } + + /// + /// Gets or Sets Total + /// + [DataMember(Name = "total", EmitDefaultValue = false)] + public int Total { get; set; } + + /// + /// Returns the string presentation of the object + /// + /// String presentation of the object + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + sb.Append("class TopicMetaPaginatedResponse {\n"); + sb.Append(" Data: ").Append(Data).Append("\n"); + sb.Append(" Page: ").Append(Page).Append("\n"); + sb.Append(" PageSize: ").Append(PageSize).Append("\n"); + sb.Append(" Total: ").Append(Total).Append("\n"); + sb.Append("}\n"); + return sb.ToString(); + } + + /// + /// Returns the JSON string presentation of the object + /// + /// JSON string presentation of the object + public virtual string ToJson() + { + return Newtonsoft.Json.JsonConvert.SerializeObject(this, Newtonsoft.Json.Formatting.Indented); + } + + /// + /// To validate all properties of the instance + /// + /// Validation context + /// Validation Result + IEnumerable IValidatableObject.Validate(ValidationContext validationContext) + { + yield break; + } + } + +} diff --git a/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Topica.Client.csproj b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Topica.Client.csproj new file mode 100644 index 0000000..1b7f518 --- /dev/null +++ b/Source/Clients/CSharp/Topica.Client/src/Topica.Client/Topica.Client.csproj @@ -0,0 +1,36 @@ + + + + false + net8.0 + Topica.Client + Topica.Client + Library + OpenAPI + OpenAPI + OpenAPI Library + A library generated from a OpenAPI doc + No Copyright + Topica.Client + 0.0.1 + bin\$(Configuration)\$(TargetFramework)\Topica.Client.xml + https://github.com/GIT_USER_ID/GIT_REPO_ID.git + git + Minor update + annotations + + + + + + + + + + + + + + + + diff --git a/Source/Clients/TypeScript/Topica.Client/pnpm-lock.yaml b/Source/Clients/TypeScript/Topica.Client/pnpm-lock.yaml deleted file mode 100644 index 6caa17f..0000000 --- a/Source/Clients/TypeScript/Topica.Client/pnpm-lock.yaml +++ /dev/null @@ -1,18 +0,0 @@ -lockfileVersion: '6.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -devDependencies: - typescript: - specifier: ^4.0 - version: 4.9.5 - -packages: - - /typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true - dev: true diff --git a/Source/Scripts/GenerateCode.ts b/Source/Scripts/GenerateCode.ts index d304a01..29436d9 100644 --- a/Source/Scripts/GenerateCode.ts +++ b/Source/Scripts/GenerateCode.ts @@ -21,7 +21,8 @@ if (!fse.existsSync(CodeGenPath)) fse.mkdirsSync(CodeGenPath); const swaggerFile = `temp/Swagger/${appName}.Server/Swagger.json` -execute(`npx @openapitools/openapi-generator-cli version-manager set 7.2.0`) +execute("npx @openapitools/openapi-generator-cli version-manager set 7.2.0") +execute(`npx @openapitools/openapi-generator-cli generate -i ${swaggerFile} -g csharp -o ${CodeGenPath}/CSharp/${appName}.Client --additional-properties=packageVersion=${version},packageName=${appName}.Client,nullableReferenceTypes=true`) execute(`npx @openapitools/openapi-generator-cli generate -i ${swaggerFile} -g rust -o ${CodeGenPath}/Rust/${appName}.Client --additional-properties=packageVersion=${version},packageName=${lowered}_client`) execute(`npx @openapitools/openapi-generator-cli generate -i ${swaggerFile} -g typescript-fetch -o ${CodeGenPath}/TypeScript/${appName}.Client -p npmName=@${lowered}/client --additional-properties=npmVersion=${version},stringEnums=true`) execute(`npx @openapitools/openapi-generator-cli generate -i ${swaggerFile} -g go -o ${CodeGenPath}/Go/${appName}.Client --additional-properties=enumClassPrefix=true,packageVersion=${version},packageName=${lowered}client`)