@@ -110,6 +110,78 @@ const handleReferences = (
110
110
111
111
exports . handleReferences = handleReferences
112
112
113
+ const handleDeletedNode = async ( {
114
+ actions,
115
+ node,
116
+ getNode,
117
+ createNodeId,
118
+ createContentDigest,
119
+ entityReferenceRevisions,
120
+ } ) => {
121
+ const deletedNode = getNode (
122
+ createNodeId (
123
+ createNodeIdWithVersion (
124
+ node . id ,
125
+ node . type ,
126
+ getOptions ( ) . languageConfig ? node . attributes . langcode : `und` ,
127
+ node . attributes ?. drupal_internal__revision_id ,
128
+ entityReferenceRevisions
129
+ )
130
+ )
131
+ )
132
+
133
+ // Remove the deleted node from backRefsNamesLookup
134
+ backRefsNamesLookup . delete ( deletedNode )
135
+
136
+ // Remove relationships from other nodes and re-create them.
137
+ Object . keys ( deletedNode . relationships ) . forEach ( key => {
138
+ let ids = deletedNode . relationships [ key ]
139
+ ids = [ ] . concat ( ids )
140
+ ids . forEach ( id => {
141
+ const node = getNode ( id )
142
+ let referencedNodes = referencedNodesLookup . get ( node )
143
+ if ( referencedNodes ?. includes ( deletedNode . id ) ) {
144
+ // Loop over relationships and cleanup references.
145
+ Object . entries ( node . relationships ) . forEach ( ( [ key , value ] ) => {
146
+ // If a string ref matches, delete it.
147
+ if ( _ . isString ( value ) && value === deletedNode . id ) {
148
+ delete node . relationships [ key ]
149
+ }
150
+
151
+ // If it's an array, filter, then check if the array is empty and then delete
152
+ // if so
153
+ if ( _ . isArray ( value ) ) {
154
+ value = value . filter ( v => v !== deletedNode . id )
155
+
156
+ if ( value . length === 0 ) {
157
+ delete node . relationships [ key ]
158
+ } else {
159
+ node . relationships [ key ] = value
160
+ }
161
+ }
162
+ } )
163
+
164
+ // Remove deleted node from array of referencedNodes
165
+ referencedNodes = referencedNodes . filter ( nId => nId !== deletedNode . id )
166
+ referencedNodesLookup . set ( node , referencedNodes )
167
+ }
168
+ // Recreate the referenced node with its now cleaned-up relationships.
169
+ if ( node . internal . owner ) {
170
+ delete node . internal . owner
171
+ }
172
+ if ( node . fields ) {
173
+ delete node . fields
174
+ }
175
+ node . internal . contentDigest = createContentDigest ( node )
176
+ actions . createNode ( node )
177
+ } )
178
+ } )
179
+
180
+ actions . deleteNode ( deletedNode )
181
+
182
+ return deletedNode
183
+ }
184
+
113
185
const handleWebhookUpdate = async (
114
186
{
115
187
nodeToUpdate,
@@ -216,3 +288,4 @@ const handleWebhookUpdate = async (
216
288
}
217
289
218
290
exports . handleWebhookUpdate = handleWebhookUpdate
291
+ exports . handleDeletedNode = handleDeletedNode
0 commit comments