From 4e4dc8a9c234152040ff84944feaa420ff0fbb6b Mon Sep 17 00:00:00 2001 From: Brendan Abolivier Date: Wed, 9 Aug 2017 13:57:42 +0100 Subject: [PATCH] Implement the client API routes --- .../dendrite/clientapi/routing/routing.go | 15 ++---- .../clientapi/writers/room_directory.go | 46 +++++++++++++++++-- .../cmd/dendrite-client-api-server/main.go | 5 +- .../cmd/dendrite-monolith-server/main.go | 16 +++++-- 4 files changed, 60 insertions(+), 22 deletions(-) diff --git a/src/github.com/matrix-org/dendrite/clientapi/routing/routing.go b/src/github.com/matrix-org/dendrite/clientapi/routing/routing.go index 0cd9e8595..410c9f7db 100644 --- a/src/github.com/matrix-org/dendrite/clientapi/routing/routing.go +++ b/src/github.com/matrix-org/dendrite/clientapi/routing/routing.go @@ -41,7 +41,7 @@ const pathPrefixUnstable = "/_matrix/client/unstable" func Setup( apiMux *mux.Router, httpClient *http.Client, cfg config.Dendrite, producer *producers.RoomserverProducer, queryAPI api.RoomserverQueryAPI, - aliasAPI api.RoomserverAliasAPI, + aliasAPI api.RoomserverAliasAPI, publicRoomAPI api.RoomserverPublicRoomAPI, accountDB *accounts.Database, deviceDB *devices.Database, federation *gomatrixserverlib.FederationClient, @@ -136,14 +136,14 @@ func Setup( r0mux.Handle("/directory/list/room/{roomID}", common.MakeAPI("directory_list", func(req *http.Request) util.JSONResponse { vars := mux.Vars(req) - return writers.GetVisibility(req, vars["roomID"]) + return writers.GetVisibility(req, vars["roomID"], publicRoomAPI) }), ).Methods("GET") r0mux.Handle("/directory/list/room/{roomID}", common.MakeAuthAPI("directory_list", deviceDB, func(req *http.Request, device *authtypes.Device) util.JSONResponse { vars := mux.Vars(req) - return writers.SetVisibility(req, *device, vars["roomID"], cfg) + return writers.SetVisibility(req, *device, vars["roomID"], publicRoomAPI) }), ).Methods("PUT", "OPTIONS") @@ -276,14 +276,7 @@ func Setup( r0mux.Handle("/publicRooms", common.MakeAPI("public_rooms", func(req *http.Request) util.JSONResponse { // TODO: Return a list of public rooms - return util.JSONResponse{ - Code: 200, - JSON: struct { - Chunk []struct{} `json:"chunk"` - Start string `json:"start"` - End string `json:"end"` - }{[]struct{}{}, "", ""}, - } + return writers.GetPublicRooms(req, publicRoomAPI) }), ) diff --git a/src/github.com/matrix-org/dendrite/clientapi/writers/room_directory.go b/src/github.com/matrix-org/dendrite/clientapi/writers/room_directory.go index a4c175719..49a73750c 100644 --- a/src/github.com/matrix-org/dendrite/clientapi/writers/room_directory.go +++ b/src/github.com/matrix-org/dendrite/clientapi/writers/room_directory.go @@ -18,7 +18,8 @@ import ( "net/http" "github.com/matrix-org/dendrite/clientapi/auth/authtypes" - "github.com/matrix-org/dendrite/common/config" + "github.com/matrix-org/dendrite/clientapi/httputil" + "github.com/matrix-org/dendrite/roomserver/api" "github.com/matrix-org/util" ) @@ -28,21 +29,58 @@ type roomDirectoryVisibility struct { // GetVisibility implements GET /directory/list/room/{roomID} func GetVisibility( - req *http.Request, roomID string, + req *http.Request, roomID string, publicRoomAPI api.RoomserverPublicRoomAPI, ) util.JSONResponse { + queryReq := api.GetRoomVisibilityRequest{roomID} + var queryRes api.GetRoomVisibilityResponse + if err := publicRoomAPI.GetRoomVisibility(&queryReq, &queryRes); err != nil { + return httputil.LogThenError(req, err) + } + return util.JSONResponse{ Code: 200, - JSON: roomDirectoryVisibility{"public"}, + JSON: roomDirectoryVisibility{queryRes.Visibility}, } } // SetVisibility implements PUT /directory/list/room/{roomID} +// TODO: Check if user has the power leven to edit the room visibility func SetVisibility( req *http.Request, device authtypes.Device, roomID string, - cfg config.Dendrite, + publicRoomAPI api.RoomserverPublicRoomAPI, ) util.JSONResponse { + var r roomDirectoryVisibility + if resErr := httputil.UnmarshalJSONRequest(req, &r); resErr != nil { + return *resErr + } + + queryReq := api.SetRoomVisibilityRequest{ + RoomID: roomID, + Visibility: r.Visibility, + } + var queryRes api.SetRoomVisibilityResponse + if err := publicRoomAPI.SetRoomVisibility(&queryReq, &queryRes); err != nil { + return httputil.LogThenError(req, err) + } + return util.JSONResponse{ Code: 200, JSON: struct{}{}, } } + +// GetPublicRooms implements GET /publicRooms +func GetPublicRooms( + req *http.Request, publicRoomAPI api.RoomserverPublicRoomAPI, +) util.JSONResponse { + queryReq := api.GetPublicRoomsRequest{} + var queryRes api.GetPublicRoomsResponse + if err := publicRoomAPI.GetPublicRooms(&queryReq, &queryRes); err != nil { + return httputil.LogThenError(req, err) + } + + return util.JSONResponse{ + Code: 200, + JSON: queryRes, + } +} diff --git a/src/github.com/matrix-org/dendrite/cmd/dendrite-client-api-server/main.go b/src/github.com/matrix-org/dendrite/cmd/dendrite-client-api-server/main.go index 5d195bee8..beddb2978 100644 --- a/src/github.com/matrix-org/dendrite/cmd/dendrite-client-api-server/main.go +++ b/src/github.com/matrix-org/dendrite/cmd/dendrite-client-api-server/main.go @@ -54,6 +54,7 @@ func main() { queryAPI := api.NewRoomserverQueryAPIHTTP(cfg.RoomServerURL(), nil) aliasAPI := api.NewRoomserverAliasAPIHTTP(cfg.RoomServerURL(), nil) + publicRoomAPI := api.NewRoomserverPublicRoomAPIHTTP(cfg.RoomServerURL(), nil) inputAPI := api.NewRoomserverInputAPIHTTP(cfg.RoomServerURL(), nil) roomserverProducer := producers.NewRoomserverProducer(inputAPI) @@ -108,8 +109,8 @@ func main() { api := mux.NewRouter() routing.Setup( api, http.DefaultClient, *cfg, roomserverProducer, - queryAPI, aliasAPI, accountDB, deviceDB, federation, keyRing, - userUpdateProducer, syncProducer, + queryAPI, aliasAPI, publicRoomAPI, accountDB, deviceDB, federation, + keyRing, userUpdateProducer, syncProducer, ) common.SetupHTTPAPI(http.DefaultServeMux, api) diff --git a/src/github.com/matrix-org/dendrite/cmd/dendrite-monolith-server/main.go b/src/github.com/matrix-org/dendrite/cmd/dendrite-monolith-server/main.go index f0046d7b1..66c77933c 100644 --- a/src/github.com/matrix-org/dendrite/cmd/dendrite-monolith-server/main.go +++ b/src/github.com/matrix-org/dendrite/cmd/dendrite-monolith-server/main.go @@ -33,6 +33,7 @@ import ( roomserver_alias "github.com/matrix-org/dendrite/roomserver/alias" roomserver_input "github.com/matrix-org/dendrite/roomserver/input" + roomserver_publicroom "github.com/matrix-org/dendrite/roomserver/publicroom" roomserver_query "github.com/matrix-org/dendrite/roomserver/query" roomserver_storage "github.com/matrix-org/dendrite/roomserver/storage" @@ -121,9 +122,10 @@ type monolith struct { federation *gomatrixserverlib.FederationClient keyRing gomatrixserverlib.KeyRing - inputAPI *roomserver_input.RoomserverInputAPI - queryAPI *roomserver_query.RoomserverQueryAPI - aliasAPI *roomserver_alias.RoomserverAliasAPI + inputAPI *roomserver_input.RoomserverInputAPI + queryAPI *roomserver_query.RoomserverQueryAPI + aliasAPI *roomserver_alias.RoomserverAliasAPI + publicRoomAPI *roomserver_publicroom.RoomserverPublicRoomAPI roomServerProducer *producers.RoomserverProducer userUpdateProducer *producers.UserUpdateProducer @@ -204,6 +206,10 @@ func (m *monolith) setupRoomServer() { InputAPI: m.inputAPI, QueryAPI: m.queryAPI, } + + m.publicRoomAPI = &roomserver_publicroom.RoomserverPublicRoomAPI{ + DB: m.roomServerDB, + } } func (m *monolith) setupProducers() { @@ -280,8 +286,8 @@ func (m *monolith) setupConsumers() { func (m *monolith) setupAPIs() { clientapi_routing.Setup( m.api, http.DefaultClient, *m.cfg, m.roomServerProducer, - m.queryAPI, m.aliasAPI, m.accountDB, m.deviceDB, m.federation, m.keyRing, - m.userUpdateProducer, m.syncProducer, + m.queryAPI, m.aliasAPI, m.publicRoomAPI, m.accountDB, m.deviceDB, + m.federation, m.keyRing, m.userUpdateProducer, m.syncProducer, ) mediaapi_routing.Setup(