| 
									
										
										
										
											2019-08-01 17:19:49 +02:00
										 |  |  | 'use strict'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const _ = require('lodash'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module.exports = async (entry, files, { model, source }) => { | 
					
						
							|  |  |  |   const entity = strapi.getModel(model, source); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (!_.has(strapi.plugins, 'upload')) return entry; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const uploadService = strapi.plugins.upload.services.upload; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const findModelFromUploadPath = path => { | 
					
						
							|  |  |  |     if (path.length === 0) return { model, source }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-07 18:11:23 +01:00
										 |  |  |     let currentPath = []; | 
					
						
							| 
									
										
										
										
											2019-08-01 17:19:49 +02:00
										 |  |  |     let tmpModel = entity; | 
					
						
							|  |  |  |     let modelName = model; | 
					
						
							|  |  |  |     let sourceName; | 
					
						
							| 
									
										
										
										
											2019-11-26 17:01:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-07 18:11:23 +01:00
										 |  |  |     for (let i = 0; i < path.length; i++) { | 
					
						
							| 
									
										
										
										
											2019-08-01 17:19:49 +02:00
										 |  |  |       if (!tmpModel) return {}; | 
					
						
							| 
									
										
										
										
											2019-11-07 18:11:23 +01:00
										 |  |  |       const part = path[i]; | 
					
						
							| 
									
										
										
										
											2019-08-01 17:19:49 +02:00
										 |  |  |       const attr = tmpModel.attributes[part]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-07 18:11:23 +01:00
										 |  |  |       currentPath.push(part); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // ignore array indexes => handled in the dynamic zone section
 | 
					
						
							|  |  |  |       if (_.isFinite(_.toNumber(path[i]))) { | 
					
						
							|  |  |  |         continue; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-01 17:19:49 +02:00
										 |  |  |       if (!attr) return {}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-22 18:01:03 +02:00
										 |  |  |       if (attr.type === 'component') { | 
					
						
							|  |  |  |         modelName = attr.component; | 
					
						
							|  |  |  |         tmpModel = strapi.components[attr.component]; | 
					
						
							| 
									
										
										
										
											2019-11-07 18:11:23 +01:00
										 |  |  |       } else if (attr.type === 'dynamiczone') { | 
					
						
							|  |  |  |         const entryIdx = path[i + 1]; // get component index
 | 
					
						
							| 
									
										
										
										
											2019-11-26 17:01:58 +01:00
										 |  |  |         const value = _.get(entry, [...currentPath, entryIdx]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!value) return {}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         modelName = value.__component; // get component type
 | 
					
						
							| 
									
										
										
										
											2019-11-07 18:11:23 +01:00
										 |  |  |         tmpModel = strapi.components[modelName]; | 
					
						
							| 
									
										
										
										
											2019-08-01 17:19:49 +02:00
										 |  |  |       } else if (_.has(attr, 'model') || _.has(attr, 'collection')) { | 
					
						
							|  |  |  |         sourceName = attr.plugin; | 
					
						
							|  |  |  |         modelName = attr.model || attr.collection; | 
					
						
							|  |  |  |         tmpModel = strapi.getModel(attr.model || attr.collection, source); | 
					
						
							|  |  |  |       } else { | 
					
						
							|  |  |  |         return {}; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return { model: modelName, source: sourceName }; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const doUpload = async (key, files) => { | 
					
						
							|  |  |  |     const parts = key.split('.'); | 
					
						
							|  |  |  |     const [path, field] = [_.initial(parts), _.last(parts)]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const { model, source } = findModelFromUploadPath(path); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (model) { | 
					
						
							| 
									
										
										
										
											2019-08-05 10:31:18 +02:00
										 |  |  |       const id = _.get(entry, path.concat('id')); | 
					
						
							| 
									
										
										
										
											2019-11-26 17:01:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-03 15:54:59 +01:00
										 |  |  |       return uploadService.uploadToEntity({ id, model, field }, files, source); | 
					
						
							| 
									
										
										
										
											2019-08-01 17:19:49 +02:00
										 |  |  |     } | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   await Promise.all(Object.keys(files).map(key => doUpload(key, files[key]))); | 
					
						
							|  |  |  | }; |