{"ref":"capability:attachments","page":"/capabilities/attachments","json":"/capabilities/attachments.json","generated":"2026-10-26","drafted_with_ai":true,"entity":{"id":"attachments","name":"Attachments","domain":"data-and-persistence","ecosystems":["cap","ui5","abap","btp"],"universal":false,"description":"Storing a file somebody uploaded next to the record it belongs to, and getting it back out — where the bytes actually live, who may read them, and what the UI shows while they are being scanned.","short":"Storing uploaded files next to the record they belong to","core_coverage":{"state":"core-and-community","assessed_at":"2026-09-27","relationship":"unassessed","what_core_does":"Built in: an element annotated `@Core.MediaType` is an OData media resource, held in the database as a `LargeBinary` or redirected to an external URL with `@Core.IsURL`, streamed on read, create and update, with the content type and the download filename set from the model. Nothing is installed for that. As packages: [@cap-js/attachments](artifact:cap-js-attachments) and [cds-feature-attachments](artifact:cap-java-cds-feature-attachments) add the Attachments aspect, database or Object Store storage and the Fiori annotations, and the SDM plugins store attachments in SAP Document Management repositories.","where_it_stops":"The built-in layer stops at one binary element: no metadata aspect, no storage beyond the database or a redirect URL, no malware scan, and in Node.js SQLite reads a LargeBinary whole rather than streaming it. The Node.js and Java SDM plugins exclude versioned repositories. In Node.js attachments, Fiori elements requires draft enablement; non-draft clients create metadata and upload content in separate requests.","note":"Scanning depends on configuration: Node.js attachments rejects uploads when scanning is enabled but no scanner is available; Java attachments marks files Clean when no scanner is available.","community_adds":"[cap-attachments-plus](artifact:cap-attachments-plus) documents storage in the application owner’s cloud account through BTP destinations; [sap-cap-sdm-plugin](artifact:vneecious-sap-cap-sdm-plugin) maps CDS fields to CMIS properties and exposes CMIS and administration clients. [@tklein1801/cap-js-attachments](artifact:tklein1801-cap-js-attachments) documents a draft-based attachment flow with shared Object Store tenant prefixes.","sources":[{"url":"https://cap.cloud.sap/docs/guides/services/media-data","title":"Serving Media Data — capire","checked":"2026-09-27","quote":"CAP provides out-of-the-box support for serving media and other binary data. Media data can be stored either directly in the database or in an external repository, and can be streamed to and from clients."},{"url":"https://cap.cloud.sap/docs/guides/services/media-data","title":"Serving Media Data — capire","checked":"2026-09-27","quote":"The media data is streamed automatically."},{"url":"https://cap.cloud.sap/docs/guides/services/media-data","title":"Serving Media Data — capire","checked":"2026-09-27","quote":"Please note, that SQLite doesn't support streaming. That means, that LargeBinary fields are read as a whole (not in chunks) and stored in memory, which can impact performance."},{"url":"https://cap.cloud.sap/docs/plugins/","title":"CAP plugins — Attachments and SAP Document Management","checked":"2026-09-17","quote":"For Java, use the package cds-feature-attachments. For Node.js, this is supported by the standard plugin."},{"url":"https://raw.githubusercontent.com/cap-js/sdm/ad13b61f21816ebead2d08264a74521cfb75846c/README.md","title":"cap-js/sdm — README","checked":"2026-09-17","quote":"Repository : This plugin does not support the use of versioned repositories."},{"url":"https://raw.githubusercontent.com/cap-java/sdm/673769f24ef66fd97daa6a6be41262d45065d3fe/README.md","title":"cap-java/sdm — README","checked":"2026-09-17","quote":"Repository : This plugin does not support the use of versioned repositories."},{"url":"https://raw.githubusercontent.com/cap-js/attachments/cdf7d5012d29c831aa46bb3fa6b3daeab622306c/README.md","title":"cap-js/attachments — README","checked":"2026-09-17","quote":"If you are not using SAP Fiori elements, draft enablement is not required."},{"url":"https://raw.githubusercontent.com/cap-js/attachments/cdf7d5012d29c831aa46bb3fa6b3daeab622306c/README.md","title":"cap-js/attachments — README","checked":"2026-09-17","quote":"For scenarios where the entity is not draft-enabled, for example [`tests/non-draft-request.http`](./tests/non-draft-request.http), separate HTTP requests for metadata creation and asset uploading need to be performed manually."},{"url":"https://raw.githubusercontent.com/cap-js/attachments/cdf7d5012d29c831aa46bb3fa6b3daeab622306c/README.md","title":"cap-js/attachments — README","checked":"2026-09-17","quote":"If there is no malware scanner available and the scanner is not disabled, then the upload will fail."},{"url":"https://raw.githubusercontent.com/cap-java/cds-feature-attachments/302f61c8bb76a0f54f43482ad91d89bf7dc5540f/README.md","title":"cap-java/cds-feature-attachments — README","checked":"2026-09-17","quote":"If there is no malware scanner available, the attachments are automatically marked as `Clean`."}]},"history":[{"date":"2026-08-31","field":"core_coverage.state","from":"left-open-on-purpose","to":"core-and-community","reason":"States renamed to describe who is present rather than to interpret intent. left-open-on-purpose asserted a motive; core-and-community states a fact, with relationship carrying the intent separately."},{"date":"2026-09-10","field":"ecosystems","from":"cap","to":"cap, ui5","reason":"Artifacts that answer this concern sat behind the UI5 door with no tile to appear under, so browse counted them and rendered nothing. The concern is one a UI5 developer actually decides there, which is the test for opening a door rather than trimming a serves claim."},{"date":"2026-09-13","field":"name","from":"Attachments and documents","to":"Attachments","reason":"The map draws every capability as one tile, and a name that spells out its second half ran to three lines at a size nobody could read. The id already carried the short name; the name now matches it. The concern is unchanged: the description and the coverage say what it spans."},{"date":"2026-09-14","field":"coverage_by_flavor.web-components","from":null,"to":"core-only","reason":"The UI5 Web Components library ships FileUploader (base package) and UploadCollection (fiori package) itself; no artifact behind the UI5 door states the web-components flavor for this capability, so this reads the framework's own source directly rather than an artifact edge."},{"date":"2026-09-14","field":"framing_by_flavor.web-components","from":null,"to":"added — native elements, not a third-party control library","reason":"The web-components flavor's answer is SAP's own FileUploader and UploadCollection rather than ui5-upload-controls, the independent library the ecosystem-level framing describes, different enough from the freestyle framing to need its own paragraph."},{"date":"2026-09-14","field":"coverage_by_ecosystem.ui5","from":"community-only","to":"core-and-community","reason":"[@ui5/webcomponents](artifact:ui5-webcomponents), sap-official, gains a provides edge to this capability for FileUploader and UploadCollection, and SAPUI5 itself ships UploadSet plus annotation-driven upload in Fiori elements. With a sap-official UI5 provider present alongside the independent [ui5-upload-controls](artifact:miyasuta-ui5-upload-controls), community-only no longer describes who is present; narrow-by-design because both the Fiori elements docs and UI5 Web Components' own source state the backend wiring is left to the application."},{"date":"2026-09-14","field":"ecosystems","from":"cap, ui5","to":"cap, ui5, abap","reason":"AttachmentCommentODataService is an ABAP OData service that uploads, downloads and deletes attachments against a record, which is this concern on the ABAP door."},{"date":"2026-09-14","field":"coverage_by_ecosystem.abap","from":null,"to":"core-and-community","reason":"Generic Object Services attach files to a business object inside the system, and AttachmentCommentODataService serves them to a browser UI; no source states how the two came to sit side by side, so the relationship is unassessed."},{"date":"2026-09-14","field":"framing_by_ecosystem.abap","from":null,"to":"added — a file on a business object, attached inside the system and served over OData","reason":"The ABAP door opened with Generic Object Services and AttachmentCommentODataService, and what the concern is there differs from the CAP and UI5 framings: the file belongs to a business object in the system rather than to an entity a service defines."},{"date":"2026-09-15","field":"ecosystems","from":"cap, ui5, abap","to":"cap, ui5, abap, btp","reason":"Widened rather than forked: storing a file that belongs to a business application is the same concern on BTP. Done so [SAP Document Management service, integration option](artifact:btp-document-management-integration), staged in intake-20260915-btp-services, can provide it."},{"date":"2026-09-15","field":"coverage_by_ecosystem.btp","from":null,"to":"core-only","reason":"The one provider behind the BTP door, [SAP Document Management service, integration option](artifact:btp-document-management-integration), is SAP's own; its Discovery Center record describes APIs and a UI5 component an application builds its document management on."},{"date":"2026-09-15","field":"framing_by_ecosystem.btp","from":null,"to":"a file in a document repository the application connects to","reason":"On BTP the concern is answered by a repository service with folders and versions, which differs from the CAP, UI5 and ABAP framings of a file stored against an entity or a business object."},{"date":"2026-09-17","field":"core_coverage.what_core_does","from":"An official plugin for attachments, and a second for keeping them in SAP Document Management instead. Annotate an entity, get an upload control and a place for the bytes without writing a handler.","to":"CAP ships attachment packages for Node.js and Java that handle files through an Attachments aspect, with database or Object Store storage and Fiori annotations. Its SDM plugins store attachments in SAP Document Management repositories.","reason":"Replace unsupported migration/UI boundary with sourced implementation limits; keep community additions separate. Add four CAP-scoped comparison questions and preserve other ecosystems/flavors."},{"date":"2026-09-27","field":"core_coverage.what_core_does","from":"CAP ships attachment packages for Node.js and Java that handle files through an …","to":"built-in media resources first, then SAP's packages","reason":"The paragraph opened with SAP's packages and never said that the runtime serves a @Core.MediaType element with nothing installed. capire's Serving Media Data page is that built-in layer, cited by pagination-and-streaming and not here. Two deliveries, said apart (docs/concepts/sap-ships-and-documents.md)."},{"date":"2026-10-14","field":"coverage_by_ecosystem.ui5.sources, coverage_by_flavor.web-components, framing_by_flavor.web-components","from":"github.com/SAP/ui5-webcomponents","to":"github.com/UI5/webcomponents","reason":"The five citations and four links to FileUploader.ts and UploadCollection.ts used the organisation the project has left, which now answers only as a redirect. Both files were opened at the new address on 2026-10-14 and carry the sentences quoted here, so every claim and every quote stands as written and only the addresses and their titles moved; the checked dates stay at the day each quote was last read in full."},{"date":"2026-10-26","field":"coverage_by_ecosystem.ui5.community_adds","from":"binds a control directly to a CAP service that stores the files, the one point in the ecosystem where the storage decision moves off the UI5 side.","to":"binds a control directly to a CAP service that stores the files, so the storage decision moves off the UI5 side.","reason":"Reassessed against the graph (check:capabilities): removes a count-like claim about how many places do this."},{"date":"2026-10-26","field":"coverage_by_ecosystem.btp.what_core_does, coverage_by_ecosystem.btp.where_it_stops, coverage_by_ecosystem.btp.sources","from":"SAP ships document storage for business applications on BTP as the integration option ... At a document management layer the application builds ...","to":"adds [SAP Document Management service, application option](artifact:btp-document-management-application), a standalone web application over the same repository options; where_it_stops names both","reason":"Reassessed against the graph (check:capabilities): the application option is a SAP-official BTP provider newer than the block that the text never named. The state stays core-only. Sourced from its Discovery Center record, retrieved 2026-10-26."},{"date":"2026-10-26","field":"coverage_by_flavor.web-components.what_core_does","from":"splits file handling into two elements rather than one plugin:","to":"splits file handling into two elements:","reason":"Reassessed against the graph (check:capabilities): drops a count-like contrast with a plugin the flavor does not have."}],"changed_in":[{"version":"@cap-js/attachments 1.0.0","date":"2024-03-28","what_changed":"The core gained a dedicated attachments plugin. Before it, putting a file next to a record meant modelling a LargeBinary element with @Core.MediaType and hand-writing upload, storage and retrieval handlers; after it, annotating an entity with the Attachments aspect gives upload, SAP Object Store storage and retrieval without hand-written handlers.","invalidates":"Guidance that treats attachment storage as something you always build yourself on top of LargeBinary. That was the only approach before March 2024; LargeBinary is still the mechanism underneath, but the plugin is now the point of entry.","source":{"url":"https://github.com/cap-js/attachments/releases/tag/v1.0.0","title":"cap-js/attachments — Release v1.0.0","checked":"2026-09-08","quote":"Initial release that provides out-of-the box asset storage and handling by using an aspect Attachments."},"applies_to":{"ecosystems":["cap"]}},{"version":"@cap-js/attachments 1.1.0","date":"2024-05-28","what_changed":"The plugin gained automatic malware scanning of uploaded files via SAP Malware Scanning Service, with a status per attachment (Unscanned, Scanning, Infected, Clean, Failed). Before it, a file accepted by the plugin was stored and served with no scan of its contents.","invalidates":"Advice that malware scanning has to be wired up separately when using the plugin. Since May 2024 it runs by default outside the development profile, and is opted out of rather than into.","source":{"url":"https://github.com/cap-js/attachments/releases/tag/v1.1.0","title":"cap-js/attachments — Release v1.1.0","checked":"2026-09-08","quote":"Attachments are scanned for malware using SAP Malware Scanning Service."},"applies_to":{"ecosystems":["cap"]}},{"version":"@cap-js/sdm 1.0.0","date":"2024-06-26","what_changed":"A second official plugin arrived for the case where the bytes have to live in SAP Document Management rather than a bucket. Before it, the object-store plugin was the only officially supported destination for attachment bytes; after it, the same create, open, delete, rename, virus-scan and draft handling is available against an SDM repository instead.","invalidates":"Guidance that treats @cap-js/attachments' object-store backend as the only officially supported place attachment bytes can live.","source":{"url":"https://github.com/cap-js/sdm/releases/tag/v1.0.0","title":"cap-js/sdm — Release v1.0.0","checked":"2026-09-08","quote":"Virus scanning : Provides the capability to support virus scan for virus scan enabled repositories."},"applies_to":{"ecosystems":["cap"]}}],"coverage_by_ecosystem":{"ui5":{"state":"core-and-community","assessed_at":"2026-09-14","what_core_does":"SAPUI5's own [UploadSet](https://raw.githubusercontent.com/SAP-docs/sapui5/main/docs/01_Whats-New/what-s-new-in-sapui5-1-88-e15a206.md) control replaced the deprecated UploadCollection as of version 1.88, and a Fiori elements list report wires the same upload, download and delete behaviour onto a table from three OData V4 annotations, `Edm.Stream`, `UI.LineItem` and `UI.MediaResource`, with no control to place by hand. [@ui5/webcomponents](artifact:ui5-webcomponents) answers the same concern for the web-components flavor: FileUploader opens the picker, UploadCollection lists what was picked.","where_it_stops":"All three stop at the file itself: Fiori elements' own docs put the virus scan and the size and MIME-type checks on the back-end service, and name [@cap-js/attachments](artifact:cap-js-attachments) as the plug-in to define the entity with; UI5 Web Components' UploadCollection calls its own drop handling \"up to the application developer\". None of the core's controls store, scan or serve the bytes.","sources":[{"url":"https://raw.githubusercontent.com/SAP-docs/sapui5/main/docs/01_Whats-New/what-s-new-in-sapui5-1-88-e15a206.md","title":"What's New in SAPUI5 1.88 — SAP-docs/sapui5","checked":"2026-09-14","quote":"As of version 1.88, the `UploadCollection` control is deprecated. You can use the `UploadSet` (`sap.m.upload.UploadSet`) control that has better handling of headers and requests, unified behavior of instant and deferred uploads, as well as improved progress indication."},{"url":"https://ui5.sap.com/docs/topics/d59dbec411f04a64bd6d6dda898fdc84.html","title":"Enabling the Upload Functionality — SAPUI5 SDK","checked":"2026-09-14","quote":"The entity type must have an `Edm.Stream` type property that is used to store the uploaded file."},{"url":"https://ui5.sap.com/docs/topics/d59dbec411f04a64bd6d6dda898fdc84.html","title":"Enabling the Upload Functionality — SAPUI5 SDK (security)","checked":"2026-09-14","quote":"The back-end service framework must ensure a virus scan and other security measures, such as maximum file size limitations and MIME-type restrictions, are in place."},{"url":"https://ui5.sap.com/docs/topics/d59dbec411f04a64bd6d6dda898fdc84.html","title":"Enabling the Upload Functionality — SAPUI5 SDK (CAP annotation)","checked":"2026-09-14","quote":"You can use the `Attachments` plug-in to define the entity type. For more information about the plug-in, see [Attachments](https://cap.cloud.sap/docs/plugins/#attachments)."},{"url":"https://github.com/UI5/webcomponents/blob/main/packages/fiori/src/UploadCollection.ts","title":"UI5/webcomponents — UploadCollection.ts (drag-and-drop handling)","checked":"2026-09-14","quote":"It is up to the application developer to add handler for `drop` event and handle it. `ui5-upload-collection` only displays an overlay."}],"relationship":"narrow-by-design","community_adds":"[ui5-upload-controls](artifact:miyasuta-ui5-upload-controls) binds a control directly to a CAP service that stores the files, so the storage decision moves off the UI5 side."},"abap":{"state":"core-and-community","assessed_at":"2026-09-14","what_core_does":"Generic Object Services give a business object a toolbox whose functions include notes and attachments created against the object; the object services only need to know that the object exists, and the object has to be published for them before they can be used.","where_it_stops":"At the toolbox, which the page describes as opened from a symbol in the title bar of the object being edited. Serving the same files to a browser UI over OData is outside what it describes.","relationship":"unassessed","note":"Checked against the SAP NetWeaver 7.5 documentation of Generic Object Services; an attachment facility for ABAP Cloud was not checked.","sources":[{"url":"https://help.sap.com/doc/saphelp_nw75/7.5.5/en-US/4d/078bd464e05dc6e10000000a42189c/content.htm","title":"SAP Help — Generic Object Services (BC-SRV-GBT)","checked":"2026-09-14","quote":"Creation of attachments to an object"},{"url":"https://help.sap.com/doc/saphelp_nw75/7.5.5/en-US/4d/078bd464e05dc6e10000000a42189c/content.htm","title":"SAP Help — Generic Object Services (BC-SRV-GBT)","checked":"2026-09-14","quote":"In order to allow the generic object services to be used for a business object, the object must be published."}]},"btp":{"state":"core-only","assessed_at":"2026-09-15","what_core_does":"SAP ships document storage for business applications on BTP as [SAP Document Management service, integration option](artifact:btp-document-management-integration): APIs and a reusable UI5 component that keep files in a folder hierarchy with versions and status, in SAP's own repository option or in a CMIS-compliant repository the customer connects. [SAP Document Management service, application option](artifact:btp-document-management-application) is the standalone web application for the same files, with file and folder management, viewers, versioning and status.","where_it_stops":"At a document management layer: the integration option is built into an application through its APIs or UI5 component, and attaching a document to that application's own records is the application's work. The application option is a separate web application, not a component of another application.","sources":[{"url":"https://discovery-center.cloud.sap/servicecatalog/api/v1/services/db9e77b0-2fd1-429d-9557-923acf96fc9d","title":"SAP Discovery Center — SAP Document Management service, integration option","checked":"2026-09-15","quote":"Document Management Service, Integration Option lets you build document management capabilities for your business applications using the integration component or the easy-to-use, reusable UI component."},{"url":"https://discovery-center.cloud.sap/servicecatalog/api/v1/services/db9e77b0-2fd1-429d-9557-923acf96fc9d","title":"SAP Discovery Center — SAP Document Management service, integration option","checked":"2026-09-15","quote":"Leverage the APIs to build a customized document management layer on your on-premise or cloud applications."},{"url":"https://discovery-center.cloud.sap/servicecatalog/api/v1/services/db9e77b0-2fd1-429d-9557-923acf96fc9d","title":"SAP Discovery Center — SAP Document Management service, integration option","checked":"2026-09-15","quote":"Embed an easy-to-use, UI5-based, reusable component into your application for document management scenarios."},{"url":"https://discovery-center.cloud.sap/servicecatalog/api/v1/services/db9e77b0-2fd1-429d-9557-923acf96fc9d","title":"SAP Discovery Center — SAP Document Management service, integration option","checked":"2026-09-15","quote":"Organize your enterprise content with the document management capabilities like file and folder hierarchy, versioning, status management, etc."},{"url":"https://discovery-center.cloud.sap/servicecatalog/api/v1/services/db9e77b0-2fd1-429d-9557-923acf96fc9d","title":"SAP Discovery Center — SAP Document Management service, integration option","checked":"2026-09-15","quote":"Use Document Management Service, Repository Option to securely store and manage your business documents and attachments."},{"url":"https://discovery-center.cloud.sap/servicecatalog/api/v1/services/db9e77b0-2fd1-429d-9557-923acf96fc9d","title":"SAP Discovery Center — SAP Document Management service, integration option","checked":"2026-09-15","quote":"Bring your choice of CMIS-compliant, on-premise or cloud repository to connect with Document Management Service and leverage the capabilities of the service."},{"url":"https://discovery-center.cloud.sap/servicecatalog/api/v1/services/05e5c025-fcb9-4953-8489-7018aefe5aa7","title":"SAP Discovery Center — SAP Document Management service, application option","checked":"2026-10-26","quote":"Document Management Service, Application Option is a standalone, ready-to-use web application"}]}},"framing_by_ecosystem":{"ui5":{"description":"The upload and download half of a file attached to a record. [ui5-upload-controls](artifact:miyasuta-ui5-upload-controls) is a reusable control library built to sit in front of a CAP service that stores the files, so the storage decision stays on the CAP door and the interaction lives here."},"abap":{"description":"On ABAP a file belongs to a business object: Generic Object Services attach it inside the system, and [AttachmentCommentODataService](artifact:aditheos-attachmentcommentodataservice), built on an ECC 6.0 system, serves upload, download and delete, with comments beside them, to a SAPUI5 app over OData."},"btp":{"description":"On BTP an attachment can live in a document repository outside the application's database: [SAP Document Management service, integration option](artifact:btp-document-management-integration) keeps it in folders with versions, in SAP's repository option or in a CMIS-compliant repository the customer connects."}},"coverage_by_flavor":{"web-components":{"state":"core-only","assessed_at":"2026-09-14","what_core_does":"UI5 Web Components splits file handling into two elements: [FileUploader](https://github.com/UI5/webcomponents/blob/main/packages/main/src/FileUploader.ts), in the base `@ui5/webcomponents` package, opens the browser's file picker and puts the chosen files on a `files` property. [UploadCollection](https://github.com/UI5/webcomponents/blob/main/packages/fiori/src/UploadCollection.ts), in `@ui5/webcomponents-fiori`, lists them with a drag-and-drop overlay and can show files already uploaded.","where_it_stops":"Neither component makes the upload request itself: FileUploader only exposes the files a user picked, and UploadCollection's own comments call the drop handling \"up to the application developer\". Where the bytes land, who may read them and any scan status are left entirely to whatever service the app wires the upload to.","sources":[{"url":"https://github.com/UI5/webcomponents/blob/main/packages/main/src/FileUploader.ts","title":"UI5/webcomponents — FileUploader.ts","checked":"2026-09-14","quote":"The `ui5-file-uploader` opens a file explorer dialog and enables users to upload files. The component consists of input field, but you can provide an HTML element by your choice to trigger the file upload, by using the default slot."},{"url":"https://github.com/UI5/webcomponents/blob/main/packages/fiori/src/UploadCollection.ts","title":"UI5/webcomponents — UploadCollection.ts","checked":"2026-09-14","quote":"This component allows you to represent files before uploading them to a server, with the help of `ui5-upload-collection-item`. It also allows you to show already uploaded files."},{"url":"https://github.com/UI5/webcomponents/blob/main/packages/fiori/src/UploadCollection.ts","title":"UI5/webcomponents — UploadCollection.ts (drag-and-drop handling)","checked":"2026-09-14","quote":"It is up to the application developer to add handler for `drop` event and handle it. `ui5-upload-collection` only displays an overlay."}]}},"framing_by_flavor":{"web-components":{"description":"Native custom elements rather than a control library built for someone else's app: [FileUploader](https://github.com/UI5/webcomponents/blob/main/packages/main/src/FileUploader.ts) and [UploadCollection](https://github.com/UI5/webcomponents/blob/main/packages/fiori/src/UploadCollection.ts) ship in the framework itself, usable from plain HTML, React, Angular or Vue with no separate control library in between."}},"drafted_with_ai":true,"facets":[{"key":"storage_target","label":"Storage target","kind":"text","ecosystems":["cap"]},{"key":"upload_flow","label":"Upload flow","kind":"text","ecosystems":["cap"]},{"key":"scan_behaviour","label":"Scan behaviour","kind":"text","ecosystems":["cap"]},{"key":"versioned_repository","label":"Versioned repositories","kind":"flag","ecosystems":["cap"]}]},"sap_delivery":{"door":"cap","all":{"built_in":[{"ref":"artifact:sap-cds","name":"@sap/cds","json":"/artifacts/sap-cds.json"}],"documented_pattern":[],"announced":[],"packages":[{"ref":"artifact:cap-js-attachments","name":"@cap-js/attachments","json":"/artifacts/cap-js-attachments.json"},{"ref":"artifact:cap-js-sdm","name":"@cap-js/sdm","json":"/artifacts/cap-js-sdm.json"},{"ref":"artifact:cap-java-cds-feature-attachments","name":"com.sap.cds:cds-feature-attachments","json":"/artifacts/cap-java-cds-feature-attachments.json"},{"ref":"artifact:cap-java-sdm","name":"com.sap.cds:sdm","json":"/artifacts/cap-java-sdm.json"}]},"by_flavor":{"node":{"built_in":[{"ref":"artifact:sap-cds","name":"@sap/cds","json":"/artifacts/sap-cds.json"}],"documented_pattern":[],"announced":[],"packages":[{"ref":"artifact:cap-js-attachments","name":"@cap-js/attachments","json":"/artifacts/cap-js-attachments.json"},{"ref":"artifact:cap-js-sdm","name":"@cap-js/sdm","json":"/artifacts/cap-js-sdm.json"}]},"java":{"built_in":[],"documented_pattern":[],"announced":[],"packages":[{"ref":"artifact:cap-java-cds-feature-attachments","name":"com.sap.cds:cds-feature-attachments","json":"/artifacts/cap-java-cds-feature-attachments.json"},{"ref":"artifact:cap-java-sdm","name":"com.sap.cds:sdm","json":"/artifacts/cap-java-sdm.json"}]}}},"edges":{"use_cases":[{"id":"keep-attachment-content-out-of-the-application-database","name":"Keep attachment content out of the application database","capability":"capability:attachments","ecosystem":"cap","flavors":["node","java"],"outcome":"A deployed CAP application keeps uploaded file content in an object store or a document repository, and keeps only the metadata and a reference in its own database.","boundary":"Choosing between AWS, Azure and Google, and entitlement to any of them, are project questions and are not assessed. Moving content already written to the database is not covered by any source read here. Nothing here establishes that a deployment was run.","origin":"Editorial hypothesis, from the distance between what the packages do on a developer machine and what they state is required once the application is deployed.","requirement_dimensions":["Node.js or Java runtime","Whether an SAP Object Store entitlement exists","Whether the documents have to live in a document management repository instead","Deployment profile, since the local default differs from the productive one"],"contributions":[{"ref":"artifact:cap-js-attachments","role":"storage","state":"conditional","flavors":["node"],"version_scope":"README at cap-js/attachments commit cdf7d50.","description":"With a storage target configured, the content goes to that target and the database keeps the reference and the metadata. The README states that productive use requires a valid object store binding.","conditions":["A valid SAP Object Store binding exists for the deployed application."],"remaining_work":"Provision and bind the Object Store service and set the storage target kind per profile. Without the binding the productive path is the one the README rules out, not a fallback to the database.","remaining_kinds":["configuration"],"sources":[{"url":"https://raw.githubusercontent.com/cap-js/attachments/cdf7d5012d29c831aa46bb3fa6b3daeab622306c/README.md","title":"cap-js/attachments — README","checked":"2026-09-19","quote":"For productive use, a valid object store binding is required, see [Object Stores](#object-stores) and [Storage Targets](#storage-targets)."},{"url":"https://raw.githubusercontent.com/cap-js/attachments/cdf7d5012d29c831aa46bb3fa6b3daeab622306c/README.md","title":"cap-js/attachments — README (storage targets)","checked":"2026-09-19","quote":"with a dedicated storage target the attachment is not stored in the underlying database; instead, it is saved on the specified storage target and only a reference to the file including metadata is kept in the database"}]},{"ref":"artifact:cap-java-cds-feature-attachments","role":"storage","state":"conditional","flavors":["java"],"version_scope":"README at cap-java/cds-feature-attachments commit 302f61c, its cds-feature-attachments-oss module README at the same commit, and the capire plugins page.","description":"The base dependency stores attachments in the database. A separate module, cds-feature-attachments-oss, puts them in an AWS, Azure or Google object store instead and keeps only a reference in the database.","conditions":["The cds-feature-attachments-oss module is used as the storage target module.","A valid Object Store service binding exists for the application."],"remaining_work":"Add the oss module and provision the binding. The base dependency alone leaves the content in the database, which is the state this task is trying to leave.","remaining_kinds":["configuration"],"sources":[{"url":"https://raw.githubusercontent.com/cap-java/cds-feature-attachments/302f61c8bb76a0f54f43482ad91d89bf7dc5540f/README.md","title":"cap-java/cds-feature-attachments — README","checked":"2026-09-20","quote":"By default, the plugin operates without a dedicated storage target, storing attachments directly in the [underlying database](cds-feature-attachments/src/main/resources/cds/com.sap.cds/cds-feature-attachments/attachments.cds#L17)."},{"url":"https://raw.githubusercontent.com/cap-java/cds-feature-attachments/302f61c8bb76a0f54f43482ad91d89bf7dc5540f/storage-targets/cds-feature-attachments-oss/README.md","title":"cap-java/cds-feature-attachments — cds-feature-attachments-oss README","checked":"2026-09-20","quote":"This artifact uses an Object Store as the storage target instead of the underlying database."},{"url":"https://raw.githubusercontent.com/cap-java/cds-feature-attachments/302f61c8bb76a0f54f43482ad91d89bf7dc5540f/storage-targets/cds-feature-attachments-oss/README.md","title":"cap-java/cds-feature-attachments — cds-feature-attachments-oss README (binding)","checked":"2026-09-20","quote":"A valid Object Store service binding is required for this, typically one provisioned through SAP BTP."},{"url":"https://cap.cloud.sap/docs/plugins/","title":"CAP plugins — Attachments","checked":"2026-09-19","quote":"use the `cds-feature-attachments-oss` package for Java or the `@cap-js/attachments` package for Node.js"}]},{"ref":"artifact:cap-js-sdm","role":"storage","state":"conditional","flavors":["node"],"version_scope":"README at cap-js/sdm commit ad13b61.","description":"Puts the documents in an SAP Document Management repository rather than a bucket, for the case where the files belong in a repository the business already keeps.","conditions":["An SAP Document Management integration option service instance and key exist.","A repository is onboarded with those credentials and its id is configured for the deployment."],"remaining_work":"Create the instance and key, onboard the repository and configure its id in the deployment descriptor before anything is stored.","remaining_kinds":["configuration"],"sources":[{"url":"https://raw.githubusercontent.com/cap-js/sdm/ad13b61f21816ebead2d08264a74521cfb75846c/README.md","title":"cap-js/sdm — README","checked":"2026-09-19","quote":"This plugin can be consumed by the CAP application deployed on BTP to store their documents in the form of attachments in Document Management Repository."},{"url":"https://raw.githubusercontent.com/cap-js/sdm/ad13b61f21816ebead2d08264a74521cfb75846c/README.md","title":"cap-js/sdm — README (setup)","checked":"2026-09-20","quote":"Create a SAP Document Management Integration Option [Service instance and key](https://help.sap.com/docs/document-management-service/sap-document-management-service/creating-service-instance-and-service-key)."},{"url":"https://raw.githubusercontent.com/cap-js/sdm/ad13b61f21816ebead2d08264a74521cfb75846c/README.md","title":"cap-js/sdm — README (repository)","checked":"2026-09-20","quote":"Configure the [REPOSITORY_ID](https://github.com/cap-js/incidents-app/blob/9327f550cde9f9666a1ffb3cbc727295b8d6fdb7/mta.yaml#L19) with the repository you want to use for deploying the application."}]},{"ref":"artifact:cap-java-sdm","role":"storage","state":"conditional","flavors":["java"],"version_scope":"README at cap-java/sdm commit 673769f.","description":"The Java counterpart of the same route: the documents go to an SAP Document Management repository the application is bound to.","conditions":["An SAP Document Management integration option service instance and key exist and the application is bound to the instance.","A repository is onboarded with those credentials and its id is added to the deployment descriptor."],"remaining_work":"Create the instance and key, bind the application to it and onboard the repository before anything is stored.","remaining_kinds":["configuration"],"sources":[{"url":"https://raw.githubusercontent.com/cap-java/sdm/673769f24ef66fd97daa6a6be41262d45065d3fe/README.md","title":"cap-java/sdm — README","checked":"2026-09-19","quote":"This plugin can be consumed by the CAP application deployed on BTP to store their documents in the form of attachments in Document Management Repository."},{"url":"https://raw.githubusercontent.com/cap-java/sdm/673769f24ef66fd97daa6a6be41262d45065d3fe/README.md","title":"cap-java/sdm — README (setup)","checked":"2026-09-20","quote":"Create a SAP Document Management Integration Option [Service instance and key](https://help.sap.com/docs/document-management-service/sap-document-management-service/creating-service-instance-and-service-key). Bind your CAP application to this SDM instance."},{"url":"https://raw.githubusercontent.com/cap-java/sdm/673769f24ef66fd97daa6a6be41262d45065d3fe/README.md","title":"cap-java/sdm — README (repository onboarding)","checked":"2026-09-20","quote":"Using the created SDM instance's credentials from key [onboard a repository](https://help.sap.com/docs/document-management-service/sap-document-management-service/onboarding-repository)."}]},{"ref":"artifact:cap-attachments-plus","role":"storage","state":"unknown","flavors":["node"],"description":"The graph records a claim dated 2026-09-17 that this plugin stores cloud content in the application owner's own AWS, Azure or GCP account through a BTP destination, which would be the one option here that keeps the bytes outside SAP's service. That claim has not been re-established.","remaining_work":"Retrieve the npm README again. https://www.npmjs.com/package/cap-attachments-plus returned HTTP 403 on 2026-09-19 and again on 2026-09-20, and the package has no public repository to read instead."}],"readings":[{"ref":"content:major-updates-to-the-attachments-plugin","relevance":"SAP's own account of the release that added multi-cloud storage to the Node.js plugin, and of the service interface the storage sits behind.","flavors":["node"]},{"ref":"content:extend-upload-set-with-table-to-fiori-elements-and-utilize-object-store","relevance":"A worked Object Store variant by an author who had already published the document management one, so the two storage routes can be read side by side.","flavors":["node"]}],"unknowns":["The cap-attachments-plus npm README returned HTTP 403 on 2026-09-19 and on 2026-09-20, so the one documented option that keeps content in the application owner's own cloud account was not reassessed.","No source read here states how content already stored in the database is moved to a storage target."],"assessed_at":"2026-09-20","drafted_with_ai":true,"history":[{"date":"2026-09-20","field":"contributions[1].conditions","from":"The cds-feature-attachments-oss module is added to the build and an Object Store binding exists.","to":"two conditions, each with a quote from the oss module's own README","reason":"The binding half of the condition rested on a source that had not been read. The cds-feature-attachments-oss README at the same pinned commit states the object store target and the binding requirement, and was retrieved on 2026-09-20."},{"date":"2026-09-20","field":"contributions[2].state","from":"documented","to":"conditional","reason":"The same README makes storing anything conditional on an instance, a key and an onboarded repository, which is the shape that earned @cap-js/attachments a conditional state for its object store binding. The steps were in remaining_work and are now the conditions they are."},{"date":"2026-09-20","field":"contributions[3].state","from":"documented","to":"conditional","reason":"Changed with its Node.js counterpart for the same reason: the Java README's setup requires an instance, a binding and an onboarded repository before a document is stored."}],"omitted_contributions":0,"assessment_kind":"documented-contributions"},{"id":"separate-attachments-per-tenant-in-a-cap-saas-application","name":"Keep each subscriber's attachments apart in a multitenant CAP application","capability":"capability:attachments","ecosystem":"cap","flavors":["node","java"],"outcome":"Each subscriber of a multitenant CAP application uploads and reads only its own attachments, and that tenant's content is removed when it unsubscribes.","boundary":"Tenant isolation in the database, and the subscription mechanics themselves, belong to multitenancy and are assessed there. Whether a subaccount is entitled to one Object Store instance per tenant is a project question. Nothing here establishes that a subscription or an unsubscription was observed.","origin":"Editorial hypothesis, from the four official packages stating four different answers in their multitenancy sections.","requirement_dimensions":["Node.js or Java runtime","Storage target: database, object store or SAP Document Management repository","Whether an object store instance per tenant is affordable and entitled","Package version, since two of the answers arrived in a named release"],"contributions":[{"ref":"artifact:cap-js-attachments","role":"tenant separation","state":"conditional","flavors":["node"],"version_scope":"README at cap-js/attachments commit cdf7d50; separate mode stated as the default for multitenancy from version 2.1.0.","description":"In separate mode, the default since 2.1.0, the plugin creates an object store instance for each tenant when it subscribes and deletes it when it unsubscribes. A shared instance can be configured instead, and there the README states that attachment URLs carry the tenant id and says nothing about removing a tenant's content.","conditions":["Separate mode is in use, which is the mode the README states per-tenant provisioning and deletion for, and the default from version 2.1.0.","@cap-js/attachments is in the dependencies of both the application and the mtx sidecar."],"remaining_work":"Add the plugin to both package.json files, choose separate or shared instances before the first subscription, and bind the shared instance to the mtx module when shared is chosen. On the shared instance the removal half of this outcome is not stated.","remaining_kinds":["configuration"],"sources":[{"url":"https://raw.githubusercontent.com/cap-js/attachments/cdf7d5012d29c831aa46bb3fa6b3daeab622306c/README.md","title":"cap-js/attachments — README (per-tenant instances)","checked":"2026-09-19","quote":"By default, the plugin creates its own object store instance for each tenant during the tenant's subscription. When the tenant unsubscribes, the object store instance is deleted."},{"url":"https://raw.githubusercontent.com/cap-js/attachments/cdf7d5012d29c831aa46bb3fa6b3daeab622306c/README.md","title":"cap-js/attachments — README (separate mode default)","checked":"2026-09-20","quote":"Starting from version 2.1.0, **separate mode** for object store instances is the default setting for multi-tenancy."},{"url":"https://raw.githubusercontent.com/cap-js/attachments/cdf7d5012d29c831aa46bb3fa6b3daeab622306c/README.md","title":"cap-js/attachments — README (shared instance)","checked":"2026-09-20","quote":"To ensure tenant identification when using a shared object store instance, the plugin prefixes attachment URLs with the tenant ID."},{"url":"https://raw.githubusercontent.com/cap-js/attachments/cdf7d5012d29c831aa46bb3fa6b3daeab622306c/README.md","title":"cap-js/attachments — README (dependencies)","checked":"2026-09-20","quote":"For multi-tenant applications, `@cap-js/attachments` must be included in the dependencies of both the application-level and _mtx/sidecar/package.json_ files."}]},{"ref":"artifact:cap-java-cds-feature-attachments","role":"tenant separation","state":"conditional","flavors":["java"],"version_scope":"README at cap-java/cds-feature-attachments commit 302f61c; shared-bucket multitenancy stated from version 1.5.0.","description":"With an object store as the storage target, one bucket serves every tenant, keys are prefixed with the tenant id and a tenant's data is cleaned up on unsubscribe. With [SAP HANA](artifact:sap-hana) as the target the README puts multitenancy on the consuming application.","conditions":["An object store is the storage target, and the package is at version 1.5.0 or later.","With SAP HANA as the storage target, multitenancy support depends on the consuming application."],"remaining_work":"On the [SAP HANA](artifact:sap-hana) target the application provides the isolation itself, and the README names a schema per tenant as the usual arrangement without specifying what the package does about it.","sources":[{"url":"https://raw.githubusercontent.com/cap-java/cds-feature-attachments/302f61c8bb76a0f54f43482ad91d89bf7dc5540f/README.md","title":"cap-java/cds-feature-attachments — README (object store)","checked":"2026-09-19","quote":"shared-bucket multitenancy is supported (since version 1.5.0). The plugin prefixes object keys with the tenant ID to ensure tenant isolation, and automatically cleans up tenant data on unsubscribe."},{"url":"https://raw.githubusercontent.com/cap-java/cds-feature-attachments/302f61c8bb76a0f54f43482ad91d89bf7dc5540f/README.md","title":"cap-java/cds-feature-attachments — README (SAP HANA)","checked":"2026-09-19","quote":"When using SAP HANA as the storage target, multitenancy support depends on the consuming application."}]},{"ref":"artifact:cap-js-sdm","role":"tenant separation","state":"documented","flavors":["node"],"version_scope":"README at cap-js/sdm commit ad13b61.","description":"Separates tenants by repository rather than by key prefix: one is provisioned when a tenant subscribes and cleaned up when it unsubscribes.","remaining_work":"Deploy the onboarding and offboarding code the README shows. The lifecycle is automated once that code is in place, not before.","remaining_kinds":["application-code"],"sources":[{"url":"https://raw.githubusercontent.com/cap-js/sdm/ad13b61f21816ebead2d08264a74521cfb75846c/README.md","title":"cap-js/sdm — README","checked":"2026-09-19","quote":"This plugin automates repository lifecycle management in a multi-tenant setup. On tenant subscription, it provisions a repository and stores its details, and on unsubscription, it securely cleans up the repository."}]},{"ref":"artifact:cap-java-sdm","role":"tenant separation","state":"documented","flavors":["java"],"version_scope":"README at cap-java/sdm commit 673769f.","description":"Offers onboarding and offboarding APIs for repositories in a multitenant CAP SaaS application, so a tenant gets a repository rather than a share of one. What an unsubscription does when the repository cannot be deleted is stated: it fails, unless the repository was not found.","remaining_work":"Call those APIs from the application's own subscription handling.","remaining_kinds":["application-code"],"sources":[{"url":"https://raw.githubusercontent.com/cap-java/sdm/673769f24ef66fd97daa6a6be41262d45065d3fe/README.md","title":"cap-java/sdm — README","checked":"2026-09-19","quote":"This plugin provides APIs for onboarding and offboarding of repositories for multitenant CAP SaaS applications."},{"url":"https://raw.githubusercontent.com/cap-java/sdm/673769f24ef66fd97daa6a6be41262d45065d3fe/README.md","title":"cap-java/sdm — README (unsubscription)","checked":"2026-09-20","quote":"Unsubscription will fail if an error occurs while deleting the repository, except when the error indicates that the repository was not found — in that case, the unsubscription will succeed."}]},{"ref":"artifact:tklein1801-cap-js-attachments","role":"tenant separation","state":"conditional","flavors":["node"],"version_scope":"README at tklein1801/cap-js-attachments commit 1021ab9.","description":"States readiness for multitenancy on a shared object store instance, with attachment URLs prefixed by the tenant id. It documents the prefixing and not the provisioning.","conditions":["A shared SAP Object Store instance with a bucket already exists and is reachable."],"remaining_work":"Provide the shared instance and its bucket. The README requires one to exist rather than creating it per tenant.","remaining_kinds":["configuration"],"sources":[{"url":"https://raw.githubusercontent.com/tklein1801/cap-js-attachments/1021ab9c3ee9235900ef92e76f30f50fddab524d/README.md","title":"tklein1801/cap-js-attachments — README","checked":"2026-09-19","quote":"The feature is ready for multitenancy scenarios utilizing a shared `object store` instance. Attachment URLs are prefixed with the tenant ID to ensure proper separation and identification of data across different tenants."},{"url":"https://raw.githubusercontent.com/tklein1801/cap-js-attachments/1021ab9c3ee9235900ef92e76f30f50fddab524d/README.md","title":"tklein1801/cap-js-attachments — README (Object Store prerequisite)","checked":"2026-09-19","quote":"For using SAP Object Store, you must already have a SAP Object Store service instance with a bucket which you can access."}]}],"unknowns":["No source read here states what happens to attachments already stored when an application switches between separate and shared object store instances.","No source read here states how a tenant's attachments are exported when it leaves, as distinct from being deleted.","On a shared object store instance, @cap-js/attachments states the tenant prefix and not what becomes of a tenant's content when it unsubscribes."],"assessed_at":"2026-09-20","drafted_with_ai":true,"history":[{"date":"2026-09-20","field":"contributions[0].state","from":"documented","to":"conditional","reason":"The README states provisioning and deletion per tenant for separate mode, the default from version 2.1.0. For the shared instance it states the URL prefix only, so the removal half of the outcome holds under a named condition rather than unconditionally."},{"date":"2026-09-20","field":"contributions[0].version_scope","from":"README at cap-js/attachments commit cdf7d50.","to":"the same commit, with separate mode's 2.1.0 default recorded","reason":"The requirement dimensions already said two of the four answers arrived in a named release, and only the Java 1.5.0 one was recorded."},{"date":"2026-09-20","field":"contributions[0].remaining_work","from":"Choose separate or shared instances before the first subscription, and bind the shared instance to the mtx module when shared is chosen.","to":"the same, with the dependency the README requires in both package.json files","reason":"That prerequisite applies to every multitenant setup, not only the shared one, and was missing."},{"date":"2026-09-20","field":"contributions[3].remaining_work","from":"Call those APIs from the application's own subscription handling, and decide how an unsubscription that fails on the repository is handled.","to":"Call those APIs from the application's own subscription handling.","reason":"The README states what happens when the repository cannot be deleted, so the dropped clause described work no source leaves open. The quote was also completed to the end of the sentence it was cut from."}],"readings":[],"omitted_contributions":0,"assessment_kind":"documented-contributions"},{"id":"keep-version-history-for-an-attached-document","name":"Keep version history for an attached document","capability":"capability:attachments","ecosystem":"cap","flavors":["node","java"],"outcome":"A document attached to a business record keeps its earlier versions, so a reader can see what the file was before it was replaced.","boundary":"Change tracking of the record's own fields is a different concern. Whether a customer is entitled to SAP Document Management is a project question. Versioning inside a bucket, configured on the storage service rather than by the application, is outside what these packages document. Nothing here establishes that any alternative route was built or run.","origin":"Editorial hypothesis, from an exclusion both official SAP Document Management plugins state in the same sentence.","requirement_dimensions":["Whether versions have to be readable by a user or only retained","Whether the repository is SAP's own or a connected CMIS repository","Node.js or Java runtime","Whether the application may call the document management APIs outside the plugin"],"contributions":[{"ref":"artifact:cap-js-sdm","role":"storage","state":"explicitly-unsupported","flavors":["node"],"version_scope":"README at cap-js/sdm commit ad13b61.","description":"The plugin rules out versioned repositories, so the repository that would hold the versions is the one it cannot be pointed at.","remaining_work":"Either drop the version requirement, or reach the document management APIs from the application without this plugin in the path.","sources":[{"url":"https://raw.githubusercontent.com/cap-js/sdm/ad13b61f21816ebead2d08264a74521cfb75846c/README.md","title":"cap-js/sdm — README","checked":"2026-09-19","quote":"Repository : This plugin does not support the use of versioned repositories."},{"url":"https://raw.githubusercontent.com/cap-js/sdm/ad13b61f21816ebead2d08264a74521cfb75846c/README.md","title":"cap-js/sdm — README (setup)","checked":"2026-09-19","quote":"Currently only non versioned repositories are supported."}]},{"ref":"artifact:cap-java-sdm","role":"storage","state":"explicitly-unsupported","flavors":["java"],"version_scope":"README at cap-java/sdm commit 673769f.","description":"States the same exclusion in the same words as its Node.js counterpart, so switching runtime does not open the route.","remaining_work":"Either drop the version requirement, or reach the document management APIs from the application without this plugin in the path.","sources":[{"url":"https://raw.githubusercontent.com/cap-java/sdm/673769f24ef66fd97daa6a6be41262d45065d3fe/README.md","title":"cap-java/sdm — README","checked":"2026-09-20","quote":"This plugin does not support the use of versioned repositories."},{"url":"https://raw.githubusercontent.com/cap-java/sdm/673769f24ef66fd97daa6a6be41262d45065d3fe/README.md","title":"cap-java/sdm — README (setup)","checked":"2026-09-20","quote":"Currently only non versioned repositories are supported."}]},{"ref":"artifact:btp-document-management-integration","role":"document repository","state":"documented","description":"The service under both plugins names versioning among the document management capabilities it offers, and offers its APIs for an application to build its own document management layer on.","remaining_work":"Build the record association and the upload path against those APIs. Neither CAP plugin covers a versioned repository, so this route leaves the Attachments aspect behind.","sources":[{"url":"https://discovery-center.cloud.sap/servicecatalog/api/v1/services/db9e77b0-2fd1-429d-9557-923acf96fc9d","title":"SAP Discovery Center — SAP Document Management service, integration option","checked":"2026-09-19","quote":"Organize your enterprise content with the document management capabilities like file and folder hierarchy, versioning, status management, etc."},{"url":"https://discovery-center.cloud.sap/servicecatalog/api/v1/services/db9e77b0-2fd1-429d-9557-923acf96fc9d","title":"SAP Discovery Center — SAP Document Management service, integration option (APIs)","checked":"2026-09-19","quote":"Leverage the APIs to build a customized document management layer on your on-premise or cloud applications."}]},{"ref":"artifact:cap-js-attachments","role":"attachment handling","state":"explicitly-unsupported","flavors":["node"],"version_scope":"README at cap-js/attachments commit cdf7d50.","description":"The README addresses replacement rather than versions. By default the Attachments aspect marks the content non-updatable, so an upload to an attachment that already has content is rejected with 409; with that annotation overridden the upload overwrites the existing content. Neither path produces a second version, and the README names no place where the earlier file survives.","remaining_work":"Keep the earlier file somewhere other than the attachment: a second record, or the document management APIs. Whether the configured storage target retains a previous object is a question for that service and is not answered here.","remaining_kinds":["application-code"],"sources":[{"url":"https://raw.githubusercontent.com/cap-js/attachments/cdf7d5012d29c831aa46bb3fa6b3daeab622306c/README.md","title":"cap-js/attachments — README (non-updatable content)","checked":"2026-09-20","quote":"By default, the `Attachments` aspect annotates the entity with `@Capabilities.UpdateRestrictions.NonUpdatableProperties: [content]`, which prevents overwriting the content of an existing attachment."},{"url":"https://raw.githubusercontent.com/cap-js/attachments/cdf7d5012d29c831aa46bb3fa6b3daeab622306c/README.md","title":"cap-js/attachments — README (allow overwriting attachment content)","checked":"2026-09-20","quote":"With this annotation in place, uploading new content via `PUT` to an attachment that already has content will overwrite the existing content instead of returning a `409` error."}]},{"ref":"artifact:cap-java-cds-feature-attachments","role":"attachment handling","state":"unknown","flavors":["java"],"version_scope":"README at cap-java/cds-feature-attachments commit 302f61c.","description":"The pinned README documents storage targets, the scanner and multitenancy. Re-read on 2026-09-20, it states nothing about replacing the content of an existing attachment and nothing about earlier versions, so the Node.js answer cannot be carried across.","remaining_work":"Establish what happens to the previous content on replacement, from the plugin's model or the CAP Java documentation."}],"readings":[{"ref":"content:consume-sap-document-management-using-cap-js-sdm","relevance":"Shows what the plugin route to an SAP Document Management repository looks like from the application side, which is the route this outcome has to step outside of.","flavors":["node"]}],"unknowns":["Whether CAP Java's cds-feature-attachments retains previous content when a file is replaced was not established; its Node.js counterpart states that the replacement overwrites the existing content.","No source read here states a supported path from a CAP Attachments aspect to a versioned SAP Document Management repository.","Whether a connected CMIS repository behaves differently from SAP's own repository option on versions was not established.","Whether an earlier object survives in the configured storage target, through a setting on that service rather than in the plugin, is not stated by any source read here."],"assessed_at":"2026-09-20","drafted_with_ai":true,"history":[{"date":"2026-09-20","field":"contributions[3]","from":"unknown, described as stating nothing about keeping earlier content when a file is replaced","to":"explicitly-unsupported, with the two annotations the README documents","reason":"The README has a section on overwriting attachment content: the default annotation rejects the upload with 409, and overriding it overwrites the existing content. The old description rested on a silence that is not there."},{"date":"2026-09-20","field":"capability_review.proposal","from":"one CAP coverage sentence plus recording the versioned-repository exclusion in where_it_stops","to":"the CAP coverage sentence, with the replacement behaviour named","reason":"where_it_stops already opens with the exclusion, so half the proposal asked for what is recorded. The BTP framing already states the service keeps versions, which narrows the reason as well."},{"date":"2026-09-20","field":"unknowns","from":"Whether either official CAP attachments package retains previous content when a file is replaced was not established.","to":"the same question for the Java package only, with the Node.js answer stated","reason":"The Node.js half is answered by its own README, re-read on 2026-09-20; the Java README states nothing on the subject."},{"date":"2026-09-20","field":"boundary","from":"no mention of storage-side versioning","to":"versioning configured on the storage service is named as outside these packages","reason":"Separating the plugin's behaviour from what a bucket or repository can be configured to keep, so the new unknown about a retained object is not read as a gap in the packages."}],"omitted_contributions":0,"assessment_kind":"documented-contributions"},{"id":"scan-an-uploaded-attachment-before-it-can-be-downloaded","name":"Scan an uploaded attachment before anyone can download it","capability":"capability:attachments","ecosystem":"cap","flavors":["node","java"],"outcome":"A file a user uploads is scanned for malware, and a file that was never scanned does not reach a reader carrying the same status as one that was.","boundary":"How well a scanner detects anything is not assessed. What the application does with an infected file, and the wording it shows a user, are its own handling. Nothing here establishes that a scan was observed running.","origin":"Editorial hypothesis, from the opposite defaults the two official packages state for the same omission, a missing scanner binding.","requirement_dimensions":["Node.js or Java runtime","Whether an SAP Malware Scanning service instance is available in the subaccount","Storage target, since the document management route scans at the repository instead","Largest file the application accepts"],"contributions":[{"ref":"artifact:cap-js-attachments","role":"scanning","state":"documented","flavors":["node"],"version_scope":"README at cap-js/attachments commit cdf7d50.","description":"With scanning left enabled and no scanner available, the upload fails, so the file does not get stored unscanned. Download is tied to the status: the README states that an attachment cannot be downloaded unless its status is Clean.","remaining_work":"Bind the [SAP Malware Scanning service](artifact:btp-malware-scanning), or disable scanning deliberately per profile. The plugin states the two outcomes; picking between them is the application's decision.","remaining_kinds":["configuration"],"sources":[{"url":"https://raw.githubusercontent.com/cap-js/attachments/cdf7d5012d29c831aa46bb3fa6b3daeab622306c/README.md","title":"cap-js/attachments — README","checked":"2026-09-19","quote":"If there is no malware scanner available and the scanner is not disabled, then the upload will fail."},{"url":"https://raw.githubusercontent.com/cap-js/attachments/cdf7d5012d29c831aa46bb3fa6b3daeab622306c/README.md","title":"cap-js/attachments — README (download and scan status)","checked":"2026-09-20","quote":"Downloading an attachment is not permitted unless its status is `Clean`."}]},{"ref":"artifact:cap-java-cds-feature-attachments","role":"scanning","state":"documented","flavors":["java"],"version_scope":"README at cap-java/cds-feature-attachments commit 302f61c.","description":"Download is tied to the status here too: only an attachment marked Clean is accessible. With no scanner available the attachments are marked Clean automatically, so a file nobody scanned reaches a reader through the same gate as a scanned one.","remaining_work":"Bind a service instance labelled malware-scanner. Until then a Clean status says nothing about the file, which is the fact this flavor has to be checked for.","remaining_kinds":["configuration"],"sources":[{"url":"https://raw.githubusercontent.com/cap-java/cds-feature-attachments/302f61c8bb76a0f54f43482ad91d89bf7dc5540f/README.md","title":"cap-java/cds-feature-attachments — README","checked":"2026-09-19","quote":"If there is no malware scanner available, the attachments are automatically marked as `Clean`."},{"url":"https://raw.githubusercontent.com/cap-java/cds-feature-attachments/302f61c8bb76a0f54f43482ad91d89bf7dc5540f/README.md","title":"cap-java/cds-feature-attachments — README (scanner binding)","checked":"2026-09-19","quote":"This plugin checks for a binding to the [SAP Malware Scanning Service](https://help.sap.com/docs/malware-scanning-servce), which needs to have the label `malware-scanner`."},{"url":"https://raw.githubusercontent.com/cap-java/cds-feature-attachments/302f61c8bb76a0f54f43482ad91d89bf7dc5540f/README.md","title":"cap-java/cds-feature-attachments — README (scan status)","checked":"2026-09-20","quote":"- `Clean`: Only attachments with the status `Clean` are accessible."}]},{"ref":"artifact:cap-js-sdm","role":"scanning","state":"conditional","flavors":["node"],"version_scope":"README at cap-js/sdm commit ad13b61.","description":"Scanning happens at the SAP Document Management repository rather than in the plugin, on repositories onboarded with virus scanning. With it switched on, uploads above 400 MB are rejected with HTTP 409 before any data is streamed, and the same README's Known Restrictions state a 100 MB maximum for attachments.","conditions":["The repository is onboarded with virus scanning enabled.","Files above 400 MB are rejected rather than scanned when virus scanning is on."],"remaining_work":"Enable virus scanning when the repository is onboarded, decide what the application does with a file the repository refuses on size, and establish which of the two stated size figures applies to an upload.","remaining_kinds":["configuration","application-code"],"sources":[{"url":"https://raw.githubusercontent.com/cap-js/sdm/ad13b61f21816ebead2d08264a74521cfb75846c/README.md","title":"cap-js/sdm — README","checked":"2026-09-19","quote":"Virus scanning : Provides the capability to support virus scan for virus scan enabled repositories."},{"url":"https://raw.githubusercontent.com/cap-js/sdm/ad13b61f21816ebead2d08264a74521cfb75846c/README.md","title":"cap-js/sdm — README (file size on scan-enabled repositories)","checked":"2026-09-20","quote":"the plugin rejects uploads larger than 400 MB with HTTP 409 and a descriptive error message"},{"url":"https://raw.githubusercontent.com/cap-js/sdm/ad13b61f21816ebead2d08264a74521cfb75846c/README.md","title":"cap-js/sdm — README (known restrictions)","checked":"2026-09-20","quote":"File size : Attachments are limited to a maximum size of 100 MB."}]},{"ref":"artifact:cap-java-sdm","role":"scanning","state":"conditional","flavors":["java"],"version_scope":"README at cap-java/sdm commit 673769f.","description":"Names malware scan and Trend Micro scan on repositories onboarded with virus scanning, and puts a size limit on what is scanned: only attachments up to 400 MB.","conditions":["The repository is onboarded with virus scanning enabled.","Only attachments up to 400 MB are scanned."],"remaining_work":"Decide what happens to a file above the scanned size. The README's localization example ships a message key telling a user that files larger than 400 MB cannot be uploaded to a virus-scan repository, and states the outcome nowhere else.","sources":[{"url":"https://raw.githubusercontent.com/cap-java/sdm/673769f24ef66fd97daa6a6be41262d45065d3fe/README.md","title":"cap-java/sdm — README","checked":"2026-09-19","quote":"Virus scanning : Provides the capability to support malware scan and Trend Micro scan for virus scan enabled repositories."},{"url":"https://raw.githubusercontent.com/cap-java/sdm/673769f24ef66fd97daa6a6be41262d45065d3fe/README.md","title":"cap-java/sdm — README (file size)","checked":"2026-09-19","quote":"File size : If the repository is onboarded with virus scanning, only attachments upto 400 MB will be scanned for virus."},{"url":"https://raw.githubusercontent.com/cap-java/sdm/673769f24ef66fd97daa6a6be41262d45065d3fe/README.md","title":"cap-java/sdm — README (localization example)","checked":"2026-09-20","quote":"SDM.virusRepoErrorMoreThan400MB=Sie können keine Dateien hochladen, die größer als 400 MB sind"}]},{"ref":"artifact:tklein1801-cap-js-attachments","role":"scanning","state":"conditional","flavors":["node"],"version_scope":"README at tklein1801/cap-js-attachments commit 1021ab9.","description":"An independent plugin that states scanning on for every profile except development, so the developer machine is the one place a file goes unscanned. The scanner it reaches is the [SAP Malware Scanning service](artifact:btp-malware-scanning), bound as malware-scanner.","conditions":["An SAP Malware Scanning service instance the application can access already exists.","That instance is bound with cds bind malware-scanner."],"remaining_work":"Provide the service instance and bind it. The README requires one to exist and creates nothing.","remaining_kinds":["configuration"],"sources":[{"url":"https://raw.githubusercontent.com/tklein1801/cap-js-attachments/1021ab9c3ee9235900ef92e76f30f50fddab524d/README.md","title":"tklein1801/cap-js-attachments — README","checked":"2026-09-19","quote":"By default, malware scanning is enabled for all profiles except development profile."},{"url":"https://raw.githubusercontent.com/tklein1801/cap-js-attachments/1021ab9c3ee9235900ef92e76f30f50fddab524d/README.md","title":"tklein1801/cap-js-attachments — README (scanner instance)","checked":"2026-09-20","quote":"For using [SAP Malware Scanning Service](https://discovery-center.cloud.sap/serviceCatalog/malware-scanning-service), you must already have a service instance which you can access."},{"url":"https://raw.githubusercontent.com/tklein1801/cap-js-attachments/1021ab9c3ee9235900ef92e76f30f50fddab524d/README.md","title":"tklein1801/cap-js-attachments — README (binding)","checked":"2026-09-20","quote":"cds bind malware-scanner -2 <INSTANCE>:<SERVICE-KEY>"}]}],"readings":[{"ref":"content:major-updates-to-the-attachments-plugin","relevance":"SAP's own post on the release that brought malware scanning into the Node.js plugin, alongside the multi-cloud storage it shipped with.","flavors":["node"]}],"unknowns":["The @cap-js/sdm README states a 100 MB maximum in Known Restrictions and a 400 MB threshold in its large-file section. Both were retrieved on 2026-09-20 and the conflict is left standing.","No source read here states whether a file stored before scanning was enabled is scanned afterwards.","No source read here states whether a file above the scanned size is still stored by com.sap.cds:sdm, beyond the message key its localization example ships."],"assessed_at":"2026-09-20","drafted_with_ai":true,"history":[{"date":"2026-09-20","field":"unknowns","from":"No source read here states whether a file still being scanned can be downloaded in the meantime.","to":"removed, and the download gate recorded on both official contributions","reason":"Both READMEs read for this task answer it. The Node.js one states that downloading is not permitted unless the status is Clean, and the Java one that only attachments with the status Clean are accessible."},{"date":"2026-09-20","field":"contributions[4]","from":"documented, with remaining_work saying the README does not name the scanner","to":"conditional, with the scanner named and the binding quoted","reason":"The README has a section on the SAP Malware Scanning service that names it, requires an existing instance and gives the bind command. The old remaining_work claimed a silence that is not there."},{"date":"2026-09-20","field":"contributions[3].remaining_work","from":"Decide what happens to a file above the scanned size. The README states the limit on scanning and not whether such a file is still stored.","to":"the same question, with the message key the README's localization example ships","reason":"The README carries SDM.virusRepoErrorMoreThan400MB, a user-facing message about files larger than 400 MB on a virus-scan repository, so the source is not silent on the subject. What happens to the file is still not stated in prose, and stays an unknown."},{"date":"2026-09-20","field":"contributions[2].sources","from":"the 400 MB rejection only","to":"the 100 MB restriction quoted beside it","reason":"The conflict this graph records for @cap-js/sdm is now carried with both quotes from the pinned commit rather than one, so a reader sees the two figures the README states."},{"date":"2026-09-20","field":"capability_review.reason","from":"an argument that scanning sits inside attachments","to":"the same disposition, with capability:malware-scanning named","reason":"The graph holds a Malware scanning capability whose description covers this outcome. Retaining attachments as the home is a choice between two nodes and was reasoned without naming the other."}],"omitted_contributions":0,"assessment_kind":"documented-contributions"},{"id":"upload-an-attachment-from-a-non-fiori-client","name":"Upload an attachment from a client that is not SAP Fiori elements","capability":"capability:attachments","ecosystem":"cap","flavors":["node","java"],"outcome":"A caller that is not an SAP Fiori elements UI, such as a test client, a custom front end or another service, creates an attachment record against an existing business record and uploads its content.","boundary":"The upload control and the client code that drives it are a UI question and are not assessed here. Who may read the file afterwards belongs to authorization. Nothing here establishes that any of these paths was run end to end.","origin":"Editorial hypothesis, prompted by a published SAP Community walkthrough of uploading through Postman and a React app. A proposed task does not establish demand.","requirement_dimensions":["Node.js or Java runtime","Whether the entity is draft-enabled","Storage target: database, Object Store or SAP Document Management","Whether the calling client can issue two ordered requests"],"contributions":[{"ref":"artifact:cap-js-attachments","role":"attachment handling","state":"conditional","flavors":["node"],"version_scope":"README at cap-js/attachments commit cdf7d50.","description":"Draft enablement is stated as an SAP Fiori elements requirement rather than a plugin one. A caller outside Fiori elements creates the attachment metadata and uploads the content in two separate requests it writes itself.","conditions":["The client is not SAP Fiori elements, in which case draft enablement is not required.","The caller issues metadata creation and content upload as separate HTTP requests."],"remaining_work":"Write and maintain the two-request sequence in the calling client. The README points at tests/non-draft-request.http as the example and ships no client.","remaining_kinds":["application-code"],"sources":[{"url":"https://raw.githubusercontent.com/cap-js/attachments/cdf7d5012d29c831aa46bb3fa6b3daeab622306c/README.md","title":"cap-js/attachments — README","checked":"2026-09-19","quote":"If you are not using SAP Fiori elements, draft enablement is not required."},{"url":"https://raw.githubusercontent.com/cap-js/attachments/cdf7d5012d29c831aa46bb3fa6b3daeab622306c/README.md","title":"cap-js/attachments — README","checked":"2026-09-19","quote":"For scenarios where the entity is not draft-enabled, for example [`tests/non-draft-request.http`](./tests/non-draft-request.http), separate HTTP requests for metadata creation and asset uploading need to be performed manually."}]},{"ref":"artifact:cap-js-sdm","role":"attachment handling and storage","state":"conditional","flavors":["node"],"version_scope":"README at cap-js/sdm commit ad13b61.","description":"States full support for attachments on non-draft, active entities, with the plugin handling create, update and delete on the attachment entity directly rather than through a draft.","conditions":["The entity is not annotated with @odata.draft.enabled.","An SAP Document Management integration option service instance and key exist, a repository is onboarded and its id is configured for the deployment."],"remaining_work":"Model the entity without the draft annotation, then write the client against the active entity. The README rules the annotation out for non-draft attachment support and states nothing about what a caller has to send when the annotation is kept.","remaining_kinds":["configuration","application-code"],"sources":[{"url":"https://raw.githubusercontent.com/cap-js/sdm/ad13b61f21816ebead2d08264a74521cfb75846c/README.md","title":"cap-js/sdm — README","checked":"2026-09-19","quote":"This plugin provides full support for handling attachments in non-draft (active) entities, enabling direct CRUD operations without requiring draft mode."},{"url":"https://raw.githubusercontent.com/cap-js/sdm/ad13b61f21816ebead2d08264a74521cfb75846c/README.md","title":"cap-js/sdm — README (non-draft annotation)","checked":"2026-09-19","quote":"Note: **Do not** annotate the entity with `@odata.draft.enabled` for non-draft attachment support."},{"url":"https://raw.githubusercontent.com/cap-js/sdm/ad13b61f21816ebead2d08264a74521cfb75846c/README.md","title":"cap-js/sdm — README (setup)","checked":"2026-09-20","quote":"Create a SAP Document Management Integration Option [Service instance and key](https://help.sap.com/docs/document-management-service/sap-document-management-service/creating-service-instance-and-service-key)."},{"url":"https://raw.githubusercontent.com/cap-js/sdm/ad13b61f21816ebead2d08264a74521cfb75846c/README.md","title":"cap-js/sdm — README (repository onboarding)","checked":"2026-09-20","quote":"Using credentials from key [onboard a repository](https://help.sap.com/docs/document-management-service/sap-document-management-service/onboarding-repository)."}]},{"ref":"artifact:cap-java-sdm","role":"attachment handling and storage","state":"conditional","flavors":["java"],"version_scope":"README at cap-java/sdm commit 673769f.","description":"States that attachments can be created directly on active, non-draft entities: the leading application triggers the insert on the attachment entity and the plugin picks the content up from there.","conditions":["The leading application triggers an INSERT on the attachment entity through the ApplicationService, or the DraftService that extends it.","An SAP Document Management integration option service instance and key exist, the application is bound to the instance and a repository is onboarded."],"remaining_work":"Implement that insert in the leading application. The README documents the entry point, not the calling client.","remaining_kinds":["application-code"],"sources":[{"url":"https://raw.githubusercontent.com/cap-java/sdm/673769f24ef66fd97daa6a6be41262d45065d3fe/README.md","title":"cap-java/sdm — README","checked":"2026-09-19","quote":"Active entity attachment creation: Provides the capability to create attachments directly on active (non-draft) entities."},{"url":"https://raw.githubusercontent.com/cap-java/sdm/673769f24ef66fd97daa6a6be41262d45065d3fe/README.md","title":"cap-java/sdm — README (active entity insert)","checked":"2026-09-20","quote":"To create attachments on active entities, the leading application needs to trigger an `INSERT` on the attachment entity through the `ApplicationService` (or `DraftService`, which extends it). The plugin intercepts the content automatically and routes it through the active entity flow."},{"url":"https://raw.githubusercontent.com/cap-java/sdm/673769f24ef66fd97daa6a6be41262d45065d3fe/README.md","title":"cap-java/sdm — README (setup)","checked":"2026-09-20","quote":"Create a SAP Document Management Integration Option [Service instance and key](https://help.sap.com/docs/document-management-service/sap-document-management-service/creating-service-instance-and-service-key). Bind your CAP application to this SDM instance."}]},{"ref":"artifact:cap-java-cds-feature-attachments","role":"attachment handling","state":"unknown","flavors":["java"],"version_scope":"README at cap-java/cds-feature-attachments commit 302f61c.","description":"The pinned README documents storage targets, the malware scanner and multitenancy. Re-read on 2026-09-20, it names no draft annotation, no DraftService and no request sequence, so what a caller outside SAP Fiori elements has to send is not stated. Absence of a statement is not a refusal.","remaining_work":"Retrieve the CAP Java attachments documentation on capire and the plugin's own draft handling before this flavor can be answered."}],"readings":[{"ref":"content:uploading-attachments-to-cap-js-attachments-from-an-external-app","relevance":"Walks through the request order a Postman or React caller has to send against the Node.js plugin, which its README points at rather than spells out.","flavors":["node"]}],"unknowns":["Whether CAP Java's cds-feature-attachments requires draft enablement for a caller outside SAP Fiori elements was not established from the pinned README, re-read on 2026-09-20.","No source read here states the request order for the Java flavor.","No source read here states what a caller has to send to @cap-js/sdm when the entity keeps the draft annotation."],"assessed_at":"2026-09-20","drafted_with_ai":true,"history":[{"date":"2026-09-20","field":"contributions[1].remaining_work","from":"Decide between the draft and the non-draft modelling before the client is written, since the annotation the README rules out is the one a Fiori elements UI needs.","to":"Model the entity without the draft annotation, then write the client against the active entity.","reason":"The dropped clause read a Fiori elements requirement out of the cap-js/sdm README, which states only that the annotation must not be used for non-draft attachment support. The requirement it was carried from belongs to a different plugin's README."},{"date":"2026-09-20","field":"contributions[1].sources, contributions[2].sources","from":"two sources each","to":"the setup steps added as quoted sources","reason":"Both contributions carried a condition that an SAP Document Management repository is onboarded and bound with no quote behind it. The setup steps of each README now stand under that condition."},{"date":"2026-09-20","field":"contributions[2].sources[1].quote","from":"To create attachments on active entities, the leading application needs to trigger an `INSERT` on the attachment entity through the `ApplicationService`","to":"the full two sentences, including the DraftService parenthesis and what the plugin does with the content","reason":"The quote was cut before the clause that names DraftService, which is the second entry point a caller can use. Re-retrieved from the pinned commit on 2026-09-20."}],"omitted_contributions":0,"assessment_kind":"documented-contributions"}],"shared_tasks":[],"related_tasks":[],"options":[{"ref":"artifact:cap-js-attachments","name":"@cap-js/attachments","json":"/artifacts/cap-js-attachments.json","ecosystem":"cap","origin_ring":"sap-official"},{"ref":"artifact:cap-js-sdm","name":"@cap-js/sdm","json":"/artifacts/cap-js-sdm.json","ecosystem":"cap","origin_ring":"sap-official"},{"ref":"artifact:sap-cds","name":"@sap/cds","json":"/artifacts/sap-cds.json","ecosystem":"cap","origin_ring":"sap-official"},{"ref":"artifact:tklein1801-cap-js-attachments","name":"@tklein1801/cap-js-attachments","json":"/artifacts/tklein1801-cap-js-attachments.json","ecosystem":"cap","origin_ring":"independent"},{"ref":"artifact:ui5-webcomponents","name":"@ui5/webcomponents","json":"/artifacts/ui5-webcomponents.json","ecosystem":"ui5","origin_ring":"sap-official"},{"ref":"artifact:aditheos-attachmentcommentodataservice","name":"AttachmentCommentODataService","json":"/artifacts/aditheos-attachmentcommentodataservice.json","ecosystem":"abap","origin_ring":"independent"},{"ref":"artifact:cap-attachments-plus","name":"cap-attachments-plus","json":"/artifacts/cap-attachments-plus.json","ecosystem":"cap","origin_ring":"independent"},{"ref":"artifact:cap-java-cds-feature-attachments","name":"com.sap.cds:cds-feature-attachments","json":"/artifacts/cap-java-cds-feature-attachments.json","ecosystem":"cap","origin_ring":"sap-official"},{"ref":"artifact:cap-java-sdm","name":"com.sap.cds:sdm","json":"/artifacts/cap-java-sdm.json","ecosystem":"cap","origin_ring":"sap-official"},{"ref":"artifact:btp-document-management-application","name":"SAP Document Management service, application option","json":"/artifacts/btp-document-management-application.json","ecosystem":"btp","origin_ring":"sap-official"},{"ref":"artifact:btp-document-management-integration","name":"SAP Document Management service, integration option","json":"/artifacts/btp-document-management-integration.json","ecosystem":"btp","origin_ring":"sap-official"},{"ref":"artifact:vneecious-sap-cap-sdm-plugin","name":"sap-cap-sdm-plugin","json":"/artifacts/vneecious-sap-cap-sdm-plugin.json","ecosystem":"cap","origin_ring":"independent"},{"ref":"artifact:miyasuta-ui5-upload-controls","name":"ui5-upload-controls","json":"/artifacts/miyasuta-ui5-upload-controls.json","ecosystem":"ui5","origin_ring":"independent"}],"samples":[{"ref":"artifact:miyasuta-attachment-reuse-controls-sample","name":"attachment-reuse-controls-sample","json":"/artifacts/miyasuta-attachment-reuse-controls-sample.json"},{"ref":"artifact:miyasuta-cap-media","name":"cap-media","json":"/artifacts/miyasuta-cap-media.json"}],"explained_by":[{"ref":"content:a-method-to-create-an-adobe-form-attachment-for-a-work-item-using-the-class-conc","name":"A method to create an Adobe form attachment for a work item using the class concept.","json":"/content/a-method-to-create-an-adobe-form-attachment-for-a-work-item-using-the-class-conc.json"},{"ref":"content:cap-foundry-engineering-sap-cap-applications-from-business-intent-with-guardrail","name":"CAP Foundry: Engineering SAP CAP Applications from Business Intent with Guardrailed AI","json":"/content/cap-foundry-engineering-sap-cap-applications-from-business-intent-with-guardrail.json"},{"ref":"content:rap-native-file-upload","name":"RAP - Native File Upload","json":"/content/rap-native-file-upload.json"},{"ref":"content:media-handling-in-sap-capm-backend-and-frontend","name":"Media Handling in SAP CAPM – Backend and Frontend Implementation","json":"/content/media-handling-in-sap-capm-backend-and-frontend.json"},{"ref":"content:major-updates-to-the-attachments-plugin","name":"Major updates to the Attachments plugin – multi-cloud support, malware scanning and more","json":"/content/major-updates-to-the-attachments-plugin.json"},{"ref":"content:uploading-attachments-to-cap-js-attachments-from-an-external-app","name":"Uploading attachment with cap-js/attachment plugins but via External App/Postman","json":"/content/uploading-attachments-to-cap-js-attachments-from-an-external-app.json"},{"ref":"content:attachment-upload-and-download-with-uploadsetwithtable","name":"Building an Attachment Upload and Download Solution Using UploadSetwithTable Control","json":"/content/attachment-upload-and-download-with-uploadsetwithtable.json"},{"ref":"content:use-sap-document-management-service-plugin-in-cap-nodejs","name":"Use SAP Document Management Service Plugin In CAP NODEJS Step by Step Guidance","json":"/content/use-sap-document-management-service-plugin-in-cap-nodejs.json"},{"ref":"content:configure-journal-entry-posting-approval-from-store-template-in-build-process-au","name":"Configure Journal Entry Posting Approval from Store Template in Build Process Automation","json":"/content/configure-journal-entry-posting-approval-from-store-template-in-build-process-au.json"},{"ref":"content:embed-btp-attachment-reuse-ui-in-a-fiori-elements-cap-app","name":"Unlocking Efficiency: Leveraging SAP BTP Document Management Service in Fiori Applications # 2","json":"/content/embed-btp-attachment-reuse-ui-in-a-fiori-elements-cap-app.json"},{"ref":"content:consume-sap-document-management-using-cap-js-sdm","name":"Consume SAP Document Management using @cap-js/sdm plugin","json":"/content/consume-sap-document-management-using-cap-js-sdm.json"},{"ref":"content:extend-upload-set-with-table-to-fiori-elements-and-utilize-object-store","name":"Extend Upload Set with Table to Fiori Elements and utilize Object Store","json":"/content/extend-upload-set-with-table-to-fiori-elements-and-utilize-object-store.json"},{"ref":"content:working-with-the-attachment-plugin-cloud-application-programming","name":"Working with the Attachment plugin - Cloud Application Programming","json":"/content/working-with-the-attachment-plugin-cloud-application-programming.json"},{"ref":"content:extend-upload-set-to-fiori-elements-and-utilize-dms","name":"Extend Upload Set to Fiori Elements and utilize Document Management Service","json":"/content/extend-upload-set-to-fiori-elements-and-utilize-dms.json"},{"ref":"content:upload-attachments-in-a-freestyle-ui5-and-cap-app","name":"Upload attachments in a Freestyle UI5 and CAP app","json":"/content/upload-attachments-in-a-freestyle-ui5-and-cap-app.json"},{"ref":"content:presenting-sap-cap-sdm-plugin","name":"Presenting sap-cap-sdm-plugin: Effortless Integration Between CAP (Node.js) and DMS","json":"/content/presenting-sap-cap-sdm-plugin.json"},{"ref":"content:how-to-transfer-a-file-from-the-cap-backend","name":"How to transfer file from CAP backside","json":"/content/how-to-transfer-a-file-from-the-cap-backend.json"}],"normative_context":[]}}