unit Ws.Server.Module;

interface

uses
  System.SysUtils, System.Classes, System.Generics.Collections,
  Aurelius.Drivers.SQLite,
  Aurelius.Comp.Connection,
  Aurelius.Drivers.Interfaces,
  XData.Aurelius.ConnectionPool, XData.Server.Module, Sparkle.Comp.Server,
  XData.Comp.Server, XData.Comp.ConnectionPool, Sparkle.Comp.HttpSysDispatcher,
  Aurelius.Criteria.Linq,
  Sparkle.HttpServer.Module, Sparkle.HttpServer.Context,
  Sparkle.Comp.CompressMiddleware, Sparkle.Comp.CorsMiddleware,
  Sparkle.Comp.GenericMiddleware,  Sparkle.Middleware.WebSocket, Sparkle.Comp.WebSocketMiddleware,
  Aurelius.Drivers.UniDac, UniProvider,
  Data.DB, DBAccess, Uni, Sparkle.Comp.ForwardMiddleware;

type
  TWsServerModule = class(TDataModule)
    SparkleHttpSysDispatcher3: TSparkleHttpSysDispatcher;
    XDataServer1: TXDataServer;
    XDataServer1Logging: TSparkleGenericMiddleware;
    XDataServer1CORS: TSparkleCorsMiddleware;

    procedure XDataServer1LoggingMiddlewareCreate(Sender: TObject;
      var Middleware: IHttpServerMiddleware);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure StartWsServer(ABaseUrl: string; AModelName: string);
  end;

const
  SERVER_PATH_SEGMENT = 'ws';

var
  WsServerModule: TWsServerModule;

implementation

uses
  Sparkle.HttpServer.Request,
  Sparkle.Middleware.Cors,
  Sparkle.Middleware.Compress,
  XData.OpenApi.Service,
  XData.Sys.Exceptions,
  Common.Logging,
  Common.Middleware.Logging,
  Common.Config, Vcl.Forms, IniFiles,
  Ws.ServiceImpl;

{%CLASSGROUP 'Vcl.Controls.TControl'}

{$R *.dfm}

{ TWsServerModule }



procedure TWsServerModule.StartWsServer(ABaseUrl: string; AModelName: string);
var
  Url: string;
begin
  Logger.Log(1, 'WS-DIAG: StartWsServer enter, AModelName=[' + AModelName + ']');
  Logger.Log(1, 'WS-DIAG: XDataServer1.ModelName before=[' + XDataServer1.ModelName + ']');
  RegisterOpenApiService;
  Logger.Log(1, 'WS-DIAG: RegisterOpenApiService done');
  Url := ABaseUrl;
  if not Url.EndsWith('/') then
    Url := Url + '/';
  Url := Url + SERVER_PATH_SEGMENT;
  XDataServer1.BaseUrl := Url;
  Logger.Log(1, 'WS-DIAG: about to set ModelName to [' + AModelName + ']');
  try
    XDataServer1.ModelName := AModelName;
    Logger.Log(1, 'WS-DIAG: ModelName set, current value=[' + XDataServer1.ModelName + ']');
  except
    on E: Exception do
      Logger.Log(1, 'WS-DIAG: ModelName assignment FAILED: ' + E.ClassName + ': ' + E.Message);
  end;
  SparkleHttpSysDispatcher3.Start;
  Logger.Log(1, Format('Ws server module listening at "%s"', [Url]));
end;

procedure TWsServerModule.XDataServer1LoggingMiddlewareCreate(Sender: TObject;
  var Middleware: IHttpServerMiddleware);
begin
  Middleware := TLoggingMiddleware.Create(Logger, 1);
end;

end.
