Aha! Develop | Extension API reference
The aha
extension API is the primary entrypoint for extensions to integrate with Aha! Develop. There are several helpful methods for making requests to the Aha! Develop GraphQL API, working with Aha! Develop records, authenticating with services, and communicating between extensions.
Click any of the following links to skip ahead:
Access
Inside an extension, aha
is accessible directly as a global variable:
aha.on("endpointName", ({ headers, payload }, {identifier, settings}) => {
// code goes here.
})
In the browser console, aha
is also accessible globally, through window
:
feature = new aha.models.Feature({ referenceNum: "PLAT-123" })
await feature.getExtensionFields("aha-develop.github")
Browser API
These methods are only accessible from extensions running in the browser.
auth
auth
is used to fetch authentication information for a third-party service, optionally going through a login flow if necessary. This returns authData that can be passed into future requests to that service.
const authData = await aha.auth("github", {
useCachedRetry: true,
parameters: { scope: "repo, read:org" },
});
const graphqlWithAuth = graphql.defaults({
headers: {
authorization: `token ${authData.token}`,
},
});
auth(service, options, callback)
service
: The service to authenticate to. Currently, supported services areasana
,atlassian
,ado
,figma
,github
,gitlab
,google
,rally
,sentry
,trello
, andzendesk
.options
:parameters
: service-specific parameters to pass through the authentication process.useCachedRetry
: use stored authentication information if it exists. Automatically reauthorize if necessary.reAuth
: authenticate if the user is not already logged in. True by default.
callback
: an optional callback called after a successful authentication. Only called when the user is logged in.returns
authData
: service-specific authentication information. All existing services have the following shape:{
error: string,
result: {
token: string
}
}
command
command
executes a command from a command extension contribution, passing args
into it.
aha.command('aha-develop.github.addLink', { record: feature });
command(fullyQualifiedCommandName, args)
fullyQualifiedCommandName
: the fully qualified name of the command to execute. If you are executing a command from your own extension, you can use the short name instead.args
: an object that will be sent to the command
commandPrompt
From a command extension contribution, commandPrompt
will open a prompt for user input.
const prUrl = await aha.commandPrompt("Link URL", {
placeholder: "Enter the URL to a pull request",
});
commandPrompt(prompt, { placeholder, default })
prompt
: a short bit of text to describe what the prompt is forplaceholder
: placeholder text to show on the empty fielddefault
: default data to fill the field with
Returns a promise that will resolve with the input value.
commandOutput
commandOutput
prints a message to the command window while a command is running.
if (!record) {
aha.commandOutput("Open a record first to sync PRs for that record");
return;
}
commandOutput(message)
message
: a string to print to the command window
project
Returns a Project
instance representing the current team/project for the user/page. This will be the team/project currently selected in the switcher in the top-left corner of the browser.
This can potentially return null
in cases where there is no current team/project for the current page.
console.log(aha.project.name); // logs the current team/project's name
user
This returns a User
instance representing the current user.
console.log(aha.user.name); // logs the current user's name
Browser / Server API
These are available anywhere aha
is accessible.
account
This returns an Account
instance representing the current account.
console.log(aha.account.name); // logs the current account's name
triggerBrowser
triggerBrowser
will trigger an event handler contribution in the current browser tab.
aha.triggerBrowser('aha.workflow-board.shipped', args);
triggerBrowser(fullyQualifiedEventName, args)
fullyQualifiedEventName
: the fully qualified name of the event to trigger. If you are triggering an event from your own extension, you can use the short name instead.args
: event-specific args that will be passed to the event handler.
triggerServer
triggerServer
will trigger an event handler contribution running on the Aha! Develop servers, running with the permissions of the user who installed the extension.
aha.triggerServer('aha.workflow-board.shipped', args);
triggerServer(fullyQualifiedEventName, args)
fullyQualifiedEventName
: the fully qualified name of the event to trigger. If you are triggering an event from your own extension, you can use the short name instead.args
: event-specific args that will be passed to the event handler.
on
aha.on("addLink", async ({ record, { identifier, settings } }) => {
...
on
is a generic method for registering contributions and event handlers.
getImporter
getImporter
returns an object that can be used to register callbacks when importing records from other systems.
const importer = aha.getImporter("aha-develop.github-import.issues");
importer.on({ action: "listCandidates" }, ...
getImporter(importerName)
importerName
: the fully qualified name of the importer extension to use for registering callbacks.
models
models
exposes a number of JavaScript wrappers to Aha! Develop models. These are JavaScript objects that can be used in an object-oriented way to fetch and save Aha! Develop record data.
graphQuery
graphQuery
runs a GraphQL query against the Aha! Develop GraphQL API.
const query = `
query features($releaseId: ID) {
features(filters: {releaseId: $releaseId}, order: [{name: createdAt, direction: DESC}]) {
nodes {
id
name
referenceNum
assignedToUser {
name
}
requirements {
name
referenceNum
}
}
}
}`;
const resultData = aha.graphQuery(query, { variables: { releaseId: "DEMO-R-1" } });
graphQuery(queryString, { variables })
queryString
: a string that can be used as a GraphQL queryvariables
: optional variables to be used with the GraphQL query
graphQuery
returns the GraphQL object result as a plain JavaScript object.
graphMutate
graphMutate
runs a GraphQL mutation against the Aha! Develop GraphQL API.
const mutation = `
mutation CreateFeature($name: String, $releaseId: ID) {
createFeature(attributes: {name: $name, release: {id: $releaseId}}) {
...
`;
const resultData = aha.graphMutate(mutation, { variables: { name: "A new feature", releaseId: "DEMO-R-1" } });
graphMutate(mutationString, { variables })
queryString
: a string that can be used as a GraphQL mutationvariables
: optional variables to be used with the GraphQL mutation
graphMutate
ā Returns the GraphQL object result as a plain JavaScript object