From 6e5c5f599e5c8d12a7c8da81f949adf7f61e6916 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Van=20Canneyt?= Date: Sun, 5 Feb 2023 11:32:50 +0100 Subject: [PATCH] * Completion of put/patch split --- .../fcl-web/src/restbridge/sqldbrestbridge.pp | 28 +++++++++++++++---- .../fcl-web/src/restbridge/sqldbrestdata.pp | 10 +++++-- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/packages/fcl-web/src/restbridge/sqldbrestbridge.pp b/packages/fcl-web/src/restbridge/sqldbrestbridge.pp index e88338f7a1..711c087a2a 100644 --- a/packages/fcl-web/src/restbridge/sqldbrestbridge.pp +++ b/packages/fcl-web/src/restbridge/sqldbrestbridge.pp @@ -159,6 +159,7 @@ Type Class Var FDBHandlerClass : TSQLDBRestDBHandlerClass; private FAdminUserIDs: TStrings; + FAfterPatch: TRestOperationEvent; FConnectionManager: TSQLDBConnectionManager; FCORSAllowCredentials: Boolean; FCORSAllowedOrigins: String; @@ -182,6 +183,7 @@ Type FBeforeGet: TRestOperationEvent; FBeforePost: TRestOperationEvent; FBeforePut: TRestOperationEvent; + FBeforePatch: TRestOperationEvent; FConnections: TSQLDBRestConnectionList; FDefaultConnection: UTF8String; FEnforceLimit: Integer; @@ -370,6 +372,10 @@ Type Property BeforeGet : TRestOperationEvent Read FBeforeGet Write FBeforeGet; // Called After a GET request. Property AfterGet : TRestOperationEvent Read FAfterGet Write FAfterGet; + // Called before a PATCH request. + Property BeforePatch : TRestOperationEvent Read FBeforePatch Write FBeforePatch; + // Called after a PATCH request. + Property AfterPatch : TRestOperationEvent Read FAfterPatch Write FAfterPatch; // Called before a PUT request. Property BeforePut : TRestOperationEvent Read FBeforePut Write FBeforePut; // Called After a PUT request. @@ -1003,7 +1009,7 @@ begin Def:=[foInInsert,foInUpdate,foFilter]; Result:=TSQLDBRestResource.Create(Nil); Result.ResourceName:=Strings.GetRestString(rpConnectionResourceName); - Result.AllowedOperations:=[roGet,roPut,roPost,roDelete]; + Result.AllowedOperations:=[roGet,roPut,roPatch,roPost,roDelete]; if rdoHandleCORS in DispatchOptions then Result.AllowedOperations:=Result.AllowedOperations+[roOptions,roHead]; Result.Fields.AddField('name',rftString,Def+[foInKey,foRequired]); @@ -1133,11 +1139,7 @@ begin M:=aRequest.CustomHeaders.Values['Access-Control-Request-Method']; Case lowercase(M) of 'get' : Result:=roGet; - 'put' : - begin - Result:=roPut; - - end; + 'put' : Result:=roPut; 'post' : Result:=roPost; 'delete' : Result:=roDelete; 'options' : Result:=roOptions; @@ -1254,6 +1256,13 @@ begin if assigned(BP) then ResEvt:=BP.BeforeDatabaseRead; end; + roPatch: + begin + R:=FBeforePatch; + Evt:=BeforeDatabaseUpdate; + if assigned(BP) then + ResEvt:=BP.BeforeDatabaseUpdate; + end; roPut : begin R:=FBeforePut; @@ -1300,6 +1309,13 @@ begin if assigned(BP) then ResEvt:=BP.AfterDatabaseUpdate; end; + roPatch : + begin + R:=FAfterPatch; + Evt:=AfterDatabaseUpdate; + if assigned(BP) then + ResEvt:=BP.AfterDatabaseUpdate; + end; roPost : begin R:=FAfterPost; diff --git a/packages/fcl-web/src/restbridge/sqldbrestdata.pp b/packages/fcl-web/src/restbridge/sqldbrestdata.pp index 4195129e20..4e4d819c6b 100644 --- a/packages/fcl-web/src/restbridge/sqldbrestdata.pp +++ b/packages/fcl-web/src/restbridge/sqldbrestdata.pp @@ -142,6 +142,7 @@ begin Case IO.Operation of roGet : DoHandleGet; roPut : DoHandlePut; + roPatch : DoHandlePatch; roPost : DoHandlePost; roDelete : DoHandleDelete; else @@ -497,6 +498,7 @@ begin case aOperation of roGet : Sources:=[vsQuery,vsRoute]; roPost, + roPatch, roPut : Sources:=[vsQuery,vsContent,vsRoute]; roDelete : Sources:=[vsQuery,vsRoute]; else @@ -1029,6 +1031,9 @@ end; procedure TSQLDBRestDBHandler.UpdateExistingRecord(OldData: TDataset; IsPatch: Boolean); +const + putpatch : Array [Boolean] of TRestOperation = (roPut,roPatch); + Var S : TSQLQuery; aRowsAffected: Integer; @@ -1036,6 +1041,7 @@ Var WhereFilterList : TRestFilterPairArray; RequestFields : TSQLDBRestFieldArray; + begin if (OldData=ExternalDataset) then begin @@ -1065,9 +1071,9 @@ begin S.SQL.Text:=SQL; if (not isPatch) and UseLegacyPUT then SetPostParams(S.Params,OldData.Fields); - FillParams(roGet,S.Params,WhereFilterList); + FillParams(PutPatch[isPatch],S.Params,WhereFilterList); // Give user a chance to look at it. - FResource.CheckParams(io.RestContext,roPut,S.Params); + FResource.CheckParams(io.RestContext,PutPatch[IsPatch],S.Params); S.ExecSQL; if CheckUpdateCount then begin