mirror of
https://github.com/matrix-construct/construct
synced 2024-06-07 12:38:56 +02:00
ircd:Ⓜ️:room::power: Add grant/revoke suite.
This commit is contained in:
parent
2bf38286ba
commit
8fda624be2
|
@ -42,6 +42,8 @@
|
|||
///
|
||||
struct ircd::m::room::power
|
||||
{
|
||||
struct grant;
|
||||
struct revoke;
|
||||
using closure = std::function<bool (const string_view &, const int64_t &)>;
|
||||
|
||||
static const int64_t default_creator_level;
|
||||
|
@ -103,3 +105,49 @@ struct ircd::m::room::power
|
|||
static json::object compose_content(const mutable_buffer &out, const compose_closure &);
|
||||
static json::object default_content(const mutable_buffer &out, const m::id::user &creator);
|
||||
};
|
||||
|
||||
struct ircd::m::room::power::grant
|
||||
:boolean
|
||||
{
|
||||
grant(json::stack::object &, const room::power &, const pair<string_view> &, const int64_t &);
|
||||
grant(json::stack::object &, const room::power &, const m::id::user &, const int64_t &);
|
||||
};
|
||||
|
||||
struct ircd::m::room::power::revoke
|
||||
:boolean
|
||||
{
|
||||
revoke(json::stack::object &, const room::power &, const pair<string_view> &);
|
||||
revoke(json::stack::object &, const room::power &, const m::id::user &);
|
||||
};
|
||||
|
||||
inline
|
||||
ircd::m::room::power::revoke::revoke(json::stack::object &out,
|
||||
const room::power &power,
|
||||
const m::id::user &user_id)
|
||||
:revoke
|
||||
{
|
||||
out,
|
||||
power,
|
||||
pair<string_view>
|
||||
{
|
||||
"users", user_id
|
||||
},
|
||||
}
|
||||
{}
|
||||
|
||||
inline
|
||||
ircd::m::room::power::grant::grant(json::stack::object &out,
|
||||
const room::power &power,
|
||||
const m::id::user &user_id,
|
||||
const int64_t &level)
|
||||
:grant
|
||||
{
|
||||
out,
|
||||
power,
|
||||
pair<string_view>
|
||||
{
|
||||
"users", user_id
|
||||
},
|
||||
level,
|
||||
}
|
||||
{}
|
||||
|
|
|
@ -8,6 +8,143 @@
|
|||
// 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::room::power::revoke::revoke(json::stack::object &out,
|
||||
const room::power &power,
|
||||
const pair<string_view> &prop_key)
|
||||
:boolean{false}
|
||||
{
|
||||
bool &ret(*this);
|
||||
const auto replace{[&ret]
|
||||
(json::stack::object &out, const json::object &object, const string_view &sought)
|
||||
{
|
||||
for(const auto &[key, val] : object)
|
||||
{
|
||||
if(key == sought)
|
||||
{
|
||||
ret = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
json::stack::member
|
||||
{
|
||||
out, key, val
|
||||
};
|
||||
}
|
||||
}};
|
||||
|
||||
power.view([&out, &prop_key, &replace]
|
||||
(const json::object &power)
|
||||
{
|
||||
const auto &[revoke_prop, revoke_key]
|
||||
{
|
||||
prop_key
|
||||
};
|
||||
|
||||
if(!revoke_prop)
|
||||
{
|
||||
replace(out, power, revoke_key);
|
||||
return;
|
||||
}
|
||||
|
||||
for(const auto &[key, val] : power)
|
||||
{
|
||||
if(key == revoke_prop)
|
||||
{
|
||||
json::stack::object prop
|
||||
{
|
||||
out, key
|
||||
};
|
||||
|
||||
replace(prop, val, revoke_key);
|
||||
continue;
|
||||
}
|
||||
|
||||
json::stack::member
|
||||
{
|
||||
out, key, val
|
||||
};
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
ircd::m::room::power::grant::grant(json::stack::object &out,
|
||||
const room::power &power,
|
||||
const pair<string_view> &prop_key,
|
||||
const int64_t &level)
|
||||
:boolean{false}
|
||||
{
|
||||
bool &ret(*this);
|
||||
const auto replace{[&ret, &level]
|
||||
(json::stack::object &out, const json::object &object, const string_view &sought)
|
||||
{
|
||||
for(const auto &[key, val] : object)
|
||||
{
|
||||
if(key == sought)
|
||||
{
|
||||
json::stack::member
|
||||
{
|
||||
out, key, json::value{level}
|
||||
};
|
||||
|
||||
ret = true;
|
||||
continue;
|
||||
}
|
||||
else if(key > sought && !ret) // maintains lexical sorting
|
||||
{
|
||||
json::stack::member
|
||||
{
|
||||
out, sought, json::value{level}
|
||||
};
|
||||
|
||||
ret = true;
|
||||
}
|
||||
|
||||
json::stack::member
|
||||
{
|
||||
out, key, val
|
||||
};
|
||||
}
|
||||
}};
|
||||
|
||||
power.view([&out, &prop_key, &level, &replace]
|
||||
(const json::object &power)
|
||||
{
|
||||
const auto &[grant_prop, grant_key]
|
||||
{
|
||||
prop_key
|
||||
};
|
||||
|
||||
if(!grant_prop)
|
||||
{
|
||||
replace(out, power, grant_key);
|
||||
return;
|
||||
}
|
||||
|
||||
for(const auto &[key, val] : power)
|
||||
{
|
||||
if(key == grant_prop)
|
||||
{
|
||||
json::stack::object prop
|
||||
{
|
||||
out, key
|
||||
};
|
||||
|
||||
replace(prop, val, grant_key);
|
||||
continue;
|
||||
}
|
||||
|
||||
json::stack::member
|
||||
{
|
||||
out, key, val
|
||||
};
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
//
|
||||
// room::power
|
||||
//
|
||||
|
||||
decltype(ircd::m::room::power::default_creator_level)
|
||||
ircd::m::room::power::default_creator_level
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue