0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-12-26 15:33:54 +01:00

ircd:Ⓜ️:user: Add interface definitions for push rule events to user room.

This commit is contained in:
Jason Volk 2020-03-18 13:59:33 -07:00
parent 2aec995edd
commit a3037b7cd4
2 changed files with 142 additions and 38 deletions

View file

@ -14,18 +14,18 @@
struct ircd::m::user::pushrules
{
using path = push::path;
using closure_bool = std::function<bool ()>;
using closure = std::function<void ()>;
using closure_bool = std::function<bool (const path &, const json::object &)>;
using closure = std::function<void (const path &, const json::object &)>;
m::user user;
public:
bool for_each(const path &, const closure_bool &) const;
bool for_each(const closure_bool &) const;
bool get(std::nothrow_t, const path &, const closure &) const;
void get(const path &, const closure &) const;
event::id::buf set(const path &, const json::object &value) const;
bool set(const path &, const json::object &value) const;
bool del(const path &) const;
pushrules(const m::user &user) noexcept;
};

View file

@ -8,17 +8,79 @@
// copyright notice and this permission notice is present in all copies. The
// full license for this software is available in the LICENSE file.
ircd::m::event::id::buf
ircd::m::user::pushrules::set(const path &path,
const json::object &value)
bool
ircd::m::user::pushrules::del(const path &path)
const
{
const auto &[scope, kind, ruleid]
{
path
};
char typebuf[event::TYPE_MAX_SIZE];
const string_view &type
{
push::make_type(typebuf, path)
};
const m::user::room user_room
{
user
};
return {};
const event::idx &event_idx
{
user_room.get(type, ruleid)
};
const m::event::id::buf event_id
{
m::event_id(event_idx, std::nothrow)
};
if(!event_id)
return false;
const auto redact_id
{
m::redact(user_room, user, event_id, "deleted")
};
return true;
}
bool
ircd::m::user::pushrules::set(const path &path,
const json::object &content)
const
{
const auto &[scope, kind, ruleid]
{
path
};
const push::rule rule
{
content
};
char typebuf[event::TYPE_MAX_SIZE];
const string_view &type
{
push::make_type(typebuf, path)
};
const m::user::room user_room
{
user
};
const auto rule_event_id
{
m::send(user_room, user, type, ruleid, content)
};
return true;
}
void
@ -26,13 +88,18 @@ ircd::m::user::pushrules::get(const path &path,
const closure &closure)
const
{
const auto &[scope, kind, ruleid]
{
path
};
if(!get(std::nothrow, path, closure))
throw m::NOT_FOUND
{
"push rule (%s,%s,%s) for user %s not found",
std::get<0>(path),
std::get<1>(path),
std::get<2>(path),
scope,
kind,
ruleid,
string_view{user.user_id}
};
}
@ -43,6 +110,57 @@ ircd::m::user::pushrules::get(std::nothrow_t,
const closure &closure)
const
{
const auto &[scope, kind, ruleid]
{
path
};
char typebuf[event::TYPE_MAX_SIZE];
const string_view &type
{
push::make_type(typebuf, path)
};
const m::user::room user_room
{
user
};
const event::idx &event_idx
{
user_room.get(type, ruleid)
};
return m::get(std::nothrow, event_idx, "content", [&path, &closure]
(const json::object &content)
{
closure(path, content);
});
}
bool
ircd::m::user::pushrules::for_each(const closure_bool &closure)
const
{
return for_each(path{}, closure);
}
bool
ircd::m::user::pushrules::for_each(const path &path,
const closure_bool &closure)
const
{
const auto &[scope, kind, ruleid]
{
path
};
char typebuf[event::TYPE_MAX_SIZE];
const room::state::type_prefix type
{
push::make_type(typebuf, path)
};
const user::room user_room
{
user
@ -53,32 +171,18 @@ const
user_room
};
const event::idx &event_idx
return state.for_each(type, room::state::closure_bool{[&closure]
(const string_view &type, const string_view &state_key, const m::event::idx &event_idx)
{
0U
};
const auto path
{
push::make_path(type, state_key)
};
return false;
}
bool
ircd::m::user::pushrules::for_each(const closure_bool &closure)
const
{
static const event::fetch::opts fopts
{
event::keys::include {"state_key", "content"}
};
const user::room user_room
{
user
};
const room::state state
{
user_room, &fopts
};
return true;
return m::query<bool>(std::nothrow, event_idx, "content", true, [&path, &closure]
(const json::object &content)
{
return closure(path, content);
});
}});
}