Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
languagegroovy
themeRDark
import com.atlassian.jira.issue.customfields.option.LazyLoadedOption
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.fields.CustomField
import com.atlassian.jira.issue.Issue
import com.atlassian.jira.issue.CustomFieldManager
import com.atlassian.jira.security.JiraAuthenticationContext
import com.atlassian.jira.bc.issue.search.SearchService
import com.atlassian.jira.issue.search.SearchException
import com.atlassian.jira.web.bean.PagerFilter
import groovy.json.JsonOutput
import groovyx.net.http.RESTClient
import groovyx.net.http.ContentType

// Jira Cloud REST API base URL
final String jiraCloudApiBaseUrl = "https://[YourInstance].atlassian.net"

// Basic Authentication Encoded String
def encodedAuthString = "your email:token".bytes.encodeBase64().toString()

// Get necessary components
def issueManager = ComponentAccessor.getIssueManager()
def customFieldManager = ComponentAccessor.getCustomFieldManager()
def authenticationContext = ComponentAccessor.getJiraAuthenticationContext()
def searchService = ComponentAccessor.getComponent(SearchService.class)

// Define and find the custom field
final String customFieldName = "mlcs employee"
final String cloudCustomFieldId = "customfield_10101"
def customField = customFieldManager.getCustomFieldObjectsByName(customFieldName)?.first()

if (customField == null) {
    log.error "Custom field not found: $customFieldName"
    return
}

// Fetch issues
def user = authenticationContext.getLoggedInUser()
def query = "\"${customFieldName}\" is not EMPTY"

// Parse the JQL query
def parseResult = searchService.parseQuery(user, query)

def transformElement(LazyLoadedOption element, int index) {
    String label = element.getValue() 
    return [label: label, value: index + 1]
}

if (!parseResult.isValid()) {
    log.error "Invalid JQL Query: ${query}"
    return
}

try {
    def results = searchService.search(user, parseResult.getQuery(), PagerFilter.getUnlimitedFilter())

    results.getResults().each { Issue issue ->
       List serverValue = issue.getCustomFieldValue(customField)
        if (serverValue) {

           def transformedArray = [:]

        // Populate the map
        serverValue.eachWithIndex { element, index ->
            transformedArray["lv$index"] = transformElement(element as LazyLoadedOption, index)
        }
           

            def payload = [
                fields: [
                    "$cloudCustomFieldId"(cloudCustomFieldId):  JsonOutput.toJson(transformedArray)
                ]
            ]

            def client = new RESTClient(jiraCloudApiBaseUrl)

            client.setHeaders([
                'Content-Type' : ContentType.JSON,
                'Authorization': "Basic $encodedAuthString"
            ])

            try {
                def response = client.put(
                    path: "/rest/api/3/issue/$issue.key",
                    contentType: ContentType.JSON,
                    body: payload
                )

                if (response.status != 204) {
                    log.error("Failed to update issue ${issue.key}: ${response.data}")
                } else {
                    log.info("Successfully updated issue ${issue.key}")
                }
            } catch(Exception e) {
                log.error("Error updating issue ${issue.key}: ${e.message}")
            }
        } 
    }
} catch (SearchException e) {
    log.error("Error executing search: ${e.message}")
}

...