# ng-rest

> Powerful and flexible angular REST client. Fully abstraction layer.

Latest version **1.0.0-beta.6.3** (published 2017-04-28) · MIT license · 0 weekly downloads

## Install

```sh
npm install ng-rest
pnpm add ng-rest
yarn add ng-rest
bun add ng-rest
```

## Health

**Score 25/100 (F)** — status: abandoned.

Positive: has types; no vulnerabilities; high quality score.

Warnings: low downloads; no esm support.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 1.0.0-beta.6.3 |
| Published | 2017-04-28 |
| First published | 2017-03-14 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | bundled |
| Module format | CommonJS |
| Node | >= 4.2.1 |
| Dependencies | 0 |
| Known vulnerabilities | 0 |
| Install scripts | no |
| Author | Anton Korniychuk |
| Maintainers | ankor |
| Keywords | ng, angular, angular2, angular4, http, api, api-client, api-wrapper, restful, restful-api, rest, restapi, rest-api, rest-client, request |

## Links

- npm: https://www.npmjs.com/package/ng-rest
- Repository: https://github.com/ancor-dev/ng-rest
- Issues: https://github.com/ancor-dev/ng-rest/issues
- npm.io page: https://npm.io/package/ng-rest

## Alternatives

- [angular-pipes](https://npm.io/package/angular-pipes.md) — 5.6K weekly downloads
- [@ng-web-apis/midi](https://npm.io/package/@ng-web-apis/midi.md) — 2.6K weekly downloads
- [happn-3](https://npm.io/package/happn-3.md) — 1.6K weekly downloads
- [@opensip-cli/lang-go](https://npm.io/package/@opensip-cli/lang-go.md) — 1.2K weekly downloads
- [mongoose-typescript](https://npm.io/package/mongoose-typescript.md) — 85 weekly downloads

## Recent versions

- 1.0.0-beta.6.3 (latest) — 2017-04-28
- 1.0.0-beta.6.2 — 2017-04-28
- 1.0.0-beta.6.1 — 2017-04-28
- 1.0.0-beta.6.0 — 2017-04-28
- 1.0.0-beta.5.8 — 2017-04-21
- 1.0.0-beta.5.7 — 2017-04-18
- 1.0.0-beta.5.6 — 2017-04-17
- 1.0.0-beta.5.5 — 2017-04-15
- 1.0.0-beta.5.4 — 2017-04-13
- 1.0.0-beta.5.3 — 2017-04-12
- 1.0.0-beta.5.2 — 2017-04-10
- 1.0.0-beta.5.1 — 2017-04-10
- 1.0.0-beta.5.0 — 2017-04-10
- 1.0.0-beta.4.4 — 2017-04-09
- 1.0.0-beta.4.3 — 2017-04-08
- … 21 more at https://npm.io/package/ng-rest/versions

## README

# Ng Rest
Powerful and flexible angular REST client. Fully abstraction layer.

### How to use:
**Step 0.** Register services in `AppModule`. `src/app/app.module.ts`

```ts
// ...,
import { RequestService, RestRequestService } from 'ng-rest';

@NgModule({
  // ...,
  providers: [
    // ...,
    RequestService,
    RestRequestService,
  ],
  // ...,
})
class AppModule {
  // ...
}
```

**Step 1.** Make a model. For example `src/app/models/user.model.ts`
```ts
import { Model } from 'ng-rest';

import { Location } from './location';

class User extends Model<User> {
  public id: number;
  public name: string;
  public isAdmin: boolean;
  public location: Location; // any submodel
  
  public constructor(data: any = {}) {
    super(data);
    
    this.fill(data)
        .number('id')
        .string('name')
        .boolean('isAdmin')
        .model('location');
  }
}
```

**Step 2.** Make an api service. For example `src/app/core/api/user-api.service.ts`
```ts
import { Injectable, Injector } from '@angular/core';

import { AnyObject, StringObject } from 'typed-object-interfaces';
import { DefaultRestService, RestRequestService } from 'ng-rest';

import { User } from 'app/models/user.model';
import { APP_CONFIG, AppConfig } from 'app/config';

/**
 * User Api Service
 */
@Injectable()
export class UserApiService extends DefaultRestService<User> {
  protected baseUrl;;
  protected modelClass = User;

  public constructor(
    restRequest: RestRequestService,
    @Inject(APP_CONFIG) private config: AppConfig,
    private locationApi: locationApiService,
  ) {
    super(restRequest);
    this.baseUrl = `${config.apiBaseUrl}/users`;
  }

  /**
   * Rename fields that we want
   */
  protected fieldsMap(): StringObject {
    return {
      'is_admin':      'isAdmin',
      'user_name':     'name',
      'user_location': 'location',
    };
  }
  
  /**
   * Service map for parse submodels
   */
  protected submodelsMap(): StringObject {
    return {
      'location': this.locationApi,
    };
  }
}
```

**Step 3.** Just use :)

```ts
// ...
imoprt { Entity } from 'ng-rest';

import { User } fom 'app/models/user.model.ts';
import { UserApiService } from 'app/core/api/user-api.service.ts';

// ...
class MyComponent implements OnInit {
    public constructor(
      private userApi: UserApiService,
    ) {}
    
    public ngOnInit() {
      let user = new User();
      
      user.name = 'Mike';
      user.isAdmin = false;
      
      this.userApi.create(user).subscribe((entity: Entity<User>) => {
        let savedUser: User = entity.data;
        
        console.log(savedUser.id); // is a number
        console.log(savedUser instanceof User); // true
      });
    }
}
```

### F.A.Q.

- **How to add token to every request?**  
  You need to do:
  - extend `RestRequestService` and override `beforeSend` method.
  - register in `AppModule` and inject into every your `*ApiService` your own `RestRequestService` instead of the service from `ng-rest`
  
  Example:
  ```ts
  import { Injectable } from '@angular/core';
  
  import {
    RestRequestData, RequestService,
    RestRequestService as RestRequestService_
  } from 'ng-rest';
  
  import { SessionService } from 'app/core/services/session.service';
  
  @Injectable()
  export class RestRequestService extends RestRequestService_ {
  
    public constructor(
      request: RequestService,
      private session: SessionService,
    ) {
      super(request);
    }
  
    protected beforeSend(data: RestRequestData): RestRequestData {
      const updatedData: RestRequestData = { ...data };
  
      if (!data.token && this.session.token) {
        updatedData.token = this.session.token;
      }
  
      return updatedData;
    }
  
  }
  ```

### Todo

- make Model class as a separate package
- fix and add comments in the code
- write documentation
- configure trevis
- configure webpack
- make and commit a build

**Yarn Warning:** if you use `yarn` instead of the `npm`, please specify the exact version of the package.  
For example `1.0.0-beta.4.4` without any `^` or `~` at the start.
It is need because yarn incorrect work with `beta` sub-versions.
If you specify `^1.0.0-beta.4.0` then version `1.0.0.beta.1` will be installed.

---
_Source: https://npm.io/package/ng-rest · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
