delphimvcframework/samples/apachemodule/WineCellarAppControllerU.pas

166 lines
3.7 KiB
ObjectPascal
Raw Normal View History

2014-05-22 12:48:17 +02:00
unit WineCellarAppControllerU;
interface
uses
MVCFramework,
MVCFramework.Commons,
MVCFramework.TypesAliases,
2014-05-22 12:48:17 +02:00
MainDataModuleUnit;
type
[MVCPath('/')]
TWineCellarApp = class(TMVCController)
private
dm: TWineCellarDataModule;
protected
procedure OnBeforeAction(Context: TWebContext; const AActionNAme: string;
var Handled: Boolean);
override;
procedure OnAfterAction(Context: TWebContext;
const AActionNAme: string); override;
public
[MVCPath('/')]
[MVCHTTPMethod([httpGET])]
procedure Index(ctx: TWebContext);
[MVCPath('/wines')]
[MVCHTTPMethod([httpGET])]
procedure WinesList(ctx: TWebContext);
[MVCPath('/wines')]
[MVCHTTPMethod([httpPOST])]
2017-05-09 21:49:34 +02:00
procedure SaveWine;
2014-05-22 12:48:17 +02:00
[MVCPath('/wines/search/($value)')]
procedure FindWines(ctx: TWebContext);
[MVCHTTPMethod([httpGET])]
[MVCPath('/wines/pdf')]
procedure GetWinesCatalogAsPDF(ctx: TWebContext);
2014-05-22 12:48:17 +02:00
[MVCPath('/wines/($id)')]
[MVCHTTPMethod([httpGET, httpDELETE])]
procedure WineById(ctx: TWebContext);
[MVCPath('/wines/($id)')]
[MVCHTTPMethod([httpPUT])]
2017-05-09 21:49:34 +02:00
procedure UpdateWineById(id: Integer);
2014-05-22 12:48:17 +02:00
end;
implementation
uses
2017-05-09 21:49:34 +02:00
System.SysUtils, System.Classes, System.IOUtils,
WinesBO;
2014-05-22 12:48:17 +02:00
procedure TWineCellarApp.FindWines(ctx: TWebContext);
begin
Render(dm.FindWines(ctx.Request.Params['value']));
end;
procedure TWineCellarApp.GetWinesCatalogAsPDF(ctx: TWebContext);
var
pdf: string;
PDFFileStream: TFileStream;
PDFMemoryStream: TMemoryStream;
begin
pdf := tpath.Combine(AppPath, '..\..\PDFsServedByDMVCBehindApache\Box2DManual.pdf');
if not TFile.Exists(pdf) then
begin
Render(HTTP_STATUS.NotFound, 'File ' + pdf + ' not found');
exit;
end;
PDFFileStream := TFileStream.Create(pdf, fmOpenRead);
try
PDFMemoryStream := TMemoryStream.Create;
try
PDFMemoryStream.CopyFrom(PDFFileStream, PDFMemoryStream.Size);
except
PDFMemoryStream.Free;
raise;
end;
finally
PDFFileStream.Free;
end;
// TFile.Delete(pdf);
PDFMemoryStream.Position := 0;
Context.Response.ContentType := 'application/pdf';
SendStream(PDFMemoryStream);
end;
2014-05-22 12:48:17 +02:00
procedure TWineCellarApp.Index(ctx: TWebContext);
begin
Redirect('/index.html');
end;
procedure TWineCellarApp.OnAfterAction(Context: TWebContext;
const AActionNAme: string);
begin
inherited;
dm.Free;
end;
procedure TWineCellarApp.OnBeforeAction(Context: TWebContext;
const AActionNAme: string;
var Handled: Boolean);
begin
inherited;
dm := TWineCellarDataModule.Create(nil);
end;
2017-05-09 21:49:34 +02:00
procedure TWineCellarApp.SaveWine;
var
2017-05-09 21:49:34 +02:00
lWine: TWine;
2014-05-22 12:48:17 +02:00
begin
2017-05-09 21:49:34 +02:00
lWine := Context.Request.BodyAs<TWine>;
try
2017-05-09 21:49:34 +02:00
dm.AddWine(lWine);
finally
2017-05-09 21:49:34 +02:00
lWine.Free;
end;
2014-05-22 12:48:17 +02:00
end;
2017-05-09 21:49:34 +02:00
procedure TWineCellarApp.UpdateWineById(id: Integer);
var
2017-05-09 21:49:34 +02:00
lWine: TWine;
2014-05-22 12:48:17 +02:00
begin
2017-05-09 21:49:34 +02:00
lWine := Context.Request.BodyAs<TWine>;
try
2017-05-09 21:49:34 +02:00
lWine.id := id;
dm.UpdateWine(lWine);
Render(TMVCErrorResponse.Create(200, 'Wine Updated', ''));
finally
2017-05-09 21:49:34 +02:00
lWine.Free;
end;
2014-05-22 12:48:17 +02:00
end;
procedure TWineCellarApp.WineById(ctx: TWebContext);
begin
// different behaviour according to the request http method
case ctx.Request.HTTPMethod of
httpDELETE:
begin
dm.DeleteWine(StrToInt(ctx.Request.Params['id']));
Render(200, 'Wine deleted');
end;
httpGET:
begin
Render(dm.GetWineById(StrToInt(ctx.Request.Params['id'])));
end
else
raise Exception.Create('Invalid http method for action');
end;
end;
procedure TWineCellarApp.WinesList(ctx: TWebContext);
begin
Render(dm.FindWines(''));
end;
end.