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.