Jake Vanderwerf
2026-04-26 86c6cd3cc099d2480932ede03c12cea01e625c94
base/Membership.php
New file
@@ -0,0 +1,121 @@
<?php
namespace JVBase\base;
/**
 * 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 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 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 getApprovers():array
   {
      return $this->can_approve;
   }
   public function canApprove(string $role):bool
   {
      return ($this->term_approval) && in_array($role, $this->can_approve);
   }
   public function canSeeForum(string $role):bool
   {
      return $this->forum && (empty($this->member_only) || in_array($role, $this->member_only));
   }
}