├── .editorconfig ├── .gitignore ├── .vscode ├── launch.json ├── settings.json └── tasks.json ├── README.md ├── gulpfile.js ├── package.json ├── src ├── app │ ├── business │ │ ├── HeroBusiness.ts │ │ ├── SpartanBusiness.ts │ │ └── interfaces │ │ │ ├── HeroBusiness.ts │ │ │ ├── SpartanBusiness.ts │ │ │ ├── base │ │ │ └── BaseBusiness.ts │ │ │ └── common │ │ │ ├── Read.ts │ │ │ └── Write.ts │ ├── dataAccess │ │ ├── DataAccess.ts │ │ └── schemas │ │ │ ├── HeroSchema.ts │ │ │ └── SpartanSchema.ts │ ├── model │ │ ├── HeroModel.ts │ │ ├── SpartanModel.ts │ │ └── interfaces │ │ │ ├── HeroModel.ts │ │ │ └── SpartanModel.ts │ └── repository │ │ ├── HeroRepository.ts │ │ ├── SpartanRepository.ts │ │ ├── base │ │ └── RepositoryBase.ts │ │ └── interfaces │ │ └── base │ │ ├── Read.ts │ │ └── Write.ts ├── config │ ├── constants │ │ └── Constants.ts │ ├── middlewares │ │ ├── MethodOverride.ts │ │ └── base │ │ │ └── MiddlewaresBase.ts │ └── routes │ │ ├── HeroRoutes.ts │ │ ├── SpartanRoutes.ts │ │ └── base │ │ └── BaseRoutes.ts ├── controllers │ ├── HeroController.ts │ ├── SpartanController.ts │ └── interfaces │ │ ├── base │ │ └── BaseController.ts │ │ └── common │ │ ├── ReadController.ts │ │ └── WriteController.ts └── index.ts └── tsconfig.json /.editorconfig: -------------------------------------------------------------------------------- 1 | root =true 2 | [*] 3 | end_of_line = lf 4 | insert_final_newline = true 5 | indent_style = space 6 | indent_size = 4 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | typings/ 3 | lib/ 4 | .DS_Store 5 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [{ 4 | "name": "Launch", 5 | "type": "node", 6 | "request": "launch", 7 | "program": "${workspaceRoot}\\src\\index.ts", 8 | "stopOnEntry": false, 9 | "args": [], 10 | "preLaunchTask": "tsc", 11 | "cwd": "${workspaceRoot}", 12 | "runtimeExecutable": null, 13 | "runtimeArgs": [ 14 | "--nolazy" 15 | ], 16 | "env": { 17 | "NODE_ENV": "development" 18 | }, 19 | "sourceMaps": true, 20 | "outFiles": ["${workspaceRoot}/lib/**/*.js"] 21 | }, 22 | { 23 | "name": "Attach", 24 | "type": "node", 25 | "request": "attach", 26 | "port": 5858 27 | } 28 | ] 29 | } -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "typescript.tsdk": "./node_modules/typescript/lib" 3 | } 4 | -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | // See https://go.microsoft.com/fwlink/?LinkId=733558 3 | // for the documentation about the tasks.json format 4 | "version": "0.1.0", 5 | "command": "tsc", 6 | "isShellCommand": true, 7 | "args": ["-p", "."], 8 | "showOutput": "silent", 9 | "problemMatcher": "$tsc" 10 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Mongoose TypeScript Repository Pattern with vscode debug feature 2 | This project is based on the [ErickWendel NodeJSWithTypescript](https://github.com/ErickWendel/NodeJSWithTypescript) 3 | For learning typescript, this project describes the application, at Spartans and Heroes as users of system. The Spartans describes amount of death peoples and Heroes amount of saved peoples. 4 | 5 | 6 | #### Patterns and Principles in this project: 7 | - Generic Repository Pattern 8 | - Singleton Pattern 9 | - Multi-layer Architecture Pattern 10 | 11 | #### Addtional feature: 12 | - Fast compile and reload 13 | - Debug typescript option using vscode 14 | 15 | #### Tools: 16 | - NodeJS 17 | - TypeScript 18 | - ExpressJS 19 | - MongoDB 20 | - Mongoose 21 | - GulpJS 22 | - VSCode Task Runners 23 | 24 | #### Convention Refs: 25 | [Coding guidelines Typescript - Microsoft](https://github.com/Microsoft/TypeScript/wiki/Coding-guidelines) 26 | 27 | #### How to use? 28 | Run: 29 | > npm install 30 | 31 | if not executing from VSCode: 32 | > gulp 33 | 34 | ## REST API Definitions: 35 | 36 | ### CREATE 37 | ``` 38 | > METHOD: POST 39 | > PARAMS: {"name":"Leonidas King","amountPeopleKilled":120,"folk":"agoge"} 40 | > URL: http://localhost:5000/spartans 41 | > RETURN: success or error 42 | 43 | 44 | > METHOD: POST 45 | > PARAMS: {"name":"Goku God","power":"sayan","amountPeopleSaved":2000 } 46 | > URL: http://localhost:5000/heroes 47 | > RETURN: success or error 48 | ``` 49 | 50 | 51 | ### RETRIEVE 52 | ``` 53 | > METHOD: GET 54 | > URL: http://localhost:5000/heroes/ 55 | > RETURN: [{"name":"Goku God","power":"sayan","amountPeopleSaved":2000 56 | 57 | 58 | > METHOD: GET 59 | > URL: http://localhost:5000/spartans/ 60 | > RETURN: [{"name":"Leonidas King","amountPeopleKilled":120,"folk":"agoge"}] 61 | 62 | ``` 63 | 64 | ### GET ONE 65 | ``` 66 | > METHOD: GET 67 | > URL: http://localhost:5000/heroes/56800b6b01c67c194e603e23 68 | > RETURN: {"name":"Goku God","power":"sayan","amountPeopleSaved":2000 } 69 | > OBSERVATIONS: for this request, use item id in url (56800b6b01c67c194e603e23) ` 70 | 71 | 72 | > METHOD: GET 73 | > URL: http://localhost:5000/spartans/568564361cc5056325f52c3c 74 | > RETURN: {"name":"Leonidas King","amountPeopleKilled":120,"folk":"agoge"} 75 | > OBSERVATIONS: for this request, use item id in url (568564361cc5056325f52c3c) ` 76 | 77 | ``` 78 | 79 | ### UPDATE 80 | ``` 81 | > METHOD: PUT 82 | > PARAMS: {"name":"UPDATED","power":"sayan","amountPeopleSaved":200 } 83 | > URL: http://localhost:5000/heroes/56800afbf34739a94da174f0 84 | > RETURN: success or error 85 | > OBSERVATIONS: for this request, use item id in url (56800afbf34739a94da174f0) ` 86 | 87 | 88 | > METHOD: PUT 89 | > PARAMS: {"name":"UPDATED","amountPeopleKilled":2,"folk":"agoge" } 90 | > URL: http://localhost:5000/heroes/56800afbf34739a94da174f0 91 | > RETURN: success or error 92 | > OBSERVATIONS: for this request, use item id in url (56800afbf34739a94da174f0) ` 93 | 94 | ``` 95 | 96 | ### DELETE 97 | ``` 98 | > METHOD: DELETE 99 | > URL: http://localhost:5000/heroes/56800afbf34739a94da174f0 100 | > RETURN: success or error 101 | 102 | > METHOD: DELETE 103 | > URL: http://localhost:5000/spartans/568564361cc5056325f52c3c 104 | > RETURN: success or error 105 | > OBSERVATIONS: for this request, use item id in url (568564361cc5056325f52c3c) ` 106 | 107 | ``` 108 | -------------------------------------------------------------------------------- /gulpfile.js: -------------------------------------------------------------------------------- 1 | var gulp = require("gulp"); 2 | var tsc = require("gulp-typescript"); 3 | var nodemon = require("gulp-nodemon"); 4 | var tsProject = tsc.createProject('tsconfig.json'); 5 | 6 | gulp.task("compile", function() { 7 | return gulp 8 | .src("src/**/*.ts") 9 | .pipe(tsProject()) 10 | .js.pipe(gulp.dest("./lib")); 11 | }); 12 | 13 | gulp.task("watch",["compile"], function() { 14 | return gulp.watch("src/**/*.*", ["compile"]); 15 | }); 16 | 17 | gulp.task("nodemon", ["compile"], function() { 18 | nodemon({ script: "lib/index.js", delay:15 }); 19 | }); 20 | 21 | gulp.task("default", ["compile", "watch", "nodemon"]); 22 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "learning-typescript-erickwendel", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "lib/index.js", 6 | "repository": { 7 | "type": "git", 8 | "url": "git+https://github.com/Thavarajan/Mangoose-Typescript-With-Repository-Pattern.git" 9 | }, 10 | "author": "Thavarajan", 11 | "license": "ISC", 12 | "bugs": { 13 | "url": "https://github.com/Thavarajan/Mangoose-Typescript-With-Repository-Pattern/issues" 14 | }, 15 | "homepage": "https://github.com/Thavarajan/Mangoose-Typescript-With-Repository-Pattern/#readme", 16 | "devDependencies": { 17 | "gulp": "^3.9.0", 18 | "gulp-nodemon": "^2.0.6", 19 | "gulp-typescript": "^3.1.5", 20 | "@types/body-parser": "0.0.33", 21 | "@types/express": "^4.0.35", 22 | "@types/method-override": "0.0.29", 23 | "@types/mongoose": "^4.7.6", 24 | "@types/node": "^6.0.63", 25 | "gulp-strip-debug": "^1.1.0" 26 | }, 27 | "dependencies": { 28 | "body-parser": "^1.16.1", 29 | "express": "^4.14.1", 30 | "method-override": "^2.3.7", 31 | "mongojs": "^2.2.2", 32 | "mongoose": "^4.8.3", 33 | "typescript": "^2.2.0" 34 | } 35 | } -------------------------------------------------------------------------------- /src/app/business/HeroBusiness.ts: -------------------------------------------------------------------------------- 1 | import HeroRepository = require("./../repository/HeroRepository"); 2 | import IHeroBusiness = require("./interfaces/HeroBusiness"); 3 | import IHeroModel = require("./../model/interfaces/HeroModel"); 4 | import HeroModel = require("./../model/HeroModel"); 5 | 6 | 7 | class HeroBusiness implements HeroBusiness { 8 | private _heroRepository: HeroRepository; 9 | 10 | constructor () { 11 | this._heroRepository = new HeroRepository(); 12 | } 13 | 14 | create (item: IHeroModel, callback: (error: any, result: any) => void) { 15 | this._heroRepository.create(item, callback); 16 | } 17 | 18 | retrieve (callback: (error: any, result: any) => void) { 19 | this._heroRepository.retrieve(callback); 20 | } 21 | 22 | update (_id: string, item: IHeroModel, callback: (error: any, result: any) => void) { 23 | 24 | this._heroRepository.findById(_id, (err, res) => { 25 | if(err) callback(err, res); 26 | 27 | else 28 | this._heroRepository.update(res._id, item, callback); 29 | 30 | }); 31 | } 32 | 33 | delete (_id: string, callback:(error: any, result: any) => void) { 34 | this._heroRepository.delete(_id , callback); 35 | } 36 | 37 | findById (_id: string, callback: (error: any, result: IHeroModel) => void) { 38 | this._heroRepository.findById(_id, callback); 39 | } 40 | 41 | } 42 | 43 | 44 | Object.seal(HeroBusiness); 45 | export = HeroBusiness; -------------------------------------------------------------------------------- /src/app/business/SpartanBusiness.ts: -------------------------------------------------------------------------------- 1 | import SpartanRepository = require("./../repository/SpartanRepository"); 2 | import ISpartanBusiness = require("./interfaces/SpartanBusiness"); 3 | import ISpartanModel = require("./../model/interfaces/SpartanModel"); 4 | 5 | class SpartanBusiness implements ISpartanBusiness { 6 | private _spartanRepository: SpartanRepository; 7 | 8 | constructor () { 9 | this._spartanRepository = new SpartanRepository(); 10 | } 11 | 12 | create (item: ISpartanModel, callback: (error: any, result: any) => void) { 13 | this._spartanRepository.create(item, callback); 14 | } 15 | 16 | retrieve (callback: (error: any, result: any) => void) { 17 | this._spartanRepository.retrieve(callback); 18 | } 19 | 20 | update (_id: string, item: ISpartanModel, callback: (error: any, result: any) => void) { 21 | this._spartanRepository.findById(_id, (err, res) => { 22 | if(err) callback(err, res); 23 | else 24 | this._spartanRepository.update(res._id, item, callback); 25 | 26 | }); 27 | } 28 | 29 | delete (_id: string, callback:(error: any, result: any) => void) { 30 | this._spartanRepository.delete(_id, callback); 31 | } 32 | 33 | findById (_id: string, callback: (error: any, result: ISpartanModel) => void) { 34 | this._spartanRepository.findById(_id, callback); 35 | } 36 | 37 | } 38 | Object.seal(SpartanBusiness); 39 | export = SpartanBusiness; -------------------------------------------------------------------------------- /src/app/business/interfaces/HeroBusiness.ts: -------------------------------------------------------------------------------- 1 | 2 | import BaseBusiness = require("./base/BaseBusiness"); 3 | import IHeroModel = require("./../../model/interfaces/HeroModel"); 4 | 5 | interface HeroBusiness extends BaseBusiness { 6 | 7 | } 8 | export = HeroBusiness; -------------------------------------------------------------------------------- /src/app/business/interfaces/SpartanBusiness.ts: -------------------------------------------------------------------------------- 1 | import BaseBusiness = require("./base/BaseBusiness"); 2 | import ISpartanModel = require("./../../model/interfaces/SpartanModel"); 3 | 4 | interface SpartanBusiness extends BaseBusiness { 5 | 6 | } 7 | export = SpartanBusiness; -------------------------------------------------------------------------------- /src/app/business/interfaces/base/BaseBusiness.ts: -------------------------------------------------------------------------------- 1 | import Read = require("./../common/Read"); 2 | import Write = require("./../common/Write"); 3 | interface BaseBusiness extends Read, Write 4 | { 5 | } 6 | export = BaseBusiness; -------------------------------------------------------------------------------- /src/app/business/interfaces/common/Read.ts: -------------------------------------------------------------------------------- 1 | 2 | interface Read { 3 | retrieve: (callback: (error: any, result: T)=> void)=> void ; 4 | findById: (_id: string, callback: (error:any, result: T) => void) => void; 5 | 6 | } 7 | 8 | export = Read; -------------------------------------------------------------------------------- /src/app/business/interfaces/common/Write.ts: -------------------------------------------------------------------------------- 1 | 2 | interface Write { 3 | create: (item: T, callback: (error: any, result: any ) => void) => void; 4 | update:(_id: string, item: T, callback: (error: any, result: any)=> void) => void ; 5 | delete: (_id: string, callback: (error: any, result: any) => void) => void; 6 | 7 | } 8 | 9 | export = Write; -------------------------------------------------------------------------------- /src/app/dataAccess/DataAccess.ts: -------------------------------------------------------------------------------- 1 | import Mongoose = require("mongoose"); 2 | import Constants = require("./../../config/constants/Constants"); 3 | 4 | class DataAccess { 5 | static mongooseInstance: any; 6 | static mongooseConnection: Mongoose.Connection; 7 | 8 | constructor () { 9 | DataAccess.connect(); 10 | } 11 | 12 | static connect (): Mongoose.Connection { 13 | if(this.mongooseInstance) return this.mongooseInstance; 14 | 15 | this.mongooseConnection = Mongoose.connection; 16 | this.mongooseConnection.once("open", () => { 17 | console.log("Conectado ao mongodb."); 18 | }); 19 | 20 | this.mongooseInstance = Mongoose.connect(Constants.DB_CONNECTION_STRING); 21 | return this.mongooseInstance; 22 | } 23 | 24 | } 25 | 26 | DataAccess.connect(); 27 | export = DataAccess; 28 | -------------------------------------------------------------------------------- /src/app/dataAccess/schemas/HeroSchema.ts: -------------------------------------------------------------------------------- 1 | import DataAccess = require("./../../dataAccess/DataAccess"); 2 | import IHeroModel = require("./../../model/interfaces/HeroModel"); 3 | 4 | var mongoose = DataAccess.mongooseInstance; 5 | var mongooseConnection = DataAccess.mongooseConnection; 6 | 7 | class HeroSchema { 8 | 9 | static get schema () { 10 | var schema = mongoose.Schema({ 11 | name : { 12 | type: String, 13 | required: true 14 | }, 15 | power: { 16 | type: String, 17 | required: true 18 | }, 19 | amountPeopleSaved: { 20 | type: Number, 21 | required: true 22 | } 23 | }); 24 | 25 | return schema; 26 | } 27 | 28 | } 29 | var schema = mongooseConnection.model("Heroes", HeroSchema.schema); 30 | export = schema; -------------------------------------------------------------------------------- /src/app/dataAccess/schemas/SpartanSchema.ts: -------------------------------------------------------------------------------- 1 | import DataAccess = require("./../../dataAccess/DataAccess"); 2 | import ISpartanModel = require("./../../model/interfaces/SpartanModel"); 3 | 4 | var mongoose = DataAccess.mongooseInstance; 5 | var mongooseConnection = DataAccess.mongooseConnection; 6 | 7 | class SpartanSchema { 8 | 9 | static get schema() { 10 | var schema = new mongoose.Schema({ 11 | name: { 12 | type: String, 13 | required: true 14 | }, 15 | folk: { 16 | type: String, 17 | required: true 18 | }, 19 | amountPeopleKilled: { 20 | type: Number, 21 | required: true 22 | } 23 | }); 24 | 25 | return schema; 26 | } 27 | } 28 | var schema = mongooseConnection.model("Spartan", SpartanSchema.schema); 29 | export = schema; 30 | -------------------------------------------------------------------------------- /src/app/model/HeroModel.ts: -------------------------------------------------------------------------------- 1 | import IHeroModel = require("./interfaces/HeroModel"); 2 | 3 | class HeroModel { 4 | 5 | private _heroModel: IHeroModel; 6 | 7 | constructor(heroModel: IHeroModel) { 8 | this._heroModel = heroModel; 9 | } 10 | get name (): string { 11 | return this._heroModel.name; 12 | } 13 | 14 | get power (): string { 15 | return this._heroModel.power; 16 | } 17 | 18 | get amountPeopleSaved (): number { 19 | return this._heroModel.amountPeopleSaved; 20 | } 21 | 22 | 23 | } 24 | Object.seal(HeroModel); 25 | export = HeroModel; -------------------------------------------------------------------------------- /src/app/model/SpartanModel.ts: -------------------------------------------------------------------------------- 1 | import ISpartanModel = require("./interfaces/SpartanModel"); 2 | 3 | class SpartanModel { 4 | private _spartanModel: ISpartanModel; 5 | 6 | constructor(spartan: ISpartanModel) { 7 | this._spartanModel = spartan; 8 | } 9 | get folk (): string { 10 | return this._spartanModel.folk; 11 | } 12 | get amountPeopleKilled (): number { 13 | return this._spartanModel.amountPeopleKilled; 14 | } 15 | 16 | get name (): string { 17 | return this._spartanModel.name; 18 | } 19 | 20 | } 21 | 22 | Object.seal(SpartanModel); 23 | export = SpartanModel; -------------------------------------------------------------------------------- /src/app/model/interfaces/HeroModel.ts: -------------------------------------------------------------------------------- 1 | import mongoose = require("mongoose"); 2 | 3 | interface HeroModel extends mongoose.Document { 4 | power: string; 5 | amountPeopleSaved: number; 6 | name: string; 7 | } 8 | 9 | export = HeroModel; -------------------------------------------------------------------------------- /src/app/model/interfaces/SpartanModel.ts: -------------------------------------------------------------------------------- 1 | import mongoose = require("mongoose"); 2 | 3 | interface SpartanModel extends mongoose.Document { 4 | folk: string; 5 | amountPeopleKilled: number; 6 | name: string; 7 | } 8 | 9 | export = SpartanModel; 10 | -------------------------------------------------------------------------------- /src/app/repository/HeroRepository.ts: -------------------------------------------------------------------------------- 1 | import HeroModel = require("./../model/HeroModel"); 2 | import IHeroModel = require("./../model/interfaces/HeroModel"); 3 | import HeroSchema = require("./../dataAccess/schemas/HeroSchema"); 4 | import RepositoryBase = require("./base/RepositoryBase"); 5 | 6 | class HeroRepository extends RepositoryBase { 7 | constructor () { 8 | super(HeroSchema); 9 | } 10 | } 11 | 12 | Object.seal(HeroRepository); 13 | export = HeroRepository; -------------------------------------------------------------------------------- /src/app/repository/SpartanRepository.ts: -------------------------------------------------------------------------------- 1 | import SpartanModel = require("./../model/SpartanModel"); 2 | import ISpartanModel = require("./../model/interfaces/SpartanModel"); 3 | import SpartanSchema = require("./../dataAccess/schemas/SpartanSchema"); 4 | import RepositoryBase = require("./base/RepositoryBase"); 5 | 6 | class SpartanRepository extends RepositoryBase { 7 | constructor () { 8 | super(SpartanSchema); 9 | } 10 | 11 | } 12 | 13 | Object.seal(SpartanRepository); 14 | export = SpartanRepository; -------------------------------------------------------------------------------- /src/app/repository/base/RepositoryBase.ts: -------------------------------------------------------------------------------- 1 | import IRead = require("./../interfaces/base/Read"); 2 | import IWrite = require("./../interfaces/base/Write"); 3 | import IHeroModel = require("./../../model/interfaces/HeroModel"); 4 | 5 | import mongoose = require("mongoose"); 6 | 7 | class RepositoryBase implements IRead, IWrite { 8 | 9 | private _model: mongoose.Model; 10 | 11 | constructor(schemaModel: mongoose.Model) { 12 | this._model = schemaModel; 13 | } 14 | 15 | create(item: T, callback: (error: any, result: mongoose.Document[]) => void) { 16 | this._model.create(item, callback); 17 | 18 | } 19 | 20 | retrieve(callback: (error: any, result: mongoose.Document[]) => void) { 21 | this._model.find({}, callback) 22 | } 23 | 24 | update(_id: mongoose.Types.ObjectId, item: T, callback: (error: any, result: any) => void) { 25 | this._model.update({ _id: _id }, item, callback); 26 | } 27 | 28 | delete(_id: string, callback: (error: any, result: any) => void) { 29 | this._model.remove({ _id: this.toObjectId(_id) }, (err) => callback(err, null)); 30 | } 31 | 32 | findById(_id: string, callback: (error: any, result: T) => void) { 33 | this._model.findById(_id, callback); 34 | } 35 | 36 | 37 | private toObjectId(_id: string): mongoose.Types.ObjectId { 38 | return mongoose.Types.ObjectId.createFromHexString(_id) 39 | } 40 | 41 | } 42 | 43 | export = RepositoryBase; 44 | -------------------------------------------------------------------------------- /src/app/repository/interfaces/base/Read.ts: -------------------------------------------------------------------------------- 1 | interface Read { 2 | retrieve: (callback: (error: any, result: any)=> void)=> void; 3 | findById: (id: string, callback: (error:any, result: T) => void) => void; 4 | } 5 | 6 | export = Read; 7 | -------------------------------------------------------------------------------- /src/app/repository/interfaces/base/Write.ts: -------------------------------------------------------------------------------- 1 | import mongoose = require("mongoose"); 2 | interface Write { 3 | create: (item:T, callback: (error: any, result: any ) => void) => void; 4 | update:(_id: mongoose.Types.ObjectId, item:T, callback: (error: any, result: any)=> void) => void ; 5 | delete: (_id: string, callback: (error: any, result: any) => void) => void; 6 | 7 | } 8 | 9 | export = Write; -------------------------------------------------------------------------------- /src/config/constants/Constants.ts: -------------------------------------------------------------------------------- 1 | class Constants { 2 | 3 | static DB_CONNECTION_STRING: string = "mongodb://localhost/warriors"; 4 | } 5 | Object.seal(Constants); 6 | export = Constants; 7 | -------------------------------------------------------------------------------- /src/config/middlewares/MethodOverride.ts: -------------------------------------------------------------------------------- 1 | import methodOverride = require("method-override"); 2 | import express = require("express"); 3 | class MethodOverride { 4 | 5 | static configuration () : any { 6 | var app = express(); 7 | app.use(methodOverride("X-HTTP-Method")); 8 | app.use(methodOverride("X-HTTP-Method-Override")); 9 | app.use(methodOverride("X-Method-Override")); 10 | app.use(methodOverride("_method")); 11 | return app; 12 | } 13 | } 14 | 15 | 16 | Object.seal(MethodOverride); 17 | export = MethodOverride; 18 | -------------------------------------------------------------------------------- /src/config/middlewares/base/MiddlewaresBase.ts: -------------------------------------------------------------------------------- 1 | import express = require("express"); 2 | import bodyParser = require("body-parser"); 3 | 4 | import MethodOverride = require("./../MethodOverride"); 5 | import BaseRoutes = require("./../../routes/base/BaseRoutes"); 6 | 7 | 8 | class MiddlewaresBase { 9 | 10 | static get configuration () { 11 | var app = express(); 12 | app.use(bodyParser.json()); 13 | app.use(MethodOverride.configuration()); 14 | app.use(new BaseRoutes().routes); 15 | 16 | return app; 17 | } 18 | } 19 | Object.seal(MiddlewaresBase); 20 | export = MiddlewaresBase; -------------------------------------------------------------------------------- /src/config/routes/HeroRoutes.ts: -------------------------------------------------------------------------------- 1 | import express = require("express"); 2 | import HeroController = require("./../../controllers/HeroController"); 3 | 4 | var router = express.Router(); 5 | class HeroRoutes { 6 | private _heroController: HeroController; 7 | 8 | constructor () { 9 | this._heroController = new HeroController(); 10 | } 11 | get routes () { 12 | var controller = this._heroController; 13 | router.get("/heroes", controller.retrieve); 14 | router.post("/heroes", controller.create); 15 | router.put("/heroes/:_id", controller.update); 16 | router.get("/heroes/:_id", controller.findById); 17 | router.delete("/heroes/:_id", controller.delete); 18 | 19 | return router; 20 | } 21 | 22 | 23 | } 24 | 25 | Object.seal(HeroRoutes); 26 | export = HeroRoutes; 27 | -------------------------------------------------------------------------------- /src/config/routes/SpartanRoutes.ts: -------------------------------------------------------------------------------- 1 | import express = require("express"); 2 | import SpartanController = require("./../../controllers/SpartanController"); 3 | 4 | var router = express.Router(); 5 | class SpartanRoutes { 6 | private _spartanController: SpartanController; 7 | 8 | constructor () { 9 | this._spartanController = new SpartanController(); 10 | } 11 | get routes () : express.Router { 12 | 13 | var controller = this._spartanController; 14 | router.get("/spartans", controller.retrieve); 15 | router.post("/spartans", controller.create); 16 | router.put("/spartans/:_id", controller.update); 17 | router.get("/spartans/:_id", controller.findById); 18 | router.delete("/spartans/:_id", controller.delete); 19 | 20 | return router; 21 | } 22 | 23 | 24 | } 25 | 26 | Object.seal(SpartanRoutes); 27 | export = SpartanRoutes; -------------------------------------------------------------------------------- /src/config/routes/base/BaseRoutes.ts: -------------------------------------------------------------------------------- 1 | import express = require("express"); 2 | import HeroRoutes = require("./../HeroRoutes"); 3 | import SpartanRoutes = require("./../SpartanRoutes"); 4 | var app = express(); 5 | class BaseRoutes { 6 | 7 | get routes() { 8 | app.use("/", new HeroRoutes().routes); 9 | app.use("/", new SpartanRoutes().routes); 10 | return app; 11 | } 12 | } 13 | export = BaseRoutes; -------------------------------------------------------------------------------- /src/controllers/HeroController.ts: -------------------------------------------------------------------------------- 1 | import express = require("express"); 2 | import HeroBusiness = require("./../app/business/HeroBusiness"); 3 | import IBaseController = require("./interfaces/base/BaseController"); 4 | import IHeroModel = require("./../app/model/interfaces/HeroModel"); 5 | 6 | 7 | 8 | class HeroController implements IBaseController { 9 | 10 | create(req: express.Request, res: express.Response): void { 11 | try { 12 | 13 | var hero: IHeroModel = req.body; 14 | var heroBusiness = new HeroBusiness(); 15 | heroBusiness.create(hero, (error, result) => { 16 | if(error) res.send({"error": "error"}); 17 | else res.send({"success": "success"}); 18 | }); 19 | } 20 | catch (e) { 21 | console.log(e); 22 | res.send({"error": "error in your request"}); 23 | 24 | } 25 | } 26 | update(req: express.Request, res: express.Response): void { 27 | try { 28 | var hero: IHeroModel = req.body; 29 | var _id: string = req.params._id; 30 | var heroBusiness = new HeroBusiness(); 31 | heroBusiness.update(_id, hero, (error, result) => { 32 | if(error) res.send({"error": "error"}); 33 | else res.send({"success": "success"}); 34 | }); 35 | } 36 | catch (e) { 37 | console.log(e); 38 | res.send({"error": "error in your request"}); 39 | 40 | } 41 | } 42 | delete(req: express.Request, res: express.Response): void { 43 | try { 44 | 45 | var _id: string = req.params._id; 46 | var heroBusiness = new HeroBusiness(); 47 | heroBusiness.delete(_id, (error, result) => { 48 | if(error) res.send({"error": "error"}); 49 | else res.send({"success": "success"}); 50 | }); 51 | } 52 | catch (e) { 53 | console.log(e); 54 | res.send({"error": "error in your request"}); 55 | 56 | } 57 | } 58 | retrieve(req: express.Request, res: express.Response): void { 59 | try { 60 | 61 | var heroBusiness = new HeroBusiness(); 62 | heroBusiness.retrieve((error, result) => { 63 | if(error) res.send({"error": "error"}); 64 | else res.send(result); 65 | }); 66 | } 67 | catch (e) { 68 | console.log(e); 69 | res.send({"error": "error in your request"}); 70 | 71 | } 72 | } 73 | findById(req: express.Request, res: express.Response): void { 74 | try { 75 | 76 | var _id: string = req.params._id; 77 | var heroBusiness = new HeroBusiness(); 78 | heroBusiness.findById(_id, (error, result) => { 79 | if(error) res.send({"error": "error"}); 80 | else res.send(result); 81 | }); 82 | } 83 | catch (e) { 84 | console.log(e); 85 | res.send({"error": "error in your request"}); 86 | 87 | } 88 | } 89 | 90 | 91 | } 92 | export = HeroController; -------------------------------------------------------------------------------- /src/controllers/SpartanController.ts: -------------------------------------------------------------------------------- 1 | import express = require("express"); 2 | import SpartanBusiness = require("./../app/business/SpartanBusiness"); 3 | import IBaseController = require("./interfaces/base/BaseController"); 4 | import ISpartanModel = require("./../app/model/interfaces/SpartanModel"); 5 | 6 | 7 | 8 | class SpartanController implements IBaseController { 9 | 10 | create(req: express.Request, res: express.Response): void { 11 | try { 12 | 13 | var spartan: ISpartanModel = req.body; 14 | var spartanBusiness = new SpartanBusiness(); 15 | spartanBusiness.create(spartan, (error, result) => { 16 | if(error) res.send({"error": "error"}); 17 | else res.send({"success": "success"}); 18 | }); 19 | } 20 | catch (e) { 21 | console.log(e); 22 | res.send({"error": "error in your request"}); 23 | } 24 | } 25 | update(req: express.Request, res: express.Response): void { 26 | try { 27 | var spartan: ISpartanModel = req.body; 28 | var _id: string = req.params._id; 29 | var spartanBusiness = new SpartanBusiness(); 30 | spartanBusiness.update(_id, spartan, (error, result) => { 31 | if(error) res.send({"error": "error"}); 32 | else res.send({"success": "success"}); 33 | }); 34 | } 35 | catch (e) { 36 | console.log(e); 37 | res.send({"error": "error in your request"}); 38 | 39 | } 40 | } 41 | delete(req: express.Request, res: express.Response): void { 42 | try { 43 | 44 | var _id: string = req.params._id; 45 | var spartanBusiness = new SpartanBusiness(); 46 | spartanBusiness.delete(_id, (error, result) => { 47 | if(error) res.send({"error": "error"}); 48 | else res.send({"success": "success"}); 49 | }); 50 | } 51 | catch (e) { 52 | console.log(e); 53 | res.send({"error": "error in your request"}); 54 | 55 | } 56 | } 57 | retrieve(req: express.Request, res: express.Response): void { 58 | try { 59 | 60 | var spartanBusiness = new SpartanBusiness(); 61 | spartanBusiness.retrieve((error, result) => { 62 | if(error) res.send({"error": "error"}); 63 | else res.send(result); 64 | }); 65 | } 66 | catch (e) { 67 | console.log(e); 68 | res.send({"error": "error in your request"}); 69 | 70 | } 71 | } 72 | findById(req: express.Request, res: express.Response): void { 73 | try { 74 | 75 | var _id: string = req.params._id; 76 | 77 | var spartanBusiness = new SpartanBusiness(); 78 | spartanBusiness.findById(_id, (error, result) => { 79 | if(error) res.send({"error": "error"}); 80 | else res.send(result); 81 | }); 82 | } 83 | catch (e) { 84 | console.log(e); 85 | res.send({"error": "error in your request"}); 86 | 87 | } 88 | } 89 | 90 | 91 | } 92 | export = SpartanController; -------------------------------------------------------------------------------- /src/controllers/interfaces/base/BaseController.ts: -------------------------------------------------------------------------------- 1 | import IReadController = require("./../common/ReadController"); 2 | import IWriteController = require("./../common/WriteController"); 3 | import IBaseBusiness = require("../../../app/business/interfaces/base/BaseBusiness"); 4 | interface BaseController> extends IReadController, IWriteController{ 5 | 6 | 7 | } 8 | export = BaseController; -------------------------------------------------------------------------------- /src/controllers/interfaces/common/ReadController.ts: -------------------------------------------------------------------------------- 1 | import express = require("express"); 2 | interface ReadController { 3 | retrieve: express.RequestHandler; 4 | findById: express.RequestHandler; 5 | 6 | 7 | } 8 | export = ReadController; -------------------------------------------------------------------------------- /src/controllers/interfaces/common/WriteController.ts: -------------------------------------------------------------------------------- 1 | import express = require("express"); 2 | interface WriteController { 3 | create: express.RequestHandler; 4 | update: express.RequestHandler; 5 | delete: express.RequestHandler; 6 | 7 | } 8 | 9 | export = WriteController; -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import express = require("express"); 2 | import Middlewares = require("./config/middlewares/base/MiddlewaresBase"); 3 | 4 | var app = express(); 5 | var port = parseInt(process.env.PORT, 10) || 5000; 6 | app.set("port", port); 7 | app.use(Middlewares.configuration); 8 | 9 | app.listen(port, () => { 10 | console.log("Node app is running at localhost:" + port); 11 | 12 | }); 13 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es6", 4 | "lib": ["es6", "dom"], 5 | "types": ["node", "mongoose", "express", "method-override", "body-parser"], 6 | "sourceMap": true, 7 | "module": "commonjs", 8 | "moduleResolution": "node", 9 | "removeComments": true, 10 | "preserveConstEnums": true, 11 | "outDir": "lib", 12 | "noEmitOnError": false, 13 | "typeRoots": [ 14 | "../node_modules/@types/" 15 | ], 16 | "suppressImplicitAnyIndexErrors": false 17 | }, 18 | "exclude": ["node_modules"] 19 | } --------------------------------------------------------------------------------