diff --git a/FabAccessAPI/FabAccessAPI.csproj b/FabAccessAPI/FabAccessAPI.csproj
index 39926f3..87ed430 100644
--- a/FabAccessAPI/FabAccessAPI.csproj
+++ b/FabAccessAPI/FabAccessAPI.csproj
@@ -6,6 +6,10 @@
enable
+
+
+
+
diff --git a/FabAccessAPI/schema b/FabAccessAPI/schema
index 158d307..9d7c66b 160000
--- a/FabAccessAPI/schema
+++ b/FabAccessAPI/schema
@@ -1 +1 @@
-Subproject commit 158d307d74a8e82d5b7c9f4de1afcb180cc6eceb
+Subproject commit 9d7c66b9dd5d5245f21cb14c5d09de99954951e7
diff --git a/FabAccessAPI_Test/API_SpecTests/ResourceTest.cs b/FabAccessAPI_Test/API_SpecTests/ResourceTest.cs
new file mode 100644
index 0000000..ffe348b
--- /dev/null
+++ b/FabAccessAPI_Test/API_SpecTests/ResourceTest.cs
@@ -0,0 +1,101 @@
+using FabAccessAPI;
+using FabAccessAPI.Schema;
+using NLog.Time;
+using NUnit.Framework;
+
+namespace FabAccessAPI_Test;
+
+[TestFixture]
+public class ResourceTest
+{
+ [Test(Description="TestID: 00001")]
+ [TestCase("UserA", "MachineA")]
+ public async Task Claim(string username, string resourcename)
+ {
+ API api = new API();
+ ConnectionData connectionData = TestEnv.CreateConnetionData(username);
+ await api.Connect(connectionData).ConfigureAwait(false);
+
+ Resource resource = await api.Session.Resources.GetByName(resourcename).ConfigureAwait(false);
+ Fallible result = await resource.Claim.Claim().ConfigureAwait(false);
+
+ // TODO: Claim Error State in Case of Success
+
+ IClaim claim = result.Ok;
+
+ // TODO: Change State
+
+ await claim.Disown().ConfigureAwait(false);
+
+ await api.Disconnect().ConfigureAwait(false);
+ }
+
+ [TestCase("UserA", "fabaccess://test.fab-access.space/resources/MachineA")]
+ public async Task GetByUrl(string username, string resourceURN)
+ {
+ API api = new API();
+ ConnectionData connectionData = TestEnv.CreateConnetionData(username);
+ await api.Connect(connectionData).ConfigureAwait(false);
+
+ Resource resource = await api.Session.Resources.GetByUrl(resourceURL).ConfigureAwait(false);
+
+ Assert.That(resource, Is.Not.Null);
+
+ await api.Disconnect().ConfigureAwait(false);
+ }
+
+ [TestCase("UserA", "urn:fabaccess:resource:MachineA")]
+ public async Task GetByUrn(string username, string resourceURN)
+ {
+ API api = new API();
+ ConnectionData connectionData = TestEnv.CreateConnetionData(username);
+ await api.Connect(connectionData);
+
+ Resource resource = await api.Session.Resources.GetByUrn(resourceURN).ConfigureAwait(false);
+
+ await api.Disconnect().ConfigureAwait(false);
+ }
+
+ [TestCase("UserA")]
+ public async Task List(string username)
+ {
+ API api = new API();
+ ConnectionData connectionData = TestEnv.CreateConnetionData(username);
+ await api.Connect(connectionData).ConfigureAwait(false);
+
+ IReadOnlyList result = await api.Session.Resources.List().ConfigureAwait(false);
+
+ await api.Disconnect().ConfigureAwait(false);
+ }
+
+ [TestCase("UserA")]
+ public async Task Claimed(string username)
+ {
+ API api = new API();
+ ConnectionData connectionData = TestEnv.CreateConnetionData(username);
+ await api.Connect(connectionData).ConfigureAwait(false);
+
+ IReadOnlyList result = await api.Session.Resources.Claimed().ConfigureAwait(false);
+
+ await api.Disconnect().ConfigureAwait(false);
+ }
+
+ [TestCase("UserA", "MachineA")]
+ public async Task ClaimedListCheck(string username, string resourcename)
+ {
+ API api = new API();
+ ConnectionData connectionData = TestEnv.CreateConnetionData(username);
+ await api.Connect(connectionData).ConfigureAwait(false);
+
+ IReadOnlyList result1 = await api.Session.Resources.Claimed().ConfigureAwait(false);
+ Assert.That(result1.Count, Is.Zero);
+
+ Resource machineA = await api.Session.Resources.GetByName(resourcename).ConfigureAwait(false);
+ IClaim claim = (await machineA.Claim.Claim().ConfigureAwait(false)).Ok;
+
+ IReadOnlyList result2 = await api.Session.Resources.Claimed().ConfigureAwait(false);
+ Assert.That(result2.Count, Is.Not.Zero);
+
+ await api.Disconnect().ConfigureAwait(false);
+ }
+}
diff --git a/usecase.md b/usecase.md
index 58c2204..8309622 100644
--- a/usecase.md
+++ b/usecase.md
@@ -6,15 +6,15 @@ Use Cases
+ UserA - generischer User
+ UserB - generischer User mit gleichen Rollen wir UserA
+ UserC - generischer User ohne Rollen
-+ MaschineA - frei zugängliche Resource mit festem Ort und Stromanschluss
-+ TerminalA - NFC Reader bei MaschineA, welche nur MaschinA nutzen kann
-+ RolleB - Rolle mit Berechtigungen MaschineB zu nutzen
-+ MaschineB - beschränkt zugängliche Resource mit festem Ort und Stromanschluss
-+ TerminalB - NFC Reader bei MaschineA, welche nur MaschineB mit PIN nutzen kann
-+ TerminalB - NFC Reader bei MaschineA, welche nur MaschinB mit PIN nutzen kann
-+ MaschineC - frei zugängliche Resource mit festem Ort und Stromanschluss, benötigt MaschineD zum funktionieren
-+ MaschineD - Maschine mit welche von MaschineC gebraucht wird
-+ MaschineE - Maschine, welche von meheren Nutzer gleichzeitig verwendet werden kann
++ MachineA - frei zugängliche Resource mit festem Ort und Stromanschluss
++ TerminalA - NFC Reader bei MachineA, welche nur MaschinA nutzen kann
++ RolleB - Rolle mit Berechtigungen MachineB zu nutzen
++ MachineB - beschränkt zugängliche Resource mit festem Ort und Stromanschluss
++ TerminalB - NFC Reader bei MachineA, welche nur MachineB mit PIN nutzen kann
++ TerminalB - NFC Reader bei MachineA, welche nur MaschinB mit PIN nutzen kann
++ MachineC - frei zugängliche Resource mit festem Ort und Stromanschluss, benötigt MachineD zum funktionieren
++ MachineD - Maschine mit welche von MachineC gebraucht wird
++ MachineE - Maschine, welche von meheren Nutzer gleichzeitig verwendet werden kann
+ ManagerA - User mit Berechtigung zum Verwalten von Usern und Vergeben von Berechtigungen
+ UserB
+ CardA - FabFireCard von UserA
@@ -60,55 +60,55 @@ Borepin holt ein Token für die zukünftige Anmeldung des Gerätes
*User0 kann nun Resourcen ausleihen*
## Rollenvergabe
-*UserA möchte MaschineB verwenden können*
+*UserA möchte MachineB verwenden können*
-UserA geht zu ManagerA und erhält eine Einweisung für MaschineB
+UserA geht zu ManagerA und erhält eine Einweisung für MachineB
ManagerA öffnet Borepin, wird automatisch angemeldet und
+ öffnet die Nutzerverwaltung
+ wählt UserA aus
+ fügt UserA RolleB zu
-*UserA kann nun Borepin öffnen, wird automatisch angemeldet und kann MaschineB nutzten*
+*UserA kann nun Borepin öffnen, wird automatisch angemeldet und kann MachineB nutzten*
-## Claim
-*UserA steht vor MaschineA und möchte diese verwenden*
+## Claim - TestID:00001
+*UserA steht vor MachineA und möchte diese verwenden*
UserA öffnet Borepin, wird automatisch angemeldet und
-+ wählt MaschineA in einer Liste aus / scannt den QR-Code von MaschineA / scannt den NTAG von MaschineA
-+ leiht MaschineA aus
-+ schaltet den Strom von MaschineA frei
-+ verwendet MaschineA
-+ gibt MaschineA zurück, Strom wird gesperrt vom BFFH
++ wählt MachineA in einer Liste aus / scannt den QR-Code von MachineA / scannt den NTAG von MachineA
++ leiht MachineA aus
++ schaltet den Strom von MachineA frei
++ verwendet MachineA
++ gibt MachineA zurück, Strom wird gesperrt vom BFFH
-*UserA hat MaschineA verwendet*
+*UserA hat MachineA verwendet*
## Transfer
-*UserA möchte UserB die MaschineB übergeben*
+*UserA möchte UserB die MachineB übergeben*
-UserA hatte MaschineB ausgeliehen, öffnet Borepin, wird automatisch angemeldet und
-+ wählt MaschineA in einer Liste aus / scannt den QR-Code von MaschineA / scannt den NTAG von MaschineA
+UserA hatte MachineB ausgeliehen, öffnet Borepin, wird automatisch angemeldet und
++ wählt MachineA in einer Liste aus / scannt den QR-Code von MachineA / scannt den NTAG von MachineA
+ generiet ein Transfer QR-Code / emuliert eine Transfer NTAG
UserB öffnet Borepin, wird automatisch angemeldet und
+ scannt Transfer QR-Code / scannt Transfer NTAG
-*UserB kann nun MaschineB verwenden, ohne das der Zustand der Maschine sich verändet hat*
+*UserB kann nun MachineB verwenden, ohne das der Zustand der Maschine sich verändet hat*
## Lend/Instruct
-*UserA möchte UserC an MaschineB ausbilden*
+*UserA möchte UserC an MachineB ausbilden*
-UserA hatte MaschineB ausgeliehen, öffnet Borepin, wird automatisch angemeldet und
-+ wählt MaschineA in einer Liste aus / scannt den QR-Code von MaschineA / scannt den NTAG von MaschineA
+UserA hatte MachineB ausgeliehen, öffnet Borepin, wird automatisch angemeldet und
++ wählt MachineA in einer Liste aus / scannt den QR-Code von MachineA / scannt den NTAG von MachineA
+ generiet ein Lend QR-Code / emuliert eine Lend NTAG
UserC öffnet Borepin, wird automatisch angemeldet und
+ scannt Lend QR-Code / scannt Lend NTAG
-+ verwendet MaschineB
-+ gibt MaschineB zurück
++ verwendet MachineB
++ gibt MachineB zurück
-UserA erhält MaschineB zurück, prüft MaschineB, gibt MaschineB zurück
+UserA erhält MachineB zurück, prüft MachineB, gibt MachineB zurück
-*UserC hat MaschineB verwendet, unter Verantwortung von UserA*
+*UserC hat MachineB verwendet, unter Verantwortung von UserA*
## FabFireCard Erzeugung
*UserA geht zu ManagerA und möchte ein FabFireCard erhalten*
@@ -160,25 +160,25 @@ __Gleiches Verhalten wie bei Accounterzeugung__
*UserA hat sein Passwort zurückgesetzt*
## Terminalnutzung
-*UserA möchte MaschineA mit CardA ausleihen*
+*UserA möchte MachineA mit CardA ausleihen*
UserA steht vor TerminalA und
+ hält CardA auf den NFC Reader
TerminalA meldet sich bei BFFH und
-+ leiht MaschineA für UserA aus
++ leiht MachineA für UserA aus
+ schaltet den Strom frei
UserA steht vor TerminalA und
-+ gibt auf TerminalA ein, MaschineA zurückgeben
++ gibt auf TerminalA ein, MachineA zurückgeben
oder UserA öffnet Borepin, wird automatisch angemeldet und
+ gibt MaschinA zurück
-*UserA hat MaschineA mit CardA ausgeliehen und verwendet*
+*UserA hat MachineA mit CardA ausgeliehen und verwendet*
## Terminalnutzung mit PIN
-*UserA möchte MaschineB mit CardA ausleihen*
+*UserA möchte MachineB mit CardA ausleihen*
UserA steht vor TerminalB und
+ hält CardA auf den NFC Reader
@@ -186,20 +186,20 @@ UserA steht vor TerminalB und
+ tippt PIN ein
TerminalB meldet sich bei BFFH und
-+ leiht MaschineB für UserA aus
++ leiht MachineB für UserA aus
+ schaltet den Strom frei
__Gleiches Verhalten wie bei Accounterzeugung__
-*UserA hat MaschineA mit CardA ausgeliehen und verwendet*
+*UserA hat MachineA mit CardA ausgeliehen und verwendet*
## Reservieren
-*UserA möchte für morgen MaschineA reservieren*
+*UserA möchte für morgen MachineA reservieren*
UserA öffnet Borepin, wird automatisch angemeldet und
-+ wählt MaschineA aus Liste aus
++ wählt MachineA aus Liste aus
+ geht auf reservieren und trägt ein Zeitraum ein
--> UserA erhält zum Begin der Reservierung automatisch den Claim für die MaschineA, wenn dieser verfügbar ist
+-> UserA erhält zum Begin der Reservierung automatisch den Claim für die MachineA, wenn dieser verfügbar ist
oder
@@ -208,55 +208,55 @@ oder
UserA geht zu ManagerA und bittet ihn die Maschine freizugeben
ManagerA öffnet Borepin, wird automatisch angemeldet und
-+ wählt MaschineA aus Liste aus
++ wählt MachineA aus Liste aus
+ entfernt den Claim
--> UserA erhält automatisch den Claim für MaschineA
-*UserA kann MaschineA im Reservierungszeitraum nutzen*
+-> UserA erhält automatisch den Claim für MachineA
+*UserA kann MachineA im Reservierungszeitraum nutzen*
## Queuing
-*UserB verwendet gerade MaschineA und UserA möchte als nächster an MaschineA*
+*UserB verwendet gerade MachineA und UserA möchte als nächster an MachineA*
UserA öffnet Borepin, wird automatisch angemeldet und
-+ wählt MaschineA aus Liste aus
++ wählt MachineA aus Liste aus
+ geht auf queuing
-UserB gibt MaschineA zurück
--> UserA erhält automatisch ein Claim auf MaschineA
-*UserA kann direkt nach UserB MaschineA nutzen*
+UserB gibt MachineA zurück
+-> UserA erhält automatisch ein Claim auf MachineA
+*UserA kann direkt nach UserB MachineA nutzen*
## Intereset/Reservierung/Queuing aufhebn
-*UserA hat einen Interest auf MaschineA*
+*UserA hat einen Interest auf MachineA*
UserA öffnet Borepin, wird automatisch angemeldet und
-+ wählt MaschineA aus Liste aus
++ wählt MachineA aus Liste aus
+ beendet Interest
-*UserA hat jetzt keinen Interest auf MaschineA*
+*UserA hat jetzt keinen Interest auf MachineA*
## Benachrichten
-*UserA möchte wissen wann die MaschineA frei ist*
+*UserA möchte wissen wann die MachineA frei ist*
UserA öffnet Borepin, wird automatisch angemeldet und
-+ wählt MaschineA aus Liste aus
-+ aktiviert Benachrichtigungen für MaschineA (mit Optionen, um welchen State es geht)
++ wählt MachineA aus Liste aus
++ aktiviert Benachrichtigungen für MachineA (mit Optionen, um welchen State es geht)
--> BFFH benachrichtigt UserA, dass die MaschineA frei ist
+-> BFFH benachrichtigt UserA, dass die MachineA frei ist
-> Noftiy wird wieder gelöscht
oder
--> BFFH benachrichtigt UserA, dass die MaschineA frei ist
+-> BFFH benachrichtigt UserA, dass die MachineA frei ist
UserA öffnet Borepin, wird automatisch angemeldet und
-+ wählt MaschineA aus Liste aus
-+ deaktiviert Benachrichtigungen für MaschineA
++ wählt MachineA aus Liste aus
++ deaktiviert Benachrichtigungen für MachineA
-*UserA wurde über Änderungen von MaschineA benachrichtigt*
+*UserA wurde über Änderungen von MachineA benachrichtigt*
## Abhängige Maschinen
-*UserA möchte MaschineC ausleihen*
+*UserA möchte MachineC ausleihen*
serA öffnet Borepin, wird automatisch angemeldet und
-+ wählt MaschineA aus Liste aus
-+ claimed MaschineA
--> MaschineD wird von BFFH geclaimed
++ wählt MachineA aus Liste aus
++ claimed MachineA
+-> MachineD wird von BFFH geclaimed
## Kaputte Maschine melden