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.