mirror of
https://github.com/danieleteti/delphimvcframework.git
synced 2024-11-16 00:05:53 +01:00
130 lines
2.9 KiB
ObjectPascal
130 lines
2.9 KiB
ObjectPascal
|
unit StatusControllerU;
|
||
|
|
||
|
interface
|
||
|
|
||
|
uses
|
||
|
MVCFramework, MVCFramework.Commons, SysConstantsU;
|
||
|
|
||
|
type
|
||
|
|
||
|
[MVCPath(BASEURL + '/notifications')]
|
||
|
TStatusController = class(TMVCController)
|
||
|
protected
|
||
|
|
||
|
public
|
||
|
[MVCPath]
|
||
|
[MVCHTTPMethod([httpPOST])]
|
||
|
procedure ChangeStatus;
|
||
|
|
||
|
[MVCPath]
|
||
|
[MVCHTTPMethod([httpGET])]
|
||
|
procedure GetLastStatus;
|
||
|
|
||
|
[MVCPath('/messages')]
|
||
|
[MVCHTTPMethod([httpGET])]
|
||
|
procedure GetCurrentStatus;
|
||
|
|
||
|
end;
|
||
|
|
||
|
implementation
|
||
|
|
||
|
uses
|
||
|
System.SysUtils, MVCFramework.Logger, System.StrUtils, JsonDataObjects,
|
||
|
EntitiesU, StatusesServiceU, System.Diagnostics,
|
||
|
MVCFramework.Serializer.Defaults;
|
||
|
|
||
|
procedure TStatusController.ChangeStatus;
|
||
|
var
|
||
|
lChangeStatus: TNotificationEntity;
|
||
|
lStatusService: TStatusService;
|
||
|
begin
|
||
|
lChangeStatus := Context.Request.BodyAs<TNotificationEntity>;
|
||
|
lStatusService := TStatusService.Create;
|
||
|
try
|
||
|
lStatusService.PersistStatus(lChangeStatus);
|
||
|
finally
|
||
|
lStatusService.free;
|
||
|
end;
|
||
|
Render(201, 'Status Changed OK');
|
||
|
end;
|
||
|
|
||
|
procedure TStatusController.GetCurrentStatus;
|
||
|
var
|
||
|
lLastEventID: Integer;
|
||
|
lMessage: string;
|
||
|
lStatusService: TStatusService;
|
||
|
lCurrentStatus: TCurrentStatusEntity;
|
||
|
lCurrStatusID: Integer;
|
||
|
lStopWatch: TStopwatch;
|
||
|
lLastPersistedStatus: TFullStatusEntity;
|
||
|
begin
|
||
|
// retrieve the last id received by the client reading the request header.
|
||
|
lLastEventID := StrToIntDef(Context.Request.Headers['Last-Event-ID'], 0);
|
||
|
lStopWatch := TStopwatch.StartNew;
|
||
|
lStatusService := TStatusService.Create;
|
||
|
try
|
||
|
lCurrentStatus := lStatusService.GetCurrentStatus;
|
||
|
while true do
|
||
|
begin
|
||
|
lCurrStatusID := lCurrentStatus.GetStatus;
|
||
|
if (lCurrStatusID <> lLastEventID) or (IsShuttingDown) then
|
||
|
begin
|
||
|
Break;
|
||
|
end
|
||
|
else
|
||
|
begin
|
||
|
if lStopWatch.Elapsed.Seconds >= 10 then
|
||
|
begin
|
||
|
// lCurrStatusID := -1;
|
||
|
// just to check if the client is alive, the response is written to the socket
|
||
|
Break;
|
||
|
end
|
||
|
else
|
||
|
begin
|
||
|
Sleep(500);
|
||
|
end;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
if IsShuttingDown then
|
||
|
begin
|
||
|
ContentType := TMVCMediaType.APPLICATION_JSON;
|
||
|
Render(HTTP_STATUS.Gone, 'Server is shutting down');
|
||
|
Exit;
|
||
|
end;
|
||
|
|
||
|
if lCurrStatusID = -1 then
|
||
|
begin
|
||
|
lMessage := '{"id":-1}';
|
||
|
end
|
||
|
else
|
||
|
begin
|
||
|
lLastPersistedStatus := lStatusService.GetLastPersistedStatus;
|
||
|
try
|
||
|
lMessage := GetDefaultSerializer.SerializeObject(lLastPersistedStatus);
|
||
|
finally
|
||
|
lLastPersistedStatus.Free;
|
||
|
end;
|
||
|
end;
|
||
|
finally
|
||
|
lStatusService.Free;
|
||
|
end;
|
||
|
RenderSSE(lCurrStatusID.ToString, lMessage, 'statusupdate');
|
||
|
end;
|
||
|
|
||
|
procedure TStatusController.GetLastStatus;
|
||
|
var
|
||
|
lStatusService: TStatusService;
|
||
|
lFullStatus: TFullStatusEntity;
|
||
|
begin
|
||
|
lStatusService := TStatusService.Create;
|
||
|
try
|
||
|
lFullStatus := lStatusService.GetLastPersistedStatus;
|
||
|
finally
|
||
|
lStatusService.free;
|
||
|
end;
|
||
|
Render(lFullStatus, True);
|
||
|
end;
|
||
|
|
||
|
end.
|