Inhalt
Aktueller Ordner:
duesseldorfer-schuelerinventar-freepascal-clientu_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.