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