I'm developing a Jira Cloud Add on that will receive sprint related events:
"modules": {
"webhooks": [
{
"event": "sprint_started",
"url": "/sprints/started?project={project.key}&id={project.id}"
},
{
"event": "sprint_closed",
"url": "/sprints/closed?project={project.key}&id={project.id}"
}
As described in the documentation I've used the placeholders {project.key} and {project.id} to get the information about the project in which the event was triggered.
This is the controller that is invoked:
@PostMapping(value = ["/started", "/closed"])
fun sprintEvent(@AuthenticationPrincipal hostUser: AtlassianHostUser, @RequestParam project: String, @RequestParam id: String, @RequestBody body: Map<String, Any>): Mono<Void> {
However both project and id are null
The same thing for issue events works smoothly, receiving the project key:
"modules": {
"webhooks": [
{
"event": "jira:issue_created",
"url": "/issues/created?project={project.key}&issue={issue.key}"
},
@PostMapping(value = ["/created", "/updated"])
fun issueEvent(@AuthenticationPrincipal hostUser: AtlassianHostUser, @RequestParam project: String, @RequestParam issue: String, @RequestBody body: Map<String, Any>): Mono<Void> {
What's the problem with the sprint events?
There seems to be a limitation in which those properties aren't available in the sprint event "context".
My workaround was:
val boardId = (body["sprint"] as Map<String, Any?>)["originBoardId"] as Int
val board = atlassianHostRestClients.authenticatedAsAddon().getForObject("/rest/agile/1.0/board/{boardId}", Map::class.java, boardId) as Map<String, *>`
val projectKey = (board["location"] as Map<String, *>)["projectKey"] as String