diff --git a/src/github.com/matrix-org/dendrite/federationapi/routing/backfill.go b/src/github.com/matrix-org/dendrite/federationapi/routing/backfill.go index 1b5f138a0..d996db6a3 100644 --- a/src/github.com/matrix-org/dendrite/federationapi/routing/backfill.go +++ b/src/github.com/matrix-org/dendrite/federationapi/routing/backfill.go @@ -1,3 +1,5 @@ +// Copyright 2018 New Vector 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 @@ -18,6 +20,8 @@ import ( "github.com/matrix-org/dendrite/clientapi/httputil" "github.com/matrix-org/dendrite/clientapi/jsonerror" + "github.com/matrix-org/dendrite/common/config" + "github.com/matrix-org/dendrite/federationapi/types" "github.com/matrix-org/dendrite/roomserver/api" "github.com/matrix-org/gomatrixserverlib" "github.com/matrix-org/util" @@ -30,6 +34,7 @@ func Backfill( request *gomatrixserverlib.FederationRequest, query api.RoomserverQueryAPI, roomID string, + cfg config.Dendrite, ) util.JSONResponse { var res api.QueryBackfillResponse var eIDs []string @@ -84,11 +89,14 @@ func Backfill( evs = append(evs, ev) } } - res.Events = evs + + txn := types.NewTransaction() + txn.Origin = cfg.Matrix.ServerName + txn.PDUs = evs // Send the events to the client. return util.JSONResponse{ Code: http.StatusOK, - JSON: res, + JSON: txn, } } diff --git a/src/github.com/matrix-org/dendrite/federationapi/routing/routing.go b/src/github.com/matrix-org/dendrite/federationapi/routing/routing.go index 24812f220..1ca4f6679 100644 --- a/src/github.com/matrix-org/dendrite/federationapi/routing/routing.go +++ b/src/github.com/matrix-org/dendrite/federationapi/routing/routing.go @@ -224,7 +224,7 @@ func Setup( "federation_backfill", cfg.Matrix.ServerName, keys, func(httpReq *http.Request, request *gomatrixserverlib.FederationRequest) util.JSONResponse { vars := mux.Vars(httpReq) - return Backfill(httpReq, request, query, vars["roomID"]) + return Backfill(httpReq, request, query, vars["roomID"], cfg) }, )).Methods(http.MethodGet) } diff --git a/src/github.com/matrix-org/dendrite/federationapi/types/types.go b/src/github.com/matrix-org/dendrite/federationapi/types/types.go new file mode 100644 index 000000000..24838d547 --- /dev/null +++ b/src/github.com/matrix-org/dendrite/federationapi/types/types.go @@ -0,0 +1,43 @@ +// Copyright 2018 New Vector 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 types + +import ( + "time" + + "github.com/matrix-org/gomatrixserverlib" +) + +// Transaction is the representation of a transaction from the federation API +// See https://matrix.org/docs/spec/server_server/unstable.html for more info. +type Transaction struct { + // The server_name of the homeserver sending this transaction. + Origin gomatrixserverlib.ServerName `json:"origin"` + // POSIX timestamp in milliseconds on originating homeserver when this + // transaction started. + OriginServerTS int64 `json:"origin_server_ts"` + // List of persistent updates to rooms. + PDUs []gomatrixserverlib.Event `json:"pdus"` +} + +// NewTransaction sets the timestamp of a new transaction instance and then +// returns the said instance. +func NewTransaction() Transaction { + // Retrieve the current timestamp in nanoseconds and make it a milliseconds + // one. + ts := time.Now().UnixNano() / int64(time.Millisecond) + + return Transaction{OriginServerTS: ts} +}