From 86c6cd3cc099d2480932ede03c12cea01e625c94 Mon Sep 17 00:00:00 2001
From: Jake Vanderwerf <get@jakevanderwerf.ca>
Date: Sun, 26 Apr 2026 21:56:28 +0000
Subject: [PATCH] =Requiring files based on Site class settings

---
 base/Membership.php |  121 ++++++++++++++++++++++++++++++++++++++++
 1 files changed, 121 insertions(+), 0 deletions(-)

diff --git a/base/Membership.php b/base/Membership.php
new file mode 100644
index 0000000..9032758
--- /dev/null
+++ b/base/Membership.php
@@ -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));
+	}
+
+}

--
Gitblit v1.10.0