import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.exception.CreateException
import com.atlassian.jira.service.util.ServiceUtils
import com.atlassian.jira.service.util.handler.MessageHandlerContext
import com.atlassian.jira.service.util.handler.MessageUserProcessor
import com.atlassian.jira.user.util.UserManager
import com.atlassian.mail.MailUtils
final targetProjectKey = 'TEST'
final defaultReporterName = 'admin'
final issueTypeForNewIssue = 'Task'
final epicLinkFieldName = 'Epic Link'
def messageUserProcessor = ComponentAccessor.getComponent(MessageUserProcessor) as MessageUserProcessor
def userManager = ComponentAccessor.getComponent(UserManager)
def projectManager = ComponentAccessor.projectManager
def issueFactory = ComponentAccessor.issueFactory
def customFieldManager = ComponentAccessor.customFieldManager
def subject = message.subject as String
def body = MailUtils.getBody(message) as String
def issueFromSubject = ServiceUtils.findIssueObjectInString(subject)
def issueFromBody = ServiceUtils.findIssueObjectInString(body)
if (issueFromSubject) {
// Existing issue found in subject so will not create a new issue
return
}
if (!(issueFromBody?.issueType?.name in ['Epic', 'Initiative'])) {
// No existing Epic or Initiative Issue Key in email body so will not create a new issue
return
}
def project = projectManager.getProjectObjByKey(targetProjectKey)
def user = userManager.getUserByName(defaultReporterName)
def reporterUser = messageUserProcessor.getAuthorFromSender(message) ?: user
def epicLinkField = customFieldManager.customFieldObjects.findByName(epicLinkFieldName)
def issueObject = issueFactory.issue.with {
setProjectObject(project)
setSummary(subject ?: 'Created via ScriptRunner mail handler') // Issues must always have a summary
setDescription(body)
setIssueTypeId(project.issueTypes.find { it.name == issueTypeForNewIssue }.id)
setReporter(reporterUser)
setCustomFieldValue(epicLinkField, issueFromBody)
it
}
try {
issue = (messageHandlerContext as MessageHandlerContext).createIssue(user, issueObject)
} catch (CreateException e) {
log.error('Error creating issue: ', e)
}