/// Conference Repository implementation
unit InfraConferenceRepository;

interface

uses
  SysUtils,
  Classes,
  SynCommons,
  mORMot,
  DomConferenceTypes,
  DomConferenceDepend;

type
  /// defines the table in the DB
  // - ID primary key is the TAttendeeRegistrationNumber
  TSQLBooking = class(TSQLRecord)
  private
    fName: RawUTF8;
    fFirstName: RawUTF8;
    fSessions: variant;
  published
    property Name: RawUTF8 read fName write fName;
    property FirstName: RawUTF8 read fFirstName write fFirstName;
    property Sessions: variant read fSessions write fSessions;
  end;

  /// the repository implementation using mORMot REST ORM
  TORMBookingRepository = class(TInterfacedObject, IBookingRepository)
  protected
    fRest: TSQLRest;
  public
    constructor Create(ORM: TSQLRest); reintroduce;
    // IBookingRepository methods
    function SaveNewRegistration(const Attendee: TAttendee; const Days: TSessionDays;
      out RegNum: TAttendeeRegistrationNumber): TBookingRepositoryError;
  end;

  
implementation

{ TORMBookingRepository }

constructor TORMBookingRepository.Create(ORM: TSQLRest);
begin
  inherited Create;
  ORM.Model.GetTableIndexExisting(TSQLBooking); // ensure part of the ORM model
  fRest := ORM;
end;

function TORMBookingRepository.SaveNewRegistration(const Attendee: TAttendee;
  const Days: TSessionDays; out RegNum: TAttendeeRegistrationNumber): TBookingRepositoryError;
var
  rec: TSQLBooking;
begin
  rec := TSQLBooking.Create(fRest, 'Name like ? and FirstName like ?', 
     [Attendee.Name, Attendee.FirstName]);
  try
    result := brDuplicatedInfo;
    if rec.IDValue <> 0 then
      exit;
    rec.Name := Attendee.Name;
    rec.FirstName := Attendee.FirstName;
    if Days <> nil then
      rec.Sessions := _Json(ObjArrayToJSON(Days), JSON_OPTIONS_FAST_EXTENDED);
    RegNum := fRest.Add(rec, true);
    result := brWriteFailure;
    if RegNum = 0 then
      exit;
    result := brSuccess;
  finally
    rec.Free;
  end;
end;


end.