From 3b83905603d44b1a08f8b2b36a605808ce686ad6 Mon Sep 17 00:00:00 2001
From: Jake Vanderwerf <get@jakevanderwerf.ca>
Date: Tue, 02 Jun 2026 00:46:48 +0000
Subject: [PATCH] =double checking schema outputs for legacytattooremoval
---
inc/managers/RoleManager.php | 219 ++++++++++++++++++++++++++++++++++++++++++++++++++----
1 files changed, 202 insertions(+), 17 deletions(-)
diff --git a/inc/managers/RoleManager.php b/inc/managers/RoleManager.php
index 0f235d6..b275f12 100644
--- a/inc/managers/RoleManager.php
+++ b/inc/managers/RoleManager.php
@@ -2,7 +2,7 @@
namespace JVBase\managers;
use JVBase\registrar\Registrar;
-use JVBase\utility\Features;
+use JVBase\base\Site;
use WP_User;
use WP_Role;
@@ -13,12 +13,11 @@
{
private array $roles;
private array $content;
+ private array $subTypes = [];
public function __construct()
{
- $this->roles = array_keys(array_map(function ($instance) {
- return $instance->slug;
- }, Registrar::getRegistered('user')));
+ $this->roles = Registrar::getRegistered('user');
$this->content = array_map(function($content) {
$registrar = Registrar::getInstance($content);
@@ -28,8 +27,23 @@
Registrar::getFeatured('is_content', 'term')
));
add_action('set_user_role', [$this, 'updateRoles'], 10, 3);
+
+ $this->checkRoleSubTypes();
}
+ public function checkRoleSubTypes():void
+ {
+ foreach ($this->roles as $role) {
+ $registrar = Registrar::getInstance($role);
+ if ($registrar->getUserSubtype()){
+ $this->subTypes[jvbCheckBase($registrar->getUserSubtype())] = $registrar->getCreatable();
+ }
+ }
+ if (!empty($this->subTypes)) {
+ add_action('set_object_terms', [$this, 'maybeSwitchPermissions'],10, 6);
+ }
+ }
+
public function updateRoles(int $userID, string $role, array $oldRoles):void
{
if (doing_action('set_user_role') > 1) {
@@ -95,7 +109,6 @@
$roles = array_keys($user->roles);
foreach ($roles as $role) {
- $role = jvbNoBase($role);
$registrar = Registrar::getInstance($role);
if (!$registrar) {
return false;
@@ -219,7 +232,7 @@
if (!in_array($type, $this->roles)) {
return false;
}
- $link = get_user_meta($user->ID, BASE.'link', true);
+ $link = get_user_meta($user->ID, BASE.'profile_link', true);
if ($link === '') {
$type = BASE.$type;
$name = $user->display_name;
@@ -232,8 +245,8 @@
'post_author' => $user->ID,
]);
if ($link) {
- update_user_meta($user->ID, BASE.'link', $link);
- update_post_meta($link, BASE.'link', $user->ID);
+ update_user_meta($user->ID, BASE.'profile_link', $link);
+ update_post_meta($link, BASE.'profile_link', $user->ID);
}
}
return $link;
@@ -261,8 +274,8 @@
if ($registrar->hasFeature('has_dashboard') ?? false) {
$admin_role = get_role('administrator');
if ($admin_role) {
- $admin_role->add_cap("manage_{$role_name}s", true);
- $admin_role->add_cap("edit_{$role_name}_settings", true);
+ $admin_role->add_cap("manage_{$role_name}s");
+ $admin_role->add_cap("edit_{$role_name}_settings");
}
}
}
@@ -279,7 +292,7 @@
$capabilities['access_dashboard'] = true;
}
- if (Features::forSite()->has('favourites') && $registrar->hasFeature('can_favourite') ?? true) {
+ if (Site::has('favourites') && $registrar->hasFeature('can_favourite') ?? true) {
$capabilities['can_favourite'] = true;
}
@@ -394,12 +407,15 @@
return [
"edit_{$content}",
+ "edit_published_{$content}",
"read_{$content}",
"delete_{$content}",
+ "delete_published_{$content}",
"edit_{$plural}",
- "edit_others_{$plural}",
"publish_{$plural}",
"read_private_{$plural}",
+ "edit_private_{$plural}",
+ "delete_private_{$plural}",
];
}
protected function getOthersCapabilities(string $content):array
@@ -412,9 +428,6 @@
return [
"edit_others_{$plural}",
"delete_others_{$plural}",
- "read_private_{$plural}",
- "edit_private_{$plural}",
- "delete_private_{$plural}",
];
}
@@ -433,12 +446,60 @@
return str_replace(' ', '_', $content.'s');
}
- public function activate(): void
+ public static function activate(): void
{
+ error_log('[RoleManager]::activate');
+ error_log('Registering roles...');
+ $instance = new self;
foreach (Registrar::getRegistered('user') as $role) {
- $this->registerRole($role);
+ $instance->registerRole($role);
}
+ error_log('Roles registered!');
+ error_log('Removing unneeded roles...');
+ remove_role('contributor');
+ remove_role('author');
+ remove_role('editor');
+ error_log('Roles removed!');
+
+ error_log('Adding Admin Capabilities');
+ $instance->addAdminCaps();
+ error_log('Ensuring Existing User\'s Roles...');
+ $instance->ensureRoleCaps();
+ error_log('Roles activated!');
}
+ protected function addAdminCaps():void
+ {
+ $users = get_users(['role' => 'administrator']);
+ foreach (array_merge(Registrar::getRegistered('post'), Registrar::getFeatured('is_content')) as $slug) {
+ $this->grantRoleCapabilities('administrator', $slug);
+ $this->grantRoleOthersCapabilities('administrator', $slug);
+
+ foreach ($users as $user) {
+ $this->grantContent($user, $slug);
+ $this->grantOthersContent($user, $slug);
+ }
+ }
+ }
+ protected function ensureRoleCaps():void
+ {
+ $roles = Registrar::getRegistered('user');
+ foreach ($roles as $role) {
+ $registrar = Registrar::getInstance($role);
+ $creatable = $registrar->getCreatable();
+ $manageable = $registrar->getManageOthers();
+ if (!empty($creatable) || !empty($manageable)) {
+ $users = get_users(['role' => jvbCheckBase($role)]);
+ foreach ($users as $user) {
+ foreach ($creatable as $slug) {
+ $this->grantContent($user, $slug);
+ }
+ foreach ($manageable as $slug) {
+ $this->grantOthersContent($user, $slug);
+ }
+ }
+ }
+ }
+ }
/******************************************************************
* OWNABLE and MANAGABLE terms (ie: tattoo shops)
@@ -475,6 +536,15 @@
$user->add_cap(BASE . 'can_own_' . $termID);
$user->add_cap(BASE . 'can_manage_' . $termID);
+ $owners = get_term_meta($termID, BASE.'owners', true);
+ if (empty($owners)) {
+ $owners = [];
+ }
+ $owners[] = $userID;
+ $owners = array_unique($owners);
+ update_term_meta($termID, BASE.'owners', $owners);
+
+
do_action(BASE . 'granted_ownership', $userID, $termID, $taxonomy);
return true;
@@ -500,6 +570,16 @@
return false;
}
+ $owners = get_term_meta($termID, BASE.'owners', true);
+ if (empty($owners)) {
+ $owners = [];
+ }
+ if (in_array($userID, $owners)) {
+ unset($owners[array_search($userID, $owners)]);
+ }
+ $owners = array_unique($owners);
+ update_term_meta($termID, BASE.'owners', $owners);
+
$user->remove_cap(BASE . 'can_own_' . $termID);
do_action(BASE . 'revoked_ownership', $userID, $termID, $taxonomy);
@@ -537,6 +617,14 @@
$user->add_cap(BASE . 'can_manage_' . $termID);
+ $managers = get_term_meta($termID, BASE.'managers', true);
+ if (empty($managers)) {
+ $managers = [];
+ }
+ $managers[] = $userID;
+ $managers = array_unique($managers);
+ update_term_meta($termID, BASE.'managers', $managers);
+
do_action(BASE . 'granted_management', $userID, $termID, $taxonomy);
return true;
@@ -564,6 +652,16 @@
$user->remove_cap(BASE . 'can_manage_' . $termID);
+ $managers = get_term_meta($termID, BASE.'managers', true);
+ if (empty($managers)) {
+ $managers = [];
+ }
+ if (in_array($userID, $managers)) {
+ unset($managers[array_search($userID, $managers)]);
+ }
+ $managers = array_unique($managers);
+ update_term_meta($termID, BASE.'managers', $managers);
+
do_action(BASE . 'revoked_management', $userID, $termID, $taxonomy);
return true;
@@ -723,4 +821,91 @@
}
return null;
}
+
+ public function maybeSwitchPermissions(int $object_id, array $terms, array $tt_ids, string $taxonomy, bool $append, array $old_tt_ids):void
+ {
+ //This shouldn't happen, but whatever
+ if (empty($this->subTypes)) {
+ return;
+ }
+
+ if (!in_array($taxonomy, array_keys($this->subTypes))) {
+ return;
+ }
+
+ $new = array_diff($tt_ids, $old_tt_ids);
+ $old = array_diff($old_tt_ids, $tt_ids);
+
+ $userID = (int)get_post_meta($object_id, BASE.'profile_link',true);
+ if ($userID === 0) {
+ return;
+ }
+ $user = get_userdata($userID);
+ if (!$user) {
+ return;
+ }
+
+ //Revoke old first
+ if (!empty($old)) {
+ $old = array_filter(array_map(function ($id) use ($taxonomy) {
+ $termID = $this->getTermIDFromTTID($id);
+ return $this->getRootTermSlug($termID, $taxonomy);
+ }, $old));
+ foreach ($old as $slug) {
+ if (!array_key_exists($slug, $this->subTypes[$taxonomy])) {
+ error_log('[RoleManager]::maybeSwitchPermissions Could not find creatable types for role subtype '.$slug);
+ continue;
+ }
+ foreach ($this->subTypes[$taxonomy][$slug] ?? [] as $s) {
+ $this->grantContent($user, $s, false);
+ }
+ }
+ }
+
+ if (!empty($new)) {
+ $new = array_filter(array_map(function ($id) use ($taxonomy){
+ $termID = $this->getTermIDFromTTID($id);
+ return $this->getRootTermSlug($termID, $taxonomy);
+ }, $new));
+ foreach ($new as $slug) {
+ if (!array_key_exists($slug, $this->subTypes[$taxonomy])) {
+ error_log('[RoleManager]::maybeSwitchPermissions Could not find creatable types for role subtype '.$slug);
+ continue;
+ }
+ foreach ($this->subTypes[$taxonomy][$slug] ?? [] as $s) {
+ $this->grantContent($user, $s);
+ }
+ }
+ }
+ }
+
+ /**
+ * Helper function to get term_id from term_taxonomy_id
+ * @param int $tt_id
+ *
+ * @return int
+ */
+ private function getTermIDFromTTID(int $tt_id):int
+ {
+ global $wpdb;
+ return $wpdb->get_var($wpdb->prepare(
+ "SELECT term_id FROM {$wpdb->term_taxonomy} WHERE term_taxonomy_id = %d",
+ $tt_id
+ ));
+ }
+
+ private function getRootTermSlug(int $termID, string $taxonomy): string|false
+ {
+ $term = get_term($termID, $taxonomy);
+ if (!$term || is_wp_error($term)) {
+ return false;
+ }
+ while ($term->parent !== 0) {
+ $term = get_term($term->parent, $taxonomy);
+ if (!$term || is_wp_error($term)) {
+ return false;
+ }
+ }
+ return $term->slug;
+ }
}
--
Gitblit v1.10.0