@@ -485,7 +485,12 @@ public override async Task<ICreateResponse> SendAsync<T>(ICreateRequest<T> req)
485485 try
486486 {
487487 var responseJson = await response . Content . ReadAsStringAsync ( ) . ConfigureAwait ( false ) ;
488- return JsonConvert . DeserializeObject < CreateResponse > ( responseJson ) ;
488+ var responseObject = JsonConvert . DeserializeObject < CreateResponse > ( responseJson ) ;
489+
490+ var joResponse = JObject . Parse ( responseJson ) ;
491+ PopulateScriptResults ( responseObject . Response , joResponse [ "response" ] ) ;
492+
493+ return responseObject ;
489494 }
490495 catch ( Exception ex )
491496 {
@@ -532,6 +537,9 @@ public override async Task<IEditResponse> SendAsync<T>(IEditRequest<T> req)
532537 var responseJson = await response . Content . ReadAsStringAsync ( ) . ConfigureAwait ( false ) ;
533538 var responseObject = JsonConvert . DeserializeObject < EditResponse > ( responseJson ) ;
534539
540+ var joResponse = JObject . Parse ( responseJson ) ;
541+ PopulateScriptResults ( responseObject . Response , joResponse [ "response" ] ) ;
542+
535543 return responseObject ;
536544 }
537545 catch ( Exception ex )
@@ -546,7 +554,7 @@ public override async Task<IEditResponse> SendAsync<T>(IEditRequest<T> req)
546554 /// </summary>
547555 /// <param name="req">The delete record request.</param>
548556 /// <returns></returns>
549- public override async Task < IResponse > SendAsync ( IDeleteRequest req )
557+ public override async Task < IDeleteResponse > SendAsync ( IDeleteRequest req )
550558 {
551559 if ( string . IsNullOrEmpty ( req . Layout ) ) throw new ArgumentException ( "Layout is required on the request." ) ;
552560 if ( req . RecordId == 0 ) throw new ArgumentException ( "RecordId is required on the request and must not be zero." ) ;
@@ -555,7 +563,7 @@ public override async Task<IResponse> SendAsync(IDeleteRequest req)
555563
556564 if ( response . StatusCode == HttpStatusCode . NotFound )
557565 {
558- return new BaseResponse ( "404" , "Error" ) ;
566+ return new Responses . DeleteResponse { Messages = new List < ResponseMessage > { new ResponseMessage { Code = "404" , Message = "Error" } } } ;
559567 }
560568
561569 if ( response . StatusCode == HttpStatusCode . InternalServerError )
@@ -576,7 +584,11 @@ public override async Task<IResponse> SendAsync(IDeleteRequest req)
576584 try
577585 {
578586 var responseJson = await response . Content . ReadAsStringAsync ( ) . ConfigureAwait ( false ) ;
579- var responseObject = JsonConvert . DeserializeObject < BaseResponse > ( responseJson ) ;
587+ var responseObject = JsonConvert . DeserializeObject < Responses . DeleteResponse > ( responseJson ) ;
588+
589+ var joResponse = JObject . Parse ( responseJson ) ;
590+ PopulateScriptResults ( responseObject . Response , joResponse [ "response" ] ) ;
591+
580592 return responseObject ;
581593 }
582594 catch ( Exception ex )
@@ -587,7 +599,7 @@ public override async Task<IResponse> SendAsync(IDeleteRequest req)
587599 }
588600
589601 /// <inheritdoc />
590- public override async Task < ( IEnumerable < TResponse > , DataInfoModel ) > SendFindRequestAsync < TResponse , TRequest > (
602+ public override async Task < ( IEnumerable < TResponse > , DataInfoModel , ActionResponse ) > SendFindRequestAsync < TResponse , TRequest > (
591603 IFindRequest < TRequest > req ,
592604 Func < TResponse , int , object > fmId = null ,
593605 Func < TResponse , int , object > modId = null )
@@ -612,16 +624,29 @@ public override async Task<IResponse> SendAsync(IDeleteRequest req)
612624
613625 var joResponse = JObject . Parse ( responseJson ) ;
614626
627+ var responseToken = joResponse [ "response" ] ;
628+
615629 // get JSON result objects into a list
616- IList < JToken > results = joResponse [ "response" ] [ "data" ] . Children ( ) . ToList ( ) ;
630+ IList < JToken > results = responseToken [ "data" ] . Children ( ) . ToList ( ) ;
617631
618632 DataInfoModel dataInfo = null ;
619- var infoDataToken = joResponse [ "response" ] [ "dataInfo" ] ;
633+ var infoDataToken = responseToken [ "dataInfo" ] ;
620634 if ( infoDataToken != null )
621635 {
622636 dataInfo = infoDataToken . ToObject < DataInfoModel > ( ) ;
623637 }
624638
639+ // extract script results from response
640+ var scriptResponse = new ActionResponse
641+ {
642+ ScriptError = responseToken [ "scriptError" ] ? . ToObject < int > ( ) ?? 0 ,
643+ ScriptResult = responseToken [ "scriptResult" ] ? . ToString ( ) ,
644+ ScriptErrorPreRequest = responseToken [ "scriptError.prerequest" ] ? . ToObject < int > ( ) ?? 0 ,
645+ ScriptResultPreRequest = responseToken [ "scriptResult.prerequest" ] ? . ToString ( ) ,
646+ ScriptErrorPreSort = responseToken [ "scriptError.presort" ] ? . ToObject < int > ( ) ?? 0 ,
647+ ScriptResultPreSort = responseToken [ "scriptResult.presort" ] ? . ToString ( ) ,
648+ } ;
649+
625650 // serialize JSON results into .NET objects
626651 IList < TResponse > searchResults = new List < TResponse > ( ) ;
627652 foreach ( var result in results )
@@ -638,7 +663,7 @@ public override async Task<IResponse> SendAsync(IDeleteRequest req)
638663 await ProcessContainers ( searchResults ) . ConfigureAwait ( false ) ;
639664 }
640665
641- return ( searchResults , dataInfo ) ;
666+ return ( searchResults , dataInfo , scriptResponse ) ;
642667 }
643668
644669 if ( response . StatusCode == HttpStatusCode . InternalServerError )
@@ -651,7 +676,7 @@ public override async Task<IResponse> SendAsync(IDeleteRequest req)
651676 if ( responseObject . Messages . Any ( m => m . Code == "401" ) )
652677 {
653678 // FileMaker no records match the find request => empty list.
654- return ( new List < TResponse > ( ) , new DataInfoModel ( ) ) ;
679+ return ( new List < TResponse > ( ) , new DataInfoModel ( ) , null ) ;
655680 }
656681 // throw FMDataException for anything not a 401.
657682 throw new FMDataException (
@@ -663,7 +688,7 @@ public override async Task<IResponse> SendAsync(IDeleteRequest req)
663688 // not found, so return empty list
664689 if ( response . StatusCode == HttpStatusCode . NotFound )
665690 {
666- return ( new List < TResponse > ( ) , new DataInfoModel ( ) ) ;
691+ return ( new List < TResponse > ( ) , new DataInfoModel ( ) , null ) ;
667692 }
668693
669694 // other error
@@ -1197,6 +1222,22 @@ private async Task<HttpResponseMessage> RetryOnUnauthorizedAsync(Func<Task<HttpR
11971222 /// <param name="modId">Modification Id map function.</param>
11981223 /// <param name="input">JSON.NET JToken instance from Data Api Response.</param>
11991224 /// <returns></returns>
1225+ /// <summary>
1226+ /// Extracts script result fields (including pre-request and pre-sort) from a response JToken.
1227+ /// Handles dotted property names that cannot be mapped via attributes.
1228+ /// </summary>
1229+ private static void PopulateScriptResults ( ActionResponse target , JToken responseToken )
1230+ {
1231+ if ( target == null || responseToken == null ) return ;
1232+
1233+ target . ScriptError = responseToken [ "scriptError" ] ? . ToObject < int > ( ) ?? 0 ;
1234+ target . ScriptResult = responseToken [ "scriptResult" ] ? . ToString ( ) ;
1235+ target . ScriptErrorPreRequest = responseToken [ "scriptError.prerequest" ] ? . ToObject < int > ( ) ?? 0 ;
1236+ target . ScriptResultPreRequest = responseToken [ "scriptResult.prerequest" ] ? . ToString ( ) ;
1237+ target . ScriptErrorPreSort = responseToken [ "scriptError.presort" ] ? . ToObject < int > ( ) ?? 0 ;
1238+ target . ScriptResultPreSort = responseToken [ "scriptResult.presort" ] ? . ToString ( ) ;
1239+ }
1240+
12001241 private static T ConvertJTokenToInstance < T > ( Func < T , int , object > fmId , Func < T , int , object > modId , JToken input ) where T : class , new ( )
12011242 {
12021243 // JToken.ToObject is a helper method that uses JsonSerializer internally
0 commit comments