| 
									
										
										
										
											2020-10-22 16:43:51 +02:00
										 |  |  | 'use strict'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const { intersection, difference } = require('lodash'); | 
					
						
							|  |  |  | const { createDefaultConfiguration, syncConfiguration } = require('./utils/configuration'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module.exports = ({ isComponent, prefix, storeUtils, getModels }) => { | 
					
						
							| 
									
										
										
										
											2022-08-08 23:33:39 +02:00
										 |  |  |   const uidToStoreKey = (uid) => { | 
					
						
							| 
									
										
										
										
											2020-10-22 16:43:51 +02:00
										 |  |  |     return `${prefix}::${uid}`; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-08 23:33:39 +02:00
										 |  |  |   const getConfiguration = (uid) => { | 
					
						
							| 
									
										
										
										
											2020-10-22 16:43:51 +02:00
										 |  |  |     const storeKey = uidToStoreKey(uid); | 
					
						
							|  |  |  |     return storeUtils.getModelConfiguration(storeKey); | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const setConfiguration = (uid, input) => { | 
					
						
							|  |  |  |     const { settings, metadatas, layouts } = input; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const configuration = { | 
					
						
							|  |  |  |       uid, | 
					
						
							|  |  |  |       settings, | 
					
						
							|  |  |  |       metadatas, | 
					
						
							|  |  |  |       layouts, | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (isComponent) { | 
					
						
							|  |  |  |       configuration.isComponent = isComponent; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const storeKey = uidToStoreKey(uid); | 
					
						
							|  |  |  |     return storeUtils.setModelConfiguration(storeKey, configuration); | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-08 23:33:39 +02:00
										 |  |  |   const deleteConfiguration = (uid) => { | 
					
						
							| 
									
										
										
										
											2020-10-22 16:43:51 +02:00
										 |  |  |     const storeKey = uidToStoreKey(uid); | 
					
						
							|  |  |  |     return storeUtils.deleteKey(storeKey); | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const syncConfigurations = async () => { | 
					
						
							|  |  |  |     const models = getModels(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const configurations = await storeUtils.findByKey( | 
					
						
							|  |  |  |       `plugin_content_manager_configuration_${prefix}` | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-08 23:33:39 +02:00
										 |  |  |     const updateConfiguration = async (uid) => { | 
					
						
							|  |  |  |       const conf = configurations.find((conf) => conf.uid === uid); | 
					
						
							| 
									
										
										
										
											2020-10-22 16:43:51 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |       return setConfiguration(uid, await syncConfiguration(conf, models[uid])); | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-08 23:33:39 +02:00
										 |  |  |     const generateNewConfiguration = async (uid) => { | 
					
						
							| 
									
										
										
										
											2020-10-22 16:43:51 +02:00
										 |  |  |       return setConfiguration(uid, await createDefaultConfiguration(models[uid])); | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const currentUIDS = Object.keys(models); | 
					
						
							|  |  |  |     const DBUIDs = configurations.map(({ uid }) => uid); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const contentTypesToUpdate = intersection(currentUIDS, DBUIDs); | 
					
						
							|  |  |  |     const contentTypesToAdd = difference(currentUIDS, DBUIDs); | 
					
						
							|  |  |  |     const contentTypesToDelete = difference(DBUIDs, currentUIDS); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-06 19:25:09 +01:00
										 |  |  |     // delete old schemas
 | 
					
						
							| 
									
										
										
										
											2022-08-08 23:33:39 +02:00
										 |  |  |     await Promise.all(contentTypesToDelete.map((uid) => deleteConfiguration(uid))); | 
					
						
							| 
									
										
										
										
											2020-10-22 16:43:51 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // create new schemas
 | 
					
						
							| 
									
										
										
										
											2022-08-08 23:33:39 +02:00
										 |  |  |     await Promise.all(contentTypesToAdd.map((uid) => generateNewConfiguration(uid))); | 
					
						
							| 
									
										
										
										
											2020-10-22 16:43:51 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // update current schemas
 | 
					
						
							| 
									
										
										
										
											2022-08-08 23:33:39 +02:00
										 |  |  |     await Promise.all(contentTypesToUpdate.map((uid) => updateConfiguration(uid))); | 
					
						
							| 
									
										
										
										
											2020-10-22 16:43:51 +02:00
										 |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return { | 
					
						
							|  |  |  |     getConfiguration, | 
					
						
							|  |  |  |     setConfiguration, | 
					
						
							|  |  |  |     deleteConfiguration, | 
					
						
							|  |  |  |     syncConfigurations, | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | }; |