From c4aa5cdb5e90ad4b420e22772797d16980232a2b Mon Sep 17 00:00:00 2001
From: Jake Vanderwerf <get@jakevanderwerf.ca>
Date: Wed, 15 Apr 2026 18:38:55 +0000
Subject: [PATCH] =Updating custom tables to utilize CustomTable.php
---
inc/managers/InvitationsManager.php | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 58 insertions(+), 1 deletions(-)
diff --git a/inc/managers/InvitationsManager.php b/inc/managers/InvitationsManager.php
index 088556f..fab93bd 100644
--- a/inc/managers/InvitationsManager.php
+++ b/inc/managers/InvitationsManager.php
@@ -20,9 +20,12 @@
protected Cache $cache;
public function __construct()
{
+ $this->defineTable();
+ if (!isset($this->table)) {
+ return;
+ }
$this->setInviteConfig();
$this->cache = Cache::for('invitations');
- $this->table = CustomTable::for('invitations');
add_action('init', [$this, 'registerInvitationExecutors'], 5);
add_action('user_register', [$this, 'checkInvitation']);
@@ -31,6 +34,60 @@
add_filter(BASE . 'handle_bulk_operation', [$this, 'processOperation'], 10, 3);
}
+ public function defineTable():void
+ {
+ $terms = Registrar::getFeatured('invitable', 'term');
+ $roles = Features::forMembership()->get('can_invite');
+ if (empty($terms) && empty($roles)) {
+ return;
+ }
+
+ $table = CustomTable::for('invitations');
+ $columns = [
+ 'id' => 'bigint(20) unsigned NOT NULL AUTO_INCREMENT',
+ 'name' => 'varchar(255) NOT NULL',
+ 'email' => 'varchar(255) NOT NULL',
+ 'invitation_token' => 'varchar(255) NOT NULL',
+ 'invited_role' => 'varchar(50) NOT NULL COMMENT \'Role being invited to\'',
+ 'status' => 'ENUM(\'pending\',\'accepted\',\'rejected\',\'expired\',\'revoked\') DEFAULT \'pending\'',
+ 'inviters' => 'JSON NOT NULL COMMENT \'Array of {user_id, invited_at}\'',
+ 'new_user_id' => $table->getUserIDType().' DEFAULT NULL',
+ 'expires_at' => 'datetime NOT NULL',
+ 'accepted_at' => 'datetime DEFAULT NULL',
+ 'created_at' => 'datetime NOT NULL DEFAULT CURRENT_TIMESTAMP',
+ 'updated_at' => 'datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'
+ ];
+
+ foreach ($terms as $tax) {
+ $columns["to_{$tax}"] = $table->getTermIDType().' DEFAULT NULL';
+ }
+ $table->setColumns($columns);
+
+
+ $table->setKeys([
+ ['key' => 'PRIMARY', 'value' => '(`id`)'],
+ ['key' => 'UNIQUE KEY', 'value' => '`unique_email_role` (`email`, `invited_role`)'],
+ '`token_lookup` (`invitation_token`)',
+ '`status_expiry` (`status`, `expires_at`)',
+ '`role_status` (`invited_role`, `status`)',
+ '`email_status` (`email`, `status`)'
+ ]);
+ $constraints = [];
+ $base = BASE;
+ global $wpdb;
+ foreach ($terms as $tax) {
+ $constraints[] = "CONSTRAINT `{$base}invitations_{$tax}_fk` FOREIGN KEY (`to_{$tax}`) REFERENCES `{$wpdb->terms}` (`term_id`)
+ ON DELETE SET NULL";
+ }
+ $constraints[] = "CONSTRAINT `{$base}invitations_user_fk` FOREIGN KEY (`new_user_id`) REFERENCES `{$table->getUserTable()}` (`ID`)
+ ON DELETE SET NULL";
+
+ $table->setConstraints($constraints);
+
+ $table->defineTable();
+ $this->table = $table;
+ }
+
protected function setInviteConfig():void
{
$this->inviteConfig = get_option(BASE.'invitation_config', [
--
Gitblit v1.10.0