From e7ddcb13b9212f21ed928d7babfd13338fb1f74b Mon Sep 17 00:00:00 2001 From: Brendan Abolivier Date: Tue, 15 Aug 2017 18:17:45 +0100 Subject: [PATCH] Add HTTP methods for visibility update and retrieval --- .../publicroomsapi/directory/directory.go | 73 +++++++++++++++++++ .../publicroomsapi/routing/routing.go | 44 +++++++++++ 2 files changed, 117 insertions(+) create mode 100644 src/github.com/matrix-org/dendrite/publicroomsapi/directory/directory.go create mode 100644 src/github.com/matrix-org/dendrite/publicroomsapi/routing/routing.go diff --git a/src/github.com/matrix-org/dendrite/publicroomsapi/directory/directory.go b/src/github.com/matrix-org/dendrite/publicroomsapi/directory/directory.go new file mode 100644 index 000000000..04942da51 --- /dev/null +++ b/src/github.com/matrix-org/dendrite/publicroomsapi/directory/directory.go @@ -0,0 +1,73 @@ +// Copyright 2017 Vector Creations Ltd +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package directory + +import ( + "net/http" + + "github.com/matrix-org/dendrite/clientapi/httputil" + "github.com/matrix-org/dendrite/publicroomsapi/storage" + + "github.com/matrix-org/util" +) + +type roomVisibility struct { + Visibility string `json:"visibility"` +} + +// GetVisibility implements GET /directory/list/room/{roomID} +func GetVisibility( + req *http.Request, publicRoomsDatabase storage.PublicRoomsServerDatabase, + roomID string, +) util.JSONResponse { + isPublic, err := publicRoomsDatabase.GetRoomVisibility(roomID) + if err != nil { + return httputil.LogThenError(req, err) + } + + var v roomVisibility + if isPublic { + v.Visibility = "public" + } else { + v.Visibility = "private" + } + + return util.JSONResponse{ + Code: 200, + JSON: v, + } +} + +// SetVisibility implements PUT /directory/list/room/{roomID} +// TODO: Check if user has the power level to edit the room visibility +func SetVisibility( + req *http.Request, publicRoomsDatabase storage.PublicRoomsServerDatabase, + roomID string, +) util.JSONResponse { + var v roomVisibility + if reqErr := httputil.UnmarshalJSONRequest(req, &v); reqErr != nil { + return *reqErr + } + + isPublic := v.Visibility == "public" + if err := publicRoomsDatabase.SetRoomVisibility(isPublic, roomID); err != nil { + return httputil.LogThenError(req, err) + } + + return util.JSONResponse{ + Code: 200, + JSON: struct{}{}, + } +} diff --git a/src/github.com/matrix-org/dendrite/publicroomsapi/routing/routing.go b/src/github.com/matrix-org/dendrite/publicroomsapi/routing/routing.go new file mode 100644 index 000000000..936f5c51e --- /dev/null +++ b/src/github.com/matrix-org/dendrite/publicroomsapi/routing/routing.go @@ -0,0 +1,44 @@ +// Copyright 2017 Vector Creations Ltd +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package routing + +import ( + "net/http" + + "github.com/gorilla/mux" + "github.com/matrix-org/dendrite/common" + "github.com/matrix-org/dendrite/publicroomsapi/directory" + "github.com/matrix-org/dendrite/publicroomsapi/storage" + "github.com/matrix-org/util" +) + +const pathPrefixR0 = "/_matrix/client/r0" + +// Setup configures the given mux with publicroomsapi server listeners +func Setup(apiMux *mux.Router, publicRoomsDB storage.PublicRoomsServerDatabase) { + r0mux := apiMux.PathPrefix(pathPrefixR0).Subrouter() + r0mux.Handle("/directory/list/room/{roomID}", + common.MakeAPI("directory_list", func(req *http.Request) util.JSONResponse { + vars := mux.Vars(req) + return directory.GetVisibility(req, publicRoomsDB, vars["roomID"]) + }), + ).Methods("GET") + r0mux.Handle("/directory/list/room/{roomID}", + common.MakeAPI("directory_list", func(req *http.Request) util.JSONResponse { + vars := mux.Vars(req) + return directory.SetVisibility(req, publicRoomsDB, vars["roomID"]) + }), + ).Methods("PUT", "OPTIONS") +}