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:
parent
8230819edf
commit
187eca0e4e
11 changed files with 236 additions and 104 deletions
|
@ -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;
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue