Add dataProvider for synapse

Change-Id: Id1bd6e840a1af8c647c316e29a39e988ac224dba
This commit is contained in:
Manuel Stahl 2020-02-07 16:10:43 +01:00
parent b920ecae86
commit a151a18b6e
3 changed files with 222 additions and 15 deletions

View file

@ -2,7 +2,7 @@ import React from "react";
import { Admin, Resource, resolveBrowserLocale } from "react-admin"; import { Admin, Resource, resolveBrowserLocale } from "react-admin";
import polyglotI18nProvider from "ra-i18n-polyglot"; import polyglotI18nProvider from "ra-i18n-polyglot";
import authProvider from "./synapse/authProvider"; import authProvider from "./synapse/authProvider";
import dataProvider from "./dataProvider"; import dataProvider from "./synapse/dataProvider";
import LoginPage from "./components/LoginPage"; import LoginPage from "./components/LoginPage";
import germanMessages from "./i18n/de"; import germanMessages from "./i18n/de";
import englishMessages from "./i18n/en"; import englishMessages from "./i18n/en";
@ -24,7 +24,7 @@ const App = () => (
dataProvider={dataProvider} dataProvider={dataProvider}
i18nProvider={i18nProvider} i18nProvider={i18nProvider}
> >
<Resource name="data" /> <Resource name="users" />
</Admin> </Admin>
); );

View file

@ -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;

220
src/synapse/dataProvider.js Normal file
View file

@ -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;