Files
cloudwork-exercise/src/state/workloads/services.ts
2019-02-12 19:03:09 +00:00

68 lines
1.5 KiB
TypeScript

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 = work.id % 2
? 'FAILURE'
: 'SUCCESS';
}
public create({ complexity }: { complexity: number }) {
const id = this.counter++;
const status: Status = 'WORKING';
const milliseconds = complexity * 1000;
const completeDate = moment().add(complexity, 'second').toDate();
const timer = setTimeout(() => this.completeWorkload(work), milliseconds);
const work: Work = {
id,
complexity,
status,
completeDate,
timer,
}
this.workLoads[id] = work;
return Promise.resolve({ id, status, 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;
}