2020-02-07 15:10:43 +00: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,
|
2020-06-16 07:24:49 +00:00
|
|
|
// need timestamp in milliseconds
|
2020-06-16 08:05:38 +00:00
|
|
|
creation_ts_ms: u.creation_ts * 1000,
|
2020-02-07 15:10:43 +00:00
|
|
|
}),
|
|
|
|
data: "users",
|
2020-03-24 15:53:09 +00:00
|
|
|
total: (json, from, perPage) => {
|
2020-03-27 20:22:16 +00:00
|
|
|
return json.next_token
|
|
|
|
? parseInt(json.next_token, 10) + perPage
|
|
|
|
: from + json.users.length;
|
2020-02-07 15:10:43 +00:00
|
|
|
},
|
2020-04-23 08:44:52 +00:00
|
|
|
create: data => ({
|
|
|
|
endpoint: `/_synapse/admin/v2/users/${data.id}`,
|
|
|
|
body: data,
|
|
|
|
method: "PUT",
|
|
|
|
}),
|
2020-04-09 08:32:06 +00:00
|
|
|
delete: id => ({
|
|
|
|
endpoint: `/_synapse/admin/v1/deactivate/${id}`,
|
|
|
|
body: { erase: true },
|
|
|
|
method: "POST",
|
|
|
|
}),
|
2020-02-07 15:10:43 +00:00
|
|
|
},
|
|
|
|
rooms: {
|
|
|
|
path: "/_synapse/admin/v1/rooms",
|
|
|
|
map: r => ({
|
|
|
|
...r,
|
|
|
|
id: r.room_id,
|
|
|
|
alias: r.canonical_alias,
|
|
|
|
members: r.joined_members,
|
2020-05-23 15:43:33 +00:00
|
|
|
is_encrypted: !!r.encryption,
|
|
|
|
federatable: !!r.federatable,
|
|
|
|
public: !!r.public,
|
2020-02-07 15:10:43 +00:00
|
|
|
}),
|
|
|
|
data: "rooms",
|
|
|
|
total: json => {
|
|
|
|
return json.total_rooms;
|
|
|
|
},
|
|
|
|
},
|
2020-03-28 20:25:34 +00:00
|
|
|
connections: {
|
|
|
|
path: "/_synapse/admin/v1/whois",
|
|
|
|
map: c => ({
|
|
|
|
...c,
|
|
|
|
id: c.user_id,
|
|
|
|
}),
|
|
|
|
data: "connections",
|
|
|
|
},
|
2020-04-23 08:00:46 +00:00
|
|
|
servernotices: {
|
|
|
|
map: n => ({ id: n.event_id }),
|
|
|
|
create: data => ({
|
|
|
|
endpoint: "/_synapse/admin/v1/send_server_notice",
|
|
|
|
body: {
|
|
|
|
user_id: data.id,
|
|
|
|
content: {
|
|
|
|
msgtype: "m.text",
|
|
|
|
body: data.body,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
method: "POST",
|
|
|
|
}),
|
|
|
|
},
|
2020-02-07 15:10:43 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
function filterNullValues(key, value) {
|
|
|
|
// Filtering out null properties
|
|
|
|
if (value === null) {
|
|
|
|
return undefined;
|
|
|
|
}
|
|
|
|
return value;
|
|
|
|
}
|
|
|
|
|
2020-05-23 15:43:33 +00:00
|
|
|
function getSearchOrder(order) {
|
|
|
|
if (order === "DESC") {
|
|
|
|
return "b";
|
|
|
|
} else {
|
|
|
|
return "f";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-02-07 15:10:43 +00:00
|
|
|
const dataProvider = {
|
|
|
|
getList: (resource, params) => {
|
|
|
|
console.log("getList " + resource);
|
2020-03-24 15:53:09 +00:00
|
|
|
const { user_id, guests, deactivated } = params.filter;
|
2020-02-07 15:10:43 +00:00
|
|
|
const { page, perPage } = params.pagination;
|
2020-05-23 15:43:33 +00:00
|
|
|
const { field, order } = params.sort;
|
2020-03-24 15:53:09 +00:00
|
|
|
const from = (page - 1) * perPage;
|
2020-02-07 15:10:43 +00:00
|
|
|
const query = {
|
2020-03-24 15:53:09 +00:00
|
|
|
from: from,
|
2020-02-07 15:10:43 +00:00
|
|
|
limit: perPage,
|
|
|
|
user_id: user_id,
|
|
|
|
guests: guests,
|
2020-03-24 15:53:09 +00:00
|
|
|
deactivated: deactivated,
|
2020-05-23 15:43:33 +00:00
|
|
|
order_by: field,
|
|
|
|
dir: getSearchOrder(order),
|
2020-02-07 15:10:43 +00:00
|
|
|
};
|
2020-03-04 22:21:36 +00:00
|
|
|
const homeserver = localStorage.getItem("base_url");
|
2020-02-07 15:10:43 +00:00
|
|
|
if (!homeserver || !(resource in resourceMap)) return Promise.reject();
|
|
|
|
|
|
|
|
const res = resourceMap[resource];
|
2020-03-04 22:21:36 +00:00
|
|
|
|
2020-04-23 08:25:59 +00:00
|
|
|
const endpoint_url = homeserver + res.path;
|
|
|
|
const url = `${endpoint_url}?${stringify(query)}`;
|
2020-02-07 15:10:43 +00:00
|
|
|
|
|
|
|
return jsonClient(url).then(({ json }) => ({
|
|
|
|
data: json[res.data].map(res.map),
|
2020-03-24 15:53:09 +00:00
|
|
|
total: res.total(json, from, perPage),
|
2020-02-07 15:10:43 +00:00
|
|
|
}));
|
|
|
|
},
|
|
|
|
|
|
|
|
getOne: (resource, params) => {
|
|
|
|
console.log("getOne " + resource);
|
2020-03-04 22:21:36 +00:00
|
|
|
const homeserver = localStorage.getItem("base_url");
|
2020-02-07 15:10:43 +00:00
|
|
|
if (!homeserver || !(resource in resourceMap)) return Promise.reject();
|
|
|
|
|
|
|
|
const res = resourceMap[resource];
|
2020-03-04 22:21:36 +00:00
|
|
|
|
2020-04-23 08:25:59 +00:00
|
|
|
const endpoint_url = homeserver + res.path;
|
|
|
|
return jsonClient(`${endpoint_url}/${params.id}`).then(({ json }) => ({
|
2020-02-07 15:10:43 +00:00
|
|
|
data: res.map(json),
|
|
|
|
}));
|
|
|
|
},
|
|
|
|
|
|
|
|
getMany: (resource, params) => {
|
|
|
|
console.log("getMany " + resource);
|
2020-03-04 22:21:36 +00:00
|
|
|
const homeserver = localStorage.getItem("base_url");
|
2020-02-07 15:10:43 +00:00
|
|
|
if (!homeserver || !(resource in resourceMap)) return Promise.reject();
|
|
|
|
|
|
|
|
const res = resourceMap[resource];
|
2020-03-04 22:21:36 +00:00
|
|
|
|
2020-04-23 08:25:59 +00:00
|
|
|
const endpoint_url = homeserver + res.path;
|
2020-02-07 15:10:43 +00:00
|
|
|
return Promise.all(
|
2020-04-23 08:25:59 +00:00
|
|
|
params.ids.map(id => jsonClient(`${endpoint_url}/${id}`))
|
2020-02-07 15:10:43 +00:00
|
|
|
).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,
|
|
|
|
}),
|
|
|
|
};
|
|
|
|
|
2020-03-04 22:21:36 +00:00
|
|
|
const homeserver = localStorage.getItem("base_url");
|
2020-02-07 15:10:43 +00:00
|
|
|
if (!homeserver || !(resource in resourceMap)) return Promise.reject();
|
|
|
|
|
|
|
|
const res = resourceMap[resource];
|
2020-03-04 22:21:36 +00:00
|
|
|
|
2020-04-23 08:25:59 +00:00
|
|
|
const endpoint_url = homeserver + res.path;
|
|
|
|
const url = `${endpoint_url}?${stringify(query)}`;
|
2020-02-07 15:10:43 +00:00
|
|
|
|
|
|
|
return jsonClient(url).then(({ headers, json }) => ({
|
|
|
|
data: json,
|
2020-04-06 09:42:49 +00:00
|
|
|
total: parseInt(headers.get("content-range").split("/").pop(), 10),
|
2020-02-07 15:10:43 +00:00
|
|
|
}));
|
|
|
|
},
|
|
|
|
|
|
|
|
update: (resource, params) => {
|
|
|
|
console.log("update " + resource);
|
2020-03-04 22:21:36 +00:00
|
|
|
const homeserver = localStorage.getItem("base_url");
|
2020-02-07 15:10:43 +00:00
|
|
|
if (!homeserver || !(resource in resourceMap)) return Promise.reject();
|
|
|
|
|
|
|
|
const res = resourceMap[resource];
|
2020-03-04 22:21:36 +00:00
|
|
|
|
2020-04-23 08:25:59 +00:00
|
|
|
const endpoint_url = homeserver + res.path;
|
|
|
|
return jsonClient(`${endpoint_url}/${params.data.id}`, {
|
2020-02-07 15:10:43 +00:00
|
|
|
method: "PUT",
|
|
|
|
body: JSON.stringify(params.data, filterNullValues),
|
|
|
|
}).then(({ json }) => ({
|
2020-02-10 17:06:05 +00:00
|
|
|
data: res.map(json),
|
2020-02-07 15:10:43 +00:00
|
|
|
}));
|
|
|
|
},
|
|
|
|
|
|
|
|
updateMany: (resource, params) => {
|
|
|
|
console.log("updateMany " + resource);
|
2020-03-04 22:21:36 +00:00
|
|
|
const homeserver = localStorage.getItem("base_url");
|
2020-02-07 15:10:43 +00:00
|
|
|
if (!homeserver || !(resource in resourceMap)) return Promise.reject();
|
|
|
|
|
|
|
|
const res = resourceMap[resource];
|
2020-03-04 22:21:36 +00:00
|
|
|
|
2020-04-23 08:25:59 +00:00
|
|
|
const endpoint_url = homeserver + res.path;
|
2020-02-07 15:10:43 +00:00
|
|
|
return Promise.all(
|
2020-04-23 08:25:59 +00:00
|
|
|
params.ids.map(id => jsonClient(`${endpoint_url}/${id}`), {
|
2020-02-07 15:10:43 +00:00
|
|
|
method: "PUT",
|
|
|
|
body: JSON.stringify(params.data, filterNullValues),
|
|
|
|
})
|
|
|
|
).then(responses => ({
|
|
|
|
data: responses.map(({ json }) => json),
|
|
|
|
}));
|
|
|
|
},
|
|
|
|
|
|
|
|
create: (resource, params) => {
|
|
|
|
console.log("create " + resource);
|
2020-03-04 22:21:36 +00:00
|
|
|
const homeserver = localStorage.getItem("base_url");
|
2020-02-07 15:10:43 +00:00
|
|
|
if (!homeserver || !(resource in resourceMap)) return Promise.reject();
|
|
|
|
|
|
|
|
const res = resourceMap[resource];
|
2020-04-23 08:44:52 +00:00
|
|
|
if (!("create" in res)) return Promise.reject();
|
2020-03-04 22:21:36 +00:00
|
|
|
|
2020-04-23 08:44:52 +00:00
|
|
|
const create = res["create"](params.data);
|
|
|
|
const endpoint_url = homeserver + create.endpoint;
|
|
|
|
return jsonClient(endpoint_url, {
|
|
|
|
method: create.method,
|
|
|
|
body: JSON.stringify(create.body, filterNullValues),
|
2020-02-07 15:10:43 +00:00
|
|
|
}).then(({ json }) => ({
|
2020-02-10 17:06:05 +00:00
|
|
|
data: res.map(json),
|
2020-02-07 15:10:43 +00:00
|
|
|
}));
|
|
|
|
},
|
|
|
|
|
2020-05-06 07:03:33 +00:00
|
|
|
createMany: (resource, params) => {
|
|
|
|
console.log("createMany " + resource);
|
|
|
|
const homeserver = localStorage.getItem("base_url");
|
|
|
|
if (!homeserver || !(resource in resourceMap)) return Promise.reject();
|
|
|
|
|
|
|
|
const res = resourceMap[resource];
|
|
|
|
if (!("create" in res)) return Promise.reject();
|
|
|
|
|
|
|
|
return Promise.all(
|
|
|
|
params.ids.map(id => {
|
|
|
|
params.data.id = id;
|
|
|
|
const cre = res["create"](params.data);
|
|
|
|
const endpoint_url = homeserver + cre.endpoint;
|
|
|
|
return jsonClient(endpoint_url, {
|
|
|
|
method: cre.method,
|
|
|
|
body: JSON.stringify(cre.body, filterNullValues),
|
|
|
|
});
|
|
|
|
})
|
|
|
|
).then(responses => ({
|
|
|
|
data: responses.map(({ json }) => json),
|
|
|
|
}));
|
|
|
|
},
|
|
|
|
|
2020-02-07 15:10:43 +00:00
|
|
|
delete: (resource, params) => {
|
|
|
|
console.log("delete " + resource);
|
2020-03-04 22:21:36 +00:00
|
|
|
const homeserver = localStorage.getItem("base_url");
|
2020-02-07 15:10:43 +00:00
|
|
|
if (!homeserver || !(resource in resourceMap)) return Promise.reject();
|
|
|
|
|
|
|
|
const res = resourceMap[resource];
|
2020-03-04 22:21:36 +00:00
|
|
|
|
2020-04-09 08:32:06 +00:00
|
|
|
if ("delete" in res) {
|
|
|
|
const del = res["delete"](params.id);
|
2020-04-23 08:25:59 +00:00
|
|
|
const endpoint_url = homeserver + del.endpoint;
|
|
|
|
return jsonClient(endpoint_url, {
|
2020-04-09 08:32:06 +00:00
|
|
|
method: del.method,
|
|
|
|
body: JSON.stringify(del.body),
|
|
|
|
}).then(({ json }) => ({
|
|
|
|
data: json,
|
|
|
|
}));
|
|
|
|
} else {
|
2020-04-23 08:25:59 +00:00
|
|
|
const endpoint_url = homeserver + res.path;
|
|
|
|
return jsonClient(`${endpoint_url}/${params.id}`, {
|
2020-04-09 08:32:06 +00:00
|
|
|
method: "DELETE",
|
|
|
|
body: JSON.stringify(params.data, filterNullValues),
|
|
|
|
}).then(({ json }) => ({
|
|
|
|
data: json,
|
|
|
|
}));
|
|
|
|
}
|
2020-02-07 15:10:43 +00:00
|
|
|
},
|
|
|
|
|
|
|
|
deleteMany: (resource, params) => {
|
|
|
|
console.log("deleteMany " + resource);
|
2020-03-04 22:21:36 +00:00
|
|
|
const homeserver = localStorage.getItem("base_url");
|
2020-02-07 15:10:43 +00:00
|
|
|
if (!homeserver || !(resource in resourceMap)) return Promise.reject();
|
|
|
|
|
|
|
|
const res = resourceMap[resource];
|
2020-03-04 22:21:36 +00:00
|
|
|
|
2020-04-09 08:32:06 +00:00
|
|
|
if ("delete" in res) {
|
|
|
|
return Promise.all(
|
|
|
|
params.ids.map(id => {
|
|
|
|
const del = res["delete"](id);
|
2020-04-23 08:25:59 +00:00
|
|
|
const endpoint_url = homeserver + del.endpoint;
|
|
|
|
return jsonClient(endpoint_url, {
|
2020-04-09 08:32:06 +00:00
|
|
|
method: del.method,
|
|
|
|
body: JSON.stringify(del.body),
|
|
|
|
});
|
|
|
|
})
|
|
|
|
).then(responses => ({
|
|
|
|
data: responses.map(({ json }) => json),
|
|
|
|
}));
|
|
|
|
} else {
|
2020-04-23 08:25:59 +00:00
|
|
|
const endpoint_url = homeserver + res.path;
|
2020-04-09 08:32:06 +00:00
|
|
|
return Promise.all(
|
|
|
|
params.ids.map(id =>
|
2020-04-23 08:25:59 +00:00
|
|
|
jsonClient(`${endpoint_url}/${id}`, {
|
2020-04-09 08:32:06 +00:00
|
|
|
method: "DELETE",
|
|
|
|
body: JSON.stringify(params.data, filterNullValues),
|
|
|
|
})
|
|
|
|
)
|
|
|
|
).then(responses => ({
|
|
|
|
data: responses.map(({ json }) => json),
|
|
|
|
}));
|
|
|
|
}
|
2020-02-07 15:10:43 +00:00
|
|
|
},
|
|
|
|
};
|
|
|
|
|
|
|
|
export default dataProvider;
|