<?php
|
namespace JVBase\base;
|
use JVBase\registrar\Registrar;
|
|
/**
|
* JVB_MEMBERSHIP defines the structure of the directory
|
* Options include:
|
* - membership_expires = useful if members pay a yearly membership fee
|
* - hide_expired = removes users once membership expired; only used if membership_expires is true
|
* - clip_expired = keeps users once membership expires, but limits the information shown; only used if membership_expires is true
|
* - membership_approval = verified users can approve other users
|
* - term_approval = (bool) verified users can create new terms, but needs approval
|
* - member_only = (array) if empty, open to any registered user. otherwise an array of registered user roles
|
*
|
*
|
* Example:
|
* [
|
* 'member_content' => true,
|
* 'invitable' => true,
|
* 'can_invite' => ['artist' => ['artist']],
|
* 'member_verified' => true,
|
* 'notifications' => true,
|
* 'forum' => true,
|
* 'member_only' => [ 'artist' ],
|
* 'member_expires' => false,
|
* 'hide_expired' => false,
|
* 'clip_expired' => false,
|
* 'term_approval' => true,
|
* 'can_approve' => [ 'artist' ]
|
* ]
|
*/
|
|
$membership = apply_filters('jvb_membership', [
|
'can_invite' => [],
|
]);
|
define('JVB_MEMBERSHIP', $membership);
|
|
|
class Membership
|
{
|
protected bool $member_content = true;
|
protected bool $invitable = false;
|
protected bool $member_verified = false;
|
protected array $can_invite = [];
|
protected bool $notifications = true;
|
protected bool $member_expires = false;
|
protected bool $hide_expired = false;
|
protected bool $clip_expired = false;
|
protected bool $term_approval = false;
|
protected array $can_approve = [];
|
protected bool $forum = true;
|
protected array $member_only = [];
|
|
public function __construct() {
|
|
}
|
public function set(string $property, null|bool|array $value = null):void
|
{
|
if (is_null($value)) {
|
$value = true;
|
}
|
if (property_exists(self::class, $property)) {
|
$this->$property = $value;
|
} else {
|
error_log('[Membership]::set Could not set property '.$property.', it does not exist.');
|
}
|
}
|
|
public function setAll(array $properties):void
|
{
|
foreach ($properties as $property) {
|
if (is_array($property)) {
|
$this->set($property[0], $property[1]);
|
} else {
|
$this->set($property);
|
}
|
}
|
}
|
|
public function has(string $property):bool
|
{
|
return property_exists($this, $property) && $this->$property === true;
|
}
|
|
public function hasAny(array $properties):bool
|
{
|
foreach ($properties as $property) {
|
if ($this->has($property)) {
|
return true;
|
}
|
}
|
return false;
|
}
|
|
public function setInvitable(array $invitable):void
|
{
|
$users = Registrar::getRegistered('user');
|
|
$invitable = array_filter($invitable, function($role) use ($users) {
|
if (!in_array($role, $users)) {
|
error_log('[Membership]::set Invitable role '.$role.' does not exist.');
|
return false;
|
}
|
return true;
|
}, ARRAY_FILTER_USE_KEY);
|
$allowed = [];
|
foreach ($invitable as $inviter => $canInvites) {
|
$canInvites = array_filter($canInvites, function($role) use ($users){
|
if (!in_array($role, $users)) {
|
error_log('[Membership]::set Invitable role '.$role.' does not exist.');
|
return false;
|
}
|
return true;
|
});
|
if (!empty($canInvites)) {
|
$allowed[$inviter] = $canInvites;
|
}
|
}
|
if (!empty($allowed)) {
|
$this->can_invite = $allowed;
|
}
|
}
|
|
public function getInviters():array
|
{
|
return $this->can_invite;
|
}
|
public function canInvite(string $role):bool
|
{
|
return ($this->invitable) && array_key_exists($role, $this->can_invite);
|
}
|
public function getInvitableFor(string $role):array
|
{
|
return array_key_exists($role, $this->can_invite) ? $this->can_invite[$role] : [];
|
}
|
|
public function setApprovers(array $roles):void
|
{
|
$allowed = Registrar::getRegistered('users');
|
$this->can_approve = array_filter($roles, function($role) use ($allowed){
|
return in_array($role, $allowed);
|
});
|
}
|
public function getApprovers():array
|
{
|
return $this->can_approve;
|
}
|
|
public function canApprove(string $role):bool
|
{
|
return ($this->term_approval) && in_array($role, $this->can_approve);
|
}
|
|
|
public function setCanSeeForum(array $roles):void
|
{
|
$allowed = Registrar::getRegistered('users');
|
$this->member_only = array_filter($roles, function($role) use ($allowed){
|
return in_array($role, $allowed);
|
});
|
}
|
public function canSeeForum(string $role):bool
|
{
|
return $this->forum && (empty($this->member_only) || in_array($role, $this->member_only));
|
}
|
|
}
|