| | |
| | | )); |
| | | |
| | | // Metadata updates |
| | | $registry->register('update_metadata', new TypeConfig( |
| | | $registry->register('update_image_meta', new TypeConfig( |
| | | executor: $executor |
| | | )); |
| | | |
| | |
| | | try { |
| | | $data = $request->get_params(); |
| | | |
| | | // Validate user permissions |
| | | if (!$this->userCheck($data['user'])) { |
| | | return $this->sendResponse( |
| | | false, |
| | | ['error_code' => 'invalid_user'], |
| | | 'Invalid user specified' |
| | | ); |
| | | } |
| | | error_log('Received data for meta change: '.print_r($data, true)); |
| | | |
| | | |
| | | $items = $data['items']??false; |
| | | if (!$items) { |
| | |
| | | } |
| | | $pending = []; |
| | | $attachments = array_filter($items, function ($item) { |
| | | return is_numeric($item); |
| | | }, ARRAY_FILTER_USE_KEY); |
| | | if (count($attachments) !== count($items)) { |
| | | $pending = array_filter($items, function ($item) { |
| | | return !is_numeric($item); |
| | | }, ARRAY_FILTER_USE_KEY); |
| | | } |
| | | return array_key_exists('attachmentId', $item) || array_key_exists('uploadId', $item); |
| | | }); |
| | | |
| | | |
| | | if (!empty($attachments)) { |
| | | // Phase 2B: Direct attachment update (images already processed) |
| | | return $this->updateMeta($attachments, $data['user']); |
| | | error_log('Attachments: '.print_r($attachments, true)); |
| | | return $this->queueMetaUpdate($attachments, $data['user']); |
| | | } |
| | | elseif (!empty($pending)) { |
| | | // Phase 2A: Queue metadata update with dependency on upload operation |
| | | return $this->queueMetaUpdate($pending, $data['user']); |
| | | } |
| | | |
| | | |
| | | return $this->sendResponse( |
| | | false, |
| | |
| | | { |
| | | $updated_count = 0; |
| | | $errors = []; |
| | | |
| | | foreach ($data as $attachment_id => $info) { |
| | | $ids = []; |
| | | foreach ($data as $info) { |
| | | try { |
| | | $attachment_id = $info['attachmentId']; |
| | | error_log('Updating attachment ID:'.print_r($attachment_id,true)); |
| | | $ids[] = $attachment_id; |
| | | unset($info['attachmentId']); |
| | | // Verify attachment exists and user has permission |
| | | if (!$this->verifyAttachmentAccess($attachment_id, $user)) { |
| | | $errors[] = "No permission to edit attachment {$attachment_id}"; |
| | |
| | | [ |
| | | 'updated_count' => $updated_count, |
| | | 'errors' => $errors, |
| | | 'attachment_ids' => $data['attachment_ids'] |
| | | 'attachment_ids' => $ids |
| | | ], |
| | | $updated_count > 0 ? |
| | | "Updated metadata for {$updated_count} attachment(s)" : |
| | |
| | | $errors = []; |
| | | $original = count($data); |
| | | foreach ($data as $uploadID => $info) { |
| | | if (!array_key_exists('depends_on', $info)) { |
| | | unset($data[$uploadID]); |
| | | $errors[$uploadID] = $info; |
| | | continue; |
| | | } |
| | | if (!in_array($info['depends_on'], $depends_on)) { |
| | | if (array_key_exists('depends_on', $info) && !in_array($info['depends_on'], $depends_on)) { |
| | | $depends_on[] = $info['depends_on']; |
| | | } |
| | | } |
| | | $operationID = $queue->queueOperation( |
| | | 'update_metadata', |
| | | 'update_image_meta', |
| | | $user, |
| | | $data, |
| | | [ |
| | | 'depends_on' => $depends_on, |
| | | 'priority' => 'medium', |
| | | ] |
| | | ); |
| | | |
| | |
| | | $errors = []; |
| | | foreach ($operation->depends_on as $dependency) { |
| | | $operationData = JVB()->queue()->getOperation($dependency); |
| | | if (!$operationData || $operationData->status !== 'completed') { |
| | | if (!$operationData || $operationData->state !== 'completed') { |
| | | throw new Exception('Original upload operation not found or not completed'); |
| | | } |
| | | |
| | |
| | | protected function applyMeta(int $attachment_id, array $metadata): void |
| | | { |
| | | // Update alt text |
| | | if (!empty($metadata['alt'])) { |
| | | update_post_meta($attachment_id, '_wp_attachment_image_alt', sanitize_text_field($metadata['alt'])); |
| | | if (!empty($metadata['image-alt-text'])) { |
| | | update_post_meta($attachment_id, '_wp_attachment_image_alt', sanitize_text_field($metadata['image-alt-text'])); |
| | | } |
| | | $postUpdates = []; |
| | | // Update title |
| | | if (!empty($metadata['title'])) { |
| | | $postUpdates['post_title'] = $metadata['title']; |
| | | if (!empty($metadata['image-title'])) { |
| | | $postUpdates['post_title'] = $metadata['image-title']; |
| | | } |
| | | |
| | | // Update caption |
| | | if (!empty($metadata['caption'])) { |
| | | $postUpdates['post_excerpt'] = sanitize_textarea_field($metadata['caption']); |
| | | if (!empty($metadata['image-caption'])) { |
| | | $postUpdates['post_excerpt'] = sanitize_textarea_field($metadata['image-caption']); |
| | | } |
| | | |
| | | if (!empty($postUpdates)) { |