Add workload service

This commit is contained in:
James Greenaway
2019-01-29 10:08:55 +00:00
parent 986cf86403
commit 7e87aad73c
4 changed files with 74 additions and 0 deletions

View File

@@ -3,6 +3,7 @@
"version": "0.1.0",
"private": true,
"dependencies": {
"moment": "^2.24.0",
"react": "^16.7.0",
"react-dom": "^16.7.0",
"react-redux": "^6.0.0",

View File

@@ -1,2 +1,3 @@
export * from './actions';
export * from './reducers';
export * from './services';

View File

@@ -0,0 +1,67 @@
import moment from 'moment';
import { Status } from './types';
export class WorkloadService {
private workLoads: { [key in number]: Work } = {};
private counter = 0;
private getWorkload(id: number): Work | undefined {
return this.workLoads[id];
}
private completeWorkload(work: Work) {
work.status = this.counter % 2
? 'SUCCESS'
: 'FAILURE';
}
public create({ complexity }: { complexity: number }) {
const id = this.counter++;
const status = 'WORKING';
const seconds = complexity;
const completeDate = moment().add(complexity, 'second').toDate();
const timer = setTimeout(() => this.completeWorkload(work), seconds);
const work: Work = {
id,
complexity,
status,
completeDate,
timer,
}
this.workLoads[id] = work;
return Promise.resolve({ id, complexity, completeDate });
}
public checkStatus({ id }: { id: number }) {
const work = this.getWorkload(id);
if (!work) return Promise.reject('Workload not found');
return Promise.resolve(work);
}
public cancel({ id }: { id: number }) {
const work = this.getWorkload(id);
if (!work) return Promise.reject('Workload not found');
if (work.status !== 'WORKING') return Promise.reject('Workload cannot be canceled');
clearTimeout(work.timer)
work.status = 'CANCELED';
return Promise.resolve(work);
}
}
interface Work {
id: number;
complexity: number;
completeDate: Date;
status: Status;
timer: NodeJS.Timeout;
}

View File

@@ -6297,6 +6297,11 @@ mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@
dependencies:
minimist "0.0.8"
moment@^2.24.0:
version "2.24.0"
resolved "https://npm.nutterlogic.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b"
integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==
move-concurrently@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92"