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