Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/korniychuk/ng-rest

Powerful and flexible angular REST client
https://github.com/korniychuk/ng-rest

angular angular2 angular4 api api-client api-wrapper http ng request rest rest-api rest-client restapi restful restful-api

Last synced: about 2 months ago
JSON representation

Powerful and flexible angular REST client

Awesome Lists containing this project

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 {
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 {
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 modelFieldsMap(): 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) => {
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.