| 
									
										
										
										
											2020-10-27 16:01:46 +01:00
										 |  |  | 'use strict'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-04 19:39:40 +02:00
										 |  |  | const { prop, pick } = require('lodash/fp'); | 
					
						
							| 
									
										
										
										
											2021-04-29 13:51:12 +02:00
										 |  |  | const { PUBLISHED_AT_ATTRIBUTE } = require('@strapi/utils').contentTypes.constants; | 
					
						
							| 
									
										
										
										
											2020-10-27 16:01:46 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | const { getService } = require('../utils'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module.exports = { | 
					
						
							|  |  |  |   async find(ctx) { | 
					
						
							|  |  |  |     const { model, targetField } = ctx.params; | 
					
						
							|  |  |  |     const { _component, ...query } = ctx.request.query; | 
					
						
							| 
									
										
										
										
											2021-01-25 17:58:18 +01:00
										 |  |  |     const { idsToOmit } = ctx.request.body; | 
					
						
							| 
									
										
										
										
											2020-10-27 16:01:46 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (!targetField) { | 
					
						
							|  |  |  |       return ctx.badRequest(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-08 18:15:32 +02:00
										 |  |  |     const modelDef = _component ? strapi.getModel(_component) : strapi.getModel(model); | 
					
						
							| 
									
										
										
										
											2020-10-27 16:01:46 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (!modelDef) { | 
					
						
							|  |  |  |       return ctx.notFound('model.notFound'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-08 18:15:32 +02:00
										 |  |  |     const attribute = modelDef.attributes[targetField]; | 
					
						
							|  |  |  |     if (!attribute || attribute.type !== 'relation') { | 
					
						
							| 
									
										
										
										
											2020-10-27 16:01:46 +01:00
										 |  |  |       return ctx.badRequest('targetField.invalid'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-08 18:15:32 +02:00
										 |  |  |     const target = strapi.getModel(attribute.target); | 
					
						
							| 
									
										
										
										
											2020-10-27 16:01:46 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (!target) { | 
					
						
							|  |  |  |       return ctx.notFound('target.notFound'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-25 17:58:18 +01:00
										 |  |  |     if (idsToOmit && Array.isArray(idsToOmit)) { | 
					
						
							| 
									
										
										
										
											2021-07-08 21:53:30 +02:00
										 |  |  |       query.filters = { | 
					
						
							|  |  |  |         $and: [ | 
					
						
							|  |  |  |           { | 
					
						
							|  |  |  |             id: { | 
					
						
							|  |  |  |               $notIn: idsToOmit, | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |           }, | 
					
						
							| 
									
										
										
										
											2021-07-19 19:36:40 +02:00
										 |  |  |         ].concat(query.filters || []), | 
					
						
							| 
									
										
										
										
											2021-07-08 21:53:30 +02:00
										 |  |  |       }; | 
					
						
							| 
									
										
										
										
											2021-01-25 17:58:18 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-02 21:13:50 +01:00
										 |  |  |     const entityManager = getService('entity-manager'); | 
					
						
							| 
									
										
										
										
											2020-10-27 16:01:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-28 21:03:32 +02:00
										 |  |  |     const entities = await entityManager.find(query, target.uid, []); | 
					
						
							| 
									
										
										
										
											2020-10-27 16:01:46 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (!entities) { | 
					
						
							|  |  |  |       return ctx.notFound(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const modelConfig = _component | 
					
						
							|  |  |  |       ? await getService('components').findConfiguration(modelDef) | 
					
						
							|  |  |  |       : await getService('content-types').findConfiguration(modelDef); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const field = prop(`metadatas.${targetField}.edit.mainField`, modelConfig) || 'id'; | 
					
						
							|  |  |  |     const pickFields = [field, 'id', target.primaryKey, PUBLISHED_AT_ATTRIBUTE]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ctx.body = entities.map(pick(pickFields)); | 
					
						
							|  |  |  |   }, | 
					
						
							|  |  |  | }; |