npm package: @hookcompany/feathers-custom-methods
Description: 💥 Create feathers service with custom methods names.
Author: Hook Company Team
Latest version: 1.10.0

# Feathers Custom Methods

## 💥 Create feathers service with custom methods names.

[![NPM version](https://badge.fury.io/js/%40hookcompany%2Ffeathers-custom-methods.png)](http://badge.fury.io/js/%40hookcompany%2Ffeathers-custom-methods)

[![Npm Downloads](https://nodei.co/npm/@hookcompany%2Ffeathers-custom-methods.png?downloads=true)](https://nodei.co/npm/@hookcompany%2Ffeathers-custom-methods.png?downloads=true)

## Getting Started

Use npm:

```sh
npm install --save-dev babel-plugin-transform-decorators-legacy
npm install --save @hookcompany/feathers-custom-methods
```

Or use yarn:

```sh
yarn add --dev babel-plugin-transform-decorators-legacy
yarn add @hookcompany/feathers-custom-methods
```

### Step 1: Babel Configuration

You have to configure decorators plugin on babelrc.

#### .babelrc

```json
{
  "presets": ["es2015"],
  "plugins": ["transform-decorators-legacy"]
}
```

### Step 2: Service Config

You have to pass to customMethods function the service instance, path and hooks. And this function will return an object that has the service instance, path and hooks.

#### users.service.js

```js
import customMethods from '@hookcompany/feathers-custom-methods';
import Service from './users.class.js';
import externalHooks from'./users.hooks';

export default function() {
  const app = this;
  const paginate = app.get('paginate');
  const options = { name: 'users', paginate };
  const { service, path, hooks } = customMethods(
    new Service(options),
    '/users',
    externalHooks
  );

  app.use(path, service);

  const usersService = app.service(path);

  usersService.hooks(hooks);
};
```

### Step 3: Service Class

After configure service, you can create your service class with custom methods, using decorators, like this:

#### users.class.js

```js
import { find, get, create, update, patch, remove } from '@hookcompany/feathers-custom-methods';

class Service {
  @find
  foo() {
    return Promise.resolve([]);
  }

  @find
  bar() {
    return Promise.resolve([]);
  }

  @get
  buzz(id) {
    return Promise.resolve({ id, text: `A new message with ID: ${id}!` });
  }

  @create
  foobar(data, params) {
    return Promise.resolve(data);
  }

  @update
  foobuzz(id, data, params) {
    return Promise.resolve(data);
  }

  @patch
  barbuzz(id, data, params) {
    return Promise.resolve(data);
  }

  @remove
  foobarbuzz(id, params) {
    return Promise.resolve({ id });
  }
}

export default Service;
```

### Step 4: Hooks

Besides use custom methods on the service, you can use on hooks too, like this:

#### users.hooks.js

```js
const logger = () => context => console.log(context.params);

export default {
  before: {
    all: [logger()],
    foo: [logger()],
    bar: [logger()],
    buzz: [logger()],
    foobar: [logger()],
    foobuzz: [logger()],
    barbuzz: [logger()],
    foobarbuzz: [logger()]
  },
  after: {
    all: [logger()],
    foo: [logger()],
    bar: [logger()],
    buzz: [logger()],
    foobar: [logger()],
    foobuzz: [logger()],
    barbuzz: [logger()],
    foobarbuzz: [logger()]
  },
  error: {
    all: [logger()],
    foo: [logger()],
    bar: [logger()],
    buzz: [logger()],
    foobar: [logger()],
    foobuzz: [logger()],
    barbuzz: [logger()],
    foobarbuzz: [logger()]
  }
};
```

### Step 5: Consuming The Service Methods

You can consume the service methods, like that:

#### Method foo(find)

[GET] localhost:3030/users/foo

#### Method bar(find)

[GET] localhost:3030/users/bar

#### Method buzz(get)

[GET] localhost:3030/users/buzz/:id

#### Method foobar(create)

[POST] localhost:3030/users/foobar

#### Method foobuzz(update)

[PUT] localhost:3030/users/foobuzz/:id

#### Method barbuzz(patch)

[PATCH] localhost:3030/users/barbuzz/:id

#### Method foobarbuzz(remove)

[DELETE] localhost:3030/users/foobarbuzz/:id