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 { public async Task> GetQueryableAsync(object query, CancellationToken cancellationToken = default) { long? organizationId = null; long? clientId = null; if (query is IDynamicQueryParams 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().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; } }