70 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using DysonNetwork.Shared.Models;
 | 
						|
using DysonNetwork.Shared.Proto;
 | 
						|
using Grpc.Core;
 | 
						|
using Microsoft.EntityFrameworkCore;
 | 
						|
 | 
						|
namespace DysonNetwork.Develop.Identity;
 | 
						|
 | 
						|
public class CustomAppServiceGrpc(AppDatabase db) : Shared.Proto.CustomAppService.CustomAppServiceBase
 | 
						|
{
 | 
						|
    public override async Task<GetCustomAppResponse> GetCustomApp(GetCustomAppRequest request, ServerCallContext context)
 | 
						|
    {
 | 
						|
        var q = db.CustomApps.AsQueryable();
 | 
						|
        switch (request.QueryCase)
 | 
						|
        {
 | 
						|
            case GetCustomAppRequest.QueryOneofCase.Id when !string.IsNullOrWhiteSpace(request.Id):
 | 
						|
            {
 | 
						|
                if (!Guid.TryParse(request.Id, out var id))
 | 
						|
                    throw new RpcException(new Status(StatusCode.InvalidArgument, "invalid id"));
 | 
						|
                var appById = await q.FirstOrDefaultAsync(a => a.Id == id);
 | 
						|
                if (appById is null)
 | 
						|
                    throw new RpcException(new Status(StatusCode.NotFound, "app not found"));
 | 
						|
                return new GetCustomAppResponse { App = appById.ToProto() };
 | 
						|
            }
 | 
						|
            case GetCustomAppRequest.QueryOneofCase.Slug when !string.IsNullOrWhiteSpace(request.Slug):
 | 
						|
            {
 | 
						|
                var appBySlug = await q.FirstOrDefaultAsync(a => a.Slug == request.Slug);
 | 
						|
                if (appBySlug is null)
 | 
						|
                    throw new RpcException(new Status(StatusCode.NotFound, "app not found"));
 | 
						|
                return new GetCustomAppResponse { App = appBySlug.ToProto() };
 | 
						|
            }
 | 
						|
            default:
 | 
						|
                throw new RpcException(new Status(StatusCode.InvalidArgument, "id or slug required"));
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    public override async Task<CheckCustomAppSecretResponse> CheckCustomAppSecret(CheckCustomAppSecretRequest request, ServerCallContext context)
 | 
						|
    {
 | 
						|
        if (string.IsNullOrEmpty(request.Secret))
 | 
						|
            throw new RpcException(new Status(StatusCode.InvalidArgument, "secret required"));
 | 
						|
 | 
						|
        IQueryable<SnCustomAppSecret> q = db.CustomAppSecrets;
 | 
						|
        switch (request.SecretIdentifierCase)
 | 
						|
        {
 | 
						|
            case CheckCustomAppSecretRequest.SecretIdentifierOneofCase.SecretId:
 | 
						|
            {
 | 
						|
                if (!Guid.TryParse(request.SecretId, out var sid))
 | 
						|
                    throw new RpcException(new Status(StatusCode.InvalidArgument, "invalid secret_id"));
 | 
						|
                q = q.Where(s => s.Id == sid);
 | 
						|
                break;
 | 
						|
            }
 | 
						|
            case CheckCustomAppSecretRequest.SecretIdentifierOneofCase.AppId:
 | 
						|
            {
 | 
						|
                if (!Guid.TryParse(request.AppId, out var aid))
 | 
						|
                    throw new RpcException(new Status(StatusCode.InvalidArgument, "invalid app_id"));
 | 
						|
                q = q.Where(s => s.AppId == aid);
 | 
						|
                break;
 | 
						|
            }
 | 
						|
            default:
 | 
						|
                throw new RpcException(new Status(StatusCode.InvalidArgument, "secret_id or app_id required"));
 | 
						|
        }
 | 
						|
 | 
						|
        if (request.HasIsOidc)
 | 
						|
            q = q.Where(s => s.IsOidc == request.IsOidc);
 | 
						|
 | 
						|
        var now = NodaTime.SystemClock.Instance.GetCurrentInstant();
 | 
						|
        var exists = await q.AnyAsync(s => s.Secret == request.Secret && (s.ExpiredAt == null || s.ExpiredAt > now));
 | 
						|
        return new CheckCustomAppSecretResponse { Valid = exists };
 | 
						|
    }
 | 
						|
}
 |