QPR ProcessAnalyzer API: Difference between revisions

From QPR ProcessAnalyzer Wiki
Jump to navigation Jump to search
 
(90 intermediate revisions by the same user not shown)
Line 1: Line 1:
QPR ProcessAnalyzer has two API: REST-based '''Web API''' and '''WCF API'''. Prefer the Web API, because WCF API is a legacy API that will be removed from the product in future.
QPR ProcessAnalyzer API can be used to build integrations with other applications and automate operations in the process mining system.
== Web API ==
* [[Web_API:_Token|Token]] (login)
* [[Web_API:_Signout|Sign out]]
* [[Web_API:_Analysis|Analysis]] (run query)
* [[Web_API:_Cancel|Cancel]]
* [[Web_API:_Filters|Filters]]


== WCF API ==
QPR ProcessAnalyzer API is a JSON based API following the REST design principles. All methods (except the [[Web_API:_Token|token]] and [[Web_API:_Serverinfo|serverinfo]]) require a prior login to establish a session. The session is initialized with the [[Web_API:_Token|token]] call with username and password, and the access token is returned as a response for a successful login. The methods requiring prior authenticated session, need to have a HTTP request header ''Authorization'' with value ''Bearer <access token>'' to identify the session.
QPR ProcessAnalyzer WCF Web Service API (Application Programming Interface) can be used to automate operations and to create integration with other applications. All Web Service operations only accept HTTP POST method (HTTP GET is not allowed). QPR ProcessAnalyzer WCF Web Service API can be used with wsHttp (SOAP) and webHttp endpoints. The following methods are available in the WCF Web Service API:
* [[QPR ProcessAnalyzer API: Authenticate|Authenticate]]: Tries to authenticate given user with given password and authentication parameters.
* [[QPR ProcessAnalyzer API: CancelQueryOperation|CancelQueryOperation]]: Cancels running operation using query identifier.
* [[QPR ProcessAnalyzer API: DeleteModel|DeleteModel]]: Deletes a model.
* [[QPR ProcessAnalyzer API: DeleteProject|DeleteProject]]: Deletes a project.
* [[QPR ProcessAnalyzer API: GetAnalysis|GetAnalysis]]: Calculates and returns QPR ProcessAnalyzer analysis.
* [[QPR ProcessAnalyzer API: GetAnalysisImageAsByteArray|GetAnalysisImageAsByteArray]]: Get [[Flowchart_Analysis|Flowchart Analysis]] as image.
* [[QPR ProcessAnalyzer API: GetModel|GetModel]]: Can be used to query QPR ProcessAnalyzer model data.
* [[QPR ProcessAnalyzer API: GetModels|GetModels]]: Can be used to query QPR ProcessAnalyzer model related information.
* [[QPR ProcessAnalyzer API: GetModelAsStream|GetModelAsStream]]: Exports a model or a filtered data as a .pacm file.
* [[QPR ProcessAnalyzer API: GetStream|GetStream]] can be used to query contents of a stream bound to the given session identified by given stream id.
* [[QPR ProcessAnalyzer API: GetUsers|GetUsers]]: can be used to get user related information.
* [[QPR ProcessAnalyzer API: ImportModelFromStream|ImportModelFromStream]]: Import data to QPR ProcessAnalyzer.
* [[QPR ProcessAnalyzer API: LogOff|LogOff]]: Logs off the user session.
* [[QPR ProcessAnalyzer API: QueryObjectProperties|QueryObjectProperties]] returns all the listed properties queried for all the listed objects identified by unique identifiers.
* [[QPR ProcessAnalyzer API: ResetModelCache|ResetModelCache]]: Can be used to clear all cached model information of the given model.
* [[QPR ProcessAnalyzer API: RunScript|RunScript]] can be used to execute given PA script using given parameters.
* [[QPR ProcessAnalyzer API: SetModel|SetModel]]: Can be used to set model related information.
* [[QPR ProcessAnalyzer API: SetUser|SetUser]]: Can be used to set user information.
* [[QPR ProcessAnalyzer API: ValidateModel|ValidateModel]] can be used to perform all the pending tasks stored in the work queue of the given model.
* [[QPR ProcessAnalyzer API: GetUserPermissions|GetUserPermissions]] can be used to query permissions given user has for a set of objects.
* [[QPR ProcessAnalyzer API: ModifyUserRelations|ModifyUserRelations]] can be used to modify permissions given user.
* [[QPR ProcessAnalyzer API: GetUserRoles|GetUserRoles]] can be used to get available user roles.


== WCF API Usage Examples ==
Url for calling the API has the following form (replace the server hostname with a correct one):
=== JavaScript Examples ===
<pre>
<pre>
//login               
https://customer.onqpr.com/qprpa/api/<methodName>
$.ajax({
  "method": "POST",
  "url": "http://localhost/qprpa/Mainservice.svc/webHttp/Authenticate",
  "dataType": "json", "contentType": "application/json; charset=utf-8",
  "data": JSON.stringify({
    'logOnName': '<username>',
    'password': '<password>',
    'parameters': ''
  })
});                     
</pre>
</pre>


<pre>
Following methods are available:
//create user
{| class="wikitable"
$.ajax({
!'''Method'''
  "method": "POST",
! '''Description'''
  "url": "http://localhost/qprpa/Mainservice.svc/webHttp/SetUser",
|-
  "dataType": "json", "contentType": "application/json; charset=utf-8",
||[[Web_API:_Token|token]]
  "data": JSON.stringify({
||Login user using username and password and get a session token as a response.
    "sessionId": sessionId,
|-
    "user": {"Name": "user", "FullName": "first last" },
||[[Web_API:_Signout|api/signout]]
    "parameters": [{"Key": "Password", "Value": "demo"}]
||Logs out a user session.
  })
|-
});
||[[Web_API:_Expression|api/expression]]
</pre>
||Runs an expression.
|-
||[[Web_API:_Expression/query|api/expression/query]]
||Runs query written using the expression language and returns result data as response.
|-
||[[Web_API:_Filters|api/filters]]
||Get filters for all models or filters for a single model.
|-
||[[Web_API:_Serverinfo|api/serverinfo]]
||Returns common system information needed by UI, such as the default UI language and in whether SSO has been configured.
|-
||[[Web_API:_Importfile|api/importfile]]
||Import data into datatable from .csv, .xes or .pacm file.
|-
||[[Web_API:_Usersettings|api/usersettings]]
||Save user specific settings to the server.
|-
||[[Web_API:_Operations/terminate|api/operations/terminate]]
||Stops the defined tasks (by the task id) to save computing resources.
|-
||[[Web_API:_Cancel|api/analysis/cancel]]
||Stops currently running tasks (by the task identifier) to save computing resources.
|-
||[[Web_API:_saml2/acs|api/saml2/acs]]
||Identity provider (IdP) will send the SAML 2.0 assertion to this endpoint, which responses with 302 to redirect to QPR ProcessAnalyzer UI.
|-
||[[Web_API:_saml2|api/saml2]]
||Returns the SAML 2.0 service provider (SP) metadata, if SAML 2.0 authentication has been configured.
|}
 
In addition, there are methods for
* [[Web API for Workspace Elements|moving and deleting workspace elements]]
* [[Web_API_for_Projects|projects]]
* [[Web_API_for_Dashboards|dashboards]]
* [[Web_API_for_Models|models]]
* [[Web_API_for_Datatables|datatables]]
* [[Web_API_for_Scripts|scripts]]
* [[Web_API_for_User_Management|users, groups and roles]]


<pre>
== Examples ==
//add user to group, value 8:12:0 is user:group:member type
=== Trigger script run ===
$.ajax({
Following function written in Python starts a script in QPR ProcessAnalyzer by calling the REST API. The function does following: (1) login to QPR ProcessAnalyzer, (2) start the script, and (3) log out. The call just starts the script without waiting for it to complete (asynchronous behavior).
  "method": "POST",
  "url": "http://localhost/qprpa/Mainservice.svc/webHttp/ModifyUserRelations",
  "dataType": "json", "contentType": "application/json; charset=utf-8",
  "data": JSON.stringify({
    "sessionId": sessionId,
    "parameters": [{"Key": "AddGroups", "Value": "8:12:0"}]
  })
});
</pre>


<pre>
<syntaxhighlight lang="python" line>
//log off
def startQprProcessAnalyzerScript(serverUrl: str, username: str, password: str, scriptId: int):
$.ajax({
  loginData = {
  "method": "POST",
    "grant_type": "password",
  "url": "http://localhost/qprpa/Mainservice.svc/webHttp/LogOff",
    "username": username,
  "dataType": "json", "contentType": "application/json; charset=utf-8",
    "password": password
  "data": JSON.stringify({
  }
     "sessionId": sessionId
  loginResponse = requests.post(
   })
    url = serverUrl + "/token",
});
    data = loginData
</pre>
  )
  loginResponse.raise_for_status()
  sessionToken = loginResponse.json().get("access_token")
 
  startScriptResponse = requests.post(
    url = serverUrl + "/api/scripts/run/" + str(scriptId),
    headers = {
      "Authorization": "Bearer " + sessionToken,
      "Content-type": "application/json"
     }
   )
  startScriptResponse.raise_for_status()


=== PowerShell Examples ===
  logOutResponse = requests.post(
==== [[Move Data from QPR ProcessAnalyzer to Database using PowerShell]] ====
    url = serverUrl + "/api/signout",
==== List Users ====
    headers = {
<pre>
      "Authorization": "Bearer " + sessionToken,
$paService=New-WebServiceProxy –Uri "http://localhost/qprpa/MainService.svc"
      "Content-type": "application/json"
$connection=$paService.Authenticate("username", "password", @())
    }
$token=$connection.GetValue(0).Value
  )
  logOutResponse.raise_for_status()
</syntaxhighlight>


$param=@()
The function can be called as follows:
$users=$paService.GetUsers($token, $null, $param)
<syntaxhighlight lang="python" line>
$users
startQprProcessAnalyzerScript(
$paService | get-member | ? {$_.definition -match "GetAnalysis"}
  serverUrl = "https://server.onqpr.com/qprpa",
</pre>
  username = "qpr",
  password = "demo",
  scriptId = 1
)
</syntaxhighlight>
The script id can be found in the scripts list in the Workspace.


==== Update Model Configuration ====
=== Synchronize users and groups ===
<pre>
Following script written in Python updates QPR ProcessAnalyzer users and groups based on the provided dataset. This script can be extended to fetch the user data from an external source (e.g., Azure AD) to implement a complete user management integration between the systems.
$paService=New-WebServiceProxy –Uri "http://localhost/qprpa/MainService.svc"
$connection=$paService.Authenticate("username", "password", @())
$token=$connection.GetValue(0).Value
$param=@()
$modelId=@(2)
$model=$paService.GetModels($token,$modelId, $param)


$model[0]
This script performs following steps:
$model[0].ConfigurationJson = "{}"
# Read the provided dataset and store it to in-memory structures.
# Read all users from QPR ProcessAnalyzer (including which groups the users belong to). (POST /api/expression/query)
# Read all groups from QPR ProcessAnalyzer. (POST /api/expression/query)
# Determine the gap between the current state in the user management and the provided dataset.
# Create new users appearing in the dataset to QPR ProcessAnalyzer. (POST /api/users)
# Inactivate non-existing users in the dataset from QPR ProcessAnalyzer. (PUT /api/users)
# Activate existing inactive users in QPR ProcessAnalyzer that exist in the dataset. (PUT /api/users)
# Add users to groups and remove from groups based on the determined gap in the state. (PUT/DELETE /api/users/memberships)


$paService.SetModel($token,$model[0], $param)
Users are queried as follows:
<pre>
{
  "Dimensions": null,
  "Values": [
      {
        "Name": "Id",
        "Expression": "Id"
      },
      {
        "Name": "Name",
        "Expression": "Name"
      },
      {
        "Name": "IsActive",
        "Expression": "IsActive"
      },
      {
        "Name": "Groups",
        "Expression": "ToJson(OrderByValue(Groups.Id))"
      }
  ],
  "Root": "Users",
  "ContextType": "generic"
}
</pre>
</pre>


==== Get Flowchart Image ====
Groups are queried as follows:
<pre>
<pre>
$paService=New-WebServiceProxy –Uri "http://localhost/qprpa/MainService.svc" -Namespace "WebServiceProxy" -Class "PaService"
{
$connection=$paService.Authenticate("username", "password", @())
  "Dimensions": null,
$token=$connection.GetValue(0).Value
  "Values": [
      {
        "Name": "Id",
        "Expression": "Id"
      },
      {
        "Name": "Name",
        "Expression": "Name"
      }
  ],
  "Root": "UserGroups",
  "ContextType": "generic"
}
</pre>


$ids = new-object WebServiceProxy.ModelViewId
Request /api/users/memberships body:
$ids.ViewId = 13
<pre>
$ids.ViewIdSpecified = 1
{
  "GroupId": 1,
  "MemberId": 2,
  "RoleName": "Member"
}
</pre>


$analysisType = 0
<syntaxhighlight lang="python" line>
$processAnalysisType = 4
...
$minTransitionPercentage = 0.0
</syntaxhighlight>


$png=  $paService.GetAnalysisImageAsByteArray($token, $ids,  $analysisType,1,  $processAnalysisType,1 , $minTransitionPercentage,1)
__NOTOC__
[IO.File]::WriteAllBytes('c:\tmp\image.png', $png)
</pre>


__NOTOC__
[[Category: QPR ProcessAnalyzer]]

Latest revision as of 19:04, 13 October 2024

QPR ProcessAnalyzer API can be used to build integrations with other applications and automate operations in the process mining system.

QPR ProcessAnalyzer API is a JSON based API following the REST design principles. All methods (except the token and serverinfo) require a prior login to establish a session. The session is initialized with the token call with username and password, and the access token is returned as a response for a successful login. The methods requiring prior authenticated session, need to have a HTTP request header Authorization with value Bearer <access token> to identify the session.

Url for calling the API has the following form (replace the server hostname with a correct one):

https://customer.onqpr.com/qprpa/api/<methodName>

Following methods are available:

Method Description
token Login user using username and password and get a session token as a response.
api/signout Logs out a user session.
api/expression Runs an expression.
api/expression/query Runs query written using the expression language and returns result data as response.
api/filters Get filters for all models or filters for a single model.
api/serverinfo Returns common system information needed by UI, such as the default UI language and in whether SSO has been configured.
api/importfile Import data into datatable from .csv, .xes or .pacm file.
api/usersettings Save user specific settings to the server.
api/operations/terminate Stops the defined tasks (by the task id) to save computing resources.
api/analysis/cancel Stops currently running tasks (by the task identifier) to save computing resources.
api/saml2/acs Identity provider (IdP) will send the SAML 2.0 assertion to this endpoint, which responses with 302 to redirect to QPR ProcessAnalyzer UI.
api/saml2 Returns the SAML 2.0 service provider (SP) metadata, if SAML 2.0 authentication has been configured.

In addition, there are methods for

Examples

Trigger script run

Following function written in Python starts a script in QPR ProcessAnalyzer by calling the REST API. The function does following: (1) login to QPR ProcessAnalyzer, (2) start the script, and (3) log out. The call just starts the script without waiting for it to complete (asynchronous behavior).

def startQprProcessAnalyzerScript(serverUrl: str, username: str, password: str, scriptId: int):
  loginData = {
    "grant_type": "password",
    "username": username,
    "password": password
  }
  loginResponse = requests.post(
    url = serverUrl + "/token",
    data = loginData
  )
  loginResponse.raise_for_status()
  sessionToken = loginResponse.json().get("access_token")
  
  startScriptResponse = requests.post(
    url = serverUrl + "/api/scripts/run/" + str(scriptId),
    headers = {
      "Authorization": "Bearer " + sessionToken,
      "Content-type": "application/json"
    }
  )
  startScriptResponse.raise_for_status()

  logOutResponse = requests.post(
    url = serverUrl + "/api/signout",
    headers = {
      "Authorization": "Bearer " + sessionToken,
      "Content-type": "application/json"
    }
  )
  logOutResponse.raise_for_status()

The function can be called as follows:

startQprProcessAnalyzerScript(
  serverUrl = "https://server.onqpr.com/qprpa",
  username = "qpr",
  password = "demo",
  scriptId = 1
)

The script id can be found in the scripts list in the Workspace.

Synchronize users and groups

Following script written in Python updates QPR ProcessAnalyzer users and groups based on the provided dataset. This script can be extended to fetch the user data from an external source (e.g., Azure AD) to implement a complete user management integration between the systems.

This script performs following steps:

  1. Read the provided dataset and store it to in-memory structures.
  2. Read all users from QPR ProcessAnalyzer (including which groups the users belong to). (POST /api/expression/query)
  3. Read all groups from QPR ProcessAnalyzer. (POST /api/expression/query)
  4. Determine the gap between the current state in the user management and the provided dataset.
  5. Create new users appearing in the dataset to QPR ProcessAnalyzer. (POST /api/users)
  6. Inactivate non-existing users in the dataset from QPR ProcessAnalyzer. (PUT /api/users)
  7. Activate existing inactive users in QPR ProcessAnalyzer that exist in the dataset. (PUT /api/users)
  8. Add users to groups and remove from groups based on the determined gap in the state. (PUT/DELETE /api/users/memberships)

Users are queried as follows:

{
   "Dimensions": null,
   "Values": [
      {
         "Name": "Id",
         "Expression": "Id"
      },
      {
         "Name": "Name",
         "Expression": "Name"
      },
      {
         "Name": "IsActive",
         "Expression": "IsActive"
      },
      {
         "Name": "Groups",
         "Expression": "ToJson(OrderByValue(Groups.Id))"
      }
   ],
   "Root": "Users",
   "ContextType": "generic"
}

Groups are queried as follows:

{
   "Dimensions": null,
   "Values": [
      {
         "Name": "Id",
         "Expression": "Id"
      },
      {
         "Name": "Name",
         "Expression": "Name"
      }
   ],
   "Root": "UserGroups",
   "ContextType": "generic"
}

Request /api/users/memberships body:

{
  "GroupId": 1,
  "MemberId": 2,
  "RoleName": "Member"
}
...