0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-09-27 11:18:51 +02:00

modules/client/sync: Refactor linear sync handlers to assume no implicit path.

This commit is contained in:
Jason Volk 2019-03-08 13:42:54 -08:00
parent 8230819edf
commit 187eca0e4e
11 changed files with 236 additions and 104 deletions

View file

@ -499,11 +499,6 @@ ircd::m::sync::linear_proffer_event_one(data &data)
*data.out
};
json::stack::object object
{
*data.out, item.member_name()
};
if(item.linear(data))
return false;

View file

@ -45,6 +45,11 @@ ircd::m::sync::account_data_linear(data &data)
if(json::get<"room_id"_>(event) != data.user_room.room_id)
return false;
json::stack::object account_data
{
*data.out, "account_data"
};
json::stack::array array
{
*data.out, "events"

View file

@ -44,6 +44,11 @@ ircd::m::sync::presence_linear(data &data)
if(!my_host(json::get<"origin"_>(event)))
return false;
json::stack::object presence
{
*data.out, "presence"
};
json::stack::array array
{
*data.out, "events"

View file

@ -38,13 +38,11 @@ bool
ircd::m::sync::rooms_linear(data &data)
{
assert(data.event);
const auto &event{*data.event};
if(!json::get<"room_id"_>(event))
return false;
const m::room room
{
json::get<"room_id"_>(event)
json::get<"room_id"_>(*data.event)?
m::room::id{json::get<"room_id"_>(*data.event)}:
m::room::id{}
};
const scope_restore their_room
@ -55,44 +53,17 @@ ircd::m::sync::rooms_linear(data &data)
char membuf[32];
const string_view &membership
{
data.room->membership(membuf, data.user)
data.room?
room.membership(membuf, data.user):
string_view{}
};
if(!membership)
return false;
const scope_restore their_membership
{
data.membership, membership
};
const event::idx room_head
{
head_idx(std::nothrow, *data.room)
};
const scope_restore their_head
{
data.room_head, room_head
};
json::stack::checkpoint checkpoint
{
*data.out
};
json::stack::object membership_
{
*data.out, membership
};
json::stack::object room_
{
*data.out, data.room->room_id
};
bool ret(false);
m::sync::for_each("rooms", [&data, &ret]
return !m::sync::for_each("rooms", [&data]
(item &item)
{
json::stack::checkpoint checkpoint
@ -100,23 +71,12 @@ ircd::m::sync::rooms_linear(data &data)
*data.out
};
json::stack::object object
{
*data.out, item.member_name()
};
if(item.linear(data))
ret = true;
else
checkpoint.rollback();
return false;
return !ret;
});
if(!ret)
checkpoint.rollback();
return ret;
return true;
});
}
bool

View file

@ -75,12 +75,41 @@ ircd::m::sync::room_account_data_linear_events(data &data,
lstrip(json::get<"type"_>(event), type.first)
};
char membuf[32];
const auto membership
{
room.membership(membuf, data.user)
};
if(!membership)
return false;
json::stack::object rooms
{
*data.out, "rooms"
};
json::stack::object membership_
{
*data.out, membership
};
json::stack::object room_
{
*data.out, room.room_id
};
json::stack::object account_data
{
*data.out, "account_data"
};
json::stack::array array
{
*data.out, "events"
};
const scope_restore room_{data.room, &room};
const scope_restore room__{data.room, &room};
return room_account_data_polylog_events_event(data, event);
}
@ -104,6 +133,35 @@ ircd::m::sync::room_account_data_linear_tags(data &data,
lstrip(json::get<"type"_>(event), type.first)
};
char membuf[32];
const auto membership
{
room.membership(membuf, data.user)
};
if(!membership)
return false;
json::stack::object rooms
{
*data.out, "rooms"
};
json::stack::object membership_
{
*data.out, membership
};
json::stack::object room_
{
*data.out, room.room_id
};
json::stack::object account_data
{
*data.out, "account_data"
};
json::stack::array array
{
*data.out, "events"
@ -116,7 +174,7 @@ ircd::m::sync::room_account_data_linear_tags(data &data,
// the required format. The event_idx is hacked to 0 here to trick the
// polylog apropos() into composing all tags unconditionally.
const scope_restore range{data.range.first, 0UL};
const scope_restore room_{data.room, &room};
const scope_restore room__{data.room, &room};
return room_account_data_polylog_tags(data);
}

View file

@ -33,17 +33,7 @@ ircd::m::sync::rooms_ephemeral
bool
ircd::m::sync::rooms_ephemeral_linear(data &data)
{
assert(data.event);
if(json::get<"event_id"_>(*data.event))
return false;
json::stack::array array
{
*data.out, "events"
};
bool ret{false};
m::sync::for_each("rooms.ephemeral", [&data, &ret]
return !m::sync::for_each("rooms.ephemeral", [&data]
(item &item)
{
json::stack::checkpoint checkpoint
@ -52,14 +42,11 @@ ircd::m::sync::rooms_ephemeral_linear(data &data)
};
if(item.linear(data))
ret = true;
else
checkpoint.rollback();
return false;
checkpoint.rollback();
return true;
});
return ret;
}
bool

View file

@ -34,19 +34,44 @@ ircd::m::sync::room_ephemeral_m_receipt_m_read
bool
ircd::m::sync::room_ephemeral_m_receipt_m_read_linear(data &data)
{
if(data.event_idx)
return false;
assert(data.event);
if(json::get<"type"_>(*data.event) != "m.receipt")
if(json::get<"type"_>(*data.event) != "ircd.read")
return false;
json::stack::object object
const m::room room
{
*data.out
json::get<"state_key"_>(*data.event)
};
object.append(*data.event);
if(!room.membership(data.user, "join"))
return false;
json::stack::object rooms
{
*data.out, "rooms"
};
json::stack::object membership_
{
*data.out, "join"
};
json::stack::object room_
{
*data.out, room.room_id
};
json::stack::object ephemeral
{
*data.out, "ephemeral"
};
json::stack::array events
{
*data.out, "events"
};
_handle_message_receipt(data, *data.event);
return true;
}

View file

@ -39,12 +39,54 @@ ircd::m::sync::room_ephemeral_m_typing_linear(data &data)
if(json::get<"type"_>(*data.event) != "m.typing")
return false;
const m::room room
{
json::get<"room_id"_>(*data.event)
};
if(!room.membership(data.user, "join"))
return false;
json::stack::object rooms
{
*data.out, "rooms"
};
json::stack::object membership_
{
*data.out, "join"
};
json::stack::object room_
{
*data.out, room.room_id
};
json::stack::object ephemeral
{
*data.out, "ephemeral"
};
json::stack::array events
{
*data.out, "events"
};
json::stack::object object
{
*data.out
};
object.append(*data.event);
json::stack::member
{
object, "type", "m.typing"
};
json::stack::member
{
object, "content", json::get<"content"_>(*data.event)
};
return true;
}

View file

@ -18,9 +18,7 @@ namespace ircd::m::sync
static bool room_invite_state_polylog(data &);
static bool room_state_linear_events(data &);
static bool _room_state_linear(data &);
static bool room_state_linear(data &);
static bool room_invite_state_linear(data &);
extern const event::keys::include _default_keys;
extern event::fetch::opts _default_fopts;
@ -51,7 +49,7 @@ ircd::m::sync::room_invite_state
{
"rooms.invite_state",
room_invite_state_polylog,
room_invite_state_linear
room_state_linear
};
decltype(ircd::m::sync::_default_keys)
@ -76,24 +74,6 @@ ircd::m::sync::_default_fopts
bool
ircd::m::sync::room_state_linear(data &data)
{
if(data.membership == "invite")
return false;
return _room_state_linear(data);
}
bool
ircd::m::sync::room_invite_state_linear(data &data)
{
if(data.membership != "invite")
return false;
return _room_state_linear(data);
}
bool
ircd::m::sync::_room_state_linear(data &data)
{
// if since token is non-zero, any events in the range are
// included in the timeline array and not the state array.
@ -103,10 +83,36 @@ ircd::m::sync::_room_state_linear(data &data)
if(!data.event_idx)
return false;
if(!data.membership)
return false;
if(!data.room)
return false;
assert(data.event);
if(!json::get<"state_key"_>(*data.event))
return false;
json::stack::object rooms
{
*data.out, "rooms"
};
json::stack::object membership_
{
*data.out, data.membership
};
json::stack::object room_
{
*data.out, data.room->room_id
};
json::stack::object state
{
*data.out, "state"
};
json::stack::array array
{
*data.out, "events"

View file

@ -54,7 +54,33 @@ ircd::m::sync::room_timeline_linear(data &data)
if(!data.event_idx)
return false;
if(!data.membership)
return false;
if(!data.room)
return false;
assert(data.event);
json::stack::object rooms
{
*data.out, "rooms"
};
json::stack::object membership_
{
*data.out, data.membership
};
json::stack::object room_
{
*data.out, data.room->room_id
};
json::stack::object timeline
{
*data.out, "timeline"
};
json::stack::array array
{
*data.out, "events"

View file

@ -37,10 +37,13 @@ ircd::m::sync::room_unread_notifications_linear(data &data)
if(!data.event_idx)
return false;
assert(data.event);
if(!json::get<"event_id"_>(*data.event))
if(!data.membership)
return false;
if(!data.room)
return false;
assert(data.event);
const auto &room{*data.room};
m::event::id::buf last_read;
if(!m::receipt::read(last_read, room.room_id, data.user))
@ -51,6 +54,26 @@ ircd::m::sync::room_unread_notifications_linear(data &data)
index(last_read)
};
json::stack::object rooms
{
*data.out, "rooms"
};
json::stack::object membership_
{
*data.out, data.membership
};
json::stack::object room_
{
*data.out, data.room->room_id
};
json::stack::object unread_notifications
{
*data.out, "unread_notifications"
};
// highlight_count
json::stack::member
{