Commit 6eb0b640 by Mac Stephens

added server to folder, needs to be tested all together

parent 5b115ea3
[SMTP]
Host=gator3304.hostgator.com
Port=465
Username=webmaster@efxcurrencyexchange.com
Password=U51-M7KhiEMj
FromEmail=webmaster@efxcurrencyexchange.com
RecipientEmail=mac@em-sys.net
\ No newline at end of file
unit Common.Logging;
interface
uses
Generics.Collections;
type
ILog = interface;
ILogAppender = interface;
ILogger = interface
['{4D667DD2-BE11-496B-B92A-C47E03520BD6}']
procedure Log(logLevel: integer; Msg: string); overload;
procedure Log(logLevel: integer; Log: ILog); overload;
procedure AddAppender(ALogAppender: ILogAppender);
function Appenders: TArray<ILogAppender>;
end;
ILogAppender = interface
['{A3B7D6FB-C75F-4BEF-8797-907B6FDAD5D2}']
procedure Send(logLevel: integer; Log: ILog);
end;
ILog = interface
['{8E9C6580-C099-47C0-8B1B-6D7A28EC4FA3}']
function GetMessage: string;
end;
TLogger = class( TInterfacedObject, ILogger )
strict private
FAppenders: TList<ILogAppender>;
public
constructor Create; overload;
constructor Create(ALogger: ILogger); overload;
destructor Destroy; override;
procedure Log(logLevel: integer; Msg: string); overload;
procedure Log(logLevel: integer; Log: ILog); overload;
procedure AddAppender(ALogAppender: ILogAppender);
function Appenders: TArray<ILogAppender>;
end;
TLogMessage = class( TInterfacedObject, ILog )
private
FMsg: string;
public
constructor Create(AMsg: string);
function GetMessage: string;
end;
function Logger: ILogger;
implementation
var
_Logger: ILogger;
function Logger: ILogger;
begin
Result := _Logger;
end;
{ TLogMessage }
constructor TLogMessage.Create(AMsg: string);
begin
FMsg := AMsg;
end;
function TLogMessage.GetMessage: string;
begin
Result := FMsg;
end;
{ TLogger }
procedure TLogger.AddAppender(ALogAppender: ILogAppender);
begin
FAppenders.Add(ALogAppender);
end;
function TLogger.Appenders: TArray<ILogAppender>;
var
I: integer;
begin
SetLength(Result, FAppenders.Count);
for I := 0 to FAppenders.Count - 1 do
Result[I] := FAppenders[I];
end;
constructor TLogger.Create(ALogger: ILogger);
var
Appender: ILogAppender;
begin
FAppenders := TList<ILogAppender>.Create;
if ALogger <> nil then
for Appender in ALogger.Appenders do
AddAppender(Appender);
end;
constructor TLogger.Create;
begin
Create(nil);
end;
destructor TLogger.Destroy;
begin
FAppenders.Free;
inherited;
end;
procedure TLogger.Log(logLevel: integer; Log: ILog);
var
Appender: ILogAppender;
begin
for Appender in FAppenders do
Appender.Send(logLevel, Log);
end;
procedure TLogger.Log(logLevel: integer; Msg: string);
begin
Log(logLevel, TLogMessage.Create(Msg));
end;
initialization
_Logger := TLogger.Create;
end.
unit Data;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, AdvUtil, Data.DB, Vcl.Grids, AdvObj,
BaseGrid, AdvGrid, DBAdvGrid, MemDS, DBAccess, Uni;
type
TFData = class(TForm)
DBAdvGrid1: TDBAdvGrid;
DataSource1: TDataSource;
private
{ Private declarations }
public
{ Public declarations }
end;
var
FData: TFData;
implementation
{$R *.dfm}
end.
object FDatabaseModule: TFDatabaseModule
Height = 480
Width = 640
object ucBooking: TUniConnection
ProviderName = 'PostgreSQL'
Username = 'admin'
Server = 'w11db03'
LoginPrompt = False
Left = 41
Top = 63
EncryptedPassword = '8FFF90FF8CFF8BFF98FF8DFF9AFFACFFAEFFB3FF'
end
object PostgreSQLUniProvider1: TPostgreSQLUniProvider
Left = 230
Top = 32
end
object UniQuery1: TUniQuery
Connection = ucBooking
Left = 363
Top = 138
end
end
unit Database;
interface
uses
System.SysUtils, System.Classes, Data.DB, MemDS, DBAccess, Uni, UniProvider,
PostgreSQLUniProvider;
type
TFDatabaseModule = class(TDataModule)
ucBooking: TUniConnection;
PostgreSQLUniProvider1: TPostgreSQLUniProvider;
UniQuery1: TUniQuery;
private
{ Private declarations }
public
{ Public declarations }
class procedure ExecSQL(const SQL: string);
end;
var
FDatabaseModule: TFDatabaseModule;
implementation
{%CLASSGROUP 'Vcl.Controls.TControl'}
{$R *.dfm}
class procedure TFDatabaseModule.ExecSQL(const SQL: string);
var
DB: TFDatabaseModule;
begin
DB := TFDatabaseModule.Create(nil);
try
DB.UniQuery1.SQL.Text := SQL;
DB.UniQuery1.ExecSQL;
finally
DB.Free;
end;
end;
end.
program EFXEmailServer;
uses
System.SyncObjs,
System.SysUtils,
Vcl.StdCtrls,
IniFiles,
Vcl.Forms,
Server.Container in 'Server.Container.pas' {FServerContainer: TDataModule},
Main in 'Main.pas' {FMain},
Email.Service in 'Email.Service.pas',
Email.ServiceImpl in 'Email.ServiceImpl.pas',
Common.Logging in 'Common.Logging.pas',
Data in 'Data.pas' {FData},
Database in 'Database.pas' {FDatabaseModule: TDataModule};
type
TMemoLogAppender = class( TInterfacedObject, ILogAppender )
private
FLogLevel: Integer;
FLogMemo: TMemo;
FCriticalSection: TCriticalSection;
public
constructor Create(ALogLevel: Integer; ALogMemo: TMemo);
destructor Destroy; override;
procedure Send(logLevel: Integer; Log: ILog);
end;
TFileLogAppender = class( TInterfacedObject, ILogAppender )
private
FLogLevel: Integer;
FFilename: string;
FCriticalSection: TCriticalSection;
public
constructor Create(ALogLevel: Integer; AFilename: string);
destructor Destroy; override;
procedure Send(logLevel: Integer; Log: ILog);
end;
{ TMemoLogAppender }
constructor TMemoLogAppender.Create(ALogLevel: Integer; ALogMemo: TMemo);
begin
FLogLevel := ALogLevel;
FLogMemo := ALogMemo;
FCriticalSection := TCriticalSection.Create;
end;
destructor TMemoLogAppender.Destroy;
begin
FCriticalSection.Free;
inherited;
end;
procedure TMemoLogAppender.Send(logLevel: Integer; Log: ILog);
var
FormattedMessage: string;
LogTime: TDateTime;
LogMsg: string;
begin
FCriticalSection.Acquire;
try
LogTime := Now;
FormattedMessage := FormatDateTime('[yyyy-mm-dd HH:nn:ss.zzz]', LogTime);
LogMsg := Log.GetMessage;
if LogMsg.IsEmpty then
FormattedMessage := ''
else
FormattedMessage := FormattedMessage + '[' + IntToStr(logLevel) +'] ' + LogMsg;
if logLevel <= FLogLevel then
FLogMemo.Lines.Add( FormattedMessage );
finally
FCriticalSection.Release;
end;
end;
{ TFileLogAppender }
constructor TFileLogAppender.Create(ALogLevel: integer; AFilename: string);
var
iniFile: TIniFile;
fileNum: integer;
begin
FLogLevel := ALogLevel;
FCriticalSection := TCriticalSection.Create;
IniFile := TIniFile.Create( ChangeFileExt( Application.ExeName, '.ini' ) );
try
fileNum := IniFile.ReadInteger( 'Options', 'LogFileNum', 0 );
// FFilename := AFilename + Format('%.*d',[4, fileNum]);
FFilename := AFilename + Format('%.4d',[fileNum]);
iniFile.WriteInteger( 'Options', 'LogFileNum', fileNum + 1 );
finally
iniFile.Free;
end;
end;
destructor TFileLogAppender.Destroy;
begin
FCriticalSection.Free;
inherited;
end;
procedure TFileLogAppender.Send(logLevel: integer; Log: ILog);
var
FormattedMessage: string;
LogFile: string;
LogTime: TDateTime;
LogMsg: string;
FLogFile: TextFile;
begin
FCriticalSection.Acquire;
try
LogTime := Now;
LogFile := ExtractFilePath(Application.ExeName) + FFilename + '.log';
FormattedMessage := FormatDateTime('[yyyy-mm-dd HH:nn:ss.zzz]', LogTime);
LogMsg := Log.GetMessage;
if LogMsg.IsEmpty then
FormattedMessage := ''
else
FormattedMessage := FormattedMessage + '[' + IntToStr(logLevel) +'] ' + LogMsg;
try
AssignFile( FLogFile, LogFile );
if logLevel <= FLogLevel then
begin
if FileExists(LogFile) then
Append( FLogFile )
else
ReWrite( FLogFile );
WriteLn( FLogFile, FormattedMessage );
end;
finally
CloseFile(FLogFile);
end;
finally
FCriticalSection.Release;
end;
end;
{$R *.res}
begin
ReportMemoryLeaksOnShutdown := True;
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TFServerContainer, FServerContainer);
Application.CreateForm(TFMain, FMain);
Application.CreateForm(TFData, FData);
Application.CreateForm(TFDatabaseModule, FDatabaseModule);
Logger.AddAppender(TMemoLogAppender.Create( 5, FMain.memoinfo ));
Application.Run;
end.
<?xml version="1.0" encoding="utf-8"?>
<BorlandProject>
<Transactions>
<Transaction>2024/03/22 15:32:08.000.816,=C:\Users\Admin\Documents\Embarcadero\Studio\Projects\Unit1.pas</Transaction>
<Transaction>2024/03/22 15:32:09.000.457,=C:\Users\Admin\Documents\Embarcadero\Studio\Projects\Unit2.pas</Transaction>
<Transaction>2024/03/22 15:33:13.000.394,=C:\Users\Admin\Documents\Embarcadero\Studio\Projects\EmailService.pas</Transaction>
<Transaction>2024/03/22 15:33:13.000.472,=C:\Users\Admin\Documents\Embarcadero\Studio\Projects\EmailServiceImplementation.pas</Transaction>
<Transaction>2024/03/22 15:33:58.000.928,C:\Projects\XDataEmailService\XDataEmailServer\EmailServiceImplementation.pas=C:\Users\Admin\Documents\Embarcadero\Studio\Projects\EmailServiceImplementation.pas</Transaction>
<Transaction>2024/03/22 15:34:04.000.451,C:\Projects\XDataEmailService\XDataEmailServer\EmailService.pas=C:\Users\Admin\Documents\Embarcadero\Studio\Projects\EmailService.pas</Transaction>
<Transaction>2024/03/22 15:34:05.000.576,C:\Projects\XDataEmailService\XDataEmailServer\Unit1.dfm=C:\Users\Admin\Documents\Embarcadero\Studio\Projects\Unit1.dfm</Transaction>
<Transaction>2024/03/22 15:34:05.000.576,C:\Projects\XDataEmailService\XDataEmailServer\Unit1.pas=C:\Users\Admin\Documents\Embarcadero\Studio\Projects\Unit1.pas</Transaction>
<Transaction>2024/03/22 15:34:06.000.608,C:\Projects\XDataEmailService\XDataEmailServer\Unit2.pas=C:\Users\Admin\Documents\Embarcadero\Studio\Projects\Unit2.pas</Transaction>
<Transaction>2024/03/22 15:34:06.000.608,C:\Projects\XDataEmailService\XDataEmailServer\Unit2.dfm=C:\Users\Admin\Documents\Embarcadero\Studio\Projects\Unit2.dfm</Transaction>
<Transaction>2024/03/22 15:34:07.000.718,C:\Projects\XDataEmailService\XDataEmailServer\Project1.dproj=C:\Users\Admin\Documents\Embarcadero\Studio\Projects\Project1.dproj</Transaction>
<Transaction>2024/03/22 15:34:28.000.790,C:\Projects\XDataEmailService\XDataEmailServer\XDataEmailServer.dproj=C:\Projects\XDataEmailService\XDataEmailServer\Project1.dproj</Transaction>
<Transaction>2024/03/22 15:54:45.000.261,C:\Projects\XDataEmailService\XDataEmailServer\DB.Server.pas=C:\Projects\XDataEmailService\XDataEmailServer\Unit1.pas</Transaction>
<Transaction>2024/03/22 15:54:45.000.261,C:\Projects\XDataEmailService\XDataEmailServer\DB.Server.dfm=C:\Projects\XDataEmailService\XDataEmailServer\Unit1.dfm</Transaction>
<Transaction>2024/03/22 15:55:36.000.752,C:\Projects\XDataEmailService\XDataEmailServer\Server.Container.pas=C:\Projects\XDataEmailService\XDataEmailServer\DB.Server.pas</Transaction>
<Transaction>2024/03/22 15:55:36.000.752,C:\Projects\XDataEmailService\XDataEmailServer\Server.Container.dfm=C:\Projects\XDataEmailService\XDataEmailServer\DB.Server.dfm</Transaction>
<Transaction>2024/03/22 15:56:13.000.981,C:\Projects\XDataEmailService\XDataEmailServer\Email.Service.pas=C:\Projects\XDataEmailService\XDataEmailServer\EmailService.pas</Transaction>
<Transaction>2024/03/22 15:56:31.000.312,C:\Projects\XDataEmailService\XDataEmailServer\Email.ServiceImpl.pas=C:\Projects\XDataEmailService\XDataEmailServer\EmailServiceImplementation.pas</Transaction>
<Transaction>2024/03/22 15:57:04.000.478,C:\Projects\XDataEmailService\XDataEmailServer\Server.UI.dfm=C:\Projects\XDataEmailService\XDataEmailServer\Unit2.dfm</Transaction>
<Transaction>2024/03/22 15:57:04.000.478,C:\Projects\XDataEmailService\XDataEmailServer\Server.UI.pas=C:\Projects\XDataEmailService\XDataEmailServer\Unit2.pas</Transaction>
<Transaction>2024/03/22 16:35:03.000.674,=C:\Projects\XDataEmailService\XDataEmailServer\Unit1.pas</Transaction>
<Transaction>2024/03/22 16:35:14.000.484,C:\Projects\XDataEmailService\XDataEmailServer\Common.Logging.pas=C:\Projects\XDataEmailService\XDataEmailServer\Unit1.pas</Transaction>
<Transaction>2024/03/22 16:42:33.000.437,=C:\Projects\XDataEmailService\XDataEmailServer\Unit1.pas</Transaction>
<Transaction>2024/03/22 16:42:44.000.209,C:\Projects\XDataEmailService\XDataEmailServer\FData.dfm=C:\Projects\XDataEmailService\XDataEmailServer\Unit1.dfm</Transaction>
<Transaction>2024/03/22 16:42:44.000.209,C:\Projects\XDataEmailService\XDataEmailServer\FData.pas=C:\Projects\XDataEmailService\XDataEmailServer\Unit1.pas</Transaction>
<Transaction>2024/03/22 16:42:55.000.463,C:\Projects\XDataEmailService\XDataEmailServer\Data.dfm=C:\Projects\XDataEmailService\XDataEmailServer\FData.dfm</Transaction>
<Transaction>2024/03/22 16:42:55.000.463,C:\Projects\XDataEmailService\XDataEmailServer\Data.pas=C:\Projects\XDataEmailService\XDataEmailServer\FData.pas</Transaction>
<Transaction>2024/03/22 16:45:56.000.370,C:\Projects\XDataEmailService\XDataEmailServer\Main.pas=C:\Projects\XDataEmailService\XDataEmailServer\Server.UI.pas</Transaction>
<Transaction>2024/03/22 16:45:56.000.370,C:\Projects\XDataEmailService\XDataEmailServer\Main.dfm=C:\Projects\XDataEmailService\XDataEmailServer\Server.UI.dfm</Transaction>
<Transaction>2024/03/22 16:47:34.000.744,=C:\Projects\XDataEmailService\XDataEmailServer\Unit1.pas</Transaction>
<Transaction>2024/03/22 16:47:48.000.736,C:\Projects\XDataEmailService\XDataEmailServer\Database.pas=C:\Projects\XDataEmailService\XDataEmailServer\Unit1.pas</Transaction>
<Transaction>2024/03/22 16:47:48.000.736,C:\Projects\XDataEmailService\XDataEmailServer\Database.dfm=C:\Projects\XDataEmailService\XDataEmailServer\Unit1.dfm</Transaction>
<Transaction>2024/03/22 16:50:30.000.780,=C:\Projects\XDataEmailService\XDataEmailServer\Unit1.pas</Transaction>
<Transaction>2024/03/22 16:51:16.000.099,C:\Projects\XDataEmailService\XDataEmailServer\Database.dfm=C:\Projects\XDataEmailService\XDataEmailServer\Unit1.dfm</Transaction>
<Transaction>2024/03/22 16:51:16.000.099,C:\Projects\XDataEmailService\XDataEmailServer\Database.pas=C:\Projects\XDataEmailService\XDataEmailServer\Unit1.pas</Transaction>
<Transaction>2024/04/17 09:37:25.071,C:\Projects\xdataemailservice\XDataEmailServer\EFXEmailServer.dproj=C:\Projects\xdataemailservice\XDataEmailServer\XDataEmailServer.dproj</Transaction>
</Transactions>
</BorlandProject>
unit Email.Service;
interface
uses
XData.Service.Common;
type
[ServiceContract]
IEmailService = interface(IInvokable)
['{46B3B095-5873-4452-B338-AEE009604DED}']
[HttpGet]
function SendEmail(Name, Email, Subject, Body: string): string;
end;
implementation
end.
unit Email.ServiceImpl;
interface
uses
XData.Server.Module,
XData.Service.Common,
IdSMTP, IdMessage, IdSSLOpenSSL, IdText, IdExplicitTLSClientServerBase,
IdIOHandlerSocket, IdException, IdSSL, IdSMTPBase, IdGlobal, IdStack, IdWinsock2,
IdStackConsts, IdIOHandler, IdIOHandlerStack, IdBaseComponent,
IdComponent, IdTCPConnection, IdTCPClient, IdMessageClient,
Email.Service;
type
[ServiceImplementation]
TEmailService = class(TInterfacedObject, IEmailService)
public
function SendEmail(Name, Email, Subject, Body: string): string;
end;
implementation
uses
System.SysUtils,
System.IniFiles,
Main;
function TEmailService.SendEmail(Name, Email, Subject, Body: string): string;
var
SMTP: TIdSMTP;
Message: TIdMessage;
SSL: TIdSSLIOHandlerSocketOpenSSL;
EFXIni: TIniFile;
begin
EFXIni := TIniFile.Create('C:\Projects\xdataemailservice\Config\EFX.ini');
try
SMTP := TIdSMTP.Create(nil);
try
Message := TIdMessage.Create(nil);
try
if not EFXIni.SectionExists('SMTP') then
raise Exception.Create('Configuration section [SMTP] not found.');
SMTP.Host := EFXIni.ReadString('SMTP', 'Host', '');
if SMTP.Host = '' then
raise Exception.Create('SMTP Host is not configured.');
SMTP.Port := EFXIni.ReadInteger('SMTP', 'Port', 0);
if SMTP.Port = 0 then
raise Exception.Create('SMTP Port is not configured or invalid.');
SMTP.Username := EFXIni.ReadString('SMTP', 'Username', '');
if SMTP.Username = '' then
raise Exception.Create('SMTP Username is not configured.');
SMTP.Password := EFXIni.ReadString('SMTP', 'Password', '');
if SMTP.Password = '' then
raise Exception.Create('SMTP Password is not configured.');
Message.From.Address := EFXIni.ReadString('SMTP', 'FromEmail', '');
if Message.From.Address = '' then
raise Exception.Create('SMTP From Email is not configured.');
Message.Recipients.EmailAddresses := EFXIni.ReadString('SMTP', 'RecipientEmail', '');
if Message.Recipients.EmailAddresses = '' then
raise Exception.Create('SMTP Recipient Email is not configured.');
Message.Subject := Subject;
Message.Body.Text := Format(
'<html><body>' +
'<h4>Message from: %s (%s)</h4>' +
'<p>%s</p>' +
'</body></html>',
[Name, Email, Body.Replace(sLineBreak, '<br>')]);
Message.ContentType := 'text/html';
SSL := TIdSSLIOHandlerSocketOpenSSL.Create(SMTP);
SMTP.IOHandler := SSL;
SMTP.UseTLS := utUseImplicitTLS;
SMTP.Connect;
SMTP.Send(Message);
SMTP.Disconnect;
FMain.ContactFormData('Email Data:' + sLineBreak +
'Name: ' + Name + sLineBreak +
'Email: ' + Email + sLineBreak +
'Subject: ' + Subject + sLineBreak +
'Message: ' + Body);
finally
Message.Free;
end;
finally
SMTP.Free;
end;
finally
EFXIni.Free;
end;
Result := 'Email sent successfully';
end;
initialization
RegisterServiceType(TEmailService);
end.
object FMain: TFMain
Left = 0
Top = 0
Caption = 'TMS XData Server'
ClientHeight = 583
ClientWidth = 764
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OnCreate = FormCreate
DesignSize = (
764
583)
TextHeight = 13
object memoInfo: TMemo
Left = 8
Top = 40
Width = 744
Height = 535
Anchors = [akLeft, akTop, akRight, akBottom]
ReadOnly = True
TabOrder = 0
end
object btStart: TButton
Left = 8
Top = 8
Width = 75
Height = 25
Caption = 'Start'
TabOrder = 1
OnClick = btStartClick
end
object btStop: TButton
Left = 90
Top = 8
Width = 75
Height = 25
Caption = 'Stop'
TabOrder = 2
OnClick = btStopClick
end
object btnSwaggerUI: TButton
Left = 297
Top = 8
Width = 128
Height = 25
Caption = 'Launch SwaggerUI'
TabOrder = 3
OnClick = btnSwaggerUIClick
end
object btnData: TButton
Left = 525
Top = 8
Width = 75
Height = 25
Caption = 'Data'
TabOrder = 4
OnClick = btnDataClick
end
object btnExit: TButton
Left = 671
Top = 8
Width = 75
Height = 25
Caption = 'Exit'
TabOrder = 5
OnClick = btnExitClick
end
object Timer1: TTimer
Interval = 250
Left = 159
Top = 405
end
end
unit Main;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, Winapi.ShellApi,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
Vcl.StdCtrls, Server.Container, Vcl.ExtCtrls;
type
TFMain = class(TForm)
memoInfo: TMemo;
btStart: TButton;
btStop: TButton;
btnSwaggerUI: TButton;
btnData: TButton;
btnExit: TButton;
Timer1: TTimer;
procedure btStartClick(ASender: TObject);
procedure btStopClick(ASender: TObject);
procedure FormCreate(ASender: TObject);
procedure btnSwaggerUIClick(Sender: TObject);
procedure btnDataClick(Sender: TObject);
procedure btnExitClick(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure ContactFormData(AText: String);
strict private
procedure UpdateGUI;
function ServerUrl: string;
end;
var
FMain: TFMain;
implementation
uses
Common.Logging,
Sparkle.Utils,
Data;
{$R *.dfm}
resourcestring
SServerStopped = 'Server stopped';
SServerStartedAt = 'Server started at ';
{ TMainForm }
procedure TFMain.ContactFormData(AText: String);
begin
if memoInfo.CanFocus then
TThread.Queue(nil, procedure
begin
memoInfo.Lines.Add(AText);
end)
else
TThread.Synchronize(nil, procedure
begin
memoInfo.Lines.Add(AText);
end);
end;
procedure TFMain.btnDataClick(Sender: TObject);
begin
FData := TFData.Create( self );
FData.ShowModal;
FData.Free;
end;
procedure TFMain.btnExitClick(Sender: TObject);
begin
Close;
end;
procedure TFMain.btnSwaggerUIClick(Sender: TObject);
begin
ShellExecute(Handle, 'open', PChar(TSparkleUtils.CombineUrlFast(ServerUrl, 'swaggerui')), nil, nil, SW_SHOWNORMAL);
end;
procedure TFMain.btStartClick(ASender: TObject);
begin
FServerContainer.SparkleHttpSysDispatcher.Start;
UpdateGUI;
end;
procedure TFMain.btStopClick(ASender: TObject);
begin
FServerContainer.SparkleHttpSysDispatcher.Stop;
UpdateGUI;
end;
function TFMain.ServerUrl: string;
const
cHttp = 'http://+';
cHttpLocalhost = 'http://localhost';
begin
Result := StringReplace(FServerContainer.XDataServer.BaseUrl,
cHttp, cHttpLocalhost, [rfIgnoreCase]);
end;
procedure TFMain.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled := False;
Logger.Log( 3, 'Timer1Timer event' );
UpdateGUI;
end;
procedure TFMain.FormCreate(ASender: TObject);
begin
UpdateGUI;
end;
procedure TFMain.UpdateGUI;
const
cHttp = 'http://+';
cHttpLocalhost = 'http://localhost';
begin
btStart.Enabled := not FServerContainer.SparkleHttpSysDispatcher.Active;
btStop.Enabled := not btStart.Enabled;
if FServerContainer.SparkleHttpSysDispatcher.Active then
memoInfo.Lines.Add(SServerStartedAt + StringReplace(
FServerContainer.XDataServer.BaseUrl,
cHttp, cHttpLocalhost, [rfIgnoreCase]))
else
memoInfo.Lines.Add(SServerStopped);
end;
end.
object FServerContainer: TFServerContainer
Height = 210
Width = 431
object SparkleHttpSysDispatcher: TSparkleHttpSysDispatcher
Active = True
Left = 72
Top = 16
end
object XDataServer: TXDataServer
BaseUrl = 'http://+:2013/tms/email'
Dispatcher = SparkleHttpSysDispatcher
EntitySetPermissions = <>
SwaggerOptions.Enabled = True
SwaggerOptions.AuthMode = Jwt
SwaggerUIOptions.Enabled = True
SwaggerUIOptions.ShowFilter = True
SwaggerUIOptions.TryItOutEnabled = True
Left = 216
Top = 16
object XDataServerBasicauth: TSparkleBasicAuthMiddleware
Realm = 'TMS Sparkle Server'
OnAuthenticate = XDataServerBasicauthAuthenticate
end
object XDataServerCompress: TSparkleCompressMiddleware
end
object XDataServerCORS: TSparkleCorsMiddleware
end
end
end
unit Server.Container;
interface
uses
System.SysUtils, System.Classes, Sparkle.HttpServer.Module,
Sparkle.HttpServer.Context, Sparkle.Comp.Server,
Sparkle.Comp.HttpSysDispatcher, Aurelius.Drivers.Interfaces,
Aurelius.Comp.Connection, XData.Comp.ConnectionPool, XData.Server.Module,
XData.Comp.Server, Sparkle.Comp.GenericMiddleware, Sparkle.Comp.JwtMiddleware,
Sparkle.Comp.BasicAuthMiddleware, Sparkle.Comp.CorsMiddleware,
Sparkle.Comp.CompressMiddleware, IdBaseComponent, IdComponent,
IdTCPConnection, IdTCPClient, IdExplicitTLSClientServerBase, IdMessageClient,
IdSMTPBase, IdSMTP, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL,
IdSSLOpenSSL;
type
TFServerContainer = class(TDataModule)
SparkleHttpSysDispatcher: TSparkleHttpSysDispatcher;
XDataServer: TXDataServer;
XDataServerBasicauth: TSparkleBasicAuthMiddleware;
XDataServerCompress: TSparkleCompressMiddleware;
XDataServerCORS: TSparkleCorsMiddleware;
XDataServerGeneric: TSparkleGenericMiddleware;
procedure XDataServerBasicauthAuthenticate(Sender: TObject; const UserName,
Password: string; var User: IUserIdentity);
procedure XDataServerGenericRequest(Sender: TObject;
Context: THttpServerContext; Next: THttpServerProc);
end;
var
FServerContainer: TFServerContainer;
implementation
{%CLASSGROUP 'Vcl.Controls.TControl'}
{$R *.dfm}
procedure TFServerContainer.XDataServerBasicauthAuthenticate(Sender: TObject;
const UserName, Password: string; var User: IUserIdentity);
begin
if (UserName = 'admin') and (Password = 'password') then
begin
User := TUserIdentity.Create;
User.Claims.AddOrSet('username', UserName);
User.Claims.AddOrSet('roles', 'admin'); // arbitrary info you might want to add
end;
end;
procedure TFServerContainer.XDataServerGenericRequest(Sender: TObject;
Context: THttpServerContext; Next: THttpServerProc);
begin
// does not allow anonymous requests
if Context.Request.User = nil then
Context.Response.StatusCode := 401
else
Next(Context);
end;
end.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment