78 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using Grpc.Core;
 | 
						|
using Microsoft.EntityFrameworkCore;
 | 
						|
using DysonNetwork.Shared.Proto;
 | 
						|
using Google.Protobuf.WellKnownTypes;
 | 
						|
using System.Text.Json;
 | 
						|
using NodaTime.Serialization.Protobuf;
 | 
						|
 | 
						|
namespace DysonNetwork.Pass.Permission;
 | 
						|
 | 
						|
public class PermissionServiceGrpc(
 | 
						|
    PermissionService permissionService,
 | 
						|
    AppDatabase db
 | 
						|
) : DysonNetwork.Shared.Proto.PermissionService.PermissionServiceBase
 | 
						|
{
 | 
						|
    public override async Task<HasPermissionResponse> HasPermission(HasPermissionRequest request, ServerCallContext context)
 | 
						|
    {
 | 
						|
        var hasPermission = await permissionService.HasPermissionAsync(request.Actor, request.Area, request.Key);
 | 
						|
        return new HasPermissionResponse { HasPermission = hasPermission };
 | 
						|
    }
 | 
						|
 | 
						|
    public override async Task<GetPermissionResponse> GetPermission(GetPermissionRequest request, ServerCallContext context)
 | 
						|
    {
 | 
						|
        var permissionValue = await permissionService.GetPermissionAsync<JsonDocument>(request.Actor, request.Area, request.Key);
 | 
						|
        return new GetPermissionResponse { Value = permissionValue != null ? Value.Parser.ParseJson(permissionValue.RootElement.GetRawText()) : null };
 | 
						|
    }
 | 
						|
 | 
						|
    public override async Task<AddPermissionNodeResponse> AddPermissionNode(AddPermissionNodeRequest request, ServerCallContext context)
 | 
						|
    {
 | 
						|
        var node = await permissionService.AddPermissionNode(
 | 
						|
            request.Actor,
 | 
						|
            request.Area,
 | 
						|
            request.Key,
 | 
						|
            JsonDocument.Parse(request.Value.ToString()), // Convert Value to JsonDocument
 | 
						|
            request.ExpiredAt?.ToInstant(),
 | 
						|
            request.AffectedAt?.ToInstant()
 | 
						|
        );
 | 
						|
        return new AddPermissionNodeResponse { Node = node.ToProtoValue() };
 | 
						|
    }
 | 
						|
 | 
						|
    public override async Task<AddPermissionNodeToGroupResponse> AddPermissionNodeToGroup(AddPermissionNodeToGroupRequest request, ServerCallContext context)
 | 
						|
    {
 | 
						|
        var group = await db.PermissionGroups.FirstOrDefaultAsync(g => g.Id == Guid.Parse(request.Group.Id));
 | 
						|
        if (group == null)
 | 
						|
        {
 | 
						|
            throw new RpcException(new Status(StatusCode.NotFound, "Permission group not found."));
 | 
						|
        }
 | 
						|
 | 
						|
        var node = await permissionService.AddPermissionNodeToGroup(
 | 
						|
            group,
 | 
						|
            request.Actor,
 | 
						|
            request.Area,
 | 
						|
            request.Key,
 | 
						|
            JsonDocument.Parse(request.Value.ToString()), // Convert Value to JsonDocument
 | 
						|
            request.ExpiredAt?.ToInstant(),
 | 
						|
            request.AffectedAt?.ToInstant()
 | 
						|
        );
 | 
						|
        return new AddPermissionNodeToGroupResponse { Node = node.ToProtoValue() };
 | 
						|
    }
 | 
						|
 | 
						|
    public override async Task<RemovePermissionNodeResponse> RemovePermissionNode(RemovePermissionNodeRequest request, ServerCallContext context)
 | 
						|
    {
 | 
						|
        await permissionService.RemovePermissionNode(request.Actor, request.Area, request.Key);
 | 
						|
        return new RemovePermissionNodeResponse { Success = true };
 | 
						|
    }
 | 
						|
 | 
						|
    public override async Task<RemovePermissionNodeFromGroupResponse> RemovePermissionNodeFromGroup(RemovePermissionNodeFromGroupRequest request, ServerCallContext context)
 | 
						|
    {
 | 
						|
        var group = await db.PermissionGroups.FirstOrDefaultAsync(g => g.Id == Guid.Parse(request.Group.Id));
 | 
						|
        if (group == null)
 | 
						|
        {
 | 
						|
            throw new RpcException(new Status(StatusCode.NotFound, "Permission group not found."));
 | 
						|
        }
 | 
						|
 | 
						|
        await permissionService.RemovePermissionNodeFromGroup<JsonDocument>(group, request.Actor, request.Area, request.Key);
 | 
						|
        return new RemovePermissionNodeFromGroupResponse { Success = true };
 | 
						|
    }
 | 
						|
}
 |