mirror of
https://github.com/matrix-org/dendrite.git
synced 2025-12-13 09:53:10 -06:00
Support the since and limit parameters
This commit is contained in:
parent
d9913c303f
commit
f4a53ee54b
|
|
@ -278,7 +278,7 @@ func Setup(
|
||||||
// TODO: Return a list of public rooms
|
// TODO: Return a list of public rooms
|
||||||
return writers.GetPublicRooms(req, publicRoomAPI)
|
return writers.GetPublicRooms(req, publicRoomAPI)
|
||||||
}),
|
}),
|
||||||
)
|
).Methods("GET", "POST", "OPTIONS")
|
||||||
|
|
||||||
unstableMux.Handle("/thirdparty/protocols",
|
unstableMux.Handle("/thirdparty/protocols",
|
||||||
common.MakeAPI("thirdparty_protocols", func(req *http.Request) util.JSONResponse {
|
common.MakeAPI("thirdparty_protocols", func(req *http.Request) util.JSONResponse {
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ package writers
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
"github.com/matrix-org/dendrite/clientapi/auth/authtypes"
|
"github.com/matrix-org/dendrite/clientapi/auth/authtypes"
|
||||||
"github.com/matrix-org/dendrite/clientapi/httputil"
|
"github.com/matrix-org/dendrite/clientapi/httputil"
|
||||||
|
|
@ -69,11 +70,14 @@ func SetVisibility(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPublicRooms implements GET /publicRooms
|
// GetPublicRooms implements GET and POST /publicRooms
|
||||||
func GetPublicRooms(
|
func GetPublicRooms(
|
||||||
req *http.Request, publicRoomAPI api.RoomserverPublicRoomAPI,
|
req *http.Request, publicRoomAPI api.RoomserverPublicRoomAPI,
|
||||||
) util.JSONResponse {
|
) util.JSONResponse {
|
||||||
queryReq := api.GetPublicRoomsRequest{}
|
queryReq := api.GetPublicRoomsRequest{}
|
||||||
|
if fillErr := fillPublicRoomsReq(req, &queryReq); fillErr != nil {
|
||||||
|
return *fillErr
|
||||||
|
}
|
||||||
var queryRes api.GetPublicRoomsResponse
|
var queryRes api.GetPublicRoomsResponse
|
||||||
if err := publicRoomAPI.GetPublicRooms(&queryReq, &queryRes); err != nil {
|
if err := publicRoomAPI.GetPublicRooms(&queryReq, &queryRes); err != nil {
|
||||||
return httputil.LogThenError(req, err)
|
return httputil.LogThenError(req, err)
|
||||||
|
|
@ -84,3 +88,23 @@ func GetPublicRooms(
|
||||||
JSON: queryRes,
|
JSON: queryRes,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func fillPublicRoomsReq(httpReq *http.Request, queryReq *api.GetPublicRoomsRequest) *util.JSONResponse {
|
||||||
|
if httpReq.Method == "GET" {
|
||||||
|
limit, err := strconv.Atoi(httpReq.FormValue("limit"))
|
||||||
|
// Atoi returns 0 and an error when trying to parse an empty string
|
||||||
|
// In that case, we want to assign 0 so we ignore the error
|
||||||
|
if err != nil && len(httpReq.FormValue("limit")) > 0 {
|
||||||
|
reqErr := httputil.LogThenError(httpReq, err)
|
||||||
|
return &reqErr
|
||||||
|
}
|
||||||
|
queryReq.Limit = int16(limit)
|
||||||
|
queryReq.Since = httpReq.FormValue("since")
|
||||||
|
} else if httpReq.Method == "POST" {
|
||||||
|
if reqErr := httputil.UnmarshalJSONRequest(httpReq, queryReq); reqErr != nil {
|
||||||
|
return reqErr
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -42,9 +42,16 @@ type GetRoomVisibilityResponse struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPublicRoomsRequest is a request to GetPublicRooms
|
// GetPublicRoomsRequest is a request to GetPublicRooms
|
||||||
|
// TODO: Support the "server" request parameter
|
||||||
type GetPublicRoomsRequest struct {
|
type GetPublicRoomsRequest struct {
|
||||||
Limit int16 `json:"limit"`
|
Limit int16 `json:"limit"`
|
||||||
Since string `json:"since"`
|
Since string `json:"since"`
|
||||||
|
Filter Filter `json:"filter"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Filter implements the Filter structure from the Matrix spec
|
||||||
|
type Filter struct {
|
||||||
|
SearchTerm string `json:"generic_search_term"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPublicRoomsResponse is a response to GetPublicRooms
|
// GetPublicRoomsResponse is a response to GetPublicRooms
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,7 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
"github.com/matrix-org/dendrite/common"
|
"github.com/matrix-org/dendrite/common"
|
||||||
"github.com/matrix-org/dendrite/roomserver/api"
|
"github.com/matrix-org/dendrite/roomserver/api"
|
||||||
|
|
@ -108,7 +109,18 @@ func (r *RoomserverPublicRoomAPI) GetPublicRooms(
|
||||||
req *api.GetPublicRoomsRequest,
|
req *api.GetPublicRoomsRequest,
|
||||||
response *api.GetPublicRoomsResponse,
|
response *api.GetPublicRoomsResponse,
|
||||||
) error {
|
) error {
|
||||||
// TODO: Limit by req.Limit and offset by req.Since
|
var limit int16
|
||||||
|
var offset int64
|
||||||
|
|
||||||
|
limit = req.Limit
|
||||||
|
ofst, err := strconv.Atoi(req.Since)
|
||||||
|
// Atoi returns 0 and an error when trying to parse an empty string
|
||||||
|
// In that case, we want to assign 0 so we ignore the error
|
||||||
|
if err != nil && len(req.Since) > 0 {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
offset = int64(ofst)
|
||||||
|
|
||||||
roomIDs, err := r.DB.GetPublicRoomIDs()
|
roomIDs, err := r.DB.GetPublicRoomIDs()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
@ -133,7 +145,13 @@ func (r *RoomserverPublicRoomAPI) GetPublicRooms(
|
||||||
chunks = append(chunks, chunk)
|
chunks = append(chunks, chunk)
|
||||||
}
|
}
|
||||||
|
|
||||||
response.Chunks = chunks
|
if limit == 0 {
|
||||||
|
// If limit is 0, don't limit the results
|
||||||
|
response.Chunks = chunks[offset:]
|
||||||
|
} else {
|
||||||
|
response.Chunks = chunks[offset:limit]
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue