GetEvent implements GET /_matrix/client/r0/rooms/{roomId}/event/{eventId} https://matrix.org/docs/spec/client_server/r0.4.0.html#get-matrix-client-r0-rooms-roomid-event-eventid
( req *http.Request, device *userapi.Device, roomID string, eventID string, cfg *config.ClientAPI, rsAPI api.ClientRoomserverAPI, )
| 37 | // GetEvent implements GET /_matrix/client/r0/rooms/{roomId}/event/{eventId} |
| 38 | // https://matrix.org/docs/spec/client_server/r0.4.0.html#get-matrix-client-r0-rooms-roomid-event-eventid |
| 39 | func GetEvent( |
| 40 | req *http.Request, |
| 41 | device *userapi.Device, |
| 42 | roomID string, |
| 43 | eventID string, |
| 44 | cfg *config.ClientAPI, |
| 45 | rsAPI api.ClientRoomserverAPI, |
| 46 | ) util.JSONResponse { |
| 47 | eventsReq := api.QueryEventsByIDRequest{ |
| 48 | EventIDs: []string{eventID}, |
| 49 | } |
| 50 | var eventsResp api.QueryEventsByIDResponse |
| 51 | err := rsAPI.QueryEventsByID(req.Context(), &eventsReq, &eventsResp) |
| 52 | if err != nil { |
| 53 | util.GetLogger(req.Context()).WithError(err).Error("queryAPI.QueryEventsByID failed") |
| 54 | return jsonerror.InternalServerError() |
| 55 | } |
| 56 | |
| 57 | if len(eventsResp.Events) == 0 { |
| 58 | // Event not found locally |
| 59 | return util.JSONResponse{ |
| 60 | Code: http.StatusNotFound, |
| 61 | JSON: jsonerror.NotFound("The event was not found or you do not have permission to read this event"), |
| 62 | } |
| 63 | } |
| 64 | |
| 65 | requestedEvent := eventsResp.Events[0].Event |
| 66 | |
| 67 | r := getEventRequest{ |
| 68 | req: req, |
| 69 | device: device, |
| 70 | roomID: roomID, |
| 71 | eventID: eventID, |
| 72 | cfg: cfg, |
| 73 | requestedEvent: requestedEvent, |
| 74 | } |
| 75 | |
| 76 | stateReq := api.QueryStateAfterEventsRequest{ |
| 77 | RoomID: r.requestedEvent.RoomID(), |
| 78 | PrevEventIDs: r.requestedEvent.PrevEventIDs(), |
| 79 | StateToFetch: []gomatrixserverlib.StateKeyTuple{{ |
| 80 | EventType: gomatrixserverlib.MRoomMember, |
| 81 | StateKey: device.UserID, |
| 82 | }}, |
| 83 | } |
| 84 | var stateResp api.QueryStateAfterEventsResponse |
| 85 | if err := rsAPI.QueryStateAfterEvents(req.Context(), &stateReq, &stateResp); err != nil { |
| 86 | util.GetLogger(req.Context()).WithError(err).Error("queryAPI.QueryStateAfterEvents failed") |
| 87 | return jsonerror.InternalServerError() |
| 88 | } |
| 89 | |
| 90 | if !stateResp.RoomExists { |
| 91 | util.GetLogger(req.Context()).Errorf("Expected to find room for event %s but failed", r.requestedEvent.EventID()) |
| 92 | return jsonerror.InternalServerError() |
| 93 | } |
| 94 | |
| 95 | if !stateResp.PrevEventsExist { |
| 96 | // Missing some events locally; stateResp.StateEvents unavailable. |
no test coverage detected