Inhalt

Aktueller Ordner: duesseldorfer-schuelerinventar-freepascal-client
β¬… Übergeordnet

u_api.pas

unit u_api;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, fpjson, jsonparser, fphttpclient, openssl, Dialogs;

const
  API_BASE_URL = 'https://paul-koop.org/api/';

type
  TLoginResponse = record
    Success: Boolean;
    UserID: string;
    Session: string;
    Error: string;
  end;

function Login(const Username, Password: string): TLoginResponse;
function GetProfiles(const UserID, Session: string): TJSONArray;
function GetProfile(const UserID, Session, ProfileID: string): TJSONObject;
function CreateProfile(const UserID, Session: string; const Data: TJSONObject): Boolean;
function UpdateProfile(const UserID, Session: string; const Data: TJSONObject): Boolean;
function DeleteProfile(const UserID, Session, ProfileID: string): Boolean;
function GetGroups(const UserID, Session: string): TJSONArray;
function CreateGroup(const UserID, Session, GroupName: string): Boolean;
function DeleteGroup(const UserID, Session: string; GroupID: Integer): Boolean;

implementation

function CreateHTTPRequest(const Method, URL: string; const Headers: TStringList;
  const PostData: string = ''): TJSONData;
var
  Client: TFPHTTPClient;
  i: Integer;
  ResponseStream: TStringStream;
begin
  Result := nil;
  Client := TFPHTTPClient.Create(nil);
  ResponseStream := TStringStream.Create('');
  try
    InitSSLInterface;
    Client.AllowRedirect := True;
    
    if Assigned(Headers) then
      for i := 0 to Headers.Count - 1 do
        Client.RequestHeaders.Add(Headers[i]);
    
    if Method = 'GET' then
      Client.Get(URL, ResponseStream)
    else if Method = 'POST' then
    begin
      Client.RequestBody := TStringStream.Create(PostData);
      try
        Client.Post(URL, ResponseStream);
      finally
        Client.RequestBody.Free;
      end;
    end
    else if Method = 'PUT' then
    begin
      Client.RequestBody := TStringStream.Create(PostData);
      try
        Client.Put(URL, ResponseStream);
      finally
        Client.RequestBody.Free;
      end;
    end
    else if Method = 'DELETE' then
      Client.Delete(URL, ResponseStream)
    else
      Exit;

    if Client.ResponseStatusCode = 200 then
    begin
      if ResponseStream.DataString <> '' then
        Result := GetJSON(ResponseStream.DataString);
    end;
  finally
    ResponseStream.Free;
    Client.Free;
  end;
end;

function Login(const Username, Password: string): TLoginResponse;
var
  Headers: TStringList;
  PostData: string;
  JSON: TJSONData;
  JSONObj: TJSONObject;
begin
  Result.Success := False;
  Result.UserID := '';
  Result.Session := '';
  Result.Error := '';

  Headers := TStringList.Create;
  try
    Headers.Add('Content-Type: application/json');
    PostData := '{"username":"' + Username + '","password":"' + Password + '"}';

    JSON := CreateHTTPRequest('POST', API_BASE_URL + 'api_login.php', Headers, PostData);
    if Assigned(JSON) and (JSON.JSONType = jtObject) then
    begin
      JSONObj := TJSONObject(JSON);
      
      if JSONObj.IndexOfName('success') >= 0 then
        Result.Success := JSONObj.Get('success', False);
      if JSONObj.IndexOfName('userID') >= 0 then
        Result.UserID := JSONObj.Get('userID', '');
      if JSONObj.IndexOfName('session') >= 0 then
        Result.Session := JSONObj.Get('session', '');
      if JSONObj.IndexOfName('error') >= 0 then
        Result.Error := JSONObj.Get('error', '');
        
      JSON.Free;
    end
    else if Assigned(JSON) then
      JSON.Free;
  finally
    Headers.Free;
  end;
end;

function GetProfiles(const UserID, Session: string): TJSONArray;
var
  Headers: TStringList;
  Data: TJSONData;
begin
  Result := nil;
  Headers := TStringList.Create;
  try
    Headers.Add('Content-Type: application/json');
    Headers.Add('X-User-ID: ' + UserID);
    Headers.Add('X-Session: ' + Session);

    Data := CreateHTTPRequest('GET', API_BASE_URL + 'api_profiles.php', Headers);
    if Assigned(Data) and (Data.JSONType = jtArray) then
      Result := TJSONArray(Data)
    else if Assigned(Data) then
      Data.Free;
  finally
    Headers.Free;
  end;
end;

function GetProfile(const UserID, Session, ProfileID: string): TJSONObject;
var
  Headers: TStringList;
  Data: TJSONData;
begin
  Result := nil;
  Headers := TStringList.Create;
  try
    Headers.Add('Content-Type: application/json');
    Headers.Add('X-User-ID: ' + UserID);
    Headers.Add('X-Session: ' + Session);

    Data := CreateHTTPRequest('GET', API_BASE_URL + 'api_profiles.php?id=' + ProfileID, Headers);
    if Assigned(Data) and (Data.JSONType = jtObject) then
      Result := TJSONObject(Data)
    else if Assigned(Data) then
      Data.Free;
  finally
    Headers.Free;
  end;
end;

function CreateProfile(const UserID, Session: string; const Data: TJSONObject): Boolean;
var
  Headers: TStringList;
  JSON: TJSONData;
  JSONObj: TJSONObject;
begin
  Result := False;
  Headers := TStringList.Create;
  try
    Headers.Add('Content-Type: application/json');
    Headers.Add('X-User-ID: ' + UserID);
    Headers.Add('X-Session: ' + Session);

    JSON := CreateHTTPRequest('POST', API_BASE_URL + 'api_profiles.php', Headers, Data.AsJSON);
    if Assigned(JSON) and (JSON.JSONType = jtObject) then
    begin
      JSONObj := TJSONObject(JSON);
      if JSONObj.IndexOfName('success') >= 0 then
        Result := JSONObj.Get('success', False);
      JSON.Free;
    end
    else if Assigned(JSON) then
      JSON.Free;
  finally
    Headers.Free;
  end;
end;

function UpdateProfile(const UserID, Session: string; const Data: TJSONObject): Boolean;
var
  Headers: TStringList;
  JSON: TJSONData;
  JSONObj: TJSONObject;
begin
  Result := False;
  Headers := TStringList.Create;
  try
    Headers.Add('Content-Type: application/json');
    Headers.Add('X-User-ID: ' + UserID);
    Headers.Add('X-Session: ' + Session);

    JSON := CreateHTTPRequest('PUT', API_BASE_URL + 'api_profiles.php', Headers, Data.AsJSON);
    if Assigned(JSON) and (JSON.JSONType = jtObject) then
    begin
      JSONObj := TJSONObject(JSON);
      if JSONObj.IndexOfName('success') >= 0 then
        Result := JSONObj.Get('success', False);
      JSON.Free;
    end
    else if Assigned(JSON) then
      JSON.Free;
  finally
    Headers.Free;
  end;
end;

function DeleteProfile(const UserID, Session, ProfileID: string): Boolean;
var
  Headers: TStringList;
  JSON: TJSONData;
  JSONObj: TJSONObject;
begin
  Result := False;
  Headers := TStringList.Create;
  try
    Headers.Add('X-User-ID: ' + UserID);
    Headers.Add('X-Session: ' + Session);

    JSON := CreateHTTPRequest('DELETE', API_BASE_URL + 'api_profiles.php?id=' + ProfileID, Headers);
    if Assigned(JSON) and (JSON.JSONType = jtObject) then
    begin
      JSONObj := TJSONObject(JSON);
      if JSONObj.IndexOfName('success') >= 0 then
        Result := JSONObj.Get('success', False);
      JSON.Free;
    end
    else if Assigned(JSON) then
      JSON.Free;
  finally
    Headers.Free;
  end;
end;

function GetGroups(const UserID, Session: string): TJSONArray;
var
  Headers: TStringList;
  Data: TJSONData;
begin
  Result := nil;
  Headers := TStringList.Create;
  try
    Headers.Add('X-User-ID: ' + UserID);
    Headers.Add('X-Session: ' + Session);

    Data := CreateHTTPRequest('GET', API_BASE_URL + 'api_groups.php', Headers);
    if Assigned(Data) and (Data.JSONType = jtArray) then
      Result := TJSONArray(Data)
    else if Assigned(Data) then
      Data.Free;
  finally
    Headers.Free;
  end;
end;

function CreateGroup(const UserID, Session, GroupName: string): Boolean;
var
  Headers: TStringList;
  JSON: TJSONData;
  Data: TJSONObject;
  JSONObj: TJSONObject;
begin
  Result := False;
  Headers := TStringList.Create;
  Data := TJSONObject.Create;
  try
    Headers.Add('Content-Type: application/json');
    Headers.Add('X-User-ID: ' + UserID);
    Headers.Add('X-Session: ' + Session);
    Data.Add('name', GroupName);

    JSON := CreateHTTPRequest('POST', API_BASE_URL + 'api_groups.php', Headers, Data.AsJSON);
    if Assigned(JSON) and (JSON.JSONType = jtObject) then
    begin
      JSONObj := TJSONObject(JSON);
      if JSONObj.IndexOfName('success') >= 0 then
        Result := JSONObj.Get('success', False);
      JSON.Free;
    end
    else if Assigned(JSON) then
      JSON.Free;
  finally
    Data.Free;
    Headers.Free;
  end;
end;

function DeleteGroup(const UserID, Session: string; GroupID: Integer): Boolean;
var
  Headers: TStringList;
  JSON: TJSONData;
  JSONObj: TJSONObject;
begin
  Result := False;
  Headers := TStringList.Create;
  try
    Headers.Add('X-User-ID: ' + UserID);
    Headers.Add('X-Session: ' + Session);

    JSON := CreateHTTPRequest('DELETE', API_BASE_URL + 'api_groups.php?id=' + IntToStr(GroupID), Headers);
    if Assigned(JSON) and (JSON.JSONType = jtObject) then
    begin
      JSONObj := TJSONObject(JSON);
      if JSONObj.IndexOfName('success') >= 0 then
        Result := JSONObj.Get('success', False);
      JSON.Free;
    end
    else if Assigned(JSON) then
      JSON.Free;
  finally
    Headers.Free;
  end;
end;

end.