Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion src/endpoints/delete.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@ export async function deleteEndpoint(request: Request, response: Response) {
// Check response
if (request.payload && request.payload instanceof BaseModel) {
// Run model hook
runHook(request, response, 'delete', request.params);
if (!await runHook(request, response, 'delete', request.params)) {
return;
}

// Delete
await request.repository
Expand Down
4 changes: 3 additions & 1 deletion src/endpoints/get.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,9 @@ export async function getEndpoint(request: Request, response: Response) {
request.payload instanceof BaseModel)
) {
// Run model hook
runHook(request, response, 'get', request.payload);
if (!await runHook(request, response, 'get', request.payload)) {
return;
}

response.getResponder(request.payload, response);
}
Expand Down
4 changes: 3 additions & 1 deletion src/endpoints/login.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@ export async function loginEndpoint(
next: NextFunction
) {
// Run model hook
runHook(request, response, 'login', request.body);
if (!await runHook(request, response, 'login', request.body)) {
return;
}

// Delete undefined members
for (const key in request.body) {
Expand Down
10 changes: 7 additions & 3 deletions src/endpoints/post.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@ import { runHook } from '../run-hook';

export async function postEndpoint(request: Request, response: Response) {
// Run model hook
runHook(request, response, 'post', request.body);
if (!await runHook(request, response, 'post', request.body)) {
return;
}

// Delete undefined members
for (const key in request.body) {
Expand All @@ -14,10 +16,12 @@ export async function postEndpoint(request: Request, response: Response) {
}

// Validate
const errors = await validate(request.body);
const errors = await validate(request.body).catch((error) =>
response.error(error, response)
);

// Check
if (errors.length) {
if (errors && errors.length) {
return response.validationResponder(errors, response);
}

Expand Down
7 changes: 6 additions & 1 deletion src/endpoints/put.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@ import { runHook } from '../run-hook';

export async function putEndpoint(request: Request, response: Response) {
// Run model hook
runHook(request, response, 'put', request.params);
if (!await runHook(request, response, 'put', request.params)) {
return;
}

// Delete undefined members
for (const key in request.body) {
Expand All @@ -14,6 +16,9 @@ export async function putEndpoint(request: Request, response: Response) {
}
}

// Merge payload and request body
request.body = Object.assign(request.payload, request.body);

// Validate
const errors = await validate(request.body);

Expand Down
4 changes: 3 additions & 1 deletion src/middleware/get-query.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,9 @@ export async function getQuery(
next?: NextFunction
) {
// Run model hook
runHook(request, response, 'getQuery', request.query);
if (!await runHook(request, response, 'getQuery', request.query)) {
return;
}

// Delete undefined members
for (const key in request.query) {
Expand Down
5 changes: 2 additions & 3 deletions src/responders/post.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,8 @@ export function postResponder(result: any, response: Response) {
// Result should have ID
if (result instanceof Object && 'id' in result) {
// Send response
response.json({
id: result.id
});
// TODO: Filter out senstive info in body
response.json(result);
}
else {
// Send error
Expand Down
2 changes: 2 additions & 0 deletions src/run-hook.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,6 @@ export async function runHook(
return result;
}
}

return true;
}
18 changes: 0 additions & 18 deletions test/examples/basic/routes/auth.ts

This file was deleted.

2 changes: 0 additions & 2 deletions test/examples/basic/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ const ROOT_PATH = require('app-root-path').toString();

// Routes
import { userRouter } from './routes/user';
import { authRouter } from './routes/auth';

// Setup
pointy.before = async (app) => {
Expand All @@ -17,7 +16,6 @@ pointy.before = async (app) => {

// Routes
app.use('/api/v1/user', userRouter);
app.use('/api/v1/auth', authRouter);

// Database
await pointy.db
Expand Down
18 changes: 17 additions & 1 deletion test/spec/basic/user/user-delete.spec.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,20 @@
import { pointy } from '../../../../src';
const http = pointy.http;

describe('User API Delete', () => {});
describe('User API Delete', () => {
it('can delete', async () => {
this.result = await http
.post('/api/v1/user', {
fname: 'UserDelete1',
lname: 'UserDelete1',
username: 'User12345',
password: 'password123',
email: 'UserDelete1@test.com'
})
.catch((error) => fail(error));

await http
.delete(`/api/v1/user/${this.result.body.id}`, [ 204 ])
.catch((error) => fail(error));
});
});
67 changes: 66 additions & 1 deletion test/spec/basic/user/user-get.spec.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,69 @@
import { pointy } from '../../../../src';
const http = pointy.http;

describe('User API Read', () => {});
describe('User API Read', () => {
beforeAll(async () => {
this.user1 = await http
.post('/api/v1/user', {
fname: 'getUser1',
lname: 'getUser',
username: 'getUser1',
password: 'password123',
email: 'getUser1@get.com'
})
.catch((error) => fail(error));

this.user2 = await http
.post('/api/v1/user', {
fname: 'getUser2',
lname: 'getUser',
username: 'getUser2',
password: 'password123',
email: 'getUser2@get.com'
})
.catch((error) => fail(error));
});

it('can read all', async () => {
await http
.get('/api/v1/user', {}, [ 200 ])
.then((result) => expect(result.body).toEqual(jasmine.any(Array)))
.catch((error) => fail(error));
});

it('can read many', async () => {
await http
.get('/api/v1/user', {
lname: 'getUser'
})
.then((result) => {
expect(result.body).toEqual(jasmine.any(Array));
expect(result.body['length']).toBeGreaterThanOrEqual(2);
})
.catch((error) => fail(error));
});

it('can read one', () => {
http
.get('/api/v1/user', {
id: this.user1.body.id
})
.then((result) => {
expect(result.body).toEqual(jasmine.any(Object));
expect(result.body['fname']).toEqual('getUser1');
})
.catch((error) => fail(error));
});

it('returns 410 for a not found user', async () => {
await http
.get(
'/api/v1/user',
{
id: 12345
},
[ 410 ]
)
.catch((error) => fail(error));
});
});
119 changes: 118 additions & 1 deletion test/spec/basic/user/user-post.spec.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,121 @@
import { pointy } from '../../../../src';
const http = pointy.http;

describe('User API Create', () => {});
describe('User API Create', () => {
beforeAll(async () => {
this.user = await http
.post('/api/v1/user', {
fname: 'post1',
lname: 'post1',
username: 'postUser1',
password: 'password123',
email: 'postUser1@test.com'
})
.catch((error) =>
fail('Could not create base user: ' + JSON.stringify(error))
);
});

it('can create a user', async () => {
expect(this.user.body).toEqual(jasmine.any(Object));
expect(this.user.body['fname']).toEqual('post1');
});

it('returns an id', () => {
expect(this.user.body.id).toBeGreaterThanOrEqual(1);
});

it('cannot create duplicate usernames', async () => {
await http
.post(
'/api/v1/user',
{
fname: 'post1',
lname: 'post1',
username: 'postUser1',
password: 'password123',
email: 'dupeUserTest1@test.com'
},
[ 409 ]
)
.catch((error) => fail(error));
});

it('cannot create duplicate emails', async () => {
await http
.post(
'/api/v1/user',
{
fname: 'post1',
lname: 'post1',
username: 'postUser1',
password: 'password123',
email: 'postUser1@test.com'
},
[ 409 ]
)
.catch((error) => fail(error));
});

it('requires a username', async () => {
await http
.post(
'/api/v1/user',
{
fname: 'User',
lname: 'Tester',
password: 'password123',
email: 'requiredUser1@test.com'
},
[ 400 ]
)
.catch((error) => fail(error));
});

it('requires a password', async () => {
await http
.post(
'/api/v1/user',
{
fname: 'User',
lname: 'Tester',
username: 'requiredPass1',
email: 'requiredPass1@test.com'
},
[ 400 ]
)
.catch((error) => fail(error));
});

it('cannot accept a nonsense username', async () => {
await http
.post(
'/api/v1/user',
{
fname: 'User',
lname: 'Tester',
username: 'invalid<username',
password: 'password123',
email: 'invalidUser1@test.com'
},
[ 400 ]
)
.catch((error) => fail(error));
});

it('cannot accept a nonsense email', async () => {
await http
.post(
'/api/v1/user',
{
fname: 'User',
lname: 'Tester',
username: 'invalidEmail1',
password: 'password123',
email: 'drew3test.com'
},
[ 400 ]
)
.catch((error) => fail(error));
});
});
Loading