diff --git a/src/App.js b/src/App.js index 7b71d24..68b8f2d 100644 --- a/src/App.js +++ b/src/App.js @@ -2,7 +2,7 @@ import React from "react"; import { Admin, Resource, resolveBrowserLocale } from "react-admin"; import polyglotI18nProvider from "ra-i18n-polyglot"; import authProvider from "./synapse/authProvider"; -import dataProvider from "./dataProvider"; +import dataProvider from "./synapse/dataProvider"; import LoginPage from "./components/LoginPage"; import germanMessages from "./i18n/de"; import englishMessages from "./i18n/en"; @@ -24,7 +24,7 @@ const App = () => ( dataProvider={dataProvider} i18nProvider={i18nProvider} > - + ); diff --git a/src/dataProvider.js b/src/dataProvider.js deleted file mode 100644 index fb57c93..0000000 --- a/src/dataProvider.js +++ /dev/null @@ -1,13 +0,0 @@ -const dataProvider = { - getList: (resource, params) => Promise, - getOne: (resource, params) => Promise, - getMany: (resource, params) => Promise, - getManyReference: (resource, params) => Promise, - create: (resource, params) => Promise, - update: (resource, params) => Promise, - updateMany: (resource, params) => Promise, - delete: (resource, params) => Promise, - deleteMany: (resource, params) => Promise, -}; - -export default dataProvider; diff --git a/src/synapse/dataProvider.js b/src/synapse/dataProvider.js new file mode 100644 index 0000000..441f813 --- /dev/null +++ b/src/synapse/dataProvider.js @@ -0,0 +1,220 @@ +import { fetchUtils } from "react-admin"; +import { stringify } from "query-string"; + +// Adds the access token to all requests +const jsonClient = (url, options = {}) => { + const token = localStorage.getItem("access_token"); + console.log("httpClient " + url); + if (token != null) { + options.user = { + authenticated: true, + token: `Bearer ${token}`, + }; + } + return fetchUtils.fetchJson(url, options); +}; + +const resourceMap = { + users: { + path: "/_synapse/admin/v2/users", + map: u => ({ + ...u, + id: u.name, + is_guest: !!u.is_guest, + admin: !!u.admin, + deactivated: !!u.deactivated, + }), + data: "users", + total: (json, perPage) => { + return parseInt(json.next_token, 10) + perPage; + }, + }, + rooms: { + path: "/_synapse/admin/v1/rooms", + map: r => ({ + ...r, + id: r.room_id, + alias: r.canonical_alias, + members: r.joined_members, + }), + data: "rooms", + total: json => { + return json.total_rooms; + }, + }, +}; + +function filterNullValues(key, value) { + // Filtering out null properties + if (value === null) { + return undefined; + } + return value; +} + +const dataProvider = { + getList: (resource, params) => { + console.log("getList " + resource); + const { user_id, guests } = params.filter; + const { page, perPage } = params.pagination; + const query = { + from: (page - 1) * perPage, + limit: perPage, + user_id: user_id, + guests: guests, + }; + const homeserver = localStorage.getItem("home_server"); + if (!homeserver || !(resource in resourceMap)) return Promise.reject(); + + const res = resourceMap[resource]; + const homeserver_url = "https://" + homeserver + res.path; + const url = `${homeserver_url}?${stringify(query)}`; + + return jsonClient(url).then(({ json }) => ({ + data: json[res.data].map(res.map), + total: res.total(json, perPage), + })); + }, + + getOne: (resource, params) => { + console.log("getOne " + resource); + const homeserver = localStorage.getItem("home_server"); + if (!homeserver || !(resource in resourceMap)) return Promise.reject(); + + const res = resourceMap[resource]; + const homeserver_url = "https://" + homeserver + res.path; + return jsonClient(`${homeserver_url}/${params.id}`).then(({ json }) => ({ + data: res.map(json), + })); + }, + + getMany: (resource, params) => { + console.log("getMany " + resource); + const homeserver = localStorage.getItem("home_server"); + if (!homeserver || !(resource in resourceMap)) return Promise.reject(); + + const res = resourceMap[resource]; + const homeserver_url = "https://" + homeserver + res.path; + return Promise.all( + params.ids.map(id => jsonClient(`${homeserver_url}/${id}`)) + ).then(responses => ({ + data: responses.map(({ json }) => res.map(json)), + })); + }, + + getManyReference: (resource, params) => { + // FIXME + console.log("getManyReference " + resource); + const { page, perPage } = params.pagination; + const { field, order } = params.sort; + const query = { + sort: JSON.stringify([field, order]), + range: JSON.stringify([(page - 1) * perPage, page * perPage - 1]), + filter: JSON.stringify({ + ...params.filter, + [params.target]: params.id, + }), + }; + + const homeserver = localStorage.getItem("home_server"); + if (!homeserver || !(resource in resourceMap)) return Promise.reject(); + + const res = resourceMap[resource]; + const homeserver_url = "https://" + homeserver + res.path; + const url = `${homeserver_url}?${stringify(query)}`; + + return jsonClient(url).then(({ headers, json }) => ({ + data: json, + total: parseInt( + headers + .get("content-range") + .split("/") + .pop(), + 10 + ), + })); + }, + + update: (resource, params) => { + console.log("update " + resource); + const homeserver = localStorage.getItem("home_server"); + if (!homeserver || !(resource in resourceMap)) return Promise.reject(); + + const res = resourceMap[resource]; + const homeserver_url = "https://" + homeserver + res.path; + return jsonClient(`${homeserver_url}/${params.id}`, { + method: "PUT", + body: JSON.stringify(params.data, filterNullValues), + }).then(({ json }) => ({ + data: json, + })); + }, + + updateMany: (resource, params) => { + console.log("updateMany " + resource); + const homeserver = localStorage.getItem("home_server"); + if (!homeserver || !(resource in resourceMap)) return Promise.reject(); + + const res = resourceMap[resource]; + const homeserver_url = "https://" + homeserver + res.path; + return Promise.all( + params.ids.map(id => jsonClient(`${homeserver_url}/${id}`), { + method: "PUT", + body: JSON.stringify(params.data, filterNullValues), + }) + ).then(responses => ({ + data: responses.map(({ json }) => json), + })); + }, + + create: (resource, params) => { + console.log("create " + resource); + const homeserver = localStorage.getItem("home_server"); + if (!homeserver || !(resource in resourceMap)) return Promise.reject(); + + const res = resourceMap[resource]; + const homeserver_url = "https://" + homeserver + res.path; + return jsonClient(`${homeserver_url}/${params.id}`, { + method: "PUT", + body: JSON.stringify(params.data, filterNullValues), + }).then(({ json }) => ({ + data: { + ...params.data, + id: json.id, + }, + })); + }, + + delete: (resource, params) => { + console.log("delete " + resource); + const homeserver = localStorage.getItem("home_server"); + if (!homeserver || !(resource in resourceMap)) return Promise.reject(); + + const res = resourceMap[resource]; + const homeserver_url = "https://" + homeserver + res.path; + return jsonClient(`${homeserver_url}/${params.id}`, { + method: "DELETE", + }).then(({ json }) => ({ + data: json, + })); + }, + + deleteMany: (resource, params) => { + console.log("deleteMany " + resource); + const homeserver = localStorage.getItem("home_server"); + if (!homeserver || !(resource in resourceMap)) return Promise.reject(); + + const res = resourceMap[resource]; + const homeserver_url = "https://" + homeserver + res.path; + return Promise.all( + params.ids.map(id => jsonClient(`${homeserver_url}/${id}`), { + method: "DELETE", + body: JSON.stringify(params.data, filterNullValues), + }) + ).then(responses => ({ + data: responses.map(({ json }) => json), + })); + }, +}; + +export default dataProvider;