You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

137 lines
3.2 KiB

import MockAdatper from 'axios-mock-adapter';
import HTTP, { defaultHttpClient } from '../http';
function newId() {
return Number((Math.random() * 100000).toFixed(0));
}
function parseOffset(url) {
const offset = url.match(/offset=(\d+)/);
return offset ? Number(offset[1]) : 0;
}
function parseDocId(url) {
return Number(url.split('/')[5]);
}
function parseAnnotationId(url) {
return Number(url.split('/')[7]);
}
export default class DemoApi {
constructor(data, labelField) {
this.data = data;
this.labelField = labelField;
this.mocks = [new MockAdatper(HTTP), new MockAdatper(defaultHttpClient)];
this.pageSize = 5;
}
getMe() {
return [200, this.data.me];
}
getLabels() {
return [200, this.data.labels];
}
getStatistics() {
return [200, {
total: this.data.docs.length,
remaining: this.data.docs.filter(doc => doc.annotations.length === 0).length,
}];
}
getDocs(config) {
const offset = parseOffset(config.url);
return [200, {
results: this.data.docs.slice(Math.max(offset - 1, 0), this.pageSize),
count: this.data.docs.length,
next: offset + this.pageSize <= this.data.docs.length
? config.url.replace(`offset=${offset}`, `offset=${offset + this.pageSize}`)
: null,
previous: offset - this.pageSize >= 0
? config.url.replace(`offset=${offset}`, `offset=${offset - this.pageSize}`)
: null,
}];
}
getProject() {
return [200, this.data.project];
}
postAnnotations(config) {
const docId = parseDocId(config.url);
const body = JSON.parse(config.data);
const doc = this.data.docs.find(_ => _.id === docId);
if (!doc) {
return [404, {}];
}
let annotation = doc.annotations.find(_ => _[this.labelField] === body[this.labelField]);
if (!annotation) {
annotation = { id: newId(), ...body };
doc.annotations.push(annotation);
}
return [200, annotation];
}
deleteAnnotations(config) {
const docId = parseDocId(config.url);
const annotationId = parseAnnotationId(config.url);
const doc = this.data.docs.find(_ => _.id === docId);
if (!doc) {
return [404, {}];
}
doc.annotations = doc.annotations.filter(el => el.id !== annotationId);
return [200, {}];
}
start() {
this.mocks.forEach((mock) => {
mock.onGet(/\/v1\/.*/g).reply((config) => {
if (config.url.endsWith('/me')) {
return this.getMe();
}
if (config.url.endsWith('/labels')) {
return this.getLabels();
}
if (config.url.endsWith('/statistics')) {
return this.getStatistics();
}
if (config.url.indexOf('/docs') !== -1) {
return this.getDocs(config);
}
return this.getProject();
});
mock.onPost(/\/v1\/.*/g).reply((config) => {
if (config.url.endsWith('/annotations')) {
return this.postAnnotations(config);
}
return [404, {}];
});
mock.onDelete(/\/v1\/.*/g).reply((config) => {
if (config.url.indexOf('/annotations') !== -1) {
return this.deleteAnnotations(config);
}
return [404, {}];
});
});
}
stop() {
this.mocks.forEach(mock => mock.reset());
}
}