Services - Commands
Commands are user-defined functions attached to a service. They're useful when you need to perform complex non-crud operations.
Generate a new command
You can use the CLI to quickly generate a new command.
Note
Command names are converted to snake_case by the CLI
Like services, CMDs have 3 main components:
A Dto:
Command DTOs follow the same validation/transform rules as entities.
A Security:
say_hello.security.ts
This is where you define the access rules for your CMD. As for the service security, nothing is allowed unless specified.
const getCmdSecurity = (say_hello, profile): CmdSecurity => { 
    return {
        dto: SayHelloDto,
        rolesRights: {
            user: {
                async defineCMDAbility(can, cannot, ctx) {
                    // Define abilities for user
                }
            }
        },
    }
}
Ability syntax is can(<cmd_name>, <service_name>, ...args), for example:
async defineCMDAbility(can, cannot, ctx) {
    can(say_hello, profile) //User can call say_hello on service profile
}
An Action:
This is the CMD implementation. Any value returned is sent back to the client.Eicrud's controller will route CMD calls to your CrudService's methods ('$' + <cmd_name>):
profile.service.ts
async $say_hello(dto: SayHelloDto, ctx: CrudContext, inheritance?: any) {
   return await serviceCmds.say_hello.action.call(this, dto, ctx, inheritance);
}
Call your command
You can call your command from the client:
const dto = { arg: 'world'};
const res = await profileClient.cmd('say_hello', dto);
console.log(res) // Hello world!
Or you can call your CMD from another service:
const dto = { arg: 'world'};
const res = await profileService.$say_hello(dto, null);
console.log(res) // Hello world!
Info
$ functions should always be treated as async, check out this guide to learn more.