@@ -38,35 +38,34 @@ class SQLiteConnector extends AdminForthBaseConnector implements IAdminForthData
3838 } ) ) ;
3939 }
4040
41- async hasSQLiteCascadeFk ( resource : AdminForthResource , config : AdminForthConfig , fkMap : { [ colName : string ] : boolean } ) : Promise < boolean > {
41+ async hasSQLiteCascadeFk ( resource : AdminForthResource , config : AdminForthConfig ) : Promise < boolean > {
42+ const cascadeColumn = resource . columns ?. find ( c => c . foreignResource ?. onDelete === 'cascade' ) ;
43+ if ( ! cascadeColumn ) return false ;
4244
43- const hasAdminCascade = resource . columns ?. some ( c => c . foreignResource ?. onDelete === 'cascade' ) ;
44- if ( ! hasAdminCascade ) return false ;
45+ const parentResource = config . resources . find ( r => r . resourceId === cascadeColumn . foreignResource . resourceId ) ;
46+ if ( ! parentResource ) return false ;
4547
46- const hasDbCascade = Object . values ( fkMap ) . some ( v => v ) ;
48+ const fkStmt = this . client . prepare ( `PRAGMA foreign_key_list(${ resource . table } )` ) ;
49+ const fkRows = await fkStmt . all ( ) ;
50+ const fkMap : { [ colName : string ] : boolean } = { } ;
51+ fkRows . forEach ( fk => { fkMap [ fk . from ] = fk . on_delete ?. toUpperCase ( ) === 'CASCADE' ; } ) ;
4752
48- if ( hasDbCascade ) {
49- const tableName = ( resource . table ) ;
50- afLogger . warn (
51-
52- `Table "${ tableName } " has ON DELETE CASCADE, which may conflict with adminForth cascade deletion`
53- ) ;
53+ const hasCascadeOnTable = fkMap [ cascadeColumn . name ] || false ;
54+ const isUploadPluginInstalled = resource . plugins ?. some ( p => p . className === "UploadPlugin" ) ;
55+
56+ if ( hasCascadeOnTable && isUploadPluginInstalled ) {
57+ afLogger . warn ( `Table "${ resource . table } " has ON DELETE CASCADE and UploadPlugin installed, which may conflict with adminForth cascade deletion` ) ;
5458 }
5559
56- return hasDbCascade ;
60+ return hasCascadeOnTable ;
5761 }
5862
5963 async discoverFields ( resource : AdminForthResource , config : AdminForthConfig ) : Promise < { [ key : string ] : AdminForthResourceColumn } > {
60- await this . checkCascadeWhenUploadPlugin ( resource , config ) ;
6164
6265 const tableName = resource . table ;
6366 const stmt = this . client . prepare ( `PRAGMA table_info(${ tableName } )` ) ;
64- const rows = await stmt . all ( ) ;
65- const fkStmt = this . client . prepare ( `PRAGMA foreign_key_list(${ tableName } )` ) ;
66- const fkRows = await fkStmt . all ( ) ;
67- const fkMap : { [ colName : string ] : boolean } = { } ;
68- fkRows . forEach ( fk => { fkMap [ fk . from ] = fk . on_delete ?. toUpperCase ( ) === 'CASCADE' ; } )
69- await this . hasSQLiteCascadeFk ( resource , config , fkMap ) ;
67+ const rows = await stmt . all ( ) ;
68+ await this . hasSQLiteCascadeFk ( resource , config ) ;
7069 const fieldTypes = { } ;
7170 rows . forEach ( ( row ) => {
7271 const field : any = { } ;
@@ -112,7 +111,6 @@ class SQLiteConnector extends AdminForthBaseConnector implements IAdminForthData
112111 field . required = row . notnull == 1 ;
113112 field . primaryKey = row . pk == 1 ;
114113
115- field . cascade = fkMap [ row . name ] || false ;
116114 field . default = row . dflt_value ;
117115 fieldTypes [ row . name ] = field
118116 } ) ;
0 commit comments