Inhalt
Aktueller Ordner:
duesseldorfer-schuelerinventar-freepascal-clientu_api_alt.pas
unit u_api;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, fpjson, jsonparser, fphttpclient, opensslsockets;
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
uses Dialogs;
function CreateHTTPRequest(const Method, URL: string; const Headers: TStringList;
const PostData: string = ''): TJSONObject;
var
Client: TFPHTTPClient;
Response: string;
begin
Result := nil;
Client := TFPHTTPClient.Create(nil);
try
Client.AllowRedirect := True;
Client.RequestHeaders := Headers;
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
Result := GetJSON(Response) as TJSONObject;
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 := Format('{"username":"%s","password":"%s"}', [Username, 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;
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) and (JSON is TJSONArray) then
Result := JSON as TJSONArray
else if Assigned(JSON) then
JSON.Free;
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;
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) and (JSON is TJSONArray) then
Result := JSON as TJSONArray
else if Assigned(JSON) then
JSON.Free;
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;
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
if NormObj.IndexOfName(IntToStr(i)) >= 0 then
for j := 1 to 5 do
Result.NormSE[i][j] := NormObj.Get(IntToStr(i), TJSONArray(nil)).Items[j-1].AsFloat;
end;
NormObj := JSON.Get('normFE', TJSONObject(nil));
if Assigned(NormObj) then
begin
for i := 1 to 6 do
if NormObj.IndexOfName(IntToStr(i)) >= 0 then
for j := 1 to 5 do
Result.NormFE[i][j] := NormObj.Get(IntToStr(i), TJSONArray(nil)).Items[j-1].AsFloat;
end;
JSON.Free;
end;
finally
Headers.Free;
end;
end;
end.