72 lines
2.2 KiB
C#
72 lines
2.2 KiB
C#
|
using DigitalOps.Authority.Services;
|
||
|
using DigitalOps.Dal;
|
||
|
using Microsoft.EntityFrameworkCore;
|
||
|
using OpenHarbor.CQRS.DynamicQuery.Abstractions;
|
||
|
|
||
|
namespace DigitalOps.CQRS.Queries.Project;
|
||
|
|
||
|
public class ProjectQueryParams
|
||
|
{
|
||
|
public long? OrganizationId { get; set; }
|
||
|
public long? ClientId { get; set; }
|
||
|
}
|
||
|
|
||
|
public class ProjectItem
|
||
|
{
|
||
|
public long Id { get; set; }
|
||
|
public long ClientId { get; set; }
|
||
|
public required string Name { get; set; }
|
||
|
public DateTime CreatedAt { get; set; }
|
||
|
public DateTime? UpdatedAt { get; set; }
|
||
|
}
|
||
|
|
||
|
public class ProjectQueryableProvider(MainDbContext dbContext, UserIdentityService userIdentityService): IQueryableProviderOverride<ProjectItem>
|
||
|
{
|
||
|
public async Task<IQueryable<ProjectItem>> GetQueryableAsync(object query, CancellationToken cancellationToken = default)
|
||
|
{
|
||
|
long? organizationId = null;
|
||
|
long? clientId = null;
|
||
|
|
||
|
if (query is IDynamicQueryParams<ProjectQueryParams> dynamicQuery)
|
||
|
{
|
||
|
var queryParams = dynamicQuery.GetParams();
|
||
|
organizationId = queryParams?.OrganizationId;
|
||
|
clientId = queryParams?.ClientId;
|
||
|
}
|
||
|
|
||
|
var user = await userIdentityService.GetUserOrDefaultAsync(cancellationToken);
|
||
|
|
||
|
var queryable = dbContext.Projects
|
||
|
.AsNoTracking()
|
||
|
.AsQueryable();
|
||
|
|
||
|
if (organizationId is null)
|
||
|
{
|
||
|
// don't bother to call the database if organizationId is not set
|
||
|
return Enumerable.Empty<ProjectItem>().AsQueryable();
|
||
|
}
|
||
|
|
||
|
var organizationUser = await dbContext.OrganizationUsers
|
||
|
.FirstOrDefaultAsync(organizationUser => organizationUser.UserId == user!.Id, cancellationToken);
|
||
|
|
||
|
if (clientId is not null)
|
||
|
{
|
||
|
queryable = queryable.Where(project => project.ClientId == clientId);
|
||
|
}
|
||
|
|
||
|
queryable = queryable
|
||
|
.Where(project => project.Client.OrganizationClients.Any(organizationClient =>
|
||
|
organizationClient.OrganizationId == organizationUser!.OrganizationId));
|
||
|
|
||
|
var result = queryable.Select(project => new ProjectItem
|
||
|
{
|
||
|
Id = project.Id,
|
||
|
ClientId = project.ClientId,
|
||
|
Name = project.Name,
|
||
|
CreatedAt = project.CreatedAt,
|
||
|
UpdatedAt = project.UpdatedAt
|
||
|
});
|
||
|
|
||
|
return result;
|
||
|
}
|
||
|
}
|