1.1.0 • Published 5 years ago

pailingual-odata v1.1.0

Weekly downloads
2
License
MIT
Repository
github
Last release
5 years ago

Pailingual-OData

Pailingual OData is the Typescript library offering a simple and type-safe access to your OData v4 services.

For using arrow functions as filter predicate, you need to register estree compatible parser (e.g. acorn)

import { parse } from "acorn";
import { setParser } from "pailingual-odata";
setParser(f => parse(f, { locations: true }) as any);

Supported OData v4 features

Resource path:

  • EntitySet
  • Singleton
  • Single-valued and collection-valued navigation properties
  • Get entity by key
  • Bounded and unbounded operations
  • $count segment

Query options for collection:

  • $skip and $top
  • $orderby (also applicable for nested properties in complex type and single-valued navigation property)
  • $filter (support builtin functions)
  • $search
  • $expand($skip;$top;$orderby;$filter;$search;$expand;$count;$select)
  • $select

Query options for entity:

  • $expand
  • $select

Types

  • Complex type
  • Enum
  • Edm.Int32
  • Edm.Int16
  • Edm.Boolean
  • Edm.String
  • Edm.Single
  • Edm.Guid
  • Edm.DateTimeOffset
  • Edm.Date
  • Edm.Double
  • Edm.TimeOfDay
  • Edm.Decimal

How to define a model

You can use pailingual-odata-model-generatior for generate model from service metadata.

Defining an entity

Define your own interface extending interface IEntityBase

export interface MyEntity extends IEntityBase {
  id:number;
  field:string;
  nullable?:string;
  complexProperty:ComplexType;
  
  singleValuedNavigationProperty?: OtherEntity;
  collectionValuedNavigationProperty?: OtherEntity[];
}

Defining an ApiContext

Define your own interface extending interface IApiContextBase

export interface MyApiContext extends IApiContextBase {
  EntitySet1: MyEntity[];
  EntitySet2: OtherEntity[];
  Singleton: MyEntity;
}

Defining operations

For defining operations use special properties in your defenition

  • $$Functions - defines unbounded functions in ApiContext or bounded functions in Entity
  • $$Actions - defines unbounded actions in ApiContext or bounded actions in Entity
  • $$EntitySetFunctions - defines collection bounded functions in Entity
  • $$EntitySetActions - defines collection bounded actions in Entity
    export interface MyApiContext extends IApiContextBase {
    ...
     $$Actions:{
       unboundedAction(): void;
     };
     $$Functions:{
       unboundedFunction(arg:string):MyEntity[];
     }
    }

export interface MyEntity extends IEntityBase { ... $$Actions:{ boundedAction(): string; }; $$Functions:{ boundedFunction(arg?:string):ComplexType[]; } $$EntitySetActions:{ boundedAction(): MyEntity; }; $$EntitySetFunctions:{ boundedFunction():ComplexType; } }


## Create ApiContext
Context allows your to make queries to dataservice. For creating context use ApiContextFactory function. This function have few overrides.
```ts
import { ApiContextFactory, loadMetadata } from "pailingual-odata";

//Create context by url. Metadata will be loaded or get from cache
ApiContextFactory("/api").then(context=>{/*Your queryes*/}); 

//Create context use preloaded metadata
var context = ApiContextFactory(metadata);
/*Your queryes*/

Execute query

var maxId=10;
var result:Entity<MyEntity> 
         & ExpandedProperty<MyEntity, "singleValuedNavigationProperty"> 
         & ExpandedProperty<MyEntity, "collectionValuedNavigationProperty", Pick<MyEntity, "Id">> =null;
result = await context.EntitySet1
   .$filter((e, p)=>e.Id < p.maxId, {maxId})
   .$expand("singleValuedNavigationProperty")
   .$expand("collectionValuedNavigationProperty", i=>i.$select("Id"))
   .$exec()