@@ -5,9 +5,20 @@ import type {
55} from "adminforth" ;
66import clone from 'clone' ;
77
8- import { AdminForthPlugin , AdminForthResourcePages , suggestIfTypo } from "adminforth" ;
8+ import { AdminForthPlugin , parseBody , AdminForthResourcePages , suggestIfTypo } from "adminforth" ;
99import { PluginOptions } from "./types.js" ;
1010import { interpretResource , ActionCheckSource } from "adminforth" ;
11+ import { z } from "zod" ;
12+
13+ const startBulkActionBodySchema = z . object ( {
14+ resourceId : z . string ( ) ,
15+ actionId : z . union ( [ z . string ( ) , z . number ( ) ] ) ,
16+ recordIds : z . array ( z . union ( [ z . string ( ) , z . number ( ) ] ) ) ,
17+ } ) . strict ( ) ;
18+
19+ const getDefaultFiltersBodySchema = z . object ( {
20+ record : z . record ( z . string ( ) , z . any ( ) ) . nullish ( ) ,
21+ } ) . strict ( ) ;
1122
1223export default class ForeignInlineListPlugin extends AdminForthPlugin {
1324 foreignResource : AdminForthResource ;
@@ -56,8 +67,11 @@ export default class ForeignInlineListPlugin extends AdminForthPlugin {
5667 server . endpoint ( {
5768 method : 'POST' ,
5869 path : `/plugin/${ this . pluginInstanceId } /start_bulk_action` ,
59- handler : async ( { body, adminUser, tr } ) => {
60- const { resourceId, actionId, recordIds } = body ;
70+ handler : async ( { body, adminUser, tr, response : httpResponse } ) => {
71+ const parsed = parseBody ( startBulkActionBodySchema , body , httpResponse ) ;
72+ if ( 'error' in parsed ) return parsed . error ;
73+ const data = parsed . data ;
74+ const { resourceId, actionId, recordIds } = data ;
6175 const resource = this . adminforth . config . resources . find ( ( res ) => res . resourceId == resourceId ) ;
6276 if ( ! resource ) {
6377 return { error : await tr ( `Resource {resourceId} not found` , 'errors' , { resourceId } ) } ;
@@ -102,11 +116,14 @@ export default class ForeignInlineListPlugin extends AdminForthPlugin {
102116 server . endpoint ( {
103117 method : 'POST' ,
104118 path : `/plugin/${ this . pluginInstanceId } /get_default_filters` ,
105- handler : async ( { body} ) => {
119+ handler : async ( { body, response } ) => {
106120 if ( ! this . options . defaultFilters ) {
107121 return { error : 'No default filters function defined' , ok : false } ;
108122 }
109- const record = body . record ;
123+ const parsed = parseBody ( getDefaultFiltersBodySchema , body , response ) ;
124+ if ( 'error' in parsed ) return parsed . error ;
125+ const data = parsed . data ;
126+ const record = data . record ;
110127 if ( ! record ) {
111128 return { error : 'No record provided in request body' , ok : false } ;
112129 }
0 commit comments