Create Event listener for RoleMembershipCreatedEvent in scriptrunner

Jan Carlin (EfiCode) June 4, 2019

I need to create an issue when someone adds a user to any project's Administrators Role and I thought I'd use scriptrunner's Listener functionality.

So I have set this up:

Skärmavbild 2019-06-04 kl. 14.46.39.png

This code works if I run it in the console (substituting some variables like event of course)  but the listener never executes:

import com.atlassian.jira.user.ApplicationUser
import com.atlassian.jira.bc.issue.IssueService
import com.atlassian.jira.component.ComponentAccessor as CmpAcc
import com.atlassian.jira.issue.MutableIssue
import com.atlassian.jira.issue.Issue
import com.atlassian.jira.issue.IssueInputParameters
import com.atlassian.jira.project.Project
import com.atlassian.jira.project.ProjectManager
import com.atlassian.jira.issue.issuetype.IssueType
import com.atlassian.jira.issue.fields.config.manager.IssueTypeSchemeManager
import com.atlassian.crowd.event.role.RoleMembershipCreatedEvent

def createIssue(Project project, String summary, String description, String reporterName)  {
IssueService issueService = CmpAcc.getIssueService();
IssueInputParameters inpParms = issueService.newIssueInputParameters();
inpParms.setProjectId(project.id)
inpParms.setSummary(summary)
inpParms.setDescription(description)
inpParms.setReporterId(reporterName as String)
IssueTypeSchemeManager issueTypeSchemeManager = CmpAcc.getIssueTypeSchemeManager()
def ity = issueTypeSchemeManager.getIssueTypesForProject(project).find{it.name == 'Task'}
inpParms.setIssueTypeId(ity.getId())

IssueService.CreateValidationResult createValidationResult = issueService.validateCreate(adminUser, inpParms);
IssueService.IssueResult createResult = issueService.create(adminUser, createValidationResult)
log.warn createValidationResult.toString()
}

def adminUser = CmpAcc.userManager.getUserByName("xxx")
def authContext = CmpAcc.getJiraAuthenticationContext()
authContext.setLoggedInUser(adminUser)

def event = event as RoleMembershipCreatedEvent
createIssue(
CmpAcc.projectManager.getProjectObjByKey('JIRA'),
"Project Admin Role changed",
"Project changed - ${event.source.toString()}",
adminUser.getName()
)

 

1 answer

1 accepted

0 votes
Answer accepted
Mark Markov
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
June 5, 2019

Hello @Jan Carlin (EfiCode) 

Does listener execute without errors?

Jan Carlin (EfiCode) June 5, 2019

It does execute successfully if I specify a different Event, let's say UserEvent. It does nothing then of course and the cast fails

def event = event as RoleMembershipCreatedEvent

If I specify only  RoleMembershipCreatedEvent the Listener doesn't execute at all.

Jan

Mark Markov
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
June 5, 2019

I did some research and find out, when user is added so Project Role istead of RoleMembershipCreatedEvent fires ProjectRoleUpdatedEvent, so you should adapt script for this event, like this:

import com.atlassian.jira.bc.issue.IssueService
import com.atlassian.jira.component.ComponentAccessor as CmpAcc
import com.atlassian.jira.issue.IssueInputParameters
import com.atlassian.jira.project.Project
import com.atlassian.jira.issue.fields.config.manager.IssueTypeSchemeManager


def createIssue(Project project, String summary, String description, String reporterName) {
IssueService issueService = CmpAcc.getIssueService();
IssueInputParameters inpParms = issueService.newIssueInputParameters();
inpParms.setProjectId(project.id)
inpParms.setSummary(summary)
inpParms.setDescription(description)
inpParms.setReporterId(reporterName as String)
IssueTypeSchemeManager issueTypeSchemeManager = CmpAcc.getIssueTypeSchemeManager()
def ity = issueTypeSchemeManager.getIssueTypesForProject(project).find{it.name == 'Task'}
inpParms.setIssueTypeId(ity.getId())

IssueService.CreateValidationResult createValidationResult = issueService.validateCreate(adminUser, inpParms);
IssueService.IssueResult createResult = issueService.create(adminUser, createValidationResult)
log.warn createValidationResult.toString()
}

def adminUser = CmpAcc.userManager.getUserByName("xxx")
def authContext = CmpAcc.getJiraAuthenticationContext()
authContext.setLoggedInUser(adminUser)

createIssue(
CmpAcc.projectManager.getProjectObjByKey('JIRA'),
"Project Admin Role changed",
"Project changed - ${event.getProject().getKey()}",
adminUser.getName()
)

And for you information. this script will run on every user added to any projectrole, so you should add some checks.

Like Jan Carlin (EfiCode) likes this
Jan Carlin (EfiCode) June 5, 2019

Thank you so much! It worked nicely!

I guess that Event name makes sense.

Cheers, Jan

Suggest an answer

Log in or Sign up to answer