import _ from 'lodash'; type IMissingMessageHandlerConstructorData = { apiUrl: string; }; type IMissingMessageHandler = { handleMessage(data: { code: string; lang: string }): void; }; class MissingMessageHandler implements IMissingMessageHandler { #headers: Headers; #apiUrl: string; #handledMessages: Array<{ code: string; lang: string }> = []; constructor(data: IMissingMessageHandlerConstructorData) { const { apiUrl } = data ?? {}; if (!_.isString(apiUrl) || _.isEmpty(apiUrl)) { throw new Error('[MissingMessageHandler] constructor: please provide a valid apiUrl'); } this.#apiUrl = apiUrl; this.#headers = new Headers({ Accept: 'application/json', 'Content-Type': 'application/json' }); } handleMessage(data: { code: string; lang: string }): void { if (!_.isPlainObject(data)) { throw new Error('[MissingMessageHandler] handleMessage: please provide valid message data'); } const { code, lang } = data; if (!_.isString(code) || _.isEmpty(code)) { throw new Error('[MissingMessageHandler] handleMessage: please provide valid code'); } if (!_.isString(lang) || _.isEmpty(lang)) { throw new Error('[MissingMessageHandler] handleMessage: please provide valid lang'); } if (_.some(this.#handledMessages, (message) => _.isEqual(message, { code, lang }))) { return; } else { this.#handledMessages.push({ code, lang }); fetch(`${this.#apiUrl}/i18n/message`, { method: 'put', headers: this.#headers, body: JSON.stringify({ code, lang, text: code }) }) .then((response) => response.json()) .then(() => { //eslint-disable-next-line console.log(`[MissingMessageHandler] handleMessage: created message for lang ${lang} and code ${code}`); }) .catch((e) => { //eslint-disable-next-line console.error(e); this.#handledMessages = _.reject(this.#handledMessages, (m) => _.isEqual(m, { code, lang })); }); return; } } } export { MissingMessageHandler };