elsa-core/src/server/Elsa.Server.GraphQL/Query.cs
2020-10-10 21:10:09 +02:00

92 lines
3.3 KiB
C#

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<ActivityDescriptor> 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<IEnumerable<WorkflowDefinition>> GetWorkflowDefinitions(
VersionOptionsInput? version,
[Service] ISession session,
[Service] IMapper mapper,
CancellationToken cancellationToken)
{
var mappedVersion = mapper.Map<VersionOptions?>(version);
return await session.QueryWorkflowDefinitions().WithVersion(mappedVersion ?? VersionOptions.Latest)
.ListAsync();
}
public async Task<WorkflowDefinition?> GetWorkflowDefinition(
string? workflowDefinitionVersionId,
string? workflowDefinitionId,
VersionOptionsInput? version,
[Service] ISession session,
[Service] IMapper mapper,
CancellationToken cancellationToken)
{
if (workflowDefinitionVersionId != null)
return await session.QueryWorkflowDefinitions<WorkflowDefinitionIndex>(
x => x.WorkflowDefinitionVersionId == workflowDefinitionVersionId).FirstOrDefaultAsync();
var mappedVersion = mapper.Map<VersionOptions?>(version);
return await session.GetWorkflowDefinitionAsync(
workflowDefinitionId!,
mappedVersion ?? VersionOptions.Latest,
cancellationToken);
}
public async Task<IEnumerable<WorkflowInstance>> GetWorkflowInstances(
string definitionId,
WorkflowStatus? status,
[Service] ISession session,
CancellationToken cancellationToken)
{
Expression<Func<WorkflowInstanceIndex, bool>> 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<WorkflowInstance?> GetWorkflowInstance(
string id,
[Service] ISession session,
CancellationToken cancellationToken)
{
return await session.GetWorkflowInstanceByIdAsync(id, cancellationToken);
}
}
}