Cleanup room creation
Change-Id: Ieb5189513d21606f8d0bea5692112350a68f2e14
This commit is contained in:
parent
d3cd2e9e33
commit
0823976edd
@ -44,7 +44,8 @@ const App = () => (
|
|||||||
name="rooms"
|
name="rooms"
|
||||||
list={RoomList}
|
list={RoomList}
|
||||||
create={RoomCreate}
|
create={RoomCreate}
|
||||||
icon={RoomIcon} />
|
icon={RoomIcon}
|
||||||
|
/>
|
||||||
<Resource name="connections" />
|
<Resource name="connections" />
|
||||||
</Admin>
|
</Admin>
|
||||||
);
|
);
|
||||||
|
@ -25,15 +25,12 @@ export const RoomList = props => (
|
|||||||
</List>
|
</List>
|
||||||
);
|
);
|
||||||
|
|
||||||
function generateRoomRecord() {
|
const validateDisplayName = fieldval =>
|
||||||
return {
|
fieldval === undefined
|
||||||
room_name: "",
|
? "synapseadmin.rooms.room_name_required"
|
||||||
public: true,
|
: fieldval.length === 0
|
||||||
alias: "",
|
? "synapseadmin.rooms.room_name_required"
|
||||||
}
|
: undefined;
|
||||||
}
|
|
||||||
|
|
||||||
const validateDisplayName = fieldval => fieldval === undefined ? "synapseadmin.rooms.room_name_required" : fieldval.length === 0 ? "synapseadmin.rooms.room_name_required" : undefined;
|
|
||||||
|
|
||||||
function approximateAliasLength(alias, homeserver) {
|
function approximateAliasLength(alias, homeserver) {
|
||||||
/* TODO maybe handle punycode in homeserver URL */
|
/* TODO maybe handle punycode in homeserver URL */
|
||||||
@ -47,8 +44,7 @@ function approximateAliasLength(alias, homeserver) {
|
|||||||
// heuristic.
|
// heuristic.
|
||||||
try {
|
try {
|
||||||
te = new TextEncoder();
|
te = new TextEncoder();
|
||||||
}
|
} catch (err) {
|
||||||
catch (err) {
|
|
||||||
if (err instanceof ReferenceError) {
|
if (err instanceof ReferenceError) {
|
||||||
te = undefined;
|
te = undefined;
|
||||||
}
|
}
|
||||||
@ -56,12 +52,7 @@ function approximateAliasLength(alias, homeserver) {
|
|||||||
|
|
||||||
const aliasLength = te === undefined ? alias.length : te.encode(alias).length;
|
const aliasLength = te === undefined ? alias.length : te.encode(alias).length;
|
||||||
|
|
||||||
return (
|
return "#".length + aliasLength + ":".length + homeserver.length;
|
||||||
"#".length +
|
|
||||||
aliasLength +
|
|
||||||
":".length +
|
|
||||||
homeserver.length
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const validateAlias = fieldval => {
|
const validateAlias = fieldval => {
|
||||||
@ -73,34 +64,47 @@ const validateAlias = fieldval => {
|
|||||||
if (approximateAliasLength(fieldval, homeserver) > 255) {
|
if (approximateAliasLength(fieldval, homeserver) > 255) {
|
||||||
return "synapseadmin.rooms.alias_too_long";
|
return "synapseadmin.rooms.alias_too_long";
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
const removeLeadingWhitespace = fieldVal => fieldVal === undefined ? undefined : fieldVal.trimStart();
|
const removeLeadingWhitespace = fieldVal =>
|
||||||
const replaceAllWhitespace = fieldVal => fieldVal === undefined ? undefined : fieldVal.replace(/\s/, "_");
|
fieldVal === undefined ? undefined : fieldVal.trimStart();
|
||||||
const removeLeadingSigil = fieldVal => fieldVal === undefined ? undefined : fieldVal.startsWith("#") ? fieldVal.substr(1) : fieldVal;
|
const replaceAllWhitespace = fieldVal =>
|
||||||
|
fieldVal === undefined ? undefined : fieldVal.replace(/\s/, "_");
|
||||||
|
const removeLeadingSigil = fieldVal =>
|
||||||
|
fieldVal === undefined
|
||||||
|
? undefined
|
||||||
|
: fieldVal.startsWith("#")
|
||||||
|
? fieldVal.substr(1)
|
||||||
|
: fieldVal;
|
||||||
|
|
||||||
const validateHasAliasIfPublic = formdata => {
|
const validateHasAliasIfPublic = formdata => {
|
||||||
let errors = {};
|
let errors = {};
|
||||||
if (formdata.public) {
|
if (formdata.public) {
|
||||||
if (formdata.alias === undefined || formdata.alias.trim().length === 0) {
|
if (
|
||||||
errors.alias = "synapseadmin.rooms.alias_required_if_public"
|
formdata.canonical_alias === undefined ||
|
||||||
|
formdata.canonical_alias.trim().length === 0
|
||||||
|
) {
|
||||||
|
errors.canonical_alias = "synapseadmin.rooms.alias_required_if_public";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return errors;
|
return errors;
|
||||||
}
|
};
|
||||||
|
|
||||||
export const RoomCreate = props => (
|
export const RoomCreate = props => (
|
||||||
<Create record={generateRoomRecord()} {...props}>
|
<Create {...props}>
|
||||||
<SimpleForm validate={validateHasAliasIfPublic}>
|
<SimpleForm validate={validateHasAliasIfPublic}>
|
||||||
<TextInput source="room_name"
|
<TextInput
|
||||||
parse={removeLeadingWhitespace}
|
source="name"
|
||||||
validate={validateDisplayName}/>
|
parse={removeLeadingWhitespace}
|
||||||
<TextInput source="alias"
|
validate={validateDisplayName}
|
||||||
parse={fv => replaceAllWhitespace(removeLeadingSigil(fv)) }
|
/>
|
||||||
format={fv => fv === "" ? "" : "#" + fv}
|
<TextInput
|
||||||
validate={validateAlias}/>
|
source="canonical_alias"
|
||||||
<BooleanInput source="public"
|
parse={fv => replaceAllWhitespace(removeLeadingSigil(fv))}
|
||||||
label="synapseadmin.rooms.make_public"/>
|
validate={validateAlias}
|
||||||
|
placeholder="#"
|
||||||
|
/>
|
||||||
|
<BooleanInput source="public" label="synapseadmin.rooms.make_public" />
|
||||||
</SimpleForm>
|
</SimpleForm>
|
||||||
</Create>
|
</Create>
|
||||||
);
|
);
|
||||||
|
@ -19,15 +19,12 @@ export default {
|
|||||||
rooms: {
|
rooms: {
|
||||||
room_name: "Raumname",
|
room_name: "Raumname",
|
||||||
make_public: "Öffentlicher Raum",
|
make_public: "Öffentlicher Raum",
|
||||||
room_name_required:
|
room_name_required: "Muss angegeben werden",
|
||||||
"Muss angegeben werden",
|
alias_required_if_public: "Muss für öffentliche Räume angegeben werden.",
|
||||||
alias_required_if_public:
|
alias: "Alias",
|
||||||
"Muss für öffentliche Räume angegeben werden.",
|
|
||||||
alias:
|
|
||||||
"Alias",
|
|
||||||
alias_too_long:
|
alias_too_long:
|
||||||
"Darf zusammen mit der Domain des Homeservers 255 bytes nicht überschreiten"
|
"Darf zusammen mit der Domain des Homeservers 255 bytes nicht überschreiten",
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
resources: {
|
resources: {
|
||||||
users: {
|
users: {
|
||||||
|
@ -19,15 +19,12 @@ export default {
|
|||||||
rooms: {
|
rooms: {
|
||||||
room_name: "Room Name",
|
room_name: "Room Name",
|
||||||
make_public: "Make room public",
|
make_public: "Make room public",
|
||||||
room_name_required:
|
room_name_required: "Must be provided",
|
||||||
"Must be provided",
|
alias_required_if_public: "Must be provided for a public room",
|
||||||
alias_required_if_public:
|
alias: "Alias",
|
||||||
"Must be provided for a public room",
|
|
||||||
alias:
|
|
||||||
"Alias",
|
|
||||||
alias_too_long:
|
alias_too_long:
|
||||||
"Must not exceed 255 bytes including the domain of the homeserver."
|
"Must not exceed 255 bytes including the domain of the homeserver.",
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
resources: {
|
resources: {
|
||||||
users: {
|
users: {
|
||||||
|
@ -45,9 +45,17 @@ const resourceMap = {
|
|||||||
members: r.joined_members,
|
members: r.joined_members,
|
||||||
}),
|
}),
|
||||||
data: "rooms",
|
data: "rooms",
|
||||||
total: json => {
|
total: json => json.total_rooms,
|
||||||
return json.total_rooms;
|
create: params => ({
|
||||||
},
|
method: "POST",
|
||||||
|
endpoint: "/_matrix/client/r0/createRoom",
|
||||||
|
body: {
|
||||||
|
name: params.data.name,
|
||||||
|
room_alias_name: params.data.canonical_alias,
|
||||||
|
visibility: params.data.public ? "public" : "private",
|
||||||
|
},
|
||||||
|
map: r => ({ id: r.room_id }),
|
||||||
|
}),
|
||||||
},
|
},
|
||||||
connections: {
|
connections: {
|
||||||
path: "/_synapse/admin/v1/whois",
|
path: "/_synapse/admin/v1/whois",
|
||||||
@ -67,38 +75,6 @@ function filterNullValues(key, value) {
|
|||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
const roomCreationMap = {
|
|
||||||
path: "/_matrix/client/r0/createRoom",
|
|
||||||
map: r => ({
|
|
||||||
room_id: r.room_id
|
|
||||||
})
|
|
||||||
};
|
|
||||||
|
|
||||||
const roomCreationProvider = {
|
|
||||||
create: (resource, params) => {
|
|
||||||
const homeserver = localStorage.getItem("home_server_url");
|
|
||||||
|
|
||||||
const homeserver_url = "https://" + homeserver + roomCreationMap.path;
|
|
||||||
|
|
||||||
const newParams = { ...params.data,
|
|
||||||
public: undefined,
|
|
||||||
room_name: undefined,
|
|
||||||
alias: undefined,
|
|
||||||
|
|
||||||
name: params.data.room_name,
|
|
||||||
room_alias_name: params.data.alias,
|
|
||||||
visibility: params.data.public ? "public" : "private",
|
|
||||||
}
|
|
||||||
|
|
||||||
return jsonClient(homeserver_url, {
|
|
||||||
method: "POST",
|
|
||||||
body: JSON.stringify(newParams, filterNullValues),
|
|
||||||
}).then(({ json }) => ({
|
|
||||||
data: roomCreationMap.map(json),
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const dataProvider = {
|
const dataProvider = {
|
||||||
getList: (resource, params) => {
|
getList: (resource, params) => {
|
||||||
console.log("getList " + resource);
|
console.log("getList " + resource);
|
||||||
@ -242,23 +218,24 @@ const dataProvider = {
|
|||||||
|
|
||||||
const res = resourceMap[resource];
|
const res = resourceMap[resource];
|
||||||
|
|
||||||
const homeserver_url = homeserver + res.path;
|
if ("create" in res) {
|
||||||
|
const create = res["create"](params);
|
||||||
/* Special handling for rooms, as creating a room
|
const homeserver_url = homeserver + create.endpoint;
|
||||||
is a POST request rather than put, and goes through
|
return jsonClient(homeserver_url, {
|
||||||
the client-server API rather than the admin API. */
|
method: create.method,
|
||||||
if (resource === "rooms") {
|
body: JSON.stringify(create.body, filterNullValues),
|
||||||
console.log("want to create a room!");
|
}).then(({ json }) => ({
|
||||||
console.log(params);
|
data: create.map(json),
|
||||||
return roomCreationProvider.create(resource, params);
|
}));
|
||||||
|
} else {
|
||||||
|
const homeserver_url = homeserver + res.path;
|
||||||
|
return jsonClient(`${homeserver_url}/${params.data.id}`, {
|
||||||
|
method: "PUT",
|
||||||
|
body: JSON.stringify(params.data, filterNullValues),
|
||||||
|
}).then(({ json }) => ({
|
||||||
|
data: res.map(json),
|
||||||
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
return jsonClient(`${homeserver_url}/${params.data.id}`, {
|
|
||||||
method: "PUT",
|
|
||||||
body: JSON.stringify(params.data, filterNullValues),
|
|
||||||
}).then(({ json }) => ({
|
|
||||||
data: res.map(json),
|
|
||||||
}));
|
|
||||||
},
|
},
|
||||||
|
|
||||||
delete: (resource, params) => {
|
delete: (resource, params) => {
|
||||||
|
Loading…
Reference in New Issue
Block a user