From 29979a37ab2bbd2559050a2dc6096142568c5a7f Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Wed, 25 Nov 2020 18:33:05 +0100 Subject: [PATCH 1/7] Changed type to const ref #4 --- src/routes/v1/track.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/v1/track.ts b/src/routes/v1/track.ts index 63bb046..094829f 100644 --- a/src/routes/v1/track.ts +++ b/src/routes/v1/track.ts @@ -2,7 +2,7 @@ import {Router} from 'express'; import {getConnection} from "typeorm"; import {Track} from "../../models/Track" -var router = Router(); +const router = Router(); //const manager = getConnection().manager; router.get('/', async (req, res, next) => { From 4151f05c2484a77d61972442b5409e60a59db526 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Wed, 25 Nov 2020 18:47:47 +0100 Subject: [PATCH 2/7] Loading db first ref #4 --- src/loaders/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/loaders/index.ts b/src/loaders/index.ts index 56e2286..52736df 100644 --- a/src/loaders/index.ts +++ b/src/loaders/index.ts @@ -4,8 +4,8 @@ import databaseLoader from "./database"; import {Application} from "express"; export default async (app: Application) => { + await databaseLoader(); await expressLoader(app); await routeLoader(app); - databaseLoader(); return app; }; From b5518d005ffb9ab5ce5d0244a66ab28ff3a61b0e Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Wed, 25 Nov 2020 18:48:27 +0100 Subject: [PATCH 3/7] Added first db connection for a tack endpoint ref #4 --- src/routes/v1/track.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/routes/v1/track.ts b/src/routes/v1/track.ts index 094829f..2718d4f 100644 --- a/src/routes/v1/track.ts +++ b/src/routes/v1/track.ts @@ -3,12 +3,11 @@ import {getConnection} from "typeorm"; import {Track} from "../../models/Track" const router = Router(); -//const manager = getConnection().manager; router.get('/', async (req, res, next) => { - //let tracks = manager.find(Track); - //res.send(tracks); - res.sendStatus(200); + const trackManager = await getConnection().getRepository(Track); + let tracks = trackManager.count(); + return res.send(tracks); }); router.post('/', async (req, res, next) => { @@ -25,5 +24,4 @@ router.post('/', async (req, res, next) => { }*/ }); - export default router; \ No newline at end of file From b5cf040cf0975f3a1e5ba60e8c34bbd23bc97c91 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Wed, 25 Nov 2020 18:51:48 +0100 Subject: [PATCH 4/7] Now creating db schemas ref #3 --- src/loaders/database.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/loaders/database.ts b/src/loaders/database.ts index 1ca6f46..acfcd20 100644 --- a/src/loaders/database.ts +++ b/src/loaders/database.ts @@ -1,5 +1,7 @@ import {createConnection} from "typeorm"; export default async ()=> { - return await createConnection(); + const connection = await createConnection(); + connection.synchronize(); + return connection; }; \ No newline at end of file From 8cbcfe7fbb66b9de7b6193962ed11b32150aaa7c Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Wed, 25 Nov 2020 19:28:12 +0100 Subject: [PATCH 5/7] Switched to using controllers via routing-controllers ref #4 --- package.json | 7 +++++- src/app.ts | 12 ++++++---- src/controllers/TrackController.ts | 38 ++++++++++++++++++++++++++++++ src/routes/.gitkeep | 0 src/routes/index.ts | 9 ------- src/routes/v1/index.ts | 9 ------- src/routes/v1/track.ts | 27 --------------------- 7 files changed, 51 insertions(+), 51 deletions(-) create mode 100644 src/controllers/TrackController.ts delete mode 100644 src/routes/.gitkeep delete mode 100644 src/routes/index.ts delete mode 100644 src/routes/v1/index.ts delete mode 100644 src/routes/v1/track.ts diff --git a/package.json b/package.json index 9474f48..4798d26 100644 --- a/package.json +++ b/package.json @@ -23,14 +23,18 @@ "license": "CC-BY-NC-SA-4.0", "dependencies": { "body-parser": "^1.19.0", + "class-transformer": "^0.3.1", + "class-validator": "^0.12.2", "consola": "^2.15.0", "cors": "^2.8.5", "express": "^4.17.1", "helmet": "^4.2.0", "jsonwebtoken": "^8.5.1", + "multer": "^1.4.2", "mysql": "^2.18.1", "pg": "^8.5.1", "reflect-metadata": "^0.1.13", + "routing-controllers": "^0.9.0-alpha.6", "typeorm": "^0.2.29" }, "devDependencies": { @@ -38,7 +42,8 @@ "@types/dotenv-safe": "^8.1.1", "@types/express": "^4.17.9", "@types/jsonwebtoken": "^8.5.0", - "@types/node": "^14.14.9", + "@types/node": "^14.14.9", + "@types/multer": "^1.4.4", "dotenv-safe": "^8.2.0", "husky": "^4.3.0", "nodemon": "^2.0.6", diff --git a/src/app.ts b/src/app.ts index 13be7ae..488b549 100644 --- a/src/app.ts +++ b/src/app.ts @@ -1,15 +1,17 @@ -import * as dotenvSafe from "dotenv-safe"; -import express from "express"; -import consola from "consola"; -// import * as jwt from 'jsonwebtoken'; import "reflect-metadata"; +import * as dotenvSafe from "dotenv-safe"; +import { createExpressServer } from "routing-controllers"; +import consola from "consola"; import loaders from "./loaders/index"; dotenvSafe.config(); const PORT = process.env.APP_PORT || 4010; +const app = createExpressServer({ + controllers: [__dirname + "/controllers/*.ts"], +}); + async function main() { - let app = express(); await loaders(app); app.listen(PORT, () => { consola.success( diff --git a/src/controllers/TrackController.ts b/src/controllers/TrackController.ts new file mode 100644 index 0000000..2dd5524 --- /dev/null +++ b/src/controllers/TrackController.ts @@ -0,0 +1,38 @@ +import { + JsonController, + Param, + Body, + Get, + Post, + Put, + Delete, +} from "routing-controllers"; +import { OpenAPI } from "routing-controllers-openapi"; + +@JsonController() +export class TrackController { + @Get("/track") + getAll() { + return "This action returns all users"; + } + + @Get("/track/:id") + getOne(@Param("id") id: number) { + return "This action returns user #" + id; + } + + @Post("/track") + post(@Body() user: any) { + return "Saving user..."; + } + + @Put("/track/:id") + put(@Param("id") id: number, @Body() user: any) { + return "Updating a user..."; + } + + @Delete("/track/:id") + remove(@Param("id") id: number) { + return "Removing user..."; + } +} diff --git a/src/routes/.gitkeep b/src/routes/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/src/routes/index.ts b/src/routes/index.ts deleted file mode 100644 index f88fd69..0000000 --- a/src/routes/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -import Router from 'express'; -import v1 from "./v1/index"; - -const router = Router(); -router.use('/v1/', v1); -router.use('*', (req, res) => { - return res.status(404).send('404'); -}); -export default router; diff --git a/src/routes/v1/index.ts b/src/routes/v1/index.ts deleted file mode 100644 index 50bdfb2..0000000 --- a/src/routes/v1/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -import Router from 'express'; -import track from "./track"; - -const router = Router(); -router.use("/track", track) -router.use('/*/', (req, res) => { - return res.send('Express + TypeScript Server'); -}); -export default router; diff --git a/src/routes/v1/track.ts b/src/routes/v1/track.ts deleted file mode 100644 index 2718d4f..0000000 --- a/src/routes/v1/track.ts +++ /dev/null @@ -1,27 +0,0 @@ -import {Router} from 'express'; -import {getConnection} from "typeorm"; -import {Track} from "../../models/Track" - -const router = Router(); - -router.get('/', async (req, res, next) => { - const trackManager = await getConnection().getRepository(Track); - let tracks = trackManager.count(); - return res.send(tracks); -}); - -router.post('/', async (req, res, next) => { - res.sendStatus(200); - /*let track = new Track(); - track.length=req.body.length; - track.name=req.body.name; - - try { - let newUser = await manager.save(track); - res.send(newUser); - } catch (error) { - res.send(error); - }*/ - -}); -export default router; \ No newline at end of file From 3ce9a0b21a050095d93643bab453375c4b889ca6 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Wed, 25 Nov 2020 19:28:52 +0100 Subject: [PATCH 6/7] Added basic openapi support ref #5 --- package.json | 7 +++++-- src/loaders/index.ts | 6 +++--- src/loaders/openapi.ts | 11 +++++++++++ src/loaders/routes.ts | 7 ------- 4 files changed, 19 insertions(+), 12 deletions(-) create mode 100644 src/loaders/openapi.ts delete mode 100644 src/loaders/routes.ts diff --git a/package.json b/package.json index 4798d26..04766fd 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,8 @@ "pg": "^8.5.1", "reflect-metadata": "^0.1.13", "routing-controllers": "^0.9.0-alpha.6", + "routing-controllers-openapi": "^2.1.0", + "swagger-ui-express": "^4.1.5", "typeorm": "^0.2.29" }, "devDependencies": { @@ -42,8 +44,9 @@ "@types/dotenv-safe": "^8.1.1", "@types/express": "^4.17.9", "@types/jsonwebtoken": "^8.5.0", - "@types/node": "^14.14.9", - "@types/multer": "^1.4.4", + "@types/node": "^14.14.9", + "@types/multer": "^1.4.4", + "@types/swagger-ui-express": "^4.1.2", "dotenv-safe": "^8.2.0", "husky": "^4.3.0", "nodemon": "^2.0.6", diff --git a/src/loaders/index.ts b/src/loaders/index.ts index 52736df..704ea47 100644 --- a/src/loaders/index.ts +++ b/src/loaders/index.ts @@ -1,11 +1,11 @@ import expressLoader from "./express"; -import routeLoader from "./routes"; +import openapiLoader from "./openapi"; import databaseLoader from "./database"; -import {Application} from "express"; +import { Application } from "express"; export default async (app: Application) => { await databaseLoader(); + await openapiLoader(app); await expressLoader(app); - await routeLoader(app); return app; }; diff --git a/src/loaders/openapi.ts b/src/loaders/openapi.ts new file mode 100644 index 0000000..1de2818 --- /dev/null +++ b/src/loaders/openapi.ts @@ -0,0 +1,11 @@ +import { Application } from "express"; +import * as swaggerUiExpress from "swagger-ui-express"; +import { getMetadataArgsStorage } from "routing-controllers"; +import { routingControllersToSpec } from "routing-controllers-openapi"; + +export default async (app: Application) => { + const storage = getMetadataArgsStorage(); + const spec = routingControllersToSpec(storage); + app.use("/docs", swaggerUiExpress.serve, swaggerUiExpress.setup(spec)); + return app; +}; diff --git a/src/loaders/routes.ts b/src/loaders/routes.ts deleted file mode 100644 index 1d9309c..0000000 --- a/src/loaders/routes.ts +++ /dev/null @@ -1,7 +0,0 @@ -import {Application} from "express"; -import routerMain from "../routes/index"; - -export default async (app: Application) => { - app.use('/api/', routerMain); - return app; -}; From 90136af516abc80703b5d7f063aa87c1c1082563 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Wed, 25 Nov 2020 19:41:40 +0100 Subject: [PATCH 7/7] Make the linter happier ref #3 --- src/models/Track.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/models/Track.ts b/src/models/Track.ts index b7a3cd7..8d2b57c 100644 --- a/src/models/Track.ts +++ b/src/models/Track.ts @@ -1,14 +1,14 @@ -import {Entity, PrimaryGeneratedColumn, Column} from "typeorm"; +import { Entity, PrimaryGeneratedColumn, Column } from "typeorm"; @Entity() export class Track { @PrimaryGeneratedColumn() - id!: number; + id: number; @Column() - name!: string; + name: string; //Length in meters @Column() - length!: string; -} \ No newline at end of file + length: string; +}