ng-rest
TypeScript icon, indicating that this package has built-in type declarations

1.0.0-beta.6.3 • Public • Published

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

// ...,
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

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

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 :)

// ...
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:

    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.

Package Sidebar

Install

npm i ng-rest

Weekly Downloads

0

Version

1.0.0-beta.6.3

License

MIT

Last publish

Collaborators

  • ankor