aboutsummaryrefslogtreecommitdiff
path: root/userapi
diff options
context:
space:
mode:
authorKegsay <kegan@matrix.org>2020-06-16 17:05:38 +0100
committerGitHub <noreply@github.com>2020-06-16 17:05:38 +0100
commit83391da0e04dda7a52589ee7ec6df2b615571894 (patch)
tree0a0ffcc5b7209600eaf042ee317a0681e0bd7f59 /userapi
parent1942928ee5e0398beed45c8b1c63d7b13e89b646 (diff)
Make syncapi use userapi (#1136)
* Make syncapi use userapi * Unbreak things * Fix tests * Lint
Diffstat (limited to 'userapi')
-rw-r--r--userapi/api/api.go23
-rw-r--r--userapi/internal/api.go33
-rw-r--r--userapi/inthttp/client.go9
-rw-r--r--userapi/inthttp/server.go13
4 files changed, 77 insertions, 1 deletions
diff --git a/userapi/api/api.go b/userapi/api/api.go
index 3ed9252c..1578268a 100644
--- a/userapi/api/api.go
+++ b/userapi/api/api.go
@@ -14,13 +14,18 @@
package api
-import "context"
+import (
+ "context"
+
+ "github.com/matrix-org/gomatrixserverlib"
+)
// UserInternalAPI is the internal API for information about users and devices.
type UserInternalAPI interface {
QueryProfile(ctx context.Context, req *QueryProfileRequest, res *QueryProfileResponse) error
QueryAccessToken(ctx context.Context, req *QueryAccessTokenRequest, res *QueryAccessTokenResponse) error
QueryDevices(ctx context.Context, req *QueryDevicesRequest, res *QueryDevicesResponse) error
+ QueryAccountData(ctx context.Context, req *QueryAccountDataRequest, res *QueryAccountDataResponse) error
}
// QueryAccessTokenRequest is the request for QueryAccessToken
@@ -37,6 +42,22 @@ type QueryAccessTokenResponse struct {
Err error // e.g ErrorForbidden
}
+// QueryAccountDataRequest is the request for QueryAccountData
+type QueryAccountDataRequest struct {
+ UserID string // required: the user to get account data for.
+ // TODO: This is a terribly confusing API shape :/
+ DataType string // optional: if specified returns only a single event matching this data type.
+ // optional: Only used if DataType is set. If blank returns global account data matching the data type.
+ // If set, returns only room account data matching this data type.
+ RoomID string
+}
+
+// QueryAccountDataResponse is the response for QueryAccountData
+type QueryAccountDataResponse struct {
+ GlobalAccountData []gomatrixserverlib.ClientEvent
+ RoomAccountData map[string][]gomatrixserverlib.ClientEvent
+}
+
// QueryDevicesRequest is the request for QueryDevices
type QueryDevicesRequest struct {
UserID string
diff --git a/userapi/internal/api.go b/userapi/internal/api.go
index d8dec11a..6e737b81 100644
--- a/userapi/internal/api.go
+++ b/userapi/internal/api.go
@@ -73,6 +73,39 @@ func (a *UserInternalAPI) QueryDevices(ctx context.Context, req *api.QueryDevice
return nil
}
+func (a *UserInternalAPI) QueryAccountData(ctx context.Context, req *api.QueryAccountDataRequest, res *api.QueryAccountDataResponse) error {
+ local, domain, err := gomatrixserverlib.SplitID('@', req.UserID)
+ if err != nil {
+ return err
+ }
+ if domain != a.ServerName {
+ return fmt.Errorf("cannot query account data of remote users: got %s want %s", domain, a.ServerName)
+ }
+ if req.DataType != "" {
+ var event *gomatrixserverlib.ClientEvent
+ event, err = a.AccountDB.GetAccountDataByType(ctx, local, req.RoomID, req.DataType)
+ if err != nil {
+ return err
+ }
+ if event != nil {
+ if req.RoomID != "" {
+ res.RoomAccountData = make(map[string][]gomatrixserverlib.ClientEvent)
+ res.RoomAccountData[req.RoomID] = []gomatrixserverlib.ClientEvent{*event}
+ } else {
+ res.GlobalAccountData = append(res.GlobalAccountData, *event)
+ }
+ }
+ return nil
+ }
+ global, rooms, err := a.AccountDB.GetAccountData(ctx, local)
+ if err != nil {
+ return err
+ }
+ res.RoomAccountData = rooms
+ res.GlobalAccountData = global
+ return nil
+}
+
func (a *UserInternalAPI) QueryAccessToken(ctx context.Context, req *api.QueryAccessTokenRequest, res *api.QueryAccessTokenResponse) error {
if req.AppServiceUserID != "" {
appServiceDevice, err := a.queryAppServiceToken(ctx, req.AccessToken, req.AppServiceUserID)
diff --git a/userapi/inthttp/client.go b/userapi/inthttp/client.go
index 638a7e9b..48e6d7d7 100644
--- a/userapi/inthttp/client.go
+++ b/userapi/inthttp/client.go
@@ -29,6 +29,7 @@ const (
QueryProfilePath = "/userapi/queryProfile"
QueryAccessTokenPath = "/userapi/queryAccessToken"
QueryDevicesPath = "/userapi/queryDevices"
+ QueryAccountDataPath = "/userapi/queryAccountData"
)
// NewUserAPIClient creates a UserInternalAPI implemented by talking to a HTTP POST API.
@@ -82,3 +83,11 @@ func (h *httpUserInternalAPI) QueryDevices(ctx context.Context, req *api.QueryDe
apiURL := h.apiURL + QueryDevicesPath
return httputil.PostJSON(ctx, span, h.httpClient, apiURL, req, res)
}
+
+func (h *httpUserInternalAPI) QueryAccountData(ctx context.Context, req *api.QueryAccountDataRequest, res *api.QueryAccountDataResponse) error {
+ span, ctx := opentracing.StartSpanFromContext(ctx, "QueryAccountData")
+ defer span.Finish()
+
+ apiURL := h.apiURL + QueryAccountDataPath
+ return httputil.PostJSON(ctx, span, h.httpClient, apiURL, req, res)
+}
diff --git a/userapi/inthttp/server.go b/userapi/inthttp/server.go
index 19b0e40b..8bf2efc0 100644
--- a/userapi/inthttp/server.go
+++ b/userapi/inthttp/server.go
@@ -64,4 +64,17 @@ func AddRoutes(internalAPIMux *mux.Router, s api.UserInternalAPI) {
return util.JSONResponse{Code: http.StatusOK, JSON: &response}
}),
)
+ internalAPIMux.Handle(QueryAccountDataPath,
+ httputil.MakeInternalAPI("queryAccountData", func(req *http.Request) util.JSONResponse {
+ request := api.QueryAccountDataRequest{}
+ response := api.QueryAccountDataResponse{}
+ if err := json.NewDecoder(req.Body).Decode(&request); err != nil {
+ return util.MessageResponse(http.StatusBadRequest, err.Error())
+ }
+ if err := s.QueryAccountData(req.Context(), &request, &response); err != nil {
+ return util.ErrorResponse(err)
+ }
+ return util.JSONResponse{Code: http.StatusOK, JSON: &response}
+ }),
+ )
}