# apostrophe-tasks

# Inherits from: apostrophe-module

# apos.tasks

This module allows other modules to create command line tasks.

A command line task is invoked like this:

node app apostrophe-migrations:migrate

Apostrophe is fully initialized before your task is run, except that it does not listen for connections. So you may access all of its features in your task.

# Methods

# invoke(name, args, options, callback)

For use when you wish to execute an Apostrophe command line task from your code and continue, without using the command line or using the child_process module.

Except for name, all arguments may be omitted.

If you do not pass a callback, a promise is returned.

Examples (assume products extends apostrophe-pieces):

self.apos.tasks.invoke('apostrophe-users:add', [ 'admin', 'admin' ]).then(function() { ... })

self.apos.tasks.invoke('products:generate', { total: 20 }).then(function() { ... })

The args and options arguments may be completely omitted.

If present, args contains an array of positional arguments to the task, not including the task name.

If present, options contains the optional parameters that would normally be hyphenated, i.e. at the command line you might write --total=20.

Gotchas

If you can invoke a method directly rather than invoking a task, do that. This method is for cases where that option is not readily available.

During the execution of the task, self.apos.argv will have a new, temporary value to accommodate tasks that inspect this property directly rather than examining their argv argument. self.apos.argv will be restored at the end of task execution.

Some tasks may not be written to be "good neighbors." For instance, a task developer might assume they can exit the process directly.

# add(groupName, name, usage, callback)

Add a command line task to Apostrophe. It is easiest to invoke this via the addTask method of your own module. You may also call it directly.

If you do call directly, the group name should be the name of your module.

The name may be any short, memorable identifier, hyphenated if necessary.

You may omit the usage parameter complete if you don't want to supply a help message, but we recommend that you do so.

Your callback function receives (apos, argv, callback). Your function should perform the necessary task, referring to argv._ for positional command line arguments ([0] is the task name) and to argv.foo for an option specified as --foo=bar.

On completing the task your function should invoke the callback. If the callback is invoked with null, Apostrophe will exit quietly with status 0 (success), otherwise it will display the error given and exit with status 1 (failure).

Your task may return a promise instead of invoking the callback. You must not do both.

Your code will usually need to invoke methods that require a req argument. Call self.apos.tasks.getReq() to get a req object with unlimited admin permissions. Use self.apos.tasks.getAnonReq() to get a req object without permissions.

# run()

You should not need to call this method directly. You probably want apos.tasks.invoke (see above).

This method is invoked by Apostrophe to execute the task specified by the first command line argument. On completion the process exits. If the task experiences an error it is printed to console.error and the process exits with a nonzero status code.

This method also implements the help task directly.

# find(fullName)

Identifies the task corresponding to the given command line argument. This allows for Rails-style hyphenated syntax with a : separator, which is the documented syntax, and also allows camel-cased syntax with a . separator for those who prefer a more JavaScript-y syntax.

# usage()

Displays a usage message, including a list of available tasks, and exits the entire program with a nonzero status code.

# getReq(properties)

Return a req object with permission to do anything. Useful since most APIs require one and most tasks should run with administrative rights.

The req object returned is a mockup of a true Express req object with sufficient functionality to implement Apostrophe's unit tests, so it is suitable for command line task code that requires a req as well.

Optionally a properties object can be passed. If it is passed its properties are added to the req object before any initialization tasks such as computing req.absoluteUrl. This allows testing of that mechanism by setting req.url.

# getAnonReq(properties)

Return a req object with privileges equivalent to an anonymous user visiting the website. Most often used for unit testing but sometimes useful in tasks as well.

The req object returned is a mockup of a true Express req object with sufficient functionality to implement Apostrophe's unit tests, so it is suitable for command line task code that requires a req as well.

Optionally a properties object can be passed. If it is passed its properties are added to the req object before any initialization tasks such as computing req.absoluteUrl. This allows testing of that mechanism by setting req.url.