Skip to content

Commit

Permalink
feat: add all params to enforces and clean up casbin api client (#71)
Browse files Browse the repository at this point in the history
  • Loading branch information
d1mak3 authored Aug 31, 2023
1 parent c866949 commit caa1983
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 118 deletions.
116 changes: 63 additions & 53 deletions src/Casdoor.Client/CasdoorClient.CasbinApi.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,80 +12,90 @@
// See the License for the specific language governing permissions and
// limitations under the License.

using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;
using IdentityModel.Client;
using System.Net.Http.Json;

namespace Casdoor.Client;

public partial class CasdoorClient
{
public virtual Task<CasdoorResponse<bool>> EnforceAsync(CasdoorEnforceData enforceData, string permissionId, CancellationToken cancellationToken = default) =>
DoEnforceAsync<bool>("enforce", enforceData.ToJsonArray(), permissionId, cancellationToken);

public virtual Task<CasdoorResponse<bool>> BatchEnforceAsync(IEnumerable<CasdoorEnforceData> enforceData, string permissionId, CancellationToken cancellationToken = default) =>
DoEnforceAsync<bool>("batch-enforce", enforceData.ToJsonArray(), permissionId, cancellationToken);
public virtual async Task<CasdoorEnforceResult?> EnforceAsync(
CasdoorEnforceData enforceData,
string? permissionId,
string? modelId,
string? resourceId,
string? enforcerId,
CancellationToken cancellationToken = default)
{
var queryMapBuilder = new QueryMapBuilder();

public virtual Task<CasdoorResponse<string>> GetAllObjectsAsync(CancellationToken cancellationToken = default) =>
GetAllAsync<string>("get-all-objects", cancellationToken);
if (!string.IsNullOrEmpty(permissionId))
{
queryMapBuilder.Add(permissionId!);
}

public virtual Task<CasdoorResponse<string>> GetAllActionsAsync(CancellationToken cancellationToken = default) =>
GetAllAsync<string>("get-all-actions", cancellationToken);
if (!string.IsNullOrEmpty(modelId))
{
queryMapBuilder.Add(modelId!);
}

public virtual Task<CasdoorResponse<string>> GetAllRolesAsync(CancellationToken cancellationToken = default) =>
GetAllAsync<string>("get-all-roles", cancellationToken);
if (!string.IsNullOrEmpty(resourceId))
{
queryMapBuilder.Add(resourceId!);
}

private async Task<CasdoorResponse<T>> DoEnforceAsync<T>(string url, string data, string permissionId,
CancellationToken cancellationToken = default)
{
var queryMap = new QueryMapBuilder().Add("permissionId", permissionId).QueryMap;
var response = await SendRequestAsync(HttpMethod.Post,
new Uri(_options.GetActionUrl(url, queryMap)),
new StringContent(
data,
Encoding.UTF8,
"application/json"),
cancellationToken);
string responseContent = await response.Content.ReadAsStringAsync(); // netstandard2.0 does not support cancellationToken

if (!response.IsSuccessStatusCode)
if (!string.IsNullOrEmpty(enforcerId))
{
return new CasdoorResponse<T> { Status = response.StatusCode.ToString(), Msg = responseContent };
queryMapBuilder.Add(enforcerId!);
}

var deserializedResponse = new CasdoorResponse<T>();
deserializedResponse.DeserializeFromJson(responseContent);
return deserializedResponse;
var queryMap = queryMapBuilder.QueryMap;
var response = await PostAsJsonAsync(_options.GetActionUrl("enforce", queryMap), enforceData.Data, cancellationToken);
return new CasdoorEnforceResult { Result = response.DeserializeData<IEnumerable<bool>>() };
}

private async Task<CasdoorResponse<T>> GetAllAsync<T>(string url, CancellationToken cancellationToken = default)
public virtual async Task<IEnumerable<CasdoorEnforceResult>?> BatchEnforceAsync(
IEnumerable<CasdoorEnforceData> enforceData,
string? permissionId,
string? modelId,
string? enforcerId,
CancellationToken cancellationToken = default)
{
var response = await SendRequestAsync(HttpMethod.Get, new Uri(_options.GetActionUrl(url)),
cancellationToken: cancellationToken);
string responseContent = await response.Content.ReadAsStringAsync();
var queryMapBuilder = new QueryMapBuilder();

if (!response.IsSuccessStatusCode)
if (!string.IsNullOrEmpty(permissionId))
{
return new CasdoorResponse<T> { Status = response.StatusCode.ToString(), Msg = responseContent };
queryMapBuilder.Add(permissionId!);
}

var deserializedResponse = new CasdoorResponse<T>();
deserializedResponse.DeserializeFromJson(responseContent);
return deserializedResponse;
}
if (!string.IsNullOrEmpty(modelId))
{
queryMapBuilder.Add(modelId!);
}

private Task<HttpResponseMessage> SendRequestAsync(HttpMethod method, Uri uri, HttpContent? content = default,
CancellationToken cancellationToken = default)
{
var request = new HttpRequestMessage
if (!string.IsNullOrEmpty(enforcerId))
{
Method = method,
RequestUri = uri,
Content = content
};
request.SetBasicAuthentication(_options.ClientId, _options.ClientSecret);
queryMapBuilder.Add(enforcerId!);
}

return _httpClient.SendAsync(request, cancellationToken);
var queryMap = queryMapBuilder.QueryMap;
var data = enforceData.Select(data => data.Data);
var response = await PostAsJsonAsync(_options.GetActionUrl("batch-enforce", queryMap), data, cancellationToken);
var results = response.DeserializeData<IEnumerable<IEnumerable<bool>>>();
return results!.Select(result => new CasdoorEnforceResult { Result = result });
}

public virtual Task<IEnumerable<string>?> GetAllObjectsAsync(CancellationToken cancellationToken = default) =>
GetAllAsync("get-all-objects", cancellationToken);

public virtual Task<IEnumerable<string>?> GetAllActionsAsync(CancellationToken cancellationToken = default) =>
GetAllAsync("get-all-actions", cancellationToken);

public virtual Task<IEnumerable<string>?> GetAllRolesAsync(CancellationToken cancellationToken = default) =>
GetAllAsync("get-all-roles", cancellationToken);

private async Task<IEnumerable<string>?> GetAllAsync(string url, CancellationToken cancellationToken = default)
{
var result = await _httpClient.GetFromJsonAsync<CasdoorResponse?>(_options.GetActionUrl(url), cancellationToken: cancellationToken);
return result.DeserializeData<IEnumerable<string>>();
}
}
24 changes: 0 additions & 24 deletions src/Casdoor.Client/Extensions/CasdoorEnforceDataExtension.cs

This file was deleted.

34 changes: 0 additions & 34 deletions src/Casdoor.Client/Extensions/CasdoorResponseExtension.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
// limitations under the License.

using System.Text.Json;
using System.Text.Json.Nodes;

namespace Casdoor.Client;

Expand All @@ -32,37 +31,4 @@ public static class CasdoorResponseExtension

return default;
}

internal static void DeserializeFromJson<T>(this CasdoorResponse<T> response, string json)
{
var parsedJson = JsonNode.Parse(json);
response.Status = parsedJson!["status"]!.ToString();
response.Msg = parsedJson["msg"]!.ToString();

if (response.Status != "ok")
{
return;
}

response.Sub = parsedJson["sub"]!.ToString();
response.Name = parsedJson["name"]!.ToString();

try
{
response.Data = parsedJson["data"].Deserialize<IEnumerable<T>>();
}
catch
{
var data = new List<T>();

foreach (var jsonElement in parsedJson["data"].Deserialize<IEnumerable<JsonElement>>()!)
{
data.AddRange(jsonElement.Deserialize<IEnumerable<T>>()!);
}

response.Data = data;
}

response.Data2 = parsedJson["data2"]?.ToString();
}
}
12 changes: 5 additions & 7 deletions src/Casdoor.Client/Models/CasdoorEnforceData.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,12 @@ namespace Casdoor.Client;

public class CasdoorEnforceData
{
[JsonPropertyName("username")]
public string? Username { get; set; }

[JsonPropertyName("resource")]
public string? Resource { get; set; }
[JsonPropertyName("data")] public IEnumerable<string>? Data { get; set; }
}

[JsonPropertyName("action")]
public string? Action { get; set; }
public class CasdoorEnforceResult
{
[JsonPropertyName("result")] public IEnumerable<bool>? Result { get; set; }
}


0 comments on commit caa1983

Please sign in to comment.