Skip to content
Merged
Show file tree
Hide file tree
Changes from 12 commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
ca65f67
feat: implement cascading deletion for related records in delete endp…
kulikp1 Feb 25, 2026
bda166a
add alowwedAction check
kulikp1 Feb 26, 2026
12d2ba6
add missing spaces
kulikp1 Feb 26, 2026
02e216b
feat: implement cascading deletion logic in delete endpoint
kulikp1 Feb 26, 2026
23d178b
fix: update check strategy
kulikp1 Feb 26, 2026
8b5b7b5
feat: refine cascading deletion logic in delete endpoint
kulikp1 Feb 26, 2026
01dfcfd
fix: update condition
kulikp1 Feb 26, 2026
ee04911
fix: change variable name foreignKeyColumn to foreignResourceColumn
kulikp1 Feb 26, 2026
96c2c8f
fix: add check for foreign resource onDelete strategy
kulikp1 Feb 27, 2026
a300f83
feat: add onDelete type
kulikp1 Feb 27, 2026
8ef2973
fix: delete strategy check
kulikp1 Feb 27, 2026
552ecdc
fix: add check for cascade strategy
kulikp1 Feb 27, 2026
423d6a0
fix: delete mistake in error message
kulikp1 Mar 2, 2026
ff63b6c
fix: streamline foreign resource onDelete strategy validation
kulikp1 Mar 2, 2026
9520f80
add missing space
kulikp1 Mar 2, 2026
d6502d3
fix: implement cascading deletion checks for MySQL, PostgreSQL, and S…
kulikp1 Mar 2, 2026
1843641
fix: resolve copilot comment
kulikp1 Mar 3, 2026
21cc9a4
fix: add required check for setNull deletion
kulikp1 Mar 3, 2026
81fce83
fix: change resource.options.allowedActions.delete check
kulikp1 Mar 3, 2026
ec17bd5
feat: implement cascading deletion logic in AdminForthRestAPI
kulikp1 Mar 4, 2026
a48d0a7
fix: delete unused console.log
kulikp1 Mar 4, 2026
c3a7a73
fix: delete unused arguments from function
kulikp1 Mar 4, 2026
b4d8aa1
fix: resolve copilot comment
kulikp1 Mar 4, 2026
604c0b3
docs: add documentation for cascade deletion
kulikp1 Mar 4, 2026
b3d3f24
fix: resolve comment
kulikp1 Mar 5, 2026
25c0007
fix: resolve copilot comment
kulikp1 Mar 5, 2026
2ad14c6
fix: add errror message
kulikp1 Mar 5, 2026
2ed72a3
fix: update errors copilot comment
kulikp1 Mar 5, 2026
aa3b223
fix: update query for mysql
kulikp1 Mar 5, 2026
067b87c
fix: change query for check pg database cascade
kulikp1 Mar 5, 2026
058283c
fix: cange requests for check cascade
kulikp1 Mar 5, 2026
b0acb77
fix: change query for check cascade
kulikp1 Mar 5, 2026
0c28370
style: add missing alignment
kulikp1 Mar 6, 2026
17ac6d4
style: add missing alignment
kulikp1 Mar 6, 2026
1641242
feat: update discoverFields method to include config parameter across…
kulikp1 Mar 9, 2026
1cbb653
feat: implement cascading deletion checks for MySQL, Postgres, and SQ…
kulikp1 Mar 9, 2026
778a90b
feat: implement checkCascadeWhenUploadPlugin method in base connector…
kulikp1 Mar 9, 2026
ca5bf91
fix: change check for cascade and upload plugin
kulikp1 Mar 10, 2026
66b0377
feat: implement cascading deletion utility for child resources
kulikp1 Mar 10, 2026
1acfe3e
feat: enhance cascading deletion logic to prevent infinite loops and …
kulikp1 Mar 11, 2026
ea5e92f
fix: delete unused check
kulikp1 Mar 11, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion adminforth/modules/configValidator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -618,7 +618,13 @@ export default class ConfigValidator implements IConfigValidator {
errors.push(`Resource "${res.resourceId}" column "${col.name}" isArray is enabled but suggestOnCreate is not an array`);
}
}

if (col.foreignResource){
Comment thread
kulikp1 marked this conversation as resolved.
Outdated
if (col.foreignResource.onDelete){
if (col.foreignResource.onDelete !== 'cascade' && col.foreignResource.onDelete !== 'setNull'){
errors.push (`Wrong delete strategy you can use 'onDelete' or 'cascade'`);
Comment thread
kulikp1 marked this conversation as resolved.
Outdated
}
}
Comment thread
kulikp1 marked this conversation as resolved.
}
if (col.foreignResource) {
if (!col.foreignResource.resourceId) {
// resourceId is absent or empty
Expand Down
20 changes: 19 additions & 1 deletion adminforth/modules/restApi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1464,8 +1464,26 @@ export default class AdminForthRestAPI implements IAdminForthRestAPI {
if (!record){
return { error: `Record with ${body['primaryKey']} not found` };
}
if (resource.options.allowedActions.delete === false) {
if (!resource.options.allowedActions.delete) {
Comment thread
kulikp1 marked this conversation as resolved.
Outdated
return { error: `Resource '${resource.resourceId}' does not allow delete action` };
}
const childResources = this.adminforth.config.resources.filter(r => r.columns.some(c => c.foreignResource?.resourceId === resource.resourceId));
if (childResources.length){
for (const childRes of childResources) {
const foreignResourceColumn = childRes.columns.find(c => c.foreignResource?.resourceId === resource.resourceId);
if (!foreignResourceColumn.foreignResource.onDelete) continue;
const onDeleteStrategy = foreignResourceColumn.foreignResource.onDelete;
const childRecords = await this.adminforth.resource(childRes.resourceId).list(Filters.EQ(foreignResourceColumn.name, body['primaryKey']))
if (onDeleteStrategy === 'cascade') {
for (const childRecord of childRecords) {
await this.adminforth.resource(childRes.resourceId).delete(childRecord.id);
}
} else if (onDeleteStrategy === 'setNull') {
for (const childRecord of childRecords) {
await this.adminforth.resource(childRes.resourceId).update(childRecord.id, {[foreignResourceColumn.name]: null});
Comment thread
kulikp1 marked this conversation as resolved.
Outdated
}
}
}
}
Comment thread
kulikp1 marked this conversation as resolved.
Outdated

const { allowedActions } = await interpretResource(
Comment thread
kulikp1 marked this conversation as resolved.
Expand Down
1 change: 1 addition & 0 deletions adminforth/types/Back.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2037,6 +2037,7 @@ export interface AdminForthForeignResource extends AdminForthForeignResourceComm
afterDatasourceResponse?: AfterDataSourceResponseFunction | Array<AfterDataSourceResponseFunction>,
},
},
onDelete: 'cascade' | 'setNull'
Comment thread
kulikp1 marked this conversation as resolved.
Outdated
}

export type ShowInModernInput = {
Expand Down