0
0
Fork 0
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:
Jason Volk 2020-04-19 00:50:10 -07:00
parent 2bf38286ba
commit 8fda624be2
2 changed files with 185 additions and 0 deletions

View file

@ -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,
}
{}

View file

@ -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
{