diff --git a/.github/workflows/codegen.yaml b/.github/workflows/codegen.yaml new file mode 100644 index 0000000..ad6ed1d --- /dev/null +++ b/.github/workflows/codegen.yaml @@ -0,0 +1,55 @@ +name: Codegen CI + +on: + push: + branches: + - main + paths: + - "codegen/**" + - ".github/workflows/codegen.yaml" + pull_request: + branches: + - main + paths: + - "codegen/**" + - ".github/workflows/codegen.yaml" + +env: + GOLANGCI_LINT_VERSION: v2.8.0 + +permissions: + contents: read + +defaults: + run: + working-directory: ./codegen + +jobs: + lint: + name: Lint + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + + - uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0 + with: + go-version-file: './codegen/go.mod' + + - name: golangci-lint + uses: golangci/golangci-lint-action@1e7e51e771db61008b38414a730f564565cf7c20 # v9.2.0 + with: + version: ${{ env.GOLANGCI_LINT_VERSION }} + working-directory: ./codegen + + test: + name: Test + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + + - uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0 + with: + go-version-file: './codegen/go.mod' + + - name: Test + run: make test diff --git a/codegen/internal/generator/generator.go b/codegen/internal/generator/generator.go index 1e5e5cb..7525904 100644 --- a/codegen/internal/generator/generator.go +++ b/codegen/internal/generator/generator.go @@ -52,6 +52,7 @@ type Generator struct { schemaTypes map[string]*schemaTypeInfo inlineModels []modelTemplateData modelNames map[string]struct{} + errorModels map[string]struct{} } // New returns a new Generator. @@ -60,6 +61,7 @@ func New(config Config) *Generator { config: config, schemaTypes: map[string]*schemaTypeInfo{}, modelNames: map[string]struct{}{}, + errorModels: map[string]struct{}{}, } } @@ -71,6 +73,7 @@ func (g *Generator) Run(doc *v3.Document) error { g.inlineModels = nil g.modelNames = map[string]struct{}{} + g.errorModels = map[string]struct{}{} if g.config.Namespace == "" { g.config.Namespace = "SumUp" @@ -105,6 +108,13 @@ func (g *Generator) Run(doc *v3.Document) error { }) } + for i := range models { + if _, ok := g.errorModels[models[i].Name]; ok { + models[i].EmitToString = true + models[i].UsesJson = true + } + } + if err := g.renderModels(tmpl, models); err != nil { return err } @@ -412,6 +422,8 @@ func (g *Generator) collectProperties(ownerName string, schema *base.Schema) ([] Description: desc, Required: required, NeedsInitializer: required && !typeInfo.IsValueType && !strings.HasSuffix(typeInfo.TypeName, "?"), + IsValueType: typeInfo.IsValueType, + IsNullable: strings.HasSuffix(typeInfo.TypeName, "?"), } propMap[name] = prop if typeInfo.IsCollection { @@ -550,6 +562,9 @@ func (g *Generator) buildClients(doc *v3.Document) ([]clientTemplateData, error) ct.Operations = append(ct.Operations, method) ct.UsesCollections = ct.UsesCollections || method.UsesCollections ct.UsesJson = true // responses default to JSON + if method.HasErrorResponses { + ct.UsesErrorResponses = true + } } } @@ -618,6 +633,14 @@ func (g *Generator) buildOperation(path, method, methodName, clientName string, if err != nil { return operationTemplateData{}, err } + responseMode, err := g.resolveResponseMode(op) + if err != nil { + return operationTemplateData{}, err + } + errorResponses, err := g.resolveErrorResponses(op, clientName, methodName) + if err != nil { + return operationTemplateData{}, err + } allParams := append(append([]methodParameter{}, toMethodParameters(pathParams)...), toMethodParameters(queryParams)...) allParams = append(allParams, toMethodParameters(headerParams)...) @@ -643,25 +666,28 @@ func (g *Generator) buildOperation(path, method, methodName, clientName string, usesCollections = true } data := operationTemplateData{ - MethodName: methodName, - HttpMethod: method, - HttpMethodExpr: httpMethodExpression(method), - Path: path, - Summary: summary, - Description: description, - PathParams: pathParams, - QueryParams: queryParams, - HeaderParams: headerParams, - Parameters: allParams, - HasParameters: len(allParams) > 0, - HasRequestBody: body != nil, - Body: body, - ResponseType: responseInfo.TypeName, - HasBuilder: len(pathParams)+len(queryParams)+len(headerParams) > 0, - HasPathParams: len(pathParams) > 0, - HasQueryParams: len(queryParams) > 0, - HasHeaderParams: len(headerParams) > 0, - UsesCollections: usesCollections, + MethodName: methodName, + HttpMethod: method, + HttpMethodExpr: httpMethodExpression(method), + Path: path, + Summary: summary, + Description: description, + PathParams: pathParams, + QueryParams: queryParams, + HeaderParams: headerParams, + Parameters: allParams, + HasParameters: len(allParams) > 0, + HasRequestBody: body != nil, + Body: body, + ResponseType: responseInfo.TypeName, + HasBuilder: len(pathParams)+len(queryParams)+len(headerParams) > 0, + HasPathParams: len(pathParams) > 0, + HasQueryParams: len(queryParams) > 0, + HasHeaderParams: len(headerParams) > 0, + UsesCollections: usesCollections, + HasErrorResponses: len(errorResponses) > 0, + ErrorResponses: errorResponses, + ResponseMode: responseMode, } return data, nil } @@ -842,6 +868,122 @@ func (g *Generator) resolveResponseType(op *v3.Operation, clientName, methodName return g.nullableType("JsonDocument", false, true), nil } +func (g *Generator) resolveErrorResponses(op *v3.Operation, clientName, methodName string) ([]errorResponseTemplateData, error) { + if op == nil || op.Responses == nil || op.Responses.Codes == nil || op.Responses.Codes.Len() == 0 { + if op != nil && op.Responses != nil && op.Responses.Default != nil { + return g.resolveDefaultErrorResponse(op.Responses.Default, clientName, methodName) + } + return nil, nil + } + + codes := make([]string, 0, op.Responses.Codes.Len()) + for code := range op.Responses.Codes.KeysFromOldest() { + codes = append(codes, code) + } + sort.Strings(codes) + + var responses []errorResponseTemplateData + for _, code := range codes { + if strings.HasPrefix(code, "2") { + continue + } + resp := op.Responses.Codes.GetOrZero(code) + parsed, err := g.errorResponseForCode(resp, code, clientName, methodName) + if err != nil { + return nil, err + } + if parsed != nil { + responses = append(responses, *parsed) + } + } + + if op.Responses.Default != nil { + defaultResponses, err := g.resolveDefaultErrorResponse(op.Responses.Default, clientName, methodName) + if err != nil { + return nil, err + } + responses = append(responses, defaultResponses...) + } + + return responses, nil +} + +func (g *Generator) resolveDefaultErrorResponse(resp *v3.Response, clientName, methodName string) ([]errorResponseTemplateData, error) { + parsed, err := g.errorResponseForCode(resp, "default", clientName, methodName) + if err != nil { + return nil, err + } + if parsed == nil { + return nil, nil + } + return []errorResponseTemplateData{*parsed}, nil +} + +func (g *Generator) errorResponseForCode(resp *v3.Response, code, clientName, methodName string) (*errorResponseTemplateData, error) { + if resp == nil { + return nil, nil + } + statusSuffix := statusCodeSuffix(code) + inlineBase := fmt.Sprintf("%s%sError%s", clientName, methodName, statusSuffix) + info, err := g.responseTypeForResponse(resp, inlineBase) + if err != nil { + return nil, err + } + if info.TypeName == "" { + return nil, nil + } + errorType := strings.TrimSuffix(info.TypeName, "?") + if errorType != "" { + g.errorModels[errorType] = struct{}{} + } + isDefault := strings.EqualFold(code, "default") + statusLiteral := statusCodeLiteral(code) + if !isDefault && statusLiteral == "" { + return nil, nil + } + return &errorResponseTemplateData{ + StatusCodeLiteral: statusLiteral, + ErrorType: errorType, + IsDefault: isDefault, + }, nil +} + +func statusCodeLiteral(code string) string { + if strings.EqualFold(code, "default") { + return "" + } + if isNumericStatusCode(code) { + return code + } + return "" +} + +func statusCodeSuffix(code string) string { + if strings.EqualFold(code, "default") { + return "Default" + } + if isNumericStatusCode(code) { + return code + } + parsed := naming.PascalIdentifier(code) + if parsed == "" { + return "Unknown" + } + return parsed +} + +func isNumericStatusCode(code string) bool { + if len(code) != 3 { + return false + } + for _, r := range code { + if r < '0' || r > '9' { + return false + } + } + return true +} + func (g *Generator) responseTypeForResponse(resp *v3.Response, inlineBase string) (typeInfo, error) { if resp == nil || resp.Content == nil || resp.Content.Len() == 0 { return typeInfo{}, nil @@ -853,6 +995,58 @@ func (g *Generator) responseTypeForResponse(resp *v3.Response, inlineBase string return g.resolveInlineSchemaType(schemaRef, true, inlineBase) } +func (g *Generator) resolveResponseMode(op *v3.Operation) (string, error) { + if op == nil || op.Responses == nil || op.Responses.Codes == nil || op.Responses.Codes.Len() == 0 { + return "none", nil + } + codes := make([]string, 0, op.Responses.Codes.Len()) + for code := range op.Responses.Codes.KeysFromOldest() { + codes = append(codes, code) + } + sort.Strings(codes) + for _, code := range codes { + if !strings.HasPrefix(code, "2") { + continue + } + resp := op.Responses.Codes.GetOrZero(code) + return g.responseModeForResponse(resp) + } + if resp := op.Responses.Default; resp != nil { + return g.responseModeForResponse(resp) + } + return "none", nil +} + +func (g *Generator) responseModeForResponse(resp *v3.Response) (string, error) { + if resp == nil || resp.Content == nil || resp.Content.Len() == 0 { + return "none", nil + } + contentType := firstContentType(resp.Content) + schemaRef := preferredSchema(resp.Content) + if schemaRef == nil { + if strings.Contains(strings.ToLower(contentType), "text/") { + return "string", nil + } + return "json", nil + } + + typeInfo, err := g.resolveInlineSchemaType(schemaRef, true, "") + if err != nil { + return "", err + } + typeName := strings.TrimSuffix(typeInfo.TypeName, "?") + if typeName == "string" { + return "string", nil + } + if typeName == "JsonDocument" { + if strings.Contains(strings.ToLower(contentType), "text/") { + return "string", nil + } + return "json-document", nil + } + return "json", nil +} + func (g *Generator) operationBaseName(method, path string, op *v3.Operation) string { if name := methodNameFromExtension(op); name != "" { return name @@ -1142,6 +1336,7 @@ type modelTemplateData struct { UsesJson bool HasExtensionData bool ExtensionDataValueType string + EmitToString bool } type modelPropertyTemplateData struct { @@ -1151,6 +1346,8 @@ type modelPropertyTemplateData struct { Description string Required bool NeedsInitializer bool + IsValueType bool + IsNullable bool } type enumValueTemplateData struct { @@ -1159,34 +1356,44 @@ type enumValueTemplateData struct { } type clientTemplateData struct { - Namespace string - ClientName string - PropertyName string - Operations []operationTemplateData - UsesCollections bool - UsesJson bool + Namespace string + ClientName string + PropertyName string + Operations []operationTemplateData + UsesCollections bool + UsesJson bool + UsesErrorResponses bool } type operationTemplateData struct { - MethodName string - HttpMethod string - HttpMethodExpr string - Path string - Summary string - Description string - PathParams []parameterTemplateData - QueryParams []parameterTemplateData - HeaderParams []parameterTemplateData - Parameters []methodParameter - HasParameters bool - HasRequestBody bool - Body *bodyTemplateData - ResponseType string - HasBuilder bool - HasPathParams bool - HasQueryParams bool - HasHeaderParams bool - UsesCollections bool + MethodName string + HttpMethod string + HttpMethodExpr string + Path string + Summary string + Description string + PathParams []parameterTemplateData + QueryParams []parameterTemplateData + HeaderParams []parameterTemplateData + Parameters []methodParameter + HasParameters bool + HasRequestBody bool + Body *bodyTemplateData + ResponseType string + HasBuilder bool + HasPathParams bool + HasQueryParams bool + HasHeaderParams bool + UsesCollections bool + HasErrorResponses bool + ErrorResponses []errorResponseTemplateData + ResponseMode string +} + +type errorResponseTemplateData struct { + StatusCodeLiteral string + ErrorType string + IsDefault bool } type parameterTemplateData struct { diff --git a/codegen/internal/generator/templates/client.tmpl b/codegen/internal/generator/templates/client.tmpl index db4613c..404d34f 100644 --- a/codegen/internal/generator/templates/client.tmpl +++ b/codegen/internal/generator/templates/client.tmpl @@ -53,7 +53,80 @@ public sealed partial class {{ .ClientName }}Client {{- else }} var request = _client.CreateRequest({{ .HttpMethodExpr }}, "{{ .Path }}"); {{- end }} - return _client.Send<{{ .ResponseType }}>(request, {{ if .HasRequestBody }}{{ .Body.ArgName }}{{ else }}null{{ end }}, {{ if .HasRequestBody }}"{{ .Body.ContentType }}"{{ else }}null{{ end }}, cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + + {{- if .HasRequestBody }} + if ({{ .Body.ArgName }} is not null && request.Content is null) + { + request.Content = _client.CreateContent({{ .Body.ArgName }}, "{{ .Body.ContentType }}"); + } + {{- end }} + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + + {{- if .HasErrorResponses }} + switch ((int)response.StatusCode) + { + {{- range .ErrorResponses }} + {{- if not .IsDefault }} + case {{ .StatusCodeLiteral }}: + { + var errorForStatus{{ .StatusCodeLiteral }} = _client.TryDeserialize<{{ .ErrorType }}>(responseBody); + throw new ApiException<{{ .ErrorType }}>(response.StatusCode, errorForStatus{{ .StatusCodeLiteral }}, responseBody, response.RequestMessage?.RequestUri); + } + {{- end }} + {{- end }} + } + {{- $defaultError := "" -}} + {{- range .ErrorResponses }} + {{- if .IsDefault }} + {{- $defaultError = .ErrorType -}} + {{- end }} + {{- end }} + {{- if $defaultError }} + var defaultError = _client.TryDeserialize<{{ $defaultError }}>(responseBody); + throw new ApiException<{{ $defaultError }}>(response.StatusCode, defaultError, responseBody, response.RequestMessage?.RequestUri); + {{- else }} + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + {{- end }} + {{- else }} + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + {{- end }} + } + + {{- if eq .ResponseMode "none" }} + return ApiResponse<{{ .ResponseType }}>.From(default, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + {{- else if eq .ResponseMode "string" }} + var text = ApiClient.ReadContentAsStringAsync(response.Content!, effectiveCancellationToken).GetAwaiter().GetResult(); + return ApiResponse<{{ .ResponseType }}>.From(({{ .ResponseType }})(object)text, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + {{- else if eq .ResponseMode "json-document" }} + using var jsonStream = ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).GetAwaiter().GetResult(); + var document = JsonDocument.Parse(jsonStream); + return ApiResponse<{{ .ResponseType }}>.From(({{ .ResponseType }})(object)document, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + {{- else }} + using var stream = ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).GetAwaiter().GetResult(); + var result = JsonSerializer.Deserialize<{{ .ResponseType }}>(stream, _client.SerializerOptions); + return ApiResponse<{{ .ResponseType }}>.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + {{- end }} + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -85,7 +158,80 @@ public sealed partial class {{ .ClientName }}Client {{- else }} var request = _client.CreateRequest({{ .HttpMethodExpr }}, "{{ .Path }}"); {{- end }} - return await _client.SendAsync<{{ .ResponseType }}>(request, {{ if .HasRequestBody }}{{ .Body.ArgName }}{{ else }}null{{ end }}, {{ if .HasRequestBody }}"{{ .Body.ContentType }}"{{ else }}null{{ end }}, cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + + {{- if .HasRequestBody }} + if ({{ .Body.ArgName }} is not null && request.Content is null) + { + request.Content = _client.CreateContent({{ .Body.ArgName }}, "{{ .Body.ContentType }}"); + } + {{- end }} + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + + {{- if .HasErrorResponses }} + switch ((int)response.StatusCode) + { + {{- range .ErrorResponses }} + {{- if not .IsDefault }} + case {{ .StatusCodeLiteral }}: + { + var errorForStatus{{ .StatusCodeLiteral }} = _client.TryDeserialize<{{ .ErrorType }}>(responseBody); + throw new ApiException<{{ .ErrorType }}>(response.StatusCode, errorForStatus{{ .StatusCodeLiteral }}, responseBody, response.RequestMessage?.RequestUri); + } + {{- end }} + {{- end }} + } + {{- $defaultErrorAsync := "" -}} + {{- range .ErrorResponses }} + {{- if .IsDefault }} + {{- $defaultErrorAsync = .ErrorType -}} + {{- end }} + {{- end }} + {{- if $defaultErrorAsync }} + var defaultError = _client.TryDeserialize<{{ $defaultErrorAsync }}>(responseBody); + throw new ApiException<{{ $defaultErrorAsync }}>(response.StatusCode, defaultError, responseBody, response.RequestMessage?.RequestUri); + {{- else }} + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + {{- end }} + {{- else }} + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + {{- end }} + } + + {{- if eq .ResponseMode "none" }} + return ApiResponse<{{ .ResponseType }}>.From(default, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + {{- else if eq .ResponseMode "string" }} + var text = await ApiClient.ReadContentAsStringAsync(response.Content!, effectiveCancellationToken).ConfigureAwait(false); + return ApiResponse<{{ .ResponseType }}>.From(({{ .ResponseType }})(object)text, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + {{- else if eq .ResponseMode "json-document" }} + using var jsonStream = await ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).ConfigureAwait(false); + var document = await JsonDocument.ParseAsync(jsonStream, cancellationToken: effectiveCancellationToken).ConfigureAwait(false); + return ApiResponse<{{ .ResponseType }}>.From(({{ .ResponseType }})(object)document, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + {{- else }} + using var stream = await ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).ConfigureAwait(false); + var result = await JsonSerializer.DeserializeAsync<{{ .ResponseType }}>(stream, _client.SerializerOptions, effectiveCancellationToken).ConfigureAwait(false); + return ApiResponse<{{ .ResponseType }}>.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + {{- end }} + } + finally + { + timeoutScope?.Dispose(); + } } {{- end }} } diff --git a/codegen/internal/generator/templates/model_class.tmpl b/codegen/internal/generator/templates/model_class.tmpl index 839b5c3..a6b0a39 100644 --- a/codegen/internal/generator/templates/model_class.tmpl +++ b/codegen/internal/generator/templates/model_class.tmpl @@ -11,6 +11,9 @@ using System.Collections.Generic; {{- if .UsesJson }} using System.Text.Json; {{- end }} +{{- if .EmitToString }} +using System.Text; +{{- end }} {{- if .Description }} /// {{ .Description }} @@ -30,5 +33,71 @@ public sealed partial class {{ .Name }} [JsonExtensionData] public IDictionary ExtensionData { get; set; } = new Dictionary(); {{- end }} + +{{- if .EmitToString }} + + public override string ToString() + { + var builder = new StringBuilder(); + builder.Append("{{ .Name }}"); + var hasValue = false; + + void Append(string label, object? value) + { + if (value is null) + { + return; + } + if (!hasValue) + { + builder.Append(" ("); + hasValue = true; + } + else + { + builder.Append(", "); + } + builder.Append(label).Append(": ").Append(value); + } + + void Close() + { + if (hasValue) + { + builder.Append(")"); + } + } + + {{- range .Properties }} + {{- if or (eq .TypeName "string") (eq .TypeName "string?") }} + if (!string.IsNullOrWhiteSpace({{ .PropertyName }})) + { + Append("{{ .JsonName }}", {{ .PropertyName }}); + } + {{- else if .IsValueType }} + {{- if .IsNullable }} + if ({{ .PropertyName }} is not null) + { + Append("{{ .JsonName }}", {{ .PropertyName }}); + } + {{- else }} + Append("{{ .JsonName }}", {{ .PropertyName }}); + {{- end }} + {{- else }} + if ({{ .PropertyName }} is not null) + { + Append("{{ .JsonName }}", {{ .PropertyName }}); + } + {{- end }} + {{- end }} + + Close(); + if (hasValue) + { + return builder.ToString(); + } + return JsonSerializer.Serialize(this); + } +{{- end }} } {{- end }} diff --git a/justfile b/justfile index b49d562..2f8ddce 100644 --- a/justfile +++ b/justfile @@ -21,4 +21,4 @@ build: # Execute the unit test suite. test: - DOTNET_ROLL_FORWARD=Major dotnet test SumUp.sln + DOTNET_ROLL_FORWARD=Major MSBUILDDISABLENODEREUSE=1 MSBUILDNOINPROCNODE=1 dotnet test SumUp.sln --disable-build-servers diff --git a/src/SumUp/CheckoutsClient.g.cs b/src/SumUp/CheckoutsClient.g.cs index fcda3cf..21bee0c 100644 --- a/src/SumUp/CheckoutsClient.g.cs +++ b/src/SumUp/CheckoutsClient.g.cs @@ -30,7 +30,59 @@ internal CheckoutsClient(ApiClient client) public ApiResponse Create(CheckoutCreateRequest body, RequestOptions? requestOptions = null, CancellationToken cancellationToken = default) { var request = _client.CreateRequest(HttpMethod.Post, "/v0.1/checkouts"); - return _client.Send(request, body, "application/json", cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + if (body is not null && request.Content is null) + { + request.Content = _client.CreateContent(body, "application/json"); + } + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + switch ((int)response.StatusCode) + { + case 400: + { + var errorForStatus400 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus400, responseBody, response.RequestMessage?.RequestUri); + } + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + case 403: + { + var errorForStatus403 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus403, responseBody, response.RequestMessage?.RequestUri); + } + case 409: + { + var errorForStatus409 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus409, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).GetAwaiter().GetResult(); + var result = JsonSerializer.Deserialize(stream, _client.SerializerOptions); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -43,7 +95,59 @@ public ApiResponse Create(CheckoutCreateRequest body, RequestOptions? public async Task> CreateAsync(CheckoutCreateRequest body, RequestOptions? requestOptions = null, CancellationToken cancellationToken = default) { var request = _client.CreateRequest(HttpMethod.Post, "/v0.1/checkouts"); - return await _client.SendAsync(request, body, "application/json", cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + if (body is not null && request.Content is null) + { + request.Content = _client.CreateContent(body, "application/json"); + } + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 400: + { + var errorForStatus400 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus400, responseBody, response.RequestMessage?.RequestUri); + } + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + case 403: + { + var errorForStatus403 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus403, responseBody, response.RequestMessage?.RequestUri); + } + case 409: + { + var errorForStatus409 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus409, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = await ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).ConfigureAwait(false); + var result = await JsonSerializer.DeserializeAsync(stream, _client.SerializerOptions, effectiveCancellationToken).ConfigureAwait(false); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -59,7 +163,50 @@ public ApiResponse Deactivate(string id, RequestOptions? requestOption { builder.AddPath("id", id); }); - return _client.Send(request, null, null, cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + switch ((int)response.StatusCode) + { + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + case 409: + { + var errorForStatus409 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus409, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).GetAwaiter().GetResult(); + var result = JsonSerializer.Deserialize(stream, _client.SerializerOptions); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -75,7 +222,50 @@ public async Task> DeactivateAsync(string id, RequestOptio { builder.AddPath("id", id); }); - return await _client.SendAsync(request, null, null, cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + case 409: + { + var errorForStatus409 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus409, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = await ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).ConfigureAwait(false); + var result = await JsonSerializer.DeserializeAsync(stream, _client.SerializerOptions, effectiveCancellationToken).ConfigureAwait(false); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -91,7 +281,45 @@ public ApiResponse Get(string id, RequestOptions? requestOption { builder.AddPath("id", id); }); - return _client.Send(request, null, null, cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + switch ((int)response.StatusCode) + { + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).GetAwaiter().GetResult(); + var result = JsonSerializer.Deserialize(stream, _client.SerializerOptions); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -107,7 +335,45 @@ public async Task> GetAsync(string id, RequestOptio { builder.AddPath("id", id); }); - return await _client.SendAsync(request, null, null, cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = await ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).ConfigureAwait(false); + var result = await JsonSerializer.DeserializeAsync(stream, _client.SerializerOptions, effectiveCancellationToken).ConfigureAwait(false); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -123,7 +389,40 @@ public ApiResponse> List(string? checkoutReference { builder.AddQuery("checkout_reference", checkoutReference); }); - return _client.Send>(request, null, null, cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + switch ((int)response.StatusCode) + { + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).GetAwaiter().GetResult(); + var result = JsonSerializer.Deserialize>(stream, _client.SerializerOptions); + return ApiResponse>.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -139,7 +438,40 @@ public async Task>> ListAsync(string? c { builder.AddQuery("checkout_reference", checkoutReference); }); - return await _client.SendAsync>(request, null, null, cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = await ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).ConfigureAwait(false); + var result = await JsonSerializer.DeserializeAsync>(stream, _client.SerializerOptions, effectiveCancellationToken).ConfigureAwait(false); + return ApiResponse>.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -159,7 +491,45 @@ public ApiResponse ListAvailablePa builder.AddQuery("amount", amount); builder.AddQuery("currency", currency); }); - return _client.Send(request, null, null, cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + switch ((int)response.StatusCode) + { + case 400: + { + var errorForStatus400 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus400, responseBody, response.RequestMessage?.RequestUri); + } + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var jsonStream = ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).GetAwaiter().GetResult(); + var document = JsonDocument.Parse(jsonStream); + return ApiResponse.From((CheckoutsListAvailablePaymentMethodsResponse)(object)document, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -179,7 +549,45 @@ public async Task> Lis builder.AddQuery("amount", amount); builder.AddQuery("currency", currency); }); - return await _client.SendAsync(request, null, null, cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 400: + { + var errorForStatus400 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus400, responseBody, response.RequestMessage?.RequestUri); + } + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var jsonStream = await ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).ConfigureAwait(false); + var document = await JsonDocument.ParseAsync(jsonStream, cancellationToken: effectiveCancellationToken).ConfigureAwait(false); + return ApiResponse.From((CheckoutsListAvailablePaymentMethodsResponse)(object)document, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -196,7 +604,59 @@ public ApiResponse Process(string id, ProcessCheckout body, Req { builder.AddPath("id", id); }); - return _client.Send(request, body, "application/json", cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + if (body is not null && request.Content is null) + { + request.Content = _client.CreateContent(body, "application/json"); + } + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + switch ((int)response.StatusCode) + { + case 400: + { + var errorForStatus400 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus400, responseBody, response.RequestMessage?.RequestUri); + } + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + case 409: + { + var errorForStatus409 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus409, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).GetAwaiter().GetResult(); + var result = JsonSerializer.Deserialize(stream, _client.SerializerOptions); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -213,6 +673,58 @@ public async Task> ProcessAsync(string id, ProcessC { builder.AddPath("id", id); }); - return await _client.SendAsync(request, body, "application/json", cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + if (body is not null && request.Content is null) + { + request.Content = _client.CreateContent(body, "application/json"); + } + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 400: + { + var errorForStatus400 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus400, responseBody, response.RequestMessage?.RequestUri); + } + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + case 409: + { + var errorForStatus409 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus409, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = await ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).ConfigureAwait(false); + var result = await JsonSerializer.DeserializeAsync(stream, _client.SerializerOptions, effectiveCancellationToken).ConfigureAwait(false); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } } \ No newline at end of file diff --git a/src/SumUp/CustomersClient.g.cs b/src/SumUp/CustomersClient.g.cs index 50091f6..6ff8123 100644 --- a/src/SumUp/CustomersClient.g.cs +++ b/src/SumUp/CustomersClient.g.cs @@ -30,7 +30,54 @@ internal CustomersClient(ApiClient client) public ApiResponse Create(Customer body, RequestOptions? requestOptions = null, CancellationToken cancellationToken = default) { var request = _client.CreateRequest(HttpMethod.Post, "/v0.1/customers"); - return _client.Send(request, body, "application/json", cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + if (body is not null && request.Content is null) + { + request.Content = _client.CreateContent(body, "application/json"); + } + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + switch ((int)response.StatusCode) + { + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + case 403: + { + var errorForStatus403 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus403, responseBody, response.RequestMessage?.RequestUri); + } + case 409: + { + var errorForStatus409 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus409, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).GetAwaiter().GetResult(); + var result = JsonSerializer.Deserialize(stream, _client.SerializerOptions); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -43,7 +90,54 @@ public ApiResponse Create(Customer body, RequestOptions? requestOption public async Task> CreateAsync(Customer body, RequestOptions? requestOptions = null, CancellationToken cancellationToken = default) { var request = _client.CreateRequest(HttpMethod.Post, "/v0.1/customers"); - return await _client.SendAsync(request, body, "application/json", cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + if (body is not null && request.Content is null) + { + request.Content = _client.CreateContent(body, "application/json"); + } + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + case 403: + { + var errorForStatus403 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus403, responseBody, response.RequestMessage?.RequestUri); + } + case 409: + { + var errorForStatus409 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus409, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = await ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).ConfigureAwait(false); + var result = await JsonSerializer.DeserializeAsync(stream, _client.SerializerOptions, effectiveCancellationToken).ConfigureAwait(false); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -61,7 +155,48 @@ public ApiResponse DeactivatePaymentInstrument(string customerId, builder.AddPath("customer_id", customerId); builder.AddPath("token", token); }); - return _client.Send(request, null, null, cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + switch ((int)response.StatusCode) + { + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + case 403: + { + var errorForStatus403 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus403, responseBody, response.RequestMessage?.RequestUri); + } + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + return ApiResponse.From(default, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -79,7 +214,48 @@ public async Task> DeactivatePaymentInstrumentAsync(st builder.AddPath("customer_id", customerId); builder.AddPath("token", token); }); - return await _client.SendAsync(request, null, null, cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + case 403: + { + var errorForStatus403 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus403, responseBody, response.RequestMessage?.RequestUri); + } + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + return ApiResponse.From(default, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -95,7 +271,50 @@ public ApiResponse Get(string customerId, RequestOptions? requestOptio { builder.AddPath("customer_id", customerId); }); - return _client.Send(request, null, null, cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + switch ((int)response.StatusCode) + { + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + case 403: + { + var errorForStatus403 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus403, responseBody, response.RequestMessage?.RequestUri); + } + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).GetAwaiter().GetResult(); + var result = JsonSerializer.Deserialize(stream, _client.SerializerOptions); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -111,7 +330,50 @@ public async Task> GetAsync(string customerId, RequestOpti { builder.AddPath("customer_id", customerId); }); - return await _client.SendAsync(request, null, null, cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + case 403: + { + var errorForStatus403 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus403, responseBody, response.RequestMessage?.RequestUri); + } + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = await ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).ConfigureAwait(false); + var result = await JsonSerializer.DeserializeAsync(stream, _client.SerializerOptions, effectiveCancellationToken).ConfigureAwait(false); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -127,7 +389,50 @@ public ApiResponse> ListPaymentInstrument { builder.AddPath("customer_id", customerId); }); - return _client.Send>(request, null, null, cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + switch ((int)response.StatusCode) + { + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + case 403: + { + var errorForStatus403 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus403, responseBody, response.RequestMessage?.RequestUri); + } + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).GetAwaiter().GetResult(); + var result = JsonSerializer.Deserialize>(stream, _client.SerializerOptions); + return ApiResponse>.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -143,7 +448,50 @@ public async Task>> ListPayme { builder.AddPath("customer_id", customerId); }); - return await _client.SendAsync>(request, null, null, cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + case 403: + { + var errorForStatus403 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus403, responseBody, response.RequestMessage?.RequestUri); + } + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = await ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).ConfigureAwait(false); + var result = await JsonSerializer.DeserializeAsync>(stream, _client.SerializerOptions, effectiveCancellationToken).ConfigureAwait(false); + return ApiResponse>.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -160,7 +508,54 @@ public ApiResponse Update(string customerId, CustomersUpdateRequest bo { builder.AddPath("customer_id", customerId); }); - return _client.Send(request, body, "application/json", cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + if (body is not null && request.Content is null) + { + request.Content = _client.CreateContent(body, "application/json"); + } + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + switch ((int)response.StatusCode) + { + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + case 403: + { + var errorForStatus403 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus403, responseBody, response.RequestMessage?.RequestUri); + } + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).GetAwaiter().GetResult(); + var result = JsonSerializer.Deserialize(stream, _client.SerializerOptions); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -177,6 +572,53 @@ public async Task> UpdateAsync(string customerId, Customer { builder.AddPath("customer_id", customerId); }); - return await _client.SendAsync(request, body, "application/json", cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + if (body is not null && request.Content is null) + { + request.Content = _client.CreateContent(body, "application/json"); + } + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + case 403: + { + var errorForStatus403 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus403, responseBody, response.RequestMessage?.RequestUri); + } + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = await ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).ConfigureAwait(false); + var result = await JsonSerializer.DeserializeAsync(stream, _client.SerializerOptions, effectiveCancellationToken).ConfigureAwait(false); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } } \ No newline at end of file diff --git a/src/SumUp/Http/ApiClient.cs b/src/SumUp/Http/ApiClient.cs index 1ee0529..2c327f7 100644 --- a/src/SumUp/Http/ApiClient.cs +++ b/src/SumUp/Http/ApiClient.cs @@ -16,6 +16,10 @@ internal sealed class ApiClient private readonly SumUpClientOptions _options; private readonly JsonSerializerOptions _serializerOptions; + internal HttpClient HttpClient => _httpClient; + + internal JsonSerializerOptions SerializerOptions => _serializerOptions; + internal ApiClient(HttpClient httpClient, SumUpClientOptions options) { _httpClient = httpClient; @@ -41,83 +45,7 @@ internal HttpRequestMessage CreateRequest(HttpMethod method, string pathTemplate return request; } - internal async Task> SendAsync( - HttpRequestMessage request, - object? body, - string? contentType, - CancellationToken cancellationToken, - RequestOptions? requestOptions = null) - { - var effectiveCancellationToken = CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); - - try - { - await ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); - - if (body is not null && request.Content is null) - { - request.Content = CreateContent(body, contentType); - } - - using var response = await _httpClient.SendAsync( - request, - HttpCompletionOption.ResponseHeadersRead, - effectiveCancellationToken).ConfigureAwait(false); - - if (!response.IsSuccessStatusCode) - { - var responseBody = response.Content is null - ? null - : await ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); - - ApiError? error = null; - if (!string.IsNullOrEmpty(responseBody)) - { - error = TryDeserialize(responseBody!); - } - - throw new ApiException(response.StatusCode, error, responseBody, response.RequestMessage?.RequestUri); - } - - if (response.Content == null || response.Content.Headers.ContentLength == 0) - { - return ApiResponse.From(default, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); - } - - if (typeof(T) == typeof(JsonDocument)) - { - using var jsonStream = await ReadContentAsStreamAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); - var document = await JsonDocument.ParseAsync(jsonStream, cancellationToken: effectiveCancellationToken).ConfigureAwait(false); - return ApiResponse.From((T)(object)document, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); - } - - if (typeof(T) == typeof(string)) - { - var text = await ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); - return ApiResponse.From((T)(object)text, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); - } - - using var stream = await ReadContentAsStreamAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); - var result = await JsonSerializer.DeserializeAsync(stream, _serializerOptions, effectiveCancellationToken).ConfigureAwait(false); - return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); - } - finally - { - timeoutScope?.Dispose(); - } - } - - internal ApiResponse Send( - HttpRequestMessage request, - object? body, - string? contentType, - CancellationToken cancellationToken, - RequestOptions? requestOptions = null) - { - return SendAsync(request, body, contentType, cancellationToken, requestOptions).GetAwaiter().GetResult(); - } - - private HttpContent CreateContent(object body, string? contentType) + internal HttpContent CreateContent(object body, string? contentType) { if (body is HttpContent httpContent) { @@ -152,11 +80,16 @@ private HttpContent CreateContent(object body, string? contentType) return new StringContent(json, Encoding.UTF8, contentType ?? "application/json"); } - private TModel? TryDeserialize(string payload) + internal TModel? TryDeserialize(string? payload) { + if (string.IsNullOrEmpty(payload)) + { + return default; + } + try { - return JsonSerializer.Deserialize(payload, _serializerOptions); + return JsonSerializer.Deserialize(payload!, _serializerOptions); } catch { @@ -164,7 +97,7 @@ private HttpContent CreateContent(object body, string? contentType) } } - private static Task ReadContentAsStringAsync(HttpContent content, CancellationToken cancellationToken) + internal static Task ReadContentAsStringAsync(HttpContent content, CancellationToken cancellationToken) { #if NETSTANDARD2_0 cancellationToken.ThrowIfCancellationRequested(); @@ -174,7 +107,7 @@ private static Task ReadContentAsStringAsync(HttpContent content, Cancel #endif } - private static Task ReadContentAsStreamAsync(HttpContent content, CancellationToken cancellationToken) + internal static Task ReadContentAsStreamAsync(HttpContent content, CancellationToken cancellationToken) { #if NETSTANDARD2_0 cancellationToken.ThrowIfCancellationRequested(); @@ -184,7 +117,7 @@ private static Task ReadContentAsStreamAsync(HttpContent content, Cancel #endif } - private async Task ApplyAuthorizationHeaderAsync( + internal async Task ApplyAuthorizationHeaderAsync( HttpRequestMessage request, CancellationToken cancellationToken, RequestOptions? requestOptions) @@ -218,7 +151,7 @@ private static void SetAuthorizationHeader(HttpRequestMessage request, string to request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token); } - private static CancellationToken CreateCancellationToken( + internal static CancellationToken CreateCancellationToken( CancellationToken cancellationToken, RequestOptions? requestOptions, out CancellationTokenSource? timeoutScope) diff --git a/src/SumUp/Http/ApiException.cs b/src/SumUp/Http/ApiException.cs index ed68496..58a82b1 100644 --- a/src/SumUp/Http/ApiException.cs +++ b/src/SumUp/Http/ApiException.cs @@ -1,5 +1,7 @@ using System; +using System; using System.Net; +using System.Text; using System.Text.Json; namespace SumUp.Http; @@ -7,15 +9,11 @@ namespace SumUp.Http; /// /// Raised when the SumUp API replies with a non-successful status code. /// -public sealed class ApiException : Exception +public class ApiException : Exception { public ApiException(HttpStatusCode statusCode, ApiError? error, string? payload, Uri? requestUri) - : base(error?.Message ?? $"SumUp API request failed with status code {(int)statusCode}.") + : this(statusCode, error, payload, requestUri, BuildMessage(statusCode, error)) { - StatusCode = statusCode; - Error = error; - ResponseBody = payload; - RequestUri = requestUri; } public HttpStatusCode StatusCode { get; } @@ -25,6 +23,85 @@ public ApiException(HttpStatusCode statusCode, ApiError? error, string? payload, public string? ResponseBody { get; } public Uri? RequestUri { get; } + + public override string ToString() + { + var builder = new StringBuilder(base.ToString()); + builder.AppendLine(); + AppendDetails(builder); + return builder.ToString(); + } + + protected virtual void AppendDetails(StringBuilder builder) + { + builder.Append("StatusCode: ").Append((int)StatusCode).Append(' ').Append(StatusCode).AppendLine(); + if (RequestUri is not null) + { + builder.Append("RequestUri: ").Append(RequestUri).AppendLine(); + } + if (!string.IsNullOrWhiteSpace(Error?.Code)) + { + builder.Append("ErrorCode: ").Append(Error!.Code).AppendLine(); + } + if (!string.IsNullOrWhiteSpace(Error?.Message)) + { + builder.Append("ErrorMessage: ").Append(Error!.Message).AppendLine(); + } + if (Error?.Details is JsonElement details) + { + builder.Append("ErrorDetails: ").Append(details.ToString()).AppendLine(); + } + if (!string.IsNullOrWhiteSpace(ResponseBody)) + { + builder.Append("ResponseBody: ").Append(ResponseBody).AppendLine(); + } + } + + private static string BuildMessage(HttpStatusCode statusCode, ApiError? error) + { + if (!string.IsNullOrWhiteSpace(error?.Code) || !string.IsNullOrWhiteSpace(error?.Message)) + { + var code = string.IsNullOrWhiteSpace(error?.Code) ? "" : $" ({error!.Code})"; + var message = string.IsNullOrWhiteSpace(error?.Message) ? "" : $" {error!.Message}"; + return $"SumUp API request failed with status code {(int)statusCode}.{code}{message}"; + } + + return $"SumUp API request failed with status code {(int)statusCode}."; + } + + protected ApiException(HttpStatusCode statusCode, ApiError? error, string? payload, Uri? requestUri, string message) + : base(message) + { + StatusCode = statusCode; + Error = error; + ResponseBody = payload; + RequestUri = requestUri; + } +} + +public class ApiException : ApiException where TError : class +{ + public ApiException(HttpStatusCode statusCode, TError? error, string? payload, Uri? requestUri) + : base(statusCode, null, payload, requestUri, BuildMessage(statusCode)) + { + Error = error; + } + + public new TError? Error { get; } + + protected override void AppendDetails(StringBuilder builder) + { + base.AppendDetails(builder); + if (Error is not null) + { + builder.Append("Error: ").Append(Error).AppendLine(); + } + } + + private static string BuildMessage(HttpStatusCode statusCode) + { + return $"SumUp API request failed with status code {(int)statusCode}."; + } } public sealed class ApiError diff --git a/src/SumUp/MembersClient.g.cs b/src/SumUp/MembersClient.g.cs index 16cc4e6..63a7347 100644 --- a/src/SumUp/MembersClient.g.cs +++ b/src/SumUp/MembersClient.g.cs @@ -34,7 +34,54 @@ public ApiResponse Create(string merchantCode, MembersCreateRequest body { builder.AddPath("merchant_code", merchantCode); }); - return _client.Send(request, body, "application/json", cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + if (body is not null && request.Content is null) + { + request.Content = _client.CreateContent(body, "application/json"); + } + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + switch ((int)response.StatusCode) + { + case 400: + { + var errorForStatus400 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus400, responseBody, response.RequestMessage?.RequestUri); + } + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + case 429: + { + var errorForStatus429 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus429, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).GetAwaiter().GetResult(); + var result = JsonSerializer.Deserialize(stream, _client.SerializerOptions); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -51,7 +98,54 @@ public async Task> CreateAsync(string merchantCode, MembersC { builder.AddPath("merchant_code", merchantCode); }); - return await _client.SendAsync(request, body, "application/json", cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + if (body is not null && request.Content is null) + { + request.Content = _client.CreateContent(body, "application/json"); + } + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 400: + { + var errorForStatus400 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus400, responseBody, response.RequestMessage?.RequestUri); + } + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + case 429: + { + var errorForStatus429 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus429, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = await ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).ConfigureAwait(false); + var result = await JsonSerializer.DeserializeAsync(stream, _client.SerializerOptions, effectiveCancellationToken).ConfigureAwait(false); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -69,7 +163,38 @@ public ApiResponse Delete(string merchantCode, string memberId, Re builder.AddPath("merchant_code", merchantCode); builder.AddPath("member_id", memberId); }); - return _client.Send(request, null, null, cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + switch ((int)response.StatusCode) + { + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + return ApiResponse.From(default, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -87,7 +212,38 @@ public async Task> DeleteAsync(string merchantCode, st builder.AddPath("merchant_code", merchantCode); builder.AddPath("member_id", memberId); }); - return await _client.SendAsync(request, null, null, cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + return ApiResponse.From(default, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -105,7 +261,40 @@ public ApiResponse Get(string merchantCode, string memberId, RequestOpti builder.AddPath("merchant_code", merchantCode); builder.AddPath("member_id", memberId); }); - return _client.Send(request, null, null, cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + switch ((int)response.StatusCode) + { + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).GetAwaiter().GetResult(); + var result = JsonSerializer.Deserialize(stream, _client.SerializerOptions); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -123,7 +312,40 @@ public async Task> GetAsync(string merchantCode, string memb builder.AddPath("merchant_code", merchantCode); builder.AddPath("member_id", memberId); }); - return await _client.SendAsync(request, null, null, cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = await ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).ConfigureAwait(false); + var result = await JsonSerializer.DeserializeAsync(stream, _client.SerializerOptions, effectiveCancellationToken).ConfigureAwait(false); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -153,7 +375,40 @@ public ApiResponse List(string merchantCode, int? offset = builder.AddQuery("status", status); builder.AddQuery("roles", roles); }); - return _client.Send(request, null, null, cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + switch ((int)response.StatusCode) + { + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var jsonStream = ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).GetAwaiter().GetResult(); + var document = JsonDocument.Parse(jsonStream); + return ApiResponse.From((MembersListResponse)(object)document, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -183,7 +438,40 @@ public async Task> ListAsync(string merchantCod builder.AddQuery("status", status); builder.AddQuery("roles", roles); }); - return await _client.SendAsync(request, null, null, cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var jsonStream = await ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).ConfigureAwait(false); + var document = await JsonDocument.ParseAsync(jsonStream, cancellationToken: effectiveCancellationToken).ConfigureAwait(false); + return ApiResponse.From((MembersListResponse)(object)document, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -202,7 +490,59 @@ public ApiResponse Update(string merchantCode, string memberId, MembersU builder.AddPath("merchant_code", merchantCode); builder.AddPath("member_id", memberId); }); - return _client.Send(request, body, "application/json", cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + if (body is not null && request.Content is null) + { + request.Content = _client.CreateContent(body, "application/json"); + } + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + switch ((int)response.StatusCode) + { + case 400: + { + var errorForStatus400 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus400, responseBody, response.RequestMessage?.RequestUri); + } + case 403: + { + var errorForStatus403 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus403, responseBody, response.RequestMessage?.RequestUri); + } + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + case 409: + { + var errorForStatus409 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus409, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).GetAwaiter().GetResult(); + var result = JsonSerializer.Deserialize(stream, _client.SerializerOptions); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -221,6 +561,58 @@ public async Task> UpdateAsync(string merchantCode, string m builder.AddPath("merchant_code", merchantCode); builder.AddPath("member_id", memberId); }); - return await _client.SendAsync(request, body, "application/json", cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + if (body is not null && request.Content is null) + { + request.Content = _client.CreateContent(body, "application/json"); + } + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 400: + { + var errorForStatus400 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus400, responseBody, response.RequestMessage?.RequestUri); + } + case 403: + { + var errorForStatus403 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus403, responseBody, response.RequestMessage?.RequestUri); + } + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + case 409: + { + var errorForStatus409 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus409, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = await ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).ConfigureAwait(false); + var result = await JsonSerializer.DeserializeAsync(stream, _client.SerializerOptions, effectiveCancellationToken).ConfigureAwait(false); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } } \ No newline at end of file diff --git a/src/SumUp/MembershipsClient.g.cs b/src/SumUp/MembershipsClient.g.cs index 81deecb..64fe351 100644 --- a/src/SumUp/MembershipsClient.g.cs +++ b/src/SumUp/MembershipsClient.g.cs @@ -51,7 +51,32 @@ public ApiResponse List(int? offset = null, int? limit builder.AddQuery("resource.parent.type", resourceParentType); builder.AddQuery("roles", roles); }); - return _client.Send(request, null, null, cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var jsonStream = ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).GetAwaiter().GetResult(); + var document = JsonDocument.Parse(jsonStream); + return ApiResponse.From((MembershipsListResponse)(object)document, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -85,6 +110,31 @@ public async Task> ListAsync(int? offset = builder.AddQuery("resource.parent.type", resourceParentType); builder.AddQuery("roles", roles); }); - return await _client.SendAsync(request, null, null, cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var jsonStream = await ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).ConfigureAwait(false); + var document = await JsonDocument.ParseAsync(jsonStream, cancellationToken: effectiveCancellationToken).ConfigureAwait(false); + return ApiResponse.From((MembershipsListResponse)(object)document, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } } \ No newline at end of file diff --git a/src/SumUp/MerchantClient.g.cs b/src/SumUp/MerchantClient.g.cs index d37b80c..fe25f31 100644 --- a/src/SumUp/MerchantClient.g.cs +++ b/src/SumUp/MerchantClient.g.cs @@ -33,7 +33,40 @@ public ApiResponse Get(IEnumerable? include = null, Req { builder.AddQuery("include[]", include); }); - return _client.Send(request, null, null, cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + switch ((int)response.StatusCode) + { + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).GetAwaiter().GetResult(); + var result = JsonSerializer.Deserialize(stream, _client.SerializerOptions); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -49,7 +82,40 @@ public async Task> GetAsync(IEnumerable? in { builder.AddQuery("include[]", include); }); - return await _client.SendAsync(request, null, null, cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = await ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).ConfigureAwait(false); + var result = await JsonSerializer.DeserializeAsync(stream, _client.SerializerOptions, effectiveCancellationToken).ConfigureAwait(false); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -61,7 +127,40 @@ public async Task> GetAsync(IEnumerable? in public ApiResponse GetDoingBusinessAs(RequestOptions? requestOptions = null, CancellationToken cancellationToken = default) { var request = _client.CreateRequest(HttpMethod.Get, "/v0.1/me/merchant-profile/doing-business-as"); - return _client.Send(request, null, null, cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + switch ((int)response.StatusCode) + { + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).GetAwaiter().GetResult(); + var result = JsonSerializer.Deserialize(stream, _client.SerializerOptions); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -73,7 +172,40 @@ public ApiResponse GetDoingBusinessAs(RequestOptions? req public async Task> GetDoingBusinessAsAsync(RequestOptions? requestOptions = null, CancellationToken cancellationToken = default) { var request = _client.CreateRequest(HttpMethod.Get, "/v0.1/me/merchant-profile/doing-business-as"); - return await _client.SendAsync(request, null, null, cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = await ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).ConfigureAwait(false); + var result = await JsonSerializer.DeserializeAsync(stream, _client.SerializerOptions, effectiveCancellationToken).ConfigureAwait(false); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -85,7 +217,45 @@ public async Task> GetDoingBusinessAsAsync(Re public ApiResponse GetMerchantProfile(RequestOptions? requestOptions = null, CancellationToken cancellationToken = default) { var request = _client.CreateRequest(HttpMethod.Get, "/v0.1/me/merchant-profile"); - return _client.Send(request, null, null, cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + switch ((int)response.StatusCode) + { + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + case 403: + { + var errorForStatus403 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus403, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).GetAwaiter().GetResult(); + var result = JsonSerializer.Deserialize(stream, _client.SerializerOptions); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -97,7 +267,45 @@ public ApiResponse GetMerchantProfile(RequestOptions? req public async Task> GetMerchantProfileAsync(RequestOptions? requestOptions = null, CancellationToken cancellationToken = default) { var request = _client.CreateRequest(HttpMethod.Get, "/v0.1/me/merchant-profile"); - return await _client.SendAsync(request, null, null, cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + case 403: + { + var errorForStatus403 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus403, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = await ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).ConfigureAwait(false); + var result = await JsonSerializer.DeserializeAsync(stream, _client.SerializerOptions, effectiveCancellationToken).ConfigureAwait(false); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -109,7 +317,40 @@ public async Task> GetMerchantProfileAsync(Re public ApiResponse GetPersonalProfile(RequestOptions? requestOptions = null, CancellationToken cancellationToken = default) { var request = _client.CreateRequest(HttpMethod.Get, "/v0.1/me/personal-profile"); - return _client.Send(request, null, null, cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + switch ((int)response.StatusCode) + { + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).GetAwaiter().GetResult(); + var result = JsonSerializer.Deserialize(stream, _client.SerializerOptions); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -121,6 +362,39 @@ public ApiResponse GetPersonalProfile(RequestOptions? req public async Task> GetPersonalProfileAsync(RequestOptions? requestOptions = null, CancellationToken cancellationToken = default) { var request = _client.CreateRequest(HttpMethod.Get, "/v0.1/me/personal-profile"); - return await _client.SendAsync(request, null, null, cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = await ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).ConfigureAwait(false); + var result = await JsonSerializer.DeserializeAsync(stream, _client.SerializerOptions, effectiveCancellationToken).ConfigureAwait(false); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } } \ No newline at end of file diff --git a/src/SumUp/MerchantsClient.g.cs b/src/SumUp/MerchantsClient.g.cs index 3b487b2..752da8e 100644 --- a/src/SumUp/MerchantsClient.g.cs +++ b/src/SumUp/MerchantsClient.g.cs @@ -34,7 +34,40 @@ public ApiResponse Get(string merchantCode, string? version = null, Re builder.AddPath("merchant_code", merchantCode); builder.AddQuery("version", version); }); - return _client.Send(request, null, null, cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + switch ((int)response.StatusCode) + { + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).GetAwaiter().GetResult(); + var result = JsonSerializer.Deserialize(stream, _client.SerializerOptions); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -52,7 +85,40 @@ public async Task> GetAsync(string merchantCode, string? v builder.AddPath("merchant_code", merchantCode); builder.AddQuery("version", version); }); - return await _client.SendAsync(request, null, null, cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = await ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).ConfigureAwait(false); + var result = await JsonSerializer.DeserializeAsync(stream, _client.SerializerOptions, effectiveCancellationToken).ConfigureAwait(false); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -72,7 +138,45 @@ public ApiResponse GetPerson(string merchantCode, string personId, strin builder.AddPath("person_id", personId); builder.AddQuery("version", version); }); - return _client.Send(request, null, null, cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + switch ((int)response.StatusCode) + { + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + case 500: + { + var errorForStatus500 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus500, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).GetAwaiter().GetResult(); + var result = JsonSerializer.Deserialize(stream, _client.SerializerOptions); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -92,7 +196,45 @@ public async Task> GetPersonAsync(string merchantCode, strin builder.AddPath("person_id", personId); builder.AddQuery("version", version); }); - return await _client.SendAsync(request, null, null, cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + case 500: + { + var errorForStatus500 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus500, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = await ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).ConfigureAwait(false); + var result = await JsonSerializer.DeserializeAsync(stream, _client.SerializerOptions, effectiveCancellationToken).ConfigureAwait(false); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -110,7 +252,45 @@ public ApiResponse ListPersons(string merchantCode, str builder.AddPath("merchant_code", merchantCode); builder.AddQuery("version", version); }); - return _client.Send(request, null, null, cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + switch ((int)response.StatusCode) + { + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + case 500: + { + var errorForStatus500 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus500, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).GetAwaiter().GetResult(); + var result = JsonSerializer.Deserialize(stream, _client.SerializerOptions); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -128,6 +308,44 @@ public async Task> ListPersonsAsync(string builder.AddPath("merchant_code", merchantCode); builder.AddQuery("version", version); }); - return await _client.SendAsync(request, null, null, cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + case 500: + { + var errorForStatus500 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus500, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = await ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).ConfigureAwait(false); + var result = await JsonSerializer.DeserializeAsync(stream, _client.SerializerOptions, effectiveCancellationToken).ConfigureAwait(false); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } } \ No newline at end of file diff --git a/src/SumUp/Models/BadGateway.g.cs b/src/SumUp/Models/BadGateway.g.cs index a8cace5..7834a25 100644 --- a/src/SumUp/Models/BadGateway.g.cs +++ b/src/SumUp/Models/BadGateway.g.cs @@ -4,9 +4,55 @@ namespace SumUp; using System.Text.Json.Serialization; +using System.Text.Json; +using System.Text; /// 502 Bad Gateway public sealed partial class BadGateway { [JsonPropertyName("errors")] public BadGatewayErrors Errors { get; set; } = default!; + + public override string ToString() + { + var builder = new StringBuilder(); + builder.Append("BadGateway"); + var hasValue = false; + + void Append(string label, object? value) + { + if (value is null) + { + return; + } + if (!hasValue) + { + builder.Append(" ("); + hasValue = true; + } + else + { + builder.Append(", "); + } + builder.Append(label).Append(": ").Append(value); + } + + void Close() + { + if (hasValue) + { + builder.Append(")"); + } + } + if (Errors is not null) + { + Append("errors", Errors); + } + + Close(); + if (hasValue) + { + return builder.ToString(); + } + return JsonSerializer.Serialize(this); + } } \ No newline at end of file diff --git a/src/SumUp/Models/BadRequest.g.cs b/src/SumUp/Models/BadRequest.g.cs index 9f6a5aa..9e2a76c 100644 --- a/src/SumUp/Models/BadRequest.g.cs +++ b/src/SumUp/Models/BadRequest.g.cs @@ -4,9 +4,55 @@ namespace SumUp; using System.Text.Json.Serialization; +using System.Text.Json; +using System.Text; /// 400 Bad Request public sealed partial class BadRequest { [JsonPropertyName("errors")] public BadRequestErrors Errors { get; set; } = default!; + + public override string ToString() + { + var builder = new StringBuilder(); + builder.Append("BadRequest"); + var hasValue = false; + + void Append(string label, object? value) + { + if (value is null) + { + return; + } + if (!hasValue) + { + builder.Append(" ("); + hasValue = true; + } + else + { + builder.Append(", "); + } + builder.Append(label).Append(": ").Append(value); + } + + void Close() + { + if (hasValue) + { + builder.Append(")"); + } + } + if (Errors is not null) + { + Append("errors", Errors); + } + + Close(); + if (hasValue) + { + return builder.ToString(); + } + return JsonSerializer.Serialize(this); + } } \ No newline at end of file diff --git a/src/SumUp/Models/CreateReaderCheckoutError.g.cs b/src/SumUp/Models/CreateReaderCheckoutError.g.cs index 878bb23..f85cc92 100644 --- a/src/SumUp/Models/CreateReaderCheckoutError.g.cs +++ b/src/SumUp/Models/CreateReaderCheckoutError.g.cs @@ -4,9 +4,55 @@ namespace SumUp; using System.Text.Json.Serialization; +using System.Text.Json; +using System.Text; /// Error description public sealed partial class CreateReaderCheckoutError { [JsonPropertyName("errors")] public CreateReaderCheckoutErrorErrors Errors { get; set; } = default!; + + public override string ToString() + { + var builder = new StringBuilder(); + builder.Append("CreateReaderCheckoutError"); + var hasValue = false; + + void Append(string label, object? value) + { + if (value is null) + { + return; + } + if (!hasValue) + { + builder.Append(" ("); + hasValue = true; + } + else + { + builder.Append(", "); + } + builder.Append(label).Append(": ").Append(value); + } + + void Close() + { + if (hasValue) + { + builder.Append(")"); + } + } + if (Errors is not null) + { + Append("errors", Errors); + } + + Close(); + if (hasValue) + { + return builder.ToString(); + } + return JsonSerializer.Serialize(this); + } } \ No newline at end of file diff --git a/src/SumUp/Models/CreateReaderCheckoutUnprocessableEntity.g.cs b/src/SumUp/Models/CreateReaderCheckoutUnprocessableEntity.g.cs index 450ea57..ec38748 100644 --- a/src/SumUp/Models/CreateReaderCheckoutUnprocessableEntity.g.cs +++ b/src/SumUp/Models/CreateReaderCheckoutUnprocessableEntity.g.cs @@ -6,9 +6,54 @@ namespace SumUp; using System.Text.Json.Serialization; using System.Collections.Generic; using System.Text.Json; +using System.Text; /// Unprocessable entity public sealed partial class CreateReaderCheckoutUnprocessableEntity { [JsonPropertyName("errors")] public IDictionary Errors { get; set; } = default!; + + public override string ToString() + { + var builder = new StringBuilder(); + builder.Append("CreateReaderCheckoutUnprocessableEntity"); + var hasValue = false; + + void Append(string label, object? value) + { + if (value is null) + { + return; + } + if (!hasValue) + { + builder.Append(" ("); + hasValue = true; + } + else + { + builder.Append(", "); + } + builder.Append(label).Append(": ").Append(value); + } + + void Close() + { + if (hasValue) + { + builder.Append(")"); + } + } + if (Errors is not null) + { + Append("errors", Errors); + } + + Close(); + if (hasValue) + { + return builder.ToString(); + } + return JsonSerializer.Serialize(this); + } } \ No newline at end of file diff --git a/src/SumUp/Models/CreateReaderTerminateError.g.cs b/src/SumUp/Models/CreateReaderTerminateError.g.cs index ea396e1..af04d3a 100644 --- a/src/SumUp/Models/CreateReaderTerminateError.g.cs +++ b/src/SumUp/Models/CreateReaderTerminateError.g.cs @@ -4,9 +4,55 @@ namespace SumUp; using System.Text.Json.Serialization; +using System.Text.Json; +using System.Text; /// Error description public sealed partial class CreateReaderTerminateError { [JsonPropertyName("errors")] public CreateReaderTerminateErrorErrors Errors { get; set; } = default!; + + public override string ToString() + { + var builder = new StringBuilder(); + builder.Append("CreateReaderTerminateError"); + var hasValue = false; + + void Append(string label, object? value) + { + if (value is null) + { + return; + } + if (!hasValue) + { + builder.Append(" ("); + hasValue = true; + } + else + { + builder.Append(", "); + } + builder.Append(label).Append(": ").Append(value); + } + + void Close() + { + if (hasValue) + { + builder.Append(")"); + } + } + if (Errors is not null) + { + Append("errors", Errors); + } + + Close(); + if (hasValue) + { + return builder.ToString(); + } + return JsonSerializer.Serialize(this); + } } \ No newline at end of file diff --git a/src/SumUp/Models/CreateReaderTerminateUnprocessableEntity.g.cs b/src/SumUp/Models/CreateReaderTerminateUnprocessableEntity.g.cs index b548bd1..c8139d4 100644 --- a/src/SumUp/Models/CreateReaderTerminateUnprocessableEntity.g.cs +++ b/src/SumUp/Models/CreateReaderTerminateUnprocessableEntity.g.cs @@ -6,9 +6,54 @@ namespace SumUp; using System.Text.Json.Serialization; using System.Collections.Generic; using System.Text.Json; +using System.Text; /// Unprocessable entity public sealed partial class CreateReaderTerminateUnprocessableEntity { [JsonPropertyName("errors")] public IDictionary Errors { get; set; } = default!; + + public override string ToString() + { + var builder = new StringBuilder(); + builder.Append("CreateReaderTerminateUnprocessableEntity"); + var hasValue = false; + + void Append(string label, object? value) + { + if (value is null) + { + return; + } + if (!hasValue) + { + builder.Append(" ("); + hasValue = true; + } + else + { + builder.Append(", "); + } + builder.Append(label).Append(": ").Append(value); + } + + void Close() + { + if (hasValue) + { + builder.Append(")"); + } + } + if (Errors is not null) + { + Append("errors", Errors); + } + + Close(); + if (hasValue) + { + return builder.ToString(); + } + return JsonSerializer.Serialize(this); + } } \ No newline at end of file diff --git a/src/SumUp/Models/DetailsError.g.cs b/src/SumUp/Models/DetailsError.g.cs index cbb7317..c5dcc99 100644 --- a/src/SumUp/Models/DetailsError.g.cs +++ b/src/SumUp/Models/DetailsError.g.cs @@ -5,6 +5,8 @@ namespace SumUp; using System.Text.Json.Serialization; using System.Collections.Generic; +using System.Text.Json; +using System.Text; /// Error message structure. public sealed partial class DetailsError { @@ -19,4 +21,60 @@ public sealed partial class DetailsError /// Short title of the error. [JsonPropertyName("title")] public string? Title { get; set; } + + public override string ToString() + { + var builder = new StringBuilder(); + builder.Append("DetailsError"); + var hasValue = false; + + void Append(string label, object? value) + { + if (value is null) + { + return; + } + if (!hasValue) + { + builder.Append(" ("); + hasValue = true; + } + else + { + builder.Append(", "); + } + builder.Append(label).Append(": ").Append(value); + } + + void Close() + { + if (hasValue) + { + builder.Append(")"); + } + } + if (!string.IsNullOrWhiteSpace(Details)) + { + Append("details", Details); + } + if (FailedConstraints is not null) + { + Append("failed_constraints", FailedConstraints); + } + if (Status is not null) + { + Append("status", Status); + } + if (!string.IsNullOrWhiteSpace(Title)) + { + Append("title", Title); + } + + Close(); + if (hasValue) + { + return builder.ToString(); + } + return JsonSerializer.Serialize(this); + } } \ No newline at end of file diff --git a/src/SumUp/Models/Error.g.cs b/src/SumUp/Models/Error.g.cs index 3cc7a0a..a140dfd 100644 --- a/src/SumUp/Models/Error.g.cs +++ b/src/SumUp/Models/Error.g.cs @@ -4,6 +4,8 @@ namespace SumUp; using System.Text.Json.Serialization; +using System.Text.Json; +using System.Text; /// Error message structure. public sealed partial class Error { @@ -13,4 +15,52 @@ public sealed partial class Error /// Short description of the error. [JsonPropertyName("message")] public string? Message { get; set; } + + public override string ToString() + { + var builder = new StringBuilder(); + builder.Append("Error"); + var hasValue = false; + + void Append(string label, object? value) + { + if (value is null) + { + return; + } + if (!hasValue) + { + builder.Append(" ("); + hasValue = true; + } + else + { + builder.Append(", "); + } + builder.Append(label).Append(": ").Append(value); + } + + void Close() + { + if (hasValue) + { + builder.Append(")"); + } + } + if (!string.IsNullOrWhiteSpace(ErrorCode)) + { + Append("error_code", ErrorCode); + } + if (!string.IsNullOrWhiteSpace(Message)) + { + Append("message", Message); + } + + Close(); + if (hasValue) + { + return builder.ToString(); + } + return JsonSerializer.Serialize(this); + } } \ No newline at end of file diff --git a/src/SumUp/Models/ErrorExtended.g.cs b/src/SumUp/Models/ErrorExtended.g.cs index 845bace..61e7bd1 100644 --- a/src/SumUp/Models/ErrorExtended.g.cs +++ b/src/SumUp/Models/ErrorExtended.g.cs @@ -4,6 +4,8 @@ namespace SumUp; using System.Text.Json.Serialization; +using System.Text.Json; +using System.Text; public sealed partial class ErrorExtended { /// Platform code for the error. @@ -15,4 +17,56 @@ public sealed partial class ErrorExtended /// Parameter name (with relative location) to which the error applies. Parameters from embedded resources are displayed using dot notation. For example, `card.name` refers to the `name` parameter embedded in the `card` object. [JsonPropertyName("param")] public string? Param { get; set; } + + public override string ToString() + { + var builder = new StringBuilder(); + builder.Append("ErrorExtended"); + var hasValue = false; + + void Append(string label, object? value) + { + if (value is null) + { + return; + } + if (!hasValue) + { + builder.Append(" ("); + hasValue = true; + } + else + { + builder.Append(", "); + } + builder.Append(label).Append(": ").Append(value); + } + + void Close() + { + if (hasValue) + { + builder.Append(")"); + } + } + if (!string.IsNullOrWhiteSpace(ErrorCode)) + { + Append("error_code", ErrorCode); + } + if (!string.IsNullOrWhiteSpace(Message)) + { + Append("message", Message); + } + if (!string.IsNullOrWhiteSpace(Param)) + { + Append("param", Param); + } + + Close(); + if (hasValue) + { + return builder.ToString(); + } + return JsonSerializer.Serialize(this); + } } \ No newline at end of file diff --git a/src/SumUp/Models/ErrorForbidden.g.cs b/src/SumUp/Models/ErrorForbidden.g.cs index 2f2ca97..0b8e0dd 100644 --- a/src/SumUp/Models/ErrorForbidden.g.cs +++ b/src/SumUp/Models/ErrorForbidden.g.cs @@ -4,6 +4,8 @@ namespace SumUp; using System.Text.Json.Serialization; +using System.Text.Json; +using System.Text; /// Error message for forbidden requests. public sealed partial class ErrorForbidden { @@ -16,4 +18,56 @@ public sealed partial class ErrorForbidden /// HTTP status code for the error. [JsonPropertyName("status_code")] public string? StatusCode { get; set; } + + public override string ToString() + { + var builder = new StringBuilder(); + builder.Append("ErrorForbidden"); + var hasValue = false; + + void Append(string label, object? value) + { + if (value is null) + { + return; + } + if (!hasValue) + { + builder.Append(" ("); + hasValue = true; + } + else + { + builder.Append(", "); + } + builder.Append(label).Append(": ").Append(value); + } + + void Close() + { + if (hasValue) + { + builder.Append(")"); + } + } + if (!string.IsNullOrWhiteSpace(ErrorCode)) + { + Append("error_code", ErrorCode); + } + if (!string.IsNullOrWhiteSpace(ErrorMessage)) + { + Append("error_message", ErrorMessage); + } + if (!string.IsNullOrWhiteSpace(StatusCode)) + { + Append("status_code", StatusCode); + } + + Close(); + if (hasValue) + { + return builder.ToString(); + } + return JsonSerializer.Serialize(this); + } } \ No newline at end of file diff --git a/src/SumUp/Models/GatewayTimeout.g.cs b/src/SumUp/Models/GatewayTimeout.g.cs index d02223f..7f257ee 100644 --- a/src/SumUp/Models/GatewayTimeout.g.cs +++ b/src/SumUp/Models/GatewayTimeout.g.cs @@ -4,9 +4,55 @@ namespace SumUp; using System.Text.Json.Serialization; +using System.Text.Json; +using System.Text; /// 504 Gateway Timeout public sealed partial class GatewayTimeout { [JsonPropertyName("errors")] public GatewayTimeoutErrors Errors { get; set; } = default!; + + public override string ToString() + { + var builder = new StringBuilder(); + builder.Append("GatewayTimeout"); + var hasValue = false; + + void Append(string label, object? value) + { + if (value is null) + { + return; + } + if (!hasValue) + { + builder.Append(" ("); + hasValue = true; + } + else + { + builder.Append(", "); + } + builder.Append(label).Append(": ").Append(value); + } + + void Close() + { + if (hasValue) + { + builder.Append(")"); + } + } + if (Errors is not null) + { + Append("errors", Errors); + } + + Close(); + if (hasValue) + { + return builder.ToString(); + } + return JsonSerializer.Serialize(this); + } } \ No newline at end of file diff --git a/src/SumUp/Models/InternalServerError.g.cs b/src/SumUp/Models/InternalServerError.g.cs index 3836403..a43396c 100644 --- a/src/SumUp/Models/InternalServerError.g.cs +++ b/src/SumUp/Models/InternalServerError.g.cs @@ -4,9 +4,55 @@ namespace SumUp; using System.Text.Json.Serialization; +using System.Text.Json; +using System.Text; /// 500 Internal Server Error public sealed partial class InternalServerError { [JsonPropertyName("errors")] public InternalServerErrorErrors Errors { get; set; } = default!; + + public override string ToString() + { + var builder = new StringBuilder(); + builder.Append("InternalServerError"); + var hasValue = false; + + void Append(string label, object? value) + { + if (value is null) + { + return; + } + if (!hasValue) + { + builder.Append(" ("); + hasValue = true; + } + else + { + builder.Append(", "); + } + builder.Append(label).Append(": ").Append(value); + } + + void Close() + { + if (hasValue) + { + builder.Append(")"); + } + } + if (Errors is not null) + { + Append("errors", Errors); + } + + Close(); + if (hasValue) + { + return builder.ToString(); + } + return JsonSerializer.Serialize(this); + } } \ No newline at end of file diff --git a/src/SumUp/Models/MerchantsGetError404.g.cs b/src/SumUp/Models/MerchantsGetError404.g.cs new file mode 100644 index 0000000..41734dd --- /dev/null +++ b/src/SumUp/Models/MerchantsGetError404.g.cs @@ -0,0 +1,79 @@ +// +#nullable enable + +namespace SumUp; + +using System.Text.Json.Serialization; +using System.Text.Json; +using System.Text; +public sealed partial class MerchantsGetError404 +{ + /// The category of the error. + [JsonPropertyName("category")] + public ErrorCategoryClient? Category { get; set; } + /// An error code specifying the exact error that occurred. + [JsonPropertyName("code")] + public ErrorCodeNotFound? Code { get; set; } + /// A unique identifier for the error instance. This can be used to trace the error back to the server logs. + [JsonPropertyName("instance")] + public string? Instance { get; set; } + /// A human-readable message describing the error that occurred. + [JsonPropertyName("message")] + public string? Message { get; set; } + + public override string ToString() + { + var builder = new StringBuilder(); + builder.Append("MerchantsGetError404"); + var hasValue = false; + + void Append(string label, object? value) + { + if (value is null) + { + return; + } + if (!hasValue) + { + builder.Append(" ("); + hasValue = true; + } + else + { + builder.Append(", "); + } + builder.Append(label).Append(": ").Append(value); + } + + void Close() + { + if (hasValue) + { + builder.Append(")"); + } + } + if (Category is not null) + { + Append("category", Category); + } + if (Code is not null) + { + Append("code", Code); + } + if (!string.IsNullOrWhiteSpace(Instance)) + { + Append("instance", Instance); + } + if (!string.IsNullOrWhiteSpace(Message)) + { + Append("message", Message); + } + + Close(); + if (hasValue) + { + return builder.ToString(); + } + return JsonSerializer.Serialize(this); + } +} \ No newline at end of file diff --git a/src/SumUp/Models/MerchantsGetPersonError404.g.cs b/src/SumUp/Models/MerchantsGetPersonError404.g.cs new file mode 100644 index 0000000..2d6f09c --- /dev/null +++ b/src/SumUp/Models/MerchantsGetPersonError404.g.cs @@ -0,0 +1,79 @@ +// +#nullable enable + +namespace SumUp; + +using System.Text.Json.Serialization; +using System.Text.Json; +using System.Text; +public sealed partial class MerchantsGetPersonError404 +{ + /// The category of the error. + [JsonPropertyName("category")] + public ErrorCategoryClient? Category { get; set; } + /// An error code specifying the exact error that occurred. + [JsonPropertyName("code")] + public ErrorCodeNotFound? Code { get; set; } + /// A unique identifier for the error instance. This can be used to trace the error back to the server logs. + [JsonPropertyName("instance")] + public string? Instance { get; set; } + /// A human-readable message describing the error that occurred. + [JsonPropertyName("message")] + public string? Message { get; set; } + + public override string ToString() + { + var builder = new StringBuilder(); + builder.Append("MerchantsGetPersonError404"); + var hasValue = false; + + void Append(string label, object? value) + { + if (value is null) + { + return; + } + if (!hasValue) + { + builder.Append(" ("); + hasValue = true; + } + else + { + builder.Append(", "); + } + builder.Append(label).Append(": ").Append(value); + } + + void Close() + { + if (hasValue) + { + builder.Append(")"); + } + } + if (Category is not null) + { + Append("category", Category); + } + if (Code is not null) + { + Append("code", Code); + } + if (!string.IsNullOrWhiteSpace(Instance)) + { + Append("instance", Instance); + } + if (!string.IsNullOrWhiteSpace(Message)) + { + Append("message", Message); + } + + Close(); + if (hasValue) + { + return builder.ToString(); + } + return JsonSerializer.Serialize(this); + } +} \ No newline at end of file diff --git a/src/SumUp/Models/MerchantsGetPersonError500.g.cs b/src/SumUp/Models/MerchantsGetPersonError500.g.cs new file mode 100644 index 0000000..cb45e1c --- /dev/null +++ b/src/SumUp/Models/MerchantsGetPersonError500.g.cs @@ -0,0 +1,79 @@ +// +#nullable enable + +namespace SumUp; + +using System.Text.Json.Serialization; +using System.Text.Json; +using System.Text; +public sealed partial class MerchantsGetPersonError500 +{ + /// The category of the error. + [JsonPropertyName("category")] + public ErrorCategoryServer? Category { get; set; } + /// An error code specifying the exact error that occurred. + [JsonPropertyName("code")] + public ErrorCodeInternalServerError? Code { get; set; } + /// A unique identifier for the error instance. This can be used to trace the error back to the server logs. + [JsonPropertyName("instance")] + public string? Instance { get; set; } + /// A human-readable message describing the error that occurred. + [JsonPropertyName("message")] + public string? Message { get; set; } + + public override string ToString() + { + var builder = new StringBuilder(); + builder.Append("MerchantsGetPersonError500"); + var hasValue = false; + + void Append(string label, object? value) + { + if (value is null) + { + return; + } + if (!hasValue) + { + builder.Append(" ("); + hasValue = true; + } + else + { + builder.Append(", "); + } + builder.Append(label).Append(": ").Append(value); + } + + void Close() + { + if (hasValue) + { + builder.Append(")"); + } + } + if (Category is not null) + { + Append("category", Category); + } + if (Code is not null) + { + Append("code", Code); + } + if (!string.IsNullOrWhiteSpace(Instance)) + { + Append("instance", Instance); + } + if (!string.IsNullOrWhiteSpace(Message)) + { + Append("message", Message); + } + + Close(); + if (hasValue) + { + return builder.ToString(); + } + return JsonSerializer.Serialize(this); + } +} \ No newline at end of file diff --git a/src/SumUp/Models/MerchantsListPersonsError404.g.cs b/src/SumUp/Models/MerchantsListPersonsError404.g.cs new file mode 100644 index 0000000..be91b9c --- /dev/null +++ b/src/SumUp/Models/MerchantsListPersonsError404.g.cs @@ -0,0 +1,79 @@ +// +#nullable enable + +namespace SumUp; + +using System.Text.Json.Serialization; +using System.Text.Json; +using System.Text; +public sealed partial class MerchantsListPersonsError404 +{ + /// The category of the error. + [JsonPropertyName("category")] + public ErrorCategoryClient? Category { get; set; } + /// An error code specifying the exact error that occurred. + [JsonPropertyName("code")] + public ErrorCodeNotFound? Code { get; set; } + /// A unique identifier for the error instance. This can be used to trace the error back to the server logs. + [JsonPropertyName("instance")] + public string? Instance { get; set; } + /// A human-readable message describing the error that occurred. + [JsonPropertyName("message")] + public string? Message { get; set; } + + public override string ToString() + { + var builder = new StringBuilder(); + builder.Append("MerchantsListPersonsError404"); + var hasValue = false; + + void Append(string label, object? value) + { + if (value is null) + { + return; + } + if (!hasValue) + { + builder.Append(" ("); + hasValue = true; + } + else + { + builder.Append(", "); + } + builder.Append(label).Append(": ").Append(value); + } + + void Close() + { + if (hasValue) + { + builder.Append(")"); + } + } + if (Category is not null) + { + Append("category", Category); + } + if (Code is not null) + { + Append("code", Code); + } + if (!string.IsNullOrWhiteSpace(Instance)) + { + Append("instance", Instance); + } + if (!string.IsNullOrWhiteSpace(Message)) + { + Append("message", Message); + } + + Close(); + if (hasValue) + { + return builder.ToString(); + } + return JsonSerializer.Serialize(this); + } +} \ No newline at end of file diff --git a/src/SumUp/Models/MerchantsListPersonsError500.g.cs b/src/SumUp/Models/MerchantsListPersonsError500.g.cs new file mode 100644 index 0000000..6bc8fef --- /dev/null +++ b/src/SumUp/Models/MerchantsListPersonsError500.g.cs @@ -0,0 +1,79 @@ +// +#nullable enable + +namespace SumUp; + +using System.Text.Json.Serialization; +using System.Text.Json; +using System.Text; +public sealed partial class MerchantsListPersonsError500 +{ + /// The category of the error. + [JsonPropertyName("category")] + public ErrorCategoryServer? Category { get; set; } + /// An error code specifying the exact error that occurred. + [JsonPropertyName("code")] + public ErrorCodeInternalServerError? Code { get; set; } + /// A unique identifier for the error instance. This can be used to trace the error back to the server logs. + [JsonPropertyName("instance")] + public string? Instance { get; set; } + /// A human-readable message describing the error that occurred. + [JsonPropertyName("message")] + public string? Message { get; set; } + + public override string ToString() + { + var builder = new StringBuilder(); + builder.Append("MerchantsListPersonsError500"); + var hasValue = false; + + void Append(string label, object? value) + { + if (value is null) + { + return; + } + if (!hasValue) + { + builder.Append(" ("); + hasValue = true; + } + else + { + builder.Append(", "); + } + builder.Append(label).Append(": ").Append(value); + } + + void Close() + { + if (hasValue) + { + builder.Append(")"); + } + } + if (Category is not null) + { + Append("category", Category); + } + if (Code is not null) + { + Append("code", Code); + } + if (!string.IsNullOrWhiteSpace(Instance)) + { + Append("instance", Instance); + } + if (!string.IsNullOrWhiteSpace(Message)) + { + Append("message", Message); + } + + Close(); + if (hasValue) + { + return builder.ToString(); + } + return JsonSerializer.Serialize(this); + } +} \ No newline at end of file diff --git a/src/SumUp/Models/NotFound.g.cs b/src/SumUp/Models/NotFound.g.cs index 72275a6..5171a4d 100644 --- a/src/SumUp/Models/NotFound.g.cs +++ b/src/SumUp/Models/NotFound.g.cs @@ -4,9 +4,55 @@ namespace SumUp; using System.Text.Json.Serialization; +using System.Text.Json; +using System.Text; /// 404 Not Found public sealed partial class NotFound { [JsonPropertyName("errors")] public NotFoundErrors Errors { get; set; } = default!; + + public override string ToString() + { + var builder = new StringBuilder(); + builder.Append("NotFound"); + var hasValue = false; + + void Append(string label, object? value) + { + if (value is null) + { + return; + } + if (!hasValue) + { + builder.Append(" ("); + hasValue = true; + } + else + { + builder.Append(", "); + } + builder.Append(label).Append(": ").Append(value); + } + + void Close() + { + if (hasValue) + { + builder.Append(")"); + } + } + if (Errors is not null) + { + Append("errors", Errors); + } + + Close(); + if (hasValue) + { + return builder.ToString(); + } + return JsonSerializer.Serialize(this); + } } \ No newline at end of file diff --git a/src/SumUp/Models/Problem.g.cs b/src/SumUp/Models/Problem.g.cs index 2e3bfe6..0b87ffb 100644 --- a/src/SumUp/Models/Problem.g.cs +++ b/src/SumUp/Models/Problem.g.cs @@ -6,6 +6,7 @@ namespace SumUp; using System.Text.Json.Serialization; using System.Collections.Generic; using System.Text.Json; +using System.Text; /// A RFC 9457 problem details object. Additional properties specific to the problem type may be present. public sealed partial class Problem { @@ -27,4 +28,64 @@ public sealed partial class Problem [JsonExtensionData] public IDictionary ExtensionData { get; set; } = new Dictionary(); + + public override string ToString() + { + var builder = new StringBuilder(); + builder.Append("Problem"); + var hasValue = false; + + void Append(string label, object? value) + { + if (value is null) + { + return; + } + if (!hasValue) + { + builder.Append(" ("); + hasValue = true; + } + else + { + builder.Append(", "); + } + builder.Append(label).Append(": ").Append(value); + } + + void Close() + { + if (hasValue) + { + builder.Append(")"); + } + } + if (!string.IsNullOrWhiteSpace(Detail)) + { + Append("detail", Detail); + } + if (!string.IsNullOrWhiteSpace(Instance)) + { + Append("instance", Instance); + } + if (Status is not null) + { + Append("status", Status); + } + if (!string.IsNullOrWhiteSpace(Title)) + { + Append("title", Title); + } + if (!string.IsNullOrWhiteSpace(Type)) + { + Append("type", Type); + } + + Close(); + if (hasValue) + { + return builder.ToString(); + } + return JsonSerializer.Serialize(this); + } } \ No newline at end of file diff --git a/src/SumUp/Models/Unauthorized.g.cs b/src/SumUp/Models/Unauthorized.g.cs index ba6a3b0..723a3a9 100644 --- a/src/SumUp/Models/Unauthorized.g.cs +++ b/src/SumUp/Models/Unauthorized.g.cs @@ -4,9 +4,55 @@ namespace SumUp; using System.Text.Json.Serialization; +using System.Text.Json; +using System.Text; /// 401 Unauthorized public sealed partial class Unauthorized { [JsonPropertyName("errors")] public UnauthorizedErrors Errors { get; set; } = default!; + + public override string ToString() + { + var builder = new StringBuilder(); + builder.Append("Unauthorized"); + var hasValue = false; + + void Append(string label, object? value) + { + if (value is null) + { + return; + } + if (!hasValue) + { + builder.Append(" ("); + hasValue = true; + } + else + { + builder.Append(", "); + } + builder.Append(label).Append(": ").Append(value); + } + + void Close() + { + if (hasValue) + { + builder.Append(")"); + } + } + if (Errors is not null) + { + Append("errors", Errors); + } + + Close(); + if (hasValue) + { + return builder.ToString(); + } + return JsonSerializer.Serialize(this); + } } \ No newline at end of file diff --git a/src/SumUp/PayoutsClient.g.cs b/src/SumUp/PayoutsClient.g.cs index 098c9a4..85d670d 100644 --- a/src/SumUp/PayoutsClient.g.cs +++ b/src/SumUp/PayoutsClient.g.cs @@ -43,7 +43,40 @@ public ApiResponse> List(string merchantCode, DateTime builder.AddQuery("limit", limit); builder.AddQuery("order", order); }); - return _client.Send>(request, null, null, cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + switch ((int)response.StatusCode) + { + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).GetAwaiter().GetResult(); + var result = JsonSerializer.Deserialize>(stream, _client.SerializerOptions); + return ApiResponse>.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -69,7 +102,40 @@ public async Task>> ListAsync(string merch builder.AddQuery("limit", limit); builder.AddQuery("order", order); }); - return await _client.SendAsync>(request, null, null, cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = await ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).ConfigureAwait(false); + var result = await JsonSerializer.DeserializeAsync>(stream, _client.SerializerOptions, effectiveCancellationToken).ConfigureAwait(false); + return ApiResponse>.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -93,7 +159,40 @@ public ApiResponse> ListDeprecated(DateTime startDate, builder.AddQuery("limit", limit); builder.AddQuery("order", order); }); - return _client.Send>(request, null, null, cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + switch ((int)response.StatusCode) + { + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).GetAwaiter().GetResult(); + var result = JsonSerializer.Deserialize>(stream, _client.SerializerOptions); + return ApiResponse>.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -117,6 +216,39 @@ public async Task>> ListDeprecatedAsync(Da builder.AddQuery("limit", limit); builder.AddQuery("order", order); }); - return await _client.SendAsync>(request, null, null, cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = await ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).ConfigureAwait(false); + var result = await JsonSerializer.DeserializeAsync>(stream, _client.SerializerOptions, effectiveCancellationToken).ConfigureAwait(false); + return ApiResponse>.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } } \ No newline at end of file diff --git a/src/SumUp/ReadersClient.g.cs b/src/SumUp/ReadersClient.g.cs index 05697f6..b4c3b74 100644 --- a/src/SumUp/ReadersClient.g.cs +++ b/src/SumUp/ReadersClient.g.cs @@ -33,7 +33,54 @@ public ApiResponse Create(string merchantCode, ReadersCreateRequest body { builder.AddPath("merchant_code", merchantCode); }); - return _client.Send(request, body, "application/json", cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + if (body is not null && request.Content is null) + { + request.Content = _client.CreateContent(body, "application/json"); + } + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + switch ((int)response.StatusCode) + { + case 400: + { + var errorForStatus400 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus400, responseBody, response.RequestMessage?.RequestUri); + } + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + case 409: + { + var errorForStatus409 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus409, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).GetAwaiter().GetResult(); + var result = JsonSerializer.Deserialize(stream, _client.SerializerOptions); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -50,7 +97,54 @@ public async Task> CreateAsync(string merchantCode, ReadersC { builder.AddPath("merchant_code", merchantCode); }); - return await _client.SendAsync(request, body, "application/json", cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + if (body is not null && request.Content is null) + { + request.Content = _client.CreateContent(body, "application/json"); + } + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 400: + { + var errorForStatus400 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus400, responseBody, response.RequestMessage?.RequestUri); + } + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + case 409: + { + var errorForStatus409 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus409, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = await ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).ConfigureAwait(false); + var result = await JsonSerializer.DeserializeAsync(stream, _client.SerializerOptions, effectiveCancellationToken).ConfigureAwait(false); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -69,7 +163,69 @@ public ApiResponse CreateCheckout(string merchantC builder.AddPath("merchant_code", merchantCode); builder.AddPath("reader_id", readerId); }); - return _client.Send(request, body, "application/json", cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + if (body is not null && request.Content is null) + { + request.Content = _client.CreateContent(body, "application/json"); + } + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + switch ((int)response.StatusCode) + { + case 400: + { + var errorForStatus400 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus400, responseBody, response.RequestMessage?.RequestUri); + } + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + case 422: + { + var errorForStatus422 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus422, responseBody, response.RequestMessage?.RequestUri); + } + case 500: + { + var errorForStatus500 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus500, responseBody, response.RequestMessage?.RequestUri); + } + case 502: + { + var errorForStatus502 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus502, responseBody, response.RequestMessage?.RequestUri); + } + case 504: + { + var errorForStatus504 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus504, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).GetAwaiter().GetResult(); + var result = JsonSerializer.Deserialize(stream, _client.SerializerOptions); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -88,7 +244,69 @@ public async Task> CreateCheckoutAsync builder.AddPath("merchant_code", merchantCode); builder.AddPath("reader_id", readerId); }); - return await _client.SendAsync(request, body, "application/json", cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + if (body is not null && request.Content is null) + { + request.Content = _client.CreateContent(body, "application/json"); + } + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 400: + { + var errorForStatus400 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus400, responseBody, response.RequestMessage?.RequestUri); + } + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + case 422: + { + var errorForStatus422 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus422, responseBody, response.RequestMessage?.RequestUri); + } + case 500: + { + var errorForStatus500 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus500, responseBody, response.RequestMessage?.RequestUri); + } + case 502: + { + var errorForStatus502 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus502, responseBody, response.RequestMessage?.RequestUri); + } + case 504: + { + var errorForStatus504 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus504, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = await ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).ConfigureAwait(false); + var result = await JsonSerializer.DeserializeAsync(stream, _client.SerializerOptions, effectiveCancellationToken).ConfigureAwait(false); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -106,7 +324,38 @@ public ApiResponse Delete(string merchantCode, string id, RequestO builder.AddPath("merchant_code", merchantCode); builder.AddPath("id", id); }); - return _client.Send(request, null, null, cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + switch ((int)response.StatusCode) + { + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + return ApiResponse.From(default, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -124,7 +373,38 @@ public async Task> DeleteAsync(string merchantCode, st builder.AddPath("merchant_code", merchantCode); builder.AddPath("id", id); }); - return await _client.SendAsync(request, null, null, cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + return ApiResponse.From(default, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -144,7 +424,40 @@ public ApiResponse Get(string merchantCode, string id, string? ifModifie builder.AddPath("id", id); builder.AddHeader("If-Modified-Since", ifModifiedSince); }); - return _client.Send(request, null, null, cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + switch ((int)response.StatusCode) + { + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).GetAwaiter().GetResult(); + var result = JsonSerializer.Deserialize(stream, _client.SerializerOptions); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -164,7 +477,40 @@ public async Task> GetAsync(string merchantCode, string id, builder.AddPath("id", id); builder.AddHeader("If-Modified-Since", ifModifiedSince); }); - return await _client.SendAsync(request, null, null, cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = await ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).ConfigureAwait(false); + var result = await JsonSerializer.DeserializeAsync(stream, _client.SerializerOptions, effectiveCancellationToken).ConfigureAwait(false); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -188,7 +534,65 @@ public ApiResponse GetStatus(string merchantCode, string readerI builder.AddHeader("Content-Type", contentType); builder.AddHeader("Authorization", authorization); }); - return _client.Send(request, null, null, cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + switch ((int)response.StatusCode) + { + case 400: + { + var errorForStatus400 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus400, responseBody, response.RequestMessage?.RequestUri); + } + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + case 500: + { + var errorForStatus500 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus500, responseBody, response.RequestMessage?.RequestUri); + } + case 502: + { + var errorForStatus502 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus502, responseBody, response.RequestMessage?.RequestUri); + } + case 504: + { + var errorForStatus504 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus504, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).GetAwaiter().GetResult(); + var result = JsonSerializer.Deserialize(stream, _client.SerializerOptions); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -212,7 +616,65 @@ public async Task> GetStatusAsync(string merchantCod builder.AddHeader("Content-Type", contentType); builder.AddHeader("Authorization", authorization); }); - return await _client.SendAsync(request, null, null, cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 400: + { + var errorForStatus400 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus400, responseBody, response.RequestMessage?.RequestUri); + } + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + case 500: + { + var errorForStatus500 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus500, responseBody, response.RequestMessage?.RequestUri); + } + case 502: + { + var errorForStatus502 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus502, responseBody, response.RequestMessage?.RequestUri); + } + case 504: + { + var errorForStatus504 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus504, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = await ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).ConfigureAwait(false); + var result = await JsonSerializer.DeserializeAsync(stream, _client.SerializerOptions, effectiveCancellationToken).ConfigureAwait(false); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -228,7 +690,32 @@ public ApiResponse List(string merchantCode, RequestOptions { builder.AddPath("merchant_code", merchantCode); }); - return _client.Send(request, null, null, cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var jsonStream = ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).GetAwaiter().GetResult(); + var document = JsonDocument.Parse(jsonStream); + return ApiResponse.From((ReadersListResponse)(object)document, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -244,7 +731,32 @@ public async Task> ListAsync(string merchantCod { builder.AddPath("merchant_code", merchantCode); }); - return await _client.SendAsync(request, null, null, cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var jsonStream = await ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).ConfigureAwait(false); + var document = await JsonDocument.ParseAsync(jsonStream, cancellationToken: effectiveCancellationToken).ConfigureAwait(false); + return ApiResponse.From((ReadersListResponse)(object)document, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -262,7 +774,65 @@ public ApiResponse TerminateCheckout(string merchantCode, string r builder.AddPath("merchant_code", merchantCode); builder.AddPath("reader_id", readerId); }); - return _client.Send(request, null, null, cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + switch ((int)response.StatusCode) + { + case 400: + { + var errorForStatus400 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus400, responseBody, response.RequestMessage?.RequestUri); + } + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + case 422: + { + var errorForStatus422 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus422, responseBody, response.RequestMessage?.RequestUri); + } + case 500: + { + var errorForStatus500 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus500, responseBody, response.RequestMessage?.RequestUri); + } + case 502: + { + var errorForStatus502 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus502, responseBody, response.RequestMessage?.RequestUri); + } + case 504: + { + var errorForStatus504 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus504, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).GetAwaiter().GetResult(); + var result = JsonSerializer.Deserialize(stream, _client.SerializerOptions); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -280,7 +850,65 @@ public async Task> TerminateCheckoutAsync(string merch builder.AddPath("merchant_code", merchantCode); builder.AddPath("reader_id", readerId); }); - return await _client.SendAsync(request, null, null, cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 400: + { + var errorForStatus400 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus400, responseBody, response.RequestMessage?.RequestUri); + } + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + case 422: + { + var errorForStatus422 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus422, responseBody, response.RequestMessage?.RequestUri); + } + case 500: + { + var errorForStatus500 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus500, responseBody, response.RequestMessage?.RequestUri); + } + case 502: + { + var errorForStatus502 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus502, responseBody, response.RequestMessage?.RequestUri); + } + case 504: + { + var errorForStatus504 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus504, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = await ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).ConfigureAwait(false); + var result = await JsonSerializer.DeserializeAsync(stream, _client.SerializerOptions, effectiveCancellationToken).ConfigureAwait(false); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -299,7 +927,49 @@ public ApiResponse Update(string merchantCode, string id, ReadersUpdateR builder.AddPath("merchant_code", merchantCode); builder.AddPath("id", id); }); - return _client.Send(request, body, "application/json", cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + if (body is not null && request.Content is null) + { + request.Content = _client.CreateContent(body, "application/json"); + } + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + switch ((int)response.StatusCode) + { + case 403: + { + var errorForStatus403 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus403, responseBody, response.RequestMessage?.RequestUri); + } + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).GetAwaiter().GetResult(); + var result = JsonSerializer.Deserialize(stream, _client.SerializerOptions); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -318,6 +988,48 @@ public async Task> UpdateAsync(string merchantCode, string i builder.AddPath("merchant_code", merchantCode); builder.AddPath("id", id); }); - return await _client.SendAsync(request, body, "application/json", cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + if (body is not null && request.Content is null) + { + request.Content = _client.CreateContent(body, "application/json"); + } + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 403: + { + var errorForStatus403 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus403, responseBody, response.RequestMessage?.RequestUri); + } + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = await ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).ConfigureAwait(false); + var result = await JsonSerializer.DeserializeAsync(stream, _client.SerializerOptions, effectiveCancellationToken).ConfigureAwait(false); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } } \ No newline at end of file diff --git a/src/SumUp/ReceiptsClient.g.cs b/src/SumUp/ReceiptsClient.g.cs index d9cedbe..151f576 100644 --- a/src/SumUp/ReceiptsClient.g.cs +++ b/src/SumUp/ReceiptsClient.g.cs @@ -36,7 +36,45 @@ public ApiResponse Get(string id, string mid, int? txEventId = null, Re builder.AddQuery("mid", mid); builder.AddQuery("tx_event_id", txEventId); }); - return _client.Send(request, null, null, cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + switch ((int)response.StatusCode) + { + case 400: + { + var errorForStatus400 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus400, responseBody, response.RequestMessage?.RequestUri); + } + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).GetAwaiter().GetResult(); + var result = JsonSerializer.Deserialize(stream, _client.SerializerOptions); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -56,6 +94,44 @@ public async Task> GetAsync(string id, string mid, int? txE builder.AddQuery("mid", mid); builder.AddQuery("tx_event_id", txEventId); }); - return await _client.SendAsync(request, null, null, cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 400: + { + var errorForStatus400 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus400, responseBody, response.RequestMessage?.RequestUri); + } + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = await ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).ConfigureAwait(false); + var result = await JsonSerializer.DeserializeAsync(stream, _client.SerializerOptions, effectiveCancellationToken).ConfigureAwait(false); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } } \ No newline at end of file diff --git a/src/SumUp/RolesClient.g.cs b/src/SumUp/RolesClient.g.cs index a2d3a32..65c7c70 100644 --- a/src/SumUp/RolesClient.g.cs +++ b/src/SumUp/RolesClient.g.cs @@ -33,7 +33,49 @@ public ApiResponse Create(string merchantCode, RolesCreateRequest body, Re { builder.AddPath("merchant_code", merchantCode); }); - return _client.Send(request, body, "application/json", cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + if (body is not null && request.Content is null) + { + request.Content = _client.CreateContent(body, "application/json"); + } + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + switch ((int)response.StatusCode) + { + case 400: + { + var errorForStatus400 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus400, responseBody, response.RequestMessage?.RequestUri); + } + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).GetAwaiter().GetResult(); + var result = JsonSerializer.Deserialize(stream, _client.SerializerOptions); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -50,7 +92,49 @@ public async Task> CreateAsync(string merchantCode, RolesCreat { builder.AddPath("merchant_code", merchantCode); }); - return await _client.SendAsync(request, body, "application/json", cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + if (body is not null && request.Content is null) + { + request.Content = _client.CreateContent(body, "application/json"); + } + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 400: + { + var errorForStatus400 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus400, responseBody, response.RequestMessage?.RequestUri); + } + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = await ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).ConfigureAwait(false); + var result = await JsonSerializer.DeserializeAsync(stream, _client.SerializerOptions, effectiveCancellationToken).ConfigureAwait(false); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -68,7 +152,43 @@ public ApiResponse Delete(string merchantCode, string roleId, Requ builder.AddPath("merchant_code", merchantCode); builder.AddPath("role_id", roleId); }); - return _client.Send(request, null, null, cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + switch ((int)response.StatusCode) + { + case 400: + { + var errorForStatus400 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus400, responseBody, response.RequestMessage?.RequestUri); + } + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + return ApiResponse.From(default, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -86,7 +206,43 @@ public async Task> DeleteAsync(string merchantCode, st builder.AddPath("merchant_code", merchantCode); builder.AddPath("role_id", roleId); }); - return await _client.SendAsync(request, null, null, cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 400: + { + var errorForStatus400 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus400, responseBody, response.RequestMessage?.RequestUri); + } + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + return ApiResponse.From(default, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -104,7 +260,40 @@ public ApiResponse Get(string merchantCode, string roleId, RequestOptions? builder.AddPath("merchant_code", merchantCode); builder.AddPath("role_id", roleId); }); - return _client.Send(request, null, null, cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + switch ((int)response.StatusCode) + { + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).GetAwaiter().GetResult(); + var result = JsonSerializer.Deserialize(stream, _client.SerializerOptions); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -122,7 +311,40 @@ public async Task> GetAsync(string merchantCode, string roleId builder.AddPath("merchant_code", merchantCode); builder.AddPath("role_id", roleId); }); - return await _client.SendAsync(request, null, null, cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = await ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).ConfigureAwait(false); + var result = await JsonSerializer.DeserializeAsync(stream, _client.SerializerOptions, effectiveCancellationToken).ConfigureAwait(false); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -138,7 +360,40 @@ public ApiResponse List(string merchantCode, RequestOptions? { builder.AddPath("merchant_code", merchantCode); }); - return _client.Send(request, null, null, cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + switch ((int)response.StatusCode) + { + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var jsonStream = ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).GetAwaiter().GetResult(); + var document = JsonDocument.Parse(jsonStream); + return ApiResponse.From((RolesListResponse)(object)document, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -154,7 +409,40 @@ public async Task> ListAsync(string merchantCode, { builder.AddPath("merchant_code", merchantCode); }); - return await _client.SendAsync(request, null, null, cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var jsonStream = await ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).ConfigureAwait(false); + var document = await JsonDocument.ParseAsync(jsonStream, cancellationToken: effectiveCancellationToken).ConfigureAwait(false); + return ApiResponse.From((RolesListResponse)(object)document, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -173,7 +461,49 @@ public ApiResponse Update(string merchantCode, string roleId, RolesUpdateR builder.AddPath("merchant_code", merchantCode); builder.AddPath("role_id", roleId); }); - return _client.Send(request, body, "application/json", cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + if (body is not null && request.Content is null) + { + request.Content = _client.CreateContent(body, "application/json"); + } + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + switch ((int)response.StatusCode) + { + case 400: + { + var errorForStatus400 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus400, responseBody, response.RequestMessage?.RequestUri); + } + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).GetAwaiter().GetResult(); + var result = JsonSerializer.Deserialize(stream, _client.SerializerOptions); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -192,6 +522,48 @@ public async Task> UpdateAsync(string merchantCode, string rol builder.AddPath("merchant_code", merchantCode); builder.AddPath("role_id", roleId); }); - return await _client.SendAsync(request, body, "application/json", cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + if (body is not null && request.Content is null) + { + request.Content = _client.CreateContent(body, "application/json"); + } + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 400: + { + var errorForStatus400 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus400, responseBody, response.RequestMessage?.RequestUri); + } + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = await ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).ConfigureAwait(false); + var result = await JsonSerializer.DeserializeAsync(stream, _client.SerializerOptions, effectiveCancellationToken).ConfigureAwait(false); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } } \ No newline at end of file diff --git a/src/SumUp/SubaccountsClient.g.cs b/src/SumUp/SubaccountsClient.g.cs index 01a68a8..c638838 100644 --- a/src/SumUp/SubaccountsClient.g.cs +++ b/src/SumUp/SubaccountsClient.g.cs @@ -33,7 +33,32 @@ public ApiResponse CompatGetOperator(int operatorId, RequestOptio { builder.AddPath("operator_id", operatorId); }); - return _client.Send(request, null, null, cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).GetAwaiter().GetResult(); + var result = JsonSerializer.Deserialize(stream, _client.SerializerOptions); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -49,7 +74,32 @@ public async Task> CompatGetOperatorAsync(int operato { builder.AddPath("operator_id", operatorId); }); - return await _client.SendAsync(request, null, null, cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = await ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).ConfigureAwait(false); + var result = await JsonSerializer.DeserializeAsync(stream, _client.SerializerOptions, effectiveCancellationToken).ConfigureAwait(false); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -62,7 +112,44 @@ public async Task> CompatGetOperatorAsync(int operato public ApiResponse CreateSubAccount(SubaccountsCreateSubAccountRequest body, RequestOptions? requestOptions = null, CancellationToken cancellationToken = default) { var request = _client.CreateRequest(HttpMethod.Post, "/v0.1/me/accounts"); - return _client.Send(request, body, "application/json", cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + if (body is not null && request.Content is null) + { + request.Content = _client.CreateContent(body, "application/json"); + } + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + switch ((int)response.StatusCode) + { + case 403: + { + var errorForStatus403 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus403, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).GetAwaiter().GetResult(); + var result = JsonSerializer.Deserialize(stream, _client.SerializerOptions); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -75,7 +162,44 @@ public ApiResponse CreateSubAccount(SubaccountsCreateSubAccountRe public async Task> CreateSubAccountAsync(SubaccountsCreateSubAccountRequest body, RequestOptions? requestOptions = null, CancellationToken cancellationToken = default) { var request = _client.CreateRequest(HttpMethod.Post, "/v0.1/me/accounts"); - return await _client.SendAsync(request, body, "application/json", cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + if (body is not null && request.Content is null) + { + request.Content = _client.CreateContent(body, "application/json"); + } + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 403: + { + var errorForStatus403 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus403, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = await ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).ConfigureAwait(false); + var result = await JsonSerializer.DeserializeAsync(stream, _client.SerializerOptions, effectiveCancellationToken).ConfigureAwait(false); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -91,7 +215,32 @@ public ApiResponse DeactivateSubAccount(int operatorId, RequestOp { builder.AddPath("operator_id", operatorId); }); - return _client.Send(request, null, null, cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).GetAwaiter().GetResult(); + var result = JsonSerializer.Deserialize(stream, _client.SerializerOptions); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -107,7 +256,32 @@ public async Task> DeactivateSubAccountAsync(int oper { builder.AddPath("operator_id", operatorId); }); - return await _client.SendAsync(request, null, null, cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = await ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).ConfigureAwait(false); + var result = await JsonSerializer.DeserializeAsync(stream, _client.SerializerOptions, effectiveCancellationToken).ConfigureAwait(false); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -125,7 +299,32 @@ public ApiResponse> ListSubAccounts(string? query = n builder.AddQuery("query", query); builder.AddQuery("include_primary", includePrimary); }); - return _client.Send>(request, null, null, cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).GetAwaiter().GetResult(); + var result = JsonSerializer.Deserialize>(stream, _client.SerializerOptions); + return ApiResponse>.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -143,7 +342,32 @@ public async Task>> ListSubAccountsAsync( builder.AddQuery("query", query); builder.AddQuery("include_primary", includePrimary); }); - return await _client.SendAsync>(request, null, null, cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = await ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).ConfigureAwait(false); + var result = await JsonSerializer.DeserializeAsync>(stream, _client.SerializerOptions, effectiveCancellationToken).ConfigureAwait(false); + return ApiResponse>.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -160,7 +384,44 @@ public ApiResponse UpdateSubAccount(int operatorId, SubaccountsUp { builder.AddPath("operator_id", operatorId); }); - return _client.Send(request, body, "application/json", cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + if (body is not null && request.Content is null) + { + request.Content = _client.CreateContent(body, "application/json"); + } + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + switch ((int)response.StatusCode) + { + case 400: + { + var errorForStatus400 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus400, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).GetAwaiter().GetResult(); + var result = JsonSerializer.Deserialize(stream, _client.SerializerOptions); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -177,6 +438,43 @@ public async Task> UpdateSubAccountAsync(int operator { builder.AddPath("operator_id", operatorId); }); - return await _client.SendAsync(request, body, "application/json", cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + if (body is not null && request.Content is null) + { + request.Content = _client.CreateContent(body, "application/json"); + } + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 400: + { + var errorForStatus400 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus400, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = await ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).ConfigureAwait(false); + var result = await JsonSerializer.DeserializeAsync(stream, _client.SerializerOptions, effectiveCancellationToken).ConfigureAwait(false); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } } \ No newline at end of file diff --git a/src/SumUp/TransactionsClient.g.cs b/src/SumUp/TransactionsClient.g.cs index 9e0bc92..e62c4d9 100644 --- a/src/SumUp/TransactionsClient.g.cs +++ b/src/SumUp/TransactionsClient.g.cs @@ -43,7 +43,45 @@ public ApiResponse Get(string merchantCode, string? id = null, builder.AddQuery("foreign_transaction_id", foreignTransactionId); builder.AddQuery("client_transaction_id", clientTransactionId); }); - return _client.Send(request, null, null, cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + switch ((int)response.StatusCode) + { + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).GetAwaiter().GetResult(); + var result = JsonSerializer.Deserialize(stream, _client.SerializerOptions); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -69,7 +107,45 @@ public async Task> GetAsync(string merchantCode, st builder.AddQuery("foreign_transaction_id", foreignTransactionId); builder.AddQuery("client_transaction_id", clientTransactionId); }); - return await _client.SendAsync(request, null, null, cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = await ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).ConfigureAwait(false); + var result = await JsonSerializer.DeserializeAsync(stream, _client.SerializerOptions, effectiveCancellationToken).ConfigureAwait(false); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -89,7 +165,45 @@ public ApiResponse GetDeprecated(string? id = null, string? int builder.AddQuery("internal_id", internalId); builder.AddQuery("transaction_code", transactionCode); }); - return _client.Send(request, null, null, cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + switch ((int)response.StatusCode) + { + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).GetAwaiter().GetResult(); + var result = JsonSerializer.Deserialize(stream, _client.SerializerOptions); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -109,7 +223,45 @@ public async Task> GetDeprecatedAsync(string? id = builder.AddQuery("internal_id", internalId); builder.AddQuery("transaction_code", transactionCode); }); - return await _client.SendAsync(request, null, null, cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var stream = await ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).ConfigureAwait(false); + var result = await JsonSerializer.DeserializeAsync(stream, _client.SerializerOptions, effectiveCancellationToken).ConfigureAwait(false); + return ApiResponse.From(result, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -151,7 +303,40 @@ public ApiResponse List(string merchantCode, string? t builder.AddQuery("oldest_time", oldestTime); builder.AddQuery("oldest_ref", oldestRef); }); - return _client.Send(request, null, null, cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + switch ((int)response.StatusCode) + { + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var jsonStream = ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).GetAwaiter().GetResult(); + var document = JsonDocument.Parse(jsonStream); + return ApiResponse.From((TransactionsListResponse)(object)document, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -193,7 +378,40 @@ public async Task> ListAsync(string mercha builder.AddQuery("oldest_time", oldestTime); builder.AddQuery("oldest_ref", oldestRef); }); - return await _client.SendAsync(request, null, null, cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var jsonStream = await ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).ConfigureAwait(false); + var document = await JsonDocument.ParseAsync(jsonStream, cancellationToken: effectiveCancellationToken).ConfigureAwait(false); + return ApiResponse.From((TransactionsListResponse)(object)document, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -231,7 +449,40 @@ public ApiResponse ListDeprecated(string? tr builder.AddQuery("oldest_time", oldestTime); builder.AddQuery("oldest_ref", oldestRef); }); - return _client.Send(request, null, null, cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + switch ((int)response.StatusCode) + { + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var jsonStream = ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).GetAwaiter().GetResult(); + var document = JsonDocument.Parse(jsonStream); + return ApiResponse.From((TransactionsListDeprecatedResponse)(object)document, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -269,7 +520,40 @@ public async Task> ListDeprecate builder.AddQuery("oldest_time", oldestTime); builder.AddQuery("oldest_ref", oldestRef); }); - return await _client.SendAsync(request, null, null, cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 401: + { + var errorForStatus401 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus401, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + using var jsonStream = await ApiClient.ReadContentAsStreamAsync(response.Content!, effectiveCancellationToken).ConfigureAwait(false); + var document = await JsonDocument.ParseAsync(jsonStream, cancellationToken: effectiveCancellationToken).ConfigureAwait(false); + return ApiResponse.From((TransactionsListDeprecatedResponse)(object)document, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -286,7 +570,47 @@ public ApiResponse Refund(string txnId, TransactionsRefundRequest? { builder.AddPath("txn_id", txnId); }); - return _client.Send(request, body, "application/json", cancellationToken, requestOptions); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).GetAwaiter().GetResult(); + if (body is not null && request.Content is null) + { + request.Content = _client.CreateContent(body, "application/json"); + } + + using var response = _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).GetAwaiter().GetResult(); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).GetAwaiter().GetResult(); + switch ((int)response.StatusCode) + { + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + case 409: + { + var errorForStatus409 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus409, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + return ApiResponse.From(default, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } /// @@ -303,6 +627,46 @@ public async Task> RefundAsync(string txnId, Transacti { builder.AddPath("txn_id", txnId); }); - return await _client.SendAsync(request, body, "application/json", cancellationToken, requestOptions).ConfigureAwait(false); + var effectiveCancellationToken = ApiClient.CreateCancellationToken(cancellationToken, requestOptions, out var timeoutScope); + try + { + await _client.ApplyAuthorizationHeaderAsync(request, effectiveCancellationToken, requestOptions).ConfigureAwait(false); + if (body is not null && request.Content is null) + { + request.Content = _client.CreateContent(body, "application/json"); + } + + using var response = await _client.HttpClient.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead, + effectiveCancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseBody = response.Content is null + ? null + : await ApiClient.ReadContentAsStringAsync(response.Content, effectiveCancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 404: + { + var errorForStatus404 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus404, responseBody, response.RequestMessage?.RequestUri); + } + case 409: + { + var errorForStatus409 = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, errorForStatus409, responseBody, response.RequestMessage?.RequestUri); + } + } + var fallbackError = _client.TryDeserialize(responseBody); + throw new ApiException(response.StatusCode, fallbackError, responseBody, response.RequestMessage?.RequestUri); + } + return ApiResponse.From(default, response.StatusCode, response.Headers, response.RequestMessage?.RequestUri); + } + finally + { + timeoutScope?.Dispose(); + } } } \ No newline at end of file