Skip to content

Commit

Permalink
Small helper in UI to access API more easily
Browse files Browse the repository at this point in the history
Fixes #1842
  • Loading branch information
Taloth authored and Qstick committed Jun 5, 2022
1 parent 8711b1a commit 735024b
Show file tree
Hide file tree
Showing 2 changed files with 121 additions and 0 deletions.
120 changes: 120 additions & 0 deletions frontend/src/Diag/ConsoleApi.js
@@ -0,0 +1,120 @@
import createAjaxRequest from 'Utilities/createAjaxRequest';

// This file contains some helpers for power users in a browser console

let hasWarned = false;

function checkActivationWarning() {
if (!hasWarned) {
console.log('Activated LidarrApi console helpers.');
console.warn('Be warned: There will be no further confirmation checks.');
hasWarned = true;
}
}

function attachAsyncActions(promise) {
promise.filter = function() {
const args = arguments;
const res = this.then((d) => d.filter(...args));
attachAsyncActions(res);
return res;
};

promise.map = function() {
const args = arguments;
const res = this.then((d) => d.map(...args));
attachAsyncActions(res);
return res;
};

promise.all = function() {
const res = this.then((d) => Promise.all(d));
attachAsyncActions(res);
return res;
};

promise.forEach = function(action) {
const res = this.then((d) => Promise.all(d.map(action)));
attachAsyncActions(res);
return res;
};
}

class ResourceApi {
constructor(api, url) {
this.api = api;
this.url = url;
}

single(id) {
return this.api.fetch(`${this.url}/${id}`);
}

all() {
return this.api.fetch(this.url);
}

filter(pred) {
return this.all().filter(pred);
}

update(resource) {
return this.api.fetch(`${this.url}/${resource.id}`, { method: 'PUT', data: resource });
}

delete(resource) {
if (typeof resource === 'object' && resource !== null && resource.id) {
resource = resource.id;
}

if (!resource || !Number.isInteger(resource)) {
throw Error('Invalid resource', resource);
}

return this.api.fetch(`${this.url}/${resource}`, { method: 'DELETE' });
}

fetch(url, options) {
return this.api.fetch(`${this.url}${url}`, options);
}
}

class ConsoleApi {
constructor() {
this.series = new ResourceApi(this, '/artist');
}

resource(url) {
return new ResourceApi(this, url);
}

fetch(url, options) {
checkActivationWarning();

options = options || {};

const req = {
url,
method: options.method || 'GET'
};

if (options.data) {
req.dataType = 'json';
req.data = JSON.stringify(options.data);
}

const promise = createAjaxRequest(req).request;

promise.fail((xhr) => {
console.error(`Failed to fetch ${url}`, xhr);
});

attachAsyncActions(promise);

return promise;
}
}

window.LidarrApi = new ConsoleApi();

export default ConsoleApi;
1 change: 1 addition & 0 deletions frontend/src/index.js
Expand Up @@ -4,6 +4,7 @@ import { render } from 'react-dom';
import createAppStore from 'Store/createAppStore';
import App from './App/App';

import 'Diag/ConsoleApi';
import './preload';
import './polyfills';
import 'Styles/globals.css';
Expand Down

0 comments on commit 735024b

Please sign in to comment.