<?php
|
namespace JVBase\registrar\helpers;
|
|
use JVBase\managers\CustomTable;
|
|
if (!defined('ABSPATH')) {
|
exit;
|
}
|
|
class MakeTrackChanges {
|
protected string $slug;
|
protected string $based;
|
protected CustomTable $table;
|
public function __construct(string $slug) {
|
$this->slug = $slug;
|
$this->based = jvbCheckBase($slug);
|
$this->defineTables();
|
|
add_action('set_object_terms', [$this, 'trackHistory'], 10, 6);
|
}
|
public function defineTables():void
|
{
|
$table = CustomTable::for('history_'.$this->slug);
|
|
$table->setColumns([
|
'id' => 'bigint(20) unsigned NOT NULL AUTO_INCREMENT',
|
'user_id' => "{$table->getUserIDType()} NOT NULL",
|
'profile_id' => "{$table->getPostIDType()} NOT NULL",
|
'role' => 'varchar(255) NOT NULL',
|
'term_id' => "{$table->getTermIDType()} NOT NULL",
|
'start_date' => 'date DEFAULT NULL',
|
'end_date' => 'date DEFAULT NULL',
|
'locked' => 'tinyint(1) NOT NULL DEFAULT 0',
|
'created_at' => 'timestamp DEFAULT CURRENT_TIMESTAMP',
|
'updated_at' => 'timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP',
|
]);
|
|
$table->setKeys([
|
['key' => 'PRIMARY', 'value' => '(`id`)'],
|
['key' => 'UNIQUE', 'value' => '(`profile_id`, `term_id`, `start_date`)'],
|
'content_role (`term_id`, `role`)',
|
'user_id (`user_id`)',
|
'profile_id (`profile_id`)',
|
'term_id (`term_id`)',
|
]);
|
|
$base = BASE;
|
$table->setConstraints([
|
"CONSTRAINT `{$base}{$this->slug}_history_user` FOREIGN KEY (`user_id`)
|
REFERENCES `{$table->getUserTable()}` (`ID`) ON DELETE CASCADE",
|
"CONSTRAINT `{$base}{$this->slug}_history_profile` FOREIGN KEY (`profile_id`)
|
REFERENCES `{$table->getPostTable()}` (`ID`) ON DELETE CASCADE"
|
]);
|
|
$table->defineTable();
|
$this->table = $table;
|
}
|
|
public function trackHistory(int $object_id, array $terms, array $tt_ids, string $taxonomy, bool $append, array $old_tt_ids):void
|
{
|
if ($taxonomy !== $this->based) {
|
return;
|
}
|
|
$user = get_post_meta($object_id, BASE.'link', true);
|
if (empty($author)) {
|
$user = get_post($object_id)->post_author??false;
|
if (!$user) {
|
return;
|
}
|
}
|
$userObj = get_userdata($user);
|
if (!$userObj) {return;}
|
|
$role = jvbUserRole($user);
|
|
$new = array_diff($tt_ids, $old_tt_ids);
|
$old = array_diff($old_tt_ids, $new);
|
|
$this->table->transaction(
|
function() use ($new, $old, $role, $user, $object_id) {
|
foreach ($new as $newTerm) {
|
$termID = $this->getTermIDFromTTID($newTerm);
|
|
$this->table->findOrCreate([
|
'user_id' => $user,
|
'profile_id'=> $object_id,
|
'role' => $role,
|
'term_id' => $termID,
|
'locked' => 0
|
], [
|
'start_date' => date('Y-m-d')
|
]);
|
}
|
|
foreach ($old as $oldTerm) {
|
$termID = $this->getTermIDFromTTID($oldTerm);
|
|
$this->table->update(
|
[
|
'end_date' => date('Y-m-d'),
|
'locked' => 1
|
],
|
[
|
'user_id' => $user,
|
'profile_id'=> $object_id,
|
'term_id' => $termID,
|
'locked' => 0
|
]);
|
}
|
}
|
);
|
|
|
}
|
|
/**
|
* 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
|
));
|
}
|
}
|