diff --git a/background/openusercss-api.js b/background/openusercss-api.js new file mode 100644 index 00000000..f780d025 --- /dev/null +++ b/background/openusercss-api.js @@ -0,0 +1,106 @@ +'use strict'; + +// begin:nanographql - Tiny graphQL client library +// License: MIT + +const getOpname = /(query|mutation) ?([\w\d-_]+)? ?\(.*?\)? \{/; +const gql = str => { + str = Array.isArray(str) ? str.join('') : str; + const name = getOpname.exec(str); + return function (variables) { + const data = {query: str}; + if (variables) data.variables = JSON.stringify(variables); + if (name && name.length) { + const operationName = name[2]; + if (operationName) data.operationName = name[2]; + } + return JSON.stringify(data); + }; +}; + +// end:nanographql + +const api = 'https://api.openusercss.org'; +const doQuery = ({id}, queryString) => new Promise((resolve, reject) => { + const query = gql(queryString); + + fetch(api, { + 'method': 'POST', + 'headers': new Headers({ + 'Content-Type': 'application/json' + }), + 'body': query({ + id + }) + }) + .then(res => { + res.json() + .then(response => { + if (response.errors) { + reject(new Error(JSON.stringify(response.errors))); + } + resolve(response); + }); + }) + .catch(reject); +}); + +window.API_METHODS = Object.assign(window.API_METHODS || {}, { + /** + * This function can be used to retrieve a theme object from the + * GraphQL API, set above + * + * Example: + * chrome.runtime.sendMessage({ + * 'method': 'oucThemeById', + * 'id': '5a2f819f7c57c751001b49df' + * }, console.log); + * + * @param {ID} $0.id MongoDB style ID + * @returns {Promise.<{data: object}>} The GraphQL result with the `theme` object + */ + + 'oucThemeById': params => doQuery(params, ` + query($id: ID!) { + theme(id: $id) { + _id + title + description + createdAt + lastUpdate + version + screenshots + user { + _id + displayname + } + } + } + `), + + /** + * This function can be used to retrieve a user object from the + * GraphQL API, set above + * + * Example: + * chrome.runtime.sendMessage({ + * 'method': 'oucUserById', + * 'id': '5a2f0361ba666f0b00b9c827' + * }, console.log); + * + * @param {ID} $0.id MongoDB style ID + * @returns {Promise.<{data: object}>} The GraphQL result with the `user` object + */ + + 'oucUserById': params => doQuery(params, ` + query($id: ID!) { + user(id: $id) { + _id + displayname + avatarUrl + smallAvatarUrl + bio + } + } + `), +}); diff --git a/manifest.json b/manifest.json index baa0a7c9..8cffdff2 100644 --- a/manifest.json +++ b/manifest.json @@ -34,6 +34,7 @@ "background/search-db.js", "background/update.js", "background/refresh-all-tabs.js", + "background/openusercss-api.js", "vendor/node-semver/semver.js", "vendor-overwrites/colorpicker/colorconverter.js" ]