![]() |
e:mendata Okta Core
|
eigene API für Drive Lizenez Kundendaten
die Okta Drive API verwaltet emendata Konto und Kundendaten. Die API ist minimal und auf Performance ausgelegt. Die Daten KontoDaten und Kundendaten werden in separaten speicherObjekten abgelegt. Kontodaten werden in einer LiteDB abgelegt da hier kaum gleichzeitige schreib Änderungen auftreten, oder nur von einem Task abgearbeitet werden (Admin)
DatenTabellen Kontodaten:
Die KundenDaten werden im einem speziellen Datenformat abgelegt. Die Daten sind in einem EmenDataSet definiert und für alle SubDaten gleich. Das EmenDataSet basiert auf HeaderDaten zur schnellen Indexierung/Synchronisierung und einem DatenBlob in dem die SubDaten enthalten sind.
Aus Historischer Sicht sind die Kundendaten im DriveDataSet. Dieses wird durch das EmenDataSet abgelöst. Dieses enthält IndexFelder und neu benötigte Flags. Eine Konvertierung von DriveDataSet nach EmenDataSet ist per Lizenzkey bereits implementiert (Stand 11.2025).
string SrcDataSetBlob = MasterPool.GetBlob();
if (SrcDataSetBlob.GetInfoData() is ExtInfo BlobIndex) {
EmenDataSet? res = new EmenDataSet(MasterPool.IsArtOf(), BlobIndex.ID, MasterPool.LizenzKey);
res.Blob = MasterPool.Blob;
res.Changed = MasterPool.Changed.Date;
res.Creater = MasterPool.Creater.DriveClient;
res.Created = res.Changed < MasterPool.Creater.Stamp ? res.Changed : MasterPool.Creater.Stamp;
res.InTrash = MasterPool.InTrash;
res.ParentID = MasterPool.ParentID;
res.PrivateInfo = MasterPool.PrivateInfo;
res.SubInfo = BlobIndex.Info;
res.Anzeigename = BlobIndex.Name;
string oktaLizenzPath = res.ID.Substring(0, 3);
string savePath = $"{IODataPath}{Lizenz}/{oktaLizenzPath}/{res.ID}.emdj";
savePath.ForceDirectoryExists();
File.WriteAllText(savePath, res.ToJson());
...}
Es wird der Blob in das EmenDataSet übernommen und die neuen Felder mit Hilfe der bestehenden Daten ergänzt. Somit könnnen im neuen System die bestehen DAten weiter verwendet werden. Da im EmenDataSet die SubDaten in einem Blob gespeichert werden kann man nicht so einfach Daten lesen. Beim Seichern eines EmenDataSets, werden aud dem Blob, IndexDaten extrahiert und stehen als Property zur Verfügung.
Die Sub DatenTypen des EmenDataSets.
public enum DataArt {
/// <summary>
///
/// </summary>
Standard, //0
/// <summary>
/// Contains Person
/// </summary>
Kunde, //1
/// <summary>
/// Contains Vertrag
/// </summary>
Vertrag, //2
/// <summary>
/// Contains BeratungsItem
/// </summary>
Beratung, //3
/// <summary>
/// Contains Dok
/// </summary>
Dokument, //4
/// <summary>
/// Contains NoteItem
/// </summary>
Notiz, //5
/// <summary>
/// Contains Trash Person
/// </summary>
Trash, //6
/// <summary>
/// Contains Vertrag
/// </summary>
MusterVertrag, //7
/// <summary>
/// Contains BeratungsItem
/// </summary>
Workberatung //8
}
/// <summary>
/// ReadOnly
/// </summary>
public DataArt WorkType { get { return IsArtOf(); } set {; } }
/// <summary>
/// ObjGuid Pattern Q XX YYYYYYYYYYYYYYYYYYYYYYYYYYYY
/// </summary>
public string ID { get; set; } = "Q00" + Guid.NewGuid().ToString("N");
/// <summary>
/// Für Listen als "AnzeigeName" Spalte 1 ( Person Anzeigename ), ( Beratung Beratungsname und SubInfo Person Anzeigename )
/// </summary>
public string Anzeigename { get; set; }
/// <summary>
/// 2 AnzeigeInfo für Spalten
/// </summary>
public string? SubInfo { get; set; }
/// <summary>
/// Zuordnung zu AKEY (Kunde)
/// </summary>
public string LizenzKey { get; set; } = "-.-";
/// <summary>
///
/// </summary>
public string Creater { get; set; }
/// <summary>
/// Can only be read by Creater/Admin
/// </summary>
public bool IsPrivate { get; set; }
/// <summary>
/// Details für Private
/// </summary>
public string PrivateInfo { get; set; }
/// <summary>
/// Date of last Change
/// </summary>
public DateTime Changed { get { _Changed = _Changed.ToKindUtc(); return _Changed; } set { _Changed = value.ToKindUtc(); } }
/// <summary>
/// Date of Creation
/// </summary>
public DateTime Created { get { _Created = _Created.ToKindUtc(); return _Created; } set { _Created = value.ToKindUtc(); } }
/// <summary>
/// Is Deleted ""
/// </summary>
public bool InTrash { get; set; }
/// <summary>
/// KundeID or Parent Group
/// </summary>
public string ParentID { get; set; }
/// <summary>
/// Crypt DataSet
/// </summary>
public string Blob { get; set; }
das EmenDataSet wird als Serialisiertes Object gespeichet.
Ablageort: ASetting::LizenzDataPath Ablageschema: <Lizenz><DataTyp><GUIDObject>.emdj
Auflistung der Ordnerpfade für Volume Work
Volumeseriennummer : 22AF-8034
D:\mnt\data\pool
└───3W6P1K5OUEB8MOT8
├───Q01
├───Q02
├───Q03
├───Q04
└───Q05
Weitere SubFolder für das Konto
├───Errors ├───Invoices ├───Templates ├───Suppport └───Dokuments
Dorthin werden die jeweiligen Daten abgelegt.
Für ein schnelles Suchen und Indexieren sind im EmenDataSet IndesWerte enthalten, diese werden bein aktualisieren des SubSets in das EmenDataSet kopiert.
Achtung der DataBlob ist Primär XML als Base64Encoded String. SuchFilter werden auch über Properies festgelegt.?
SuchFilter für Personen: ist ein json Nachfolgendes Schema
{
"Filter": {
"Vorname": "*" // Property und SuchPattern
}
}
Das wird noch global erstellt um aus
List<sData> res = DriveDaten.where(Propery=="Pattern")
eigene Update API
eigene Api für Homepages
eigene API für Tools, Invoice usw. Nicht für Kunden ;-)