using Books.Api.Authorization; using Books.Api.Domain.Companies; using Books.Api.Domain.UserAccess; using Books.Api.EventFlow.Repositories; using Books.Api.GraphQL.Types; using GraphQL; using GraphQL.Types; namespace Books.Api.GraphQL.Queries; public class BooksQuery : ObjectGraphType { public BooksQuery() { Name = "Query"; Description = "Root query for the Books API"; // companies: [CompanyType] Field>("companies") .Description("Get all companies accessible to the current user") .ResolveAsync(async ctx => { var accessService = ctx.RequestServices!.GetRequiredService(); var repository = ctx.RequestServices!.GetRequiredService(); var userAccesses = await accessService.GetUserCompaniesAsync(ctx.CancellationToken); var companyIds = userAccesses.Select(a => CompanyId.With(a.CompanyId)).ToList(); if (companyIds.Count == 0) return Enumerable.Empty(); return await repository.GetByIds(companyIds, ctx.CancellationToken); }); // company(id: ID!): CompanyType Field("company") .Description("Get a company by ID") .Argument>("id", "The company ID") .ResolveAsync(async ctx => { var id = ctx.GetArgument("id"); var accessService = ctx.RequestServices!.GetRequiredService(); await accessService.RequireAccessAsync(id, CompanyRole.Viewer, ctx.CancellationToken); var repository = ctx.RequestServices!.GetRequiredService(); var companies = await repository.GetByIds([CompanyId.With(id)], ctx.CancellationToken); return companies.FirstOrDefault(); }); } }