Dracoon API - Monday.com Integration
Hallo Community,
wir verwenden im Unternehmen "Monday.com" u.a. als cloudbasiertes CRM-Tool. In unserem Dracoon hat jeder Kunde einen eigenen Datenraum, der zur Zusammenarbeit mit uns genutzt wird. Jeder Kunden-Datenraum hat die Unterräume "Quotations", "Projects", und "Upload".
Wir möchten nun gerne die Dracoon API nutzen, um automatisch bei der Anlage eines neuen Kunden in Monday.com die geforderte Datenraumstruktur in unserem Dracoon einzurichten. Die Generierung der API-calls mit den Daten aus Monday.com lässt sich realisieren.
Konkret wäre der Ablauf wie folgt:
1) Extraktion der benötigen Infos (z.B. Kundenname) aus Monday.com (das läuft in Monday.com)
2) Generierung der entsprechenden API-Calls:
2a) Einloggen eines "Monday.com" Users auf Dracoon mit Rechten zur Erstellung von Datenräumen
2b) Anlegen des Datenraums "KUNDENNAME"
2c) Anlegen der Sub-Datenräume "Quotations", "Projects", und "Upload"
2d) Ausloggen des Users
Lässt sich dies mit der aktuellen Dracoon API regeln?
Vielen Dank schon an dieser Stelle für die Hilfe.
Beste Grüße,
Max Plach
-
Offizieller Kommentar
Hallo,
ja, das ist sogar sehr gut möglich. Unsere wachsende Entwicklerdokumentation ist hier abgelegt: https://support.dracoon.com/hc/de/categories/115000849985-Developer-Information
Zudem bietet DRACOON eine vollständige Dokumentation der API mit OpenAPI 2.0 über Swagger an. Eine interaktive Dokumentation ist automatisch auf jeder Umgebung unter /api deployed; z.B. https://dracoon.team/api. Wir bieten SDKs für Java, C# und Swift an: https://github.com/dracoon.Konkret könnte die Aufgabe folgendermaßen gelöst werden:
- Verwenden eines Nutzers mit der Rolle "Raum-Manager".
- Login des Nutzers mit OAuth.
- Anlegen des Datenraums (POST /nodes/rooms); Nutzer wird Datenraumadministrator.
- ggf. Berechtigung weiterer Nutzer und/oder Gruppen auf den Datenraum. (PUT /nodes/rooms/{room_id}/users bzw. /groups)
- Anlegen der gewünschten Datenräume der nächsten Ebene (POST /nodes/rooms); Aktivierung der Vererbung, damit die Rechte des übergeordneten Datenraums übernommen werden.
- Logout des Nutzers
Ich hoffe, das hilft schon einmal. Bei Rückfragen helfen wir gerne weiter!
Viele Grüße
FlorianAktionen für Kommentare -
Hallo Florian,
Besten Dank erst mal. Wir haben uns entlang der "Getting started with DRACOON API" Dokumentation gehangelt. Einen GET /public/software/version bekommen wir hin; die prinzipielle Kommunikation funktioniert also. Wir sind allerdings darauf angewiesen, das ganze aus VBA heraus zu machen.
Leider kommen wir momentan bei der Authentifizierung des Nutzers nicht weiter.
Skript:
Option Explicit
Sub Test_LateBinding()
Dim objRequest As Object
Dim host As String
Dim apipath As String
Dim api As String
Dim password As String
Dim userName As String
Dim authType As String
Dim token As String
Dim state As String
Dim blnAsync As Boolean
Dim strResponse As String
Set objRequest = CreateObject("MSXML2.XMLHTTP")
host = "https://data.2bind.com/"
apipath = "api/v4/"
api = "auth/login"
password = "XXXXXXXXXXXXXXXX"
userName = "dracoon_room_manager@2bind.com"
authType = "sql"
blnAsync = True
With objRequest
.Open "POST", host & apipath & api, blnAsync
.SetRequestHeader "Content-Type", "application/json"
.SetRequestHeader "password", password
.SetRequestHeader "userName", userName
.SetRequestHeader "authType", authType
.Send
' Spin wheels whilst waiting for response
While .readyState <> 4
DoEvents
Wend
strResponse = .ResponseText
End With
Debug.Print strResponse
End SubResponse:
{"code":401,"message":"Unauthorized","debugInfo":"","errorCode":null}
Viele Grüße
Max
-
Hallo Max,
ihr versucht, die Login-Infos als Header des Requests zu senden.
Jedoch müssen diese als JSON im Body des Requests übermittelt werden.
Beispiel:
objRequest.Send "{""login"": ""dracoon_room_manager@2bind.com"", ""password"": ""XXXXXXXXXXXXXXXX"", ""authType"": ""sql""}"
Beste Grüße
Roland -
Hallo Roland,
Top! Genau das wars.
Wir sind inzwischen gut weiter gekommen. User Info anzeigen, Logout, etc. funktioniert alles bestens.Scheinbar haben wir aber ein kleines Syntaxproblem in VBA (wieder einmal...):
.Send "{""name"": ""TESTROOM"", ""parentId"": 1932, ""recycleBinRetentionPeriod"": 0, ""quota"": 0, ""inheritPermissions"": True, ""adminIds"": [4], ""adminGroupIds"": [4, 25]}"
gibt uns als response:
{"code":400,"message":"Bad Request","debugInfo":"JSON parse error.","errorCode":null}
Der Fehler liegt vermutlich in den "Listen", die für die Argumente "adminIds" und "adminGroupIds" angegeben sind.
Wenn die beiden Argumente heraus genommen werden, funktioniert das Anlegen des Raums.Danke!
Max -
Hallo, noch ein "kurzes" Update. Unten der bisherige Code.
Was funktioniert:
- Einloggen eines Users
- Anlegen eines Raums für einen "Customer" innerhalb des Raums "CustomersNEW". Letzterer ist ein Top-Level Raum.
- Anlegen von Sub-Räumen "Quotations", "Projects" und "Upload"
Was noch nicht funktioniert:
- Verwenden eines Users mit der Rolle "Raum Manager". Nur wenn ich meine User-Credentials verwende, klappt das oben augelistete. Ich selbst bin "Raum Administrator" für den Raum "CustomersNEW". Der User "dracoon_room_manager@2bind.com" kann dies nicht, obwohl er die Rolle "Raum Manager" hat.
- Ausloggen am Ende (/users/logout call; scheint in der neuesten API nicht mehr verfügbar?)
- Verwenden expliziter Raum-Admin und Raum-Admingruppen IDs (siehe Kommentar darüber)
Besten Dank für die Hilfe!
Max
Option Explicit
Sub Test_LateBinding()
Dim objRequest As Object
Dim JSONa As Object
Dim host As String
Dim apipath As String
Dim api As String
Dim blnAsync As Boolean
Dim respLogin As String
Dim token As String
Dim state As String
Dim arrLogin As Variant
Dim respRoom As String
Dim customerRoomId As String
Dim arrRoom As Variant
Dim debugFile As Integer
Set objRequest = CreateObject("MSXML2.XMLHTTP")
host = "https://data.2bind.com/"
apipath = "api/v4/"
blnAsync = True
With objRequest
'Login the Room Manager User
api = "auth/login"
.Open "POST", host & apipath & api, blnAsync
.SetRequestHeader "Content-Type", "application/json"
'.Send "{""login"": ""dracoon_room_manager@2bind.com"", ""password"": ""XXXXXXXXXXXXXXXXXX"", ""authType"": ""sql""}"
.Send "{""login"": ""plach@2bind.com"", ""password"": ""XXXXXXXXXXXXXXXXX"", ""authType"": ""sql""}"
'Wait for response
While .readyState <> 4
DoEvents
Wend
'Split the response to get the token
respLogin = Replace(.ResponseText, ",", ":")
respLogin = Replace(respLogin, """", "")
respLogin = Replace(respLogin, "{", "")
respLogin = Replace(respLogin, "}", "")
arrLogin = Split(respLogin, ":")
token = arrLogin(1)
'Display results
If .Status = 200 Then
Debug.Print "Login sucessfull!"
Else
Debug.Print "Something went wrong during user login!"
End If
'Test the login by getting some user information
api = "user/account"
.Open "GET", host & apipath & api, blnAsync
.SetRequestHeader "Content-Type", "application/json"
.SetRequestHeader "X-Sds-Auth-Token", token
.Send
'Wait for response
While .readyState <> 4
DoEvents
Wend
'Display results
If .Status = 200 Then
Debug.Print "User Info Retrieval sucessfull!"
Else
Debug.Print "Something went wrong during user login!"
End If
api = "nodes"
.Open "GET", host & apipath & api, blnAsync
.SetRequestHeader "Content-Type", "application/json"
.SetRequestHeader "X-Sds-Auth-Token", token
.Send
'Wait for response
While .readyState <> 4
DoEvents
Wend
'debugFile = FreeFile()
'Open "C:\Users\LocalAdmin\Desktop\debug.txt" For Output As #debugFile
'Print #debugFile, .ResponseText
'Close #debugFile
'Create new customer room
api = "nodes/rooms"
.Open "POST", host & apipath & api, blnAsync
.SetRequestHeader "Content-Type", "application/json"
.SetRequestHeader "X-Sds-Auth-Token", token
'Room ID 1932 is for the "Customers" Top-Level dataroom
'Room ID 45210 is for the "CustomersNEW" Top-Level dataroom
.Send "{""name"": ""TESTROOM"", ""parentId"": 45210, ""recycleBinRetentionPeriod"": 90, ""quota"": 0}"
'Wait for response
While .readyState <> 4
DoEvents
Wend
respRoom = Replace(.ResponseText, ",", ":")
respRoom = Replace(respRoom, """", "")
respRoom = Replace(respRoom, " ", "")
respRoom = Replace(respRoom, "{", "")
respRoom = Replace(respRoom, "}", "")
arrRoom = Split(respRoom, ":")
customerRoomId = arrRoom(1)
'Display results
If .Status = 201 Then
Debug.Print "Room successfully generated."
Else
Debug.Print "Something went wrong during room generation!"
End If
'Create the subrooms inside the customer room
'Quotations room
api = "nodes/rooms"
.Open "POST", host & apipath & api, blnAsync
.SetRequestHeader "Content-Type", "application/json"
.SetRequestHeader "X-Sds-Auth-Token", token
'Room ID comes from the parent customer room
.Send "{""name"": ""Quotations"", ""parentId"": " & customerRoomId & ", ""recycleBinRetentionPeriod"": 90, ""quota"": 0}"
'Wait for response
While .readyState <> 4
DoEvents
Wend
'Display results
If .Status = 201 Then
Debug.Print "Subroom Quotations successfully generated."
Else
Debug.Print "Something went wrong during generation of the subroom Quotations!"
End If
'Projects room
api = "nodes/rooms"
.Open "POST", host & apipath & api, blnAsync
.SetRequestHeader "Content-Type", "application/json"
.SetRequestHeader "X-Sds-Auth-Token", token
'Room ID comes from the parent customer room
.Send "{""name"": ""Projects"", ""parentId"": " & customerRoomId & ", ""recycleBinRetentionPeriod"": 90, ""quota"": 0}"
'Wait for response
While .readyState <> 4
DoEvents
Wend
'Display results
If .Status = 201 Then
Debug.Print "Subroom Projects successfully generated."
Else
Debug.Print "Something went wrong during generation of the subroom Projects!"
End If
'Upload room
api = "nodes/rooms"
.Open "POST", host & apipath & api, blnAsync
.SetRequestHeader "Content-Type", "application/json"
.SetRequestHeader "X-Sds-Auth-Token", token
'Room ID comes from the parent customer room
.Send "{""name"": ""Upload"", ""parentId"": " & customerRoomId & ", ""recycleBinRetentionPeriod"": 30, ""quota"": 1000000000}"
'Wait for response
While .readyState <> 4
DoEvents
Wend
'Display results
If .Status = 201 Then
Debug.Print "Subroom Upload successfully generated."
Else
Debug.Print "Something went wrong during generation of the subroom Upload!"
End If
Logout again
api = "user/logout"
.Open "POST", host & apipath & api, blnAsync
.SetRequestHeader "Content-Type", "application/json"
.SetRequestHeader "X-Sds-Auth-Token", token
.Send
'Wait for response
While .readyState <> 4
DoEvents
Wend
Debug.Print .ResponseText
'Display results
If .Status = 200 Then
Debug.Print "Logout sucessfull!"
Else
Debug.Print "Something went wrong during user logout!"
End If
End With
End Sub -
Hallo, kurzes Update:
Wir haben es geschafft, das Skript zum Laufen zu bringen. Das Problem war, dass ds UTF-8 Charset noch explizit spezifiziert werden musste.Allerdings gibt es immer noch zwei Probleme:
- Ein "Room Manager" User kann die Aktionen nicht ausführen; obwohl er doch die Rechte haben sollte, Räume anzulegen (und die ja nicht nur im Toplevel, sondern auch eine Eben darunter? Oder müsste der User dazu auch "Room Admin" für diesen Ordner sein?
- Logout funktioniert nicht.
Danke!
-
Hallo,
1. "Room Manager" kann lediglich auf oberster Ebene Räume anlegen; auf den weiteren Ebenen übernehmen die jeweiligen Raum-Administratoren diese Aufgabe.
2. Welchen Fehler erscheint beim Logout-Versuch? Üblicherweise gibt DRACOON API über entsprechende Status- und Fehlercodes detaillierte Informationen über mögliche Fehlersituationen.
Viele Grüße
Florian -
Hallo Florian,
besten Dank.
1. Ist es nicht möglich einen Raum-Admin für die zweite Raum-Ebene einzurichten? Denn im Grunde benötigt der User, über den per API neue Räume angelegt werden ja keine Admin-Rechte (inkl. Lesen, Schreiben, Löschen, Anlegen von Shares, etc.). Lediglich die Funktion zum Anlegen von Räumen wird benötigt.
2. Es gibt leider keinen entsprechenden response text, dieser scheint schlicht leer zu sein. Der Code über den der logout stattfinden soll:
api = "user/logout"
.Open "POST", host & apipath & api, blnAsync
.SetRequestHeader "Content-Type", "application/json;charset=UTF-8"
.SetRequestHeader "X-Sds-Auth-Token", token
.Send
'Wait for response
While .readyState <> 4
DoEvents
Wend
Debug.Print .ResponseTextDie API "users/logout" stammt aus dem "Einstieg in Dracoon API" Artikel. Auf der Swagger-UI kann ich aber diesen Befehl nirgends finden. Kann es damit etwas zu tun haben?
-
Hallo Maximilian,
1. Unser Rechtekonzept findest du hier beschrieben: https://support.dracoon.com/hc/de/articles/115001865005-Begriffe-Rollen-und-Rechte
2. Offenbar wird der falsche Endpunkt genutzt – korrekt ist /user/account/logout. Steht das so falsch in der Dokumentation?
Viele Grüße
Florian
Bitte melden Sie sich an, um einen Kommentar zu hinterlassen.
Kommentare
9 Kommentare