All Projects → andryuha49 → Odata V4 Typeorm

andryuha49 / Odata V4 Typeorm

Licence: mit
OData to TYPEORM query compiler

Programming Languages

typescript
32286 projects

Projects that are alternatives of or similar to Odata V4 Typeorm

Koa2 Api Scaffold
一个基于Koa2的轻量级RESTful API Server脚手架。
Stars: ✭ 694 (+4237.5%)
Mutual labels:  express
Morgan
HTTP request logger middleware for node.js
Stars: ✭ 6,788 (+42325%)
Mutual labels:  express
Simple Rest Api
Simple RESTFul API with Node.js and Express
Stars: ✭ 5 (-68.75%)
Mutual labels:  express
Nodeapi
Simple RESTful API implementation on Node.js + MongoDB.
Stars: ✭ 719 (+4393.75%)
Mutual labels:  express
Nodejs Learning Guide
Nodejs学习笔记以及经验总结,公众号"程序猿小卡"
Stars: ✭ 6,379 (+39768.75%)
Mutual labels:  express
Chinook Database
Sample database for SQL Server, Oracle, MySQL, PostgreSQL, SQLite, DB2
Stars: ✭ 786 (+4812.5%)
Mutual labels:  plpgsql
React Ssr Setup
React Starter Project with Webpack 4, Babel 7, TypeScript, CSS Modules, Server Side Rendering, i18n and some more niceties
Stars: ✭ 678 (+4137.5%)
Mutual labels:  express
Ajcss
Stars: ✭ 6 (-62.5%)
Mutual labels:  express
Mysql Sys
The MySQL sys schema
Stars: ✭ 758 (+4637.5%)
Mutual labels:  plpgsql
Generator Express
An express generator for Yeoman, based on the express command line tool.
Stars: ✭ 821 (+5031.25%)
Mutual labels:  express
Demo
“Happy Lager” Craft CMS demo site.
Stars: ✭ 730 (+4462.5%)
Mutual labels:  plpgsql
H5maker
h5编辑器类似maka、易企秀 账号/密码:admin
Stars: ✭ 753 (+4606.25%)
Mutual labels:  express
Vue 163 Music
【停止维护】网易云音乐web版,支持PC端常用功能,localStorage保存播放列表
Stars: ✭ 788 (+4825%)
Mutual labels:  express
Btc Rpc Explorer
Database-free, self-hosted Bitcoin explorer, via RPC to Bitcoin Core.
Stars: ✭ 699 (+4268.75%)
Mutual labels:  express
Nodepress
😎 RESTful API service for Blog/CMS, powered by @nestjs
Stars: ✭ 829 (+5081.25%)
Mutual labels:  express
Mevn Cli
Light speed setup for MEVN(Mongo Express Vue Node) Apps
Stars: ✭ 696 (+4250%)
Mutual labels:  express
Mysql Deadlocks
收集一些常见的 MySQL 死锁案例
Stars: ✭ 777 (+4756.25%)
Mutual labels:  plpgsql
Geek Navigation
❤️ 极客猿梦导航-独立开发者的导航站!
Stars: ✭ 832 (+5100%)
Mutual labels:  express
Call Forwarding Node
A sample implementation of advanced call forwarding using Twilio, Node.js and Express.js.
Stars: ✭ 6 (-62.5%)
Mutual labels:  express
React Native Full Example
第一个完整的react-native项目。包括服务端和移动端两部分。服务端使用express+bootstrap进行搭建,主要功能有登录、退出、模块选择、查看、修改、删除、分页等后台管理的基本功能;移动端主要用到组件View、Text、Image、ScrollView、ListView等常用的组件,也使用了第三方的地图服务(高德地图),作为初学者。是一个很好的学习案例。
Stars: ✭ 809 (+4956.25%)
Mutual labels:  express

OData V4 Service modules - TYPEORM Connector

Service OData v4 requests from a TYPEORM.

Synopsis

The OData V4 TYPEORM Connector provides functionality to convert the various types of OData segments into SQL query statements, that you can execute over a TYPEORM.

Potential usage scenarios

  • Create high speed, standard compliant data sharing APIs

Usage as server - TypeScript

example request: GET /api/users?$filter=id eq 42&$select=id,name

NestJS middleware

- middleware
import { Inject, Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response } from 'express';
import { odataQuery } from 'odata-v4-typeorm';
import { Repository } from 'typeorm';

import { UserEntity } from '../entities/user.entity';

@Injectable()
export class OdataUsersMiddleware implements NestMiddleware {
  constructor(
    @Inject('USERS_REPOSITORY') private readonly usersRepository: Repository<UserEntity>
  ) {}

  use(req: Request, res: Response, next: Function) {
    odataQuery(this.usersRepository)(req, res, next);
  }
}
users repository provider
import { Connection } from 'typeorm';
import { UserEntity } from '../user.entity';

export const userProviders = [
  {
    provide: 'USERS_REPOSITORY',
    useFactory: (connection: Connection) => connection.getRepository(UserEntity),
    inject: ['DATABASE_CONNECTION'],
  }
];
database provider
import { createConnection } from 'typeorm';
import { UserEntity } from '../entities/user.entity';

export const databaseProviders = [
  {
    provide: 'DATABASE_CONNECTION',
    useFactory: async () => await createConnection({
      type: 'postgres',
      host: 'localhost',
      port: 3306,
      username: 'postgres',
      password: 'root',
      database: 'test',
      synchronize: true,
      
      entities: [UserEntity]
    }),
  },
];
app module
import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';

import { databaseProviders } from './db/database.providers';
import { userProviders } from './providers/user.providers';
import { OdataUsersMiddleware } from './middlewares/odataUsers.middleware';

@Module({
  providers: [
    ...databaseProviders,
    ...userProviders,
  ],
})
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer
      .apply(OdataUsersMiddleware)
      .forRoutes('api/v1/odata/users');
  }
}

odataQuery

import express from 'express';
import { odataQuery } from 'odata-v4-typeorm';
import { getRepository } from 'typeorm';
import { User } from '../entities/user';

const app = express();
const usersRepository = getRepository(User);

app.get('/api/users', odataQuery(usersRepository));

const port = 3001;
app.listen(port, () => console.log(`Example app listening on port ${port}!`));

executeQuery by repository

import express from 'express';
import { executeQuery } from 'odata-v4-typeorm';
import { getRepository } from 'typeorm';
import { User } from '../entities/user';

const app = express();

app.get('/api/users', async (req, res) => {
  try {
    const usersRepository = getRepository(User);
    const data = await executeQuery(usersRepository, req.query);
    return res.status(200).json(data);
  } catch (e) {
    return res.status(500).json({message: 'Internal server error.'});
  }
});

const port = 3001;
app.listen(port, () => console.log(`Example app listening on port ${port}!`));

executeQuery by queryBuilder

import express from 'express';
import { executeQuery } from 'odata-v4-typeorm';
import { getRepository } from 'typeorm';
import { User } from '../entities/user';

const app = express();

app.get('/api/users', async (req, res) => {
  try {
    const queryBuilder = getRepository(User)
      .createQueryBuilder("user")
      .where("user.roleName = :roleName", { roleName: 'admin' });
    const data = await executeQuery(queryBuilder, req.query);
    return res.status(200).json(data);
  } catch (e) {
    return res.status(500).json({message: 'Internal server error.'});
  }
});

const port = 3001;
app.listen(port, () => console.log(`Example app listening on port ${port}!`));

createFilter

import { createFilter } from 'odata-v4-typeorm'

//example request:  GET /api/Users?$filter=Id eq 42
app.get("/api/Users", (req: Request, res: Response) => {
    const filter = createFilter(req.query.$filter);
    // connection instance from pg module
    connection.query(`SELECT * FROM Users WHERE ${filter.where}`, filter.parameters, function(err, result){
        res.json({
        	'@odata.context': req.protocol + '://' + req.get('host') + '/api/$metadata#Users',
        	value: result.rows
        });
    });
});

Advanced TypeScript example available here.

Usage ES5

var createFilter = require('odata-v4-typeorm').createFilter;

app.get("/api/Users", function(req, res) {
    var filter = createFilter(req.query.$filter);
    // connection instance from pg module
    connection.query(filter.from("Users"), filter.parameters, function(err, result){
        res.json({
        	'@odata.context': req.protocol + '://' + req.get('host') + '/api/$metadata#Users',
        	value: result.rows
        });
    });
})

Supported OData segments

  • $filter
  • $select
  • $skip
  • $top
  • $orderby
  • $expand
  • $count

If you have any questions, please don’t hesitate to contact me.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].