using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Threading; using System.Threading.Tasks; using AutoMapper; using Elsa.Extensions; using Elsa.Indexes; using Elsa.Metadata; using Elsa.Models; using Elsa.Queries; using Elsa.Server.GraphQL.Models; using Elsa.Services; using HotChocolate; using YesSql; namespace Elsa.Server.GraphQL { public class Query { public IEnumerable GetActivityDescriptors( [Service] IActivityResolver activityResolver, [Service] IActivityDescriber describer) => activityResolver.GetActivityTypes().Select(describer.Describe).ToList(); public ActivityDescriptor? GetActivityDescriptor( [Service] IActivityResolver activityResolver, [Service] IActivityDescriber describer, string typeName) { var type = activityResolver.GetActivityType(typeName); return type == null ? default : describer.Describe(type); } public async Task> GetWorkflowDefinitions( VersionOptionsInput? version, [Service] ISession session, [Service] IMapper mapper, CancellationToken cancellationToken) { var mappedVersion = mapper.Map(version); return await session.QueryWorkflowDefinitions().WithVersion(mappedVersion ?? VersionOptions.Latest) .ListAsync(); } public async Task GetWorkflowDefinition( string? workflowDefinitionVersionId, string? workflowDefinitionId, VersionOptionsInput? version, [Service] ISession session, [Service] IMapper mapper, CancellationToken cancellationToken) { if (workflowDefinitionVersionId != null) return await session.QueryWorkflowDefinitions( x => x.WorkflowDefinitionVersionId == workflowDefinitionVersionId).FirstOrDefaultAsync(); var mappedVersion = mapper.Map(version); return await session.GetWorkflowDefinitionAsync( workflowDefinitionId!, mappedVersion ?? VersionOptions.Latest, cancellationToken); } public async Task> GetWorkflowInstances( string definitionId, WorkflowStatus? status, [Service] ISession session, CancellationToken cancellationToken) { Expression> predicate; if (status == null) predicate = x => x.WorkflowDefinitionId == definitionId; else predicate = x => x.WorkflowDefinitionId == definitionId && x.WorkflowStatus == status; return await session.QueryWorkflowInstances(predicate).ListAsync(); } public async Task GetWorkflowInstance( string id, [Service] ISession session, CancellationToken cancellationToken) { return await session.GetWorkflowInstanceByIdAsync(id, cancellationToken); } } }