diff --git a/src/controllers/client.ts b/src/controllers/client.ts new file mode 100644 index 0000000..86f2ec7 --- /dev/null +++ b/src/controllers/client.ts @@ -0,0 +1,44 @@ +import { Security, Route, Tags, Example, Post, Body } from 'tsoa' + +import Client, { ClientPayload } from '../model/Client' + +@Security('bearerAuth') +@Route('SASjsApi/client') +@Tags('Client') +export default class ClientController { + /** + * Create client with the following attributes: ClientId, ClientSecret. Admin only task. + * + */ + @Example({ + clientId: 'someFormattedClientID1234', + clientSecret: 'someRandomCryptoString' + }) + @Post('/') + public async createClient( + @Body() body: ClientPayload + ): Promise { + return createClient(body) + } +} + +const createClient = async (data: any): Promise => { + const { clientId, clientSecret } = data + + // Checking if client is already in the database + const clientExist = await Client.findOne({ clientId }) + if (clientExist) throw new Error('Client ID already exists.') + + // Create a new client + const client = new Client({ + clientId, + clientSecret + }) + + const savedClient = await client.save() + + return { + clientId: savedClient.clientId, + clientSecret: savedClient.clientSecret + } +} diff --git a/src/controllers/createClient.ts b/src/controllers/createClient.ts deleted file mode 100644 index ab85e09..0000000 --- a/src/controllers/createClient.ts +++ /dev/null @@ -1,22 +0,0 @@ -import Client from '../model/Client' - -export const createClient = async (data: any) => { - const { clientId, clientSecret } = data - - // Checking if client is already in the database - const clientExist = await Client.findOne({ clientId }) - if (clientExist) throw new Error('Client ID already exists.') - - // Create a new client - const client = new Client({ - clientId, - clientSecret - }) - - const savedClient = await client.save() - - return { - clientId: savedClient.clientId, - clientSecret: savedClient.clientSecret - } -} diff --git a/src/controllers/user.ts b/src/controllers/user.ts index 379697c..54e1d26 100644 --- a/src/controllers/user.ts +++ b/src/controllers/user.ts @@ -1,5 +1,7 @@ import { + Security, Route, + Tags, Path, Query, Example, @@ -8,8 +10,7 @@ import { Patch, Delete, Body, - Hidden, - Security + Hidden } from 'tsoa' import bcrypt from 'bcryptjs' @@ -31,6 +32,7 @@ interface userDetailsResponse { @Security('bearerAuth') @Route('SASjsApi/user') +@Tags('User') export default class UserController { /** * Get list of all users (username, displayname). All users can request this. diff --git a/src/model/Client.ts b/src/model/Client.ts index 8bbf38a..113bffa 100644 --- a/src/model/Client.ts +++ b/src/model/Client.ts @@ -1,6 +1,19 @@ -import mongoose from 'mongoose' +import mongoose, { Schema } from 'mongoose' -const clientSchema = new mongoose.Schema({ +export interface ClientPayload { + /** + * Client ID + * @example "someFormattedClientID1234" + */ + clientId: string + /** + * Client Secret + * @example "someRandomCryptoString" + */ + clientSecret: string +} + +const ClientSchema = new Schema({ clientId: { type: String, required: true @@ -11,4 +24,4 @@ const clientSchema = new mongoose.Schema({ } }) -export default mongoose.model('Client', clientSchema) +export default mongoose.model('Client', ClientSchema) diff --git a/src/model/User.ts b/src/model/User.ts index 6a6c964..5db3121 100644 --- a/src/model/User.ts +++ b/src/model/User.ts @@ -1,4 +1,3 @@ -import { number } from 'joi' import mongoose, { Schema, model } from 'mongoose' const AutoIncrement = require('mongoose-sequence')(mongoose) diff --git a/src/routes/api/client.ts b/src/routes/api/client.ts index f594573..0672e02 100644 --- a/src/routes/api/client.ts +++ b/src/routes/api/client.ts @@ -1,19 +1,17 @@ import express from 'express' -import { createClient } from '../../controllers/createClient' +import ClientController from '../../controllers/client' import { registerClientValidation } from '../../utils' const clientRouter = express.Router() clientRouter.post('/', async (req, res) => { - const { error, value: data } = registerClientValidation(req.body) + const { error, value: body } = registerClientValidation(req.body) if (error) return res.status(400).send(error.details[0].message) + const controller = new ClientController() try { - const savedClient = await createClient(data) - res.send({ - clientId: savedClient.clientId, - clientSecret: savedClient.clientSecret - }) + const response = await controller.createClient(body) + res.send(response) } catch (err: any) { res.status(403).send(err.toString()) } diff --git a/src/routes/api/spec/auth.spec.ts b/src/routes/api/spec/auth.spec.ts index d627dc5..9fd5161 100644 --- a/src/routes/api/spec/auth.spec.ts +++ b/src/routes/api/spec/auth.spec.ts @@ -3,7 +3,7 @@ import { MongoMemoryServer } from 'mongodb-memory-server' import request from 'supertest' import app from '../../../app' import UserController from '../../../controllers/user' -import { createClient } from '../../../controllers/createClient' +import ClientController from '../../../controllers/client' import { generateAccessToken, generateAuthCode, @@ -29,11 +29,12 @@ describe('auth', () => { let con: Mongoose let mongoServer: MongoMemoryServer const userController = new UserController() + const clientController = new ClientController() beforeAll(async () => { mongoServer = await MongoMemoryServer.create() con = await mongoose.connect(mongoServer.getUri()) - await createClient({ clientId, clientSecret }) + await clientController.createClient({ clientId, clientSecret }) await populateClients() }) diff --git a/src/routes/api/spec/client.spec.ts b/src/routes/api/spec/client.spec.ts index 64bcc3f..b72796f 100644 --- a/src/routes/api/spec/client.spec.ts +++ b/src/routes/api/spec/client.spec.ts @@ -2,8 +2,8 @@ import mongoose, { Mongoose } from 'mongoose' import { MongoMemoryServer } from 'mongodb-memory-server' import request from 'supertest' import app from '../../../app' -import { createClient } from '../../../controllers/createClient' import UserController from '../../../controllers/user' +import ClientController from '../../../controllers/client' import { generateAccessToken } from '../auth' import { saveTokensInDB } from '../../../utils' @@ -27,6 +27,7 @@ describe('client', () => { let con: Mongoose let mongoServer: MongoMemoryServer const userController = new UserController() + const clientController = new ClientController() beforeAll(async () => { mongoServer = await MongoMemoryServer.create() @@ -115,7 +116,7 @@ describe('client', () => { }) it('should respond with Forbidden if clientId is already present', async () => { - await createClient(newClient) + await clientController.createClient(newClient) const res = await request(app) .post('/SASjsApi/client') diff --git a/src/routes/api/user.ts b/src/routes/api/user.ts index 978c117..924eec2 100644 --- a/src/routes/api/user.ts +++ b/src/routes/api/user.ts @@ -13,7 +13,6 @@ import { const userRouter = express.Router() -// create user userRouter.post('/', authenticateAccessToken, verifyAdmin, async (req, res) => { const { error, value: body } = registerUserValidation(req.body) if (error) return res.status(400).send(error.details[0].message) @@ -37,7 +36,6 @@ userRouter.get('/', authenticateAccessToken, async (req, res) => { } }) -// get one user userRouter.get('/:userId', authenticateAccessToken, async (req: any, res) => { const { userId } = req.params @@ -50,7 +48,6 @@ userRouter.get('/:userId', authenticateAccessToken, async (req: any, res) => { } }) -// update user userRouter.patch( '/:userId', authenticateAccessToken, @@ -73,7 +70,6 @@ userRouter.patch( } ) -// delete user userRouter.delete( '/:userId', authenticateAccessToken, diff --git a/tsoa.json b/tsoa.json index 224e1b0..e2a56c5 100644 --- a/tsoa.json +++ b/tsoa.json @@ -10,6 +10,16 @@ "bearerFormat": "JWT" } }, + "tags": [ + { + "name": "User", + "description": "Operations about users" + }, + { + "name": "Client", + "description": "Operations about clients" + } + ], "specVersion": 3 } }