Skip to content

WFS-468 Callback API Sample #1

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
Jun 16, 2022
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
150 changes: 150 additions & 0 deletions WorkflowServer.CallbackApi/Controllers/ApiController.cs
Original file line number Diff line number Diff line change
@@ -1,15 +1,165 @@
using System.Text;
using System.Xml;
using Microsoft.AspNetCore.Mvc;
using WorkflowServer.CallbackApi.Models;
using WorkflowServer.CallbackApi.Workflow;

namespace WorkflowServer.CallbackApi.Controllers;

/// <summary>
/// This controller implements all possible requests from Callback API of WFS 3.0.0.
/// Callback API allows hosting your code of Actions, Conditions or Rules on third-party servers.
/// Callback server should be connected in the admin panel on the Callback API page.
/// More details on the <see href="https://workflowserver.io/documentation/callback-api">workflowserver.io</see>
/// </summary>
[ApiController]
[Route("[controller]/[action]")]
public class ApiController : ControllerBase
{
public ApiController(ILogger<ApiController> logger)
{
_logger = logger;

_actionProvider = new ActionProvider();
_conditionProvider = new ConditionProvider();
_identityProvider = new IdentityProvider();
_parameterProvider = new ParameterProvider();
}

#region Actions & Conditions Execution

[HttpGet]
public Task<IActionResult> GetActions(string schemeCode, string token)
{
return Task.FromResult<IActionResult>(Ok(ApiResponse.Ok(_actionProvider.ActionNames)));
}

[HttpPost]
public async Task<IActionResult> ExecuteAction(InstanceRequest request)
{
await _actionProvider.ExecuteAction(request.Name, request.Parameter, request.ProcessInstance);

return Ok();
}

[HttpGet]
public Task<IActionResult> GetConditions(string schemeCode, string token)
{
return Task.FromResult<IActionResult>(Ok(ApiResponse.Ok(_conditionProvider.ConditionNames)));
}

[HttpPost]
public async Task<IActionResult> ExecuteCondition(InstanceRequest request)
{
var result = await _conditionProvider.ExecuteCondition(request.Name, request.Parameter, request.ProcessInstance);

return Ok(ApiResponse.Ok(result));
}

private readonly ActionProvider _actionProvider;
private readonly ConditionProvider _conditionProvider;

#endregion

#region Authorization Rules Execution

[HttpGet]
public Task<IActionResult> GetRules(string schemeCode, string token)
{
return Task.FromResult<IActionResult>(Ok(_identityProvider.RuleNames));
}

[HttpPost]
public async Task<IActionResult> CheckRule(CheckRuleRequest request)
{
var result = await _identityProvider.RuleCheck(request.Name, request.IdentityId, request.Parameter, request.ProcessInstance);
return Ok(ApiResponse.Ok(result));
}

[HttpPost]
public async Task<IActionResult> GetIdentities(InstanceRequest request)
{
var result = await _identityProvider.RuleGet(request.Name, request.Parameter, request.ProcessInstance);
return Ok(ApiResponse.Ok(result));
}

private readonly IdentityProvider _identityProvider;

#endregion

#region Remote Scheme Generation

[HttpPost]
public Task<IActionResult> Generate(GenerateRequest request)
{
XmlDocument xml = new XmlDocument();

//Your code

return Task.FromResult<IActionResult>(Ok(xml.OuterXml));
}

#endregion

#region Event Handlers

[HttpPost]
public Task<IActionResult> ProcessStatusChanged(StatusChangedRequest request)
{
_logger.LogInformation("Process status changed from {OldStatus} to {NewStatus}",
request.OldStatus, request.NewStatus);

//Your event actions

return Task.FromResult<IActionResult>(Ok(ApiResponse.Ok()));
}

[HttpPost]
public Task<IActionResult> ProcessActivityChanged(ActivityChangedRequest request)
{
_logger.LogInformation("Process activity changed from {PreviousActivityName} to {CurrentActivityName}",
request.PreviousActivityName, request.CurrentActivityName);

//Your event actions

return Task.FromResult<IActionResult>(Ok(ApiResponse.Ok()));
}

[HttpPost]
public Task<IActionResult> ProcessLog(LogRequest request)
{
//Your event actions

return Task.FromResult<IActionResult>(Ok(ApiResponse.Ok()));
}

#endregion

#region Parameters Providing

[HttpGet]
public Task<IActionResult> GetParameterNames(string schemeCode, string token)
{
return Task.FromResult<IActionResult>(Ok(ApiResponse.Ok(_parameterProvider.GetNames)));
}

[HttpPost]
public Task<IActionResult> GetParameter(ParameterRequest request)
{
var result = _parameterProvider.GetParameter(request.Name);
return Task.FromResult<IActionResult>(Ok(ApiResponse.Ok(result)));
}

[HttpPost]
public Task<IActionResult> SetParameter(ParameterRequest request)
{
_parameterProvider.SetParameter(request.Name, request.Value);
return Task.FromResult<IActionResult>(Ok(ApiResponse.Ok()));
}

private readonly ParameterProvider _parameterProvider;

#endregion

private readonly ILogger<ApiController> _logger;
}
15 changes: 15 additions & 0 deletions WorkflowServer.CallbackApi/Models/ActivityChangedRequest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
namespace WorkflowServer.CallbackApi.Models;

public class ActivityChangedRequest : ProcessRequest
{
public ActivityChangedRequest(Guid processId, string schemeCode, ProcessInstance processInstance, string previousActivityName,
string currentActivityName, string token)
: base(processId, schemeCode, processInstance, token)
{
PreviousActivityName = previousActivityName;
CurrentActivityName = currentActivityName;
}

public string PreviousActivityName { get; }
public string CurrentActivityName { get; }
}
19 changes: 19 additions & 0 deletions WorkflowServer.CallbackApi/Models/ApiResponse.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
namespace WorkflowServer.CallbackApi.Models;

public class ApiResponse
{
public static ApiResponse Ok(object? data = null) => new ApiResponse(true, data);
public static ApiResponse Failure(string? error = null, string? message = null) => new ApiResponse(false, null, error, message);

public ApiResponse(bool success, object? data = null, string? error = null, string? message = null)
{
Success = success;
Data = data;
Error = error;
}

public string? Error { get; set; }
public string? Message { get; set; }
public bool Success { get; set; }
public object? Data { get; set; }
}
12 changes: 12 additions & 0 deletions WorkflowServer.CallbackApi/Models/CheckRuleRequest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
namespace WorkflowServer.CallbackApi.Models;

public class CheckRuleRequest : InstanceRequest
{
public CheckRuleRequest(string name, string parameter, string token, ProcessInstance processInstance, string identityId) :
base(name, parameter, token, processInstance)
{
IdentityId = identityId;
}

public string IdentityId { get; }
}
19 changes: 19 additions & 0 deletions WorkflowServer.CallbackApi/Models/GenerateRequest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
namespace WorkflowServer.CallbackApi.Models;

public class GenerateRequest
{
public GenerateRequest(string schemeCode, Guid schemeId, object parameters, string scheme, string token)
{
SchemeCode = schemeCode;
SchemeId = schemeId;
Parameters = parameters;
Scheme = scheme;
Token = token;
}

public string SchemeCode { get; }
public Guid SchemeId { get; }
public object Parameters { get; }
public string Scheme { get; }
public string Token { get; }
}
17 changes: 17 additions & 0 deletions WorkflowServer.CallbackApi/Models/InstanceRequest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
namespace WorkflowServer.CallbackApi.Models;

public class InstanceRequest
{
public InstanceRequest(string name, string parameter, string token, ProcessInstance processInstance)
{
Name = name;
Parameter = parameter;
Token = token;
ProcessInstance = processInstance;
}

public string Name { get; }
public string Parameter { get; }
public ProcessInstance ProcessInstance { get; }
public string Token { get; }
}
13 changes: 13 additions & 0 deletions WorkflowServer.CallbackApi/Models/LogRequest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
namespace WorkflowServer.CallbackApi.Models;

public class LogRequest
{
public LogRequest(List<object> processLogs, string token)
{
ProcessLogs = processLogs;
Token = token;
}

public List<object> ProcessLogs { get; }
public string Token { get; }
}
15 changes: 15 additions & 0 deletions WorkflowServer.CallbackApi/Models/ParameterRequest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
namespace WorkflowServer.CallbackApi.Models;

public class ParameterRequest : ProcessRequest
{
public ParameterRequest(Guid processId, string schemeCode, ProcessInstance processInstance, string token, string name,
object? value = null)
: base(processId, schemeCode, processInstance, token)
{
Name = name;
Value = value;
}

public string Name { get; }
public object? Value { get; }
}
27 changes: 27 additions & 0 deletions WorkflowServer.CallbackApi/Models/ProcessInstance.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
namespace WorkflowServer.CallbackApi.Models;

public class ProcessInstance
{
public Guid Id { get; set; }
public string? StateName { get; set; }
public string? ActivityName { get; set; }
public Guid? SchemeId { get; set; }
public string? SchemeCode { get; set; }
public string? PreviousState { get; set; }
public string? PreviousStateForDirect { get; set; }
public string? PreviousStateForReverse { get; set; }
public string? PreviousActivity { get; set; }
public string? PreviousActivityForDirect { get; set; }
public string? PreviousActivityForReverse { get; set; }
public Guid? ParentProcessId { get; set; }
public Guid? RootProcessId { get; set; }
public bool IsDeterminingParametersChanged { get; set; }
public byte InstanceStatus { get; set; }
public bool IsSubProcess { get; set; }
public string? TenantId { get; set; }

public List<TransitionItem>? Transitions { get; set; }
public List<WorkflowServerProcessHistoryItem>? History { get; set; }
public Dictionary<string, object>? ProcessParameters { get; set; }
public List<Guid>? SubProcessIds { get; set; }
}
17 changes: 17 additions & 0 deletions WorkflowServer.CallbackApi/Models/ProcessRequest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
namespace WorkflowServer.CallbackApi.Models;

public class ProcessRequest
{
public ProcessRequest(Guid processId, string schemeCode, ProcessInstance processInstance, string token)
{
ProcessId = processId;
SchemeCode = schemeCode;
ProcessInstance = processInstance;
Token = token;
}

public Guid ProcessId { get; }
public string SchemeCode { get; }
public ProcessInstance ProcessInstance { get; }
public string Token { get; }
}
15 changes: 15 additions & 0 deletions WorkflowServer.CallbackApi/Models/StatusChangedRequest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
namespace WorkflowServer.CallbackApi.Models;

public class StatusChangedRequest : ProcessRequest
{
public StatusChangedRequest(Guid processId, string schemeCode, ProcessInstance processInstance, string oldStatus, string newStatus,
string token)
: base(processId, schemeCode, processInstance, token)
{
OldStatus = oldStatus;
NewStatus = newStatus;
}

public string OldStatus { get; }
public string NewStatus { get; }
}
16 changes: 16 additions & 0 deletions WorkflowServer.CallbackApi/Models/TransitionItem.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
namespace WorkflowServer.CallbackApi.Models;

public class TransitionItem
{
public Guid ProcessId { get; set; }
public string? ActorIdentityId{ get; set; }
public string? ExecutorIdentityId { get; set; }
public string? FromActivityName { get; set; }
public string? FromStateName { get; set; }
public bool IsFinalised { get; set; }
public string? ToActivityName{ get; set; }
public string? ToStateName { get; set; }
public string? TransitionClassifier { get; set; }
public DateTime TransitionTime { get; set; }
public string? TriggerName { get; set; }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
namespace WorkflowServer.CallbackApi.Models;

public class WorkflowServerProcessHistoryItem
{
public Guid Id { get; set; }
public Guid ProcessId { get; set; }
public string? IdentityId { get; set; }
public string? AllowedToEmployeeNames { get; set; }
public DateTime? TransitionTime { get; set; }
public long Order { get; set; }
public string? InitialState { get; set; }
public string? DestinationState { get; set; }
public string? Command { get; set; }
}
Loading