Skip to content

Store taskprocessing output files with extension to ease mimtype guessing#61689

Open
marcelklehr wants to merge 7 commits into
masterfrom
feat/taskprocessing-output-files-with-mimetypes
Open

Store taskprocessing output files with extension to ease mimtype guessing#61689
marcelklehr wants to merge 7 commits into
masterfrom
feat/taskprocessing-output-files-with-mimetypes

Conversation

@marcelklehr

@marcelklehr marcelklehr commented Jul 1, 2026

Copy link
Copy Markdown
Member

Summary

Currently, we have to guess the mime type entirely from the data which is sometimes hard. With this we allow synchronous providers to hint the file extension and mime type.

Also adds some needed attributes.

TODO

  • How should we allow ex apps to pass this information?

Checklist

AI (if applicable)

  • The content of this PR was partly or fully generated using AI
…ype guessing

Signed-off-by: Marcel Klehr <mklehr@gmx.net>
@marcelklehr marcelklehr added this to the Nextcloud 35 milestone Jul 1, 2026
@marcelklehr marcelklehr requested a review from a team as a code owner July 1, 2026 11:29
@marcelklehr marcelklehr requested review from Altahrim and salmart-dev and removed request for a team July 1, 2026 11:29
@marcelklehr marcelklehr added the 2. developing Work in progress label Jul 1, 2026
Comment thread lib/public/TaskProcessing/EShapeType.php Outdated
Signed-off-by: Marcel Klehr <mklehr@gmx.net>
@marcelklehr marcelklehr force-pushed the feat/taskprocessing-output-files-with-mimetypes branch from a499488 to 944e422 Compare July 1, 2026 12:07
@marcelklehr marcelklehr requested review from Copilot and julien-nc July 1, 2026 12:08
@marcelklehr marcelklehr added 3. to review Waiting for reviews and removed 2. developing Work in progress labels Jul 1, 2026

@julien-nc julien-nc left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Lgtm 👍

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR extends the TaskProcessing public API and implementation to better handle “file-shaped” task outputs by allowing providers (and ExApps uploads) to influence stored output filenames via extensions, with the goal of improving MIME type detection downstream. It also annotates several public TaskProcessing interfaces/data objects with #[Implementable] / #[Consumable] attributes.

Changes:

  • Introduces OCP\TaskProcessing\FileShaped and updates synchronous provider return type annotations to allow returning FileShaped values.
  • Extends output validation (EShapeType::validateOutputWithFileData) and output encapsulation (Manager::encapsulateOutputFileData) to accept file-shaped outputs.
  • Appends file extensions when storing uploaded/provider output data in AppData, and adds Implementable/Consumable attributes to several public APIs.

Reviewed changes

Copilot reviewed 13 out of 13 changed files in this pull request and generated 14 comments.

Show a summary per file
File Description
lib/public/TaskProcessing/SynchronousProviderOptions.php Marks the options class as #[Consumable] for public API consumption.
lib/public/TaskProcessing/ShapeEnumValue.php Marks the DTO as #[Consumable].
lib/public/TaskProcessing/ShapeDescriptor.php Marks the DTO as #[Consumable].
lib/public/TaskProcessing/ITriggerableProvider.php Marks provider interface as #[Implementable] (but since metadata needs correction).
lib/public/TaskProcessing/ITaskType.php Marks task type interface as #[Implementable].
lib/public/TaskProcessing/ISynchronousProvider.php Marks interface as #[Implementable] and expands psalm return types to include FileShaped.
lib/public/TaskProcessing/ISynchronousOptionsAwareProvider.php Marks interface as #[Implementable] and expands psalm return types to include FileShaped.
lib/public/TaskProcessing/IProvider.php Marks provider interface as #[Implementable].
lib/public/TaskProcessing/IInternalTaskType.php Marks internal task type interface as #[Implementable] (minor formatting consistency).
lib/public/TaskProcessing/FileShaped.php Adds new public DTO to carry file-shaped output data + metadata (extension/mime type).
lib/public/TaskProcessing/EShapeType.php Updates output validation to allow FileShaped (but list validation currently has critical logic errors).
lib/private/TaskProcessing/Manager.php Stores file outputs using provided extensions (but list branch currently clears unrelated output keys and needs extension normalization).
core/Controller/TaskProcessingApiController.php Appends extension when storing ExApp uploaded files (needs extension sanitization/normalization).

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread lib/public/TaskProcessing/EShapeType.php Outdated
Comment thread lib/public/TaskProcessing/EShapeType.php Outdated
Comment thread lib/public/TaskProcessing/EShapeType.php Outdated
Comment thread lib/public/TaskProcessing/EShapeType.php Outdated
Comment thread lib/private/TaskProcessing/Manager.php
Comment thread lib/public/TaskProcessing/FileShaped.php
Comment thread lib/public/TaskProcessing/FileShaped.php Outdated
Comment thread lib/public/TaskProcessing/FileShaped.php Outdated
Comment thread lib/public/TaskProcessing/FileShaped.php Outdated
Comment on lines +1605 to +1613
if ($output[$key] instanceof FileShaped) {
$data = $output[$key]->getData();
$ext = $output[$key]->getExtension();
} else {
$data = $output[$key];
$ext = '';
}
/** @var SimpleFile $file */
$file = $folder->newFile(time() . '-' . rand(1, 100000), $output[$key]);
$file = $folder->newFile(time() . '-' . rand(1, 100000) . ($ext ? '.' . $ext : ''), $data);
marcelklehr and others added 4 commits July 1, 2026 14:22
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Marcel Klehr <mklehr@gmx.net>
Signed-off-by: Marcel Klehr <mklehr@gmx.net>
Signed-off-by: Marcel Klehr <mklehr@gmx.net>
…erty

Signed-off-by: Marcel Klehr <mklehr@gmx.net>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

3 participants