| | |
| | | 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; |
| | |
| | | { |
| | | $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: 5 |
| | | chunkSize: 3 |
| | | )); |
| | | |
| | | // Video uploads - one at a time (heavy processing) |
| | | $registry->register('video_upload', new TypeConfig( |
| | | mergeable: $merger, |
| | | executor: $executor, |
| | | chunkKey: 'secured_files', |
| | | chunkSize: 1 |
| | |
| | | |
| | | // Document uploads - chunked at 10 |
| | | $registry->register('document_upload', new TypeConfig( |
| | | mergeable: $merger, |
| | | executor: $executor, |
| | | chunkKey: 'secured_files', |
| | | chunkSize: 10 |
| | | chunkSize: 5 |
| | | )); |
| | | |
| | | // Metadata updates |
| | |
| | | ->rateLimit(30) |
| | | ->args([ |
| | | 'user' => 'int|required', |
| | | 'items' => 'array|required' |
| | | 'items' => 'array|required', |
| | | 'id' => 'string' |
| | | ]) |
| | | ->register(); |
| | | } |
| | |
| | | { |
| | | $data = $request->get_params(); |
| | | $args = []; |
| | | $registrar = Registrar::getInstance($data['content']??''); |
| | | |
| | | foreach ($data as $key => $value) { |
| | | switch ($key) { |
| | | case 'depends_on': |
| | |
| | | case 'item_id': |
| | | if (is_numeric($value)) { |
| | | $args['item_id'] = absint($value); |
| | | if (!array_key_exists('post_id', $args)) { |
| | | $args['post_id'] = absint($value); |
| | | if ($registrar) { |
| | | switch ($registrar->getType()) { |
| | | case 'post': |
| | | $args['post_id'] = absint($value); |
| | | break; |
| | | case 'term': |
| | | $args['term_id'] = absint($value); |
| | | break; |
| | | case 'user': |
| | | $args['user_id'] = absint($value); |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | break; |
| | | // Post Type/Taxonomy |
| | | case 'content': |
| | | $key = str_replace('-', '_', $key); |
| | | if ($value === 'options' || array_key_exists($value, JVB_CONTENT) || Features::forTaxonomy($key)->has('is_content')) { |
| | | $value = str_replace('-', '_', $value); |
| | | if ($value === 'options' || $registrar) { |
| | | $args['content'] = $value; |
| | | } |
| | | break; |
| | |
| | | $chunkSize = 10; |
| | | } |
| | | |
| | | JVB()->queue()->queueOperation( |
| | | error_log('Queueing Operation: '.print_r($operation_type, true)); |
| | | error_log('With ID: '.print_r($args['upload'], true)); |
| | | $queuedProcessing = JVB()->queue()->queueOperation( |
| | | $operation_type, |
| | | $args['user'], |
| | | array_merge( |
| | |
| | | ] |
| | | ); |
| | | |
| | | if ($args['mode'] !== 'selection') { |
| | | $dependencies = [$args['upload']]; |
| | | if (!empty($args['depends_on'])) { |
| | | $dependencies[] = $args['depends_on']; |
| | | } |
| | | error_log('queuedProcessing operation: '.print_r($queuedProcessing, true)); |
| | | |
| | | JVB()->queue()->queueOperation( |
| | | 'attach_upload_to_content', |
| | | $args['user'], |
| | | $args, |
| | | [ |
| | | 'priority' => 'high', |
| | | 'operation_id' => $args['id'], |
| | | 'depends_on' => $dependencies |
| | | ] |
| | | ); |
| | | $uploadOpId = $queuedProcessing['operation_id']; |
| | | |
| | | if ($args['mode'] !== 'selection') { |
| | | |
| | | // 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( |
| | |
| | | 'priority' => 'low', |
| | | 'chunk_size' => 5, |
| | | 'chunk_key' => 'files', |
| | | 'depends_on' => $args['upload'] |
| | | 'depends_on' => [$uploadOpId] |
| | | ] |
| | | ); |
| | | |
| | |
| | | |
| | | // Update with comma-separated string |
| | | $meta->set($data['field_name'], implode(',', $all_ids)); |
| | | $meta->save(); |
| | | } |
| | | |
| | | /** |
| | |
| | | |
| | | if (!empty($attachments)) { |
| | | error_log('Attachments: '.print_r($attachments, true)); |
| | | return $this->queueMetaUpdate($attachments, $data['user']); |
| | | return $this->queueMetaUpdate($attachments, absint($data['user']), sanitize_text_field($data['id']??'')); |
| | | } |
| | | |
| | | |
| | |
| | | /** |
| | | * Queue metadata update with dependency on upload operation |
| | | */ |
| | | protected function queueMetaUpdate(array $data, int $user): WP_REST_Response |
| | | protected function queueMetaUpdate(array $data, int $user, ?string $operationId = null): WP_REST_Response |
| | | { |
| | | $queue = JVB()->queue(); |
| | | $depends_on = []; |
| | |
| | | $depends_on[] = $info['depends_on']; |
| | | } |
| | | } |
| | | $queueData = [ |
| | | 'depends_on' => $depends_on, |
| | | ]; |
| | | if ($operationId) { |
| | | $queueData['operation_id'] = $operationId; |
| | | } |
| | | $operationID = $queue->queueOperation( |
| | | 'update_image_meta', |
| | | $user, |
| | | $data, |
| | | [ |
| | | 'depends_on' => $depends_on, |
| | | ] |
| | | $queueData |
| | | ); |
| | | |
| | | return $this->sendResponse( |
| | | true, |
| | | [ |
| | | 'operation_id' => $operationID, |
| | | 'operation_id' => $operationID['operation_id']??$operationId, |
| | | 'message' => "Successfully queued ".count($data)." of {$original} meta updates" |
| | | ], |
| | | 'Metadata update queued - will apply after upload completes' |
| | |
| | | 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]; |
| | | |