[windows] Fixed missing output (#19715)

* fixed missing output

* bug fix

* add new sample

* build samples again

* delete sample

* move the sample and add to github workflow

* remove model not needed for this test

* handle specs with no models
This commit is contained in:
devhl-labs
2024-10-06 22:58:05 -04:00
committed by GitHub
parent 6745340c64
commit 28ae69dafd
56 changed files with 4308 additions and 8 deletions
+2
View File
@@ -142,6 +142,8 @@ jobs:
path: modules/openapi-generator-cli/target
- name: Delete samples that are entirely generated
run: |
rm -rf samples/client/petstore/csharp/generichost/latest/Tags
rm -rf samples/client/petstore/csharp/generichost/net8/AllOf
rm -rf samples/client/petstore/csharp/generichost/net8/AnyOf
rm -rf samples/client/petstore/csharp/generichost/net8/AnyOfNoCompare
+3
View File
@@ -3,12 +3,14 @@ name: Samples C# .Net 8 Clients
on:
push:
paths:
- samples/client/petstore/csharp/generichost/latest/**
- samples/client/petstore/csharp/generichost/net8/**
- samples/client/petstore/csharp/httpclient/net8/**
- samples/client/petstore/csharp/restsharp/net8/**
- samples/client/petstore/csharp/unityWebRequest/net8/**
pull_request:
paths:
- samples/client/petstore/csharp/generichost/latest/**
- samples/client/petstore/csharp/generichost/net8/**
- samples/client/petstore/csharp/httpclient/net8/**
- samples/client/petstore/csharp/restsharp/net8/**
@@ -21,6 +23,7 @@ jobs:
fail-fast: false
matrix:
sample:
- samples/client/petstore/csharp/generichost/latest/Tags
- samples/client/petstore/csharp/generichost/net8/AllOf
- samples/client/petstore/csharp/generichost/net8/AnyOf
- samples/client/petstore/csharp/generichost/net8/AnyOfNoCompare
@@ -0,0 +1,10 @@
# for csharp generichost
generatorName: csharp
outputDir: samples/client/petstore/csharp/generichost/latest/Tags
inputSpec: modules/openapi-generator/src/test/resources/3_0/csharp/tags.json
library: generichost
templateDir: modules/openapi-generator/src/main/resources/csharp
additionalProperties:
packageGuid: '{321C8C3F-0156-40C1-AE42-D59761FB9B6C}'
modelPropertySorting: alphabetical
operationParameterSorting: alphabetical
@@ -1456,7 +1456,7 @@ public class DefaultCodegen implements CodegenConfig {
}
/**
* Return the file name of the Api Test
* Return the file name of the Api
*
* @param name the file name of the Api
* @return the file name of the Api
@@ -5678,6 +5678,8 @@ public class DefaultCodegen implements CodegenConfig {
}
}
private final Map<String, Integer> seenOperationIds = new HashMap<String, Integer>();
/**
* Add operation to group
*
@@ -5698,13 +5700,18 @@ public class DefaultCodegen implements CodegenConfig {
}
// check for operationId uniqueness
String uniqueName = co.operationId;
int counter = 0;
int counter = seenOperationIds.getOrDefault(uniqueName, 0);
while(seenOperationIds.containsKey(uniqueName)) {
uniqueName = co.operationId + "_" + counter;
counter++;
}
for (CodegenOperation op : opList) {
if (uniqueName.equals(op.operationId)) {
uniqueName = co.operationId + "_" + counter;
counter++;
}
}
seenOperationIds.put(co.operationId, counter);
if (!co.operationId.equals(uniqueName)) {
LOGGER.warn("generated unique operationId `{}`", uniqueName);
}
@@ -6080,30 +6087,68 @@ public class DefaultCodegen implements CodegenConfig {
return result;
}
/**
* Return a value that is unique, suffixed with _index to make it unique
* Ensures generated files are unique when compared case-insensitive
* Not all operating systems support case-sensitive paths
*/
private String uniqueCaseInsensitiveString(String value, Map<String, String> seenValues) {
if (seenValues.keySet().contains(value)) {
return seenValues.get(value);
}
Optional<Entry<String,String>> foundEntry = seenValues.entrySet().stream().filter(v -> v.getValue().toLowerCase(Locale.ROOT).equals(value.toLowerCase(Locale.ROOT))).findAny();
if (foundEntry.isPresent()) {
int counter = 0;
String uniqueValue = value + "_" + counter;
while (seenValues.values().stream().map(v -> v.toLowerCase(Locale.ROOT)).collect(Collectors.toList()).contains(uniqueValue.toLowerCase(Locale.ROOT))) {
counter++;
uniqueValue = value + "_" + counter;
}
seenValues.put(value, uniqueValue);
return uniqueValue;
}
seenValues.put(value, value);
return value;
}
private final Map<String, String> seenApiFilenames = new HashMap<String, String>();
@Override
public String apiFilename(String templateName, String tag) {
String uniqueTag = uniqueCaseInsensitiveString(tag, seenApiFilenames);
String suffix = apiTemplateFiles().get(templateName);
return apiFileFolder() + File.separator + toApiFilename(tag) + suffix;
return apiFileFolder() + File.separator + toApiFilename(uniqueTag) + suffix;
}
@Override
public String apiFilename(String templateName, String tag, String outputDir) {
String uniqueTag = uniqueCaseInsensitiveString(tag, seenApiFilenames);
String suffix = apiTemplateFiles().get(templateName);
return outputDir + File.separator + toApiFilename(tag) + suffix;
return outputDir + File.separator + toApiFilename(uniqueTag) + suffix;
}
private final Map<String, String> seenModelFilenames = new HashMap<String, String>();
@Override
public String modelFilename(String templateName, String modelName) {
String uniqueModelName = uniqueCaseInsensitiveString(modelName, seenModelFilenames);
String suffix = modelTemplateFiles().get(templateName);
return modelFileFolder() + File.separator + toModelFilename(modelName) + suffix;
return modelFileFolder() + File.separator + toModelFilename(uniqueModelName) + suffix;
}
@Override
public String modelFilename(String templateName, String modelName, String outputDir) {
String uniqueModelName = uniqueCaseInsensitiveString(modelName, seenModelFilenames);
String suffix = modelTemplateFiles().get(templateName);
return outputDir + File.separator + toModelFilename(modelName) + suffix;
return outputDir + File.separator + toModelFilename(uniqueModelName) + suffix;
}
private final Map<String, String> seenApiDocFilenames = new HashMap<String, String>();
/**
* Return the full path and API documentation file
*
@@ -6113,11 +6158,14 @@ public class DefaultCodegen implements CodegenConfig {
*/
@Override
public String apiDocFilename(String templateName, String tag) {
String uniqueTag = uniqueCaseInsensitiveString(tag, seenApiDocFilenames);
String docExtension = getDocExtension();
String suffix = docExtension != null ? docExtension : apiDocTemplateFiles().get(templateName);
return apiDocFileFolder() + File.separator + toApiDocFilename(tag) + suffix;
return apiDocFileFolder() + File.separator + toApiDocFilename(uniqueTag) + suffix;
}
private final Map<String, String> seenApiTestFilenames = new HashMap<String, String>();
/**
* Return the full path and API test file
*
@@ -6127,8 +6175,9 @@ public class DefaultCodegen implements CodegenConfig {
*/
@Override
public String apiTestFilename(String templateName, String tag) {
String uniqueTag = uniqueCaseInsensitiveString(tag, seenApiTestFilenames);
String suffix = apiTestTemplateFiles().get(templateName);
return apiTestFileFolder() + File.separator + toApiTestFilename(tag) + suffix;
return apiTestFileFolder() + File.separator + toApiTestFilename(uniqueTag) + suffix;
}
@Override
@@ -1441,6 +1441,8 @@ public class DefaultGenerator implements Generator {
return processTemplateToFile(templateData, templateName, outputFilename, shouldGenerate, skippedByOption, this.config.getOutputDir());
}
private final Set<String> seenFiles = new HashSet<>();
private File processTemplateToFile(Map<String, Object> templateData, String templateName, String outputFilename, boolean shouldGenerate, String skippedByOption, String intendedOutputDir) throws IOException {
String adjustedOutputFilename = outputFilename.replaceAll("//", "/").replace('/', File.separatorChar);
File target = new File(adjustedOutputFilename);
@@ -1451,6 +1453,11 @@ public class DefaultGenerator implements Generator {
if (!absoluteTarget.startsWith(outDir)) {
throw new RuntimeException(String.format(Locale.ROOT, "Target files must be generated within the output directory; absoluteTarget=%s outDir=%s", absoluteTarget, outDir));
}
if (seenFiles.stream().filter(f -> f.toLowerCase(Locale.ROOT).equals(absoluteTarget.toString().toLowerCase(Locale.ROOT))).findAny().isPresent()) {
LOGGER.warn("Duplicate file path detected. Not all operating systems can handle case sensitive file paths. path={}", absoluteTarget.toString());
}
seenFiles.add(absoluteTarget.toString());
return this.templateProcessor.write(templateData, templateName, target);
} else {
this.templateProcessor.skip(target.toPath(), String.format(Locale.ROOT, "Skipped by %s options supplied by user.", skippedByOption));
@@ -12,7 +12,11 @@ using System.Text;
using System.Text.Json;
using System.Text.RegularExpressions;{{#useCompareNetObjects}}
using KellermanSoftware.CompareNetObjects;{{/useCompareNetObjects}}
{{#models}}
{{#-first}}
using {{packageName}}.{{modelPackage}};
{{/-first}}
{{/models}}
using System.Runtime.CompilerServices;
{{>Assembly}}namespace {{packageName}}.{{clientPackage}}
@@ -11,7 +11,11 @@ using System.Text.Json.Serialization;
using System.Net.Http;
using Microsoft.Extensions.DependencyInjection;
using {{packageName}}.{{apiPackage}};
{{#models}}
{{#-first}}
using {{packageName}}.{{modelPackage}};
{{/-first}}
{{/models}}
namespace {{packageName}}.{{clientPackage}}
{
@@ -0,0 +1,82 @@
{
"info": {
"title": "Files.com API",
"contact": {
"name": "Files.com Customer Success Team",
"email": "support@files.com"
},
"version": "0.0.1"
},
"swagger": "2.0",
"produces": [
"application/json",
"application/msgpack",
"application/xml"
],
"securityDefinitions": {
"api_key": {
"type": "apiKey",
"description": "API Key - supports user-based or site-wide API keys",
"name": "XFilesAPIKey",
"in": "header"
}
},
"host": "app.files.com",
"basePath": "/api/rest/v1",
"tags": [
{
"name": "api_key",
"description": "Operations about api_keys"
},
{
"name": "API Keys",
"description": "Operations about API Keys"
},
{
"name": "a_p_i_k_e_y_s",
"description": "Operations about API keys"
}
],
"paths": {
"/api_keys/{id}": {
"get": {
"summary": "Show API Key",
"description": "Show API Key",
"produces": [
"application/json"
],
"parameters": [
{
"in": "path",
"name": "id",
"description": "Api Key ID.",
"type": "integer",
"format": "int32",
"required": true,
"x-ms-summary": "Api Key ID."
}
],
"responses": {
"400": {
"description": "Bad Request",
"x-ms-summary": "Bad Request"
}
},
"tags": [
"api_keys",
"API Keys",
"a_p_i_k_e_y_s"
],
"operationId": "GetApiKeysId",
"x-authentication": [
"self_managed"
],
"x-category": [
"developers"
]
}
}
}
,
"definitions": {}
}
@@ -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
@@ -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
@@ -0,0 +1,41 @@
.gitignore
Org.OpenAPITools.sln
README.md
api/openapi.yaml
appveyor.yml
docs/apis/APIKEYSApi.md
docs/apis/APIKeys0Api.md
docs/apis/ApiKeys1Api.md
docs/scripts/git_push.ps1
docs/scripts/git_push.sh
src/Org.OpenAPITools.Test/Api/DependencyInjectionTests.cs
src/Org.OpenAPITools.Test/Org.OpenAPITools.Test.csproj
src/Org.OpenAPITools.Test/README.md
src/Org.OpenAPITools/Api/APIKEYSApi.cs
src/Org.OpenAPITools/Api/APIKeys0Api.cs
src/Org.OpenAPITools/Api/ApiKeys1Api.cs
src/Org.OpenAPITools/Api/IApi.cs
src/Org.OpenAPITools/Client/ApiException.cs
src/Org.OpenAPITools/Client/ApiFactory.cs
src/Org.OpenAPITools/Client/ApiKeyToken.cs
src/Org.OpenAPITools/Client/ApiResponseEventArgs.cs
src/Org.OpenAPITools/Client/ApiResponse`1.cs
src/Org.OpenAPITools/Client/ClientUtils.cs
src/Org.OpenAPITools/Client/CookieContainer.cs
src/Org.OpenAPITools/Client/DateOnlyJsonConverter.cs
src/Org.OpenAPITools/Client/DateOnlyNullableJsonConverter.cs
src/Org.OpenAPITools/Client/DateTimeJsonConverter.cs
src/Org.OpenAPITools/Client/DateTimeNullableJsonConverter.cs
src/Org.OpenAPITools/Client/ExceptionEventArgs.cs
src/Org.OpenAPITools/Client/HostConfiguration.cs
src/Org.OpenAPITools/Client/JsonSerializerOptionsProvider.cs
src/Org.OpenAPITools/Client/Option.cs
src/Org.OpenAPITools/Client/RateLimitProvider`1.cs
src/Org.OpenAPITools/Client/TokenBase.cs
src/Org.OpenAPITools/Client/TokenContainer`1.cs
src/Org.OpenAPITools/Client/TokenProvider`1.cs
src/Org.OpenAPITools/Extensions/IHostBuilderExtensions.cs
src/Org.OpenAPITools/Extensions/IHttpClientBuilderExtensions.cs
src/Org.OpenAPITools/Extensions/IServiceCollectionExtensions.cs
src/Org.OpenAPITools/Org.OpenAPITools.csproj
src/Org.OpenAPITools/README.md
@@ -0,0 +1 @@
7.9.0-SNAPSHOT
@@ -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}") = "Org.OpenAPITools", "src\Org.OpenAPITools\Org.OpenAPITools.csproj", "{321C8C3F-0156-40C1-AE42-D59761FB9B6C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Org.OpenAPITools.Test", "src\Org.OpenAPITools.Test\Org.OpenAPITools.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
{321C8C3F-0156-40C1-AE42-D59761FB9B6C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{321C8C3F-0156-40C1-AE42-D59761FB9B6C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{321C8C3F-0156-40C1-AE42-D59761FB9B6C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{321C8C3F-0156-40C1-AE42-D59761FB9B6C}.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
@@ -0,0 +1 @@
# Created with Openapi Generator
@@ -0,0 +1,55 @@
openapi: 3.0.1
info:
contact:
email: support@files.com
name: Files.com Customer Success Team
title: Files.com API
version: 0.0.1
servers:
- url: //app.files.com/api/rest/v1
tags:
- description: Operations about api_keys
name: api_key
- description: Operations about API Keys
name: API Keys
- description: Operations about API keys
name: a_p_i_k_e_y_s
paths:
/api_keys/{id}:
get:
description: Show API Key
operationId: GetApiKeysId
parameters:
- description: Api Key ID.
in: path
name: id
required: true
schema:
format: int32
type: integer
x-ms-summary: Api Key ID.
x-ms-summary: Api Key ID.
responses:
"400":
content: {}
description: Bad Request
x-ms-summary: Bad Request
summary: Show API Key
tags:
- api_keys
- API Keys
- a_p_i_k_e_y_s
x-authentication:
- self_managed
x-category:
- developers
components:
schemas: {}
securitySchemes:
api_key:
description: API Key - supports user-based or site-wide API keys
in: header
name: XFilesAPIKey
type: apiKey
x-original-swagger-version: "2.0"
@@ -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\Org.OpenAPITools\Org.OpenAPITools.csproj -o ../../output -c Release --no-build
@@ -0,0 +1,95 @@
# Org.OpenAPITools.Api.APIKEYSApi
All URIs are relative to *http://app.files.com/api/rest/v1*
| Method | HTTP request | Description |
|--------|--------------|-------------|
| [**GetApiKeysId_1**](APIKEYSApi.md#getapikeysid_1) | **GET** /api_keys/{id} | Show API Key |
<a id="getapikeysid_1"></a>
# **GetApiKeysId_1**
> void GetApiKeysId_1 (int id)
Show API Key
Show API Key
### Example
```csharp
using System.Collections.Generic;
using System.Diagnostics;
using Org.OpenAPITools.Api;
using Org.OpenAPITools.Client;
using Org.OpenAPITools.Model;
namespace Example
{
public class GetApiKeysId_1Example
{
public static void Main()
{
Configuration config = new Configuration();
config.BasePath = "http://app.files.com/api/rest/v1";
var apiInstance = new APIKEYSApi(config);
var id = 56; // int | Api Key ID.
try
{
// Show API Key
apiInstance.GetApiKeysId_1(id);
}
catch (ApiException e)
{
Debug.Print("Exception when calling APIKEYSApi.GetApiKeysId_1: " + e.Message);
Debug.Print("Status Code: " + e.ErrorCode);
Debug.Print(e.StackTrace);
}
}
}
}
```
#### Using the GetApiKeysId_1WithHttpInfo variant
This returns an ApiResponse object which contains the response data, status code and headers.
```csharp
try
{
// Show API Key
apiInstance.GetApiKeysId_1WithHttpInfo(id);
}
catch (ApiException e)
{
Debug.Print("Exception when calling APIKEYSApi.GetApiKeysId_1WithHttpInfo: " + e.Message);
Debug.Print("Status Code: " + e.ErrorCode);
Debug.Print(e.StackTrace);
}
```
### Parameters
| Name | Type | Description | Notes |
|------|------|-------------|-------|
| **id** | **int** | Api Key ID. | |
### Return type
void (empty response body)
### Authorization
No authorization required
### HTTP request headers
- **Content-Type**: Not defined
- **Accept**: Not defined
### HTTP response details
| Status code | Description | Response headers |
|-------------|-------------|------------------|
| **400** | Bad Request | - |
[[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)
@@ -0,0 +1,95 @@
# Org.OpenAPITools.Api.APIKeysApi
All URIs are relative to *http://app.files.com/api/rest/v1*
| Method | HTTP request | Description |
|--------|--------------|-------------|
| [**GetApiKeysId_0**](APIKeysApi.md#getapikeysid_0) | **GET** /api_keys/{id} | Show API Key |
<a id="getapikeysid_0"></a>
# **GetApiKeysId_0**
> void GetApiKeysId_0 (int id)
Show API Key
Show API Key
### Example
```csharp
using System.Collections.Generic;
using System.Diagnostics;
using Org.OpenAPITools.Api;
using Org.OpenAPITools.Client;
using Org.OpenAPITools.Model;
namespace Example
{
public class GetApiKeysId_0Example
{
public static void Main()
{
Configuration config = new Configuration();
config.BasePath = "http://app.files.com/api/rest/v1";
var apiInstance = new APIKeysApi(config);
var id = 56; // int | Api Key ID.
try
{
// Show API Key
apiInstance.GetApiKeysId_0(id);
}
catch (ApiException e)
{
Debug.Print("Exception when calling APIKeysApi.GetApiKeysId_0: " + e.Message);
Debug.Print("Status Code: " + e.ErrorCode);
Debug.Print(e.StackTrace);
}
}
}
}
```
#### Using the GetApiKeysId_0WithHttpInfo variant
This returns an ApiResponse object which contains the response data, status code and headers.
```csharp
try
{
// Show API Key
apiInstance.GetApiKeysId_0WithHttpInfo(id);
}
catch (ApiException e)
{
Debug.Print("Exception when calling APIKeysApi.GetApiKeysId_0WithHttpInfo: " + e.Message);
Debug.Print("Status Code: " + e.ErrorCode);
Debug.Print(e.StackTrace);
}
```
### Parameters
| Name | Type | Description | Notes |
|------|------|-------------|-------|
| **id** | **int** | Api Key ID. | |
### Return type
void (empty response body)
### Authorization
No authorization required
### HTTP request headers
- **Content-Type**: Not defined
- **Accept**: Not defined
### HTTP response details
| Status code | Description | Response headers |
|-------------|-------------|------------------|
| **400** | Bad Request | - |
[[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)
@@ -0,0 +1,95 @@
# Org.OpenAPITools.Api.ApiKeysApi
All URIs are relative to *http://app.files.com/api/rest/v1*
| Method | HTTP request | Description |
|--------|--------------|-------------|
| [**GetApiKeysId**](ApiKeysApi.md#getapikeysid) | **GET** /api_keys/{id} | Show API Key |
<a id="getapikeysid"></a>
# **GetApiKeysId**
> void GetApiKeysId (int id)
Show API Key
Show API Key
### Example
```csharp
using System.Collections.Generic;
using System.Diagnostics;
using Org.OpenAPITools.Api;
using Org.OpenAPITools.Client;
using Org.OpenAPITools.Model;
namespace Example
{
public class GetApiKeysIdExample
{
public static void Main()
{
Configuration config = new Configuration();
config.BasePath = "http://app.files.com/api/rest/v1";
var apiInstance = new ApiKeysApi(config);
var id = 56; // int | Api Key ID.
try
{
// Show API Key
apiInstance.GetApiKeysId(id);
}
catch (ApiException e)
{
Debug.Print("Exception when calling ApiKeysApi.GetApiKeysId: " + e.Message);
Debug.Print("Status Code: " + e.ErrorCode);
Debug.Print(e.StackTrace);
}
}
}
}
```
#### Using the GetApiKeysIdWithHttpInfo variant
This returns an ApiResponse object which contains the response data, status code and headers.
```csharp
try
{
// Show API Key
apiInstance.GetApiKeysIdWithHttpInfo(id);
}
catch (ApiException e)
{
Debug.Print("Exception when calling ApiKeysApi.GetApiKeysIdWithHttpInfo: " + e.Message);
Debug.Print("Status Code: " + e.ErrorCode);
Debug.Print(e.StackTrace);
}
```
### Parameters
| Name | Type | Description | Notes |
|------|------|-------------|-------|
| **id** | **int** | Api Key ID. | |
### Return type
void (empty response body)
### Authorization
No authorization required
### HTTP request headers
- **Content-Type**: Not defined
- **Accept**: Not defined
### HTTP response details
| Status code | Description | Response headers |
|-------------|-------------|------------------|
| **400** | Bad Request | - |
[[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)
@@ -0,0 +1,75 @@
param(
[Parameter()][Alias("g")][String]$GitHost = "github.com",
[Parameter()][Alias("u")][String]$GitUserId = "GIT_USER_ID",
[Parameter()][Alias("r")][String]$GitRepoId = "GIT_REPO_ID",
[Parameter()][Alias("m")][string]$Message = "Minor update",
[Parameter()][Alias("h")][switch]$Help
)
function Publish-ToGitHost{
if ([string]::IsNullOrWhiteSpace($Message) -or $Message -eq "Minor update"){
# it seems unlikely that we would want our git commit message to be the default, so lets prompt the user
$Message = Read-Host -Prompt "Please provide a commit message or press enter"
$Message = if([string]::IsNullOrWhiteSpace($Message)) { "no message provided" } else { $Message }
}
git init
git add .
git commit -am "${Message}"
$branchName=$(git rev-parse --abbrev-ref HEAD)
$gitRemote=$(git remote)
if([string]::IsNullOrWhiteSpace($gitRemote)){
git remote add origin https://${GitHost}/${GitUserId}/${GitRepoId}.git
}
Write-Output "Pulling from https://${GitHost}/${GitUserId}/${GitRepoId}.git"
git pull origin $branchName --ff-only
if ($LastExitCode -ne 0){
if (${GitHost} -eq "github.com"){
Write-Output "The ${GitRepoId} repository may not exist yet. Creating it now with the GitHub CLI."
gh auth login --hostname github.com --web
gh repo create $GitRepoId --private
# sleep 2 seconds to ensure git finishes creation of the repo
Start-Sleep -Seconds 2
}
else{
throw "There was an issue pulling the origin branch. The remote repository may not exist yet."
}
}
Write-Output "Pushing to https://${GitHost}/${GitUserId}/${GitRepoId}.git"
git push origin $branchName
}
$ErrorActionPreference = "Stop"
Set-StrictMode -Version 3.0
if ($Help){
Write-Output "
This script will initialize a git repository, then add and commit all files.
The local repository will then be pushed to your preferred git provider.
If the remote repository does not exist yet and you are using GitHub,
the repository will be created for you provided you have the GitHub CLI installed.
Parameters:
-g | -GitHost -> ex: github.com
-m | -Message -> the git commit message
-r | -GitRepoId -> the name of the repository
-u | -GitUserId -> your user id
"
return
}
$rootPath=Resolve-Path -Path $PSScriptRoot/../..
Push-Location $rootPath
try {
Publish-ToGitHost $GitHost $GitUserId $GitRepoId $Message
}
finally{
Pop-Location
}
@@ -0,0 +1,49 @@
#!/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_USER_ID}
git_repo_id=${2:-GIT_REPO_ID}
release_note=${3:-Minor update}
git_host=${4:-github.com}
starting_directory=$(pwd)
script_root="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )"
cd $script_root
cd ../..
if [ "$release_note" = "" ] || [ "$release_note" = "Minor update" ]; then
# it seems unlikely that we would want our git commit message to be the default, so lets prompt the user
echo "Please provide a commit message or press enter"
read user_input
release_note=$user_input
if [ "$release_note" = "" ]; then
release_note="no message provided"
fi
fi
git init
git add .
git commit -am "$release_note"
branch_name=$(git rev-parse --abbrev-ref HEAD)
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
echo "[INFO] Pulling from https://${git_host}/${git_user_id}/${git_repo_id}.git"
git pull origin $branch_name --ff-only
echo "[INFO] Pushing to https://${git_host}/${git_user_id}/${git_repo_id}.git"
git push origin $branch_name
cd $starting_directory
@@ -0,0 +1,63 @@
/*
* Files.com API
*
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.0.1
* Contact: support@files.com
* Generated by: https://github.com/openapitools/openapi-generator.git
*/
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Xunit;
using Microsoft.Extensions.DependencyInjection;
using Org.OpenAPITools.Api;
/* *********************************************************************************
* Follow these manual steps to construct tests.
* This file will not be overwritten.
* *********************************************************************************
* 1. Navigate to ApiTests.Base.cs and ensure any tokens are being created correctly.
* Take care not to commit credentials to any repository.
*
* 2. Mocking is coordinated by ApiTestsBase#AddApiHttpClients.
* To mock the client, use the generic AddApiHttpClients.
* To mock the server, change the client's BaseAddress.
*
* 3. Locate the test you want below
* - remove the skip property from the Fact attribute
* - set the value of any variables if necessary
*
* 4. Run the tests and ensure they work.
*
*/
namespace Org.OpenAPITools.Test.Api
{
/// <summary>
/// Class for testing APIKEYSApi
/// </summary>
public sealed class APIKEYSApiTests : ApiTestsBase
{
private readonly IAPIKEYSApi _instance;
public APIKEYSApiTests(): base(Array.Empty<string>())
{
_instance = _host.Services.GetRequiredService<IAPIKEYSApi>();
}
/// <summary>
/// Test GetApiKeysId_1
/// </summary>
[Fact (Skip = "not implemented")]
public async Task GetApiKeysId_1AsyncTest()
{
int id = default!;
await _instance.GetApiKeysId_1Async(id);
}
}
}
@@ -0,0 +1,63 @@
/*
* Files.com API
*
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.0.1
* Contact: support@files.com
* Generated by: https://github.com/openapitools/openapi-generator.git
*/
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Xunit;
using Microsoft.Extensions.DependencyInjection;
using Org.OpenAPITools.Api;
/* *********************************************************************************
* Follow these manual steps to construct tests.
* This file will not be overwritten.
* *********************************************************************************
* 1. Navigate to ApiTests.Base.cs and ensure any tokens are being created correctly.
* Take care not to commit credentials to any repository.
*
* 2. Mocking is coordinated by ApiTestsBase#AddApiHttpClients.
* To mock the client, use the generic AddApiHttpClients.
* To mock the server, change the client's BaseAddress.
*
* 3. Locate the test you want below
* - remove the skip property from the Fact attribute
* - set the value of any variables if necessary
*
* 4. Run the tests and ensure they work.
*
*/
namespace Org.OpenAPITools.Test.Api
{
/// <summary>
/// Class for testing APIKeysApi
/// </summary>
public sealed class APIKeysApiTests : ApiTestsBase
{
private readonly IAPIKeysApi _instance;
public APIKeysApiTests(): base(Array.Empty<string>())
{
_instance = _host.Services.GetRequiredService<IAPIKeysApi>();
}
/// <summary>
/// Test GetApiKeysId_0
/// </summary>
[Fact (Skip = "not implemented")]
public async Task GetApiKeysId_0AsyncTest()
{
int id = default!;
await _instance.GetApiKeysId_0Async(id);
}
}
}
@@ -0,0 +1,63 @@
/*
* Files.com API
*
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.0.1
* Contact: support@files.com
* Generated by: https://github.com/openapitools/openapi-generator.git
*/
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Xunit;
using Microsoft.Extensions.DependencyInjection;
using Org.OpenAPITools.Api;
/* *********************************************************************************
* Follow these manual steps to construct tests.
* This file will not be overwritten.
* *********************************************************************************
* 1. Navigate to ApiTests.Base.cs and ensure any tokens are being created correctly.
* Take care not to commit credentials to any repository.
*
* 2. Mocking is coordinated by ApiTestsBase#AddApiHttpClients.
* To mock the client, use the generic AddApiHttpClients.
* To mock the server, change the client's BaseAddress.
*
* 3. Locate the test you want below
* - remove the skip property from the Fact attribute
* - set the value of any variables if necessary
*
* 4. Run the tests and ensure they work.
*
*/
namespace Org.OpenAPITools.Test.Api
{
/// <summary>
/// Class for testing ApiKeysApi
/// </summary>
public sealed class ApiKeysApiTests : ApiTestsBase
{
private readonly IApiKeysApi _instance;
public ApiKeysApiTests(): base(Array.Empty<string>())
{
_instance = _host.Services.GetRequiredService<IApiKeysApi>();
}
/// <summary>
/// Test GetApiKeysId
/// </summary>
[Fact (Skip = "not implemented")]
public async Task GetApiKeysIdAsyncTest()
{
int id = default!;
await _instance.GetApiKeysIdAsync(id);
}
}
}
@@ -0,0 +1,61 @@
/*
* Files.com API
*
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.0.1
* Contact: support@files.com
* Generated by: https://github.com/openapitools/openapi-generator.git
*/
using System;
using System.Collections.Generic;
using System.Security.Cryptography;
using Microsoft.Extensions.Hosting;
using Org.OpenAPITools.Client;
using Org.OpenAPITools.Extensions;
/* *********************************************************************************
* Follow these manual steps to construct tests.
* This file will not be overwritten.
* *********************************************************************************
* 1. Navigate to ApiTests.Base.cs and ensure any tokens are being created correctly.
* Take care not to commit credentials to any repository.
*
* 2. Mocking is coordinated by ApiTestsBase#AddApiHttpClients.
* To mock the client, use the generic AddApiHttpClients.
* To mock the server, change the client's BaseAddress.
*
* 3. Locate the test you want below
* - remove the skip property from the Fact attribute
* - set the value of any variables if necessary
*
* 4. Run the tests and ensure they work.
*
*/
namespace Org.OpenAPITools.Test.Api
{
/// <summary>
/// Base class for API tests
/// </summary>
public class ApiTestsBase
{
protected readonly IHost _host;
public ApiTestsBase(string[] args)
{
_host = CreateHostBuilder(args).Build();
}
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args)
.ConfigureApi((context, services, options) =>
{
string apiKeyTokenValue1 = context.Configuration["<token>"] ?? throw new Exception("Token not found.");
ApiKeyToken apiKeyToken1 = new(apiKeyTokenValue1, ClientUtils.ApiKeyHeader.XFilesAPIKey, timeout: TimeSpan.FromSeconds(1));
options.AddTokens(apiKeyToken1);
});
}
}
@@ -0,0 +1,132 @@
/*
* Files.com API
*
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.0.1
* Contact: support@files.com
* Generated by: https://github.com/openapitools/openapi-generator.git
*/
using System;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.DependencyInjection;
using System.Collections.Generic;
using System.Security.Cryptography;
using Org.OpenAPITools.Client;
using Org.OpenAPITools.Api;
using Org.OpenAPITools.Extensions;
using Xunit;
namespace Org.OpenAPITools.Test.Api
{
/// <summary>
/// Tests the dependency injection.
/// </summary>
public class DependencyInjectionTest
{
private readonly IHost _hostUsingConfigureWithoutAClient =
Host.CreateDefaultBuilder([]).ConfigureApi((context, services, options) =>
{
ApiKeyToken apiKeyToken1 = new("<token>", ClientUtils.ApiKeyHeader.XFilesAPIKey, timeout: TimeSpan.FromSeconds(1));
options.AddTokens(apiKeyToken1);
})
.Build();
private readonly IHost _hostUsingConfigureWithAClient =
Host.CreateDefaultBuilder([]).ConfigureApi((context, services, options) =>
{
ApiKeyToken apiKeyToken1 = new("<token>", ClientUtils.ApiKeyHeader.XFilesAPIKey, timeout: TimeSpan.FromSeconds(1));
options.AddTokens(apiKeyToken1);
options.AddApiHttpClients(client => client.BaseAddress = new Uri(ClientUtils.BASE_ADDRESS));
})
.Build();
private readonly IHost _hostUsingAddWithoutAClient =
Host.CreateDefaultBuilder([]).ConfigureServices((host, services) =>
{
services.AddApi(options =>
{
ApiKeyToken apiKeyToken1 = new("<token>", ClientUtils.ApiKeyHeader.XFilesAPIKey, timeout: TimeSpan.FromSeconds(1));
options.AddTokens(apiKeyToken1);
});
})
.Build();
private readonly IHost _hostUsingAddWithAClient =
Host.CreateDefaultBuilder([]).ConfigureServices((host, services) =>
{
services.AddApi(options =>
{
ApiKeyToken apiKeyToken1 = new("<token>", ClientUtils.ApiKeyHeader.XFilesAPIKey, timeout: TimeSpan.FromSeconds(1));
options.AddTokens(apiKeyToken1);
options.AddApiHttpClients(client => client.BaseAddress = new Uri(ClientUtils.BASE_ADDRESS));
});
})
.Build();
/// <summary>
/// Test dependency injection when using the configure method
/// </summary>
[Fact]
public void ConfigureApiWithAClientTest()
{
var aPIKEYSApi = _hostUsingConfigureWithAClient.Services.GetRequiredService<IAPIKEYSApi>();
Assert.True(aPIKEYSApi.HttpClient.BaseAddress != null);
var aPIKeysApi = _hostUsingConfigureWithAClient.Services.GetRequiredService<IAPIKeysApi>();
Assert.True(aPIKeysApi.HttpClient.BaseAddress != null);
var apiKeysApi = _hostUsingConfigureWithAClient.Services.GetRequiredService<IApiKeysApi>();
Assert.True(apiKeysApi.HttpClient.BaseAddress != null);
}
/// <summary>
/// Test dependency injection when using the configure method
/// </summary>
[Fact]
public void ConfigureApiWithoutAClientTest()
{
var aPIKEYSApi = _hostUsingConfigureWithoutAClient.Services.GetRequiredService<IAPIKEYSApi>();
Assert.True(aPIKEYSApi.HttpClient.BaseAddress != null);
var aPIKeysApi = _hostUsingConfigureWithoutAClient.Services.GetRequiredService<IAPIKeysApi>();
Assert.True(aPIKeysApi.HttpClient.BaseAddress != null);
var apiKeysApi = _hostUsingConfigureWithoutAClient.Services.GetRequiredService<IApiKeysApi>();
Assert.True(apiKeysApi.HttpClient.BaseAddress != null);
}
/// <summary>
/// Test dependency injection when using the add method
/// </summary>
[Fact]
public void AddApiWithAClientTest()
{
var aPIKEYSApi = _hostUsingAddWithAClient.Services.GetRequiredService<IAPIKEYSApi>();
Assert.True(aPIKEYSApi.HttpClient.BaseAddress != null);
var aPIKeysApi = _hostUsingAddWithAClient.Services.GetRequiredService<IAPIKeysApi>();
Assert.True(aPIKeysApi.HttpClient.BaseAddress != null);
var apiKeysApi = _hostUsingAddWithAClient.Services.GetRequiredService<IApiKeysApi>();
Assert.True(apiKeysApi.HttpClient.BaseAddress != null);
}
/// <summary>
/// Test dependency injection when using the add method
/// </summary>
[Fact]
public void AddApiWithoutAClientTest()
{
var aPIKEYSApi = _hostUsingAddWithoutAClient.Services.GetRequiredService<IAPIKEYSApi>();
Assert.True(aPIKEYSApi.HttpClient.BaseAddress != null);
var aPIKeysApi = _hostUsingAddWithoutAClient.Services.GetRequiredService<IAPIKeysApi>();
Assert.True(aPIKeysApi.HttpClient.BaseAddress != null);
var apiKeysApi = _hostUsingAddWithoutAClient.Services.GetRequiredService<IApiKeysApi>();
Assert.True(apiKeysApi.HttpClient.BaseAddress != null);
}
}
}
@@ -0,0 +1,20 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<AssemblyName>Org.OpenAPITools.Test</AssemblyName>
<RootNamespace>Org.OpenAPITools.Test</RootNamespace>
<TargetFramework>net8.0</TargetFramework>
<IsPackable>false</IsPackable>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
<PackageReference Include="xunit" Version="2.9.0" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.8.2" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Org.OpenAPITools\Org.OpenAPITools.csproj" />
</ItemGroup>
</Project>
@@ -0,0 +1,311 @@
// <auto-generated>
/*
* Files.com API
*
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.0.1
* Contact: support@files.com
* Generated by: https://github.com/openapitools/openapi-generator.git
*/
#nullable enable
using System;
using System.Collections.Generic;
using System.Net;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text.Json;
using Org.OpenAPITools.Client;
using System.Diagnostics.CodeAnalysis;
namespace Org.OpenAPITools.Api
{
/// <summary>
/// Represents a collection of functions to interact with the API endpoints
/// This class is registered as transient.
/// </summary>
public interface IAPIKEYSApi : IApi
{
/// <summary>
/// The class containing the events
/// </summary>
APIKEYSApiEvents Events { get; }
/// <summary>
/// Show API Key
/// </summary>
/// <remarks>
/// Show API Key
/// </remarks>
/// <exception cref="ApiException">Thrown when fails to make API call</exception>
/// <param name="id">Api Key ID.</param>
/// <param name="cancellationToken">Cancellation Token to cancel the request.</param>
/// <returns><see cref="Task"/>&lt;<see cref="IGetApiKeysId_1ApiResponse"/>&gt;</returns>
Task<IGetApiKeysId_1ApiResponse> GetApiKeysId_1Async(int id, System.Threading.CancellationToken cancellationToken = default);
/// <summary>
/// Show API Key
/// </summary>
/// <remarks>
/// Show API Key
/// </remarks>
/// <param name="id">Api Key ID.</param>
/// <param name="cancellationToken">Cancellation Token to cancel the request.</param>
/// <returns><see cref="Task"/>&lt;<see cref="IGetApiKeysId_1ApiResponse"/>?&gt;</returns>
Task<IGetApiKeysId_1ApiResponse?> GetApiKeysId_1OrDefaultAsync(int id, System.Threading.CancellationToken cancellationToken = default);
}
/// <summary>
/// The <see cref="IGetApiKeysId_1ApiResponse"/>
/// </summary>
public interface IGetApiKeysId_1ApiResponse : Org.OpenAPITools.Client.IApiResponse
{
/// <summary>
/// Returns true if the response is 400 BadRequest
/// </summary>
/// <returns></returns>
bool IsBadRequest { get; }
}
/// <summary>
/// Represents a collection of functions to interact with the API endpoints
/// </summary>
public class APIKEYSApiEvents
{
/// <summary>
/// The event raised after the server response
/// </summary>
public event EventHandler<ApiResponseEventArgs>? OnGetApiKeysId_1;
/// <summary>
/// The event raised after an error querying the server
/// </summary>
public event EventHandler<ExceptionEventArgs>? OnErrorGetApiKeysId_1;
internal void ExecuteOnGetApiKeysId_1(APIKEYSApi.GetApiKeysId_1ApiResponse apiResponse)
{
OnGetApiKeysId_1?.Invoke(this, new ApiResponseEventArgs(apiResponse));
}
internal void ExecuteOnErrorGetApiKeysId_1(Exception exception)
{
OnErrorGetApiKeysId_1?.Invoke(this, new ExceptionEventArgs(exception));
}
}
/// <summary>
/// Represents a collection of functions to interact with the API endpoints
/// </summary>
public sealed partial class APIKEYSApi : IAPIKEYSApi
{
private JsonSerializerOptions _jsonSerializerOptions;
/// <summary>
/// The logger factory
/// </summary>
public ILoggerFactory LoggerFactory { get; }
/// <summary>
/// The logger
/// </summary>
public ILogger<APIKEYSApi> Logger { get; }
/// <summary>
/// The HttpClient
/// </summary>
public HttpClient HttpClient { get; }
/// <summary>
/// The class containing the events
/// </summary>
public APIKEYSApiEvents Events { get; }
/// <summary>
/// A token provider of type <see cref="ApiKeyProvider"/>
/// </summary>
public TokenProvider<ApiKeyToken> ApiKeyProvider { get; }
/// <summary>
/// Initializes a new instance of the <see cref="APIKEYSApi"/> class.
/// </summary>
/// <returns></returns>
public APIKEYSApi(ILogger<APIKEYSApi> logger, ILoggerFactory loggerFactory, HttpClient httpClient, JsonSerializerOptionsProvider jsonSerializerOptionsProvider, APIKEYSApiEvents aPIKEYSApiEvents,
TokenProvider<ApiKeyToken> apiKeyProvider)
{
_jsonSerializerOptions = jsonSerializerOptionsProvider.Options;
LoggerFactory = loggerFactory;
Logger = LoggerFactory.CreateLogger<APIKEYSApi>();
HttpClient = httpClient;
Events = aPIKEYSApiEvents;
ApiKeyProvider = apiKeyProvider;
}
partial void FormatGetApiKeysId_1(ref int id);
/// <summary>
/// Processes the server response
/// </summary>
/// <param name="apiResponseLocalVar"></param>
/// <param name="id"></param>
private void AfterGetApiKeysId_1DefaultImplementation(IGetApiKeysId_1ApiResponse apiResponseLocalVar, int id)
{
bool suppressDefaultLog = false;
AfterGetApiKeysId_1(ref suppressDefaultLog, apiResponseLocalVar, id);
if (!suppressDefaultLog)
Logger.LogInformation("{0,-9} | {1} | {3}", (apiResponseLocalVar.DownloadedAt - apiResponseLocalVar.RequestedAt).TotalSeconds, apiResponseLocalVar.StatusCode, apiResponseLocalVar.Path);
}
/// <summary>
/// Processes the server response
/// </summary>
/// <param name="suppressDefaultLog"></param>
/// <param name="apiResponseLocalVar"></param>
/// <param name="id"></param>
partial void AfterGetApiKeysId_1(ref bool suppressDefaultLog, IGetApiKeysId_1ApiResponse apiResponseLocalVar, int id);
/// <summary>
/// Logs exceptions that occur while retrieving the server response
/// </summary>
/// <param name="exceptionLocalVar"></param>
/// <param name="pathFormatLocalVar"></param>
/// <param name="pathLocalVar"></param>
/// <param name="id"></param>
private void OnErrorGetApiKeysId_1DefaultImplementation(Exception exceptionLocalVar, string pathFormatLocalVar, string pathLocalVar, int id)
{
bool suppressDefaultLogLocalVar = false;
OnErrorGetApiKeysId_1(ref suppressDefaultLogLocalVar, exceptionLocalVar, pathFormatLocalVar, pathLocalVar, id);
if (!suppressDefaultLogLocalVar)
Logger.LogError(exceptionLocalVar, "An error occurred while sending the request to the server.");
}
/// <summary>
/// A partial method that gives developers a way to provide customized exception handling
/// </summary>
/// <param name="suppressDefaultLogLocalVar"></param>
/// <param name="exceptionLocalVar"></param>
/// <param name="pathFormatLocalVar"></param>
/// <param name="pathLocalVar"></param>
/// <param name="id"></param>
partial void OnErrorGetApiKeysId_1(ref bool suppressDefaultLogLocalVar, Exception exceptionLocalVar, string pathFormatLocalVar, string pathLocalVar, int id);
/// <summary>
/// Show API Key Show API Key
/// </summary>
/// <param name="id">Api Key ID.</param>
/// <param name="cancellationToken">Cancellation Token to cancel the request.</param>
/// <returns><see cref="Task"/>&lt;<see cref="IGetApiKeysId_1ApiResponse"/>&gt;</returns>
public async Task<IGetApiKeysId_1ApiResponse?> GetApiKeysId_1OrDefaultAsync(int id, System.Threading.CancellationToken cancellationToken = default)
{
try
{
return await GetApiKeysId_1Async(id, cancellationToken).ConfigureAwait(false);
}
catch (Exception)
{
return null;
}
}
/// <summary>
/// Show API Key Show API Key
/// </summary>
/// <exception cref="ApiException">Thrown when fails to make API call</exception>
/// <param name="id">Api Key ID.</param>
/// <param name="cancellationToken">Cancellation Token to cancel the request.</param>
/// <returns><see cref="Task"/>&lt;<see cref="IGetApiKeysId_1ApiResponse"/>&gt;</returns>
public async Task<IGetApiKeysId_1ApiResponse> GetApiKeysId_1Async(int id, System.Threading.CancellationToken cancellationToken = default)
{
UriBuilder uriBuilderLocalVar = new UriBuilder();
try
{
FormatGetApiKeysId_1(ref id);
using (HttpRequestMessage httpRequestMessageLocalVar = new HttpRequestMessage())
{
uriBuilderLocalVar.Host = HttpClient.BaseAddress!.Host;
uriBuilderLocalVar.Port = HttpClient.BaseAddress.Port;
uriBuilderLocalVar.Scheme = HttpClient.BaseAddress.Scheme;
uriBuilderLocalVar.Path = ClientUtils.CONTEXT_PATH + "/api_keys/{id}";
uriBuilderLocalVar.Path = uriBuilderLocalVar.Path.Replace("%7Bid%7D", Uri.EscapeDataString(id.ToString()));
httpRequestMessageLocalVar.RequestUri = uriBuilderLocalVar.Uri;
httpRequestMessageLocalVar.Method = HttpMethod.Get;
DateTime requestedAtLocalVar = DateTime.UtcNow;
using (HttpResponseMessage httpResponseMessageLocalVar = await HttpClient.SendAsync(httpRequestMessageLocalVar, cancellationToken).ConfigureAwait(false))
{
string responseContentLocalVar = await httpResponseMessageLocalVar.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false);
ILogger<GetApiKeysId_1ApiResponse> apiResponseLoggerLocalVar = LoggerFactory.CreateLogger<GetApiKeysId_1ApiResponse>();
GetApiKeysId_1ApiResponse apiResponseLocalVar = new(apiResponseLoggerLocalVar, httpRequestMessageLocalVar, httpResponseMessageLocalVar, responseContentLocalVar, "/api_keys/{id}", requestedAtLocalVar, _jsonSerializerOptions);
AfterGetApiKeysId_1DefaultImplementation(apiResponseLocalVar, id);
Events.ExecuteOnGetApiKeysId_1(apiResponseLocalVar);
return apiResponseLocalVar;
}
}
}
catch(Exception e)
{
OnErrorGetApiKeysId_1DefaultImplementation(e, "/api_keys/{id}", uriBuilderLocalVar.Path, id);
Events.ExecuteOnErrorGetApiKeysId_1(e);
throw;
}
}
/// <summary>
/// The <see cref="GetApiKeysId_1ApiResponse"/>
/// </summary>
public partial class GetApiKeysId_1ApiResponse : Org.OpenAPITools.Client.ApiResponse, IGetApiKeysId_1ApiResponse
{
/// <summary>
/// The logger
/// </summary>
public ILogger<GetApiKeysId_1ApiResponse> Logger { get; }
/// <summary>
/// The <see cref="GetApiKeysId_1ApiResponse"/>
/// </summary>
/// <param name="logger"></param>
/// <param name="httpRequestMessage"></param>
/// <param name="httpResponseMessage"></param>
/// <param name="rawContent"></param>
/// <param name="path"></param>
/// <param name="requestedAt"></param>
/// <param name="jsonSerializerOptions"></param>
public GetApiKeysId_1ApiResponse(ILogger<GetApiKeysId_1ApiResponse> logger, System.Net.Http.HttpRequestMessage httpRequestMessage, System.Net.Http.HttpResponseMessage httpResponseMessage, string rawContent, string path, DateTime requestedAt, System.Text.Json.JsonSerializerOptions jsonSerializerOptions) : base(httpRequestMessage, httpResponseMessage, rawContent, path, requestedAt, jsonSerializerOptions)
{
Logger = logger;
OnCreated(httpRequestMessage, httpResponseMessage);
}
partial void OnCreated(global::System.Net.Http.HttpRequestMessage httpRequestMessage, System.Net.Http.HttpResponseMessage httpResponseMessage);
/// <summary>
/// Returns true if the response is 400 BadRequest
/// </summary>
/// <returns></returns>
public bool IsBadRequest => 400 == (int)StatusCode;
private void OnDeserializationErrorDefaultImplementation(Exception exception, HttpStatusCode httpStatusCode)
{
bool suppressDefaultLog = false;
OnDeserializationError(ref suppressDefaultLog, exception, httpStatusCode);
if (!suppressDefaultLog)
Logger.LogError(exception, "An error occurred while deserializing the {code} response.", httpStatusCode);
}
partial void OnDeserializationError(ref bool suppressDefaultLog, Exception exception, HttpStatusCode httpStatusCode);
}
}
}
@@ -0,0 +1,311 @@
// <auto-generated>
/*
* Files.com API
*
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.0.1
* Contact: support@files.com
* Generated by: https://github.com/openapitools/openapi-generator.git
*/
#nullable enable
using System;
using System.Collections.Generic;
using System.Net;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text.Json;
using Org.OpenAPITools.Client;
using System.Diagnostics.CodeAnalysis;
namespace Org.OpenAPITools.Api
{
/// <summary>
/// Represents a collection of functions to interact with the API endpoints
/// This class is registered as transient.
/// </summary>
public interface IAPIKeysApi : IApi
{
/// <summary>
/// The class containing the events
/// </summary>
APIKeysApiEvents Events { get; }
/// <summary>
/// Show API Key
/// </summary>
/// <remarks>
/// Show API Key
/// </remarks>
/// <exception cref="ApiException">Thrown when fails to make API call</exception>
/// <param name="id">Api Key ID.</param>
/// <param name="cancellationToken">Cancellation Token to cancel the request.</param>
/// <returns><see cref="Task"/>&lt;<see cref="IGetApiKeysId_0ApiResponse"/>&gt;</returns>
Task<IGetApiKeysId_0ApiResponse> GetApiKeysId_0Async(int id, System.Threading.CancellationToken cancellationToken = default);
/// <summary>
/// Show API Key
/// </summary>
/// <remarks>
/// Show API Key
/// </remarks>
/// <param name="id">Api Key ID.</param>
/// <param name="cancellationToken">Cancellation Token to cancel the request.</param>
/// <returns><see cref="Task"/>&lt;<see cref="IGetApiKeysId_0ApiResponse"/>?&gt;</returns>
Task<IGetApiKeysId_0ApiResponse?> GetApiKeysId_0OrDefaultAsync(int id, System.Threading.CancellationToken cancellationToken = default);
}
/// <summary>
/// The <see cref="IGetApiKeysId_0ApiResponse"/>
/// </summary>
public interface IGetApiKeysId_0ApiResponse : Org.OpenAPITools.Client.IApiResponse
{
/// <summary>
/// Returns true if the response is 400 BadRequest
/// </summary>
/// <returns></returns>
bool IsBadRequest { get; }
}
/// <summary>
/// Represents a collection of functions to interact with the API endpoints
/// </summary>
public class APIKeysApiEvents
{
/// <summary>
/// The event raised after the server response
/// </summary>
public event EventHandler<ApiResponseEventArgs>? OnGetApiKeysId_0;
/// <summary>
/// The event raised after an error querying the server
/// </summary>
public event EventHandler<ExceptionEventArgs>? OnErrorGetApiKeysId_0;
internal void ExecuteOnGetApiKeysId_0(APIKeysApi.GetApiKeysId_0ApiResponse apiResponse)
{
OnGetApiKeysId_0?.Invoke(this, new ApiResponseEventArgs(apiResponse));
}
internal void ExecuteOnErrorGetApiKeysId_0(Exception exception)
{
OnErrorGetApiKeysId_0?.Invoke(this, new ExceptionEventArgs(exception));
}
}
/// <summary>
/// Represents a collection of functions to interact with the API endpoints
/// </summary>
public sealed partial class APIKeysApi : IAPIKeysApi
{
private JsonSerializerOptions _jsonSerializerOptions;
/// <summary>
/// The logger factory
/// </summary>
public ILoggerFactory LoggerFactory { get; }
/// <summary>
/// The logger
/// </summary>
public ILogger<APIKeysApi> Logger { get; }
/// <summary>
/// The HttpClient
/// </summary>
public HttpClient HttpClient { get; }
/// <summary>
/// The class containing the events
/// </summary>
public APIKeysApiEvents Events { get; }
/// <summary>
/// A token provider of type <see cref="ApiKeyProvider"/>
/// </summary>
public TokenProvider<ApiKeyToken> ApiKeyProvider { get; }
/// <summary>
/// Initializes a new instance of the <see cref="APIKeysApi"/> class.
/// </summary>
/// <returns></returns>
public APIKeysApi(ILogger<APIKeysApi> logger, ILoggerFactory loggerFactory, HttpClient httpClient, JsonSerializerOptionsProvider jsonSerializerOptionsProvider, APIKeysApiEvents aPIKeysApiEvents,
TokenProvider<ApiKeyToken> apiKeyProvider)
{
_jsonSerializerOptions = jsonSerializerOptionsProvider.Options;
LoggerFactory = loggerFactory;
Logger = LoggerFactory.CreateLogger<APIKeysApi>();
HttpClient = httpClient;
Events = aPIKeysApiEvents;
ApiKeyProvider = apiKeyProvider;
}
partial void FormatGetApiKeysId_0(ref int id);
/// <summary>
/// Processes the server response
/// </summary>
/// <param name="apiResponseLocalVar"></param>
/// <param name="id"></param>
private void AfterGetApiKeysId_0DefaultImplementation(IGetApiKeysId_0ApiResponse apiResponseLocalVar, int id)
{
bool suppressDefaultLog = false;
AfterGetApiKeysId_0(ref suppressDefaultLog, apiResponseLocalVar, id);
if (!suppressDefaultLog)
Logger.LogInformation("{0,-9} | {1} | {3}", (apiResponseLocalVar.DownloadedAt - apiResponseLocalVar.RequestedAt).TotalSeconds, apiResponseLocalVar.StatusCode, apiResponseLocalVar.Path);
}
/// <summary>
/// Processes the server response
/// </summary>
/// <param name="suppressDefaultLog"></param>
/// <param name="apiResponseLocalVar"></param>
/// <param name="id"></param>
partial void AfterGetApiKeysId_0(ref bool suppressDefaultLog, IGetApiKeysId_0ApiResponse apiResponseLocalVar, int id);
/// <summary>
/// Logs exceptions that occur while retrieving the server response
/// </summary>
/// <param name="exceptionLocalVar"></param>
/// <param name="pathFormatLocalVar"></param>
/// <param name="pathLocalVar"></param>
/// <param name="id"></param>
private void OnErrorGetApiKeysId_0DefaultImplementation(Exception exceptionLocalVar, string pathFormatLocalVar, string pathLocalVar, int id)
{
bool suppressDefaultLogLocalVar = false;
OnErrorGetApiKeysId_0(ref suppressDefaultLogLocalVar, exceptionLocalVar, pathFormatLocalVar, pathLocalVar, id);
if (!suppressDefaultLogLocalVar)
Logger.LogError(exceptionLocalVar, "An error occurred while sending the request to the server.");
}
/// <summary>
/// A partial method that gives developers a way to provide customized exception handling
/// </summary>
/// <param name="suppressDefaultLogLocalVar"></param>
/// <param name="exceptionLocalVar"></param>
/// <param name="pathFormatLocalVar"></param>
/// <param name="pathLocalVar"></param>
/// <param name="id"></param>
partial void OnErrorGetApiKeysId_0(ref bool suppressDefaultLogLocalVar, Exception exceptionLocalVar, string pathFormatLocalVar, string pathLocalVar, int id);
/// <summary>
/// Show API Key Show API Key
/// </summary>
/// <param name="id">Api Key ID.</param>
/// <param name="cancellationToken">Cancellation Token to cancel the request.</param>
/// <returns><see cref="Task"/>&lt;<see cref="IGetApiKeysId_0ApiResponse"/>&gt;</returns>
public async Task<IGetApiKeysId_0ApiResponse?> GetApiKeysId_0OrDefaultAsync(int id, System.Threading.CancellationToken cancellationToken = default)
{
try
{
return await GetApiKeysId_0Async(id, cancellationToken).ConfigureAwait(false);
}
catch (Exception)
{
return null;
}
}
/// <summary>
/// Show API Key Show API Key
/// </summary>
/// <exception cref="ApiException">Thrown when fails to make API call</exception>
/// <param name="id">Api Key ID.</param>
/// <param name="cancellationToken">Cancellation Token to cancel the request.</param>
/// <returns><see cref="Task"/>&lt;<see cref="IGetApiKeysId_0ApiResponse"/>&gt;</returns>
public async Task<IGetApiKeysId_0ApiResponse> GetApiKeysId_0Async(int id, System.Threading.CancellationToken cancellationToken = default)
{
UriBuilder uriBuilderLocalVar = new UriBuilder();
try
{
FormatGetApiKeysId_0(ref id);
using (HttpRequestMessage httpRequestMessageLocalVar = new HttpRequestMessage())
{
uriBuilderLocalVar.Host = HttpClient.BaseAddress!.Host;
uriBuilderLocalVar.Port = HttpClient.BaseAddress.Port;
uriBuilderLocalVar.Scheme = HttpClient.BaseAddress.Scheme;
uriBuilderLocalVar.Path = ClientUtils.CONTEXT_PATH + "/api_keys/{id}";
uriBuilderLocalVar.Path = uriBuilderLocalVar.Path.Replace("%7Bid%7D", Uri.EscapeDataString(id.ToString()));
httpRequestMessageLocalVar.RequestUri = uriBuilderLocalVar.Uri;
httpRequestMessageLocalVar.Method = HttpMethod.Get;
DateTime requestedAtLocalVar = DateTime.UtcNow;
using (HttpResponseMessage httpResponseMessageLocalVar = await HttpClient.SendAsync(httpRequestMessageLocalVar, cancellationToken).ConfigureAwait(false))
{
string responseContentLocalVar = await httpResponseMessageLocalVar.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false);
ILogger<GetApiKeysId_0ApiResponse> apiResponseLoggerLocalVar = LoggerFactory.CreateLogger<GetApiKeysId_0ApiResponse>();
GetApiKeysId_0ApiResponse apiResponseLocalVar = new(apiResponseLoggerLocalVar, httpRequestMessageLocalVar, httpResponseMessageLocalVar, responseContentLocalVar, "/api_keys/{id}", requestedAtLocalVar, _jsonSerializerOptions);
AfterGetApiKeysId_0DefaultImplementation(apiResponseLocalVar, id);
Events.ExecuteOnGetApiKeysId_0(apiResponseLocalVar);
return apiResponseLocalVar;
}
}
}
catch(Exception e)
{
OnErrorGetApiKeysId_0DefaultImplementation(e, "/api_keys/{id}", uriBuilderLocalVar.Path, id);
Events.ExecuteOnErrorGetApiKeysId_0(e);
throw;
}
}
/// <summary>
/// The <see cref="GetApiKeysId_0ApiResponse"/>
/// </summary>
public partial class GetApiKeysId_0ApiResponse : Org.OpenAPITools.Client.ApiResponse, IGetApiKeysId_0ApiResponse
{
/// <summary>
/// The logger
/// </summary>
public ILogger<GetApiKeysId_0ApiResponse> Logger { get; }
/// <summary>
/// The <see cref="GetApiKeysId_0ApiResponse"/>
/// </summary>
/// <param name="logger"></param>
/// <param name="httpRequestMessage"></param>
/// <param name="httpResponseMessage"></param>
/// <param name="rawContent"></param>
/// <param name="path"></param>
/// <param name="requestedAt"></param>
/// <param name="jsonSerializerOptions"></param>
public GetApiKeysId_0ApiResponse(ILogger<GetApiKeysId_0ApiResponse> logger, System.Net.Http.HttpRequestMessage httpRequestMessage, System.Net.Http.HttpResponseMessage httpResponseMessage, string rawContent, string path, DateTime requestedAt, System.Text.Json.JsonSerializerOptions jsonSerializerOptions) : base(httpRequestMessage, httpResponseMessage, rawContent, path, requestedAt, jsonSerializerOptions)
{
Logger = logger;
OnCreated(httpRequestMessage, httpResponseMessage);
}
partial void OnCreated(global::System.Net.Http.HttpRequestMessage httpRequestMessage, System.Net.Http.HttpResponseMessage httpResponseMessage);
/// <summary>
/// Returns true if the response is 400 BadRequest
/// </summary>
/// <returns></returns>
public bool IsBadRequest => 400 == (int)StatusCode;
private void OnDeserializationErrorDefaultImplementation(Exception exception, HttpStatusCode httpStatusCode)
{
bool suppressDefaultLog = false;
OnDeserializationError(ref suppressDefaultLog, exception, httpStatusCode);
if (!suppressDefaultLog)
Logger.LogError(exception, "An error occurred while deserializing the {code} response.", httpStatusCode);
}
partial void OnDeserializationError(ref bool suppressDefaultLog, Exception exception, HttpStatusCode httpStatusCode);
}
}
}
@@ -0,0 +1,311 @@
// <auto-generated>
/*
* Files.com API
*
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.0.1
* Contact: support@files.com
* Generated by: https://github.com/openapitools/openapi-generator.git
*/
#nullable enable
using System;
using System.Collections.Generic;
using System.Net;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text.Json;
using Org.OpenAPITools.Client;
using System.Diagnostics.CodeAnalysis;
namespace Org.OpenAPITools.Api
{
/// <summary>
/// Represents a collection of functions to interact with the API endpoints
/// This class is registered as transient.
/// </summary>
public interface IApiKeysApi : IApi
{
/// <summary>
/// The class containing the events
/// </summary>
ApiKeysApiEvents Events { get; }
/// <summary>
/// Show API Key
/// </summary>
/// <remarks>
/// Show API Key
/// </remarks>
/// <exception cref="ApiException">Thrown when fails to make API call</exception>
/// <param name="id">Api Key ID.</param>
/// <param name="cancellationToken">Cancellation Token to cancel the request.</param>
/// <returns><see cref="Task"/>&lt;<see cref="IGetApiKeysIdApiResponse"/>&gt;</returns>
Task<IGetApiKeysIdApiResponse> GetApiKeysIdAsync(int id, System.Threading.CancellationToken cancellationToken = default);
/// <summary>
/// Show API Key
/// </summary>
/// <remarks>
/// Show API Key
/// </remarks>
/// <param name="id">Api Key ID.</param>
/// <param name="cancellationToken">Cancellation Token to cancel the request.</param>
/// <returns><see cref="Task"/>&lt;<see cref="IGetApiKeysIdApiResponse"/>?&gt;</returns>
Task<IGetApiKeysIdApiResponse?> GetApiKeysIdOrDefaultAsync(int id, System.Threading.CancellationToken cancellationToken = default);
}
/// <summary>
/// The <see cref="IGetApiKeysIdApiResponse"/>
/// </summary>
public interface IGetApiKeysIdApiResponse : Org.OpenAPITools.Client.IApiResponse
{
/// <summary>
/// Returns true if the response is 400 BadRequest
/// </summary>
/// <returns></returns>
bool IsBadRequest { get; }
}
/// <summary>
/// Represents a collection of functions to interact with the API endpoints
/// </summary>
public class ApiKeysApiEvents
{
/// <summary>
/// The event raised after the server response
/// </summary>
public event EventHandler<ApiResponseEventArgs>? OnGetApiKeysId;
/// <summary>
/// The event raised after an error querying the server
/// </summary>
public event EventHandler<ExceptionEventArgs>? OnErrorGetApiKeysId;
internal void ExecuteOnGetApiKeysId(ApiKeysApi.GetApiKeysIdApiResponse apiResponse)
{
OnGetApiKeysId?.Invoke(this, new ApiResponseEventArgs(apiResponse));
}
internal void ExecuteOnErrorGetApiKeysId(Exception exception)
{
OnErrorGetApiKeysId?.Invoke(this, new ExceptionEventArgs(exception));
}
}
/// <summary>
/// Represents a collection of functions to interact with the API endpoints
/// </summary>
public sealed partial class ApiKeysApi : IApiKeysApi
{
private JsonSerializerOptions _jsonSerializerOptions;
/// <summary>
/// The logger factory
/// </summary>
public ILoggerFactory LoggerFactory { get; }
/// <summary>
/// The logger
/// </summary>
public ILogger<ApiKeysApi> Logger { get; }
/// <summary>
/// The HttpClient
/// </summary>
public HttpClient HttpClient { get; }
/// <summary>
/// The class containing the events
/// </summary>
public ApiKeysApiEvents Events { get; }
/// <summary>
/// A token provider of type <see cref="ApiKeyProvider"/>
/// </summary>
public TokenProvider<ApiKeyToken> ApiKeyProvider { get; }
/// <summary>
/// Initializes a new instance of the <see cref="ApiKeysApi"/> class.
/// </summary>
/// <returns></returns>
public ApiKeysApi(ILogger<ApiKeysApi> logger, ILoggerFactory loggerFactory, HttpClient httpClient, JsonSerializerOptionsProvider jsonSerializerOptionsProvider, ApiKeysApiEvents apiKeysApiEvents,
TokenProvider<ApiKeyToken> apiKeyProvider)
{
_jsonSerializerOptions = jsonSerializerOptionsProvider.Options;
LoggerFactory = loggerFactory;
Logger = LoggerFactory.CreateLogger<ApiKeysApi>();
HttpClient = httpClient;
Events = apiKeysApiEvents;
ApiKeyProvider = apiKeyProvider;
}
partial void FormatGetApiKeysId(ref int id);
/// <summary>
/// Processes the server response
/// </summary>
/// <param name="apiResponseLocalVar"></param>
/// <param name="id"></param>
private void AfterGetApiKeysIdDefaultImplementation(IGetApiKeysIdApiResponse apiResponseLocalVar, int id)
{
bool suppressDefaultLog = false;
AfterGetApiKeysId(ref suppressDefaultLog, apiResponseLocalVar, id);
if (!suppressDefaultLog)
Logger.LogInformation("{0,-9} | {1} | {3}", (apiResponseLocalVar.DownloadedAt - apiResponseLocalVar.RequestedAt).TotalSeconds, apiResponseLocalVar.StatusCode, apiResponseLocalVar.Path);
}
/// <summary>
/// Processes the server response
/// </summary>
/// <param name="suppressDefaultLog"></param>
/// <param name="apiResponseLocalVar"></param>
/// <param name="id"></param>
partial void AfterGetApiKeysId(ref bool suppressDefaultLog, IGetApiKeysIdApiResponse apiResponseLocalVar, int id);
/// <summary>
/// Logs exceptions that occur while retrieving the server response
/// </summary>
/// <param name="exceptionLocalVar"></param>
/// <param name="pathFormatLocalVar"></param>
/// <param name="pathLocalVar"></param>
/// <param name="id"></param>
private void OnErrorGetApiKeysIdDefaultImplementation(Exception exceptionLocalVar, string pathFormatLocalVar, string pathLocalVar, int id)
{
bool suppressDefaultLogLocalVar = false;
OnErrorGetApiKeysId(ref suppressDefaultLogLocalVar, exceptionLocalVar, pathFormatLocalVar, pathLocalVar, id);
if (!suppressDefaultLogLocalVar)
Logger.LogError(exceptionLocalVar, "An error occurred while sending the request to the server.");
}
/// <summary>
/// A partial method that gives developers a way to provide customized exception handling
/// </summary>
/// <param name="suppressDefaultLogLocalVar"></param>
/// <param name="exceptionLocalVar"></param>
/// <param name="pathFormatLocalVar"></param>
/// <param name="pathLocalVar"></param>
/// <param name="id"></param>
partial void OnErrorGetApiKeysId(ref bool suppressDefaultLogLocalVar, Exception exceptionLocalVar, string pathFormatLocalVar, string pathLocalVar, int id);
/// <summary>
/// Show API Key Show API Key
/// </summary>
/// <param name="id">Api Key ID.</param>
/// <param name="cancellationToken">Cancellation Token to cancel the request.</param>
/// <returns><see cref="Task"/>&lt;<see cref="IGetApiKeysIdApiResponse"/>&gt;</returns>
public async Task<IGetApiKeysIdApiResponse?> GetApiKeysIdOrDefaultAsync(int id, System.Threading.CancellationToken cancellationToken = default)
{
try
{
return await GetApiKeysIdAsync(id, cancellationToken).ConfigureAwait(false);
}
catch (Exception)
{
return null;
}
}
/// <summary>
/// Show API Key Show API Key
/// </summary>
/// <exception cref="ApiException">Thrown when fails to make API call</exception>
/// <param name="id">Api Key ID.</param>
/// <param name="cancellationToken">Cancellation Token to cancel the request.</param>
/// <returns><see cref="Task"/>&lt;<see cref="IGetApiKeysIdApiResponse"/>&gt;</returns>
public async Task<IGetApiKeysIdApiResponse> GetApiKeysIdAsync(int id, System.Threading.CancellationToken cancellationToken = default)
{
UriBuilder uriBuilderLocalVar = new UriBuilder();
try
{
FormatGetApiKeysId(ref id);
using (HttpRequestMessage httpRequestMessageLocalVar = new HttpRequestMessage())
{
uriBuilderLocalVar.Host = HttpClient.BaseAddress!.Host;
uriBuilderLocalVar.Port = HttpClient.BaseAddress.Port;
uriBuilderLocalVar.Scheme = HttpClient.BaseAddress.Scheme;
uriBuilderLocalVar.Path = ClientUtils.CONTEXT_PATH + "/api_keys/{id}";
uriBuilderLocalVar.Path = uriBuilderLocalVar.Path.Replace("%7Bid%7D", Uri.EscapeDataString(id.ToString()));
httpRequestMessageLocalVar.RequestUri = uriBuilderLocalVar.Uri;
httpRequestMessageLocalVar.Method = HttpMethod.Get;
DateTime requestedAtLocalVar = DateTime.UtcNow;
using (HttpResponseMessage httpResponseMessageLocalVar = await HttpClient.SendAsync(httpRequestMessageLocalVar, cancellationToken).ConfigureAwait(false))
{
string responseContentLocalVar = await httpResponseMessageLocalVar.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false);
ILogger<GetApiKeysIdApiResponse> apiResponseLoggerLocalVar = LoggerFactory.CreateLogger<GetApiKeysIdApiResponse>();
GetApiKeysIdApiResponse apiResponseLocalVar = new(apiResponseLoggerLocalVar, httpRequestMessageLocalVar, httpResponseMessageLocalVar, responseContentLocalVar, "/api_keys/{id}", requestedAtLocalVar, _jsonSerializerOptions);
AfterGetApiKeysIdDefaultImplementation(apiResponseLocalVar, id);
Events.ExecuteOnGetApiKeysId(apiResponseLocalVar);
return apiResponseLocalVar;
}
}
}
catch(Exception e)
{
OnErrorGetApiKeysIdDefaultImplementation(e, "/api_keys/{id}", uriBuilderLocalVar.Path, id);
Events.ExecuteOnErrorGetApiKeysId(e);
throw;
}
}
/// <summary>
/// The <see cref="GetApiKeysIdApiResponse"/>
/// </summary>
public partial class GetApiKeysIdApiResponse : Org.OpenAPITools.Client.ApiResponse, IGetApiKeysIdApiResponse
{
/// <summary>
/// The logger
/// </summary>
public ILogger<GetApiKeysIdApiResponse> Logger { get; }
/// <summary>
/// The <see cref="GetApiKeysIdApiResponse"/>
/// </summary>
/// <param name="logger"></param>
/// <param name="httpRequestMessage"></param>
/// <param name="httpResponseMessage"></param>
/// <param name="rawContent"></param>
/// <param name="path"></param>
/// <param name="requestedAt"></param>
/// <param name="jsonSerializerOptions"></param>
public GetApiKeysIdApiResponse(ILogger<GetApiKeysIdApiResponse> logger, System.Net.Http.HttpRequestMessage httpRequestMessage, System.Net.Http.HttpResponseMessage httpResponseMessage, string rawContent, string path, DateTime requestedAt, System.Text.Json.JsonSerializerOptions jsonSerializerOptions) : base(httpRequestMessage, httpResponseMessage, rawContent, path, requestedAt, jsonSerializerOptions)
{
Logger = logger;
OnCreated(httpRequestMessage, httpResponseMessage);
}
partial void OnCreated(global::System.Net.Http.HttpRequestMessage httpRequestMessage, System.Net.Http.HttpResponseMessage httpResponseMessage);
/// <summary>
/// Returns true if the response is 400 BadRequest
/// </summary>
/// <returns></returns>
public bool IsBadRequest => 400 == (int)StatusCode;
private void OnDeserializationErrorDefaultImplementation(Exception exception, HttpStatusCode httpStatusCode)
{
bool suppressDefaultLog = false;
OnDeserializationError(ref suppressDefaultLog, exception, httpStatusCode);
if (!suppressDefaultLog)
Logger.LogError(exception, "An error occurred while deserializing the {code} response.", httpStatusCode);
}
partial void OnDeserializationError(ref bool suppressDefaultLog, Exception exception, HttpStatusCode httpStatusCode);
}
}
}
@@ -0,0 +1,15 @@
using System.Net.Http;
namespace Org.OpenAPITools.Api
{
/// <summary>
/// Any Api client
/// </summary>
public interface IApi
{
/// <summary>
/// The HttpClient
/// </summary>
HttpClient HttpClient { get; }
}
}
@@ -0,0 +1,53 @@
// <auto-generated>
/*
* Files.com API
*
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.0.1
* Contact: support@files.com
* Generated by: https://github.com/openapitools/openapi-generator.git
*/
#nullable enable
using System;
namespace Org.OpenAPITools.Client
{
/// <summary>
/// API Exception
/// </summary>
public class ApiException : Exception
{
/// <summary>
/// The reason the api request failed
/// </summary>
public string? ReasonPhrase { get; }
/// <summary>
/// The HttpStatusCode
/// </summary>
public System.Net.HttpStatusCode StatusCode { get; }
/// <summary>
/// The raw data returned by the api
/// </summary>
public string RawContent { get; }
/// <summary>
/// Construct the ApiException from parts of the response
/// </summary>
/// <param name="reasonPhrase"></param>
/// <param name="statusCode"></param>
/// <param name="rawContent"></param>
public ApiException(string? reasonPhrase, System.Net.HttpStatusCode statusCode, string rawContent) : base(reasonPhrase ?? rawContent)
{
ReasonPhrase = reasonPhrase;
StatusCode = statusCode;
RawContent = rawContent;
}
}
}
@@ -0,0 +1,49 @@
using System;
using Microsoft.Extensions.DependencyInjection;
using Org.OpenAPITools.Api;
namespace Org.OpenAPITools.Client
{
/// <summary>
/// An IApiFactory interface
/// </summary>
public interface IApiFactory
{
/// <summary>
/// A method to create an IApi of type IResult
/// </summary>
/// <typeparam name="IResult"></typeparam>
/// <returns></returns>
IResult Create<IResult>() where IResult : IApi;
}
/// <summary>
/// An ApiFactory
/// </summary>
public class ApiFactory : IApiFactory
{
/// <summary>
/// The service provider
/// </summary>
public IServiceProvider Services { get; }
/// <summary>
/// Initializes a new instance of the <see cref="ApiFactory"/> class.
/// </summary>
/// <param name="services"></param>
public ApiFactory(IServiceProvider services)
{
Services = services;
}
/// <summary>
/// A method to create an IApi of type IResult
/// </summary>
/// <typeparam name="IResult"></typeparam>
/// <returns></returns>
public IResult Create<IResult>() where IResult : IApi
{
return Services.GetRequiredService<IResult>();
}
}
}
@@ -0,0 +1,54 @@
// <auto-generated>
#nullable enable
using System;
namespace Org.OpenAPITools.Client
{
/// <summary>
/// A token constructed from an apiKey.
/// </summary>
public class ApiKeyToken : TokenBase
{
private string _raw;
/// <summary>
/// The header that this token will be used with.
/// </summary>
public ClientUtils.ApiKeyHeader Header { get; }
/// <summary>
/// Constructs an ApiKeyToken object.
/// </summary>
/// <param name="value"></param>
/// <param name="header"></param>
/// <param name="prefix"></param>
/// <param name="timeout"></param>
public ApiKeyToken(string value, ClientUtils.ApiKeyHeader header, string prefix = "Bearer ", TimeSpan? timeout = null) : base(timeout)
{
Header = header;
_raw = $"{ prefix }{ value }";
}
/// <summary>
/// Places the token in the header.
/// </summary>
/// <param name="request"></param>
public virtual void UseInHeader(global::System.Net.Http.HttpRequestMessage request)
{
request.Headers.Add(ClientUtils.ApiKeyHeaderToString(Header), _raw);
}
/// <summary>
/// Places the token in the query.
/// </summary>
/// <param name="request"></param>
/// <param name="uriBuilder"></param>
/// <param name="parseQueryString"></param>
public virtual void UseInQuery(global::System.Net.Http.HttpRequestMessage request, UriBuilder uriBuilder, System.Collections.Specialized.NameValueCollection parseQueryString)
{
parseQueryString[ClientUtils.ApiKeyHeaderToString(Header)] = Uri.EscapeDataString(_raw).ToString()!;
}
}
}
@@ -0,0 +1,24 @@
using System;
namespace Org.OpenAPITools.Client
{
/// <summary>
/// Useful for tracking server health
/// </summary>
public class ApiResponseEventArgs : EventArgs
{
/// <summary>
/// The ApiResponse
/// </summary>
public ApiResponse ApiResponse { get; }
/// <summary>
/// The ApiResponseEventArgs
/// </summary>
/// <param name="apiResponse"></param>
public ApiResponseEventArgs(ApiResponse apiResponse)
{
ApiResponse = apiResponse;
}
}
}
@@ -0,0 +1,153 @@
// <auto-generated>
/*
* Files.com API
*
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.0.1
* Contact: support@files.com
* Generated by: https://github.com/openapitools/openapi-generator.git
*/
#nullable enable
using System;
using System.Diagnostics.CodeAnalysis;
using System.Net;
namespace Org.OpenAPITools.Client
{
/// <summary>
/// Provides a non-generic contract for the ApiResponse wrapper.
/// </summary>
public partial interface IApiResponse
{
/// <summary>
/// The IsSuccessStatusCode from the api response
/// </summary>
bool IsSuccessStatusCode { get; }
/// <summary>
/// Gets the status code (HTTP status code)
/// </summary>
/// <value>The status code.</value>
HttpStatusCode StatusCode { get; }
/// <summary>
/// The raw content of this response.
/// </summary>
string RawContent { get; }
/// <summary>
/// The DateTime when the request was retrieved.
/// </summary>
DateTime DownloadedAt { get; }
/// <summary>
/// The headers contained in the api response
/// </summary>
System.Net.Http.Headers.HttpResponseHeaders Headers { get; }
/// <summary>
/// The path used when making the request.
/// </summary>
string Path { get; }
/// <summary>
/// The reason phrase contained in the api response
/// </summary>
string? ReasonPhrase { get; }
/// <summary>
/// The DateTime when the request was sent.
/// </summary>
DateTime RequestedAt { get; }
/// <summary>
/// The Uri used when making the request.
/// </summary>
Uri? RequestUri { get; }
}
/// <summary>
/// API Response
/// </summary>
public partial class ApiResponse : IApiResponse
{
/// <summary>
/// Gets the status code (HTTP status code)
/// </summary>
/// <value>The status code.</value>
public HttpStatusCode StatusCode { get; }
/// <summary>
/// The raw data
/// </summary>
public string RawContent { get; protected set; }
/// <summary>
/// The IsSuccessStatusCode from the api response
/// </summary>
public bool IsSuccessStatusCode { get; }
/// <summary>
/// The reason phrase contained in the api response
/// </summary>
public string? ReasonPhrase { get; }
/// <summary>
/// The headers contained in the api response
/// </summary>
public System.Net.Http.Headers.HttpResponseHeaders Headers { get; }
/// <summary>
/// The DateTime when the request was retrieved.
/// </summary>
public DateTime DownloadedAt { get; } = DateTime.UtcNow;
/// <summary>
/// The DateTime when the request was sent.
/// </summary>
public DateTime RequestedAt { get; }
/// <summary>
/// The path used when making the request.
/// </summary>
public string Path { get; }
/// <summary>
/// The Uri used when making the request.
/// </summary>
public Uri? RequestUri { get; }
/// <summary>
/// The <see cref="System.Text.Json.JsonSerializerOptions"/>
/// </summary>
protected System.Text.Json.JsonSerializerOptions _jsonSerializerOptions;
/// <summary>
/// Construct the response using an HttpResponseMessage
/// </summary>
/// <param name="httpRequestMessage"></param>
/// <param name="httpResponseMessage"></param>
/// <param name="rawContent"></param>
/// <param name="path"></param>
/// <param name="requestedAt"></param>
/// <param name="jsonSerializerOptions"></param>
public ApiResponse(global::System.Net.Http.HttpRequestMessage httpRequestMessage, System.Net.Http.HttpResponseMessage httpResponseMessage, string rawContent, string path, DateTime requestedAt, System.Text.Json.JsonSerializerOptions jsonSerializerOptions)
{
StatusCode = httpResponseMessage.StatusCode;
Headers = httpResponseMessage.Headers;
IsSuccessStatusCode = httpResponseMessage.IsSuccessStatusCode;
ReasonPhrase = httpResponseMessage.ReasonPhrase;
RawContent = rawContent;
Path = path;
RequestUri = httpRequestMessage.RequestUri;
RequestedAt = requestedAt;
_jsonSerializerOptions = jsonSerializerOptions;
OnCreated(httpRequestMessage, httpResponseMessage);
}
partial void OnCreated(global::System.Net.Http.HttpRequestMessage httpRequestMessage, System.Net.Http.HttpResponseMessage httpResponseMessage);
}
}
@@ -0,0 +1,342 @@
/*
* Files.com API
*
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.0.1
* Contact: support@files.com
* Generated by: https://github.com/openapitools/openapi-generator.git
*/
#nullable enable
using System;
using System.IO;
using System.Linq;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Text.Json;
using System.Text.RegularExpressions;
using System.Runtime.CompilerServices;
[assembly: InternalsVisibleTo("Org.OpenAPITools.Test")]
namespace Org.OpenAPITools.Client
{
/// <summary>
/// Utility functions providing some benefit to API client consumers.
/// </summary>
public static class ClientUtils
{
/// <summary>
/// A delegate for events.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sender"></param>
/// <param name="e"></param>
/// <returns></returns>
public delegate void EventHandler<T>(object sender, T e) where T : EventArgs;
/// <summary>
/// An enum of headers
/// </summary>
public enum ApiKeyHeader
{
/// <summary>
/// The XFilesAPIKey header
/// </summary>
XFilesAPIKey
}
/// <summary>
/// Converte an ApiKeyHeader to a string
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
/// <exception cref="System.ComponentModel.InvalidEnumArgumentException"></exception>
public static string ApiKeyHeaderToString(ApiKeyHeader value)
{
return value switch
{
ApiKeyHeader.XFilesAPIKey => "XFilesAPIKey",
_ => throw new System.ComponentModel.InvalidEnumArgumentException(nameof(value), (int)value, typeof(ApiKeyHeader)),
};
}
/// <summary>
/// Returns true when deserialization succeeds.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="json"></param>
/// <param name="options"></param>
/// <param name="result"></param>
/// <returns></returns>
public static bool TryDeserialize<T>(string json, JsonSerializerOptions options, [global::System.Diagnostics.CodeAnalysis.NotNullWhen(true)] out T? result)
{
try
{
result = JsonSerializer.Deserialize<T>(json, options);
return result != null;
}
catch (Exception)
{
result = default;
return false;
}
}
/// <summary>
/// Returns true when deserialization succeeds.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="reader"></param>
/// <param name="options"></param>
/// <param name="result"></param>
/// <returns></returns>
public static bool TryDeserialize<T>(ref Utf8JsonReader reader, JsonSerializerOptions options, [global::System.Diagnostics.CodeAnalysis.NotNullWhen(true)] out T? result)
{
try
{
result = JsonSerializer.Deserialize<T>(ref reader, options);
return result != null;
}
catch (Exception)
{
result = default;
return false;
}
}
/// <summary>
/// Sanitize filename by removing the path
/// </summary>
/// <param name="filename">Filename</param>
/// <returns>Filename</returns>
public static string SanitizeFilename(string filename)
{
Match match = Regex.Match(filename, @".*[/\\](.*)$");
return match.Success ? match.Groups[1].Value : filename;
}
/// <summary>
/// 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.
/// </summary>
/// <param name="obj">The parameter (header, path, query, form).</param>
/// <param name="format">The DateTime serialization format.</param>
/// <returns>Formatted string.</returns>
public static string? ParameterToString(object? obj, string? format = ISO8601_DATETIME_FORMAT)
{
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(format);
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(format);
if (obj is bool boolean)
return boolean
? "true"
: "false";
if (obj is ICollection collection)
{
List<string?> entries = new();
foreach (var entry in collection)
entries.Add(ParameterToString(entry));
return string.Join(",", entries);
}
return Convert.ToString(obj, System.Globalization.CultureInfo.InvariantCulture);
}
/// <summary>
/// URL encode a string
/// Credit/Ref: https://github.com/restsharp/RestSharp/blob/master/RestSharp/Extensions/StringExtensions.cs#L50
/// </summary>
/// <param name="input">string to be URL encoded</param>
/// <returns>Byte array</returns>
public static string UrlEncode(string input)
{
const int maxLength = 32766;
if (input == null)
{
throw new ArgumentNullException("input");
}
if (input.Length <= maxLength)
{
return Uri.EscapeDataString(input);
}
StringBuilder sb = new StringBuilder(input.Length * 2);
int index = 0;
while (index < input.Length)
{
int length = Math.Min(input.Length - index, maxLength);
string subString = input.Substring(index, length);
sb.Append(Uri.EscapeDataString(subString));
index += subString.Length;
}
return sb.ToString();
}
/// <summary>
/// Encode string in base64 format.
/// </summary>
/// <param name="text">string to be encoded.</param>
/// <returns>Encoded string.</returns>
public static string Base64Encode(string text)
{
return Convert.ToBase64String(global::System.Text.Encoding.UTF8.GetBytes(text));
}
/// <summary>
/// Convert stream to byte array
/// </summary>
/// <param name="inputStream">Input stream to be converted</param>
/// <returns>Byte array</returns>
public static byte[] ReadAsBytes(Stream inputStream)
{
using (var ms = new MemoryStream())
{
inputStream.CopyTo(ms);
return ms.ToArray();
}
}
/// <summary>
/// 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'
/// </summary>
/// <param name="contentTypes">The Content-Type array to select from.</param>
/// <returns>The Content-Type header to use.</returns>
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'
}
/// <summary>
/// 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)
/// </summary>
/// <param name="accepts">The accepts array to select from.</param>
/// <returns>The Accept header to use.</returns>
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);
}
/// <summary>
/// Provides a case-insensitive check that a provided content type is a known JSON-like content type.
/// </summary>
public static readonly Regex JsonRegex = new Regex("(?i)^(application/json|[^;/ \t]+/[^;/ \t]+[+]json)[ \t]*(;.*)?$");
/// <summary>
/// Check if the given MIME is a JSON MIME.
/// JSON MIME examples:
/// application/json
/// application/json; charset=UTF8
/// APPLICATION/JSON
/// application/vnd.company+json
/// </summary>
/// <param name="mime">MIME</param>
/// <returns>Returns True if MIME type is json.</returns>
public static bool IsJsonMime(string mime)
{
if (string.IsNullOrWhiteSpace(mime)) return false;
return JsonRegex.IsMatch(mime) || mime.Equals("application/json-patch+json");
}
/// <summary>
/// Get the discriminator
/// </summary>
/// <param name="utf8JsonReader"></param>
/// <param name="discriminator"></param>
/// <returns></returns>
/// <exception cref="JsonException"></exception>
public static string? GetDiscriminator(Utf8JsonReader utf8JsonReader, string discriminator)
{
int currentDepth = utf8JsonReader.CurrentDepth;
if (utf8JsonReader.TokenType != JsonTokenType.StartObject && utf8JsonReader.TokenType != JsonTokenType.StartArray)
throw new JsonException();
JsonTokenType startingTokenType = utf8JsonReader.TokenType;
while (utf8JsonReader.Read())
{
if (startingTokenType == JsonTokenType.StartObject && utf8JsonReader.TokenType == JsonTokenType.EndObject && currentDepth == utf8JsonReader.CurrentDepth)
break;
if (startingTokenType == JsonTokenType.StartArray && utf8JsonReader.TokenType == JsonTokenType.EndArray && currentDepth == utf8JsonReader.CurrentDepth)
break;
if (utf8JsonReader.TokenType == JsonTokenType.PropertyName && currentDepth == utf8JsonReader.CurrentDepth - 1)
{
string? localVarJsonPropertyName = utf8JsonReader.GetString();
utf8JsonReader.Read();
if (localVarJsonPropertyName != null && localVarJsonPropertyName.Equals(discriminator))
return utf8JsonReader.GetString();
}
}
throw new JsonException("The specified discriminator was not found.");
}
/// <summary>
/// The base path of the API
/// </summary>
public const string BASE_ADDRESS = "http://app.files.com/api/rest/v1";
/// <summary>
/// The scheme of the API
/// </summary>
public const string SCHEME = "http";
/// <summary>
/// The context path of the API
/// </summary>
public const string CONTEXT_PATH = "/api/rest/v1";
/// <summary>
/// The host of the API
/// </summary>
public const string HOST = "app.files.com";
/// <summary>
/// The format to use for DateTime serialization
/// </summary>
public const string ISO8601_DATETIME_FORMAT = "o";
}
}
@@ -0,0 +1,20 @@
// <auto-generated>
#nullable enable
using System.Linq;
using System.Collections.Generic;
namespace Org.OpenAPITools.Client
{
/// <summary>
/// A class containing a CookieContainer
/// </summary>
public sealed class CookieContainer
{
/// <summary>
/// The collection of tokens
/// </summary>
public System.Net.CookieContainer Value { get; } = new System.Net.CookieContainer();
}
}
@@ -0,0 +1,62 @@
/*
* Files.com API
*
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.0.1
* Contact: support@files.com
* Generated by: https://github.com/openapitools/openapi-generator.git
*/
using System;
using System.Globalization;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace Org.OpenAPITools.Client
{
/// <summary>
/// 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
/// </summary>
public class DateOnlyJsonConverter : JsonConverter<DateOnly>
{
/// <summary>
/// The formats used to deserialize the date
/// </summary>
public static string[] Formats { get; } = {
"yyyy'-'MM'-'dd",
"yyyyMMdd"
};
/// <summary>
/// Returns a DateOnly from the Json object
/// </summary>
/// <param name="reader"></param>
/// <param name="typeToConvert"></param>
/// <param name="options"></param>
/// <returns></returns>
public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) {
if (reader.TokenType == JsonTokenType.Null)
throw new NotSupportedException();
string value = reader.GetString()!;
foreach(string format in Formats)
if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateOnly result))
return result;
throw new NotSupportedException();
}
/// <summary>
/// Writes the DateOnly to the json writer
/// </summary>
/// <param name="writer"></param>
/// <param name="dateOnlyValue"></param>
/// <param name="options"></param>
public override void Write(Utf8JsonWriter writer, DateOnly dateOnlyValue, JsonSerializerOptions options) =>
writer.WriteStringValue(dateOnlyValue.ToString("yyyy'-'MM'-'dd", CultureInfo.InvariantCulture));
}
}
@@ -0,0 +1,67 @@
/*
* Files.com API
*
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.0.1
* Contact: support@files.com
* Generated by: https://github.com/openapitools/openapi-generator.git
*/
using System;
using System.Globalization;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace Org.OpenAPITools.Client
{
/// <summary>
/// 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
/// </summary>
public class DateOnlyNullableJsonConverter : JsonConverter<DateOnly?>
{
/// <summary>
/// The formats used to deserialize the date
/// </summary>
public static string[] Formats { get; } = {
"yyyy'-'MM'-'dd",
"yyyyMMdd"
};
/// <summary>
/// Returns a DateOnly from the Json object
/// </summary>
/// <param name="reader"></param>
/// <param name="typeToConvert"></param>
/// <param name="options"></param>
/// <returns></returns>
public override DateOnly? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) {
if (reader.TokenType == JsonTokenType.Null)
return null;
string value = reader.GetString()!;
foreach(string format in Formats)
if (DateOnly.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateOnly result))
return result;
throw new NotSupportedException();
}
/// <summary>
/// Writes the DateOnly to the json writer
/// </summary>
/// <param name="writer"></param>
/// <param name="dateOnlyValue"></param>
/// <param name="options"></param>
public override void Write(Utf8JsonWriter writer, DateOnly? dateOnlyValue, JsonSerializerOptions options)
{
if (dateOnlyValue == null)
writer.WriteNullValue();
else
writer.WriteStringValue(dateOnlyValue.Value.ToString("yyyy'-'MM'-'dd", CultureInfo.InvariantCulture));
}
}
}
@@ -0,0 +1,76 @@
/*
* Files.com API
*
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.0.1
* Contact: support@files.com
* Generated by: https://github.com/openapitools/openapi-generator.git
*/
using System;
using System.Globalization;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace Org.OpenAPITools.Client
{
/// <summary>
/// Formatter for 'date-time' openapi formats ss defined by full-date - RFC3339
/// see https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md#data-types
/// </summary>
public class DateTimeJsonConverter : JsonConverter<DateTime>
{
/// <summary>
/// The formats used to deserialize the date
/// </summary>
public static string[] Formats { get; } = {
"yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK",
"yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK",
"yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK",
"yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK",
"yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK",
"yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK",
"yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK",
"yyyy'-'MM'-'dd'T'HH':'mm':'ssK",
"yyyyMMddTHHmmss.fffffffK",
"yyyyMMddTHHmmss.ffffffK",
"yyyyMMddTHHmmss.fffffK",
"yyyyMMddTHHmmss.ffffK",
"yyyyMMddTHHmmss.fffK",
"yyyyMMddTHHmmss.ffK",
"yyyyMMddTHHmmss.fK",
"yyyyMMddTHHmmssK",
};
/// <summary>
/// Returns a DateTime from the Json object
/// </summary>
/// <param name="reader"></param>
/// <param name="typeToConvert"></param>
/// <param name="options"></param>
/// <returns></returns>
public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) {
if (reader.TokenType == JsonTokenType.Null)
throw new NotSupportedException();
string value = reader.GetString()!;
foreach(string format in Formats)
if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result))
return result;
throw new NotSupportedException();
}
/// <summary>
/// Writes the DateTime to the json writer
/// </summary>
/// <param name="writer"></param>
/// <param name="dateTimeValue"></param>
/// <param name="options"></param>
public override void Write(Utf8JsonWriter writer, DateTime dateTimeValue, JsonSerializerOptions options) =>
writer.WriteStringValue(dateTimeValue.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture));
}
}
@@ -0,0 +1,81 @@
/*
* Files.com API
*
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.0.1
* Contact: support@files.com
* Generated by: https://github.com/openapitools/openapi-generator.git
*/
using System;
using System.Globalization;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace Org.OpenAPITools.Client
{
/// <summary>
/// Formatter for 'date-time' openapi formats ss defined by full-date - RFC3339
/// see https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md#data-types
/// </summary>
public class DateTimeNullableJsonConverter : JsonConverter<DateTime?>
{
/// <summary>
/// The formats used to deserialize the date
/// </summary>
public static string[] Formats { get; } = {
"yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK",
"yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffffK",
"yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffK",
"yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffK",
"yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK",
"yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffK",
"yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fK",
"yyyy'-'MM'-'dd'T'HH':'mm':'ssK",
"yyyyMMddTHHmmss.fffffffK",
"yyyyMMddTHHmmss.ffffffK",
"yyyyMMddTHHmmss.fffffK",
"yyyyMMddTHHmmss.ffffK",
"yyyyMMddTHHmmss.fffK",
"yyyyMMddTHHmmss.ffK",
"yyyyMMddTHHmmss.fK",
"yyyyMMddTHHmmssK",
};
/// <summary>
/// Returns a DateTime from the Json object
/// </summary>
/// <param name="reader"></param>
/// <param name="typeToConvert"></param>
/// <param name="options"></param>
/// <returns></returns>
public override DateTime? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) {
if (reader.TokenType == JsonTokenType.Null)
return null;
string value = reader.GetString()!;
foreach(string format in Formats)
if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out DateTime result))
return result;
return null;
}
/// <summary>
/// Writes the DateTime to the json writer
/// </summary>
/// <param name="writer"></param>
/// <param name="dateTimeValue"></param>
/// <param name="options"></param>
public override void Write(Utf8JsonWriter writer, DateTime? dateTimeValue, JsonSerializerOptions options)
{
if (dateTimeValue == null)
writer.WriteNullValue();
else
writer.WriteStringValue(dateTimeValue.Value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK", CultureInfo.InvariantCulture));
}
}
}
@@ -0,0 +1,24 @@
using System;
namespace Org.OpenAPITools.Client
{
/// <summary>
/// Useful for tracking server health
/// </summary>
public class ExceptionEventArgs : EventArgs
{
/// <summary>
/// The ApiResponse
/// </summary>
public Exception Exception { get; }
/// <summary>
/// The ExcepetionEventArgs
/// </summary>
/// <param name="exception"></param>
public ExceptionEventArgs(Exception exception)
{
Exception = exception;
}
}
}
@@ -0,0 +1,138 @@
/*
* Files.com API
*
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.0.1
* Contact: support@files.com
* Generated by: https://github.com/openapitools/openapi-generator.git
*/
#nullable enable
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Net.Http;
using Microsoft.Extensions.DependencyInjection;
using Org.OpenAPITools.Api;
namespace Org.OpenAPITools.Client
{
/// <summary>
/// Provides hosting configuration for Org.OpenAPITools
/// </summary>
public class HostConfiguration
{
private readonly IServiceCollection _services;
private readonly JsonSerializerOptions _jsonOptions = new JsonSerializerOptions();
internal bool HttpClientsAdded { get; private set; }
/// <summary>
/// Instantiates the class
/// </summary>
/// <param name="services"></param>
public HostConfiguration(IServiceCollection services)
{
_services = services;
_jsonOptions.Converters.Add(new JsonStringEnumConverter());
_jsonOptions.Converters.Add(new DateTimeJsonConverter());
_jsonOptions.Converters.Add(new DateTimeNullableJsonConverter());
_jsonOptions.Converters.Add(new DateOnlyJsonConverter());
_jsonOptions.Converters.Add(new DateOnlyNullableJsonConverter());
JsonSerializerOptionsProvider jsonSerializerOptionsProvider = new(_jsonOptions);
_services.AddSingleton(jsonSerializerOptionsProvider);
_services.AddSingleton<IApiFactory, ApiFactory>();
_services.AddSingleton<APIKEYSApiEvents>();
_services.AddTransient<IAPIKEYSApi, APIKEYSApi>();
_services.AddSingleton<APIKeysApiEvents>();
_services.AddTransient<IAPIKeysApi, APIKeysApi>();
_services.AddSingleton<ApiKeysApiEvents>();
_services.AddTransient<IApiKeysApi, ApiKeysApi>();
}
/// <summary>
/// Configures the HttpClients.
/// </summary>
/// <param name="client"></param>
/// <param name="builder"></param>
/// <returns></returns>
public HostConfiguration AddApiHttpClients
(
Action<HttpClient>? client = null, Action<IHttpClientBuilder>? builder = null)
{
if (client == null)
client = c => c.BaseAddress = new Uri(ClientUtils.BASE_ADDRESS);
List<IHttpClientBuilder> builders = new List<IHttpClientBuilder>();
builders.Add(_services.AddHttpClient<IAPIKEYSApi, APIKEYSApi>(client));
builders.Add(_services.AddHttpClient<IAPIKeysApi, APIKeysApi>(client));
builders.Add(_services.AddHttpClient<IApiKeysApi, ApiKeysApi>(client));
if (builder != null)
foreach (IHttpClientBuilder instance in builders)
builder(instance);
HttpClientsAdded = true;
return this;
}
/// <summary>
/// Configures the JsonSerializerSettings
/// </summary>
/// <param name="options"></param>
/// <returns></returns>
public HostConfiguration ConfigureJsonOptions(Action<JsonSerializerOptions> options)
{
options(_jsonOptions);
return this;
}
/// <summary>
/// Adds tokens to your IServiceCollection
/// </summary>
/// <typeparam name="TTokenBase"></typeparam>
/// <param name="token"></param>
/// <returns></returns>
public HostConfiguration AddTokens<TTokenBase>(TTokenBase token) where TTokenBase : TokenBase
{
return AddTokens(new TTokenBase[]{ token });
}
/// <summary>
/// Adds tokens to your IServiceCollection
/// </summary>
/// <typeparam name="TTokenBase"></typeparam>
/// <param name="tokens"></param>
/// <returns></returns>
public HostConfiguration AddTokens<TTokenBase>(IEnumerable<TTokenBase> tokens) where TTokenBase : TokenBase
{
TokenContainer<TTokenBase> container = new TokenContainer<TTokenBase>(tokens);
_services.AddSingleton(services => container);
return this;
}
/// <summary>
/// Adds a token provider to your IServiceCollection
/// </summary>
/// <typeparam name="TTokenProvider"></typeparam>
/// <typeparam name="TTokenBase"></typeparam>
/// <returns></returns>
public HostConfiguration UseProvider<TTokenProvider, TTokenBase>()
where TTokenProvider : TokenProvider<TTokenBase>
where TTokenBase : TokenBase
{
_services.AddSingleton<TTokenProvider>();
_services.AddSingleton<TokenProvider<TTokenBase>>(services => services.GetRequiredService<TTokenProvider>());
return this;
}
}
}
@@ -0,0 +1,27 @@
// <auto-generated>
#nullable enable
using System.Text.Json;
namespace Org.OpenAPITools.Client
{
/// <summary>
/// Provides the JsonSerializerOptions
/// </summary>
public class JsonSerializerOptionsProvider
{
/// <summary>
/// the JsonSerializerOptions
/// </summary>
public JsonSerializerOptions Options { get; }
/// <summary>
/// Instantiates a JsonSerializerOptionsProvider
/// </summary>
public JsonSerializerOptionsProvider(JsonSerializerOptions options)
{
Options = options;
}
}
}
@@ -0,0 +1,54 @@
// <auto-generated>
/*
* Files.com API
*
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.0.1
* Contact: support@files.com
* Generated by: https://github.com/openapitools/openapi-generator.git
*/
#nullable enable
namespace Org.OpenAPITools.Client
{
/// <summary>
/// A wrapper for operation parameters which are not required
/// </summary>
public struct Option<TType>
{
/// <summary>
/// The value to send to the server
/// </summary>
public TType Value { get; }
/// <summary>
/// When true the value will be sent to the server
/// </summary>
internal bool IsSet { get; }
/// <summary>
/// A wrapper for operation parameters which are not required
/// </summary>
/// <param name="value"></param>
public Option(TType value)
{
IsSet = true;
Value = value;
}
/// <summary>
/// Implicitly converts this option to the contained type
/// </summary>
/// <param name="option"></param>
public static implicit operator TType(Option<TType> option) => option.Value;
/// <summary>
/// Implicitly converts the provided value to an Option
/// </summary>
/// <param name="value"></param>
public static implicit operator Option<TType>(TType value) => new Option<TType>(value);
}
}
@@ -0,0 +1,75 @@
// <auto-generated>
/*
* Files.com API
*
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.0.1
* Contact: support@files.com
* Generated by: https://github.com/openapitools/openapi-generator.git
*/
#nullable enable
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Channels;
namespace Org.OpenAPITools.Client
{
/// <summary>
/// Provides a token to the api clients. Tokens will be rate limited based on the provided TimeSpan.
/// </summary>
/// <typeparam name="TTokenBase"></typeparam>
public class RateLimitProvider<TTokenBase> : TokenProvider<TTokenBase> where TTokenBase : TokenBase
{
internal Dictionary<string, Channel<TTokenBase>> AvailableTokens { get; } = new();
/// <summary>
/// Instantiates a ThrottledTokenProvider. Your tokens will be rate limited based on the token's timeout.
/// </summary>
/// <param name="container"></param>
public RateLimitProvider(TokenContainer<TTokenBase> container) : base(container.Tokens)
{
foreach(TTokenBase token in _tokens)
token.StartTimer(token.Timeout ?? TimeSpan.FromMilliseconds(40));
if (container is TokenContainer<ApiKeyToken> apiKeyTokenContainer)
{
string[] headers = apiKeyTokenContainer.Tokens.Select(t => ClientUtils.ApiKeyHeaderToString(t.Header)).Distinct().ToArray();
foreach (string header in headers)
{
BoundedChannelOptions options = new BoundedChannelOptions(apiKeyTokenContainer.Tokens.Count(t => ClientUtils.ApiKeyHeaderToString(t.Header).Equals(header)))
{
FullMode = BoundedChannelFullMode.DropWrite
};
AvailableTokens.Add(header, Channel.CreateBounded<TTokenBase>(options));
}
}
else
{
BoundedChannelOptions options = new BoundedChannelOptions(_tokens.Length)
{
FullMode = BoundedChannelFullMode.DropWrite
};
AvailableTokens.Add(string.Empty, Channel.CreateBounded<TTokenBase>(options));
}
foreach(Channel<TTokenBase> tokens in AvailableTokens.Values)
for (int i = 0; i < _tokens.Length; i++)
_tokens[i].TokenBecameAvailable += ((sender) => tokens.Writer.TryWrite((TTokenBase) sender));
}
internal override async System.Threading.Tasks.ValueTask<TTokenBase> GetAsync(string header = "", System.Threading.CancellationToken cancellation = default)
{
if (!AvailableTokens.TryGetValue(header, out Channel<TTokenBase>? tokens))
throw new KeyNotFoundException($"Could not locate a token for header '{header}'.");
return await tokens.Reader.ReadAsync(cancellation).ConfigureAwait(false);
}
}
}
@@ -0,0 +1,71 @@
// <auto-generated>
#nullable enable
using System;
namespace Org.OpenAPITools.Client
{
/// <summary>
/// The base for all tokens.
/// </summary>
public abstract class TokenBase
{
private DateTime _nextAvailable = DateTime.UtcNow;
private object _nextAvailableLock = new object();
private readonly System.Timers.Timer _timer = new System.Timers.Timer();
internal TimeSpan? Timeout { get; set; }
internal delegate void TokenBecameAvailableEventHandler(object sender);
internal event TokenBecameAvailableEventHandler? TokenBecameAvailable;
/// <summary>
/// Initialize a TokenBase object.
/// </summary>
/// <param name="timeout"></param>
internal TokenBase(TimeSpan? timeout = null)
{
Timeout = timeout;
if (Timeout != null)
StartTimer(Timeout.Value);
}
/// <summary>
/// Starts the token's timer
/// </summary>
/// <param name="timeout"></param>
internal void StartTimer(TimeSpan timeout)
{
Timeout = timeout;
_timer.Interval = Timeout.Value.TotalMilliseconds;
_timer.Elapsed += OnTimer;
_timer.AutoReset = true;
_timer.Start();
}
/// <summary>
/// Returns true while the token is rate limited.
/// </summary>
public bool IsRateLimited => _nextAvailable > DateTime.UtcNow;
/// <summary>
/// Triggered when the server returns status code TooManyRequests
/// Once triggered the local timeout will be extended an arbitrary length of time.
/// </summary>
public void BeginRateLimit()
{
lock(_nextAvailableLock)
_nextAvailable = DateTime.UtcNow.AddSeconds(5);
}
private void OnTimer(object? sender, System.Timers.ElapsedEventArgs e)
{
if (TokenBecameAvailable != null && !IsRateLimited)
TokenBecameAvailable.Invoke(this);
}
}
}
@@ -0,0 +1,37 @@
// <auto-generated>
#nullable enable
using System.Linq;
using System.Collections.Generic;
namespace Org.OpenAPITools.Client
{
/// <summary>
/// A container for a collection of tokens.
/// </summary>
/// <typeparam name="TTokenBase"></typeparam>
public sealed class TokenContainer<TTokenBase> where TTokenBase : TokenBase
{
/// <summary>
/// The collection of tokens
/// </summary>
public List<TTokenBase> Tokens { get; } = new List<TTokenBase>();
/// <summary>
/// Instantiates a TokenContainer
/// </summary>
public TokenContainer()
{
}
/// <summary>
/// Instantiates a TokenContainer
/// </summary>
/// <param name="tokens"></param>
public TokenContainer(global::System.Collections.Generic.IEnumerable<TTokenBase> tokens)
{
Tokens = tokens.ToList();
}
}
}
@@ -0,0 +1,45 @@
// <auto-generated>
/*
* Files.com API
*
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.0.1
* Contact: support@files.com
* Generated by: https://github.com/openapitools/openapi-generator.git
*/
#nullable enable
using System;
using System.Linq;
using System.Collections.Generic;
using Org.OpenAPITools.Client;
namespace Org.OpenAPITools
{
/// <summary>
/// A class which will provide tokens.
/// </summary>
public abstract class TokenProvider<TTokenBase> where TTokenBase : TokenBase
{
/// <summary>
/// The array of tokens.
/// </summary>
protected TTokenBase[] _tokens;
internal abstract System.Threading.Tasks.ValueTask<TTokenBase> GetAsync(string header = "", System.Threading.CancellationToken cancellation = default);
/// <summary>
/// Instantiates a TokenProvider.
/// </summary>
/// <param name="tokens"></param>
public TokenProvider(IEnumerable<TTokenBase> tokens)
{
_tokens = tokens.ToArray();
if (_tokens.Length == 0)
throw new ArgumentException("You did not provide any tokens.");
}
}
}
@@ -0,0 +1,44 @@
/*
* Files.com API
*
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.0.1
* Contact: support@files.com
* Generated by: https://github.com/openapitools/openapi-generator.git
*/
#nullable enable
using System;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Org.OpenAPITools.Client;
namespace Org.OpenAPITools.Extensions
{
/// <summary>
/// Extension methods for IHostBuilder
/// </summary>
public static class IHostBuilderExtensions
{
/// <summary>
/// Add the api to your host builder.
/// </summary>
/// <param name="builder"></param>
/// <param name="options"></param>
public static IHostBuilder ConfigureApi(this IHostBuilder builder, Action<HostBuilderContext, IServiceCollection, HostConfiguration> options)
{
builder.ConfigureServices((context, services) =>
{
HostConfiguration config = new HostConfiguration(services);
options(context, services, config);
IServiceCollectionExtensions.AddApi(services, config);
});
return builder;
}
}
}
@@ -0,0 +1,80 @@
/*
* Files.com API
*
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.0.1
* Contact: support@files.com
* Generated by: https://github.com/openapitools/openapi-generator.git
*/
#nullable enable
using System;
using System.Net.Http;
using Microsoft.Extensions.DependencyInjection;
using Polly.Timeout;
using Polly.Extensions.Http;
using Polly;
namespace Org.OpenAPITools.Extensions
{
/// <summary>
/// Extension methods for IHttpClientBuilder
/// </summary>
public static class IHttpClientBuilderExtensions
{
/// <summary>
/// Adds a Polly retry policy to your clients.
/// </summary>
/// <param name="client"></param>
/// <param name="retries"></param>
/// <returns></returns>
public static IHttpClientBuilder AddRetryPolicy(this IHttpClientBuilder client, int retries)
{
client.AddPolicyHandler(RetryPolicy(retries));
return client;
}
/// <summary>
/// Adds a Polly timeout policy to your clients.
/// </summary>
/// <param name="client"></param>
/// <param name="timeout"></param>
/// <returns></returns>
public static IHttpClientBuilder AddTimeoutPolicy(this IHttpClientBuilder client, TimeSpan timeout)
{
client.AddPolicyHandler(TimeoutPolicy(timeout));
return client;
}
/// <summary>
/// Adds a Polly circuit breaker to your clients.
/// </summary>
/// <param name="client"></param>
/// <param name="handledEventsAllowedBeforeBreaking"></param>
/// <param name="durationOfBreak"></param>
/// <returns></returns>
public static IHttpClientBuilder AddCircuitBreakerPolicy(this IHttpClientBuilder client, int handledEventsAllowedBeforeBreaking, TimeSpan durationOfBreak)
{
client.AddTransientHttpErrorPolicy(builder => CircuitBreakerPolicy(builder, handledEventsAllowedBeforeBreaking, durationOfBreak));
return client;
}
private static Polly.Retry.AsyncRetryPolicy<HttpResponseMessage> RetryPolicy(int retries)
=> HttpPolicyExtensions
.HandleTransientHttpError()
.Or<TimeoutRejectedException>()
.RetryAsync(retries);
private static AsyncTimeoutPolicy<HttpResponseMessage> TimeoutPolicy(TimeSpan timeout)
=> Policy.TimeoutAsync<HttpResponseMessage>(timeout);
private static Polly.CircuitBreaker.AsyncCircuitBreakerPolicy<HttpResponseMessage> CircuitBreakerPolicy(
PolicyBuilder<HttpResponseMessage> builder, int handledEventsAllowedBeforeBreaking, TimeSpan durationOfBreak)
=> builder.CircuitBreakerAsync(handledEventsAllowedBeforeBreaking, durationOfBreak);
}
}
@@ -0,0 +1,64 @@
/*
* Files.com API
*
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.0.1
* Contact: support@files.com
* Generated by: https://github.com/openapitools/openapi-generator.git
*/
#nullable enable
using System;
using System.Linq;
using Microsoft.Extensions.DependencyInjection;
using Org.OpenAPITools.Client;
namespace Org.OpenAPITools.Extensions
{
/// <summary>
/// Extension methods for IServiceCollection
/// </summary>
public static class IServiceCollectionExtensions
{
/// <summary>
/// Add the api to your host builder.
/// </summary>
/// <param name="services"></param>
/// <param name="options"></param>
public static void AddApi(this IServiceCollection services, Action<HostConfiguration> options)
{
HostConfiguration config = new(services);
options(config);
AddApi(services, config);
}
internal static void AddApi(IServiceCollection services, HostConfiguration host)
{
if (!host.HttpClientsAdded)
host.AddApiHttpClients();
services.AddSingleton<CookieContainer>();
// ensure that a token provider was provided for this token type
// if not, default to RateLimitProvider
var containerServices = services.Where(s => s.ServiceType.IsGenericType &&
s.ServiceType.GetGenericTypeDefinition().IsAssignableFrom(typeof(TokenContainer<>))).ToArray();
foreach(var containerService in containerServices)
{
var tokenType = containerService.ServiceType.GenericTypeArguments[0];
var provider = services.FirstOrDefault(s => s.ServiceType.IsAssignableFrom(typeof(TokenProvider<>).MakeGenericType(tokenType)));
if (provider == null)
{
services.AddSingleton(typeof(RateLimitProvider<>).MakeGenericType(tokenType));
services.AddSingleton(typeof(TokenProvider<>).MakeGenericType(tokenType),
s => s.GetRequiredService(typeof(RateLimitProvider<>).MakeGenericType(tokenType)));
}
}
}
}
}
@@ -0,0 +1,31 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<GenerateAssemblyInfo>true</GenerateAssemblyInfo> <!-- setting GenerateAssemblyInfo to false causes this bug https://github.com/dotnet/project-system/issues/3934 -->
<TargetFramework>net8.0</TargetFramework>
<AssemblyName>Org.OpenAPITools</AssemblyName>
<PackageId>Org.OpenAPITools</PackageId>
<OutputType>Library</OutputType>
<Authors>OpenAPI</Authors>
<Company>OpenAPI</Company>
<AssemblyTitle>OpenAPI Library</AssemblyTitle>
<Description>A library generated from a OpenAPI doc</Description>
<Copyright>No Copyright</Copyright>
<RootNamespace>Org.OpenAPITools</RootNamespace>
<Version>1.0.0</Version>
<DocumentationFile>bin\$(Configuration)\$(TargetFramework)\Org.OpenAPITools.xml</DocumentationFile>
<RepositoryUrl>https://github.com/GIT_USER_ID/GIT_REPO_ID.git</RepositoryUrl>
<RepositoryType>git</RepositoryType>
<PackageReleaseNotes>Minor update</PackageReleaseNotes>
<Nullable>enable</Nullable>
<ManagePackageVersionsCentrally>false</ManagePackageVersionsCentrally>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Http" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Http.Polly" Version="8.0.8" />
<PackageReference Include="Microsoft.Net.Http.Headers" Version="8.0.8" />
</ItemGroup>
</Project>
@@ -0,0 +1,190 @@
# Created with Openapi Generator
<a id="cli"></a>
## Run the following powershell command to generate the library
```ps1
$properties = @(
'apiName=Api',
'targetFramework=net8.0',
'validatable=true',
'nullableReferenceTypes=true',
'hideGenerationTimestamp=true',
'packageVersion=1.0.0',
'packageAuthors=OpenAPI',
'packageCompany=OpenAPI',
'packageCopyright=No Copyright',
'packageDescription=A library generated from a OpenAPI doc',
'packageName=Org.OpenAPITools',
'packageTags=',
'packageTitle=OpenAPI Library'
) -join ","
$global = @(
'apiDocs=true',
'modelDocs=true',
'apiTests=true',
'modelTests=true'
) -join ","
java -jar "<path>/openapi-generator/modules/openapi-generator-cli/target/openapi-generator-cli.jar" generate `
-g csharp-netcore `
-i <your-swagger-file>.yaml `
-o <your-output-folder> `
--library generichost `
--additional-properties $properties `
--global-property $global `
--git-host "github.com" `
--git-repo-id "GIT_REPO_ID" `
--git-user-id "GIT_USER_ID" `
--release-note "Minor update"
# -t templates
```
<a id="usage"></a>
## Using the library in your project
```cs
using System;
using System.Threading.Tasks;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Org.OpenAPITools.Api;
using Org.OpenAPITools.Client;
using Org.OpenAPITools.Model;
namespace YourProject
{
public class Program
{
public static async Task Main(string[] args)
{
var host = CreateHostBuilder(args).Build();
var api = host.Services.GetRequiredService<IAPIKEYSApi>();
GetApiKeysId_1ApiResponse apiResponse = await api.GetApiKeysId_1Async("todo");
object model = apiResponse.Ok();
}
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args)
.ConfigureApi((context, options) =>
{
// the type of token here depends on the api security specifications
ApiKeyToken token = new("<your token>", ClientUtils.ApiKeyHeader.Authorization);
options.AddTokens(token);
// optionally choose the method the tokens will be provided with, default is RateLimitProvider
options.UseProvider<RateLimitProvider<ApiKeyToken>, ApiKeyToken>();
options.ConfigureJsonOptions((jsonOptions) =>
{
// your custom converters if any
});
options.AddApiHttpClients(builder: builder => builder
.AddRetryPolicy(2)
.AddTimeoutPolicy(TimeSpan.FromSeconds(5))
.AddCircuitBreakerPolicy(10, TimeSpan.FromSeconds(30))
// add whatever middleware you prefer
);
});
}
}
```
<a id="questions"></a>
## Questions
- What about HttpRequest failures and retries?
If supportsRetry is enabled, you can configure Polly in the ConfigureClients method.
- How are tokens used?
Tokens are provided by a TokenProvider class. The default is RateLimitProvider which will perform client side rate limiting.
Other providers can be used with the UseProvider method.
- Does an HttpRequest throw an error when the server response is not Ok?
It depends how you made the request. If the return type is ApiResponse<T> no error will be thrown, though the Content property will be null.
StatusCode and ReasonPhrase will contain information about the error.
If the return type is T, then it will throw. If the return type is TOrDefault, it will return null.
- How do I validate requests and process responses?
Use the provided On and After methods in the Api class from the namespace Org.OpenAPITools.Rest.DefaultApi.
Or provide your own class by using the generic ConfigureApi method.
<a id="dependencies"></a>
## Dependencies
- [Microsoft.Extensions.Hosting](https://www.nuget.org/packages/Microsoft.Extensions.Hosting/) - 5.0.0 or later
- [Microsoft.Extensions.Http](https://www.nuget.org/packages/Microsoft.Extensions.Http/) - 5.0.0 or later
- [Microsoft.Extensions.Http.Polly](https://www.nuget.org/packages/Microsoft.Extensions.Http.Polly/) - 5.0.1 or later
- [System.ComponentModel.Annotations](https://www.nuget.org/packages/System.ComponentModel.Annotations) - 4.7.0 or later
<a id="documentation-for-authorization"></a>
## Documentation for Authorization
Authentication schemes defined for the API:
<a id="api_key"></a>
### api_key
- **Type**: API key
- **API key parameter name**: XFilesAPIKey
- **Location**: HTTP header
## Build
- SDK version: 1.0.0
- Generator version: 7.9.0-SNAPSHOT
- Build package: org.openapitools.codegen.languages.CSharpClientCodegen
## Api Information
- appName: Files.com API
- appVersion: 0.0.1
- appDescription: No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
## [OpenApi Global properties](https://openapi-generator.tech/docs/globals)
- generateAliasAsModel:
- supportingFiles:
- models: omitted for brevity
- apis: omitted for brevity
- apiDocs: true
- modelDocs: true
- apiTests: true
- modelTests: true
## [OpenApi Generator Parameters](https://openapi-generator.tech/docs/generators/csharp-netcore)
- allowUnicodeIdentifiers:
- apiName: Api
- caseInsensitiveResponseHeaders:
- conditionalSerialization: false
- disallowAdditionalPropertiesIfNotPresent:
- gitHost: github.com
- gitRepoId: GIT_REPO_ID
- gitUserId: GIT_USER_ID
- hideGenerationTimestamp: true
- interfacePrefix: I
- library: generichost
- licenseId:
- modelPropertyNaming:
- netCoreProjectFile: false
- nonPublicApi: false
- nullableReferenceTypes: true
- optionalAssemblyInfo:
- optionalEmitDefaultValues: false
- optionalMethodArgument: true
- optionalProjectFile:
- packageAuthors: OpenAPI
- packageCompany: OpenAPI
- packageCopyright: No Copyright
- packageDescription: A library generated from a OpenAPI doc
- packageGuid: {321C8C3F-0156-40C1-AE42-D59761FB9B6C}
- packageName: Org.OpenAPITools
- packageTags:
- packageTitle: OpenAPI Library
- packageVersion: 1.0.0
- releaseNote: Minor update
- returnICollection: false
- sortParamsByRequiredFlag:
- sourceFolder: src
- targetFramework: net8.0
- useCollection: false
- useDateTimeOffset: false
- useOneOfDiscriminatorLookup: false
- validatable: true
This C# SDK is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project.