Skip to main content
Announcements
Qlik Connect 2024! Seize endless possibilities! LEARN MORE
cancel
Showing results for 
Search instead for 
Did you mean: 
joshuapierlo
Partner - Contributor II
Partner - Contributor II

Changing Appowner trough REST API

Hello everyone,

We are trying to set up a change-owner script that allows us to import apps including meta data. The scenario is as follows: User imports an app, if there's metadata available (includes stream data and owner data), it checks wether the owner in the metadata exists in the current Qlik Environment. If so: It should change the owner.

Now I'm using this endpoint:

await _qrsClient.Put("/qrs/Selection/" + appID + "/App/synthetic?xrfkey=ABCDEFG123456789", content.ToString());

- appID = the id of the App to be changed.

- content (body)=

 {[
{
"LatestModifiedDate": "2018-11-22T12:00:58.097Z",
"properties": {
"name": "owner",
"value": "a9d40139-cd13-467a-9147-ab167c51685a",
"valueIsModified": true
},
"type": "App"
}
]}

 

However, I get the following error:

The remote server returned an error: (400) Bad Request.

 

Could anyone point us in the right direction here?

Labels (3)
1 Solution

Accepted Solutions
Levi_Turner
Employee
Employee

Sure @joshuapierlo,

I'm going to abstract away from your particular code and point to the generic approach.

Get the details of the app we want to change: GET /qrs/app/055e0e8d-0f10-4d22-a175-62b05143347a

Response:

{
  "id": "055e0e8d-0f10-4d22-a175-62b05143347a",
  "createdDate": "2018-11-23T17:48:27.321Z",
  "modifiedDate": "2018-11-23T17:49:26.141Z",
  "modifiedByUserName": "QTSEL\\ltu",
  "customProperties": [],
  "owner": {
    "id": "5334b296-493b-46ee-b621-79ba238ceb2c",
    "userId": "sa_repository",
    "userDirectory": "INTERNAL",
    "name": "sa_repository",
    "privileges": null
  },
  "name": "AppOwnerChangeDemo",
  "appId": "",
  "sourceAppId": "00000000-0000-0000-0000-000000000000",
  "targetAppId": "00000000-0000-0000-0000-000000000000",
  "publishTime": "1753-01-01T00:00:00Z",
  "published": false,
  "tags": [],
  "description": "",
  "stream": null,
  "fileSize": 145970,
  "lastReloadTime": "2018-07-24T13:14:06.545Z",
  "thumbnail": "",
  "savedInProductVersion": "12.108.7",
  "migrationHash": "98d482c3f964dccf69cbfb9a00e0c048ea6eb221",
  "dynamicColor": "",
  "availabilityStatus": 0,
  "privileges": null,
  "schemaPath": "App"
}

With this, we can see that the owner information is stored as an array inside the response.

Getting different user details (GET /qrs/user/full?filter=(name eq 'sa_api')😞

  {
    "id": "4b7a27e5-f1db-4cc2-be59-7c4086f7c1f6",
    "createdDate": "2017-05-06T00:54:59.921Z",
    "modifiedDate": "2017-05-06T00:54:59.921Z",
    "modifiedByUserName": "INTERNAL\\bootstrap",
    "customProperties": [],
    "userId": "sa_api",
    "userDirectory": "INTERNAL",
    "name": "sa_api",
    "roles": [],
    "attributes": [],
    "inactive": false,
    "removedExternally": false,
    "blacklisted": false,
    "deleteProhibited": false,
    "tags": [],
    "privileges": null,
    "schemaPath": "User"
  }



Now changing the owner of the original app: PUT /qrs/app/055e0e8d-0f10-4d22-a175-62b05143347a

Body:

{
  "id": "055e0e8d-0f10-4d22-a175-62b05143347a",
  "createdDate": "2018-11-23T17:48:27.321Z",
  "modifiedDate": "2018-11-23T17:49:26.141Z",
  "modifiedByUserName": "QTSEL\\ltu",
  "customProperties": [],
  "owner": {
    "id": "4b7a27e5-f1db-4cc2-be59-7c4086f7c1f6",
    "userId": "sa_api",
    "userDirectory": "INTERNAL",
    "name": "sa_api",
    "privileges": null
  },
  "name": "AppOwnerChangeDemo",
  "appId": "",
  "sourceAppId": "00000000-0000-0000-0000-000000000000",
  "targetAppId": "00000000-0000-0000-0000-000000000000",
  "publishTime": "1753-01-01T00:00:00Z",
  "published": false,
  "tags": [],
  "description": "",
  "stream": null,
  "fileSize": 145970,
  "lastReloadTime": "2018-07-24T13:14:06.545Z",
  "thumbnail": "",
  "savedInProductVersion": "12.108.7",
  "migrationHash": "98d482c3f964dccf69cbfb9a00e0c048ea6eb221",
  "dynamicColor": "",
  "availabilityStatus": 0,
  "privileges": null,
  "schemaPath": "App"
}

Hope that helps.

View solution in original post

2 Replies
Levi_Turner
Employee
Employee

Sure @joshuapierlo,

I'm going to abstract away from your particular code and point to the generic approach.

Get the details of the app we want to change: GET /qrs/app/055e0e8d-0f10-4d22-a175-62b05143347a

Response:

{
  "id": "055e0e8d-0f10-4d22-a175-62b05143347a",
  "createdDate": "2018-11-23T17:48:27.321Z",
  "modifiedDate": "2018-11-23T17:49:26.141Z",
  "modifiedByUserName": "QTSEL\\ltu",
  "customProperties": [],
  "owner": {
    "id": "5334b296-493b-46ee-b621-79ba238ceb2c",
    "userId": "sa_repository",
    "userDirectory": "INTERNAL",
    "name": "sa_repository",
    "privileges": null
  },
  "name": "AppOwnerChangeDemo",
  "appId": "",
  "sourceAppId": "00000000-0000-0000-0000-000000000000",
  "targetAppId": "00000000-0000-0000-0000-000000000000",
  "publishTime": "1753-01-01T00:00:00Z",
  "published": false,
  "tags": [],
  "description": "",
  "stream": null,
  "fileSize": 145970,
  "lastReloadTime": "2018-07-24T13:14:06.545Z",
  "thumbnail": "",
  "savedInProductVersion": "12.108.7",
  "migrationHash": "98d482c3f964dccf69cbfb9a00e0c048ea6eb221",
  "dynamicColor": "",
  "availabilityStatus": 0,
  "privileges": null,
  "schemaPath": "App"
}

With this, we can see that the owner information is stored as an array inside the response.

Getting different user details (GET /qrs/user/full?filter=(name eq 'sa_api')😞

  {
    "id": "4b7a27e5-f1db-4cc2-be59-7c4086f7c1f6",
    "createdDate": "2017-05-06T00:54:59.921Z",
    "modifiedDate": "2017-05-06T00:54:59.921Z",
    "modifiedByUserName": "INTERNAL\\bootstrap",
    "customProperties": [],
    "userId": "sa_api",
    "userDirectory": "INTERNAL",
    "name": "sa_api",
    "roles": [],
    "attributes": [],
    "inactive": false,
    "removedExternally": false,
    "blacklisted": false,
    "deleteProhibited": false,
    "tags": [],
    "privileges": null,
    "schemaPath": "User"
  }



Now changing the owner of the original app: PUT /qrs/app/055e0e8d-0f10-4d22-a175-62b05143347a

Body:

{
  "id": "055e0e8d-0f10-4d22-a175-62b05143347a",
  "createdDate": "2018-11-23T17:48:27.321Z",
  "modifiedDate": "2018-11-23T17:49:26.141Z",
  "modifiedByUserName": "QTSEL\\ltu",
  "customProperties": [],
  "owner": {
    "id": "4b7a27e5-f1db-4cc2-be59-7c4086f7c1f6",
    "userId": "sa_api",
    "userDirectory": "INTERNAL",
    "name": "sa_api",
    "privileges": null
  },
  "name": "AppOwnerChangeDemo",
  "appId": "",
  "sourceAppId": "00000000-0000-0000-0000-000000000000",
  "targetAppId": "00000000-0000-0000-0000-000000000000",
  "publishTime": "1753-01-01T00:00:00Z",
  "published": false,
  "tags": [],
  "description": "",
  "stream": null,
  "fileSize": 145970,
  "lastReloadTime": "2018-07-24T13:14:06.545Z",
  "thumbnail": "",
  "savedInProductVersion": "12.108.7",
  "migrationHash": "98d482c3f964dccf69cbfb9a00e0c048ea6eb221",
  "dynamicColor": "",
  "availabilityStatus": 0,
  "privileges": null,
  "schemaPath": "App"
}

Hope that helps.

joshuapierlo
Partner - Contributor II
Partner - Contributor II
Author

Hi @Levi_Turner !

Thank you kindly for your response. I was out of the office for a few days... 

My way of thinking was quite silly! Why would I create a new content object if I can just rip it from another app with the same owner.... Your method works perfectly fine! 

Thanks a bunch 🙂