From 772462eeca3002a1d52508aeba485aab2b4742ad Mon Sep 17 00:00:00 2001
From: Jake Vanderwerf <get@jakevanderwerf.ca>
Date: Tue, 03 Mar 2026 19:06:19 +0000
Subject: [PATCH] =MAJOR OVERHAUL. Likely should have made a new branch ages ago. Key changes: Registrar.php is the base for custom post types, taxonomies, and user roles. Replaces JVB_CONTENT, JVB_TAXONOMY, and JVB_USER constants, eliminates most of Features.php (except for JVB_SITE, JVB_MEMBERSHIP), and has built in sanitizing and validation via sub-classes. Also started a major overhaul of the Schema output. Created a shit ton of property traits and classes to help sanitize and ensure proper data for different schema types. Still a bunch to do, but better to be starting committing changes here on this other branch.

---
 inc/rest/routes/UploadRoutes.php |   50 ++++++++++++++++++++++++++++----------------------
 1 files changed, 28 insertions(+), 22 deletions(-)

diff --git a/inc/rest/routes/UploadRoutes.php b/inc/rest/routes/UploadRoutes.php
index 67183ba..e46aa84 100644
--- a/inc/rest/routes/UploadRoutes.php
+++ b/inc/rest/routes/UploadRoutes.php
@@ -2,13 +2,14 @@
 namespace JVBase\rest\routes;
 
 use JVBase\managers\queue\executors\UploadExecutor;
+use JVBase\managers\queue\mergers\UploadMerger;
 use JVBase\managers\queue\TypeConfig;
+use JVBase\registrar\Registrar;
 use JVBase\rest\PermissionHandler;
 use JVBase\rest\Rest;
 use JVBase\meta\Meta;
 use JVBase\managers\UploadManager;
 use JVBase\rest\Route;
-use JVBase\utility\Features;
 use WP_REST_Request;
 use WP_REST_Response;
 use WP_Error;
@@ -34,9 +35,11 @@
 	{
 		$registry = JVB()->queue()->registry();
 		$executor = new UploadExecutor();
+		$merger = new UploadMerger('secured_files');
 
 		// Image uploads - chunked at 5 files
 		$registry->register('image_upload', new TypeConfig(
+			mergeable: $merger,
 			executor: $executor,
 			chunkKey: 'secured_files',
 			chunkSize: 3
@@ -44,6 +47,7 @@
 
 		// Video uploads - one at a time (heavy processing)
 		$registry->register('video_upload', new TypeConfig(
+			mergeable: $merger,
 			executor: $executor,
 			chunkKey: 'secured_files',
 			chunkSize: 1
@@ -51,6 +55,7 @@
 
 		// Document uploads - chunked at 10
 		$registry->register('document_upload', new TypeConfig(
+			mergeable: $merger,
 			executor: $executor,
 			chunkKey: 'secured_files',
 			chunkSize: 5
@@ -143,7 +148,7 @@
 				// Post Type/Taxonomy
 				case 'content':
 					$key = str_replace('-', '_', $key);
-					if ($value === 'options' || array_key_exists($value, JVB_CONTENT) || Features::forTaxonomy($key)->has('is_content')) {
+					if ($value === 'options' || array_key_exists($value, Registrar::getRegistered('post')) || Registrar::getInstance($key)->hasFeature('is_content')??false) {
 						$args['content'] = $value;
 					}
 					break;
@@ -414,24 +419,25 @@
 
 		error_log('queuedProcessing operation: '.print_r($queuedProcessing, true));
 
+		$uploadOpId = $queuedProcessing['operation_id'];
+
 		if ($args['mode'] !== 'selection') {
-			$dependencies = [$args['upload']];
 
-			error_log('Queueing attach to upload with id: '.print_r($args['id'], true));
-			error_log('And dependent on: '.print_r($dependencies, true));
-			error_log('Attaching args: '.print_r($args, true));
-			$attachingOp = JVB()->queue()->queueOperation(
-				'attach_upload_to_content',
-				$args['user'],
-				$args,
-				[
-					'priority'      => 'high',
-					'operation_id'  => $args['id'],
-					'depends_on'    => $dependencies
-				]
-			);
-
-			error_log('queued attaching operation: '.print_r($attachingOp, true));
+			// Only create attach_upload_to_content if the upload was NOT merged.
+			// When merged, the original upload's attach_upload_to_content
+			// will handle all files after the merged image_upload completes.
+			if (!$queuedProcessing['updated_existing']) {
+				JVB()->queue()->queueOperation(
+					'attach_upload_to_content',
+					$args['user'],
+					$args,
+					[
+						'priority'      => 'high',
+						'operation_id'  => $args['id'],
+						'depends_on'    => [$uploadOpId]
+					]
+				);
+			}
 		}
 
 		JVB()->queue()->queueOperation(
@@ -445,7 +451,7 @@
 				'priority'      => 'low',
 				'chunk_size'    => 5,
 				'chunk_key'     => 'files',
-				'depends_on'    => $args['upload']
+				'depends_on'    => [$uploadOpId]
 			]
 		);
 
@@ -1084,9 +1090,9 @@
 		if (!empty($args['content']) && !empty($args['field_name'])) {
 			$content_type = $args['content'];
 			$field_name = $args['field_name'];
-
-			if (array_key_exists($content_type, JVB_CONTENT)) {
-				$content_fields = JVB_CONTENT[$content_type]['fields'] ?? [];
+			$registrar = Registrar::getInstance($content_type);
+			if ($registrar) {
+				$content_fields = $registrar->getFields();
 				if (array_key_exists($field_name, $content_fields)) {
 					$field_def = $content_fields[$field_name];
 

--
Gitblit v1.10.0