diff --git a/docs/apis/account-and-transaction/openapi-aisp.json b/docs/apis/account-and-transaction/openapi-aisp.json index a0436339..0f36905d 100644 --- a/docs/apis/account-and-transaction/openapi-aisp.json +++ b/docs/apis/account-and-transaction/openapi-aisp.json @@ -3,7 +3,7 @@ "info": { "title": "Account and Transaction API", "description": "Account and Transaction API for Open Banking Connector Web App", - "version": "20.0.0" + "version": "21.0.0" }, "paths": { "/aisp/account-access-consent-auth-contexts": { diff --git a/docs/apis/auth-contexts/openapi-auth.json b/docs/apis/auth-contexts/openapi-auth.json index 8af98e23..e9b86c1a 100644 --- a/docs/apis/auth-contexts/openapi-auth.json +++ b/docs/apis/auth-contexts/openapi-auth.json @@ -3,7 +3,7 @@ "info": { "title": "Auth Contexts API", "description": "Auth Contexts API for Open Banking Connector Web App", - "version": "20.0.0" + "version": "21.0.0" }, "paths": { "/auth/redirect-delegate": { diff --git a/docs/apis/management/openapi-manage.json b/docs/apis/management/openapi-manage.json index f912eb46..8faccc75 100644 --- a/docs/apis/management/openapi-manage.json +++ b/docs/apis/management/openapi-manage.json @@ -3,7 +3,7 @@ "info": { "title": "Management API", "description": "Management API for Open Banking Connector Web App", - "version": "20.0.0" + "version": "21.0.0" }, "paths": { "/manage/bank-registrations": { diff --git a/docs/apis/payment-initiation/openapi-pisp.json b/docs/apis/payment-initiation/openapi-pisp.json index 36973817..10ddba1b 100644 --- a/docs/apis/payment-initiation/openapi-pisp.json +++ b/docs/apis/payment-initiation/openapi-pisp.json @@ -3,7 +3,7 @@ "info": { "title": "Payment Initiation API", "description": "Payment Initiation API for Open Banking Connector Web App", - "version": "20.0.0" + "version": "21.0.0" }, "paths": { "/pisp/domestic-payment-consent-auth-contexts": { diff --git a/docs/apis/variable-recurring-payments/openapi-vrp.json b/docs/apis/variable-recurring-payments/openapi-vrp.json index 2bfbaaf2..3d144b33 100644 --- a/docs/apis/variable-recurring-payments/openapi-vrp.json +++ b/docs/apis/variable-recurring-payments/openapi-vrp.json @@ -3,7 +3,7 @@ "info": { "title": "Variable Recurring Payments API", "description": "Variable Recurring Payments API for Open Banking Connector Web App", - "version": "20.0.0" + "version": "21.0.0" }, "paths": { "/vrp/domestic-vrp-consent-auth-contexts": { diff --git a/docs/configuration/database-settings.md b/docs/configuration/database-settings.md index 0cb7dc96..d17a6430 100644 --- a/docs/configuration/database-settings.md +++ b/docs/configuration/database-settings.md @@ -15,16 +15,15 @@ Open Banking Connector then obtains the password and adds it to the connection s - For MongoDB, the first `@` is used as an insertion point for - `$":{password}"` (C#) where `password` is the obtained password as a string - For example, connection string "mongodb://my-user@localhost:27017" might become "mongodb://my-user:my-password@localhost:27017" -- For SQLite, passwords are ignored. ## Settings -| Name | Valid Values | Default Value(s) | Description | -|----------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| OpenBankingConnector:Database:Provider | {`"Sqlite"`, `"PostgreSql", "MongoDb"`} | `"PostgreSql"` | Determines which database provider Open Banking Connector uses. | -| OpenBankingConnector:Database:ConnectionStrings:{Provider}

*where Provider ∈ {Sqlite, PostgreSql, MongoDb}*

| string | `"Data Source=./sqliteTestDb.db"` (development environment and Provider = `"Sqlite"`)

`"Host=localhost;Database=test;``Username=postgres"` (development environment and Provider = `"PostgreSql"`)

`"mongodb://localhost:27017"` (development environment and Provider = `"MongoDb"`)

- (otherwise) | Connection strings for each database provider. Open Banking Connector only reads the one for the provider specified by OpenBankingConnector:Database:Provider. The BankTests project, however, may use multiple connection strings to test with multiple databases. A list of connection string parameters for provider `PostgreSql` is given [here](https://www.npgsql.org/doc/connection-string-parameters.html). | -| OpenBankingConnector:Database:Names:{Provider}

*where Provider ∈ {Sqlite, PostgreSql, MongoDb}*

| string | - | Name of database for each database provider. Open Banking Connector only reads the one for the provider specified by OpenBankingConnector:Database:Provider. (Only currently implemented for MongoDb). | -| OpenBankingConnector:Database:PasswordSettingNames:{Provider}

*where Provider ∈ {Sqlite, PostgreSql, MongoDb}*

| string | - | Name of password secret for each database provider. Open Banking Connector only reads the one for the provider specified by OpenBankingConnector:Database:Provider. The password is obtained and added to the connection string (see text above this table). | -| OpenBankingConnector:Database:PasswordSources:{Provider}

*where Provider ∈ {Sqlite, PostgreSql, MongoDb}*

| {`"Configuration"`, `"AwsSsmParameterStore"`, `"GoogleCloudSecretManagerV1"`} | `"Configuration"` | Source of password secret for each database provider. Open Banking Connector only reads the one for the provider specified by OpenBankingConnector:Database:Provider. The password is obtained and added to the connection string (see text above this table). | -| OpenBankingConnector:Database:EnsureDatabaseCreated | {`"true"`, `"false"`} | `"false"` | At application start-up, ensure database is created if does not exist. | -| OpenBankingConnector:Database:EnsureDatabaseMigrated | {`"true"`, `"false"`} | `"true"` | At application start-up, apply pending migrations. Only supported for database providers with migration support (i.e. only PostgreSql at this time). | +| Name | Valid Values | Default Value(s) | Description | +|--------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| OpenBankingConnector:Database:Provider | {`"PostgreSql", "MongoDb"`} | `"PostgreSql"` | Determines which database provider Open Banking Connector uses. | +| OpenBankingConnector:Database:ConnectionStrings:{Provider}

*where Provider ∈ {PostgreSql, MongoDb}*

| string | `"Host=localhost;Database=test;``Username=postgres"` (development environment and Provider = `"PostgreSql"`)

`"mongodb://localhost:27017"` (development environment and Provider = `"MongoDb"`)

- (otherwise) | Connection strings for each database provider. Open Banking Connector only reads the one for the provider specified by OpenBankingConnector:Database:Provider. The BankTests project, however, may use multiple connection strings to test with multiple databases. A list of connection string parameters for provider `PostgreSql` is given [here](https://www.npgsql.org/doc/connection-string-parameters.html). | +| OpenBankingConnector:Database:Names:{Provider}

*where Provider ∈ {PostgreSql, MongoDb}*

| string | - | Name of database for each database provider. Open Banking Connector only reads the one for the provider specified by OpenBankingConnector:Database:Provider. (Only currently implemented for MongoDb). | +| OpenBankingConnector:Database:PasswordSettingNames:{Provider}

*where Provider ∈ {PostgreSql, MongoDb}*

| string | - | Name of password secret for each database provider. Open Banking Connector only reads the one for the provider specified by OpenBankingConnector:Database:Provider. The password is obtained and added to the connection string (see text above this table). | +| OpenBankingConnector:Database:PasswordSources:{Provider}

*where Provider ∈ {PostgreSql, MongoDb}*

| {`"Configuration"`, `"AwsSsmParameterStore"`, `"GoogleCloudSecretManagerV1"`} | `"Configuration"` | Source of password secret for each database provider. Open Banking Connector only reads the one for the provider specified by OpenBankingConnector:Database:Provider. The password is obtained and added to the connection string (see text above this table). | +| OpenBankingConnector:Database:EnsureDatabaseCreated | {`"true"`, `"false"`} | `"false"` | At application start-up, ensure database is created if does not exist. | +| OpenBankingConnector:Database:EnsureDatabaseMigrated | {`"true"`, `"false"`} | `"true"` | At application start-up, apply pending migrations. Only supported for database providers with migration support (i.e. only PostgreSql at this time). | diff --git a/src/OpenBanking.Library.BankApiModels/Json/DomesticVrpRefundConverter.cs b/src/OpenBanking.Library.BankApiModels/Json/DomesticVrpRefundConverter.cs index d35d0bcd..7725beae 100644 --- a/src/OpenBanking.Library.BankApiModels/Json/DomesticVrpRefundConverter.cs +++ b/src/OpenBanking.Library.BankApiModels/Json/DomesticVrpRefundConverter.cs @@ -5,7 +5,6 @@ #nullable enable using System.Runtime.Serialization; -using FinnovationLabs.OpenBanking.Library.BankApiModels.UkObRw.V3p1p11.NSwagVrp.Models; using Newtonsoft.Json; using Newtonsoft.Json.Converters; using Newtonsoft.Json.Linq; @@ -23,16 +22,17 @@ public enum DomesticVrpRefundConverterOptions ContainsNestedAccountProperty = 1 } -public class DomesticVrpRefundConverter : JsonConverterWithOptions : JsonConverterWithOptions - + where TRefund : class { public DomesticVrpRefundConverter() : base(null) { } // required for case where no label used public DomesticVrpRefundConverter(JsonConverterLabel jsonConverterLabel) : - base(jsonConverterLabel) { } + base(jsonConverterLabel) + { } - public override void WriteJson(JsonWriter writer, OBCashAccountDebtorWithName? value, JsonSerializer serializer) + public override void WriteJson(JsonWriter writer, TRefund? value, JsonSerializer serializer) { if (value is null) { @@ -42,24 +42,16 @@ public override void WriteJson(JsonWriter writer, OBCashAccountDebtorWithName? v { JToken jt = JToken.FromObject(value); jt.WriteTo(writer); - } + } } - public override OBCashAccountDebtorWithName? ReadJson( + public override TRefund? ReadJson( JsonReader reader, Type objectType, - OBCashAccountDebtorWithName? existingValue, + TRefund? existingValue, bool hasExistingValue, JsonSerializer serializer) { - - // Validate objectType - if (objectType != typeof(OBCashAccountDebtorWithName)) - { - throw new NotSupportedException($"The type {objectType} is not supported."); - } - - // Handle JSON null value if (reader.TokenType is JsonToken.Null) { return null; @@ -68,7 +60,7 @@ public override void WriteJson(JsonWriter writer, OBCashAccountDebtorWithName? v // Perform de-serialisation var options = GetOptions(serializer); var token = JToken.Load(reader); - OBCashAccountDebtorWithName? refund; + TRefund? refund; if (options is DomesticVrpRefundConverterOptions.ContainsNestedAccountProperty) { if (token.Type is not JTokenType.Object) @@ -80,18 +72,18 @@ public override void WriteJson(JsonWriter writer, OBCashAccountDebtorWithName? v { throw new Exception("Refund does not contain nested property Account."); } - refund = accountToken.ToObject(); + refund = accountToken.ToObject(serializer); } else { - refund = token.ToObject(); + refund = token.ToObject(serializer); } if (refund is null) { throw new Exception("Could not deserialise Refund account."); } - + return refund; } } diff --git a/src/OpenBanking.Library.BankApiModels/Json/SingleOrArrayConverter.cs b/src/OpenBanking.Library.BankApiModels/Json/SingleOrArrayConverter.cs new file mode 100644 index 00000000..7e08c335 --- /dev/null +++ b/src/OpenBanking.Library.BankApiModels/Json/SingleOrArrayConverter.cs @@ -0,0 +1,43 @@ +// Licensed to Finnovation Labs Limited under one or more agreements. +// Finnovation Labs Limited licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +namespace FinnovationLabs.OpenBanking.Library.BankApiModels.Json; + +/// +/// Custom converter for deserialising a field that may be returned either as a single value or as a JSON array containing a single value. +/// +public class SingleOrArrayConverter : JsonConverter +{ + public override bool CanConvert(Type objectType) => true; + + public override object? ReadJson( + JsonReader reader, + Type objectType, + object? existingValue, + JsonSerializer serializer) + { + JToken token = JToken.Load(reader); + if (token.Type == JTokenType.Array) + { + var array = (JArray) token; + if (array.Count != 1) + { + throw new JsonSerializationException( + $"We can accept JSON array with exactly one element when deserialising {typeof(T).Name}, but received array with {array.Count} elements."); + } + return array[0].ToObject(serializer); + } + + return token.ToObject(serializer); + } + + public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer) + { + serializer.Serialize(writer, value); + } +} diff --git a/src/OpenBanking.Library.BankApiModels/OpenBanking.Library.BankApiModels.csproj b/src/OpenBanking.Library.BankApiModels/OpenBanking.Library.BankApiModels.csproj index 86823b67..dc70840c 100644 --- a/src/OpenBanking.Library.BankApiModels/OpenBanking.Library.BankApiModels.csproj +++ b/src/OpenBanking.Library.BankApiModels/OpenBanking.Library.BankApiModels.csproj @@ -1,7 +1,7 @@ - net9.0 + net10.0 annotations enable FinnovationLabs.OpenBanking.Library.BankApiModels @@ -23,7 +23,7 @@ - + diff --git a/src/OpenBanking.Library.BankApiModels/UkObDcr/V3p1/Models/OBRegistrationProperties1.cs b/src/OpenBanking.Library.BankApiModels/UkObDcr/V3p1/Models/OBRegistrationProperties1.cs index a242ba61..2bbee9dc 100644 --- a/src/OpenBanking.Library.BankApiModels/UkObDcr/V3p1/Models/OBRegistrationProperties1.cs +++ b/src/OpenBanking.Library.BankApiModels/UkObDcr/V3p1/Models/OBRegistrationProperties1.cs @@ -148,6 +148,7 @@ public OBRegistrationProperties1( /// 'tls_client_auth' /// [JsonProperty(PropertyName = "token_endpoint_auth_method")] + [JsonConverter(typeof(SingleOrArrayConverter))] public OBRegistrationProperties1tokenEndpointAuthMethodEnum TokenEndpointAuthMethod { get; set; } /// @@ -191,6 +192,7 @@ public OBRegistrationProperties1( /// Gets or sets possible values include: 'RS256', 'PS256', 'ES256' /// [JsonProperty(PropertyName = "request_object_signing_alg")] + [JsonConverter(typeof(SingleOrArrayConverter))] public SupportedAlgorithmsEnum RequestObjectSigningAlg { get; set; } /// diff --git a/src/OpenBanking.Library.BankApiModels/UkObDcr/V3p2/Models/OBRegistrationProperties1.cs b/src/OpenBanking.Library.BankApiModels/UkObDcr/V3p2/Models/OBRegistrationProperties1.cs index 70db82b1..deea1b4b 100644 --- a/src/OpenBanking.Library.BankApiModels/UkObDcr/V3p2/Models/OBRegistrationProperties1.cs +++ b/src/OpenBanking.Library.BankApiModels/UkObDcr/V3p2/Models/OBRegistrationProperties1.cs @@ -150,6 +150,7 @@ public OBRegistrationProperties1( /// 'tls_client_auth' /// [JsonProperty(PropertyName = "token_endpoint_auth_method")] + [JsonConverter(typeof(SingleOrArrayConverter))] public OBRegistrationProperties1tokenEndpointAuthMethodEnum TokenEndpointAuthMethod { get; set; } /// @@ -196,6 +197,7 @@ public OBRegistrationProperties1( /// Gets or sets possible values include: 'RS256', 'PS256', 'ES256' /// [JsonProperty(PropertyName = "request_object_signing_alg")] + [JsonConverter(typeof(SingleOrArrayConverter))] public SupportedAlgorithmsEnum RequestObjectSigningAlg { get; set; } /// diff --git a/src/OpenBanking.Library.BankApiModels/UkObDcr/V3p3/Models/OBRegistrationProperties1.cs b/src/OpenBanking.Library.BankApiModels/UkObDcr/V3p3/Models/OBRegistrationProperties1.cs index 8bf8d1be..5fadcc96 100644 --- a/src/OpenBanking.Library.BankApiModels/UkObDcr/V3p3/Models/OBRegistrationProperties1.cs +++ b/src/OpenBanking.Library.BankApiModels/UkObDcr/V3p3/Models/OBRegistrationProperties1.cs @@ -157,6 +157,7 @@ public OBRegistrationProperties1() /// 'tls_client_auth' /// [JsonProperty(PropertyName = "token_endpoint_auth_method")] + [JsonConverter(typeof(SingleOrArrayConverter))] public OBRegistrationProperties1tokenEndpointAuthMethodEnum TokenEndpointAuthMethod { get; set; } /// @@ -203,6 +204,7 @@ public OBRegistrationProperties1() /// Gets or sets possible values include: 'RS256', 'PS256', 'ES256' /// [JsonProperty(PropertyName = "request_object_signing_alg")] + [JsonConverter(typeof(SingleOrArrayConverter))] public SupportedAlgorithmsEnum RequestObjectSigningAlg { get; set; } /// diff --git a/src/OpenBanking.Library.BankApiModels/UkObRw/V3p1p11/NSwagVrp/Models/NSwagModels.cs b/src/OpenBanking.Library.BankApiModels/UkObRw/V3p1p11/NSwagVrp/Models/NSwagModels.cs index 8311aaa1..70e4c531 100644 --- a/src/OpenBanking.Library.BankApiModels/UkObRw/V3p1p11/NSwagVrp/Models/NSwagModels.cs +++ b/src/OpenBanking.Library.BankApiModels/UkObRw/V3p1p11/NSwagVrp/Models/NSwagModels.cs @@ -1287,7 +1287,7 @@ public partial record Data4 ///
///
[Newtonsoft.Json.JsonConverter( - typeof(DomesticVrpRefundConverter), + typeof(DomesticVrpRefundConverter), JsonConverterLabel.DomesticVrpRefund)] [Newtonsoft.Json.JsonProperty("Refund", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public OBCashAccountDebtorWithName? Refund { get; set; } = default!; diff --git a/src/OpenBanking.Library.BankApiModels/UkObRw/V4p0/NSwagVrp/Models/NSwagModels.cs b/src/OpenBanking.Library.BankApiModels/UkObRw/V4p0/NSwagVrp/Models/NSwagModels.cs index 64774736..74b79bb3 100644 --- a/src/OpenBanking.Library.BankApiModels/UkObRw/V4p0/NSwagVrp/Models/NSwagModels.cs +++ b/src/OpenBanking.Library.BankApiModels/UkObRw/V4p0/NSwagVrp/Models/NSwagModels.cs @@ -3133,6 +3133,9 @@ public partial record Data4 /// Only included in the response if `Data.ReadRefundAccount` is set to `Yes` in the consent. ///
/// + [Newtonsoft.Json.JsonConverter( + typeof(DomesticVrpRefundConverter), + JsonConverterLabel.DomesticVrpRefund)] [Newtonsoft.Json.JsonProperty("Refund", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public OBCashAccountDebtorWithName? Refund { get; set; } = default!; diff --git a/src/OpenBanking.Library.Connector.GenericHost/Extensions/ServiceCollectionExtensions.cs b/src/OpenBanking.Library.Connector.GenericHost/Extensions/ServiceCollectionExtensions.cs index de7ebcdd..49d78cd4 100644 --- a/src/OpenBanking.Library.Connector.GenericHost/Extensions/ServiceCollectionExtensions.cs +++ b/src/OpenBanking.Library.Connector.GenericHost/Extensions/ServiceCollectionExtensions.cs @@ -71,16 +71,6 @@ public static IServiceCollection AddGenericHostServices( // Configure DB switch (databaseSettings.Provider) { - case DbProvider.Sqlite: - services - // See e.g. https://jasonwatmore.com/post/2020/01/03/aspnet-core-ef-core-migrations-for-multiple-databases-sqlite-and-sql-server - .AddDbContext( - (sp, optionsBuilder) => - { - var connectionStringService = sp.GetRequiredService(); - optionsBuilder.UseSqlite(connectionStringService.GetConnectionString()); - }); - break; case DbProvider.PostgreSql: services.AddDbContext( (sp, optionsBuilder) => diff --git a/src/OpenBanking.Library.Connector.GenericHost/HostedServices/StartupTasksHostedService.cs b/src/OpenBanking.Library.Connector.GenericHost/HostedServices/StartupTasksHostedService.cs index 0f6dd4d9..f76e08b3 100644 --- a/src/OpenBanking.Library.Connector.GenericHost/HostedServices/StartupTasksHostedService.cs +++ b/src/OpenBanking.Library.Connector.GenericHost/HostedServices/StartupTasksHostedService.cs @@ -70,7 +70,7 @@ public StartupTasksHostedService( { _bankProfileService = bankProfileService ?? throw new ArgumentNullException(nameof(bankProfileService)); _configurationRoot = - (IConfigurationRoot) (configuration ?? throw new ArgumentNullException(nameof(configuration))); + (IConfigurationRoot)(configuration ?? throw new ArgumentNullException(nameof(configuration))); _databaseSettingsProvider = databaseSettingsProvider ?? throw new ArgumentNullException(nameof(databaseSettingsProvider)); _settingsService = settingsService ?? throw new ArgumentNullException(nameof(settingsService)); @@ -101,25 +101,6 @@ public async Task StartAsync(CancellationToken cancellationToken) // Database startup tasks switch (databaseSettings.Provider) { - case DbProvider.Sqlite: - var sqliteDbContext = scope.ServiceProvider.GetRequiredService(); - bool sqliteDbExists = - sqliteDbContext.Database.GetService().Exists(); - if (!sqliteDbExists) - { - if (databaseSettings.EnsureDatabaseCreated) - { - // Create database - sqliteDbContext.Database.EnsureCreated(); - } - else - { - throw new ApplicationException( - "No database found. Note: set \"Database:EnsureDatabaseCreated\" to \"true\" to create database at application start-up."); - } - } - - break; case DbProvider.PostgreSql: var postgreSqlDbContext = scope.ServiceProvider.GetRequiredService(); bool postgreSqlExists = diff --git a/src/OpenBanking.Library.Connector.GenericHost/OpenBanking.Library.Connector.GenericHost.csproj b/src/OpenBanking.Library.Connector.GenericHost/OpenBanking.Library.Connector.GenericHost.csproj index eb80fb52..bad838a0 100644 --- a/src/OpenBanking.Library.Connector.GenericHost/OpenBanking.Library.Connector.GenericHost.csproj +++ b/src/OpenBanking.Library.Connector.GenericHost/OpenBanking.Library.Connector.GenericHost.csproj @@ -1,7 +1,7 @@  - net9.0 + net10.0 enable enable FinnovationLabs.OpenBanking.Library.Connector.GenericHost @@ -23,20 +23,20 @@ - - - - - - - - - - - - + + + + + + + + + + + + - + diff --git a/src/OpenBanking.Library.Connector.Web/OpenBanking.Library.Connector.Web.csproj b/src/OpenBanking.Library.Connector.Web/OpenBanking.Library.Connector.Web.csproj index 26cf0482..7779b8ad 100644 --- a/src/OpenBanking.Library.Connector.Web/OpenBanking.Library.Connector.Web.csproj +++ b/src/OpenBanking.Library.Connector.Web/OpenBanking.Library.Connector.Web.csproj @@ -1,7 +1,7 @@  - net9.0 + net10.0 enable enable FinnovationLabs.OpenBanking.Library.Connector.Web diff --git a/src/OpenBanking.Library.Connector/BankProfiles/Generators/HsbcGenerator.cs b/src/OpenBanking.Library.Connector/BankProfiles/Generators/HsbcGenerator.cs index 0b57991d..856fe8bd 100644 --- a/src/OpenBanking.Library.Connector/BankProfiles/Generators/HsbcGenerator.cs +++ b/src/OpenBanking.Library.Connector/BankProfiles/Generators/HsbcGenerator.cs @@ -123,7 +123,7 @@ bank is not HsbcBank.MAndS DomesticPayment = new DomesticPaymentCustomBehaviour { PreferMisspeltContractPresentIndicator = true }, DomesticVrpConsentAuthCodeGrantPost = - new AuthCodeGrantPostCustomBehaviour { ExpectedResponseRefreshTokenMayBeAbsent = true }, + new AuthCodeGrantPostCustomBehaviour(), DomesticVrpConsent = new DomesticVrpConsentCustomBehaviour { PreferMisspeltContractPresentIndicator = true }, DomesticVrp = new DomesticVrpCustomBehaviour diff --git a/src/OpenBanking.Library.Connector/BankProfiles/Generators/NatWestGenerator.cs b/src/OpenBanking.Library.Connector/BankProfiles/Generators/NatWestGenerator.cs index 56618c14..ea3fc1e7 100644 --- a/src/OpenBanking.Library.Connector/BankProfiles/Generators/NatWestGenerator.cs +++ b/src/OpenBanking.Library.Connector/BankProfiles/Generators/NatWestGenerator.cs @@ -198,34 +198,34 @@ bank is NatWestBank.NatWestSandbox or NatWestBank.RoyalBankOfScotlandSandbox new IdTokenProcessingCustomBehaviour { IssClaim = GetAudClaim(bank) } }, AccountAccessConsentPost = bank is NatWestBank.Coutts - ? new ReadWritePostCustomBehaviour { ResponseLinksMayAddSlash = true } + ? new ReadWritePostCustomBehaviour { ResponseLinksMayHaveIncorrectUrlBeforeQuery = true } : null, AccountAccessConsentGet = bank is NatWestBank.Coutts - ? new ReadWriteGetCustomBehaviour { ResponseLinksMayAddSlash = true } + ? new ReadWriteGetCustomBehaviour { ResponseLinksMayHaveIncorrectUrlBeforeQuery = true } : null, AccountGet = bank is NatWestBank.Coutts - ? new ReadWriteGetCustomBehaviour { ResponseLinksMayAddSlash = true } + ? new ReadWriteGetCustomBehaviour { ResponseLinksMayHaveIncorrectUrlBeforeQuery = true } : null, BalanceGet = bank is NatWestBank.Coutts - ? new ReadWriteGetCustomBehaviour { ResponseLinksMayAddSlash = true } + ? new ReadWriteGetCustomBehaviour { ResponseLinksMayHaveIncorrectUrlBeforeQuery = true } : null, DirectDebitGet = bank is NatWestBank.Coutts - ? new DirectDebitGetCustomBehaviour { ResponseLinksMayAddSlash = true } + ? new DirectDebitGetCustomBehaviour { ResponseLinksMayHaveIncorrectUrlBeforeQuery = true } : null, MonzoPotGet = bank is NatWestBank.Coutts - ? new ReadWriteGetCustomBehaviour { ResponseLinksMayAddSlash = true } + ? new ReadWriteGetCustomBehaviour { ResponseLinksMayHaveIncorrectUrlBeforeQuery = true } : null, Party2Get = bank is NatWestBank.Coutts - ? new ReadWriteGetCustomBehaviour { ResponseLinksMayAddSlash = true } + ? new ReadWriteGetCustomBehaviour { ResponseLinksMayHaveIncorrectUrlBeforeQuery = true } : null, PartyGet = bank is NatWestBank.Coutts - ? new ReadWriteGetCustomBehaviour { ResponseLinksMayAddSlash = true } + ? new ReadWriteGetCustomBehaviour { ResponseLinksMayHaveIncorrectUrlBeforeQuery = true } : null, StandingOrderGet = bank is NatWestBank.Coutts - ? new ReadWriteGetCustomBehaviour { ResponseLinksMayAddSlash = true } + ? new ReadWriteGetCustomBehaviour { ResponseLinksMayHaveIncorrectUrlBeforeQuery = true } : null, TransactionGet = bank is NatWestBank.Coutts - ? new ReadWriteGetCustomBehaviour { ResponseLinksMayAddSlash = true } + ? new ReadWriteGetCustomBehaviour { ResponseLinksMayHaveIncorrectUrlBeforeQuery = true } : null, DomesticPaymentConsentAuthGet = new ConsentAuthGetCustomBehaviour { @@ -312,6 +312,10 @@ bank is NatWestBank.NatWestSandbox or NatWestBank.RoyalBankOfScotlandSandbox }, DomesticVrp = new DomesticVrpCustomBehaviour { + RefundResponseJsonConverter = + bank is NatWestBank.NatWestSandbox or NatWestBank.RoyalBankOfScotlandSandbox + ? DomesticVrpRefundConverterOptions.ContainsNestedAccountProperty + : null, PreferMisspeltContractPresentIndicator = true, ResponseDataStatusMayBeMissingOrWrong = bank is NatWestBank.NatWestSandbox or NatWestBank.RoyalBankOfScotlandSandbox, diff --git a/src/OpenBanking.Library.Connector/BankProfiles/Generators/TideGenerator.cs b/src/OpenBanking.Library.Connector/BankProfiles/Generators/TideGenerator.cs index f756cf1b..da2070bb 100644 --- a/src/OpenBanking.Library.Connector/BankProfiles/Generators/TideGenerator.cs +++ b/src/OpenBanking.Library.Connector/BankProfiles/Generators/TideGenerator.cs @@ -66,6 +66,11 @@ public override BankProfile GetBankProfile( UseReadRefundAccount = false, PreferPartyToPartyPaymentContextCode = true, UseContractPresentIndicator = false + }, + BankConfigurationApiSettings = new BankConfigurationApiSettings + { + UseRegistrationGetEndpoint = true, + UseRegistrationDeleteEndpoint = true } }; diff --git a/src/OpenBanking.Library.Connector/Models/Configuration/DatabaseSettings.cs b/src/OpenBanking.Library.Connector/Models/Configuration/DatabaseSettings.cs index de41921d..53dbd946 100644 --- a/src/OpenBanking.Library.Connector/Models/Configuration/DatabaseSettings.cs +++ b/src/OpenBanking.Library.Connector/Models/Configuration/DatabaseSettings.cs @@ -28,7 +28,6 @@ public class DatabaseSettings : ISettings public Dictionary ConnectionStrings { get; set; } = new() { - [DbProvider.Sqlite] = string.Empty, [DbProvider.PostgreSql] = string.Empty, [DbProvider.MongoDb] = string.Empty }; @@ -39,7 +38,6 @@ public class DatabaseSettings : ISettings public Dictionary Names { get; set; } = new() { - [DbProvider.Sqlite] = string.Empty, [DbProvider.PostgreSql] = string.Empty, [DbProvider.MongoDb] = string.Empty }; @@ -47,7 +45,6 @@ public class DatabaseSettings : ISettings public Dictionary PasswordSources { get; set; } = new() { - [DbProvider.Sqlite] = SecretSource.Configuration, [DbProvider.PostgreSql] = SecretSource.Configuration, [DbProvider.MongoDb] = SecretSource.Configuration }; diff --git a/src/OpenBanking.Library.Connector/Models/Persistent/Configuration/Management/BankRegistration.cs b/src/OpenBanking.Library.Connector/Models/Persistent/Configuration/Management/BankRegistration.cs index fe6621a5..6c18e13b 100644 --- a/src/OpenBanking.Library.Connector/Models/Persistent/Configuration/Management/BankRegistration.cs +++ b/src/OpenBanking.Library.Connector/Models/Persistent/Configuration/Management/BankRegistration.cs @@ -86,11 +86,6 @@ public override void Configure(EntityTypeBuilder builder builder.Property(e => e.RedirectUris).HasColumnType("jsonb"); } - if (_dbProvider is DbProvider.Sqlite) - { - builder.Property(e => e.Created).HasConversion(new DateTimeOffsetToBinaryConverter()); - } - // Only set up relationships (foreign keys and navigations) if not MongoDB if (_dbProvider is not DbProvider.MongoDb) { diff --git a/src/OpenBanking.Library.Connector/OpenBanking.Library.Connector.csproj b/src/OpenBanking.Library.Connector/OpenBanking.Library.Connector.csproj index 2d208fa9..687b5aac 100644 --- a/src/OpenBanking.Library.Connector/OpenBanking.Library.Connector.csproj +++ b/src/OpenBanking.Library.Connector/OpenBanking.Library.Connector.csproj @@ -1,7 +1,7 @@  - net9.0 + net10.0 enable enable FinnovationLabs.OpenBanking.Library.Connector @@ -23,17 +23,16 @@ - + - - - + + - + diff --git a/src/OpenBanking.Library.Connector/Persistence/DbProvider.cs b/src/OpenBanking.Library.Connector/Persistence/DbProvider.cs index 402ff17c..19ef20cb 100644 --- a/src/OpenBanking.Library.Connector/Persistence/DbProvider.cs +++ b/src/OpenBanking.Library.Connector/Persistence/DbProvider.cs @@ -6,7 +6,6 @@ namespace FinnovationLabs.OpenBanking.Library.Connector.Persistence; public enum DbProvider { - Sqlite, PostgreSql, MongoDb } diff --git a/src/OpenBanking.Library.Connector/Persistence/SqliteDbContext.cs b/src/OpenBanking.Library.Connector/Persistence/SqliteDbContext.cs deleted file mode 100644 index 0fb64f2d..00000000 --- a/src/OpenBanking.Library.Connector/Persistence/SqliteDbContext.cs +++ /dev/null @@ -1,16 +0,0 @@ -// Licensed to Finnovation Labs Limited under one or more agreements. -// Finnovation Labs Limited licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using Microsoft.EntityFrameworkCore; -using Newtonsoft.Json; - -namespace FinnovationLabs.OpenBanking.Library.Connector.Persistence; - -/// -/// SQLite DB context. -/// Specifies JSON indenting to aid visualisation (SQLite context mainly used for debug). -/// -/// -public class SqliteDbContext(DbContextOptions options) - : BaseDbContext(options, DbProvider.Sqlite, true, Formatting.Indented) { } diff --git a/src/OpenBanking.Library.Connector/Services/DbConnectionString.cs b/src/OpenBanking.Library.Connector/Services/DbConnectionString.cs index 7ad052f3..47c100db 100644 --- a/src/OpenBanking.Library.Connector/Services/DbConnectionString.cs +++ b/src/OpenBanking.Library.Connector/Services/DbConnectionString.cs @@ -56,7 +56,6 @@ public DbConnectionString(DatabaseSettings settings, ISecretProvider secretProvi return settings.Provider switch { - DbProvider.Sqlite => connectionString, DbProvider.PostgreSql => connectionString + (password is not null ? $";Password={password}" : ""), DbProvider.MongoDb => AddMongoDbPassword(connectionString, password), _ => throw new ArgumentOutOfRangeException(nameof(settings.Provider), settings.Provider, null) diff --git a/src/OpenBanking.WebApp.Connector/Dockerfile b/src/OpenBanking.WebApp.Connector/Dockerfile index fd70c5d8..dcf9adc9 100644 --- a/src/OpenBanking.WebApp.Connector/Dockerfile +++ b/src/OpenBanking.WebApp.Connector/Dockerfile @@ -1,5 +1,6 @@ -FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:9.0 AS build +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:10.0 AS build ARG TARGETARCH +ENV DOTNET_CLI_TELEMETRY_OPTOUT=1 # Restore Open Banking Connector WORKDIR /src @@ -14,7 +15,7 @@ RUN dotnet restore -a $TARGETARCH "OpenBanking.WebApp.Connector/OpenBanking.WebA COPY src/. ./ RUN dotnet publish -a $TARGETARCH "OpenBanking.WebApp.Connector/OpenBanking.WebApp.Connector.csproj" -c Release --no-restore -o /app/publish -FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS final +FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS final # Get UK Open Banking sandbox and prod root/issuing CA certs WORKDIR /app/certs diff --git a/src/OpenBanking.WebApp.Connector/OpenBanking.WebApp.Connector.csproj b/src/OpenBanking.WebApp.Connector/OpenBanking.WebApp.Connector.csproj index 51340272..af659959 100644 --- a/src/OpenBanking.WebApp.Connector/OpenBanking.WebApp.Connector.csproj +++ b/src/OpenBanking.WebApp.Connector/OpenBanking.WebApp.Connector.csproj @@ -1,13 +1,13 @@  - net9.0 + net10.0 enable enable aa921213-9461-4f9e-8fec-153624ec67ad FinnovationLabs.OpenBanking.WebApp.Connector FinnovationLabs.OpenBanking.WebApp.Connector - 20.0.0 + 21.0.0 Finnovation Labs Limited and Contributors Finnovation Labs Limited false @@ -16,14 +16,14 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + diff --git a/src/OpenBanking.WebApp.Connector/appsettings.Development.json b/src/OpenBanking.WebApp.Connector/appsettings.Development.json index 76e4bb07..2653eaba 100644 --- a/src/OpenBanking.WebApp.Connector/appsettings.Development.json +++ b/src/OpenBanking.WebApp.Connector/appsettings.Development.json @@ -11,7 +11,6 @@ "OpenBankingConnector": { "Database": { "ConnectionStrings": { - "Sqlite": "Data Source=./sqliteTestDb.db", "PostgreSql": "Host=localhost;Database=test;Username=postgres", "MongoDb": "mongodb://localhost:27017" } diff --git a/test/OpenBanking.Library.Connector.BankTests/OpenBanking.Library.Connector.BankTests.csproj b/test/OpenBanking.Library.Connector.BankTests/OpenBanking.Library.Connector.BankTests.csproj index 1ae9f180..48500646 100644 --- a/test/OpenBanking.Library.Connector.BankTests/OpenBanking.Library.Connector.BankTests.csproj +++ b/test/OpenBanking.Library.Connector.BankTests/OpenBanking.Library.Connector.BankTests.csproj @@ -1,7 +1,7 @@ - + - net9.0 + net10.0 enable enable aa921213-9461-4f9e-8fec-153624ec67ad @@ -16,11 +16,10 @@ - - - - - + + + + diff --git a/test/OpenBanking.Library.Connector.BankTests/appsettings.Development.json b/test/OpenBanking.Library.Connector.BankTests/appsettings.Development.json index c15087a9..2653eaba 100644 --- a/test/OpenBanking.Library.Connector.BankTests/appsettings.Development.json +++ b/test/OpenBanking.Library.Connector.BankTests/appsettings.Development.json @@ -11,7 +11,6 @@ "OpenBankingConnector": { "Database": { "ConnectionStrings": { - "Sqlite": "Data Source=../../../sqliteTestDb.db", "PostgreSql": "Host=localhost;Database=test;Username=postgres", "MongoDb": "mongodb://localhost:27017" } diff --git a/test/OpenBanking.Library.Connector.Benchmarks/OpenBanking.Library.Connector.Benchmarks.csproj b/test/OpenBanking.Library.Connector.Benchmarks/OpenBanking.Library.Connector.Benchmarks.csproj index daf40311..68c0f202 100644 --- a/test/OpenBanking.Library.Connector.Benchmarks/OpenBanking.Library.Connector.Benchmarks.csproj +++ b/test/OpenBanking.Library.Connector.Benchmarks/OpenBanking.Library.Connector.Benchmarks.csproj @@ -2,7 +2,7 @@ Exe - net9.0 + net10.0 enable enable FinnovationLabs.OpenBanking.Library.Connector.Benchmarks diff --git a/test/OpenBanking.Library.Connector.IntegrationTests/DbTest.cs b/test/OpenBanking.Library.Connector.IntegrationTests/DbTest.cs index 89d225be..16c7d297 100644 --- a/test/OpenBanking.Library.Connector.IntegrationTests/DbTest.cs +++ b/test/OpenBanking.Library.Connector.IntegrationTests/DbTest.cs @@ -3,30 +3,27 @@ // See the LICENSE file in the project root for more information. using FinnovationLabs.OpenBanking.Library.Connector.Persistence; -using Microsoft.Data.Sqlite; using Microsoft.EntityFrameworkCore; namespace FinnovationLabs.OpenBanking.Library.Connector.IntegrationTests; -// Makes available in-memory SQLite database +// Makes available in-memory EF Core database public abstract class DbTest : IDisposable { - protected readonly SqliteDbContext _dB; - private readonly SqliteConnection _dBConnection; + protected readonly BaseDbContext _dB; protected DbTest() { - _dBConnection = new SqliteConnection("DataSource=:memory:"); - _dBConnection.Open(); // Creates DB - DbContextOptions dbContextOptions = new DbContextOptionsBuilder() - .UseSqlite(_dBConnection) - .Options; - _dB = new SqliteDbContext(dbContextOptions); + DbContextOptions dbContextOptions = + new DbContextOptionsBuilder() + .UseInMemoryDatabase(Guid.NewGuid().ToString()) + .Options; + _dB = new PostgreSqlDbContext(dbContextOptions); _dB.Database.EnsureCreated(); // Initialise DB with schema } public void Dispose() { - _dBConnection.Close(); // Deletes DB + _dB.Dispose(); } } diff --git a/test/OpenBanking.Library.Connector.IntegrationTests/OpenBanking.Library.Connector.IntegrationTests.csproj b/test/OpenBanking.Library.Connector.IntegrationTests/OpenBanking.Library.Connector.IntegrationTests.csproj index 65cfe189..3010b14f 100644 --- a/test/OpenBanking.Library.Connector.IntegrationTests/OpenBanking.Library.Connector.IntegrationTests.csproj +++ b/test/OpenBanking.Library.Connector.IntegrationTests/OpenBanking.Library.Connector.IntegrationTests.csproj @@ -1,7 +1,7 @@  - net9.0 + net10.0 enable enable FinnovationLabs.OpenBanking.Library.Connector.IntegrationTests @@ -14,8 +14,9 @@ - - + + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/test/OpenBanking.Library.Connector.IntegrationTests/Persistence/DomesticConsentRepoTests.cs b/test/OpenBanking.Library.Connector.IntegrationTests/Persistence/DomesticConsentRepoTests.cs deleted file mode 100644 index 6831b7dd..00000000 --- a/test/OpenBanking.Library.Connector.IntegrationTests/Persistence/DomesticConsentRepoTests.cs +++ /dev/null @@ -1,147 +0,0 @@ -// Licensed to Finnovation Labs Limited under one or more agreements. -// Finnovation Labs Limited licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using FinnovationLabs.OpenBanking.Library.Connector.Models.Persistent.PaymentInitiation; -using FinnovationLabs.OpenBanking.Library.Connector.Persistence; -using Xunit; - -namespace FinnovationLabs.OpenBanking.Library.Connector.IntegrationTests.Persistence; - -public class DomesticConsentRepoTests : DbTest -{ - private readonly IDbMethods _dbSaveChangesMethod; - private readonly ITestOutputHelper _output; - private readonly IDbEntityMethods _repo; - - public DomesticConsentRepoTests(ITestOutputHelper output) - { - _repo = new DbEntityMethods(_dB); - _dbSaveChangesMethod = new DbMethods(_dB); - _output = output; - } - - // [Theory] - // [InlineData(1)] - // [InlineData(3)] - // [InlineData(5)] - // [InlineData(11)] - // [InlineData(15)] - // public async Task GetAsync_ByExpression_GetByUniqueProperty(int count) - // { - // var latestGuid = Guid.NewGuid(); - // List items = Enumerable.Range(1, count) - // .Select( - // i => - // { - // latestGuid = Guid.NewGuid(); - // return new DomesticPaymentConsent - // { - // BankApiInformationId = Guid.NewGuid(), - // BankApiRequest = new PaymentInitiationModelsPublic.OBWriteDomesticConsent4(), - // BankApiResponse = - // new ReadWriteProperty( - // new PaymentInitiationModelsPublic.OBWriteDomesticConsentResponse5(), - // new TimeProvider(), - // ""), - // //Id = i.ToString() - // Id = latestGuid - // }; - // }).ToList(); - // foreach (var dc in items) - // { - // await _repo.AddAsync(dc); - // } - // - // _dbSaveChangesMethod.SaveChangesAsync().Wait(); - // - // IQueryable q = await _repo.GetNoTrackingAsync(x => x.Id == latestGuid); - // - // List results = q.ToList(); - // - // results.Should().HaveCount(1); - // results[0].Should().Be(items.Last()); - // } - // - // [Theory] - // [InlineData(1)] - // [InlineData(3)] - // [InlineData(5)] - // [InlineData(11)] - // [InlineData(15)] - // public async Task GetAsync_ByExpression_GetByAll(int count) - // { - // var latestGuid = Guid.NewGuid(); - // List items = Enumerable.Range(1, count) - // .Select( - // i => - // { - // latestGuid = Guid.NewGuid(); - // return new DomesticPaymentConsent - // { - // BankApiInformationId = Guid.NewGuid(), - // BankApiRequest = new PaymentInitiationModelsPublic.OBWriteDomesticConsent4(), - // BankApiResponse = - // new ReadWriteProperty( - // new PaymentInitiationModelsPublic.OBWriteDomesticConsentResponse5(), - // new TimeProvider(), - // ""), - // //Id = i.ToString() - // Id = latestGuid - // }; - // }).ToList(); - // foreach (var dc in items) - // { - // await _repo.AddAsync(dc); - // } - // - // _dbSaveChangesMethod.SaveChangesAsync().Wait(); - // - // IQueryable q = await _repo.GetNoTrackingAsync(x => true); - // - // List results = q.ToList(); - // - // results.Should().BeEquivalentTo(items); - // } - // - // [Theory] - // [InlineData(1)] - // [InlineData(3)] - // [InlineData(5)] - // [InlineData(11)] - // [InlineData(15)] - // public async Task GetAsync_ByExpression_GetEmptySetByUniqueProperty(int count) - // { - // var latestGuid = Guid.NewGuid(); - // List items = Enumerable.Range(1, count) - // .Select( - // i => - // { - // latestGuid = Guid.NewGuid(); - // return new DomesticPaymentConsent - // { - // BankApiInformationId = Guid.NewGuid(), - // BankApiRequest = new PaymentInitiationModelsPublic.OBWriteDomesticConsent4(), - // BankApiResponse = - // new ReadWriteProperty( - // new PaymentInitiationModelsPublic.OBWriteDomesticConsentResponse5(), - // new TimeProvider(), - // ""), - // //Id = (-i).ToString() - // Id = latestGuid - // }; - // }).ToList(); - // foreach (var dc in items) - // { - // await _repo.AddAsync(dc); - // } - // - // _dbSaveChangesMethod.SaveChangesAsync().Wait(); - // - // IQueryable q = await _repo.GetNoTrackingAsync(x => x.Id == latestGuid); - // - // List results = q.ToList(); - // - // results.Should().HaveCount(0); - // } -} diff --git a/test/OpenBanking.Library.Connector.UnitTests/OpenBanking.Library.Connector.UnitTests.csproj b/test/OpenBanking.Library.Connector.UnitTests/OpenBanking.Library.Connector.UnitTests.csproj index d4a9604a..0af976fc 100644 --- a/test/OpenBanking.Library.Connector.UnitTests/OpenBanking.Library.Connector.UnitTests.csproj +++ b/test/OpenBanking.Library.Connector.UnitTests/OpenBanking.Library.Connector.UnitTests.csproj @@ -1,7 +1,7 @@  - net9.0 + net10.0 enable enable FinnovationLabs.OpenBanking.Library.Connector.UnitTests @@ -14,8 +14,8 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive