Implement room creation content
Fixes
MODIFY
clientapi/routing/createroom.go
clientapi/routing/createroom.go
package routing
import (
+ "encoding/json"
"fmt"
"net/http"
"strings"
@@ -97,6 +98,27 @@ func (r createRoomRequest) Validate() *util.JSONResponse {
}
}
+ // Validate creation_content fields defined in the spec by marshalling the
+ // creation_content map into bytes and then unmarshalling the bytes into
+ // common.CreateContent.
+
+ creationContentBytes, err := json.Marshal(r.CreationContent)
+ if err != nil {
+ return &util.JSONResponse{
+ Code: http.StatusBadRequest,
+ JSON: jsonerror.BadJSON("malformed creation_content"),
+ }
+ }
+
+ var CreationContent common.CreateContent
+ err = json.Unmarshal(creationContentBytes, &CreationContent)
+ if err != nil {
+ return &util.JSONResponse{
+ Code: http.StatusBadRequest,
+ JSON: jsonerror.BadJSON("malformed creation_content"),
+ }
+ }
+
return nil
}
@@ -154,7 +176,17 @@ func createRoom(
JSON: jsonerror.InvalidArgumentValue(err.Error()),
}
}
- // TODO: visibility/presets/raw initial state/creation content
+
+ // Clobber keys: creator, room_version
+
+ if r.CreationContent == nil {
+ r.CreationContent = make(map[string]interface{}, 2)
+ }
+
+ r.CreationContent["creator"] = userID
+ r.CreationContent["room_version"] = "1" // TODO: We set this to 1 before we support Room versioning
+
+ // TODO: visibility/presets/raw initial state
// TODO: Create room alias association
// Make sure this doesn't fall into an application service's namespace though!
@@ -214,7 +246,7 @@ func createRoom(
// harder to reason about, hence sticking to a strict static ordering.
// TODO: Synapse has txn/token ID on each event. Do we need to do this here?
eventsToMake := []fledglingEvent{
- {"m.room.create", "", common.CreateContent{Creator: userID}},
+ {"m.room.create", "", r.CreationContent},
{"m.room.member", userID, membershipContent},
{"m.room.power_levels", "", common.InitialPowerLevelsContent(userID)},
// TODO: m.room.canonical_alias

MODIFY
common/eventcontent.go
common/eventcontent.go
@@ -18,6 +18,14 @@ package common
type CreateContent struct {
Creator string `json:"creator"`
Federate *bool `json:"m.federate,omitempty"`
+ RoomVersion string `json:"room_version,omitempty"`
+ Predecessor PreviousRoom `json:"predecessor,omitempty"`
+}
+
+// PreviousRoom is the "Previous Room" structure defined at https://matrix.org/docs/spec/client_server/r0.5.0#m-room-create
+type PreviousRoom struct {
+ RoomID string `json:"room_id"`
+ EventID string `json:"event_id"`
}
// MemberContent is the event content for http://matrix.org/docs/spec/client_server/r0.2.0.html#m-room-member

MODIFY
testfile
testfile
@@ -151,3 +151,6 @@ Inbound federation of state requires event_id as a mandatory paramater
Inbound federation of state_ids requires event_id as a mandatory paramater
POST /register returns the same device_id as that in the request
POST /login returns the same device_id as that in the request
+POST /createRoom with creation content
+User can create and send/receive messages in a room with version 1
+POST /createRoom ignores attempts to set the room version via creation_content

Implement room creation content (#754)

Fixes #660.

Signed-off-by: Alex Chen minecnly@gmail.com