Subversion Repositories DevTools

Rev

Rev 4237 | Blame | Last modification | View Log | RSS feed

<%@LANGUAGE="VBSCRIPT"%>
<%
'=====================================================
'       Jira Issues Enquiry
'       Designed to be called via AJAX and to return
'       JSON formatted data to dynamic page
'=====================================================
%>
<%
Option explicit
' Good idea to set when using redirect
Response.Expires = 0   ' always load the page, dont store
%>
<!--#include file="common/conf.asp"-->
<!--#include file="common/globals.asp"-->
<!--#include file="common/qstr.asp"-->
<!--#include file="common/common_subs.asp"-->
<!--#include file="common/formating.asp"-->
<SCRIPT LANGUAGE="VBScript" RUNAT=SERVER SRC="common/base64encode.vbs"></SCRIPT> 
<SCRIPT LANGUAGE="VBScript" RUNAT=SERVER SRC="class/classaspJSON.vbs"></SCRIPT> 
<%
'------------ Variable Definition -------------
Dim parOpr
Dim parPv_id
Dim result
Dim iJSON,jJSON, el, this, post, newitem
Dim allIssues

' Basic Parameters
parOpr = QStrPar("Opr")
parPv_id = QStrPar("pv_id")
result = -1
post = "None"

' Init the output JSON class
'   Operations can add data
'   Default data will be added at the end
Dim oJSON
Set oJSON = New aspJSON

'
'   getIssues - Get issues for the current PV_ID and create a hash
'
Sub getIssues
    Set allIssues = CreateObject ("Scripting.Dictionary")
    Dim rsTemp, sqlstr, key
    sqlstr = "SELECT iss_key FROM JIRA_ISSUES WHERE pv_id="& parPv_id
    Set rsTemp = OraDatabase.DbCreateDynaset( sqlstr, cint(0))
    While ((NOT rsTemp.BOF) AND (NOT rsTemp.EOF))
        key = rsTemp("iss_key")
       If NOT allIssues.Exists(key) Then
            allIssues.add key, 1
       End If
        rsTemp.MoveNext
    WEnd
    rsTemp.Close()
    Set rsTemp = nothing
End Sub

'
'   Determine the operation to be performed
'
If (parOpr = "getAllKeys") Then

    ' Examine the Jira subsystem and determine ALL available project keys
    ' Return an HTML string that is a <select></select> box
    ' This is designed to be inserted into an element
    '
    result = 0

    '
    Dim objXML, qry
    qry = "/rest/api/2/project"

    Set objXML = Server.CreateObject("MSXML2.ServerXMLHTTP.6.0")
    objXML.Open "GET", JIRA_URL & qry, false
    objXML.setRequestHeader "Authorization", "Basic " & Base64Encode(JIRA_CREDENTAILS)
    On Error Resume Next
    objXML.Send("")
    if Err.Number <> 0 then
        result = 1
        oJSON.data("emsgSummary") = Err.Description
        On Error Goto 0
    else
        On Error Goto 0
        if  objXML.status <> 200 then
            result = 1
            oJSON.data("emsgSummary") = objXML.responseText

        Else
            Set jJSON = New aspJSON
            jJSON.loadJSON( objXML.responseText )

            oJSON.data("keyListCount") = jJSON.data.Count

            Dim  str
            str = "<select id='keyListSelect'>"
            For Each el In jJSON.data
                Set this = jJSON.data.item(el)
                str = str & "<option value='"&this.item("key")&"'>" &_
                            this.item("key") & ":" & this.item("name") &_
                      "</option>"
                Next
            str = str & "</select>"
        end if
    end if
    oJSON.data("keyList") = str
'
'   getIssues
ElseIf (parOpr = "getIssues") Then
    Dim project, projectList, issues, issueList, query, order, parCount, parStartAt
    getIssues()
    project = QStrPar("Project")
    issues = QStrPar("Issue")
    parStartAt = QStrPar("StartAt")
    parCount = QStrPar("Count")

    qry = "/rest/api/2/search"
    order = " ORDER BY key DESC"

    projectList = ""
    If project = "ALL" Then
        projectList = ""
    Else
        projectList = "project=" & project
    End If

     ' Convert comma or space seperated list into and 'IN' query
    issueList = ""
    Dim aList, entry, del
    If issues <> "ALL" AND issues <> "" AND project <> "ALL" Then
        issueList = issueList & " AND key in ("
        del = ""
        issues = Replace(issues ," ",",",1,-1)
        aList = Split(issues, ",")
            For Each entry in aList
                If entry <> "" Then
                    issueList = issueList & del & project & "-" & entry
                    del = ","
                End If
            Next
        issueList = issueList & ")"
    End If

    ' Create the JSON input via code
    ' Can do it as a string, as thats all we want
    set iJSON = New aspJSON
    With iJSON.data
    .Add "jql", projectList & issueList & order
    .Add "validateQuery", "false"
    .Add "startAt", CStr(parStartAt)
    .Add "maxResults", CStr(parCount)
    .Add "fields", iJSON.Collection()
        With .item("fields")
            .Add 0, "key"
            .Add 1, "summary"
            .Add 2, "status"
            .Add 3, "priority"
            .Add 4, "issuetype"
        End With
    End With
    post = iJSON.JSONoutput()

    Set objXML = Server.CreateObject("MSXML2.ServerXMLHTTP.6.0")
    objXML.Open "POST", JIRA_URL & qry , false
    objXML.setRequestHeader "Authorization", "Basic " & Base64Encode(JIRA_CREDENTAILS)
    objXML.setRequestHeader "Content-Type", "application/json"
    On Error Resume Next
    objXML.Send(post)
    if Err.Number <> 0 then
        result = 1
        oJSON.data("emsgSummary") = Err.Description
        On Error Goto 0
    else
        On Error Goto 0
        If  objXML.status = 400 then
            result = 1
            Set jJSON = New aspJSON
            jJSON.loadJSON( objXML.responseText )
            oJSON.data("emsgSummary") = jJSON.data("errorMessages").item(0)

        ElseIf  objXML.status <> 200 then
            result = 1
            oJSON.data("emsgSummary") = objXML.responseText
        Else
            Set jJSON = New aspJSON
            jJSON.loadJSON( objXML.responseText )

'           Response.Write "<br>Pretty JSON display<pre>"
'           Response.Write jJSON.JSONoutput()
'           Response.Write "</pre>"
'

            oJSON.data("issueCount") = jJSON.data("total")
            oJSON.data("startAt") = jJSON.data("startAt")
            oJSON.data("maxResults") = jJSON.data("maxResults")

            Set oJSON.data("issues") = oJSON.Collection()

            ' Select the fields to be returned
            Dim  fields
    'On Error Resume Next
            For Each el In jJSON.data("issues")
               Set this = jJSON.data("issues").item(el)
               Set fields = this.item("fields")

                Set newitem = oJSON.AddToCollection(oJSON.data("issues"))
                newitem.add "key",this.item("key")
                newitem.add "url",JIRA_URL & "/browse/" & this.item("key")
                newitem.add "statusIcon",fields.item("status").item("iconUrl")
                newitem.add "status",fields.item("status").item("name")
                newitem.add "issuetypeIcon",fields.item("issuetype").item("iconUrl")
                newitem.add "issuetype",fields.item("issuetype").item("name")
                newitem.add "priorityIcon",fields.item("priority").item("iconUrl")
                newitem.add "priority",fields.item("priority").item("name")
                newitem.add "summary",fields.item("summary")

                If allIssues.Exists(this.item("key")) Then
                    newitem.add "inuse",1
                End If
            Next
            result = 0
        end if
    end if
'
'   insertIssues
'   Insert Issues into the Release Manager entry
'
ElseIf (parOpr = "insertIssues") Then
    issues = QStrPar("Issue")
    If parPv_id = "" OR issues = "" Then
        result = 1
        oJSON.data("emsgSummary") = "Action called with invalid arguments." & parPv_id & issues
    Else
        Dim SqlQry, issArr , iss_id, rsQry
        issArr = Split ( issues, ",")

        objEH.ErrorRedirect = FALSE
        objEH.TryORA ( OraSession )
        On Error Resume Next

        ' Import issues if they do not already exist
        For Each iss_id In issArr
            If Err.Number = 0 Then
                SqlQry = "SELECT * FROM JIRA_ISSUES WHERE pv_id=" & parPv_id & " AND iss_key='"& LTrim(iss_id) & "'"
                Set rsQry = OraDatabase.DbCreateDynaset( SqlQry, ORADYN_DEFAULT )
                OraDatabase.ExecuteSQL SqlQry
                If ((rsQry.BOF) OR (rsQry.EOF)) Then
                    SqlQry = " INSERT INTO JIRA_ISSUES ( pv_id, iss_key, date_time_stamp )" &_
                             " VALUES ( " & parPv_id & ", '"& LTrim(iss_id) &"', "& ORA_SYSDATETIME &")"
                    OraDatabase.ExecuteSQL SqlQry

                    If Err.Number = 0 Then
                        SqlQry = "BEGIN  Log_Action ( "& parPv_id &", 'jira_issue_added', "& objAccessControl.UserId &", 'Issue number: "& LTrim(iss_id) &"' );  END;"
                        OraDatabase.ExecuteSQL SqlQry
                    End If
                Set rsQry = nothing
                End If
            End If
        Next

        ' SQL error detection and reporting
        objEH.CatchORA ( OraSession )
        If objEH.LastOraFailed Then
            result = 2
            oJSON.data("error") = 1

            oJSON.data("emsgSummary") = objEH.MessageSummary
            oJSON.data("emsgDetails") = objEH.MessageDetails
            oJSON.data("SqlQry") = SqlQry
        Else
            result = 0
        End If
    End If
Else
        oJSON.data("emsgSummary") = "Unknown operation requested:" & parOpr
End If

'
'   Create JSON data for the user
'   Important fields
'       result
'
'   Debug fields
'       Request (Array)
'
'Write single value
oJSON.data("result") = result

' DEBUG: An array of the user provided requests
oJSON.data("JiraPost") = post
Set oJSON.data("Request") = oJSON.Collection()
Set newitem = oJSON.AddToCollection(oJSON.data("Request"))
Dim variableName
for each variableName in Request.QueryString
    newitem.add variableName, Request.QueryString(variableName)
next

'Return the object
Response.Write oJSON.JSONoutput()
%>