Skip to content

Commit

Permalink
Security updates and new types
Browse files Browse the repository at this point in the history
  • Loading branch information
MrKriegler committed Dec 13, 2019
1 parent a54ebbf commit 6f1bde4
Show file tree
Hide file tree
Showing 17 changed files with 1,234 additions and 1,120 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -38,4 +38,5 @@ dist
typings/
lib/*.js
test/*.js
*.map
*.map
data/
17 changes: 4 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,25 +20,16 @@ Installation is simple just run
npm i
```

If you do not have a local instance of mongoDB running then run `docker-compose up`.
Be sure to run the `db_migrations/init_collection.js` on your mongodb shell.
If you do not have a local instance of mongoDB running then run `docker-compose up -d`.

To run the server locally use

```
npm run
```
Connect your mongo db instance `localhost:27017` and run the code in `db_migrations/init_collection.js` on your mongodb shell.

## Running Tests

To run the e2e tests simply run
To run the server locally use

```
npm run tests
npm start
```

You can install [restlet_client](https://restlet.com/modules/client/) and import the `restclient.json` for the API collection.

## Current endpoints

Create Task
Expand Down
2 changes: 1 addition & 1 deletion lib/common/src/config.ts
Original file line number Diff line number Diff line change
@@ -1 +1 @@
export const MONGO_URL = process.env['MONGO_URL'] || 'mongodb://192.168.99.100:27017/matilda';
export const MONGO_URL = process.env['MONGO_URL'] || 'mongodb://localhost:27017/matilda';
2,186 changes: 1,140 additions & 1,046 deletions package-lock.json

Large diffs are not rendered by default.

20 changes: 16 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,22 @@
"description": "Open source Task management software for service based work. i.e. Plumbers, Steal work, etc",
"main": "index.js",
"scripts": {
"tests": "mocha --require ts-node/register --require tsconfig-paths/register --require source-map-support/register --recursive tests/**/*.spec.ts",
"start": "npm run build:live",
"build": "tsc -p .",
"build:live": "nodemon --watch 'src/**/*.ts' --require tsconfig-paths/register --exec \"ts-node\" src/index.ts"
"start": "DEBUG=* node --require tsconfig-paths/register --inspect=5858 -r ts-node/register ./src/index.ts",
"start:watch": "nodemon",
"build": "tsc"
},
"nodemonConfig": {
"ignore": [
"**/*.test.ts",
"**/*.spec.ts",
".git",
"node_modules"
],
"watch": [
"src"
],
"exec": "npm start",
"ext": "ts"
},
"keywords": [],
"author": "Noel Kriegler <[email protected]>",
Expand Down
8 changes: 4 additions & 4 deletions restclient.json
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,11 @@
"version": "V11"
},
"host": "localhost:3000",
"path": "/api/v1/tasks/id:task:1"
"path": "/api/v1/tasks/mid:task:1"
},
"id": "f284239c-5277-42b0-878b-a8376c7137c5",
"lastModified": "2018-12-29T09:55:02.067+02:00",
"name": "GET http://localhost:3000/api/v1/tasks/id:task:1",
"name": "GET http://localhost:3000/api/v1/tasks/mid:task:1",
"headers": [],
"metaInfo": {},
"parentId": "7b764e89-04c3-429d-96e1-38c3e8b73a92"
Expand Down Expand Up @@ -116,11 +116,11 @@
"version": "V11"
},
"host": "localhost:3000",
"path": "/api/v1/tasks/id:task:1"
"path": "/api/v1/tasks/mid:task:1"
},
"id": "3d7aef01-15c9-48cb-b817-544d75029be1",
"lastModified": "2018-12-29T23:02:46.829+02:00",
"name": "PUT http://localhost:3000/api/v1/tasks/id:task:1",
"name": "PUT http://localhost:3000/api/v1/tasks/mid:task:1",
"headers": [
{
"enabled": true,
Expand Down
3 changes: 2 additions & 1 deletion src/controllers/HealthController.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { Router, Request, Response, NextFunction } from 'express';
import { runRequest } from '@matilda/lib/common';


export class HealthController {
router: Router;

Expand All @@ -14,7 +15,7 @@ export class HealthController {

public async get(req: Request, res: Response, next: NextFunction) {
await runRequest(res,
async () => new Date()
async () => ({ date: new Date() })
);
}

Expand Down
3 changes: 1 addition & 2 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,9 @@ import * as http from 'http';
import debug from 'debug';
import Server from './server';

debug('ts-express:server');

const port = normalizePort(process.env.PORT || 3000);
Server.set('port', port);
debug('booting Matilda');

const server = http.createServer(Server);
server.listen(port);
Expand Down
7 changes: 3 additions & 4 deletions src/managers/TaskManager.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
import { TaskMongoStore, ITaskStore } from '@matilda/src/stores';
import { throwError, ERRORS, payloadRequestToStoreRequest } from '@matilda/lib/common';
import { constructCreateTaskState, constructTaskState, ITaskStateParent } from '@matilda/src/states';
import { TaskData , CreateTaskPayload, UpdateTaskPayload, GetTaskPayload, DeleteTaskPayload } from '@matilda/src/types';
import { TaskData , CreateTaskPayload, UpdateTaskPayload, GetTaskPayload, DeleteTaskPayload, TaskStatuses } from '@matilda/src/types';
import { ITaskManager } from './types';


/**
* Task Manager manages the task logic
*/
Expand All @@ -28,7 +27,7 @@ export class TaskManager implements ITaskManager {

public async createTask(payload: CreateTaskPayload): Promise<TaskData> {
let state = constructCreateTaskState(this.taskStateParent, payload.task.type);
state = await state.moveTo('new', payload.task);
state = await state.moveTo(TaskStatuses.NEW, payload.task);
await state.update(payload.task);
return await this.store.createTask(state.task);
}
Expand Down Expand Up @@ -69,7 +68,7 @@ export class TaskManager implements ITaskManager {
}

let state = constructTaskState(this.taskStateParent, task);
state = await state.moveTo('deleted', task);
state = await state.moveTo(TaskStatuses.DELETED, task);
await state.update(task);

return await this.store.updateTask(state.task);
Expand Down
66 changes: 33 additions & 33 deletions src/states/consts.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { TaskState } from './base/TaskState';
import { ITaskStateParent } from './types';
import { TaskData } from '@matilda/src/types';
import { TaskData, TaskStatuses, TaskTypes } from '@matilda/src/types';
import { NewTaskState } from './new';
import { ClosedTaskState } from './closed';
import { DeletedTaskState } from './deleted';
Expand Down Expand Up @@ -29,40 +29,40 @@ export const TASK_STATE_CONSTRUCTORS: {
[state: string]: new (parent: ITaskStateParent, task: TaskData) => TaskState
}
} = {
'quote': {
'create': CreateQuoteTaskState,
'new': NewTaskState,
'scheduled': ScheduledQuoteTaskState,
'inprogress': InprogressQuoteTaskState,
'closed': ClosedTaskState,
'rescheduled': NewTaskState,
'deleted': DeletedTaskState
[TaskTypes.QUOTE]: {
[TaskStatuses.CREATED]: CreateQuoteTaskState,
[TaskStatuses.NEW] : NewTaskState,
[TaskStatuses.SCHEDULED]: ScheduledQuoteTaskState,
[TaskStatuses.INPROGRESS]: InprogressQuoteTaskState,
[TaskStatuses.CLOSED]: ClosedTaskState,
[TaskStatuses.RESCHEDULED]: NewTaskState,
[TaskStatuses.DELETED]: DeletedTaskState
},
'installation': {
'create': CreateInstallationTaskState,
'new': NewTaskState,
'scheduled': ScheduledInstallationTaskState,
'inprogress': InprogressInstallationTaskState,
'closed': ClosedTaskState,
'rescheduled': NewTaskState,
'deleted': DeletedTaskState
[TaskTypes.INSTALLATION]: {
[TaskStatuses.CREATED]: CreateInstallationTaskState,
[TaskStatuses.NEW]: NewTaskState,
[TaskStatuses.SCHEDULED]: ScheduledInstallationTaskState,
[TaskStatuses.INPROGRESS]: InprogressInstallationTaskState,
[TaskStatuses.CLOSED]: ClosedTaskState,
[TaskStatuses.RESCHEDULED]: NewTaskState,
[TaskStatuses.DELETED]: DeletedTaskState
},
'repair': {
'create': CreateRepairTaskState,
'new': NewTaskState,
'scheduled': ScheduledRepairTaskState,
'inprogress': InprogressRepairTaskState,
'closed': ClosedTaskState,
'rescheduled': NewTaskState,
'deleted': DeletedTaskState
[TaskTypes.REPAIR]: {
[TaskStatuses.CREATED]: CreateRepairTaskState,
[TaskStatuses.NEW]: NewTaskState,
[TaskStatuses.SCHEDULED]: ScheduledRepairTaskState,
[TaskStatuses.INPROGRESS]: InprogressRepairTaskState,
[TaskStatuses.CLOSED]: ClosedTaskState,
[TaskStatuses.RESCHEDULED]: NewTaskState,
[TaskStatuses.DELETED]: DeletedTaskState
},
'deinstallation': {
'create': CreateDeinstallationTaskState,
'new': NewTaskState,
'scheduled': ScheduledDeinstallationTaskState,
'inprogress': InprogressDeinstallationTaskState,
'closed': ClosedTaskState,
'rescheduled': NewTaskState,
'deleted': DeletedTaskState
[TaskTypes.DEINSTALLATION]: {
[TaskStatuses.CREATED]: CreateDeinstallationTaskState,
[TaskStatuses.NEW]: NewTaskState,
[TaskStatuses.SCHEDULED]: ScheduledDeinstallationTaskState,
[TaskStatuses.INPROGRESS]: InprogressDeinstallationTaskState,
[TaskStatuses.CLOSED]: ClosedTaskState,
[TaskStatuses.RESCHEDULED]: NewTaskState,
[TaskStatuses.DELETED]: DeletedTaskState
}
};
4 changes: 2 additions & 2 deletions src/states/create/CreateDeinstallationTaskState.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { TaskData, TaskStatus } from '@matilda/src/types';
import { TaskData, TaskStatus, TaskStatuses } from '@matilda/src/types';
import { TaskState, ITaskStateParent } from '../index';
import {ERRORS, throwError } from '@matilda/lib/common';

Expand All @@ -10,7 +10,7 @@ export class CreateDeinstallationTaskState extends TaskState {
}

public async moveTo(targetStatus: TaskStatus, data: TaskData): Promise<TaskState> {
if (targetStatus !== 'new') {
if (targetStatus !== TaskStatuses.NEW) {
throwError(ERRORS.EINVALID, `Illegal state transition from create to ${targetStatus}`);
}

Expand Down
4 changes: 2 additions & 2 deletions src/states/create/CreateInstallationTaskState.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { TaskData, TaskStatus } from '@matilda/src/types';
import { TaskData, TaskStatus, TaskStatuses } from '@matilda/src/types';
import { TaskState, ITaskStateParent } from '../index';
import {ERRORS, throwError } from '@matilda/lib/common';

Expand All @@ -9,7 +9,7 @@ export class CreateInstallationTaskState extends TaskState {
}

public async moveTo(targetStatus: TaskStatus, data: TaskData): Promise<TaskState> {
if (targetStatus !== 'new') {
if (targetStatus !== TaskStatuses.NEW) {
throwError(ERRORS.EINVALID, `Illegal state transition from create to ${targetStatus}`);
}

Expand Down
4 changes: 2 additions & 2 deletions src/states/create/CreateQuoteTaskState.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { TaskData, TaskStatus } from '@matilda/src/types';
import { TaskData, TaskStatus, TaskStatuses } from '@matilda/src/types';
import { TaskState, ITaskStateParent } from '../index';
import {ERRORS, throwError } from '@matilda/lib/common';

Expand All @@ -9,7 +9,7 @@ export class CreateQuoteTaskState extends TaskState {
}

public async moveTo(targetStatus: TaskStatus, data: TaskData): Promise<TaskState> {
if (targetStatus !== 'new') {
if (targetStatus !== TaskStatuses.NEW) {
throwError(ERRORS.EINVALID, `Illegal state transition from create to ${targetStatus}`);
}

Expand Down
4 changes: 2 additions & 2 deletions src/states/create/CreateRepairTaskState.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { TaskData, TaskStatus } from '@matilda/src/types';
import { TaskData, TaskStatus, TaskStatuses } from '@matilda/src/types';
import { TaskState, ITaskStateParent } from '../index';
import { ERRORS, throwError } from '@matilda/lib/common';

Expand All @@ -9,7 +9,7 @@ export class CreateRepairTaskState extends TaskState {
}

public async moveTo(targetStatus: TaskStatus, data: TaskData): Promise<TaskState> {
if (targetStatus !== 'new') {
if (targetStatus !== TaskStatuses.NEW) {
throwError(ERRORS.EINVALID, `Illegal state transition from create to ${targetStatus}`);
}

Expand Down
2 changes: 1 addition & 1 deletion src/states/new/NewTaskState.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ export class NewTaskState extends TaskState {

public async onEnter(sourceStatus: TaskStatus): Promise<void> {
if (this.task.status === 'rescheduled') {
const description = `Rescheduled ${this.task.type}`;
const description = `Rescheduled ${this.task.id}`;
}

return super.onEnter(sourceStatus);
Expand Down
2 changes: 1 addition & 1 deletion src/stores/task/TaskMongoStore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import { findNextSequenceNumber, throwError, ERRORS, IMongoStoreQuery } from '@m
export class TaskMongoStore implements ITaskStore {

public async createTask(task: TaskData): Promise<TaskData> {
task.id = `id:task:${await findNextSequenceNumber(mongoose.connection, 'task_id')}`;
task.id = `mid:task:${await findNextSequenceNumber(mongoose.connection, 'task_id')}`;
task.version = 1;
await mongoose
.connection
Expand Down
19 changes: 18 additions & 1 deletion src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,24 @@ export class TaskData {
'version': number;
'enabled': boolean;
'type': ('quote' | 'installation' | 'repair' | 'deinstallation');
'status': ('new' | 'scheduled' | 'inprogress' | 'closed' | 'rescheduled' | 'deleted');
'status': ('created'| 'new' | 'scheduled' | 'inprogress' | 'closed' | 'rescheduled' | 'deleted');
}

export enum TaskStatuses {
CREATED = 'created',
NEW = 'new',
SCHEDULED = 'scheduled',
INPROGRESS = 'inprogress',
CLOSED = 'closed',
RESCHEDULED = 'rescheduled',
DELETED = 'deleted'
}

export enum TaskTypes {
QUOTE = 'quote',
INSTALLATION = 'installation',
REPAIR = 'repair',
DEINSTALLATION = 'deinstallation',
}

export interface GetTaskPayload {
Expand Down

0 comments on commit 6f1bde4

Please sign in to comment.