Skip to content

Commit c14fc10

Browse files
authored
Refactored order cancellation workflow + improved security scheme for endpoints (#60)
* Added M2MAccess role * Improved ApplicationLogicException with exception object * Redefined roles and policies * Refactored logic for order cancellation / compensation events * Updated apigateway Kiota clients
1 parent a30a394 commit c14fc10

File tree

76 files changed

+797
-428
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

76 files changed

+797
-428
lines changed
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
namespace EcommerceDDD.Core.Infrastructure.Identity;
22

33
public class Policies
4-
{
5-
public const string M2MAccess = "M2MAccess"; // Machine to Machine
4+
{
65
public const string CanRead = "CanRead";
76
public const string CanWrite = "CanWrite";
87
public const string CanDelete = "CanDelete";
@@ -11,4 +10,5 @@ public class Policies
1110
public class Roles
1211
{
1312
public const string Customer = "Customer";
13+
public const string M2MAccess = "M2MAccess"; // Machine to Machine
1414
}

src/Core/EcommerceDDD.Core.Infrastructure/Identity/TokenRequester.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public class TokenRequester(
1313
private readonly IMemoryCache _cache = cache;
1414
private readonly IHttpContextAccessor _contextAccessor = httpContextAccessor;
1515

16-
private const string _applicationKey = "ApplicationToken";
16+
private const string _applicationKey = "application_token";
1717
private const string _userAccessTokenKey = "access_token";
1818

1919
// Caching application token
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
namespace EcommerceDDD.Core.Exceptions.Types;
22

3-
public class ApplicationLogicException(string message) : Exception(message) { }
3+
public class ApplicationLogicException(string message, Exception? exception = null) : Exception(message, exception) { }

src/Crosscutting/EcommerceDDD.IdentityServer/Configurations/IdentityConfiguration.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,8 @@ public class IdentityConfiguration
8181
ClientId = "ecommerceddd.application_client",
8282
AllowedGrantTypes = GrantTypes.ClientCredentials,
8383
RequireClientSecret = true,
84+
AlwaysSendClientClaims = true,
85+
ClientClaimsPrefix = string.Empty,
8486
ClientSecrets = new List<Secret>
8587
{
8688
new Secret("secret33587^&%&^%&^f3%%%".Sha256())
@@ -92,7 +94,11 @@ public class IdentityConfiguration
9294
_writeScope,
9395
_deleteScope
9496
},
95-
AccessTokenLifetime = 86400
97+
AccessTokenLifetime = 86400,
98+
Claims = new List<ClientClaim>
99+
{
100+
new ClientClaim(JwtClaimTypes.Role, Roles.M2MAccess)
101+
}
96102
}
97103
};
98104
}

src/Crosscutting/EcommerceDDD.ServiceClients/Kiota/Api/Inventory/InventoryRequestBuilder.cs

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
// <auto-generated/>
22
#pragma warning disable CS0618
33
using EcommerceDDD.ServiceClients.ApiGateway.Api.Inventory.CheckStockQuantity;
4-
using EcommerceDDD.ServiceClients.ApiGateway.Api.Inventory.DecreaseStockQuantity;
5-
using EcommerceDDD.ServiceClients.ApiGateway.Api.Inventory.IncreaseStockQuantity;
64
using EcommerceDDD.ServiceClients.ApiGateway.Api.Inventory.Item;
75
using Microsoft.Kiota.Abstractions.Extensions;
86
using Microsoft.Kiota.Abstractions;
@@ -23,16 +21,6 @@ public partial class InventoryRequestBuilder : BaseRequestBuilder
2321
{
2422
get => new global::EcommerceDDD.ServiceClients.ApiGateway.Api.Inventory.CheckStockQuantity.CheckStockQuantityRequestBuilder(PathParameters, RequestAdapter);
2523
}
26-
/// <summary>The decreaseStockQuantity property</summary>
27-
public global::EcommerceDDD.ServiceClients.ApiGateway.Api.Inventory.DecreaseStockQuantity.DecreaseStockQuantityRequestBuilder DecreaseStockQuantity
28-
{
29-
get => new global::EcommerceDDD.ServiceClients.ApiGateway.Api.Inventory.DecreaseStockQuantity.DecreaseStockQuantityRequestBuilder(PathParameters, RequestAdapter);
30-
}
31-
/// <summary>The increaseStockQuantity property</summary>
32-
public global::EcommerceDDD.ServiceClients.ApiGateway.Api.Inventory.IncreaseStockQuantity.IncreaseStockQuantityRequestBuilder IncreaseStockQuantity
33-
{
34-
get => new global::EcommerceDDD.ServiceClients.ApiGateway.Api.Inventory.IncreaseStockQuantity.IncreaseStockQuantityRequestBuilder(PathParameters, RequestAdapter);
35-
}
3624
/// <summary>Gets an item from the EcommerceDDD.ServiceClients.ApiGateway.api.inventory.item collection</summary>
3725
/// <param name="position">Unique identifier of the item</param>
3826
/// <returns>A <see cref="global::EcommerceDDD.ServiceClients.ApiGateway.Api.Inventory.Item.WithProductItemRequestBuilder"/></returns>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
// <auto-generated/>
2+
#pragma warning disable CS0618
3+
using EcommerceDDD.ServiceClients.ApiGateway.Models;
4+
using Microsoft.Kiota.Abstractions.Extensions;
5+
using Microsoft.Kiota.Abstractions.Serialization;
6+
using Microsoft.Kiota.Abstractions;
7+
using System.Collections.Generic;
8+
using System.IO;
9+
using System.Threading.Tasks;
10+
using System.Threading;
11+
using System;
12+
namespace EcommerceDDD.ServiceClients.ApiGateway.Api.Inventory.Item.DecreaseStockQuantity
13+
{
14+
/// <summary>
15+
/// Builds and executes requests for operations under \api\inventory\{productId}\decrease-stock-quantity
16+
/// </summary>
17+
[global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
18+
public partial class DecreaseStockQuantityRequestBuilder : BaseRequestBuilder
19+
{
20+
/// <summary>
21+
/// Instantiates a new <see cref="global::EcommerceDDD.ServiceClients.ApiGateway.Api.Inventory.Item.DecreaseStockQuantity.DecreaseStockQuantityRequestBuilder"/> and sets the default values.
22+
/// </summary>
23+
/// <param name="pathParameters">Path parameters for the request</param>
24+
/// <param name="requestAdapter">The request adapter to use to execute the requests.</param>
25+
public DecreaseStockQuantityRequestBuilder(Dictionary<string, object> pathParameters, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api/inventory/{productId}/decrease-stock-quantity", pathParameters)
26+
{
27+
}
28+
/// <summary>
29+
/// Instantiates a new <see cref="global::EcommerceDDD.ServiceClients.ApiGateway.Api.Inventory.Item.DecreaseStockQuantity.DecreaseStockQuantityRequestBuilder"/> and sets the default values.
30+
/// </summary>
31+
/// <param name="rawUrl">The raw URL to use for the request builder.</param>
32+
/// <param name="requestAdapter">The request adapter to use to execute the requests.</param>
33+
public DecreaseStockQuantityRequestBuilder(string rawUrl, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api/inventory/{productId}/decrease-stock-quantity", rawUrl)
34+
{
35+
}
36+
/// <returns>A <see cref="string"/></returns>
37+
/// <param name="body">The request body</param>
38+
/// <param name="cancellationToken">Cancellation token to use when cancelling requests</param>
39+
/// <param name="requestConfiguration">Configuration for the request such as headers, query parameters, and middleware options.</param>
40+
/// <exception cref="global::EcommerceDDD.ServiceClients.ApiGateway.Models.ProblemDetails">When receiving a 400 status code</exception>
41+
#if NETSTANDARD2_1_OR_GREATER || NETCOREAPP3_1_OR_GREATER
42+
#nullable enable
43+
public async Task<string?> PutAsync(global::EcommerceDDD.ServiceClients.ApiGateway.Models.DecreaseQuantityInStockRequest body, Action<RequestConfiguration<DefaultQueryParameters>>? requestConfiguration = default, CancellationToken cancellationToken = default)
44+
{
45+
#nullable restore
46+
#else
47+
public async Task<string> PutAsync(global::EcommerceDDD.ServiceClients.ApiGateway.Models.DecreaseQuantityInStockRequest body, Action<RequestConfiguration<DefaultQueryParameters>> requestConfiguration = default, CancellationToken cancellationToken = default)
48+
{
49+
#endif
50+
_ = body ?? throw new ArgumentNullException(nameof(body));
51+
var requestInfo = ToPutRequestInformation(body, requestConfiguration);
52+
var errorMapping = new Dictionary<string, ParsableFactory<IParsable>>
53+
{
54+
{ "400", global::EcommerceDDD.ServiceClients.ApiGateway.Models.ProblemDetails.CreateFromDiscriminatorValue },
55+
};
56+
return await RequestAdapter.SendPrimitiveAsync<string>(requestInfo, errorMapping, cancellationToken).ConfigureAwait(false);
57+
}
58+
/// <returns>A <see cref="RequestInformation"/></returns>
59+
/// <param name="body">The request body</param>
60+
/// <param name="requestConfiguration">Configuration for the request such as headers, query parameters, and middleware options.</param>
61+
#if NETSTANDARD2_1_OR_GREATER || NETCOREAPP3_1_OR_GREATER
62+
#nullable enable
63+
public RequestInformation ToPutRequestInformation(global::EcommerceDDD.ServiceClients.ApiGateway.Models.DecreaseQuantityInStockRequest body, Action<RequestConfiguration<DefaultQueryParameters>>? requestConfiguration = default)
64+
{
65+
#nullable restore
66+
#else
67+
public RequestInformation ToPutRequestInformation(global::EcommerceDDD.ServiceClients.ApiGateway.Models.DecreaseQuantityInStockRequest body, Action<RequestConfiguration<DefaultQueryParameters>> requestConfiguration = default)
68+
{
69+
#endif
70+
_ = body ?? throw new ArgumentNullException(nameof(body));
71+
var requestInfo = new RequestInformation(Method.PUT, UrlTemplate, PathParameters);
72+
requestInfo.Configure(requestConfiguration);
73+
requestInfo.Headers.TryAdd("Accept", "application/json, text/plain;q=0.9");
74+
requestInfo.SetContentFromParsable(RequestAdapter, "application/json", body);
75+
return requestInfo;
76+
}
77+
/// <summary>
78+
/// Returns a request builder with the provided arbitrary URL. Using this method means any other path or query parameters are ignored.
79+
/// </summary>
80+
/// <returns>A <see cref="global::EcommerceDDD.ServiceClients.ApiGateway.Api.Inventory.Item.DecreaseStockQuantity.DecreaseStockQuantityRequestBuilder"/></returns>
81+
/// <param name="rawUrl">The raw URL to use for the request builder.</param>
82+
public global::EcommerceDDD.ServiceClients.ApiGateway.Api.Inventory.Item.DecreaseStockQuantity.DecreaseStockQuantityRequestBuilder WithUrl(string rawUrl)
83+
{
84+
return new global::EcommerceDDD.ServiceClients.ApiGateway.Api.Inventory.Item.DecreaseStockQuantity.DecreaseStockQuantityRequestBuilder(rawUrl, RequestAdapter);
85+
}
86+
/// <summary>
87+
/// Configuration for the request such as headers, query parameters, and middleware options.
88+
/// </summary>
89+
[Obsolete("This class is deprecated. Please use the generic RequestConfiguration class generated by the generator.")]
90+
[global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
91+
public partial class DecreaseStockQuantityRequestBuilderPutRequestConfiguration : RequestConfiguration<DefaultQueryParameters>
92+
{
93+
}
94+
}
95+
}
96+
#pragma warning restore CS0618
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
// <auto-generated/>
2+
#pragma warning disable CS0618
3+
using EcommerceDDD.ServiceClients.ApiGateway.Models;
4+
using Microsoft.Kiota.Abstractions.Extensions;
5+
using Microsoft.Kiota.Abstractions.Serialization;
6+
using Microsoft.Kiota.Abstractions;
7+
using System.Collections.Generic;
8+
using System.IO;
9+
using System.Threading.Tasks;
10+
using System.Threading;
11+
using System;
12+
namespace EcommerceDDD.ServiceClients.ApiGateway.Api.Inventory.Item.IncreaseStockQuantity
13+
{
14+
/// <summary>
15+
/// Builds and executes requests for operations under \api\inventory\{productId}\increase-stock-quantity
16+
/// </summary>
17+
[global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
18+
public partial class IncreaseStockQuantityRequestBuilder : BaseRequestBuilder
19+
{
20+
/// <summary>
21+
/// Instantiates a new <see cref="global::EcommerceDDD.ServiceClients.ApiGateway.Api.Inventory.Item.IncreaseStockQuantity.IncreaseStockQuantityRequestBuilder"/> and sets the default values.
22+
/// </summary>
23+
/// <param name="pathParameters">Path parameters for the request</param>
24+
/// <param name="requestAdapter">The request adapter to use to execute the requests.</param>
25+
public IncreaseStockQuantityRequestBuilder(Dictionary<string, object> pathParameters, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api/inventory/{productId}/increase-stock-quantity", pathParameters)
26+
{
27+
}
28+
/// <summary>
29+
/// Instantiates a new <see cref="global::EcommerceDDD.ServiceClients.ApiGateway.Api.Inventory.Item.IncreaseStockQuantity.IncreaseStockQuantityRequestBuilder"/> and sets the default values.
30+
/// </summary>
31+
/// <param name="rawUrl">The raw URL to use for the request builder.</param>
32+
/// <param name="requestAdapter">The request adapter to use to execute the requests.</param>
33+
public IncreaseStockQuantityRequestBuilder(string rawUrl, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api/inventory/{productId}/increase-stock-quantity", rawUrl)
34+
{
35+
}
36+
/// <returns>A <see cref="string"/></returns>
37+
/// <param name="body">The request body</param>
38+
/// <param name="cancellationToken">Cancellation token to use when cancelling requests</param>
39+
/// <param name="requestConfiguration">Configuration for the request such as headers, query parameters, and middleware options.</param>
40+
/// <exception cref="global::EcommerceDDD.ServiceClients.ApiGateway.Models.ProblemDetails">When receiving a 400 status code</exception>
41+
#if NETSTANDARD2_1_OR_GREATER || NETCOREAPP3_1_OR_GREATER
42+
#nullable enable
43+
public async Task<string?> PutAsync(global::EcommerceDDD.ServiceClients.ApiGateway.Models.IncreaseQuantityInStockRequest body, Action<RequestConfiguration<DefaultQueryParameters>>? requestConfiguration = default, CancellationToken cancellationToken = default)
44+
{
45+
#nullable restore
46+
#else
47+
public async Task<string> PutAsync(global::EcommerceDDD.ServiceClients.ApiGateway.Models.IncreaseQuantityInStockRequest body, Action<RequestConfiguration<DefaultQueryParameters>> requestConfiguration = default, CancellationToken cancellationToken = default)
48+
{
49+
#endif
50+
_ = body ?? throw new ArgumentNullException(nameof(body));
51+
var requestInfo = ToPutRequestInformation(body, requestConfiguration);
52+
var errorMapping = new Dictionary<string, ParsableFactory<IParsable>>
53+
{
54+
{ "400", global::EcommerceDDD.ServiceClients.ApiGateway.Models.ProblemDetails.CreateFromDiscriminatorValue },
55+
};
56+
return await RequestAdapter.SendPrimitiveAsync<string>(requestInfo, errorMapping, cancellationToken).ConfigureAwait(false);
57+
}
58+
/// <returns>A <see cref="RequestInformation"/></returns>
59+
/// <param name="body">The request body</param>
60+
/// <param name="requestConfiguration">Configuration for the request such as headers, query parameters, and middleware options.</param>
61+
#if NETSTANDARD2_1_OR_GREATER || NETCOREAPP3_1_OR_GREATER
62+
#nullable enable
63+
public RequestInformation ToPutRequestInformation(global::EcommerceDDD.ServiceClients.ApiGateway.Models.IncreaseQuantityInStockRequest body, Action<RequestConfiguration<DefaultQueryParameters>>? requestConfiguration = default)
64+
{
65+
#nullable restore
66+
#else
67+
public RequestInformation ToPutRequestInformation(global::EcommerceDDD.ServiceClients.ApiGateway.Models.IncreaseQuantityInStockRequest body, Action<RequestConfiguration<DefaultQueryParameters>> requestConfiguration = default)
68+
{
69+
#endif
70+
_ = body ?? throw new ArgumentNullException(nameof(body));
71+
var requestInfo = new RequestInformation(Method.PUT, UrlTemplate, PathParameters);
72+
requestInfo.Configure(requestConfiguration);
73+
requestInfo.Headers.TryAdd("Accept", "application/json, text/plain;q=0.9");
74+
requestInfo.SetContentFromParsable(RequestAdapter, "application/json", body);
75+
return requestInfo;
76+
}
77+
/// <summary>
78+
/// Returns a request builder with the provided arbitrary URL. Using this method means any other path or query parameters are ignored.
79+
/// </summary>
80+
/// <returns>A <see cref="global::EcommerceDDD.ServiceClients.ApiGateway.Api.Inventory.Item.IncreaseStockQuantity.IncreaseStockQuantityRequestBuilder"/></returns>
81+
/// <param name="rawUrl">The raw URL to use for the request builder.</param>
82+
public global::EcommerceDDD.ServiceClients.ApiGateway.Api.Inventory.Item.IncreaseStockQuantity.IncreaseStockQuantityRequestBuilder WithUrl(string rawUrl)
83+
{
84+
return new global::EcommerceDDD.ServiceClients.ApiGateway.Api.Inventory.Item.IncreaseStockQuantity.IncreaseStockQuantityRequestBuilder(rawUrl, RequestAdapter);
85+
}
86+
/// <summary>
87+
/// Configuration for the request such as headers, query parameters, and middleware options.
88+
/// </summary>
89+
[Obsolete("This class is deprecated. Please use the generic RequestConfiguration class generated by the generator.")]
90+
[global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
91+
public partial class IncreaseStockQuantityRequestBuilderPutRequestConfiguration : RequestConfiguration<DefaultQueryParameters>
92+
{
93+
}
94+
}
95+
}
96+
#pragma warning restore CS0618

src/Crosscutting/EcommerceDDD.ServiceClients/Kiota/Api/Inventory/Item/WithProductItemRequestBuilder.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
// <auto-generated/>
22
#pragma warning disable CS0618
3+
using EcommerceDDD.ServiceClients.ApiGateway.Api.Inventory.Item.DecreaseStockQuantity;
34
using EcommerceDDD.ServiceClients.ApiGateway.Api.Inventory.Item.History;
5+
using EcommerceDDD.ServiceClients.ApiGateway.Api.Inventory.Item.IncreaseStockQuantity;
46
using Microsoft.Kiota.Abstractions.Extensions;
57
using Microsoft.Kiota.Abstractions;
68
using System.Collections.Generic;
@@ -15,11 +17,21 @@ namespace EcommerceDDD.ServiceClients.ApiGateway.Api.Inventory.Item
1517
[global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
1618
public partial class WithProductItemRequestBuilder : BaseRequestBuilder
1719
{
20+
/// <summary>The decreaseStockQuantity property</summary>
21+
public global::EcommerceDDD.ServiceClients.ApiGateway.Api.Inventory.Item.DecreaseStockQuantity.DecreaseStockQuantityRequestBuilder DecreaseStockQuantity
22+
{
23+
get => new global::EcommerceDDD.ServiceClients.ApiGateway.Api.Inventory.Item.DecreaseStockQuantity.DecreaseStockQuantityRequestBuilder(PathParameters, RequestAdapter);
24+
}
1825
/// <summary>The history property</summary>
1926
public global::EcommerceDDD.ServiceClients.ApiGateway.Api.Inventory.Item.History.HistoryRequestBuilder History
2027
{
2128
get => new global::EcommerceDDD.ServiceClients.ApiGateway.Api.Inventory.Item.History.HistoryRequestBuilder(PathParameters, RequestAdapter);
2229
}
30+
/// <summary>The increaseStockQuantity property</summary>
31+
public global::EcommerceDDD.ServiceClients.ApiGateway.Api.Inventory.Item.IncreaseStockQuantity.IncreaseStockQuantityRequestBuilder IncreaseStockQuantity
32+
{
33+
get => new global::EcommerceDDD.ServiceClients.ApiGateway.Api.Inventory.Item.IncreaseStockQuantity.IncreaseStockQuantityRequestBuilder(PathParameters, RequestAdapter);
34+
}
2335
/// <summary>
2436
/// Instantiates a new <see cref="global::EcommerceDDD.ServiceClients.ApiGateway.Api.Inventory.Item.WithProductItemRequestBuilder"/> and sets the default values.
2537
/// </summary>

0 commit comments

Comments
 (0)