unit RESTServerClass; {$I Synopse.inc} // define HASINLINE and some FPC-specific options interface uses SysUtils, Classes, SynCommons, SynLog, mORMot, RESTData; type ENoteServer = class(EORMException); TNoteServer = class(TSQLRestServerFullMemory) protected fRootFolder: TFileName; fBlobFolder: TFileName; public constructor Create(const aRootFolder: TFileName; const aRootURI: RawUTF8); reintroduce; destructor Destroy; override; property RootFolder: TFileName read fRootFolder; published procedure Blob(Ctxt: TSQLRestServerURIContext); end; implementation { TNoteServer } constructor TNoteServer.Create(const aRootFolder: TFileName; const aRootURI: RawUTF8); begin fRootFolder := EnsureDirectoryExists(ExpandFileName(aRootFolder),true); fBlobFolder := EnsureDirectoryExists(fRootFolder+'blob\',true); // define the log level with TSQLLog.Family do begin Level := LOG_VERBOSE; // LOG_STACKTRACE; DestinationPath := fRootFolder+'..\log\'; if not FileExists(DestinationPath) then CreateDir(DestinationPath); PerThreadLog := ptIdentifiedInOnFile; end; // prepare the server in-memory storage inherited Create(DataModel(aRootURI),fRootFolder+'data.json',false,false); UpdateToFile; end; destructor TNoteServer.Destroy; begin inherited; fModel.Free; end; procedure TNoteServer.Blob(Ctxt: TSQLRestServerURIContext); var FileName: TFileName; begin if (Ctxt.Table=TSQLNoteFile) and (Ctxt.TableID<>0) then begin FileName := fBlobFolder+UTF8ToString( OneFieldValue(TSQLNoteFile,'FileName',Ctxt.TableID)); case Ctxt.Method of mGET: Ctxt.ReturnFile(FileName); mPOST,mPUT: begin FileFromString(Ctxt.Call.InBody,FileName); Ctxt.Success; end; mDELETE: if DeleteFile(FileName) then Ctxt.Success else Ctxt.Error('',HTTP_NOTFOUND); end; end; end; end.