2020-02-07 18:10:43 +03:00
|
|
|
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;
|
2020-02-10 20:06:05 +03:00
|
|
|
return jsonClient(`${homeserver_url}/${params.data.id}`, {
|
2020-02-07 18:10:43 +03:00
|
|
|
method: "PUT",
|
|
|
|
body: JSON.stringify(params.data, filterNullValues),
|
|
|
|
}).then(({ json }) => ({
|
2020-02-10 20:06:05 +03:00
|
|
|
data: res.map(json),
|
2020-02-07 18:10:43 +03:00
|
|
|
}));
|
|
|
|
},
|
|
|
|
|
|
|
|
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;
|
2020-02-10 20:06:05 +03:00
|
|
|
return jsonClient(`${homeserver_url}/${params.data.id}`, {
|
2020-02-07 18:10:43 +03:00
|
|
|
method: "PUT",
|
|
|
|
body: JSON.stringify(params.data, filterNullValues),
|
|
|
|
}).then(({ json }) => ({
|
2020-02-10 20:06:05 +03:00
|
|
|
data: res.map(json),
|
2020-02-07 18:10:43 +03:00
|
|
|
}));
|
|
|
|
},
|
|
|
|
|
|
|
|
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;
|