From 0aabccf76a60958a8caf47df589dd191e0f7f552 Mon Sep 17 00:00:00 2001 From: "kamil.mysliwiec" Date: Sat, 25 Feb 2017 15:13:01 +0100 Subject: [PATCH] Initial commit --- .gitignore | 17 ++++++++++++ index.js | 14 ++++++++++ package.json | 17 ++++++++++++ src/app.ts | 12 +++++++++ src/modules/app.module.ts | 7 +++++ src/modules/users/auth.middleware.ts | 24 +++++++++++++++++ src/modules/users/chat.gateway.ts | 19 +++++++++++++ src/modules/users/chat.service.ts | 16 +++++++++++ src/modules/users/notification.service.ts | 11 ++++++++ src/modules/users/users.controller.ts | 28 +++++++++++++++++++ src/modules/users/users.module.ts | 21 +++++++++++++++ src/modules/users/users.service.ts | 33 +++++++++++++++++++++++ src/server.ts | 5 ++++ tsconfig.json | 17 ++++++++++++ 14 files changed, 241 insertions(+) create mode 100644 .gitignore create mode 100644 index.js create mode 100644 package.json create mode 100644 src/app.ts create mode 100644 src/modules/app.module.ts create mode 100644 src/modules/users/auth.middleware.ts create mode 100644 src/modules/users/chat.gateway.ts create mode 100644 src/modules/users/chat.service.ts create mode 100644 src/modules/users/notification.service.ts create mode 100644 src/modules/users/users.controller.ts create mode 100644 src/modules/users/users.module.ts create mode 100644 src/modules/users/users.service.ts create mode 100644 src/server.ts create mode 100644 tsconfig.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a5430e3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,17 @@ +# dependencies +/node_modules + +# IDE +/.idea +/.awcache + +# misc +npm-debug.log + +# example +/quick-start + +# tests +/test +/coverage +/.nyc_output \ No newline at end of file diff --git a/index.js b/index.js new file mode 100644 index 0000000..81af91e --- /dev/null +++ b/index.js @@ -0,0 +1,14 @@ +require('ts-node/register'); +require('./src/server'); + + + + + + + + + + + + diff --git a/package.json b/package.json new file mode 100644 index 0000000..daa2505 --- /dev/null +++ b/package.json @@ -0,0 +1,17 @@ +{ + "name": "nest-typescript-starter", + "version": "1.0.0", + "description": "Nest TypeScript starter repository", + "license": "ISC", + "scripts": { + "start": "node index.js" + }, + "dependencies": { + "nest.js": "*", + "typescript": "^2.2.1" + }, + "devDependencies": { + "@types/node": "^7.0.5", + "ts-node": "^2.1.0" + } +} diff --git a/src/app.ts b/src/app.ts new file mode 100644 index 0000000..270fb36 --- /dev/null +++ b/src/app.ts @@ -0,0 +1,12 @@ +import { NestApplication } from 'nest.js'; + +export class Application implements NestApplication { + constructor(private expressApp) {} + + start() { + // do something before server start + this.expressApp.listen(3031, () => { + console.log('Application listen on port:', 3031); + }); + } +} \ No newline at end of file diff --git a/src/modules/app.module.ts b/src/modules/app.module.ts new file mode 100644 index 0000000..d666265 --- /dev/null +++ b/src/modules/app.module.ts @@ -0,0 +1,7 @@ +import { Module } from 'nest.js'; +import { UsersModule } from './users/users.module'; + +@Module({ + modules: [ UsersModule ] +}) +export class ApplicationModule {} \ No newline at end of file diff --git a/src/modules/users/auth.middleware.ts b/src/modules/users/auth.middleware.ts new file mode 100644 index 0000000..d537949 --- /dev/null +++ b/src/modules/users/auth.middleware.ts @@ -0,0 +1,24 @@ +import { UsersService } from "./users.service"; +import { NestMiddleware, HttpException, Middleware } from 'nest.js'; + +@Middleware() +export class AuthMiddleware implements NestMiddleware { + + constructor(private usersService: UsersService) {} + + resolve() { + return (req, res, next) => { + const userName = req.headers["x-access-token"]; + const users = this.usersService.getUsers(); + + const user = users.find((user) => user.name === userName); + if (!user) { + throw new HttpException('User not found.', 401); + } + req.user = user; + next(); + } + } + +} + diff --git a/src/modules/users/chat.gateway.ts b/src/modules/users/chat.gateway.ts new file mode 100644 index 0000000..172c64e --- /dev/null +++ b/src/modules/users/chat.gateway.ts @@ -0,0 +1,19 @@ +import { Subject } from 'rxjs/Subject'; +import { SocketGateway, GatewayServer, SubscribeMessage } from 'nest.js/socket'; + +@SocketGateway({ port: 2000 }) +export class ChatGateway { + private msg$ = new Subject(); + + @GatewayServer server; + + get msgStream() { + return this.msg$.asObservable(); + } + + @SubscribeMessage({ value: 'message' }) + onMessage(client, data) { + this.msg$.next({ client, data }); + } + +} \ No newline at end of file diff --git a/src/modules/users/chat.service.ts b/src/modules/users/chat.service.ts new file mode 100644 index 0000000..10eb944 --- /dev/null +++ b/src/modules/users/chat.service.ts @@ -0,0 +1,16 @@ +import { ChatGateway } from './chat.gateway'; +import { Component } from 'nest.js'; + +@Component() +export class ChatService { + + constructor(private chatGateway: ChatGateway) { + const stream$ = this.chatGateway.msgStream; + stream$.subscribe(this.storeMessage.bind(this)); + } + + storeMessage(data) { + // store data + } + +} \ No newline at end of file diff --git a/src/modules/users/notification.service.ts b/src/modules/users/notification.service.ts new file mode 100644 index 0000000..fbc64cf --- /dev/null +++ b/src/modules/users/notification.service.ts @@ -0,0 +1,11 @@ +import { Component } from 'nest.js'; + +@Component() +export class NotificationService { + storeNotification(data) { + const notification = this.mapDataToNotification(data); + // store notification + } + + private mapDataToNotification(msg) {} +} \ No newline at end of file diff --git a/src/modules/users/users.controller.ts b/src/modules/users/users.controller.ts new file mode 100644 index 0000000..ddd12ab --- /dev/null +++ b/src/modules/users/users.controller.ts @@ -0,0 +1,28 @@ +import { UsersService } from "./users.service"; +import { Controller, RequestMapping, RequestMethod } from 'nest.js'; + +@Controller({ path: 'users' }) +export class UsersController { + + constructor(private usersService: UsersService) {} + + @RequestMapping() + async getAllUsers(req, res) { + const users = await this.usersService.getAllUsers(); + res.status(200).json(users); + } + + @RequestMapping({ path: '/:id' }) + async getUser(req, res) { + const user = await this.usersService.getUser(req.params.id); + res.status(200).json(user); + } + + @RequestMapping({ method: RequestMethod.POST }) + async addUser(req, res) { + const msg = await this.usersService.getUser(req.body.user); + res.status(201).json(msg); + } + +} + diff --git a/src/modules/users/users.module.ts b/src/modules/users/users.module.ts new file mode 100644 index 0000000..b1c22bb --- /dev/null +++ b/src/modules/users/users.module.ts @@ -0,0 +1,21 @@ +import { Module, MiddlewareBuilder } from 'nest.js'; +import { UsersController } from './users.controller'; +import { UsersService } from './users.service'; +import { AuthMiddleware } from './auth.middleware'; +import { ChatGateway } from './chat.gateway'; +import { ChatService } from './chat.service'; +import { NotificationService } from './notification.service'; + +@Module({ + controllers: [ UsersController ], + components: [ UsersService, ChatGateway, ChatService, NotificationService ], + exports: [ UsersService ], +}) +export class UsersModule { + configure(builder: MiddlewareBuilder) { + builder.use({ + middlewares: [ AuthMiddleware ], + forRoutes: [ UsersController ], + }) + } +} diff --git a/src/modules/users/users.service.ts b/src/modules/users/users.service.ts new file mode 100644 index 0000000..02d9dd6 --- /dev/null +++ b/src/modules/users/users.service.ts @@ -0,0 +1,33 @@ +import { Component, HttpException } from 'nest.js'; + +@Component() +export class UsersService { + + private users = [ + { id: 1, name: 'John Doe' }, + { id: 2, name: 'Alice Caeiro' }, + { id: 3, name: 'Who Knows' }, + ]; + + getUsers() { + return this.users; + } + + getAllUsers() { + return Promise.resolve(this.users); + } + + getUser(id: string) { + const user = this.users.find((user) => user.id === +id); + if (!user) { + throw new HttpException('User not found', 404); + } + return Promise.resolve(user); + } + + addUser(user) { + this.users.push(user); + return Promise.resolve(); + } + +} \ No newline at end of file diff --git a/src/server.ts b/src/server.ts new file mode 100644 index 0000000..beaf330 --- /dev/null +++ b/src/server.ts @@ -0,0 +1,5 @@ +import { NestRunner } from 'nest.js'; +import { Application } from './app'; +import { ApplicationModule } from './modules/app.module'; + +NestRunner.run(Application, ApplicationModule); \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..880a970 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "module": "commonjs", + "declaration": false, + "noImplicitAny": false, + "removeComments": true, + "noLib": false, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "target": "es6", + "sourceMap": true, + "allowJs": true + }, + "exclude": [ + "node_modules" + ] +} \ No newline at end of file