Skip to content

korniychuk/ng-rest

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

44 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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