Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
feat: Core#setLocale for localisation of error output (where available)
  • Loading branch information
simon-scherzinger committed May 29, 2018
1 parent ad72872 commit a0e5222
Show file tree
Hide file tree
Showing 12 changed files with 98 additions and 63 deletions.
6 changes: 3 additions & 3 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Expand Up @@ -31,7 +31,7 @@
"@types/traverson": "^2.0.28",
"@types/validator": "^9.4.0",
"browser-cookies": "^1.1.0",
"ec.errors": "^0.2.0",
"ec.errors": "^0.2.2",
"eventsource": "^1.0.5",
"halfred": "^1.0.0",
"json-schema-remote": "^1.3.6",
Expand Down
11 changes: 9 additions & 2 deletions src/Core.ts
Expand Up @@ -8,7 +8,7 @@ const { convertValidationError } = require('ec.errors')();

import { EventEmitterFactory } from './EventEmitter';
import TokenStoreFactory from './TokenStore';
import { get, getSchema, optionsToQuery, post } from './helper';
import { locale, setLocale, get, getSchema, optionsToQuery, post } from './helper';
import Resource from './resources/Resource';
import ListResource, { filterOptions } from './resources/ListResource';
import Problem from './Problem';
Expand Down Expand Up @@ -297,6 +297,13 @@ export default class Core {
return this;
}

/**
* Set the global locale for error output. 'de' and 'en' are available.
*/
setLocale(globalLocale: string = 'en'): Core {
setLocale(globalLocale);
return this;
}

/**
* Get a list of all avaliable filter options for a given relation.
Expand Down Expand Up @@ -459,7 +466,7 @@ export default class Core {
.then(link =>
validator.validate(resource, `${link.profile}${this[relationsSymbol][relation].createTemplateModifier}`)
.catch((e) => {
throw new Problem(convertValidationError(e));
throw new Problem(convertValidationError(e), locale);
}))
.then(() => this.follow(this[relationsSymbol][relation].relation))
.then(request => {
Expand Down
4 changes: 2 additions & 2 deletions src/DataManager.ts
Expand Up @@ -10,7 +10,7 @@ import DMStatsResource from './resources/datamanager/DMStatsResource';
import TemplateList from './resources/datamanager/TemplateList';
import TemplateResource from './resources/datamanager/TemplateResource';
import { filterOptions } from './resources/ListResource';
import { get, getHistory, optionsToQuery, post, superagentGet } from './helper';
import { locale, get, getHistory, optionsToQuery, post, superagentGet } from './helper';
import Problem from './Problem';
import HistoryEvents from './resources/publicAPI/HistoryEvents';

Expand Down Expand Up @@ -100,7 +100,7 @@ export default class DataManager extends Core {
.then(link =>
validator.validate(template, `${link.profile}-template`)
.catch((e) => {
throw new Problem(convertValidationError(e));
throw new Problem(convertValidationError(e), locale);
}))
.then(() => this.follow('ec:dm-templates'))
.then(request => post(request, template))
Expand Down
18 changes: 14 additions & 4 deletions src/Problem.ts
@@ -1,10 +1,14 @@
const { getLocalised } = require('ec.errors')();

interface Problem extends Error {
status: number;
type: string;
message: string;
code: number;
detail: string;
remoteStack: string;
requestID: string;
subErrors: Problem | any; // TODO Error
subErrors: Problem | any;
title: string;
verbose: string;
}
Expand All @@ -23,7 +27,7 @@ class Problem extends Error {
*
* @param {object} error the error received from any entrecode API.
*/
public constructor(error: Problem | any) {
public constructor(error: Problem | any, locale: string = 'en') {
super(error.title || error.message);

Object.assign(this, error);
Expand All @@ -33,6 +37,12 @@ class Problem extends Error {
});
}

if (locale !== 'en') {
const localised = getLocalised(Object.assign({}, this), locale);
this.message = localised.message;
this.title = localised.message;
}

if ('stack' in error) {
this.remoteStack = error.stack;
}
Expand All @@ -42,9 +52,9 @@ class Problem extends Error {
if (!Array.isArray(subErrors)) {
subErrors = [subErrors];
}
this.subErrors = subErrors.map(e => new Problem(e));
this.subErrors = subErrors.map(e => new Problem(e, locale));
} else if ('subErrors' in error) {
this.subErrors = error.subErrors.map(e => new Problem(e));
this.subErrors = error.subErrors.map(e => new Problem(e, locale));
} else {
this.subErrors = [];
}
Expand Down
5 changes: 3 additions & 2 deletions src/PublicAPI.ts
Expand Up @@ -23,7 +23,8 @@ import {
postEmpty,
superagentFormPost,
superagentPost,
getHistory
getHistory,
locale,
} from './helper';
import DMAssetResource from './resources/publicAPI/DMAssetResource';
import DMAssetList from './resources/publicAPI/DMAssetList';
Expand Down Expand Up @@ -626,7 +627,7 @@ export default class PublicAPI extends Core {
.then(link =>
validator.validate(e, `${link.profile}?template=post`)
.catch((e) => {
throw new Problem(convertValidationError(e));
throw new Problem(convertValidationError(e), locale);
}))
.then(() => this.follow(`${this[shortIDSymbol]}:${model}`))
.then(request => {
Expand Down
26 changes: 16 additions & 10 deletions src/helper.ts
@@ -1,4 +1,4 @@
import * as locale from 'locale';
import * as localeLib from 'locale';
import * as EventSource from 'eventsource/lib/eventsource-polyfill';
import * as superagent from 'superagent';
import * as validator from 'json-schema-remote';
Expand Down Expand Up @@ -61,12 +61,12 @@ function jsonHandler(callback) {
code = '000';
break;
}
return callback(new Problem(newError(code, `ec.sdk: empty body on unsuccessful status: ${res.statusCode}`)));
return callback(new Problem(newError(code, `ec.sdk: empty body on unsuccessful status: ${res.statusCode}`), locale));
}

return callback(new Problem(JSON.parse(res.body)));
return callback(new Problem(JSON.parse(res.body), locale));
} catch (e) {
return callback(new Problem(newError('000', `ec.sdk: unable to parse body: ${res.body}`)));
return callback(new Problem(newError('000', `ec.sdk: unable to parse body: ${res.body}`)), locale);
}
};
}
Expand Down Expand Up @@ -360,7 +360,7 @@ export function superagentFormPost(environment: environment, url: string, form:
.catch((err) => {
let problem;
if (err.status && err.response && 'body' in err.response) {
problem = new Problem(err.response.body);
problem = new Problem(err.response.body, locale);
}
EventEmitterFactory(environment).emit('error', problem || err);
throw problem || err;
Expand Down Expand Up @@ -391,7 +391,7 @@ export function superagentGet(url: string, headers?: any, environment?: environm
.catch((err) => {
let problem;
if (err.status && err.response && 'body' in err.response) {
problem = new Problem(err.response.body);
problem = new Problem(err.response.body, locale);
}
EventEmitterFactory(environment).emit('error', problem || err);
throw problem || err;
Expand Down Expand Up @@ -433,7 +433,7 @@ export function superagentPost(environment: environment, request: any): Promise<
.catch((err) => {
let problem;
if (err.status && err.response && 'body' in err.response) {
problem = new Problem(err.response.body);
problem = new Problem(err.response.body), locale;
}
EventEmitterFactory(environment).emit('error', problem || err);
throw problem || err;
Expand Down Expand Up @@ -605,7 +605,7 @@ export function optionsToQuery(options: filterOptions, templateURL?: string): an
error = newError(212, `Cannot apply 'exact' filter to '${missing}'`, missing);
}

return new Problem(error);
return new Problem(error, locale);
});
throw err;
}
Expand All @@ -630,10 +630,10 @@ export function fileNegotiate(asset: AssetResource | DeletedAssetResource | Publ
let f = JSON.parse(JSON.stringify(asset.files));

if (requestedLocale) {
const supportedLocales = new locale['Locales'](
const supportedLocales = new localeLib['Locales'](
Array.from(new Set(f.map(e => e.locale))) // unique
.filter(a => !!a));// remove falsy values
let bestLocale = (new locale['Locales'](requestedLocale)).best(supportedLocales).toString();
let bestLocale = (new localeLib['Locales'](requestedLocale)).best(supportedLocales).toString();
bestLocale = /^([^.]+)/.exec(bestLocale)[1]; // remove charset
const filesWithLocale = f.filter(file => file.locale === bestLocale);
if (filesWithLocale && filesWithLocale.length > 0) {
Expand Down Expand Up @@ -708,3 +708,9 @@ export function getSchema(link: string): any {
});
});
}

export let locale = 'en';

export function setLocale(globalLocale: string = 'en') {
locale = globalLocale;
}
8 changes: 4 additions & 4 deletions src/resources/Resource.ts
Expand Up @@ -8,7 +8,7 @@ import * as assert from 'assert';
const { convertValidationError } = require('ec.errors')();

import ListResource, { filterOptions } from './ListResource';
import { del, get, optionsToQuery, post, put } from '../helper';
import { del, get, optionsToQuery, post, put, locale } from '../helper';
import Problem from '../Problem';

const environmentSymbol = Symbol.for('environment');
Expand Down Expand Up @@ -158,7 +158,7 @@ class Resource {
.then(link =>
validator.validate(resource, `${link.profile}${this[relationsSymbol][relation].createTemplateModifier}`)
.catch((e) => {
throw new Problem(convertValidationError(e));
throw new Problem(convertValidationError(e), locale);
}))
.then(() => this.newRequest().follow(this[relationsSymbol][relation].relation))
.then(request => {
Expand Down Expand Up @@ -448,7 +448,7 @@ class Resource {
const out = this.toOriginal();
return validator.validate(out, overwriteSchemaUrl || this.getLink('self').profile)
.catch((e) => {
throw new Problem(convertValidationError(e));
throw new Problem(convertValidationError(e), locale);
})
.then(() => {
const request = this.newRequest().follow('self');
Expand Down Expand Up @@ -536,7 +536,7 @@ class Resource {
validate(): Promise<boolean> {
return validator.validate(this.toOriginal(), this.getLink('self').profile)
.catch((e) => {
throw new Problem(convertValidationError(e));
throw new Problem(convertValidationError(e), locale);
})
.then(() => true);
}
Expand Down
4 changes: 2 additions & 2 deletions src/resources/datamanager/TemplateResource.ts
Expand Up @@ -2,7 +2,7 @@ import * as halfred from 'halfred';
import * as validator from 'json-schema-remote';
import Resource from '../Resource';
import DataManagerResource from './DataManagerResource';
import { get, post, put } from '../../helper';
import { get, post, put, locale } from '../../helper';
import { environment } from '../../Core';
import Problem from '../../Problem';

Expand Down Expand Up @@ -85,7 +85,7 @@ class TemplateResource extends Resource {
.then(() =>
validator.validate(body || {}, this.dataSchema)
.catch((e) => {
throw new Problem(convertValidationError(e));
throw new Problem(convertValidationError(e), locale);
}))
.then(() => {
const request = this.newRequest().follow('ec:datamanagers/new-from-template');
Expand Down
4 changes: 2 additions & 2 deletions src/resources/publicAPI/EntryResource.ts
Expand Up @@ -7,7 +7,7 @@ import LiteEntryResource from './LiteEntryResource';
import LiteDMAccountResource from './LiteDMAccountResource';
import LiteRoleResource from './LiteRoleResource';
import PublicAssetResource from './PublicAssetResource';
import { get, fileNegotiate, getSchema, optionsToQuery, getHistory } from '../../helper';
import { get, fileNegotiate, getSchema, optionsToQuery, getHistory, locale } from '../../helper';
import { environment } from '../../Core';
import DMAssetResource from './DMAssetResource';
import { filterOptions } from '../ListResource';
Expand Down Expand Up @@ -671,7 +671,7 @@ class EntryResource extends LiteEntryResource {
const schema = this[schemaSymbol].allOf[1].properties[field];
return validator.validate(this[field], schema)
.catch((e) => {
throw new Problem(convertValidationError(e));
throw new Problem(convertValidationError(e), locale);
});
});
}
Expand Down
5 changes: 5 additions & 0 deletions test/Core.test.js
Expand Up @@ -206,6 +206,11 @@ describe('Core', () => {
const core = new Core.default({ live: 'https://datamanager.entrecode.de' }, { cookieModifier: 'Test' });
core[environmentSymbol].should.be.equal('liveTest');
});
it('should set locale', () => {
core.setLocale('de');
helper.locale.should.be.equal('de');
core.setLocale('en');
});
});

describe('Network Helper', () => {
Expand Down

0 comments on commit a0e5222

Please sign in to comment.