From a0c5da77ed03d69311f7560125a939c1258654bd Mon Sep 17 00:00:00 2001 From: CodeMash Date: Wed, 14 Oct 2026 10:46:33 +0300 Subject: [PATCH 1/2] feat(transport): Language option sends Accept-Language The gateway dropped the cultureCode field and the CultureCode / norbix-language headers; Accept-Language is now the only language input. Add NorbixClientOptions.Language (NORBIX_LANGUAGE fallback, no default) and client.WithLanguage(...), mirroring Region / WithRegion. The transport sends Accept-Language only when a language is resolved. Co-Authored-By: Claude Opus 5.5 --- README.md | 26 +++++ src/Norbix.Contracts/NorbixClientOptions.cs | 15 +++ src/Norbix.Sdk/NorbixClient.cs | 17 +++ src/Norbix.Sdk/Transport/HttpTransport.cs | 10 ++ .../CodeFunctionEventTests.cs | 1 + .../Helpers/RecordedRequest.cs | 5 + tests/Norbix.Sdk.Tests/LanguageHeaderTests.cs | 104 ++++++++++++++++++ 7 files changed, 178 insertions(+) create mode 100644 tests/Norbix.Sdk.Tests/LanguageHeaderTests.cs diff --git a/README.md b/README.md index cdcb024..f29402d 100644 --- a/README.md +++ b/README.md @@ -111,6 +111,7 @@ NORBIX_API_KEY=sk_live_... NORBIX_PROJECT_ID=proj_123 NORBIX_ACCOUNT_ID=acc_456 # optional NORBIX_REGION=nb-eu-germany # optional — no default region (see "Regions") +NORBIX_LANGUAGE=lt # optional — sent as Accept-Language (see "Language") NORBIX_API_URL=https://api.norbix.ai NORBIX_HUB_URL=https://hub.norbix.ai NORBIX_API_VERSION=v3 @@ -235,6 +236,31 @@ await client.Account.UpdateProjectRegionsAsync(new UpdateProjectRegions Every other project setting (name, CORS, languages, admin URL, legal, Admin Portal, AI) is on [docs/hub/project.md](./docs/hub/project.md). +## Language + +The gateway reads exactly one language input: the standard `Accept-Language` header (q-values are honoured; the project's default language is used when nothing matches). The response says which language it picked in `Content-Language`. The old `cultureCode` request field and the `CultureCode` / `norbix-language` headers are gone — the SDK never sends them. + +The SDK resolves the language like the region — there is **no default language**: + +1. Per-call override — `client.WithLanguage("...")` +2. `Language` on `NorbixClientOptions` (explicit values win over env vars) +3. `NORBIX_LANGUAGE` environment variable +4. Unset — no `Accept-Language` header is sent and the gateway uses the project default + +The value is sent as-is, so a single tag or a full header value both work: + +```csharp +var client = new NorbixApiClient(new NorbixClientOptions +{ + ProjectId = "proj_123", + ApiKey = "", + Language = "lt-LT, en;q=0.8", +}); + +var lt = client.WithLanguage("lt"); // shares the HttpClient, like WithRegion +var dflt = client.WithLanguage(null); // clears it — header omitted, project default +``` + ## Project vs Account Scope - `ProjectId` is required. The SDK works at project scope by default. diff --git a/src/Norbix.Contracts/NorbixClientOptions.cs b/src/Norbix.Contracts/NorbixClientOptions.cs index 55bcab7..d6208c3 100644 --- a/src/Norbix.Contracts/NorbixClientOptions.cs +++ b/src/Norbix.Contracts/NorbixClientOptions.cs @@ -59,6 +59,19 @@ public sealed class NorbixClientOptions /// public string? Region { get; set; } + /// + /// Preferred response language, sent as the standard Accept-Language + /// header — a single tag (e.g. lt, lt-LT) or a full header + /// value with q-values (e.g. lt-LT, en;q=0.8). The gateway honours + /// the q-values and falls back to the project's default language when + /// nothing matches; the chosen language comes back as + /// Content-Language. Like there is NO default — + /// when unset, no header is sent. Resolution order: per-call + /// WithLanguage override on the client → this option → + /// NORBIX_LANGUAGE environment variable → unset. + /// + public string? Language { get; set; } + /// API gateway base URL. Default https://api.norbix.ai (or NORBIX_API_URL). public string ApiBaseUrl { get; set; } = DefaultApiBaseUrl; @@ -102,6 +115,7 @@ public NorbixClientOptions Clone() AccountId = AccountId, Env = Env, Region = Region, + Language = Language, ApiBaseUrl = ApiBaseUrl, HubBaseUrl = HubBaseUrl, ApiVersion = ApiVersion, @@ -142,6 +156,7 @@ source is null if (env is not null) Env = env; Region ??= NullIfEmpty(Read("NORBIX_REGION")); + Language ??= NullIfEmpty(Read("NORBIX_LANGUAGE")); var apiUrl = NullIfEmpty(Read("NORBIX_API_URL")); if (apiUrl is not null) ApiBaseUrl = apiUrl; diff --git a/src/Norbix.Sdk/NorbixClient.cs b/src/Norbix.Sdk/NorbixClient.cs index b92bb27..34fb241 100644 --- a/src/Norbix.Sdk/NorbixClient.cs +++ b/src/Norbix.Sdk/NorbixClient.cs @@ -190,6 +190,23 @@ public Client WithRegion(string? region) return new Client(o, _transport.HttpClient, _transport.Logger); } + /// + /// Create a new client that asks for responses in a given language. The + /// new client shares the underlying and sends + /// as the Accept-Language header on + /// every request (omitted when null/empty — there is no default language; + /// the gateway then uses the project default). Accepts a single tag or a + /// full header value with q-values, e.g. + /// await client.WithLanguage("lt").Echo.EchoAsync(new()) or + /// client.WithLanguage("lt-LT, en;q=0.8"). + /// + public Client WithLanguage(string? language) + { + var o = _options.Clone(); + o.Language = string.IsNullOrEmpty(language) ? null : language; + return new Client(o, _transport.HttpClient, _transport.Logger); + } + /// Create a new client without a JWT bearer token (falls back to ApiKey if configured). public Client WithoutBearerToken() => WithBearerToken(null); diff --git a/src/Norbix.Sdk/Transport/HttpTransport.cs b/src/Norbix.Sdk/Transport/HttpTransport.cs index 89e69bb..bf388ac 100644 --- a/src/Norbix.Sdk/Transport/HttpTransport.cs +++ b/src/Norbix.Sdk/Transport/HttpTransport.cs @@ -162,6 +162,16 @@ public HttpTransport(NorbixClientOptions options, HttpClient? httpClient = null, request.Headers.TryAddWithoutValidation("nb-region", _options.Region); } + // Language selector — the standard Accept-Language header is the ONLY + // language input the gateway reads (q-values honoured; project default + // when nothing matches). Like the region there is NO default: the + // header is injected only when a language was resolved + // (WithLanguage(...) / Options.Language / NORBIX_LANGUAGE). + if (!string.IsNullOrEmpty(_options.Language)) + { + request.Headers.TryAddWithoutValidation("Accept-Language", _options.Language); + } + foreach (var (k, v) in _options.DefaultHeaders) { request.Headers.TryAddWithoutValidation(k, v); diff --git a/tests/Norbix.Hub.Tests/CodeFunctionEventTests.cs b/tests/Norbix.Hub.Tests/CodeFunctionEventTests.cs index 0b637ef..1dae6ef 100644 --- a/tests/Norbix.Hub.Tests/CodeFunctionEventTests.cs +++ b/tests/Norbix.Hub.Tests/CodeFunctionEventTests.cs @@ -31,6 +31,7 @@ public sealed class CodeFunctionEventTests "NORBIX_ACCOUNT_ID", "NORBIX_ENV", "NORBIX_REGION", + "NORBIX_LANGUAGE", "NORBIX_API_URL", "NORBIX_HUB_URL", ]; diff --git a/tests/Norbix.Sdk.Tests/Helpers/RecordedRequest.cs b/tests/Norbix.Sdk.Tests/Helpers/RecordedRequest.cs index 9aa3790..b168de2 100644 --- a/tests/Norbix.Sdk.Tests/Helpers/RecordedRequest.cs +++ b/tests/Norbix.Sdk.Tests/Helpers/RecordedRequest.cs @@ -27,6 +27,11 @@ internal static class RecordedRequestExtensions "X-CM-AccountId", "norbix-env", "nb-region", + "Accept-Language", + // Removed gateway language inputs: listed so a snapshot shows them if + // they are ever sent again (Accept-Language is the only one now). + "CultureCode", + "norbix-language", "Content-Type", }; diff --git a/tests/Norbix.Sdk.Tests/LanguageHeaderTests.cs b/tests/Norbix.Sdk.Tests/LanguageHeaderTests.cs new file mode 100644 index 0000000..7126e9e --- /dev/null +++ b/tests/Norbix.Sdk.Tests/LanguageHeaderTests.cs @@ -0,0 +1,104 @@ +using Norbix.Sdk.Tests.Helpers; +using NUnit.Framework; + +namespace Norbix.Sdk.Tests; + +/// +/// The Accept-Language header — the ONLY language input the gateway +/// reads (the old cultureCode field and CultureCode / +/// norbix-language headers are gone). Injected ONLY when a language is +/// resolved (per-call override → +/// options Language → NORBIX_LANGUAGE → unset; there is no +/// default language — the gateway then uses the project default). +/// +[TestFixture] +public sealed class LanguageHeaderTests +{ + [Test] + public async Task Unset_language_omits_header() + { + using var fixture = NorbixTestFixture.Create(); + await fixture.Client.Echo.EchoAsync(new Norbix.Sdk.Types.Api.Echo()); + Assert.That(fixture.LastRequest!.Headers.ContainsKey("Accept-Language"), Is.False); + } + + [Test] + public async Task Configured_language_sets_header() + { + using var fixture = NorbixTestFixture.Create(o => o.Language = "lt"); + await fixture.Client.Echo.EchoAsync(new Norbix.Sdk.Types.Api.Echo()); + Assert.That(fixture.LastRequest!.Headers["Accept-Language"], Is.EqualTo("lt")); + } + + [Test] + public async Task Language_with_q_values_is_passed_through() + { + using var fixture = NorbixTestFixture.Create(o => o.Language = "lt-LT, en;q=0.8"); + await fixture.Client.Echo.EchoAsync(new Norbix.Sdk.Types.Api.Echo()); + // HttpHeaders re-formats a parsed q-value as "en; q=0.8" — compare + // without whitespace; the tags and weights must be unchanged. + Assert.That( + fixture.LastRequest!.Headers["Accept-Language"].Replace(" ", ""), + Is.EqualTo("lt-LT,en;q=0.8")); + } + + [Test] + public async Task WithLanguage_overrides_configured_language() + { + using var fixture = NorbixTestFixture.Create(o => o.Language = "lt"); + var scoped = fixture.Client.WithLanguage("de"); + await scoped.Echo.EchoAsync(new Norbix.Sdk.Types.Api.Echo()); + Assert.That(fixture.LastRequest!.Headers["Accept-Language"], Is.EqualTo("de")); + } + + [Test] + public async Task WithLanguage_null_clears_header() + { + using var fixture = NorbixTestFixture.Create(o => o.Language = "lt"); + var scoped = fixture.Client.WithLanguage(null); + await scoped.Echo.EchoAsync(new Norbix.Sdk.Types.Api.Echo()); + Assert.That(fixture.LastRequest!.Headers.ContainsKey("Accept-Language"), Is.False); + } + + [Test] + public async Task WithLanguage_does_not_change_the_original_client() + { + using var fixture = NorbixTestFixture.Create(); + _ = fixture.Client.WithLanguage("lt"); + await fixture.Client.Echo.EchoAsync(new Norbix.Sdk.Types.Api.Echo()); + Assert.That(fixture.LastRequest!.Headers.ContainsKey("Accept-Language"), Is.False); + } + + [Test] + public void Language_env_var_is_read_by_ApplyEnvironment() + { + var opts = new NorbixClientOptions { ProjectId = "p" } + .ApplyEnvironment(new Dictionary { ["NORBIX_LANGUAGE"] = "lt" }); + Assert.That(opts.Language, Is.EqualTo("lt")); + } + + [Test] + public void Explicit_language_wins_over_env_var() + { + var opts = new NorbixClientOptions { ProjectId = "p", Language = "de" } + .ApplyEnvironment(new Dictionary { ["NORBIX_LANGUAGE"] = "lt" }); + Assert.That(opts.Language, Is.EqualTo("de")); + } + + [Test] + public void Clone_copies_language() + { + var opts = new NorbixClientOptions { ProjectId = "p", Language = "lt" }; + Assert.That(opts.Clone().Language, Is.EqualTo("lt")); + } + + [Test] + public async Task Legacy_language_headers_are_never_sent() + { + using var fixture = NorbixTestFixture.Create(o => o.Language = "lt"); + var scoped = fixture.Client.WithLanguage("lt"); + await scoped.Echo.EchoAsync(new Norbix.Sdk.Types.Api.Echo()); + Assert.That(fixture.LastRequest!.Headers.ContainsKey("CultureCode"), Is.False); + Assert.That(fixture.LastRequest!.Headers.ContainsKey("norbix-language"), Is.False); + } +} From d79498e1f1b2f2aad2a96ba66fdf8577a5ec77ea Mon Sep 17 00:00:00 2001 From: CodeMash Date: Wed, 14 Oct 2026 11:03:48 +0300 Subject: [PATCH 2/2] chore(types): regenerate Api/Hub DTOs from gateway refactoringV2 1c4e974f7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `python3 scripts/sync-types.py --api … --hub …` against a private gateway stack on the same head. The build source-generates the new methods. - CultureCode gone from every request (language is Accept-Language only) - Api: end-user push devices + messages (RegisterOwnPushDeviceAsync, GetOwnPushDevicesAsync, DeleteOwnPushDeviceAsync, DeleteOwnPushDeviceByTokenAsync, GetOwnPushMessagesAsync, MarkOwnPushMessageReadAsync, MarkAllOwnPushMessagesReadAsync) - Hub: RepairContactRolesAsync (POST /membership/users/repair-roles) - record / term reads carry AllLanguages - public echo without licence fields - the Api contract still omits the JsonSchemaFieldDto subclasses (gateway ticket 11-code C22): kept from the previous Api file in a marked block - coverage / schema-content snapshots updated to the new contract Co-Authored-By: Claude Opus 5.5 --- src/Norbix.Sdk.Types/Generated/Api.dtos.cs | 877 +++++++++++------- src/Norbix.Sdk.Types/Generated/Hub.dtos.cs | 99 +- ...intCoverageTests.Hub.Database.verified.txt | 8 +- ...ndpointCoverageTests.Hub.Echo.verified.txt | 18 - ...tCoverageTests.Hub.Membership.verified.txt | 40 +- .../SchemaContentTests.TermSlug.verified.txt | 1 + ...intCoverageTests.Api.Database.verified.txt | 16 +- ...ndpointCoverageTests.Api.Echo.verified.txt | 18 - ...verageTests.Api.Notifications.verified.txt | 233 +++++ ...entTests.FindExpandReferences.verified.txt | 2 +- ...ts.FindNestedFilterDottedSort.verified.txt | 2 +- ...Tests.FindOneExpandReferences.verified.txt | 2 +- ...Tests.FindOwnExpandReferences.verified.txt | 2 +- ...ontentTests.FindWithoutExpand.verified.txt | 2 +- 14 files changed, 911 insertions(+), 409 deletions(-) create mode 100644 tests/Norbix.Sdk.Tests/test_results/EndpointCoverageTests.Api.Notifications.verified.txt diff --git a/src/Norbix.Sdk.Types/Generated/Api.dtos.cs b/src/Norbix.Sdk.Types/Generated/Api.dtos.cs index 7e68d78..388fcf6 100644 --- a/src/Norbix.Sdk.Types/Generated/Api.dtos.cs +++ b/src/Norbix.Sdk.Types/Generated/Api.dtos.cs @@ -588,6 +588,9 @@ public partial class FindOneRequest [DataMember] public virtual bool ExpandReferences { get; set; } + + [DataMember] + public virtual bool AllLanguages { get; set; } } public partial class FindOneResponse @@ -624,6 +627,9 @@ public partial class FindOwnRequest /// [DataMember] public virtual bool ExpandReferences { get; set; } + + [DataMember] + public virtual bool AllLanguages { get; set; } } /// @@ -657,6 +663,9 @@ public partial class FindRequest [DataMember] public virtual bool ExpandReferences { get; set; } + + [DataMember] + public virtual bool AllLanguages { get; set; } } public partial class FindResponse @@ -817,6 +826,12 @@ public partial class GetDatabaseSchemasResponse public partial class FindMergedTermTreeRequest : CodeMashRequestBase, INorbixRequest { + /// + ///Set true to keep name / description as stored even when Accept-Language is sent (editors). The full translations are always in names / descriptions. + /// + [DataMember] + public virtual bool AllLanguages { get; set; } + [DataMember] public virtual string TaxonomyName { get; set; } @@ -838,6 +853,12 @@ public partial class FindMergedTermTreeResponse public partial class FindTaxonomyTreeRequest : CodeMashRequestBase, INorbixRequest { + /// + ///Set true to keep name / description as stored even when Accept-Language is sent (editors). The full translations are always in names / descriptions. + /// + [DataMember] + public virtual bool AllLanguages { get; set; } + [DataMember] public virtual bool IncludeTerms { get; set; } @@ -859,6 +880,12 @@ public partial class FindTaxonomyTreeResponse public partial class FindTermsChildrenRequest : CodeMashListPaginationRequestBase, INorbixRequest { + /// + ///Set true to keep name / description as stored even when Accept-Language is sent (editors). The full translations are always in names / descriptions. + /// + [DataMember] + public virtual bool AllLanguages { get; set; } + [DataMember] public virtual string TaxonomyName { get; set; } @@ -889,6 +916,12 @@ public partial class FindTermsChildrenResponse public partial class FindTermsRequest : CodeMashListPaginationRequestBase, INorbixRequest { + /// + ///Set true to keep name / description as stored even when Accept-Language is sent (editors). The full translations are always in names / descriptions. + /// + [DataMember] + public virtual bool AllLanguages { get; set; } + [DataMember] public virtual string TaxonomyName { get; set; } @@ -919,6 +952,12 @@ public partial class FindTermsResponse public partial class FindTermTreeRequest : CodeMashRequestBase, INorbixRequest { + /// + ///Set true to keep name / description as stored even when Accept-Language is sent (editors). The full translations are always in names / descriptions. + /// + [DataMember] + public virtual bool AllLanguages { get; set; } + [DataMember] public virtual string TaxonomyName { get; set; } @@ -2094,6 +2133,153 @@ public partial class UpdateUserRequest public virtual string Id { get; set; } } + /// + ///Removes the signed-in user's push device registered with a token (sign-out). + /// + [NorbixRoute("/{version}/notifications/push/devices", "DELETE")] + public partial class DeleteOwnPushDeviceByTokenRequest + : CodeMashRequestBase, INorbixRequest + { + /// + ///The push token the device was registered with. + /// + public virtual string Token { get; set; } + } + + /// + ///Removes one of the signed-in user's own push devices by id. + /// + [NorbixRoute("/{version}/notifications/push/devices/{Id}", "DELETE")] + public partial class DeleteOwnPushDeviceRequest + : CodeMashRequestBase, INorbixRequest + { + /// + ///The device id (pnd_…) from the devices list or the register answer. + /// + public virtual string Id { get; set; } + } + + /// + ///Lists the signed-in user's own push devices. + /// + [NorbixRoute("/{version}/notifications/push/devices", "GET")] + public partial class GetOwnPushDevicesRequest + : CodeMashRequestBase, INorbixRequest + { + } + + public partial class GetOwnPushDevicesResponse + : ResponseBase + { + public virtual List Items { get; set; } = []; + } + + /// + ///Lists the push messages sent to the signed-in user. + /// + [NorbixRoute("/{version}/notifications/push/messages", "GET")] + public partial class GetOwnPushMessagesRequest + : CodeMashListPaginationRequestBase, INorbixRequest + { + /// + ///Only messages the caller has not marked read. + /// + public virtual bool UnreadOnly { get; set; } + } + + public partial class GetOwnPushMessagesResponse + : ResponseBase + { + public virtual PaginatedResponse? List { get; set; } + } + + /// + ///Marks every push message sent to the signed-in user read. + /// + [NorbixRoute("/{version}/notifications/push/messages/read", "POST")] + public partial class MarkAllOwnPushMessagesReadRequest + : CodeMashRequestBase, INorbixRequest + { + } + + /// + ///Marks one push message sent to the signed-in user read. + /// + [NorbixRoute("/{version}/notifications/push/messages/{Id}/read", "POST")] + public partial class MarkOwnPushMessageReadRequest + : CodeMashRequestBase, INorbixRequest + { + /// + ///The message id (ntf_…) from the messages list. + /// + public virtual string Id { get; set; } + } + + /// + ///Registers or refreshes a push device for the signed-in user. + /// + [NorbixRoute("/{version}/notifications/push/devices", "POST")] + public partial class RegisterOwnPushDeviceRequest + : CodeMashRequestBase, INorbixRequest + { + /// + ///Who issued the token: expo (getExpoPushTokenAsync), fcm (Android / Firebase) or apns (iOS). + /// + public virtual string Provider { get; set; } + + /// + ///The push token, exactly as the provider gave it. + /// + public virtual string Token { get; set; } + + /// + ///The app's platform: ios, android or web. + /// + public virtual string? Platform { get; set; } + + /// + ///Operating system name, e.g. iOS. + /// + public virtual string? OsName { get; set; } + + /// + ///Operating system version, e.g. 18.1. + /// + public virtual string? OsVersion { get; set; } + + /// + ///The app version, e.g. 2.4.1. + /// + public virtual string? AppVersion { get; set; } + + /// + ///The device name the user sees, e.g. Anna's iPhone. + /// + public virtual string? DeviceName { get; set; } + + /// + ///The device model, e.g. iPhone 15. + /// + public virtual string? ModelName { get; set; } + + public virtual string? Brand { get; set; } + public virtual string? Manufacturer { get; set; } + /// + ///A stable id the app keeps for this installation (not the token). + /// + public virtual string? InstallationId { get; set; } + + /// + ///The device locale, e.g. lt-LT. + /// + public virtual string? Locale { get; set; } + + /// + ///The device time zone (IANA), e.g. Europe/Vilnius. + /// + public virtual string? TimeZone { get; set; } + } + [DataContract] public partial class FileChecksumDto { @@ -2227,31 +2413,6 @@ public partial class PublicProjectConfigDto public virtual PublicAiChatDto AiChat { get; set; } } - [DataContract] - public partial class EchoLicenseDto - { - [DataMember(Name="domain")] - public virtual string? Domain { get; set; } - - [DataMember(Name="accountId")] - public virtual string? AccountId { get; set; } - - [DataMember(Name="email")] - public virtual string? Email { get; set; } - - [DataMember(Name="release")] - public virtual string? Release { get; set; } - - [DataMember(Name="expire")] - public virtual long Expire { get; set; } - - [DataMember(Name="isTrial")] - public virtual bool IsTrial { get; set; } - - [DataMember(Name="cap")] - public virtual int ProjectsCap { get; set; } - } - public partial class AiChatEntryWireDto { public virtual string Kind { get; set; } @@ -2270,371 +2431,132 @@ public partial interface IHasProjectId string ProjectId { get; set; } } - public partial class ArrayFieldDto - : JsonSchemaFieldDto + public partial class DataSchemaDto { [DataMember] - public virtual JsonSchemaFieldDto Items { get; set; } - - [DataMember] - public virtual int? MinItems { get; set; } - - [DataMember] - public virtual int? MaxItems { get; set; } + public virtual string Json { get; set; } [DataMember] - public virtual bool? UniqueItems { get; set; } + public virtual HashSet Fields { get; set; } = []; } - public partial class BooleanFieldDto - : JsonSchemaFieldDto + public partial class JsonSchemaFieldDto { [DataMember] - public virtual bool? Default { get; set; } + public virtual string FieldName { get; set; } } - public partial class CollectionSelectionFieldDto - : JsonSchemaFieldDto + public partial class SchemaDto + : IHasViewId { [DataMember] - public virtual string? CollectionId { get; set; } - - [DataMember] - public virtual string? DisplayField { get; set; } + public virtual string ViewId { get; set; } [DataMember] - public virtual bool Multiple { get; set; } - } + public virtual string SchemaName { get; set; } - public partial class CurrencyDefaultDto - { [DataMember] - public virtual decimal Value { get; set; } + public virtual string? SchemaSlug { get; set; } [DataMember] - public virtual string Currency { get; set; } - } + public virtual int Version { get; set; } - public partial class CurrencyFieldDto - : JsonSchemaFieldDto - { [DataMember] - public virtual IReadOnlyList? AllowedCurrencies { get; set; } + public virtual int MetaSchemaVersion { get; set; } [DataMember] - public virtual decimal? MultipleOf { get; set; } + public virtual DataSchemaDto DataSchema { get; set; } [DataMember] - public virtual decimal? Minimum { get; set; } + public virtual VisualSchemaDto VisualSchema { get; set; } [DataMember] - public virtual decimal? Maximum { get; set; } + public virtual DateTimeOffset PublishedAt { get; set; } [DataMember] - public virtual CurrencyDefaultDto? Default { get; set; } - } + public virtual SchemaSettingsDto? Settings { get; set; } - public partial class DataSchemaDto - { [DataMember] - public virtual string Json { get; set; } + public virtual SchemaEmbedSettingsDto? Embed { get; set; } [DataMember] - public virtual HashSet Fields { get; set; } = []; + public virtual HashSet? Triggers { get; set; } } - public partial class DateFieldDto - : JsonSchemaFieldDto + public partial class SchemaEmbedSettingsDto { [DataMember] - public virtual long? Minimum { get; set; } + public virtual bool Enabled { get; set; } [DataMember] - public virtual long? Maximum { get; set; } + public virtual List Fields { get; set; } = []; [DataMember] - public virtual long? Default { get; set; } + public virtual string? EmbeddingIntegrationId { get; set; } + + [DataMember] + public virtual bool PerUser { get; set; } } - public partial class DecimalFieldDto - : JsonSchemaFieldDto + public partial class SchemaListProjection + : IHasViewId { [DataMember] - public virtual decimal? Minimum { get; set; } + public virtual string ViewId { get; set; } [DataMember] - public virtual decimal? Maximum { get; set; } + public virtual string SchemaName { get; set; } [DataMember] - public virtual decimal? MultipleOf { get; set; } + public virtual string SchemaTitle { get; set; } [DataMember] - public virtual decimal? Default { get; set; } + public virtual int? LatestVersion { get; set; } [DataMember] - public virtual bool? Unique { get; set; } - } + public virtual bool HasDraft { get; set; } - public partial class EnumSelectionFieldDto - : JsonSchemaFieldDto - { [DataMember] - public virtual IReadOnlyList? Values { get; set; } + public virtual int MetaSchemaVersion { get; set; } [DataMember] - public virtual bool Multiple { get; set; } + public virtual string? Description { get; set; } [DataMember] - public virtual IReadOnlyList? Default { get; set; } + public virtual string? Env { get; set; } } - public partial class FileFieldDto - : JsonSchemaFieldDto + public partial class SchemaSettingsDto { [DataMember] - public virtual IReadOnlyList? Storages { get; set; } - - [DataMember] - public virtual int? MinItems { get; set; } - - [DataMember] - public virtual int? MaxItems { get; set; } + public virtual bool SoftDelete { get; set; } [DataMember] - public virtual string? AllowedFileType { get; set; } + public virtual bool HasRecordOwner { get; set; } [DataMember] - public virtual decimal? MaxSizeMb { get; set; } + public virtual string? Description { get; set; } } - public partial class GeolocationFieldDto - : JsonSchemaFieldDto + public partial class VisualSchemaDto { [DataMember] - public virtual IReadOnlyList? AllowedTypes { get; set; } + public virtual string Json { get; set; } } - public partial class IntegerFieldDto - : JsonSchemaFieldDto + public partial class TaxonomyTreeDto { [DataMember] - public virtual long? Minimum { get; set; } + public virtual string ViewId { get; set; } [DataMember] - public virtual long? Maximum { get; set; } + public virtual string TaxonomyName { get; set; } [DataMember] - public virtual long? Default { get; set; } + public virtual string TaxonomySlug { get; set; } [DataMember] - public virtual bool? Unique { get; set; } - } - - public partial class JsonFieldDto - : JsonSchemaFieldDto - { - [DataMember] - public virtual int? MaxBytes { get; set; } - } - - public partial class JsonSchemaFieldDto - { - [DataMember] - public virtual string FieldName { get; set; } - } - - public partial class ObjectFieldDto - : JsonSchemaFieldDto - { - [DataMember] - public virtual IReadOnlyList Properties { get; set; } - - [DataMember] - public virtual IReadOnlyList? Required { get; set; } - } - - public partial class RoleSelectionFieldDto - : JsonSchemaFieldDto - { - [DataMember] - public virtual bool Multiple { get; set; } - - [DataMember] - public virtual string? DisplayField { get; set; } - } - - public partial class SchemaDto - : IHasViewId - { - [DataMember] - public virtual string ViewId { get; set; } - - [DataMember] - public virtual string SchemaName { get; set; } - - [DataMember] - public virtual string? SchemaSlug { get; set; } - - [DataMember] - public virtual int Version { get; set; } - - [DataMember] - public virtual int MetaSchemaVersion { get; set; } - - [DataMember] - public virtual DataSchemaDto DataSchema { get; set; } - - [DataMember] - public virtual VisualSchemaDto VisualSchema { get; set; } - - [DataMember] - public virtual DateTimeOffset PublishedAt { get; set; } - - [DataMember] - public virtual SchemaSettingsDto? Settings { get; set; } - - [DataMember] - public virtual SchemaEmbedSettingsDto? Embed { get; set; } - - [DataMember] - public virtual HashSet? Triggers { get; set; } - } - - public partial class SchemaEmbedSettingsDto - { - [DataMember] - public virtual bool Enabled { get; set; } - - [DataMember] - public virtual List Fields { get; set; } = []; - - [DataMember] - public virtual string? EmbeddingIntegrationId { get; set; } - - [DataMember] - public virtual bool PerUser { get; set; } - } - - public partial class SchemaListProjection - : IHasViewId - { - [DataMember] - public virtual string ViewId { get; set; } - - [DataMember] - public virtual string SchemaName { get; set; } - - [DataMember] - public virtual string SchemaTitle { get; set; } - - [DataMember] - public virtual int? LatestVersion { get; set; } - - [DataMember] - public virtual bool HasDraft { get; set; } - - [DataMember] - public virtual int MetaSchemaVersion { get; set; } - - [DataMember] - public virtual string? Description { get; set; } - - [DataMember] - public virtual string? Env { get; set; } - } - - public partial class SchemaSettingsDto - { - [DataMember] - public virtual bool SoftDelete { get; set; } - - [DataMember] - public virtual bool HasRecordOwner { get; set; } - - [DataMember] - public virtual string? Description { get; set; } - } - - public partial class StringFieldDto - : JsonSchemaFieldDto - { - [DataMember] - public virtual string? Format { get; set; } - - [DataMember] - public virtual string? Pattern { get; set; } - - [DataMember] - public virtual int? MinLength { get; set; } - - [DataMember] - public virtual int? MaxLength { get; set; } - - [DataMember] - public virtual IReadOnlyDictionary? TranslateOptions { get; set; } - - [DataMember] - public virtual string? Default { get; set; } - - [DataMember] - public virtual bool? Unique { get; set; } - } - - public partial class TagsFieldDto - : JsonSchemaFieldDto - { - [DataMember] - public virtual int? MinItems { get; set; } - - [DataMember] - public virtual int? MaxItems { get; set; } - - [DataMember] - public virtual IReadOnlyList? Default { get; set; } - } - - public partial class TaxonomySelectionFieldDto - : JsonSchemaFieldDto - { - [DataMember] - public virtual string? TaxonomyId { get; set; } - - [DataMember] - public virtual bool Multiple { get; set; } - - [DataMember] - public virtual string? DisplayField { get; set; } - } - - public partial class UserSelectionFieldDto - : JsonSchemaFieldDto - { - [DataMember] - public virtual bool Multiple { get; set; } - - [DataMember] - public virtual string? DisplayField { get; set; } - } - - public partial class VisualSchemaDto - { - [DataMember] - public virtual string Json { get; set; } - } - - public partial class TaxonomyTreeDto - { - [DataMember] - public virtual string ViewId { get; set; } - - [DataMember] - public virtual string TaxonomyName { get; set; } - - [DataMember] - public virtual string TaxonomySlug { get; set; } - - [DataMember] - public virtual string? ParentId { get; set; } + public virtual string? ParentId { get; set; } [DataMember] public virtual List? Children { get; set; } @@ -2808,6 +2730,77 @@ public partial class UserMarketingPreferencesDto public virtual HashSet? BlockReasons { get; set; } } + [DataContract] + public partial class OwnPushDeviceDto + { + [DataMember] + public virtual string Id { get; set; } + + [DataMember] + public virtual string Provider { get; set; } + + [DataMember] + public virtual string Token { get; set; } + + [DataMember] + public virtual string? Platform { get; set; } + + [DataMember] + public virtual string? OsName { get; set; } + + [DataMember] + public virtual string? OsVersion { get; set; } + + [DataMember] + public virtual string? AppVersion { get; set; } + + [DataMember] + public virtual string? DeviceName { get; set; } + + [DataMember] + public virtual string? ModelName { get; set; } + + [DataMember] + public virtual string? Brand { get; set; } + + [DataMember] + public virtual string? InstallationId { get; set; } + + [DataMember] + public virtual string? Locale { get; set; } + + [DataMember] + public virtual string? TimeZone { get; set; } + + [DataMember] + public virtual DateTime? UpdatedAtUtc { get; set; } + } + + [DataContract] + public partial class OwnPushMessageDto + { + [DataMember] + public virtual string Id { get; set; } + + [DataMember] + public virtual string CampaignId { get; set; } + + [DataMember] + public virtual string? Title { get; set; } + + [DataMember] + public virtual string? Body { get; set; } + + [DataMember] + public virtual DateTime? SentAtUtc { get; set; } + + [DataMember] + public virtual bool IsRead { get; set; } + + [DataMember] + public virtual DateTime? ReadAtUtc { get; set; } + } + public partial class CodeMashResponseStatus { public virtual bool IsSuccess { get; set; } @@ -2956,8 +2949,6 @@ public partial class EchoRegionDto public partial class EchoResponse { - public virtual string? ContainerName { get; set; } - public virtual string Ip { get; set; } public virtual CodeMashRelease Release { get; set; } public virtual CodeMashRuntime Runtime { get; set; } public virtual string ManagedServiceHubUrl { get; set; } @@ -2966,18 +2957,10 @@ public partial class EchoResponse public virtual string ApiUrl { get; set; } public virtual string ApiVersion { get; set; } public virtual string HubVersion { get; set; } - public virtual string MjmlUrl { get; set; } public virtual string? AdminUrlTemplate { get; set; } - public virtual EchoLicenseDto? License { get; set; } - public virtual string? AskForEnterpriseLicenseEmail { get; set; } public virtual bool EmailServiceConfigured { get; set; } public virtual string? RootBootstrapPasswordSource { get; set; } public virtual List? Regions { get; set; } - public virtual bool IsProductionInstallation { get; set; } - public virtual string LicensingMode { get; set; } - public virtual int? GraceDaysLeft { get; set; } - public virtual string? InstallationDomain { get; set; } - public virtual string? LicensingDocsUrl { get; set; } public virtual EchoAgentDto? Agent { get; set; } public virtual EchoHostingPlatformDto? HostingPlatform { get; set; } } @@ -3057,11 +3040,6 @@ public partial class CodeMashRequestBase public virtual string? Env { get; set; } } - public partial interface ICultureBasedRequest - { - string? CultureCode { get; set; } - } - public partial interface IHasCorrelationIdRequest { Guid? CorrelationId { get; set; } @@ -3074,14 +3052,8 @@ public partial interface IVersionBasedRequest [DataContract(Namespace="http://codemash.io/types/")] public partial class RequestBase - : ICultureBasedRequest, IVersionBasedRequest, IHasCorrelationIdRequest + : IVersionBasedRequest, IHasCorrelationIdRequest { - /// - ///Specify culture code when your response from the API should be localised. E.g.: en - /// - [DataMember] - public virtual string? CultureCode { get; set; } - /// ///TimeZone /// @@ -3178,3 +3150,244 @@ public partial class PagingArgs public virtual string? StartingAfter { get; set; } public virtual string? EndingBefore { get; set; } } + + // The Api contract does not export the JsonSchemaFieldDto subclasses yet (gateway + // ticket 11-code C22); kept from the previous Api file until the Api host anchors them. + public partial class ArrayFieldDto + : JsonSchemaFieldDto + { + [DataMember] + public virtual JsonSchemaFieldDto Items { get; set; } + + [DataMember] + public virtual int? MinItems { get; set; } + + [DataMember] + public virtual int? MaxItems { get; set; } + + [DataMember] + public virtual bool? UniqueItems { get; set; } + } + + public partial class BooleanFieldDto + : JsonSchemaFieldDto + { + [DataMember] + public virtual bool? Default { get; set; } + } + + public partial class CollectionSelectionFieldDto + : JsonSchemaFieldDto + { + [DataMember] + public virtual string? CollectionId { get; set; } + + [DataMember] + public virtual string? DisplayField { get; set; } + + [DataMember] + public virtual bool Multiple { get; set; } + } + + public partial class CurrencyDefaultDto + { + [DataMember] + public virtual decimal Value { get; set; } + + [DataMember] + public virtual string Currency { get; set; } + } + + public partial class CurrencyFieldDto + : JsonSchemaFieldDto + { + [DataMember] + public virtual IReadOnlyList? AllowedCurrencies { get; set; } + + [DataMember] + public virtual decimal? MultipleOf { get; set; } + + [DataMember] + public virtual decimal? Minimum { get; set; } + + [DataMember] + public virtual decimal? Maximum { get; set; } + + [DataMember] + public virtual CurrencyDefaultDto? Default { get; set; } + } + + public partial class DateFieldDto + : JsonSchemaFieldDto + { + [DataMember] + public virtual long? Minimum { get; set; } + + [DataMember] + public virtual long? Maximum { get; set; } + + [DataMember] + public virtual long? Default { get; set; } + } + + public partial class DecimalFieldDto + : JsonSchemaFieldDto + { + [DataMember] + public virtual decimal? Minimum { get; set; } + + [DataMember] + public virtual decimal? Maximum { get; set; } + + [DataMember] + public virtual decimal? MultipleOf { get; set; } + + [DataMember] + public virtual decimal? Default { get; set; } + + [DataMember] + public virtual bool? Unique { get; set; } + } + + public partial class EnumSelectionFieldDto + : JsonSchemaFieldDto + { + [DataMember] + public virtual IReadOnlyList? Values { get; set; } + + [DataMember] + public virtual bool Multiple { get; set; } + + [DataMember] + public virtual IReadOnlyList? Default { get; set; } + } + + public partial class FileFieldDto + : JsonSchemaFieldDto + { + [DataMember] + public virtual IReadOnlyList? Storages { get; set; } + + [DataMember] + public virtual int? MinItems { get; set; } + + [DataMember] + public virtual int? MaxItems { get; set; } + + [DataMember] + public virtual string? AllowedFileType { get; set; } + + [DataMember] + public virtual decimal? MaxSizeMb { get; set; } + } + + public partial class GeolocationFieldDto + : JsonSchemaFieldDto + { + [DataMember] + public virtual IReadOnlyList? AllowedTypes { get; set; } + } + + public partial class IntegerFieldDto + : JsonSchemaFieldDto + { + [DataMember] + public virtual long? Minimum { get; set; } + + [DataMember] + public virtual long? Maximum { get; set; } + + [DataMember] + public virtual long? Default { get; set; } + + [DataMember] + public virtual bool? Unique { get; set; } + } + + public partial class JsonFieldDto + : JsonSchemaFieldDto + { + [DataMember] + public virtual int? MaxBytes { get; set; } + } + + public partial class ObjectFieldDto + : JsonSchemaFieldDto + { + [DataMember] + public virtual IReadOnlyList Properties { get; set; } + + [DataMember] + public virtual IReadOnlyList? Required { get; set; } + } + + public partial class RoleSelectionFieldDto + : JsonSchemaFieldDto + { + [DataMember] + public virtual bool Multiple { get; set; } + + [DataMember] + public virtual string? DisplayField { get; set; } + } + + public partial class StringFieldDto + : JsonSchemaFieldDto + { + [DataMember] + public virtual string? Format { get; set; } + + [DataMember] + public virtual string? Pattern { get; set; } + + [DataMember] + public virtual int? MinLength { get; set; } + + [DataMember] + public virtual int? MaxLength { get; set; } + + [DataMember] + public virtual IReadOnlyDictionary? TranslateOptions { get; set; } + + [DataMember] + public virtual string? Default { get; set; } + + [DataMember] + public virtual bool? Unique { get; set; } + } + + public partial class TagsFieldDto + : JsonSchemaFieldDto + { + [DataMember] + public virtual int? MinItems { get; set; } + + [DataMember] + public virtual int? MaxItems { get; set; } + + [DataMember] + public virtual IReadOnlyList? Default { get; set; } + } + + public partial class TaxonomySelectionFieldDto + : JsonSchemaFieldDto + { + [DataMember] + public virtual string? TaxonomyId { get; set; } + + [DataMember] + public virtual bool Multiple { get; set; } + + [DataMember] + public virtual string? DisplayField { get; set; } + } + + public partial class UserSelectionFieldDto + : JsonSchemaFieldDto + { + [DataMember] + public virtual bool Multiple { get; set; } + + [DataMember] + public virtual string? DisplayField { get; set; } + } diff --git a/src/Norbix.Sdk.Types/Generated/Hub.dtos.cs b/src/Norbix.Sdk.Types/Generated/Hub.dtos.cs index fee4e77..7aebf4e 100644 --- a/src/Norbix.Sdk.Types/Generated/Hub.dtos.cs +++ b/src/Norbix.Sdk.Types/Generated/Hub.dtos.cs @@ -1913,7 +1913,7 @@ public partial class CreateAiServiceUserResponse } [DataContract] - public partial class EchoLicenseDto + public partial class InstallationLicenseDetailsDto { [DataMember(Name="domain")] public virtual string? Domain { get; set; } @@ -1984,6 +1984,15 @@ public partial class InstallationLicenseStatusDto [DataMember(Name="message")] public virtual string? Message { get; set; } + + [DataMember(Name="license")] + public virtual InstallationLicenseDetailsDto? License { get; set; } + + [DataMember(Name="licensingDocsUrl")] + public virtual string? LicensingDocsUrl { get; set; } + + [DataMember(Name="askForEnterpriseLicenseEmail")] + public virtual string? AskForEnterpriseLicenseEmail { get; set; } } [DataContract] @@ -12319,6 +12328,28 @@ public partial class GetComplianceSettingsResponse public virtual ProjectComplianceDto? Settings { get; set; } } + [DataContract] + public partial class ContactRolesRepairDto + { + [DataMember(Name="dryRun")] + public virtual bool DryRun { get; set; } + + [DataMember(Name="contactsWithoutRoles")] + public virtual int ContactsWithoutRoles { get; set; } + + [DataMember(Name="contactsToRepair")] + public virtual int ContactsToRepair { get; set; } + + [DataMember(Name="contactsRepaired")] + public virtual int ContactsRepaired { get; set; } + + [DataMember(Name="contactsWithoutLoginRoleIds")] + public virtual int ContactsWithoutLoginRoleIds { get; set; } + + [DataMember(Name="legacyRoleNamesIgnored")] + public virtual int LegacyRoleNamesIgnored { get; set; } + } + /// ///Create a contact /// @@ -12427,6 +12458,25 @@ public partial class MergeContactsRequest public virtual string[] MergedIds { get; set; } = []; } + /// + ///Repair contact roles from their logins + /// + [NorbixRoute("/{version}/membership/users/repair-roles", "POST")] + public partial class RepairContactRolesRequest + : CodeMashRequestBase, INorbixRequest + { + /// + ///True (default) = only count what would change. False = write. + /// + public virtual bool DryRun { get; set; } + } + + public partial class RepairContactRolesResponse + : ResponseBase + { + public virtual ContactRolesRepairDto? Result { get; set; } + } + /// ///Sets or removes one user's own end-user AI plan /// @@ -13988,6 +14038,12 @@ public partial class GetDatabaseTaxonomyResponse public partial class GetDatabaseTaxonomyTreeRequest : CodeMashRequestBase, INorbixRequest { + /// + ///Set true to keep name / description as stored even when Accept-Language is sent (editors). The full translations are always in names / descriptions. + /// + [DataMember] + public virtual bool AllLanguages { get; set; } + /// ///When true, each taxonomy node also carries its own term tree (heavier response). /// @@ -14120,6 +14176,12 @@ public partial class DeleteManyDatabaseTaxonomyTermsRequest public partial class GetDatabaseMergedTermTreeRequest : CodeMashRequestBase, INorbixRequest { + /// + ///Set true to keep name / description as stored even when Accept-Language is sent (editors). The full translations are always in names / descriptions. + /// + [DataMember] + public virtual bool AllLanguages { get; set; } + /// ///Root taxonomy slug/name (from get_database_taxonomies). Its terms are the roots; child-taxonomy terms nest under them. /// @@ -14147,6 +14209,12 @@ public partial class GetDatabaseMergedTermTreeResponse public partial class GetDatabaseTaxonomyTermRequest : CodeMashRequestBase, INorbixRequest { + /// + ///Set true to keep name / description as stored even when Accept-Language is sent (editors). The full translations are always in names / descriptions. + /// + [DataMember] + public virtual bool AllLanguages { get; set; } + /// ///Taxonomy id from get_database_taxonomies. /// @@ -14180,6 +14248,12 @@ public partial class GetDatabaseTaxonomyTermResponse public partial class GetDatabaseTaxonomyTermTreeRequest : CodeMashRequestBase, INorbixRequest { + /// + ///Set true to keep name / description as stored even when Accept-Language is sent (editors). The full translations are always in names / descriptions. + /// + [DataMember] + public virtual bool AllLanguages { get; set; } + /// ///Taxonomy slug/name to fetch the term tree for, from get_database_taxonomies. /// @@ -19591,8 +19665,6 @@ public partial class EchoRegionDto public partial class EchoResponse { - public virtual string? ContainerName { get; set; } - public virtual string Ip { get; set; } public virtual CodeMashRelease Release { get; set; } public virtual CodeMashRuntime Runtime { get; set; } public virtual string ManagedServiceHubUrl { get; set; } @@ -19601,18 +19673,10 @@ public partial class EchoResponse public virtual string ApiUrl { get; set; } public virtual string ApiVersion { get; set; } public virtual string HubVersion { get; set; } - public virtual string MjmlUrl { get; set; } public virtual string? AdminUrlTemplate { get; set; } - public virtual EchoLicenseDto? License { get; set; } - public virtual string? AskForEnterpriseLicenseEmail { get; set; } public virtual bool EmailServiceConfigured { get; set; } public virtual string? RootBootstrapPasswordSource { get; set; } public virtual List? Regions { get; set; } - public virtual bool IsProductionInstallation { get; set; } - public virtual string LicensingMode { get; set; } - public virtual int? GraceDaysLeft { get; set; } - public virtual string? InstallationDomain { get; set; } - public virtual string? LicensingDocsUrl { get; set; } public virtual EchoAgentDto? Agent { get; set; } public virtual EchoHostingPlatformDto? HostingPlatform { get; set; } } @@ -19692,11 +19756,6 @@ public partial class CodeMashRequestBase public virtual string? Env { get; set; } } - public partial interface ICultureBasedRequest - { - string? CultureCode { get; set; } - } - public partial interface IHasCorrelationIdRequest { Guid? CorrelationId { get; set; } @@ -19709,14 +19768,8 @@ public partial interface IVersionBasedRequest [DataContract(Namespace="http://codemash.io/types/")] public partial class RequestBase - : ICultureBasedRequest, IVersionBasedRequest, IHasCorrelationIdRequest + : IVersionBasedRequest, IHasCorrelationIdRequest { - /// - ///Specify culture code when your response from the API should be localised. E.g.: en - /// - [DataMember] - public virtual string? CultureCode { get; set; } - /// ///TimeZone /// diff --git a/tests/Norbix.Hub.Tests/test_results/EndpointCoverageTests.Hub.Database.verified.txt b/tests/Norbix.Hub.Tests/test_results/EndpointCoverageTests.Hub.Database.verified.txt index c38e2b5..fc11591 100644 --- a/tests/Norbix.Hub.Tests/test_results/EndpointCoverageTests.Hub.Database.verified.txt +++ b/tests/Norbix.Hub.Tests/test_results/EndpointCoverageTests.Hub.Database.verified.txt @@ -2115,7 +2115,7 @@ Sent: { Method: GET, Path: /v2/database/taxonomies/tree, - Query: ?includeTerms=True&databaseIntegrationId={guid}&env=test-env, + Query: ?allLanguages=True&includeTerms=True&databaseIntegrationId={guid}&env=test-env, Headers: { Authorization: Bearer test-bearer, norbix-account-id: test-account, @@ -2246,7 +2246,7 @@ Sent: { Method: GET, Path: /v2/database/taxonomies/test-taxonomyName/merged-tree, - Query: ?databaseIntegrationId={guid}&env=test-env, + Query: ?allLanguages=True&databaseIntegrationId={guid}&env=test-env, Headers: { Authorization: Bearer test-bearer, norbix-account-id: test-account, @@ -2279,7 +2279,7 @@ Sent: { Method: GET, Path: /v2/database/taxonomies/{guid}/terms/{guid}, - Query: ?databaseIntegrationId={guid}&env=test-env, + Query: ?allLanguages=True&databaseIntegrationId={guid}&env=test-env, Headers: { Authorization: Bearer test-bearer, norbix-account-id: test-account, @@ -2320,7 +2320,7 @@ Sent: { Method: GET, Path: /v2/database/taxonomies/test-taxonomyName/terms/tree, - Query: ?rootTermId={guid}&depth=1&databaseIntegrationId={guid}&env=test-env, + Query: ?allLanguages=True&rootTermId={guid}&depth=1&databaseIntegrationId={guid}&env=test-env, Headers: { Authorization: Bearer test-bearer, norbix-account-id: test-account, diff --git a/tests/Norbix.Hub.Tests/test_results/EndpointCoverageTests.Hub.Echo.verified.txt b/tests/Norbix.Hub.Tests/test_results/EndpointCoverageTests.Hub.Echo.verified.txt index 0d323b7..df01a9a 100644 --- a/tests/Norbix.Hub.Tests/test_results/EndpointCoverageTests.Hub.Echo.verified.txt +++ b/tests/Norbix.Hub.Tests/test_results/EndpointCoverageTests.Hub.Echo.verified.txt @@ -23,36 +23,18 @@ }, ResponseType: EchoResponse, Response: { - ContainerName: test-containerName, - Ip: test-ip, ManagedServiceHubUrl: https://example.test/managedServiceHubUrl, ManagedServiceApiUrl: https://example.test/managedServiceApiUrl, HubUrl: https://example.test/hubUrl, ApiUrl: https://example.test/apiUrl, ApiVersion: test-apiVersion, HubVersion: test-hubVersion, - MjmlUrl: https://example.test/mjmlUrl, AdminUrlTemplate: https://example.test/adminUrlTemplate, - License: { - domain: test-domain, - accountId: Guid_1, - email: user@example.test, - release: test-release, - expire: 42, - isTrial: true, - cap: 7 - }, - AskForEnterpriseLicenseEmail: user@example.test, EmailServiceConfigured: true, RootBootstrapPasswordSource: test-rootBootstrapPasswordSource, Regions: [ {} ], - IsProductionInstallation: true, - LicensingMode: test-licensingMode, - GraceDaysLeft: 7, - InstallationDomain: test-installationDomain, - LicensingDocsUrl: https://example.test/licensingDocsUrl, Agent: { McpUrl: https://example.test/mcpUrl, OAuthMetadataUrl: https://example.test/oAuthMetadataUrl, diff --git a/tests/Norbix.Hub.Tests/test_results/EndpointCoverageTests.Hub.Membership.verified.txt b/tests/Norbix.Hub.Tests/test_results/EndpointCoverageTests.Hub.Membership.verified.txt index ed2c679..700964a 100644 --- a/tests/Norbix.Hub.Tests/test_results/EndpointCoverageTests.Hub.Membership.verified.txt +++ b/tests/Norbix.Hub.Tests/test_results/EndpointCoverageTests.Hub.Membership.verified.txt @@ -1,7 +1,7 @@ { Target: Hub, Group: membership, - Count: 45, + Count: 46, Endpoints: [ { Target: Hub, @@ -168,6 +168,44 @@ } } }, + { + Target: Hub, + Group: membership, + MethodName: RepairContactRolesAsync, + RequestType: RepairContactRolesRequest, + HttpMethod: POST, + Path: /{version}/membership/users/repair-roles, + IsAccountScoped: false, + IsUnauthenticated: false, + Sent: { + Method: POST, + Path: /v2/membership/users/repair-roles, + Headers: { + Authorization: Bearer test-bearer, + Content-Type: application/json; charset=utf-8, + norbix-account-id: test-account, + norbix-project-id: test-project + }, + Body: { + dryRun: true, + env: test-env + } + }, + ResponseType: RepairContactRolesResponse, + Response: { + Result: { + dryRun: true, + contactsWithoutRoles: 7, + contactsToRepair: 7, + contactsRepaired: 7, + contactsWithoutLoginRoleIds: 7, + legacyRoleNamesIgnored: 7 + }, + ResponseStatus: { + IsSuccess: true + } + } + }, { Target: Hub, Group: membership, diff --git a/tests/Norbix.Hub.Tests/test_results/SchemaContentTests.TermSlug.verified.txt b/tests/Norbix.Hub.Tests/test_results/SchemaContentTests.TermSlug.verified.txt index b04cac2..439dd1d 100644 --- a/tests/Norbix.Hub.Tests/test_results/SchemaContentTests.TermSlug.verified.txt +++ b/tests/Norbix.Hub.Tests/test_results/SchemaContentTests.TermSlug.verified.txt @@ -2,6 +2,7 @@ Sent: { Method: GET, Path: /v2/database/taxonomies/tax_regions/terms/trm_1, + Query: ?allLanguages=False, Headers: { Authorization: Bearer test-bearer, norbix-account-id: test-account, diff --git a/tests/Norbix.Sdk.Tests/test_results/EndpointCoverageTests.Api.Database.verified.txt b/tests/Norbix.Sdk.Tests/test_results/EndpointCoverageTests.Api.Database.verified.txt index 0406d47..1c6e392 100644 --- a/tests/Norbix.Sdk.Tests/test_results/EndpointCoverageTests.Api.Database.verified.txt +++ b/tests/Norbix.Sdk.Tests/test_results/EndpointCoverageTests.Api.Database.verified.txt @@ -258,7 +258,7 @@ Sent: { Method: GET, Path: /v2/database/collections/test-collectionName/{guid}, - Query: ?databaseIntegrationId={guid}&expandReferences=True&env=test-env, + Query: ?databaseIntegrationId={guid}&expandReferences=True&allLanguages=True&env=test-env, Headers: { Authorization: Bearer test-bearer, norbix-account-id: test-account, @@ -290,7 +290,7 @@ Sent: { Method: GET, Path: /v2/database/collections/test-collectionName/own, - Query: ?databaseIntegrationId={guid}&filter=test-filter&schemaVersion=1&pagingArgs=Norbix.Sdk.Types.Api.PagingArgs&expandReferences=True&env=test-env&startingAfter=test-startingAfter&endingBefore=test-endingBefore&pageSize=1, + Query: ?databaseIntegrationId={guid}&filter=test-filter&schemaVersion=1&pagingArgs=Norbix.Sdk.Types.Api.PagingArgs&expandReferences=True&allLanguages=True&env=test-env&startingAfter=test-startingAfter&endingBefore=test-endingBefore&pageSize=1, Headers: { Authorization: Bearer test-bearer, norbix-account-id: test-account, @@ -330,7 +330,7 @@ Sent: { Method: GET, Path: /v2/database/collections/test-collectionName, - Query: ?databaseIntegrationId={guid}&filter=test-filter&schemaVersion=1&pagingArgs=Norbix.Sdk.Types.Api.PagingArgs&sortBy=test-sortBy&sortOrder=1&expandReferences=True&env=test-env&startingAfter=test-startingAfter&endingBefore=test-endingBefore&pageSize=1, + Query: ?databaseIntegrationId={guid}&filter=test-filter&schemaVersion=1&pagingArgs=Norbix.Sdk.Types.Api.PagingArgs&sortBy=test-sortBy&sortOrder=1&expandReferences=True&allLanguages=True&env=test-env&startingAfter=test-startingAfter&endingBefore=test-endingBefore&pageSize=1, Headers: { Authorization: Bearer test-bearer, norbix-account-id: test-account, @@ -624,7 +624,7 @@ Sent: { Method: GET, Path: /v2/database/taxonomies/test-taxonomyName/merged-tree, - Query: ?databaseIntegrationId={guid}&env=test-env, + Query: ?allLanguages=True&databaseIntegrationId={guid}&env=test-env, Headers: { Authorization: Bearer test-bearer, norbix-account-id: test-account, @@ -653,7 +653,7 @@ Sent: { Method: GET, Path: /v2/database/taxonomies/tree, - Query: ?includeTerms=True&databaseIntegrationId={guid}&env=test-env, + Query: ?allLanguages=True&includeTerms=True&databaseIntegrationId={guid}&env=test-env, Headers: { Authorization: Bearer test-bearer, norbix-account-id: test-account, @@ -686,7 +686,7 @@ Sent: { Method: GET, Path: /v2/database/taxonomies/test-taxonomyName/terms/{guid}/children, - Query: ?databaseIntegrationId={guid}&filter=test-filter&pagingArgs=Norbix.Sdk.Types.Api.PagingArgs&env=test-env&startingAfter=test-startingAfter&endingBefore=test-endingBefore&pageSize=1, + Query: ?allLanguages=True&databaseIntegrationId={guid}&filter=test-filter&pagingArgs=Norbix.Sdk.Types.Api.PagingArgs&env=test-env&startingAfter=test-startingAfter&endingBefore=test-endingBefore&pageSize=1, Headers: { Authorization: Bearer test-bearer, norbix-account-id: test-account, @@ -724,7 +724,7 @@ Sent: { Method: GET, Path: /v2/database/taxonomies/test-taxonomyName/terms, - Query: ?databaseIntegrationId={guid}&filter=test-filter&sortDescending=True&pagingArgs=Norbix.Sdk.Types.Api.PagingArgs&env=test-env&startingAfter=test-startingAfter&endingBefore=test-endingBefore&pageSize=1, + Query: ?allLanguages=True&databaseIntegrationId={guid}&filter=test-filter&sortDescending=True&pagingArgs=Norbix.Sdk.Types.Api.PagingArgs&env=test-env&startingAfter=test-startingAfter&endingBefore=test-endingBefore&pageSize=1, Headers: { Authorization: Bearer test-bearer, norbix-account-id: test-account, @@ -762,7 +762,7 @@ Sent: { Method: GET, Path: /v2/database/taxonomies/test-taxonomyName/terms/tree, - Query: ?rootTermId={guid}&depth=1&databaseIntegrationId={guid}&env=test-env, + Query: ?allLanguages=True&rootTermId={guid}&depth=1&databaseIntegrationId={guid}&env=test-env, Headers: { Authorization: Bearer test-bearer, norbix-account-id: test-account, diff --git a/tests/Norbix.Sdk.Tests/test_results/EndpointCoverageTests.Api.Echo.verified.txt b/tests/Norbix.Sdk.Tests/test_results/EndpointCoverageTests.Api.Echo.verified.txt index 6bc9ee7..cca4465 100644 --- a/tests/Norbix.Sdk.Tests/test_results/EndpointCoverageTests.Api.Echo.verified.txt +++ b/tests/Norbix.Sdk.Tests/test_results/EndpointCoverageTests.Api.Echo.verified.txt @@ -23,36 +23,18 @@ }, ResponseType: EchoResponse, Response: { - ContainerName: test-containerName, - Ip: test-ip, ManagedServiceHubUrl: https://example.test/managedServiceHubUrl, ManagedServiceApiUrl: https://example.test/managedServiceApiUrl, HubUrl: https://example.test/hubUrl, ApiUrl: https://example.test/apiUrl, ApiVersion: test-apiVersion, HubVersion: test-hubVersion, - MjmlUrl: https://example.test/mjmlUrl, AdminUrlTemplate: https://example.test/adminUrlTemplate, - License: { - domain: test-domain, - accountId: Guid_1, - email: user@example.test, - release: test-release, - expire: 42, - isTrial: true, - cap: 7 - }, - AskForEnterpriseLicenseEmail: user@example.test, EmailServiceConfigured: true, RootBootstrapPasswordSource: test-rootBootstrapPasswordSource, Regions: [ {} ], - IsProductionInstallation: true, - LicensingMode: test-licensingMode, - GraceDaysLeft: 7, - InstallationDomain: test-installationDomain, - LicensingDocsUrl: https://example.test/licensingDocsUrl, Agent: { McpUrl: https://example.test/mcpUrl, OAuthMetadataUrl: https://example.test/oAuthMetadataUrl, diff --git a/tests/Norbix.Sdk.Tests/test_results/EndpointCoverageTests.Api.Notifications.verified.txt b/tests/Norbix.Sdk.Tests/test_results/EndpointCoverageTests.Api.Notifications.verified.txt new file mode 100644 index 0000000..e0eb1b6 --- /dev/null +++ b/tests/Norbix.Sdk.Tests/test_results/EndpointCoverageTests.Api.Notifications.verified.txt @@ -0,0 +1,233 @@ +{ + Target: Api, + Group: notifications, + Count: 7, + Endpoints: [ + { + Target: Api, + Group: notifications, + MethodName: DeleteOwnPushDeviceByTokenAsync, + RequestType: DeleteOwnPushDeviceByTokenRequest, + HttpMethod: DELETE, + Path: /{version}/notifications/push/devices, + IsAccountScoped: false, + IsUnauthenticated: false, + Sent: { + Method: DELETE, + Path: /v2/notifications/push/devices, + Query: ?token=test-token&env=test-env, + Headers: { + Authorization: Bearer test-bearer, + norbix-account-id: test-account, + norbix-project-id: test-project + } + }, + ResponseType: EmptyResponse, + Response: { + ResponseStatus: { + IsSuccess: true + } + } + }, + { + Target: Api, + Group: notifications, + MethodName: DeleteOwnPushDeviceAsync, + RequestType: DeleteOwnPushDeviceRequest, + HttpMethod: DELETE, + Path: /{version}/notifications/push/devices/{Id}, + PathParams: [ + Id + ], + IsAccountScoped: false, + IsUnauthenticated: false, + Sent: { + Method: DELETE, + Path: /v2/notifications/push/devices/{guid}, + Query: ?env=test-env, + Headers: { + Authorization: Bearer test-bearer, + norbix-account-id: test-account, + norbix-project-id: test-project + } + }, + ResponseType: EmptyResponse, + Response: { + ResponseStatus: { + IsSuccess: true + } + } + }, + { + Target: Api, + Group: notifications, + MethodName: GetOwnPushDevicesAsync, + RequestType: GetOwnPushDevicesRequest, + HttpMethod: GET, + Path: /{version}/notifications/push/devices, + IsAccountScoped: false, + IsUnauthenticated: false, + Sent: { + Method: GET, + Path: /v2/notifications/push/devices, + Query: ?env=test-env, + Headers: { + Authorization: Bearer test-bearer, + norbix-account-id: test-account, + norbix-project-id: test-project + } + }, + ResponseType: GetOwnPushDevicesResponse, + Response: { + Items: [ + {} + ], + ResponseStatus: { + IsSuccess: true + } + } + }, + { + Target: Api, + Group: notifications, + MethodName: GetOwnPushMessagesAsync, + RequestType: GetOwnPushMessagesRequest, + HttpMethod: GET, + Path: /{version}/notifications/push/messages, + IsAccountScoped: false, + IsUnauthenticated: false, + Sent: { + Method: GET, + Path: /v2/notifications/push/messages, + Query: ?unreadOnly=True&env=test-env&startingAfter=test-startingAfter&endingBefore=test-endingBefore&pageSize=1, + Headers: { + Authorization: Bearer test-bearer, + norbix-account-id: test-account, + norbix-project-id: test-project + } + }, + ResponseType: GetOwnPushMessagesResponse, + Response: { + List: { + Items: [ + { + IsRead: false + } + ], + HasMore: false, + HasPrevious: false, + StartingAfter: cursor-start, + EndingBefore: cursor-end + }, + ResponseStatus: { + IsSuccess: true + } + } + }, + { + Target: Api, + Group: notifications, + MethodName: MarkAllOwnPushMessagesReadAsync, + RequestType: MarkAllOwnPushMessagesReadRequest, + HttpMethod: POST, + Path: /{version}/notifications/push/messages/read, + IsAccountScoped: false, + IsUnauthenticated: false, + Sent: { + Method: POST, + Path: /v2/notifications/push/messages/read, + Headers: { + Authorization: Bearer test-bearer, + Content-Type: application/json; charset=utf-8, + norbix-account-id: test-account, + norbix-project-id: test-project + }, + Body: { + env: test-env + } + }, + ResponseType: EmptyResponse, + Response: { + ResponseStatus: { + IsSuccess: true + } + } + }, + { + Target: Api, + Group: notifications, + MethodName: MarkOwnPushMessageReadAsync, + RequestType: MarkOwnPushMessageReadRequest, + HttpMethod: POST, + Path: /{version}/notifications/push/messages/{Id}/read, + PathParams: [ + Id + ], + IsAccountScoped: false, + IsUnauthenticated: false, + Sent: { + Method: POST, + Path: /v2/notifications/push/messages/{guid}/read, + Headers: { + Authorization: Bearer test-bearer, + Content-Type: application/json; charset=utf-8, + norbix-account-id: test-account, + norbix-project-id: test-project + }, + Body: { + env: test-env + } + }, + ResponseType: EmptyResponse, + Response: { + ResponseStatus: { + IsSuccess: true + } + } + }, + { + Target: Api, + Group: notifications, + MethodName: RegisterOwnPushDeviceAsync, + RequestType: RegisterOwnPushDeviceRequest, + HttpMethod: POST, + Path: /{version}/notifications/push/devices, + IsAccountScoped: false, + IsUnauthenticated: false, + Sent: { + Method: POST, + Path: /v2/notifications/push/devices, + Headers: { + Authorization: Bearer test-bearer, + Content-Type: application/json; charset=utf-8, + norbix-account-id: test-account, + norbix-project-id: test-project + }, + Body: { + provider: test-provider, + token: test-token, + platform: test-platform, + osName: test-osName, + osVersion: test-osVersion, + appVersion: test-appVersion, + deviceName: test-deviceName, + modelName: test-modelName, + brand: test-brand, + manufacturer: test-manufacturer, + installationId: Guid_1, + locale: test-locale, + timeZone: test-timeZone, + env: test-env + } + }, + ResponseType: IdResponse, + Response: { + Id: Guid_1, + Status: test-status, + ResponseStatus: { + IsSuccess: true + } + } + } + ] +} \ No newline at end of file diff --git a/tests/Norbix.Sdk.Tests/test_results/SchemaContentTests.FindExpandReferences.verified.txt b/tests/Norbix.Sdk.Tests/test_results/SchemaContentTests.FindExpandReferences.verified.txt index 0025dfa..103992e 100644 --- a/tests/Norbix.Sdk.Tests/test_results/SchemaContentTests.FindExpandReferences.verified.txt +++ b/tests/Norbix.Sdk.Tests/test_results/SchemaContentTests.FindExpandReferences.verified.txt @@ -2,7 +2,7 @@ Sent: { Method: GET, Path: /v2/database/collections/orders, - Query: ?expandReferences=True, + Query: ?expandReferences=True&allLanguages=False, Headers: { Authorization: Bearer test-api-key, norbix-project-id: test-project diff --git a/tests/Norbix.Sdk.Tests/test_results/SchemaContentTests.FindNestedFilterDottedSort.verified.txt b/tests/Norbix.Sdk.Tests/test_results/SchemaContentTests.FindNestedFilterDottedSort.verified.txt index 76866c3..691db1f 100644 --- a/tests/Norbix.Sdk.Tests/test_results/SchemaContentTests.FindNestedFilterDottedSort.verified.txt +++ b/tests/Norbix.Sdk.Tests/test_results/SchemaContentTests.FindNestedFilterDottedSort.verified.txt @@ -1,7 +1,7 @@ { Method: GET, Path: /v2/database/collections/orders, - Query: ?filter=%7b%22address.city%22%3a%22Vilnius%22%2c%22tags.0%22%3a%22vip%22%7d&sortBy=address.city&sortOrder=-1&expandReferences=False, + Query: ?filter=%7b%22address.city%22%3a%22Vilnius%22%2c%22tags.0%22%3a%22vip%22%7d&sortBy=address.city&sortOrder=-1&expandReferences=False&allLanguages=False, Headers: { Authorization: Bearer test-api-key, norbix-project-id: test-project diff --git a/tests/Norbix.Sdk.Tests/test_results/SchemaContentTests.FindOneExpandReferences.verified.txt b/tests/Norbix.Sdk.Tests/test_results/SchemaContentTests.FindOneExpandReferences.verified.txt index b31a02f..c493353 100644 --- a/tests/Norbix.Sdk.Tests/test_results/SchemaContentTests.FindOneExpandReferences.verified.txt +++ b/tests/Norbix.Sdk.Tests/test_results/SchemaContentTests.FindOneExpandReferences.verified.txt @@ -2,7 +2,7 @@ Sent: { Method: GET, Path: /v2/database/collections/orders/ord_1, - Query: ?expandReferences=True, + Query: ?expandReferences=True&allLanguages=False, Headers: { Authorization: Bearer test-api-key, norbix-project-id: test-project diff --git a/tests/Norbix.Sdk.Tests/test_results/SchemaContentTests.FindOwnExpandReferences.verified.txt b/tests/Norbix.Sdk.Tests/test_results/SchemaContentTests.FindOwnExpandReferences.verified.txt index c76cb9a..14627ae 100644 --- a/tests/Norbix.Sdk.Tests/test_results/SchemaContentTests.FindOwnExpandReferences.verified.txt +++ b/tests/Norbix.Sdk.Tests/test_results/SchemaContentTests.FindOwnExpandReferences.verified.txt @@ -1,7 +1,7 @@ { Method: GET, Path: /v2/database/collections/orders/own, - Query: ?expandReferences=True, + Query: ?expandReferences=True&allLanguages=False, Headers: { Authorization: Bearer test-api-key, norbix-project-id: test-project diff --git a/tests/Norbix.Sdk.Tests/test_results/SchemaContentTests.FindWithoutExpand.verified.txt b/tests/Norbix.Sdk.Tests/test_results/SchemaContentTests.FindWithoutExpand.verified.txt index a3026dd..d07268d 100644 --- a/tests/Norbix.Sdk.Tests/test_results/SchemaContentTests.FindWithoutExpand.verified.txt +++ b/tests/Norbix.Sdk.Tests/test_results/SchemaContentTests.FindWithoutExpand.verified.txt @@ -2,7 +2,7 @@ Sent: { Method: GET, Path: /v2/database/collections/orders, - Query: ?expandReferences=False, + Query: ?expandReferences=False&allLanguages=False, Headers: { Authorization: Bearer test-api-key, norbix-project-id: test-project