Inhalt

Aktueller Ordner: duesseldorfer-schuelerinventar-freepascal-client
⬅ Übergeordnet

u_api_alt2.pas

unit u_api;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, fpjson, jsonparser, fphttpclient, 
  openssl, // Statt opensslsockets
  Dialogs;

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

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

  TProfile = record
    ProfileID: string;
    Name: string;
    GroupName: string;
    GroupID: string;
    Items: array[1..36] of Integer;
    FEItems: array[1..36] of Integer;
    Competence1: Integer;
    Competence2: Integer;
    Competence3: Integer;
    Competence4: Integer;
    Competence5: Integer;
    Competence6: Integer;
  end;

  TGroup = record
    GroupID: Integer;
    Name: string;
  end;

  TNorms = record
    NormSE: array[1..6, 1..5] of Double;
    NormFE: array[1..6, 1..5] of Double;
  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;
function GetNorms(const NormType: string): TNorms;

implementation

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

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

function Login(const Username, Password: string): TLoginResponse;
var
  Headers: TStringList;
  PostData: string;
  JSON: 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) then
    begin
      if JSON.Get('success', False) or (JSON.Get('userID', '') <> '') then
      begin
        Result.Success := True;
        Result.UserID := JSON.Get('userID', '');
        Result.Session := JSON.Get('session', '');
      end
      else
        Result.Error := JSON.Get('error', 'Unbekannter Fehler');
      JSON.Free;
    end
    else
      Result.Error := 'Verbindungsfehler';
  finally
    Headers.Free;
  end;
end;

function GetProfiles(const UserID, Session: string): TJSONArray;
var
  Headers: TStringList;
  JSON: TJSONObject;
  JSONData: 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);

    JSON := CreateHTTPRequest('GET', API_BASE_URL + 'api_profiles.php', Headers);
    if Assigned(JSON) then
    begin
      // Prüfen ob JSON ein Array ist
      JSONData := JSON as TJSONData;
      if JSONData.JSONType = jtArray then
        Result := JSON as TJSONArray
      else
        JSON.Free;
    end;
  finally
    Headers.Free;
  end;
end;

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

    Result := CreateHTTPRequest('GET', API_BASE_URL + 'api_profiles.php?id=' + ProfileID, Headers);
  finally
    Headers.Free;
  end;
end;

function CreateProfile(const UserID, Session: string; const Data: TJSONObject): Boolean;
var
  Headers: TStringList;
  JSON: 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) then
    begin
      Result := JSON.Get('success', False);
      JSON.Free;
    end;
  finally
    Headers.Free;
  end;
end;

function UpdateProfile(const UserID, Session: string; const Data: TJSONObject): Boolean;
var
  Headers: TStringList;
  JSON: 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) then
    begin
      Result := JSON.Get('success', False);
      JSON.Free;
    end;
  finally
    Headers.Free;
  end;
end;

function DeleteProfile(const UserID, Session, ProfileID: string): Boolean;
var
  Headers: TStringList;
  JSON: 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) then
    begin
      Result := JSON.Get('success', False);
      JSON.Free;
    end;
  finally
    Headers.Free;
  end;
end;

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

    JSON := CreateHTTPRequest('GET', API_BASE_URL + 'api_groups.php', Headers);
    if Assigned(JSON) then
    begin
      JSONData := JSON as TJSONData;
      if JSONData.JSONType = jtArray then
        Result := JSON as TJSONArray
      else
        JSON.Free;
    end;
  finally
    Headers.Free;
  end;
end;

function CreateGroup(const UserID, Session, GroupName: string): Boolean;
var
  Headers: TStringList;
  JSON: TJSONObject;
  Data: 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) then
    begin
      Result := JSON.Get('success', False);
      JSON.Free;
    end;
  finally
    Data.Free;
    Headers.Free;
  end;
end;

function DeleteGroup(const UserID, Session: string; GroupID: Integer): Boolean;
var
  Headers: TStringList;
  JSON: 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) then
    begin
      Result := JSON.Get('success', False);
      JSON.Free;
    end;
  finally
    Headers.Free;
  end;
end;

function GetNorms(const NormType: string): TNorms;
var
  Headers: TStringList;
  JSON: TJSONObject;
  NormObj: TJSONObject;
  NormArray: TJSONArray;
  i, j: Integer;
begin
  // Initialize with default values
  for i := 1 to 6 do
    for j := 1 to 5 do
    begin
      Result.NormSE[i][j] := 0;
      Result.NormFE[i][j] := 0;
    end;

  Headers := TStringList.Create;
  try
    JSON := CreateHTTPRequest('GET', API_BASE_URL + 'api_norms.php?type=' + NormType, Headers);
    if Assigned(JSON) then
    begin
      NormObj := JSON.Get('normSE', TJSONObject(nil));
      if Assigned(NormObj) then
      begin
        for i := 1 to 6 do
        begin
          if NormObj.IndexOfName(IntToStr(i)) >= 0 then
          begin
            NormArray := NormObj.Get(IntToStr(i), TJSONArray(nil));
            if Assigned(NormArray) then
              for j := 1 to 5 do
                Result.NormSE[i][j] := NormArray.Items[j-1].AsFloat;
          end;
        end;
      end;

      NormObj := JSON.Get('normFE', TJSONObject(nil));
      if Assigned(NormObj) then
      begin
        for i := 1 to 6 do
        begin
          if NormObj.IndexOfName(IntToStr(i)) >= 0 then
          begin
            NormArray := NormObj.Get(IntToStr(i), TJSONArray(nil));
            if Assigned(NormArray) then
              for j := 1 to 5 do
                Result.NormFE[i][j] := NormArray.Items[j-1].AsFloat;
          end;
        end;
      end;

      JSON.Free;
    end;
  finally
    Headers.Free;
  end;
end;

end.