view release on metacpan or search on metacpan
cpanfile
dist.ini
lib/Activiti/Rest/Client.pm
lib/Activiti/Rest/Error.pm
lib/Activiti/Rest/Response.pm
lib/Activiti/Rest/UserAgent.pm
lib/Activiti/Rest/UserAgent/LWP.pm
lib/Activiti/Sane.pm
t/00-load.t
t/author-pod-syntax.t
test/delete_process_instance.pl
test/deployments.pl
test/form.pl
test/models.pl
test/process_definitions.pl
test/process_definitions_ids.pl
test/process_definitions_resourcedata.pl
test/query_process_instances.pl
test/query_tasks.pl
test/tasks.pl
test/users.pl
PROJECT
see http://www.activiti.org/userguide
SYNOPSIS
my $client = Activiti::Rest::Client->new(
url => 'http://kermit:kermit@localhost:8080/activiti-rest/service'
);
my $res = $client->process_definitions;
die("no parsed content") unless $res->has_parsed_content;
my $pdefs = $res->parsed_content;
my @ids = map { $_->{id} } @{ $pdefs->{data} };
for my $id(@ids){
print Dumper($client->process_definition(processDefinitionId => $id)->parsed_content);
}
CONSTRUCTOR parameters
url
base url of the activiti rest api
activiti-rest uses basic http authentication, so username and password should be included in the url
e.g.
deploymentId
resourceId
other parameters: see user guide (http://www.activiti.org/userguide/index.html#N1345B)
equal to rest call:
GET repository/deployments/:deploymentId/resources/:resourceId
process_definitions
List of process definitions
parameters: see user guide (http://www.activiti.org/userguide/index.html#N13520)
equal to rest call:
GET repository/process-definitions
process_definition
Get a process definition
parameters:
processDefinitionId
other parameters: see user guide (http://www.activiti.org/userguide/index.html#N13605)
equal to rest call:
GET repository/process-definitions/:processDefinitionId
process_definition_resource_data
Get a process definition resource content
parameters:
processDefinitionId
equal to rest call:
GET repository/process-definitions/:processDefinitionId/resourcedata
process_definition_model
Get a process definition BPMN model
parameters:
processDefinitionId
equal to rest call:
GET repository/process-definitions/:processDefinitionId/model
process_definition_identity_links
Get all candidate starters for a process-definition
parameters:
processDefinitionId
equal to rest call:
GET repository/process-definitions/:processDefinitionId/identitylinks
process_definition_identity_link
Get a candidate starter from a process definition
parameters: (see http://www.activiti.org/userguide/index.html#N138A9)
processDefinitionId
family
identityId
equal to rest call:
GET repository/process-definitions/:processDefinitionId/identitylinks/:family/:identityId
models
Get a list of models
Parameters: see user guide (http://www.activiti.org/userguide/index.html#N1390A)
equal to rest call:
GET repository/models
Get a model
Parameters:
modelId
equal to rest call:
GET repository/models/:modelId
process_instances
List of process instances
Parameters: see user guide (http://www.activiti.org/userguide/index.html#restProcessInstancesGet)
equal to rest call:
GET runtime/process-instances
process_instance
Get a process instance
Parameters:
processInstanceId
equal to rest call:
GET runtime/process-instances/:processInstanceId
query_process_instances
Query process instances
Parameters: see user guide (http://www.activiti.org/userguide/index.html#N13E2A)
equal to rest call:
POST runtime/process-instances
start_process_instance
Start a process instance
Parameters: see user guide (http://www.activiti.org/userguide/index.html#N13CE6)
equal to rest call:
POST runtime/process-instances
process_instance_identitylinks
Get involved people for process instance
Parameters:
processInstanceId
equal to rest call:
GET runtime/process-instances/:processInstanceId/identitylinks
process_instance_variables
List of variables for a process instance
Parameters:
processInstanceId
equal to rest call:
GET runtime/process-instances/:processInstanceId/variables
process_instance_variable
Get a variable for a process instance
Parameters:
processInstanceId
variableName
equal to rest call:
GET runtime/process-instances/:processInstanceId/variables/:variableName
process_instance_diagram
Get a diagram for a process instance
Parameters:
processInstanceId
equal to rest call:
GET runtime/process-instances/:processInstanceId/diagram
when successfull the "content_type" of the response is "image/png" and "content" is equal to the image data
executions
List of executions
Parameters: see user guide (http://www.activiti.org/userguide/index.html#restExecutionsGet)
equal to rest call:
Parameters:
taskId
attachmentId
equal to rest call:
GET runtime/tasks/:taskId/attachments/:attachmentId/content
historic_process_instances
List of historic process instances
Parameters: see user guide (http://www.activiti.org/userguide/index.html#restHistoricProcessInstancesGet)
equal to rest call:
GET history/historic-process-instances
query_historic_process_instances
Query for historic process instances
Parameters: see user guide (http://www.activiti.org/userguide/index.html#N153C2)
equal to rest call:
POST history/historic-process-instances
historic_process_instance
Get a historic process instance
Parameters:
processInstanceId
equal to rest call:
GET history/historic-process-instances/:processInstanceId
delete_historic_process_instance
Delete a historic process instance
Parameters:
processInstanceId
equal to rest call:
DELETE history/historic-process-instances/:processInstanceId
historic_process_instance_comments
Get all comments on a historic process instance
Parameters:
processInstanceId
equal to rest call:
GET history/historic-process-instances/:processInstanceId/comments
historic_process_instance_comment
Get a comment on a historic process instance
Parameters:
processInstanceId
commentId
equal to rest call:
GET history/historic-process-instances/:processInstanceId/comments/:commentId
historic_task_instances
Get historic task instances
Parameters: see user guide (http://www.activiti.org/userguide/index.html#restHistoricTaskInstancesGet)
equal to rest call:
GET history/historic-task-instances
historic_variable_instances
Get historic variable instances, either from tasks or process instances
Parameters: see user guide (http://www.activiti.org/userguide/index.html#restHistoricVariableInstancesGet)
equal to rest call:
GET history/historic-variable-instances
query_historic_variable_instances
Query historic variable instances, either from tasks or process instances
Parameters: see user guide (http://www.activiti.org/userguide/index.html#N15B00)
equal to rest call:
POST query/historic-variable-instances
historic_task_instance
Get a historic task instance
lib/Activiti/Rest/Client.pm view on Meta::CPAN
=head1 PROJECT
see http://www.activiti.org/userguide
=head1 SYNOPSIS
my $client = Activiti::Rest::Client->new(
url => 'http://kermit:kermit@localhost:8080/activiti-rest/service'
);
my $res = $client->process_definitions;
die("no parsed content") unless $res->has_parsed_content;
my $pdefs = $res->parsed_content;
my @ids = map { $_->{id} } @{ $pdefs->{data} };
for my $id(@ids){
print Dumper($client->process_definition(processDefinitionId => $id)->parsed_content);
}
=head1 CONSTRUCTOR parameters
=head2 url
base url of the activiti rest api
activiti-rest uses basic http authentication, so username and password should be included in the url
e.g.
lib/Activiti/Rest/Client.pm view on Meta::CPAN
sub deployment_resource {
my($self,%args)=@_;
my $res = $self->ua->request(
path => "/repository/deployments/".uri_escape($args{deploymentId})."/resources/".uri_escape($args{resourceId}),
params => {},
method => "GET"
);
Activiti::Rest::Response->from_http_response($res);
}
=head2 process_definitions
List of process definitions
parameters: see user guide (http://www.activiti.org/userguide/index.html#N13520)
equal to rest call:
GET repository/process-definitions
=cut
sub process_definitions {
my($self,%args)=@_;
my $res = $self->ua->request(
path => "/repository/process-definitions",
params => \%args,
method => "GET"
);
Activiti::Rest::Response->from_http_response($res);
}
=head2 process_definition
Get a process definition
parameters:
processDefinitionId
other parameters: see user guide (http://www.activiti.org/userguide/index.html#N13605)
equal to rest call:
GET repository/process-definitions/:processDefinitionId
=cut
sub process_definition {
my($self,%args)=@_;
my $res = $self->ua->request(
path => "/repository/process-definitions/".uri_escape($args{processDefinitionId}),
params => {},
method => "GET"
);
Activiti::Rest::Response->from_http_response($res);
}
=head2 process_definition_resource_data
Get a process definition resource content
parameters:
processDefinitionId
equal to rest call:
GET repository/process-definitions/:processDefinitionId/resourcedata
=cut
sub process_definition_resource_data {
my($self,%args)=@_;
my $res = $self->ua->request(
path => "/repository/process-definitions/".uri_escape($args{processDefinitionId})."/resourcedata",
params => {},
method => "GET"
);
Activiti::Rest::Response->from_http_response($res);
}
=head2 process_definition_model
Get a process definition BPMN model
parameters:
processDefinitionId
equal to rest call:
GET repository/process-definitions/:processDefinitionId/model
=cut
sub process_definition_model {
my($self,%args)=@_;
my $res = $self->ua->request(
path => "/repository/process-definitions/".uri_escape($args{processDefinitionId})."/model",
params => {},
method => "GET"
);
Activiti::Rest::Response->from_http_response($res);
}
=head2 process_definition_identity_links
Get all candidate starters for a process-definition
parameters:
processDefinitionId
equal to rest call:
GET repository/process-definitions/:processDefinitionId/identitylinks
=cut
sub process_definition_identity_links {
my($self,%args)=@_;
my $res = $self->ua->request(
path => "/repository/process-definitions/".uri_escape($args{processDefinitionId})."/identitylinks",
params => {},
method => "GET"
);
Activiti::Rest::Response->from_http_response($res);
}
=head2 process_definition_identity_link
Get a candidate starter from a process definition
parameters: (see http://www.activiti.org/userguide/index.html#N138A9)
processDefinitionId
family
identityId
equal to rest call:
GET repository/process-definitions/:processDefinitionId/identitylinks/:family/:identityId
=cut
sub process_definition_identity_link {
my($self,%args)=@_;
my $res = $self->ua->request(
path => "/repository/process-definitions/".uri_escape($args{processDefinitionId})."/identitylinks/".uri_escape($args{family})."/".uri_escape($args{identityId}),
params => {},
method => "GET"
);
Activiti::Rest::Response->from_http_response($res);
}
=head2 models
Get a list of models
Parameters: see user guide (http://www.activiti.org/userguide/index.html#N1390A)
lib/Activiti/Rest/Client.pm view on Meta::CPAN
sub model {
my($self,%args)=@_;
my $res = $self->ua->request(
path => "/repository/models/".uri_escape($args{modelId}),
params => {},
method => "GET"
);
Activiti::Rest::Response->from_http_response($res);
}
=head2 process_instances
List of process instances
Parameters: see user guide (http://www.activiti.org/userguide/index.html#restProcessInstancesGet)
equal to rest call:
GET runtime/process-instances
=cut
sub process_instances {
my($self,%args)=@_;
my $res = $self->ua->request(
path => "/runtime/process-instances",
params => \%args,
method => "GET"
);
Activiti::Rest::Response->from_http_response($res);
}
=head2 process_instance
Get a process instance
Parameters:
processInstanceId
equal to rest call:
GET runtime/process-instances/:processInstanceId
=cut
sub process_instance {
my($self,%args)=@_;
my $res = $self->ua->request(
path => "/runtime/process-instances/".uri_escape($args{processInstanceId}),
params => {},
method => "GET"
);
Activiti::Rest::Response->from_http_response($res);
}
sub delete_process_instance {
my($self,%args)=@_;
my $res = $self->ua->request(
path => "/runtime/process-instances/".uri_escape($args{processInstanceId}),
params => { deleteReason => $args{deleteReason} },
method => "DELETE"
);
Activiti::Rest::Response->from_http_response($res);
}
sub suspend_process_instance {
my($self,%args)=@_;
my $res = $self->ua->request(
path => "/runtime/process-instances/".uri_escape($args{processInstanceId}),
params => {},
headers => {
'Content-Type' => "application/json",
Content => encode_json({ action => "suspend" })
},
method => "PUT"
);
Activiti::Rest::Response->from_http_response($res);
}
sub activate_process_instance {
my($self,%args)=@_;
my $res = $self->ua->request(
path => "/runtime/process-instances/".uri_escape($args{processInstanceId}),
params => {},
headers => {
'Content-Type' => "application/json",
Content => encode_json({ action => "activate" })
},
method => "PUT"
);
Activiti::Rest::Response->from_http_response($res);
}
=head2 query_process_instances
Query process instances
Parameters: see user guide (http://www.activiti.org/userguide/index.html#N13E2A)
equal to rest call:
POST runtime/process-instances
=cut
sub query_process_instances {
my($self,%args)=@_;
my $res = $self->ua->request(
path => "/query/process-instances",
params => {},
method => "POST",
headers => {
'Content-Type' => "application/json",
Content => encode_json($args{content})
}
);
Activiti::Rest::Response->from_http_response($res);
}
=head2 start_process_instance
Start a process instance
Parameters: see user guide (http://www.activiti.org/userguide/index.html#N13CE6)
equal to rest call:
POST runtime/process-instances
=cut
sub start_process_instance {
my($self,%args)=@_;
my $res = $self->ua->request(
path => "/runtime/process-instances",
params => {},
method => "POST",
headers => {
'Content-Type' => "application/json",
Content => encode_json($args{content})
}
);
Activiti::Rest::Response->from_http_response($res);
}
=head2 process_instance_identitylinks
Get involved people for process instance
Parameters:
processInstanceId
equal to rest call:
GET runtime/process-instances/:processInstanceId/identitylinks
=cut
sub process_instance_identitylinks {
my($self,%args)=@_;
my $res = $self->ua->request(
path => "/runtime/process-instances/".uri_escape($args{processInstanceId})."/identitylinks",
params => {},
method => "GET"
);
Activiti::Rest::Response->from_http_response($res);
}
=head2 process_instance_variables
List of variables for a process instance
Parameters:
processInstanceId
equal to rest call:
GET runtime/process-instances/:processInstanceId/variables
=cut
sub process_instance_variables {
my($self,%args)=@_;
my $res = $self->ua->request(
path => "/runtime/process-instances/".uri_escape($args{processInstanceId})."/variables",
params => {},
method => "GET"
);
Activiti::Rest::Response->from_http_response($res);
}
=head2 process_instance_variable
Get a variable for a process instance
Parameters:
processInstanceId
variableName
equal to rest call:
GET runtime/process-instances/:processInstanceId/variables/:variableName
=cut
sub process_instance_variable {
my($self,%args)=@_;
my $res = $self->ua->request(
path => "/runtime/process-instances/".uri_escape($args{processInstanceId})."/variables/".uri_escape($args{variableName}),
params => {},
method => "GET"
);
Activiti::Rest::Response->from_http_response($res);
}
sub update_process_instance_variable {
my($self,%args)=@_;
my $res = $self->ua->request(
path => "/runtime/process-instances/".uri_escape($args{processInstanceId})."/variables/".uri_escape($args{variableName}),
params => {},
method => "PUT",
headers => {
'Content-Type' => "application/json",
Content => encode_json($args{content})
}
);
Activiti::Rest::Response->from_http_response($res);
}
#DEPRECATED!
sub signal_process_instance {
my($self,%args)=@_;
my $res = $self->ua->request(
path => "/process-instance/".uri_escape($args{processInstanceId})."/signal",
params => {},
method => "POST",
headers => {
'Content-Type' => "application/json",
Content => encode_json($args{content})
}
);
Activiti::Rest::Response->from_http_response($res);
}
=head2 process_instance_diagram
Get a diagram for a process instance
Parameters:
processInstanceId
equal to rest call:
GET runtime/process-instances/:processInstanceId/diagram
when successfull the "content_type" of the response is "image/png" and "content" is equal to the image data
=cut
#return: png image data
sub process_instance_diagram {
my($self,%args)=@_;
my $res = $self->ua->request(
path => "/runtime/process-instances/".uri_escape($args{processInstanceId})."/diagram",
params => {},
method => "GET"
);
Activiti::Rest::Response->from_http_response($res);
}
=head2 executions
List of executions
Parameters: see user guide (http://www.activiti.org/userguide/index.html#restExecutionsGet)
lib/Activiti/Rest/Client.pm view on Meta::CPAN
sub task_attachment_content {
my($self,%args)=@_;
my $res = $self->ua->request(
path => "/runtime/tasks/".uri_escape($args{taskId})."/attachments/".uri_escape($args{attachmentId})."/content",
params => {},
method => "GET"
);
Activiti::Rest::Response->from_http_response($res);
}
=head2 historic_process_instances
List of historic process instances
Parameters: see user guide (http://www.activiti.org/userguide/index.html#restHistoricProcessInstancesGet)
equal to rest call:
GET history/historic-process-instances
=cut
sub historic_process_instances {
my($self,%args)=@_;
my $res = $self->ua->request(
path => "/history/historic-process-instances",
params => \%args,
method => "GET"
);
Activiti::Rest::Response->from_http_response($res);
}
=head2 query_historic_process_instances
Query for historic process instances
Parameters: see user guide (http://www.activiti.org/userguide/index.html#N153C2)
equal to rest call:
POST history/historic-process-instances
=cut
sub query_historic_process_instances {
my($self,%args)=@_;
my $res = $self->ua->request(
path => "/query/historic-process-instances",
params => {},
method => "POST",
headers => {
'Content-Type' => "application/json",
Content => encode_json($args{content})
}
);
Activiti::Rest::Response->from_http_response($res);
}
=head2 historic_process_instance
Get a historic process instance
Parameters:
processInstanceId
equal to rest call:
GET history/historic-process-instances/:processInstanceId
=cut
sub historic_process_instance {
my($self,%args)=@_;
my $res = $self->ua->request(
path => "/history/historic-process-instances/".uri_escape($args{processInstanceId}),
params => {},
method => "GET"
);
Activiti::Rest::Response->from_http_response($res);
}
=head2 delete_historic_process_instance
Delete a historic process instance
Parameters:
processInstanceId
equal to rest call:
DELETE history/historic-process-instances/:processInstanceId
=cut
sub delete_historic_process_instance {
my($self,%args)=@_;
my $res = $self->ua->request(
path => "/history/historic-process-instances/".uri_escape($args{processInstanceId}),
params => {},
method => "DELETE"
);
Activiti::Rest::Response->from_http_response($res);
}
=head2 historic_process_instance_comments
Get all comments on a historic process instance
Parameters:
processInstanceId
equal to rest call:
GET history/historic-process-instances/:processInstanceId/comments
=cut
sub historic_process_instance_comments {
my($self,%args)=@_;
my $res = $self->ua->request(
path => "/history/historic-process-instances/".uri_escape($args{processInstanceId})."/comments",
params => {},
method => "GET"
);
Activiti::Rest::Response->from_http_response($res);
}
=head2 historic_process_instance_comment
Get a comment on a historic process instance
Parameters:
processInstanceId
commentId
equal to rest call:
GET history/historic-process-instances/:processInstanceId/comments/:commentId
=cut
sub historic_process_instance_comment {
my($self,%args)=@_;
my $res = $self->ua->request(
path => "/history/historic-process-instances/".uri_escape($args{processInstanceId})."/comments/".uri_escape($args{commentId}),
params => {},
method => "GET"
);
Activiti::Rest::Response->from_http_response($res);
}
=head2 historic_task_instances
Get historic task instances
Parameters: see user guide (http://www.activiti.org/userguide/index.html#restHistoricTaskInstancesGet)
lib/Activiti/Rest/Client.pm view on Meta::CPAN
my($self,%args)=@_;
my $res = $self->ua->request(
path => "/history/historic-task-instances",
params => \%args,
method => "GET"
);
Activiti::Rest::Response->from_http_response($res);
}
=head2 historic_variable_instances
Get historic variable instances, either from tasks or process instances
Parameters: see user guide (http://www.activiti.org/userguide/index.html#restHistoricVariableInstancesGet)
equal to rest call:
GET history/historic-variable-instances
=cut
sub historic_variable_instances {
my($self,%args) = @_;
my $res = $self->ua->request(
path => "/history/historic-variable-instances",
params => \%args,
method => "GET"
);
Activiti::Rest::Response->from_http_response($res);
}
=head2 query_historic_variable_instances
Query historic variable instances, either from tasks or process instances
Parameters: see user guide (http://www.activiti.org/userguide/index.html#N15B00)
equal to rest call:
POST query/historic-variable-instances
=cut
sub query_historic_variable_instances {
lib/Activiti/Rest/Response.pm view on Meta::CPAN
error_message => $exception,
exception => $exception
};
#The operation failed. The operation requires an Authentication header to be set. If this was present in the request, the supplied credentials are not valid or the user is not authorized to perform this operation.
if($code eq "401"){
Activiti::Rest::Error::UnAuthorized->throw($args);
}
#The operation is forbidden and should not be re-attempted. This does not imply an issue with authentication not authorization, it's an operation that is not allowed. Example: deleting a task that is part of a running process is not allowed and w...
elsif($code eq "403"){
Activiti::Rest::Error::Forbidden->throw($args);
}
#The operation failed.The requested resource was not found.
elsif($code eq "404"){
Activiti::Rest::Error::NotFound->throw($args);
}
#The operation failed. The used method is not allowed for this resource. Eg. trying to update (PUT) a deployment-resource will result in a 405 status.
test/delete_process_instance.pl view on Meta::CPAN
use lib "$FindBin::Bin/../lib";
use Activiti::Rest::Client;
use Data::Dumper;
binmode STDOUT,":utf8";
my $client = Activiti::Rest::Client->new(
url => 'http://rest:rest@andric.ugent.be:8888/activiti-rest/service'
);
my $res = $client->delete_historic_process_instance(processInstanceId => 418);
print Dumper($res->parsed_content);
test/form.pl view on Meta::CPAN
use lib "$FindBin::Bin/../lib";
use Activiti::Rest::Client;
use Data::Dumper;
binmode STDOUT,":utf8";
my $client = Activiti::Rest::Client->new(
url => 'http://kermit:kermit@localhost:8080/activiti-rest/service'
);
my $form = $client->form(processDefinitionId => "vacationRequest:1:33")->parsed_content;
print Dumper($form);
test/process_definitions.pl view on Meta::CPAN
use lib "$FindBin::Bin/../lib";
use Activiti::Rest::Client;
use Data::Dumper;
binmode STDOUT,":utf8";
my $client = Activiti::Rest::Client->new(
url => 'http://kermit:kermit@localhost:8080/activiti-rest/service'
);
my $res = $client->process_definitions;
die("no parsed content") unless $res->has_parsed_content;
my $pdefs = $res->parsed_content;
my @ids = map { $_->{id} } @{ $pdefs->{data} };
for my $id(@ids){
print Dumper($client->process_definition(processDefinitionId => $id)->parsed_content);
}
test/process_definitions_ids.pl view on Meta::CPAN
use lib "$FindBin::Bin/../lib";
use Activiti::Rest::Client;
use Data::Dumper;
binmode STDOUT,":utf8";
my $client = Activiti::Rest::Client->new(
url => 'http://kermit:kermit@localhost:8080/activiti-rest/service'
);
my $pdefs = $client->process_definitions->parsed_content;
print $_."\n" for map { $_->{id} } @{ $pdefs->{data} };
test/process_definitions_resourcedata.pl view on Meta::CPAN
use lib "$FindBin::Bin/../lib";
use Activiti::Rest::Client;
use Data::Dumper;
binmode STDOUT,":utf8";
my $client = Activiti::Rest::Client->new(
url => 'http://kermit:kermit@localhost:8080/activiti-rest/service'
);
my $pdefs = $client->process_definitions->parsed_content;
my @ids = map { $_->{id} } @{ $pdefs->{data} };
for my $id(@ids){
print $client->process_definition_resource_data(processDefinitionId => $id)->parsed_content;
}
test/query_process_instances.pl view on Meta::CPAN
use lib "$FindBin::Bin/../lib";
use Activiti::Rest::Client;
use Data::Dumper;
binmode STDOUT,":utf8";
my $client = Activiti::Rest::Client->new(
url => 'http://rest:rest@andric.ugent.be:8888/activiti-rest/service'
);
my $res = $client->query_process_instances(
content => {
"processDefinitionKey" => "CustomerRequest",
includeProcessVariables => "true",
"variables" => [],
processInstanceId => 418
# [
# {
# "name" => "lastname";
# "value" => "Spillemaeckers";
# "operation" => "equals";
# "type" => "string"
# }
# ]
}
);
test/query_tasks.pl view on Meta::CPAN
use Data::Dumper;
binmode STDOUT,":utf8";
my $client = Activiti::Rest::Client->new(
url => 'http://rest:rest@andric.ugent.be:8888/activiti-rest/service'
);
my $res = $client->query_tasks(
content => {
# "processDefinitionKey" => "CustomerRequest",
# includeProcessVariables => "true",
candidateGroup => "LWBIB"
#processInstanceId => 418
# processInstanceVariables => [
# {
# "name" => "library",
# "value" => "BIB",
# "operation" => "equals",
# "type" => "string"
# }
# ]
}
);