Skip to content

Commit 0c96ccf

Browse files
this commit introduces the [stability] attribute on api controller endpoints to explicitly indicate their stability level (stable, experimental, or deprecated), helping developers and consumers understand the maturity and support status of the exposed endpoints
1 parent 2c6cb72 commit 0c96ccf

8 files changed

Lines changed: 41 additions & 6 deletions

File tree

Source/Vinder.Federation.WebApi/Controllers/ConnectController.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ namespace Vinder.Federation.WebApi.Controllers;
55
public sealed class ConnectController(IDispatcher dispatcher) : ControllerBase
66
{
77
[HttpPost("token")]
8+
[Stability(Stability.Stable)]
89
public async Task<IActionResult> AuthenticateClientAsync(
910
[FromSnakeCaseForm] ClientAuthenticationCredentials request, CancellationToken cancellation)
1011
{

Source/Vinder.Federation.WebApi/Controllers/GroupsController.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ public sealed class GroupsController(IDispatcher dispatcher) : ControllerBase
77
{
88
[HttpGet]
99
[Authorize(Roles = Permissions.ViewGroups)]
10+
[Stability(Stability.Stable)]
1011
public async Task<IActionResult> GetGroupsAsync(
1112
[FromQuery] GroupsFetchParameters request, CancellationToken cancellation)
1213
{
@@ -22,6 +23,7 @@ public async Task<IActionResult> GetGroupsAsync(
2223

2324
[HttpPost]
2425
[Authorize(Roles = Permissions.CreateGroup)]
26+
[Stability(Stability.Stable)]
2527
public async Task<IActionResult> CreateGroupAsync(GroupCreationScheme request, CancellationToken cancellation)
2628
{
2729
var result = await dispatcher.DispatchAsync(request, cancellation);
@@ -38,6 +40,7 @@ public async Task<IActionResult> CreateGroupAsync(GroupCreationScheme request, C
3840

3941
[HttpPut("{id}")]
4042
[Authorize(Roles = Permissions.EditGroup)]
43+
[Stability(Stability.Stable)]
4144
public async Task<IActionResult> UpdateGroupAsync(string id, GroupUpdateScheme request, CancellationToken cancellation)
4245
{
4346
var result = await dispatcher.DispatchAsync(request with { GroupId = id }, cancellation);
@@ -54,6 +57,7 @@ public async Task<IActionResult> UpdateGroupAsync(string id, GroupUpdateScheme r
5457

5558
[HttpDelete("{id}")]
5659
[Authorize(Roles = Permissions.DeleteGroup)]
60+
[Stability(Stability.Stable)]
5761
public async Task<IActionResult> DeleteGroupAsync(string id, CancellationToken cancellation)
5862
{
5963
var result = await dispatcher.DispatchAsync(new GroupDeletionScheme { GroupId = id }, cancellation);
@@ -70,6 +74,7 @@ public async Task<IActionResult> DeleteGroupAsync(string id, CancellationToken c
7074

7175
[HttpGet("{id}/permissions")]
7276
[Authorize(Roles = Permissions.ViewPermissions)]
77+
[Stability(Stability.Stable)]
7378
public async Task<IActionResult> GetGroupsPermissionsAsync(
7479
[FromRoute] string id,
7580
[FromQuery] ListGroupAssignedPermissionsParameters request, CancellationToken cancellation
@@ -88,6 +93,7 @@ public async Task<IActionResult> GetGroupsPermissionsAsync(
8893

8994
[HttpPost("{id}/permissions")]
9095
[Authorize(Roles = Permissions.AssignPermissions)]
96+
[Stability(Stability.Stable)]
9197
public async Task<IActionResult> AssignPermissionAsync(
9298
string id, AssignGroupPermissionScheme request, CancellationToken cancellation)
9399
{
@@ -111,6 +117,7 @@ public async Task<IActionResult> AssignPermissionAsync(
111117

112118
[HttpDelete("{id}/permissions/{permissionId}")]
113119
[Authorize(Roles = Permissions.RevokePermissions)]
120+
[Stability(Stability.Stable)]
114121
public async Task<IActionResult> RevokePermissionAsync(string id, string permissionId, CancellationToken cancellation)
115122
{
116123
var request = new RevokeGroupPermissionScheme { GroupId = id, PermissionId = permissionId };
@@ -131,4 +138,4 @@ public async Task<IActionResult> RevokePermissionAsync(string id, string permiss
131138
StatusCode(StatusCodes.Status409Conflict, result.Error)
132139
};
133140
}
134-
}
141+
}

Source/Vinder.Federation.WebApi/Controllers/IdentityController.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ public sealed class IdentityController(IDispatcher dispatcher) : ControllerBase
77
[HttpGet("principal")]
88
[Authorize]
99
[TenantRequired]
10+
[Stability(Stability.Stable)]
1011
public async Task<IActionResult> GetPrincipalAsync([FromQuery] InspectPrincipalParameters request, CancellationToken cancellation)
1112
{
1213
var result = await dispatcher.DispatchAsync(request, cancellation);
@@ -23,6 +24,7 @@ public async Task<IActionResult> GetPrincipalAsync([FromQuery] InspectPrincipalP
2324

2425
[HttpPost]
2526
[TenantRequired]
27+
[Stability(Stability.Stable)]
2628
public async Task<IActionResult> EnrollIdentityAsync(IdentityEnrollmentCredentials request, CancellationToken cancellation)
2729
{
2830
var result = await dispatcher.DispatchAsync(request, cancellation);
@@ -39,6 +41,7 @@ public async Task<IActionResult> EnrollIdentityAsync(IdentityEnrollmentCredentia
3941

4042
[HttpPost("authenticate")]
4143
[TenantRequired]
44+
[Stability(Stability.Deprecated)]
4245
public async Task<IActionResult> AuthenticateAsync(AuthenticationCredentials request, CancellationToken cancellation)
4346
{
4447
var result = await dispatcher.DispatchAsync(request, cancellation);
@@ -58,6 +61,7 @@ public async Task<IActionResult> AuthenticateAsync(AuthenticationCredentials req
5861

5962
[HttpPost("refresh-token")]
6063
[TenantRequired]
64+
[Stability(Stability.Stable)]
6165
public async Task<IActionResult> RefreshTokenAsync(SessionTokenRenewalScheme request, CancellationToken cancellation)
6266
{
6367
var result = await dispatcher.DispatchAsync(request, cancellation);
@@ -86,6 +90,7 @@ public async Task<IActionResult> RefreshTokenAsync(SessionTokenRenewalScheme req
8690

8791
[HttpPost("invalidate-session")]
8892
[TenantRequired]
93+
[Stability(Stability.Stable)]
8994
public async Task<IActionResult> InvalidateSessionAsync(SessionInvalidationScheme request, CancellationToken cancellation)
9095
{
9196
var result = await dispatcher.DispatchAsync(request, cancellation);
@@ -111,4 +116,4 @@ public async Task<IActionResult> InvalidateSessionAsync(SessionInvalidationSchem
111116
StatusCode(StatusCodes.Status401Unauthorized, result.Error),
112117
};
113118
}
114-
}
119+
}

Source/Vinder.Federation.WebApi/Controllers/PermissionsController.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ public sealed class PermissionsController(IDispatcher dispatcher) : ControllerBa
77
{
88
[HttpGet]
99
[Authorize]
10+
[Stability(Stability.Stable)]
1011
public async Task<IActionResult> GetPermissionsAsync([FromQuery] PermissionsFetchParameters request, CancellationToken cancellation)
1112
{
1213
var result = await dispatcher.DispatchAsync(request, cancellation);
@@ -21,6 +22,7 @@ public async Task<IActionResult> GetPermissionsAsync([FromQuery] PermissionsFetc
2122

2223
[HttpPost]
2324
[Authorize(Roles = Permissions.CreatePermission)]
25+
[Stability(Stability.Stable)]
2426
public async Task<IActionResult> CreatePermissionAsync(PermissionCreationScheme request, CancellationToken cancellation)
2527
{
2628
var result = await dispatcher.DispatchAsync(request, cancellation);
@@ -37,6 +39,7 @@ public async Task<IActionResult> CreatePermissionAsync(PermissionCreationScheme
3739

3840
[HttpPut("{id}")]
3941
[Authorize(Roles = Permissions.EditPermission)]
42+
[Stability(Stability.Stable)]
4043
public async Task<IActionResult> UpdatePermissionAsync(string id, PermissionUpdateScheme request, CancellationToken cancellation)
4144
{
4245
var result = await dispatcher.DispatchAsync(request with { PermissionId = id }, cancellation);
@@ -53,6 +56,7 @@ public async Task<IActionResult> UpdatePermissionAsync(string id, PermissionUpda
5356

5457
[HttpDelete("{id}")]
5558
[Authorize(Roles = Permissions.DeletePermission)]
59+
[Stability(Stability.Stable)]
5660
public async Task<IActionResult> DeletePermissionAsync(string id, CancellationToken cancellation)
5761
{
5862
var result = await dispatcher.DispatchAsync(new PermissionDeletionScheme { PermissionId = id }, cancellation);
@@ -66,4 +70,4 @@ public async Task<IActionResult> DeletePermissionAsync(string id, CancellationTo
6670
StatusCode(StatusCodes.Status404NotFound, result.Error),
6771
};
6872
}
69-
}
73+
}

Source/Vinder.Federation.WebApi/Controllers/ScopesController.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ public sealed class ScopesController(IDispatcher dispatcher) : ControllerBase
77
{
88
[HttpPost]
99
[Authorize(Roles = Permissions.CreateScope)]
10+
[Stability(Stability.Experimental)]
1011
public async Task<IActionResult> CreateScopeAsync(ScopeCreationScheme request, CancellationToken cancellation)
1112
{
1213
var result = await dispatcher.DispatchAsync(request, cancellation);
@@ -20,4 +21,4 @@ public async Task<IActionResult> CreateScopeAsync(ScopeCreationScheme request, C
2021
StatusCode(StatusCodes.Status409Conflict, result.Error),
2122
};
2223
}
23-
}
24+
}

Source/Vinder.Federation.WebApi/Controllers/TenantsController.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ public sealed class TenantsController(IDispatcher dispatcher) : ControllerBase
77
{
88
[HttpGet]
99
[Authorize(Roles = Permissions.ViewTenants)]
10+
[Stability(Stability.Stable)]
1011
public async Task<IActionResult> GetTenantsAsync([FromQuery] TenantFetchParameters request, CancellationToken cancellation)
1112
{
1213
var result = await dispatcher.DispatchAsync(request, cancellation);
@@ -21,6 +22,7 @@ public async Task<IActionResult> GetTenantsAsync([FromQuery] TenantFetchParamete
2122

2223
[HttpPost]
2324
[Authorize(Roles = Permissions.CreateTenant)]
25+
[Stability(Stability.Stable)]
2426
public async Task<IActionResult> CreateTenantAsync(TenantCreationScheme request, CancellationToken cancellation)
2527
{
2628
var result = await dispatcher.DispatchAsync(request, cancellation);
@@ -37,6 +39,7 @@ public async Task<IActionResult> CreateTenantAsync(TenantCreationScheme request,
3739

3840
[HttpPut("{id}")]
3941
[Authorize(Roles = Permissions.EditTenant)]
42+
[Stability(Stability.Stable)]
4043
public async Task<IActionResult> UpdateTenantAsync(
4144
string id, TenantUpdateScheme request, CancellationToken cancellation)
4245
{
@@ -54,6 +57,7 @@ public async Task<IActionResult> UpdateTenantAsync(
5457

5558
[HttpDelete("{id}")]
5659
[Authorize(Roles = Permissions.DeleteTenant)]
60+
[Stability(Stability.Stable)]
5761
public async Task<IActionResult> DeleteTenantAsync(string id, CancellationToken cancellation)
5862
{
5963
var result = await dispatcher.DispatchAsync(new TenantDeletionScheme { TenantId = id }, cancellation);
@@ -70,6 +74,7 @@ public async Task<IActionResult> DeleteTenantAsync(string id, CancellationToken
7074

7175
[HttpGet("{id}/permissions")]
7276
[Authorize(Roles = Permissions.ViewPermissions)]
77+
[Stability(Stability.Stable)]
7378
public async Task<IActionResult> GetTenantPermissionsAsync(
7479
[FromRoute] string id, [FromQuery] ListTenantAssignedPermissionsParameters request, CancellationToken cancellation
7580
)
@@ -87,6 +92,7 @@ public async Task<IActionResult> GetTenantPermissionsAsync(
8792

8893
[HttpPost("{id}/permissions")]
8994
[Authorize(Roles = Permissions.AssignPermissions)]
95+
[Stability(Stability.Stable)]
9096
public async Task<IActionResult> AssignPermissionAsync(
9197
[FromRoute] string id, [FromBody] AssignTenantPermissionScheme request, CancellationToken cancellation)
9298
{
@@ -110,6 +116,7 @@ public async Task<IActionResult> AssignPermissionAsync(
110116

111117
[HttpDelete("{id}/permissions/{permissionId}")]
112118
[Authorize(Roles = Permissions.RevokePermissions)]
119+
[Stability(Stability.Stable)]
113120
public async Task<IActionResult> RevokePermissionAsync([FromRoute] string id, [FromRoute] string permissionId, CancellationToken cancellation)
114121
{
115122
var request = new RevokeTenantPermissionScheme { TenantId = id, PermissionId = permissionId };
@@ -130,4 +137,4 @@ public async Task<IActionResult> RevokePermissionAsync([FromRoute] string id, [F
130137
StatusCode(StatusCodes.Status409Conflict, result.Error)
131138
};
132139
}
133-
}
140+
}

Source/Vinder.Federation.WebApi/Controllers/UsersController.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ public sealed class UsersController(IDispatcher dispatcher) : ControllerBase
77
{
88
[HttpGet]
99
[Authorize(Roles = Permissions.ViewUsers)]
10+
[Stability(Stability.Stable)]
1011
public async Task<IActionResult> GetUsersAsync([FromQuery] UsersFetchParameters request, CancellationToken cancellation)
1112
{
1213
var result = await dispatcher.DispatchAsync(request, cancellation);
@@ -21,6 +22,7 @@ public async Task<IActionResult> GetUsersAsync([FromQuery] UsersFetchParameters
2122

2223
[HttpDelete("{id}")]
2324
[Authorize(Roles = Permissions.EditUser)]
25+
[Stability(Stability.Stable)]
2426
public async Task<IActionResult> DeleteUserAsync(string id, CancellationToken cancellation)
2527
{
2628
var request = new UserDeletionScheme { UserId = id };
@@ -37,6 +39,7 @@ public async Task<IActionResult> DeleteUserAsync(string id, CancellationToken ca
3739

3840
[HttpGet("{id}/permissions")]
3941
[Authorize(Roles = Permissions.ViewPermissions)]
42+
[Stability(Stability.Stable)]
4043
public async Task<IActionResult> GetUserPermissionsAsync(
4144
[FromRoute] string id,
4245
[FromQuery] ListUserAssignedPermissionsParameters request, CancellationToken cancellation
@@ -55,6 +58,7 @@ public async Task<IActionResult> GetUserPermissionsAsync(
5558

5659
[HttpGet("{id}/groups")]
5760
[Authorize(Roles = Permissions.ViewGroups)]
61+
[Stability(Stability.Stable)]
5862
public async Task<IActionResult> GetUserGroupsAsync(
5963
[FromRoute] string id,
6064
[FromQuery] ListUserAssignedGroupsParameters request, CancellationToken cancellation
@@ -73,6 +77,7 @@ public async Task<IActionResult> GetUserGroupsAsync(
7377

7478
[HttpPost("{id}/groups")]
7579
[Authorize(Roles = Permissions.EditUser)]
80+
[Stability(Stability.Stable)]
7681
public async Task<IActionResult> AssignUserToGroupAsync(
7782
string id, AssignUserToGroupScheme request, CancellationToken cancellation)
7883
{
@@ -96,6 +101,7 @@ public async Task<IActionResult> AssignUserToGroupAsync(
96101

97102
[HttpPost("{id}/permissions")]
98103
[Authorize(Roles = Permissions.AssignPermissions)]
104+
[Stability(Stability.Stable)]
99105
public async Task<IActionResult> AssignUserPermissionAsync(
100106
string id, AssignUserPermissionScheme request, CancellationToken cancellation)
101107
{
@@ -119,6 +125,7 @@ public async Task<IActionResult> AssignUserPermissionAsync(
119125

120126
[HttpDelete("{id}/permissions/{permissionId}")]
121127
[Authorize(Roles = Permissions.RevokePermissions)]
128+
[Stability(Stability.Stable)]
122129
public async Task<IActionResult> RevokeUserPermissionAsync(
123130
string id, string permissionId, CancellationToken cancellation)
124131
{
@@ -143,6 +150,7 @@ public async Task<IActionResult> RevokeUserPermissionAsync(
143150

144151
[HttpDelete("{id}/groups/{groupId}")]
145152
[Authorize(Roles = Permissions.EditUser)]
153+
[Stability(Stability.Stable)]
146154
public async Task<IActionResult> RemoveUserFromGroupAsync(string id, string groupId, CancellationToken cancellation)
147155
{
148156
var request = new RemoveUserFromGroupScheme { UserId = id, GroupId = groupId };
@@ -163,4 +171,4 @@ public async Task<IActionResult> RemoveUserFromGroupAsync(string id, string grou
163171
StatusCode(StatusCodes.Status409Conflict, result.Error)
164172
};
165173
}
166-
}
174+
}

Source/Vinder.Federation.WebApi/Controllers/WellKnownController.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ namespace Vinder.Federation.WebApi.Controllers;
55
public sealed class WellKnownController(IDispatcher dispatcher) : ControllerBase
66
{
77
[HttpGet("openid-configuration")]
8+
[Stability(Stability.Stable)]
89
public async Task<IActionResult> GetConfigurationAsync(
910
[FromQuery] FetchOpenIDConfigurationParameters request, CancellationToken cancellation)
1011
{
@@ -19,6 +20,7 @@ public async Task<IActionResult> GetConfigurationAsync(
1920
}
2021

2122
[HttpGet("jwks.json")]
23+
[Stability(Stability.Stable)]
2224
public async Task<IActionResult> GetJsonWebKeysAsync(
2325
[FromQuery] FetchJsonWebKeysParameters request, CancellationToken cancellation)
2426
{

0 commit comments

Comments
 (0)