mirror of
https://github.com/matrix-org/dendrite
synced 2024-11-14 17:07:29 +00:00
288 lines
11 KiB
Go
288 lines
11 KiB
Go
|
package internal
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
"net/http"
|
||
|
"sync"
|
||
|
|
||
|
"github.com/Shopify/sarama"
|
||
|
"github.com/matrix-org/dendrite/common"
|
||
|
"github.com/matrix-org/dendrite/common/caching"
|
||
|
"github.com/matrix-org/dendrite/common/config"
|
||
|
fsAPI "github.com/matrix-org/dendrite/federationsender/api"
|
||
|
"github.com/matrix-org/dendrite/roomserver/api"
|
||
|
"github.com/matrix-org/dendrite/roomserver/storage"
|
||
|
"github.com/matrix-org/gomatrixserverlib"
|
||
|
"github.com/matrix-org/util"
|
||
|
)
|
||
|
|
||
|
// RoomserverInternalAPI is an implementation of api.RoomserverInternalAPI
|
||
|
type RoomserverInternalAPI struct {
|
||
|
DB storage.Database
|
||
|
Cfg *config.Dendrite
|
||
|
Producer sarama.SyncProducer
|
||
|
ImmutableCache caching.ImmutableCache
|
||
|
ServerName gomatrixserverlib.ServerName
|
||
|
KeyRing gomatrixserverlib.JSONVerifier
|
||
|
FedClient *gomatrixserverlib.FederationClient
|
||
|
OutputRoomEventTopic string // Kafka topic for new output room events
|
||
|
mutex sync.Mutex // Protects calls to processRoomEvent
|
||
|
fsAPI fsAPI.FederationSenderInternalAPI
|
||
|
}
|
||
|
|
||
|
// SetupHTTP adds the RoomserverInternalAPI handlers to the http.ServeMux.
|
||
|
// nolint: gocyclo
|
||
|
func (r *RoomserverInternalAPI) SetupHTTP(servMux *http.ServeMux) {
|
||
|
servMux.Handle(api.RoomserverInputRoomEventsPath,
|
||
|
common.MakeInternalAPI("inputRoomEvents", func(req *http.Request) util.JSONResponse {
|
||
|
var request api.InputRoomEventsRequest
|
||
|
var response api.InputRoomEventsResponse
|
||
|
if err := json.NewDecoder(req.Body).Decode(&request); err != nil {
|
||
|
return util.MessageResponse(http.StatusBadRequest, err.Error())
|
||
|
}
|
||
|
if err := r.InputRoomEvents(req.Context(), &request, &response); err != nil {
|
||
|
return util.ErrorResponse(err)
|
||
|
}
|
||
|
return util.JSONResponse{Code: http.StatusOK, JSON: &response}
|
||
|
}),
|
||
|
)
|
||
|
servMux.Handle(
|
||
|
api.RoomserverQueryLatestEventsAndStatePath,
|
||
|
common.MakeInternalAPI("queryLatestEventsAndState", func(req *http.Request) util.JSONResponse {
|
||
|
var request api.QueryLatestEventsAndStateRequest
|
||
|
var response api.QueryLatestEventsAndStateResponse
|
||
|
if err := json.NewDecoder(req.Body).Decode(&request); err != nil {
|
||
|
return util.ErrorResponse(err)
|
||
|
}
|
||
|
if err := r.QueryLatestEventsAndState(req.Context(), &request, &response); err != nil {
|
||
|
return util.ErrorResponse(err)
|
||
|
}
|
||
|
return util.JSONResponse{Code: http.StatusOK, JSON: &response}
|
||
|
}),
|
||
|
)
|
||
|
servMux.Handle(
|
||
|
api.RoomserverQueryStateAfterEventsPath,
|
||
|
common.MakeInternalAPI("queryStateAfterEvents", func(req *http.Request) util.JSONResponse {
|
||
|
var request api.QueryStateAfterEventsRequest
|
||
|
var response api.QueryStateAfterEventsResponse
|
||
|
if err := json.NewDecoder(req.Body).Decode(&request); err != nil {
|
||
|
return util.ErrorResponse(err)
|
||
|
}
|
||
|
if err := r.QueryStateAfterEvents(req.Context(), &request, &response); err != nil {
|
||
|
return util.ErrorResponse(err)
|
||
|
}
|
||
|
return util.JSONResponse{Code: http.StatusOK, JSON: &response}
|
||
|
}),
|
||
|
)
|
||
|
servMux.Handle(
|
||
|
api.RoomserverQueryEventsByIDPath,
|
||
|
common.MakeInternalAPI("queryEventsByID", func(req *http.Request) util.JSONResponse {
|
||
|
var request api.QueryEventsByIDRequest
|
||
|
var response api.QueryEventsByIDResponse
|
||
|
if err := json.NewDecoder(req.Body).Decode(&request); err != nil {
|
||
|
return util.ErrorResponse(err)
|
||
|
}
|
||
|
if err := r.QueryEventsByID(req.Context(), &request, &response); err != nil {
|
||
|
return util.ErrorResponse(err)
|
||
|
}
|
||
|
return util.JSONResponse{Code: http.StatusOK, JSON: &response}
|
||
|
}),
|
||
|
)
|
||
|
servMux.Handle(
|
||
|
api.RoomserverQueryMembershipForUserPath,
|
||
|
common.MakeInternalAPI("QueryMembershipForUser", func(req *http.Request) util.JSONResponse {
|
||
|
var request api.QueryMembershipForUserRequest
|
||
|
var response api.QueryMembershipForUserResponse
|
||
|
if err := json.NewDecoder(req.Body).Decode(&request); err != nil {
|
||
|
return util.ErrorResponse(err)
|
||
|
}
|
||
|
if err := r.QueryMembershipForUser(req.Context(), &request, &response); err != nil {
|
||
|
return util.ErrorResponse(err)
|
||
|
}
|
||
|
return util.JSONResponse{Code: http.StatusOK, JSON: &response}
|
||
|
}),
|
||
|
)
|
||
|
servMux.Handle(
|
||
|
api.RoomserverQueryMembershipsForRoomPath,
|
||
|
common.MakeInternalAPI("queryMembershipsForRoom", func(req *http.Request) util.JSONResponse {
|
||
|
var request api.QueryMembershipsForRoomRequest
|
||
|
var response api.QueryMembershipsForRoomResponse
|
||
|
if err := json.NewDecoder(req.Body).Decode(&request); err != nil {
|
||
|
return util.ErrorResponse(err)
|
||
|
}
|
||
|
if err := r.QueryMembershipsForRoom(req.Context(), &request, &response); err != nil {
|
||
|
return util.ErrorResponse(err)
|
||
|
}
|
||
|
return util.JSONResponse{Code: http.StatusOK, JSON: &response}
|
||
|
}),
|
||
|
)
|
||
|
servMux.Handle(
|
||
|
api.RoomserverQueryInvitesForUserPath,
|
||
|
common.MakeInternalAPI("queryInvitesForUser", func(req *http.Request) util.JSONResponse {
|
||
|
var request api.QueryInvitesForUserRequest
|
||
|
var response api.QueryInvitesForUserResponse
|
||
|
if err := json.NewDecoder(req.Body).Decode(&request); err != nil {
|
||
|
return util.ErrorResponse(err)
|
||
|
}
|
||
|
if err := r.QueryInvitesForUser(req.Context(), &request, &response); err != nil {
|
||
|
return util.ErrorResponse(err)
|
||
|
}
|
||
|
return util.JSONResponse{Code: http.StatusOK, JSON: &response}
|
||
|
}),
|
||
|
)
|
||
|
servMux.Handle(
|
||
|
api.RoomserverQueryServerAllowedToSeeEventPath,
|
||
|
common.MakeInternalAPI("queryServerAllowedToSeeEvent", func(req *http.Request) util.JSONResponse {
|
||
|
var request api.QueryServerAllowedToSeeEventRequest
|
||
|
var response api.QueryServerAllowedToSeeEventResponse
|
||
|
if err := json.NewDecoder(req.Body).Decode(&request); err != nil {
|
||
|
return util.ErrorResponse(err)
|
||
|
}
|
||
|
if err := r.QueryServerAllowedToSeeEvent(req.Context(), &request, &response); err != nil {
|
||
|
return util.ErrorResponse(err)
|
||
|
}
|
||
|
return util.JSONResponse{Code: http.StatusOK, JSON: &response}
|
||
|
}),
|
||
|
)
|
||
|
servMux.Handle(
|
||
|
api.RoomserverQueryMissingEventsPath,
|
||
|
common.MakeInternalAPI("queryMissingEvents", func(req *http.Request) util.JSONResponse {
|
||
|
var request api.QueryMissingEventsRequest
|
||
|
var response api.QueryMissingEventsResponse
|
||
|
if err := json.NewDecoder(req.Body).Decode(&request); err != nil {
|
||
|
return util.ErrorResponse(err)
|
||
|
}
|
||
|
if err := r.QueryMissingEvents(req.Context(), &request, &response); err != nil {
|
||
|
return util.ErrorResponse(err)
|
||
|
}
|
||
|
return util.JSONResponse{Code: http.StatusOK, JSON: &response}
|
||
|
}),
|
||
|
)
|
||
|
servMux.Handle(
|
||
|
api.RoomserverQueryStateAndAuthChainPath,
|
||
|
common.MakeInternalAPI("queryStateAndAuthChain", func(req *http.Request) util.JSONResponse {
|
||
|
var request api.QueryStateAndAuthChainRequest
|
||
|
var response api.QueryStateAndAuthChainResponse
|
||
|
if err := json.NewDecoder(req.Body).Decode(&request); err != nil {
|
||
|
return util.ErrorResponse(err)
|
||
|
}
|
||
|
if err := r.QueryStateAndAuthChain(req.Context(), &request, &response); err != nil {
|
||
|
return util.ErrorResponse(err)
|
||
|
}
|
||
|
return util.JSONResponse{Code: http.StatusOK, JSON: &response}
|
||
|
}),
|
||
|
)
|
||
|
servMux.Handle(
|
||
|
api.RoomserverQueryBackfillPath,
|
||
|
common.MakeInternalAPI("QueryBackfill", func(req *http.Request) util.JSONResponse {
|
||
|
var request api.QueryBackfillRequest
|
||
|
var response api.QueryBackfillResponse
|
||
|
if err := json.NewDecoder(req.Body).Decode(&request); err != nil {
|
||
|
return util.ErrorResponse(err)
|
||
|
}
|
||
|
if err := r.QueryBackfill(req.Context(), &request, &response); err != nil {
|
||
|
return util.ErrorResponse(err)
|
||
|
}
|
||
|
return util.JSONResponse{Code: http.StatusOK, JSON: &response}
|
||
|
}),
|
||
|
)
|
||
|
servMux.Handle(
|
||
|
api.RoomserverQueryRoomVersionCapabilitiesPath,
|
||
|
common.MakeInternalAPI("QueryRoomVersionCapabilities", func(req *http.Request) util.JSONResponse {
|
||
|
var request api.QueryRoomVersionCapabilitiesRequest
|
||
|
var response api.QueryRoomVersionCapabilitiesResponse
|
||
|
if err := json.NewDecoder(req.Body).Decode(&request); err != nil {
|
||
|
return util.ErrorResponse(err)
|
||
|
}
|
||
|
if err := r.QueryRoomVersionCapabilities(req.Context(), &request, &response); err != nil {
|
||
|
return util.ErrorResponse(err)
|
||
|
}
|
||
|
return util.JSONResponse{Code: http.StatusOK, JSON: &response}
|
||
|
}),
|
||
|
)
|
||
|
servMux.Handle(
|
||
|
api.RoomserverQueryRoomVersionForRoomPath,
|
||
|
common.MakeInternalAPI("QueryRoomVersionForRoom", func(req *http.Request) util.JSONResponse {
|
||
|
var request api.QueryRoomVersionForRoomRequest
|
||
|
var response api.QueryRoomVersionForRoomResponse
|
||
|
if err := json.NewDecoder(req.Body).Decode(&request); err != nil {
|
||
|
return util.ErrorResponse(err)
|
||
|
}
|
||
|
if err := r.QueryRoomVersionForRoom(req.Context(), &request, &response); err != nil {
|
||
|
return util.ErrorResponse(err)
|
||
|
}
|
||
|
return util.JSONResponse{Code: http.StatusOK, JSON: &response}
|
||
|
}),
|
||
|
)
|
||
|
servMux.Handle(
|
||
|
api.RoomserverSetRoomAliasPath,
|
||
|
common.MakeInternalAPI("setRoomAlias", func(req *http.Request) util.JSONResponse {
|
||
|
var request api.SetRoomAliasRequest
|
||
|
var response api.SetRoomAliasResponse
|
||
|
if err := json.NewDecoder(req.Body).Decode(&request); err != nil {
|
||
|
return util.ErrorResponse(err)
|
||
|
}
|
||
|
if err := r.SetRoomAlias(req.Context(), &request, &response); err != nil {
|
||
|
return util.ErrorResponse(err)
|
||
|
}
|
||
|
return util.JSONResponse{Code: http.StatusOK, JSON: &response}
|
||
|
}),
|
||
|
)
|
||
|
servMux.Handle(
|
||
|
api.RoomserverGetRoomIDForAliasPath,
|
||
|
common.MakeInternalAPI("GetRoomIDForAlias", func(req *http.Request) util.JSONResponse {
|
||
|
var request api.GetRoomIDForAliasRequest
|
||
|
var response api.GetRoomIDForAliasResponse
|
||
|
if err := json.NewDecoder(req.Body).Decode(&request); err != nil {
|
||
|
return util.ErrorResponse(err)
|
||
|
}
|
||
|
if err := r.GetRoomIDForAlias(req.Context(), &request, &response); err != nil {
|
||
|
return util.ErrorResponse(err)
|
||
|
}
|
||
|
return util.JSONResponse{Code: http.StatusOK, JSON: &response}
|
||
|
}),
|
||
|
)
|
||
|
servMux.Handle(
|
||
|
api.RoomserverGetCreatorIDForAliasPath,
|
||
|
common.MakeInternalAPI("GetCreatorIDForAlias", func(req *http.Request) util.JSONResponse {
|
||
|
var request api.GetCreatorIDForAliasRequest
|
||
|
var response api.GetCreatorIDForAliasResponse
|
||
|
if err := json.NewDecoder(req.Body).Decode(&request); err != nil {
|
||
|
return util.ErrorResponse(err)
|
||
|
}
|
||
|
if err := r.GetCreatorIDForAlias(req.Context(), &request, &response); err != nil {
|
||
|
return util.ErrorResponse(err)
|
||
|
}
|
||
|
return util.JSONResponse{Code: http.StatusOK, JSON: &response}
|
||
|
}),
|
||
|
)
|
||
|
servMux.Handle(
|
||
|
api.RoomserverGetAliasesForRoomIDPath,
|
||
|
common.MakeInternalAPI("getAliasesForRoomID", func(req *http.Request) util.JSONResponse {
|
||
|
var request api.GetAliasesForRoomIDRequest
|
||
|
var response api.GetAliasesForRoomIDResponse
|
||
|
if err := json.NewDecoder(req.Body).Decode(&request); err != nil {
|
||
|
return util.ErrorResponse(err)
|
||
|
}
|
||
|
if err := r.GetAliasesForRoomID(req.Context(), &request, &response); err != nil {
|
||
|
return util.ErrorResponse(err)
|
||
|
}
|
||
|
return util.JSONResponse{Code: http.StatusOK, JSON: &response}
|
||
|
}),
|
||
|
)
|
||
|
servMux.Handle(
|
||
|
api.RoomserverRemoveRoomAliasPath,
|
||
|
common.MakeInternalAPI("removeRoomAlias", func(req *http.Request) util.JSONResponse {
|
||
|
var request api.RemoveRoomAliasRequest
|
||
|
var response api.RemoveRoomAliasResponse
|
||
|
if err := json.NewDecoder(req.Body).Decode(&request); err != nil {
|
||
|
return util.ErrorResponse(err)
|
||
|
}
|
||
|
if err := r.RemoveRoomAlias(req.Context(), &request, &response); err != nil {
|
||
|
return util.ErrorResponse(err)
|
||
|
}
|
||
|
return util.JSONResponse{Code: http.StatusOK, JSON: &response}
|
||
|
}),
|
||
|
)
|
||
|
}
|