29. One Identity BPM
21 февраля 2020 г.
15:26
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text
Imports System.Threading
Imports System.Threading.Tasks
Imports System.IO
Imports System.Net
Imports Newtonsoft.Json
Imports Newtonsoft.Json.Linq
Dim NULL_GUID As String = "00000000-0000-0000-0000-000000000000"
Public Function PrepareOdataRequest(ByVal localUrl As String, ByVal method As String, BPMCookieContainer As CookieContainer) As HttpWebRequest
Dim url As String = Connection.GetConfigParm("TargetSystem\UNS\ITResource\BPM\URL")
Dim request As HttpWebRequest = CType((WebRequest.CreateHttp(url & localUrl)), HttpWebRequest)
request.Method = method
request.ContentType = "application/json;odata=verbose"
request.CookieContainer = BPMCookieContainer
request.Timeout=60000
request.ReadWriteTimeout=60000
Dim csrfCookie = BPMCookieContainer.GetCookies(New Uri(url))("BPMCSRF")
If csrfCookie IsNot Nothing Then
request.Headers.Add("BPMCSRF", csrfCookie.Value)
End If
request.Accept = "application/json;odata=verbose"
'request.Headers.Add("Accept", "application/json")
Return request
End Function
Public Function RemoteCertificateValidationCallback(ByVal sender As Object, ByVal certificate As System.Security.Cryptography.X509Certificates.X509Certificate, ByVal chain As System.Security.Cryptography.X509Certificates.X509Chain, ByVal sslPolicyErrors As System.Net.Security.SslPolicyErrors) As Boolean
Return True
End Function
Public Function Z_BPM_Authenticate() As CookieContainer
logger.Trace("ENTER")
Dim userId As String = Connection.GetConfigParm("TargetSystem\UNS\ITResource\BPM\User")
Dim pwd As String = Connection.GetConfigParm("TargetSystem\UNS\ITResource\BPM\Password")
Dim url As String = Connection.GetConfigParm("TargetSystem\UNS\ITResource\BPM\URL")
System.Net.ServicePointManager.ServerCertificateValidationCallback = New System.Net.Security.RemoteCertificateValidationCallback(AddressOf RemoteCertificateValidationCallback)
Dim AuthServiceUrl As String = url & "/ServiceModel/AuthService.svc/Login"
Dim request As HttpWebRequest = CType((WebRequest.CreateHttp(AuthServiceUrl)), HttpWebRequest)
request.Method = "POST"
request.ContentType = "application/json"
Dim BPMCookieContainer As CookieContainer = New CookieContainer()
request.CookieContainer = BPMCookieContainer
Using requestStream = request.GetRequestStream()
Using streamWriter = New StreamWriter(requestStream)
Dim authstr = New With {Key.UserName = userId, Key.UserPassword = [REDACTED] Key.TimeZoneOffset = -180}
streamWriter.Write(JsonConvert.SerializeObject(authstr))
End Using
End Using
Dim response As String = request.GetResponse().ToString
logger.Trace("Exit")
Return BPMCookieContainer
End Function
Public Function Z_BPM_Create_Ticket(ByVal message As String, ByVal body As String, caseParams As Dictionary(Of String, String), Optional ext_BPMCookieContainer As CookieContainer = Nothing) As Dictionary(Of String, String)
Dim url As String = Connection.GetConfigParm("TargetSystem\UNS\ITResource\BPM\URL")
logger.Trace("ticket body = " & body)
Dim BPMCookieContainer As CookieContainer = If (Not (ext_BPMCookieContainer Is Nothing), ext_BPMCookieContainer, Z_BPM_Authenticate())
'Dim caseDate = New With {Key.Subject = subject, Key.Symptoms = body, Key.ContactId="10a286ad-d460-4718-bc13-6a7bfbde59c4", Key.ServicePactId="7c978b89-5802-4595-8c35-277908d7842a", Key.ServiceItemId="b46b2ac5-4ce9-4f5e-9843-71d811472a6c", Key.CategoryId="69580569-9e16-4466-a1d8-849aa868a719"}
Dim caseDate As New Dictionary(Of String, String)
caseDate.Add("Subject", message)
caseDate.Add("Symptoms", body)
Dim allTicketParams As Dictionary(Of String, String) = Z_Dictionary_Merge(caseParams, caseDate)
'For Each paramName As String In {"ContactId", "ServicePactId", "ServiceItemId", "CategoryId", "GroupId", "AccountId", "OriginId"}
' caseDate.Add(paramName, Connection.GetConfigParm("TargetSystem\UNS\ITResource\BPM\DefaultTicketParameters\ & paramName))
' Next
Dim ticketParamsStr As String = JsonConvert.SerializeObject(allTicketParams)
logger.Trace("ticketParamsStr = " & ticketParamsStr)
'logger.Trace("sleeping...")
'System.Threading.Thread.Sleep(30000)
'logger.Trace("wake up!!!")
Dim request2 As HttpWebRequest = PrepareOdataRequest("/0/ServiceModel/EntityDataService.svc/CaseCollection", "POST", BPMCookieContainer)
Using requestStream = request2.GetRequestStream()
Using streamWriter = New StreamWriter(requestStream)
streamWriter.Write(ticketParamsStr)
End Using
End Using
Dim resp = CType(request2.GetResponse(), HttpWebResponse)
If resp.StatusCode \<> HttpStatusCode.Created Then
Throw New System.Exception("Ticket is not created; http status code = " & resp.StatusCode.ToString())
End If
Dim resultBody = Z_Http_Extract_Response_Body(resp)
Dim wrap As IDictionary(Of String,Object) = JsonConvert.DeserializeObject( Of IDictionary(Of String,Object))(resultBody)
Dim pb As JObject = JObject.Parse(resultBody)
' logger.Trace("number=" & pb.SelectToken("d.Number").ToString())
' logger.Trace("id=" & pb.SelectToken("d.Id").ToString())
If pb.SelectToken("d.Id") Is Nothing OrElse pb.SelectToken("d.Id").Type = JTokenType.Null OrElse String.IsNullOrEmpty(pb.SelectToken("d.Id").ToString()) Then
Throw New System.Exception("Ticket id is not returned")
End If
Dim result As New Dictionary(Of String, String)
result.Add("id", pb.SelectToken("d.Id").ToString())
result.Add("number", pb.SelectToken("d.Number").ToString())
Return result
End Function
'search BPM contact by full name and email. If more then one found then return null
Public Function Z_BPM_Find_Contact(ByVal fullName As String, ByVal email As String, Optional ext_BPMCookieContainer As CookieContainer = Nothing) As String
If String.IsNullOrEmpty(fullName) OrElse String.IsNullOrEmpty(email) Then
Return Nothing
End If
Dim BPMCookieContainer As CookieContainer = If (Not (ext_BPMCookieContainer Is Nothing), ext_BPMCookieContainer, Z_BPM_Authenticate())
Dim filterString = "Name eq '" & fullName & "' and Email eq '" & email & "'"
logger.Trace("filterString: " & filterString)
Dim request As HttpWebRequest = PrepareOdataRequest("/0/ServiceModel/EntityDataService.svc/ContactCollection?\$filter=" & filterString, "GET", BPMCookieContainer)
Dim resp = CType(request.GetResponse(), HttpWebResponse)
Dim resultBody = Z_Http_Extract_Response_Body(resp)
logger.Trace("body: " & resultBody)
Dim pb As JObject = JObject.Parse(resultBody)
Dim resultsJArray As JArray = CType(pb.SelectToken("d.results"), JArray)
logger.Trace("Found objects number: " & resultsJArray.Count.ToString())
If resultsJArray.Count>1 Then
Return Nothing
ElseIf resultsJArray.Count=0 Then
Return Nothing
Else
Return resultsJArray.First.SelectToken("Id").ToString()
End If
End Function
Public Function Z_BPM_Get_Ticket_Status(ByVal ticketId As String, Optional ext_BPMCookieContainer As CookieContainer = Nothing) As Dictionary(Of String, String)
Dim result As New Dictionary(Of String, String)
If False Then
Dim ticketStatus As String = My.Computer.FileSystem.ReadAllText("C:\Temp\bpm\ & ticketId & ".txt")
result.Add("status", ticketStatus)
result.Add("solutionText", "")
Else
logger.Trace("check ticket status for ticketId = " & ticketId)
Dim BPMCookieContainer As CookieContainer = If (Not (ext_BPMCookieContainer Is Nothing), ext_BPMCookieContainer, Z_BPM_Authenticate())
Dim url As String = Connection.GetConfigParm("TargetSystem\UNS\ITResource\BPM\URL")
logger.Trace("authenticated")
Dim request2 As HttpWebRequest = PrepareOdataRequest("/0/ServiceModel/EntityDataService.svc/CaseCollection(guid'" & ticketId & "')", "GET", BPMCookieContainer)
logger.Trace("request prepared")
Dim resp = CType(request2.GetResponse(), HttpWebResponse)
logger.Trace( "get response")
Dim resultBody = Z_Http_Extract_Response_Body(resp)
logger.Trace("response body obtained: " & resultBody)
'Dim wrap As IDictionary(Of String,Object) = JsonConvert.DeserializeObject( Of IDictionary(Of String,Object))(resultBody)
Dim pb As JObject = JObject.Parse(resultBody)
'logger.Trace("number=" & pb.SelectToken("d.Number").ToString())
Dim ticketStatus As String = "other"
Dim solutionText As String = Nothing
Dim f As ISqlFormatter = Connection.SqlFormatter
If Connection.GetSingleProperty("DialogConfigParm", "Value", f.Comparison("FullPath", "TargetSystem\UNS\ITResource\BPM\Ticket\approved\StatusId[" & pb.SelectToken("d.StatusId").ToString() & "]\ClosureCodeId[" & pb.SelectToken("d.ClosureCodeId").ToString() & "]" , ValType.String)) = "1" Then
ticketStatus = "approved"
End If
If Connection.GetSingleProperty("DialogConfigParm", "Value", f.Comparison("FullPath", "TargetSystem\UNS\ITResource\BPM\Ticket\rejected\StatusId[" & pb.SelectToken("d.StatusId").ToString() & "]\ClosureCodeId[" & pb.SelectToken("d.ClosureCodeId").ToString() & "]" , ValType.String)) = "1" Then
ticketStatus = "rejected"
End If
If pb.SelectToken("d.Solution") IsNot Nothing AndAlso pb.SelectToken("d.Solution").Type \<> JTokenType.Null
solutionText = pb.SelectToken("d.Solution").ToString()
End If
logger.Trace("ticketStatus=" & ticketStatus)
logger.Trace("solutionText=" & solutionText)
result.Add("status", ticketStatus)
result.Add("solutionText", solutionText)
End If
Return result
End Function
'finds ServicePactId for given Contact
Public Function Z_BPM_Find_Service_Pact_By_Contact(ByVal contactId As String, Optional ext_BPMCookieContainer As CookieContainer = Nothing) As String
logger.Trace("contactId = " & contactId)
If String.IsNullOrEmpty(contactId) OrElse NULL_GUID = contactId Then
logger.Trace("contactId is empty; no service pact ")
Return Nothing
End If
Dim BPMCookieContainer As CookieContainer = If (Not (ext_BPMCookieContainer Is Nothing), ext_BPMCookieContainer, Z_BPM_Authenticate())
'get AccountId (=ContractAgent) for given contact
Dim request As HttpWebRequest = PrepareOdataRequest("/0/ServiceModel/EntityDataService.svc/ContactCollection(guid'" & contactId & "')", "GET", BPMCookieContainer)
Dim resp = CType(request.GetResponse(), HttpWebResponse)
Dim resultBody = Z_Http_Extract_Response_Body(resp)
logger.Trace("contractagent search resultBody = " & resultBody)
Dim pb As JObject = JObject.Parse(resultBody)
Dim accId As String = pb.SelectToken("d.AccountId").ToString()
logger.Trace("accId = " & accId)
If String.IsNullOrEmpty(accId) OrElse NULL_GUID = accId Then
Return Nothing
End If
'get service pacts linked to this contract agent
Dim filterString = "Account/Id eq guid'" & accId & "'"
request = PrepareOdataRequest("/0/ServiceModel/EntityDataService.svc/ServiceObjectCollection?\$filter=" & filterString, "GET", BPMCookieContainer)
resp = CType(request.GetResponse(), HttpWebResponse)
resultBody = Z_Http_Extract_Response_Body(resp)
logger.Trace("servicepact search resultBody = " & resultBody)
pb = JObject.Parse(resultBody)
Dim resultsJArray As JArray = CType(pb.SelectToken("d.results"), JArray)
logger.Trace("servicepact number = " & resultsJArray.Count.ToString())
If resultsJArray.Count>0 Then
Return resultsJArray.First.SelectToken("ServicePactId").ToString()
Else
Return Nothing
End If
End Function