odata-v4-server
Version:
OData V4 Server
96 lines (83 loc) • 3.82 kB
text/typescript
import { MongoClient, ObjectID, Db } from "mongodb";
import { createQuery } from "odata-v4-mongodb";
import { Edm, odata, ODataController, ODataServer, ODataQuery, createODataServer, ODataErrorHandler } from "../lib/index";
import { Category, Product, NorthwindTypes } from "./model";
import { Writable } from "stream";
let categories = require("./categories");
let products = require("./products");
const mongodb = async function():Promise<Db>{
return (await MongoClient.connect("mongodb://localhost:27017/odataserver")).db();
};
.type(Product)
.EntitySet("Products")
export class ProductsController extends ODataController{
.GET
async find(.query query:ODataQuery, .stream stream:Writable){
let mongodbQuery = createQuery(query);
return (await mongodb()).collection("Products").find(mongodbQuery.query, { projection: mongodbQuery.projection, skip: mongodbQuery.skip, limit: mongodbQuery.limit }).stream().pipe(stream);
}
.GET
async findOne(.key key:string, .query query:ODataQuery){
let mongodbQuery = createQuery(query);
return (await mongodb()).collection("Products").findOne({ _id: key }, {
fields: mongodbQuery.projection
});
}
/*@odata.GET("Category")
async getCategory(@odata.result result:any){
return (await mongodb()).collection("Categories").findOne({ _id: result.CategoryId });
}*/
}
.type(Category)
.EntitySet("Categories")
export class CategoriesController extends ODataController{
.GET
async find(.query query:ODataQuery, .stream stream:Writable){
let mongodbQuery = createQuery(query);
return (await mongodb()).collection("Categories").find(mongodbQuery.query, { projection: mongodbQuery.projection, skip: mongodbQuery.skip, limit: mongodbQuery.limit }).stream().pipe(stream);
}
.GET
async findOne(.key() key:string, .query query:ODataQuery){
let mongodbQuery = createQuery(query);
return (await mongodb()).collection("Categories").findOne({ _id: key }, {
fields: mongodbQuery.projection
});
}
/*@odata.GET("Products")
async getProducts(@odata.result result:any, @odata.query query:ODataQuery, @odata.stream stream:Writable){
let mongodbQuery = createQuery(query);
mongodbQuery.query = { $and: [mongodbQuery.query, { CategoryId: result._id }] };
return (await mongodb()).collection("Products").find(mongodbQuery.query, mongodbQuery.projection, mongodbQuery.skip, mongodbQuery.limit).stream().pipe(stream);
}*/
}
.namespace("Northwind")
.Container(NorthwindTypes)
.container("NorthwindContext")
.controller(ProductsController)
.controller(CategoriesController)
.cors
export class NorthwindODataServer extends ODataServer{
.EntityType(Category)
.FunctionImport
*GetCategoryById(.String id:string){
return yield categories.filter((category: any) => category._id.toString() == id)[0];
}
.ActionImport
async initDb():Promise<void>{
let db = await mongodb();
await db.dropDatabase();
let categoryCollection = db.collection("Categories");
let productsCollection = db.collection("Products");
await categoryCollection.insertMany(categories);
await productsCollection.insertMany(products);
}
static errorHandler(err, req, res, next){
delete err.stack;
ODataErrorHandler(err, req, res, next);
}
}
createODataServer(NorthwindODataServer, "/odata", 3000);
process.on("warning", warning => {
console.log(warning.stack);
});
Error.stackTraceLimit = -1;