@@ -218,6 +218,76 @@ export default class AlexandriaDocumentsService extends Service {
218
218
return states ;
219
219
}
220
220
221
+ /**
222
+ * Copies one or multiple files.
223
+ *
224
+ * @param {Array<Number> } documentIds.
225
+ * @param {Object } category category instance.
226
+ */
227
+ async copy ( documentIds , category = null ) {
228
+ const INVALID_FILE_TYPE = "invalid-file-type" ;
229
+
230
+ const states = await Promise . all (
231
+ documentIds . map ( async ( id ) => {
232
+ const originalDocument = this . store . peekRecord ( "document" , id ) ;
233
+ if ( ! originalDocument ) {
234
+ return true ;
235
+ }
236
+
237
+ const files = ( await originalDocument . files ) ?? [ ] ;
238
+ if (
239
+ category &&
240
+ files
241
+ . filter ( ( f ) => f . variant === "original" )
242
+ . some ( ( file ) => ! fileHasValidMimeType ( file , category ) )
243
+ ) {
244
+ return "invalid-file-type" ;
245
+ }
246
+
247
+ const adapter = this . store . adapterFor ( "document" ) ;
248
+ let url = adapter . buildURL ( "document" , originalDocument . id ) ;
249
+ url += "/copy" ;
250
+
251
+ const data = {
252
+ type : "documents" ,
253
+ id : originalDocument . id ,
254
+ relationships : { } ,
255
+ } ;
256
+
257
+ if ( category ) {
258
+ data . relationships . category = {
259
+ data : {
260
+ id : category . id ,
261
+ type : "categories" ,
262
+ } ,
263
+ } ;
264
+ }
265
+
266
+ try {
267
+ const res = await this . fetch . fetch ( url , {
268
+ method : "POST" ,
269
+ body : JSON . stringify ( { data } ) ,
270
+ } ) ;
271
+
272
+ return ( await res . json ( ) ) . data . id ;
273
+ } catch ( error ) {
274
+ new ErrorHandler ( this , error ) . notify ( ) ;
275
+
276
+ return false ;
277
+ }
278
+ } ) ,
279
+ ) ;
280
+
281
+ if ( states . includes ( INVALID_FILE_TYPE ) ) {
282
+ this . mimeTypeErrorNotification ( category ) ;
283
+ return states . map ( ( state ) =>
284
+ state === INVALID_FILE_TYPE ? false : state ,
285
+ ) ;
286
+ }
287
+
288
+ return states ;
289
+ }
290
+
221
291
/**
222
292
* Clears the document selection
223
293
*/
0 commit comments