1+ /**
2+ * @typedef {import('../../shared/types').App } App
3+ * @typedef {import('./types/AlterScriptDto').AlterScriptDto } AlterScriptDto
4+ */
15const { getContainersScripts } = require ( './alterScriptHelpers/alterContainerHelper' ) ;
2- const {
3- getModifyCollectionScriptDtos,
4- getModifyCollectionKeysScriptDtos,
5- getModifyColumnScriptDtos,
6- } = require ( './alterScriptHelpers/alterEntityHelper' ) ;
6+ const { getEntitiesScripts } = require ( './alterScriptHelpers/alterEntityHelper' ) ;
77const {
88 getDeleteForeignKeyScriptDtos,
99 getAddForeignKeyScriptDtos,
1010 getModifyForeignKeyScriptDtos,
1111} = require ( './alterScriptHelpers/alterForeignKeyHelper' ) ;
1212const { getModifyViewScriptDtos } = require ( './alterScriptHelpers/alterViewHelper' ) ;
1313
14+ /**
15+ * @param {T } data
16+ * @return {Array<T> }
17+ */
1418const getItems = data => [ data ?. items ] . flat ( ) . filter ( Boolean ) ;
1519
1620/**
17- * @param dto {{
21+ * @param {{
1822 * collection: Object,
1923 * app: App
20- * }}
21- * @return {AlterScriptDto[] }
22- * */
24+ * }} param
25+ */
2326const getAlterContainersScriptDtos = ( { collection, app } ) => {
2427 const { added, deleted, modified } = collection . properties ?. containers ?. properties || { } ;
2528 const addedContainers = getItems ( added ) ;
@@ -29,41 +32,86 @@ const getAlterContainersScriptDtos = ({ collection, app }) => {
2932 const { getAddContainerScriptDto, getDeleteContainerScriptDto, getModifyContainerScriptDto } =
3033 getContainersScripts ( app ) ;
3134
32- const addContainersScriptDtos = addedContainers
35+ const addedContainersScriptDtos = addedContainers
3336 . map ( container => Object . values ( container . properties ) [ 0 ] )
3437 . flatMap ( getAddContainerScriptDto ) ;
3538
36- const deleteContainersScriptDtos = deletedContainers
39+ const deletedContainersScriptDtos = deletedContainers
3740 . map ( container => Object . values ( container . properties ) [ 0 ] )
3841 . flatMap ( getDeleteContainerScriptDto ) ;
3942
40- const modifyContainersScriptDtos = modifiedContainers
43+ const modifiedContainersScriptDtos = modifiedContainers
4144 . map ( containerWrapper => Object . values ( containerWrapper . properties ) [ 0 ] )
4245 . flatMap ( getModifyContainerScriptDto ) ;
4346
44- return [ ...addContainersScriptDtos , ...deleteContainersScriptDtos , ...modifyContainersScriptDtos ] . filter ( Boolean ) ;
47+ // Schemas can only be dropped after all contained tables are removed,
48+ // so container cleanup must happen last.
49+ return {
50+ deletedContainersScriptDtos,
51+ upsertedContainersScriptDtos : [ ...addedContainersScriptDtos , ...modifiedContainersScriptDtos ] ,
52+ } ;
4553} ;
4654
55+ /**
56+ * @param {{collection: Object, app: App, modelDefinitions: Object, internalDefinitions: Object, externalDefinitions: Object, inlineDeltaRelationships?: any[]} } param
57+ * @return {Array<AlterScriptDto> }
58+ */
4759const getAlterCollectionScriptDtos = ( {
4860 collection,
4961 app,
5062 modelDefinitions,
5163 internalDefinitions,
5264 externalDefinitions,
65+ inlineDeltaRelationships = [ ] ,
5366} ) => {
54- const modifyScriptsData = getItems ( collection . properties ?. entities ?. properties ?. modified ) . map (
55- item => Object . values ( item . properties ) [ 0 ] ,
56- ) ;
67+ const { added, deleted, modified } = collection . properties ?. entities ?. properties || { } ;
68+ const addedCollections = getItems ( added ) . map ( item => Object . values ( item . properties ) [ 0 ] ) ;
69+ const deletedCollections = getItems ( deleted ) . map ( item => Object . values ( item . properties ) [ 0 ] ) ;
70+ const modifyScriptsData = getItems ( modified ) . map ( item => Object . values ( item . properties ) [ 0 ] ) ;
71+
72+ const {
73+ getAddCollectionScriptDto,
74+ getDeleteCollectionScriptDto,
75+ getModifyCollectionScriptDtos,
76+ getModifyCollectionKeysScriptDtos,
77+ getModifyColumnScriptDtos,
78+ getAddColumnScriptDtos,
79+ getDeleteColumnScriptDtos,
80+ } = getEntitiesScripts ( app , inlineDeltaRelationships ) ;
81+
82+ const addedCollectionScriptDtos = addedCollections
83+ . filter ( collection => collection . role . compMod . created )
84+ . map ( getAddCollectionScriptDto ) ;
85+
86+ const addedColumnScriptDtos = addedCollections . flatMap ( getAddColumnScriptDtos ) ;
87+
88+ const deletedCollectionScriptDtos = deletedCollections
89+ . filter ( collection => collection . role . compMod . deleted )
90+ . map ( getDeleteCollectionScriptDto ) ;
91+
92+ const deletedColumnScriptDtos = deletedCollections
93+ . filter ( collection => ! collection . role . compMod . deleted )
94+ . flatMap ( getDeleteColumnScriptDtos ) ;
5795
5896 const modifyCollectionScriptDtos = modifyScriptsData . flatMap ( getModifyCollectionScriptDtos ) ;
5997 const modifyCollectionKeysScriptDtos = modifyScriptsData . flatMap ( getModifyCollectionKeysScriptDtos ) ;
6098 const modifyColumnScriptDtos = modifyScriptsData . flatMap ( getModifyColumnScriptDtos ) ;
6199
62- return [ ...modifyCollectionScriptDtos , ...modifyColumnScriptDtos , ...modifyCollectionKeysScriptDtos ] . filter (
63- Boolean ,
64- ) ;
100+ return [
101+ ...deletedCollectionScriptDtos ,
102+ ...addedCollectionScriptDtos ,
103+ ...modifyCollectionScriptDtos ,
104+ ...deletedColumnScriptDtos ,
105+ ...addedColumnScriptDtos ,
106+ ...modifyColumnScriptDtos ,
107+ ...modifyCollectionKeysScriptDtos ,
108+ ] . filter ( Boolean ) ;
65109} ;
66110
111+ /**
112+ * @param {Object } collection
113+ * @return {Array<AlterScriptDto> }
114+ */
67115const getAlterViewScriptDtos = collection => {
68116 const modifyViewScriptDtos = getItems ( collection . properties ?. views ?. properties ?. modified )
69117 . map ( viewWrapper => Object . values ( viewWrapper . properties ) [ 0 ] )
@@ -73,6 +121,10 @@ const getAlterViewScriptDtos = collection => {
73121 return [ ...modifyViewScriptDtos ] . filter ( Boolean ) ;
74122} ;
75123
124+ /**
125+ * @param {{collection: Object, app: App, ignoreRelationshipIDs?: string[]} } param
126+ * @return {Array<AlterScriptDto> }
127+ */
76128const getAlterRelationshipsScriptDtos = ( { collection, app, ignoreRelationshipIDs = [ ] } ) => {
77129 const addedRelationships = getItems ( collection . properties ?. relationships ?. properties ?. added )
78130 . filter ( Boolean )
@@ -105,6 +157,10 @@ const getAlterRelationshipsScriptDtos = ({ collection, app, ignoreRelationshipID
105157 return [ ...deleteFkScriptDtos , ...addFkScriptDtos , ...modifiedFkScriptDtos ] . filter ( Boolean ) ;
106158} ;
107159
160+ /**
161+ * @param {{collection: Object, options: Object} } param
162+ * @return {Array<Object> }
163+ */
108164const getInlineRelationships = ( { collection, options } ) => {
109165 if ( options ?. scriptGenerationOptions ?. feActiveOptions ?. foreignKeys !== 'inline' ) {
110166 return [ ] ;
@@ -121,13 +177,17 @@ const getInlineRelationships = ({ collection, options }) => {
121177 return addedRelationships ;
122178} ;
123179
180+ /**
181+ * @param {AlterScriptDto } dto
182+ * @return {AlterScriptDto | undefined }
183+ */
124184const prettifyAlterScriptDto = dto => {
125185 if ( ! dto ) {
126186 return undefined ;
127187 }
128188 /**
129189 * @type {Array<ModificationScript> }
130- * * /
190+ */
131191 const nonEmptyScriptModificationDtos = dto . scripts
132192 . map ( scriptDto => ( {
133193 ...scriptDto ,
@@ -143,6 +203,11 @@ const prettifyAlterScriptDto = dto => {
143203 } ;
144204} ;
145205
206+ /**
207+ * @param {Object } data
208+ * @param {App } app
209+ * @return {Array<AlterScriptDto> }
210+ */
146211const getAlterScriptDtos = ( data , app ) => {
147212 const collection = JSON . parse ( data . jsonSchema ) ;
148213
@@ -159,14 +224,18 @@ const getAlterScriptDtos = (data, app) => {
159224 const inlineDeltaRelationships = getInlineRelationships ( { collection, options : data . options } ) ;
160225 const ignoreRelationshipIDs = inlineDeltaRelationships . map ( relationship => relationship . role . id ) ;
161226
162- const containersScriptDtos = getAlterContainersScriptDtos ( { collection, app } ) ;
227+ const { deletedContainersScriptDtos, upsertedContainersScriptDtos } = getAlterContainersScriptDtos ( {
228+ collection,
229+ app,
230+ } ) ;
163231
164232 const collectionsScriptDtos = getAlterCollectionScriptDtos ( {
165233 collection,
166234 app,
167235 modelDefinitions,
168236 internalDefinitions,
169237 externalDefinitions,
238+ inlineDeltaRelationships,
170239 } ) ;
171240
172241 const viewScriptDtos = getAlterViewScriptDtos ( collection ) ;
@@ -177,7 +246,13 @@ const getAlterScriptDtos = (data, app) => {
177246 ignoreRelationshipIDs,
178247 } ) ;
179248
180- return [ ...containersScriptDtos , ...collectionsScriptDtos , ...viewScriptDtos , ...relationshipScriptDtos ]
249+ return [
250+ ...upsertedContainersScriptDtos ,
251+ ...collectionsScriptDtos ,
252+ ...viewScriptDtos ,
253+ ...relationshipScriptDtos ,
254+ ...deletedContainersScriptDtos ,
255+ ]
181256 . filter ( Boolean )
182257 . map ( dto => dto && prettifyAlterScriptDto ( dto ) )
183258 . filter ( Boolean ) ;
0 commit comments