Komfortsuche/Filter...alles das gleiche, nämlich Kartoffelsuppe #9

Open
opened 2024-06-18 15:27:03 +02:00 by Daniel_Hassert · 0 comments
Member

Dieser Post beinhaltet Teile aus den anderen Issues und dient nur als Hilfestellung. Ich füge hier, am Beispiel der Komfortsuche, zusammen, wie ichs mir vorstelle.

Die Komfortsuche beginnt mit der Auswahl der Teileart:
--> Abfrage MaterialTypes

Filter einen Type mitgeben, damit die Antwort des Servers nur MaterialType enthält. Dann können auch die Endpunkte für MaterialType und VehicleType entfallen. Letztendlich ist dann alles beschreibbar durch Filter oder FilterOption Issue Redundante Models

{domain}/{etc}/api/shop/Filters?type=MaterialType

Als Response erhalte ich ein Json-Array mit der angeforderten Resource. Wir haben ein Array<Filter>. Das Array enthält nur Filter vom Type: 'MaterialType' wie angegeben und den entsprechenden FilterOptions

[{
    "Guid": "",
    "Designation": "Teileart",
    "Type": "MaterialType",
    "Options": [
        {
            "Designation": "Reifen",
            "NumberOfResults": 6628,
            "Type": "MaterialType",
            "Value": "501|1"
        },
        {
            "Designation": "Handelsartikel",
            "NumberOfResults": 6628,
            "Type": "MaterialType",
            "Value": "501|7"
        },
        {
            "Designation": "Stahlfelgen",
            "NumberOfResults": 6628,
            "Type": "MaterialType",
            "Value": "501|2"
        },
        {
            "Designation": "Reifen",
            "NumberOfResults": 6628,
            "Type": "MaterialType",
            "Value": "501|3"
        }
    ]
}]

Mit dem Ergebnis können die Teilearten als Buttons zur Verfügung gestellt werden. Die erste Teileart wird direkt ausgewählt und die nächste Abfrage erzeugt.

{domain}/{etc}/api/shop/Filters?type=VehicleType

Jetzt wird ein Parameter(FilterOption) im RequestBody mitgeschickt, der die Fahrzeuge eingrenzt.

{
    "FilterOptions": [
        { "Value": "501|1", "Designation": "Reifen", "Type": "MaterialType", "NumberOfResults": 6628,  }
    ]
}

NumberOfResults und Designation sind eigentlich überflüssig, aber tut auch nicht weh.

Response:

[{
    "Guid": "",
    "Designation": "Fahrzeugtyp",
    "Type": "VehicleType",
    "Options": [
        {
            "Designation": "PKW",
            "NumberOfResults": 1337,
            "Type": "VehicleType",
            "Value": "ebb89e89-8d25-809e-7814-c53b686ae164501|1"
        },
        {
            "Designation": "Motorrad",
            "NumberOfResults": 1337,
            "Type": "VehicleType",
            "Value": "ebb89e89-8d25-809e-7814-c53b686ae165"
        }
    ]
}]

Im nächsten Schritt werden dann die übrigen Filter abgeholt, die sich als Eigenschaft auf einen Reifenartikel für PKWs beziehen.

{domain}/{etc}/api/shop/Filters

Parameter:

{
    "FilterOptions": [
        { "Value": "501|1", "Designation": "Reifen", "Type": "MaterialType", "NumberOfResults": 6628  },
        { "Value": "ebb89e89-8d25-809e-7814-c53b686ae164501|1", "Designation": "PKW", "Type": "VehicleType", "NumberOfResults": 1337  }
    ]
}

Der Clou ist jetzt, dass ohne einen Type im Get-Parameter auf /Filters, das komplette Array aus allen möglichen Filtern geliefert wird.

[
    {
        "Value": "",
        "Designation": "Teileart",
        "Type": "MaterialType",
        "Options": ["..."]
    },
    {
        "Value": "",
        "Designation": "Fahrzeugtyp",
        "Type": "VehicleType",
        "Options": ["..."]
    },
    {
        "Value": "",
        "Designation": "Durchmesser",
        "Type": "Diameter",
        "Options": ["..."]
    },
    {
        "Value": "",
        "Designation": "Lochkreis",
        "Type": "HoleCircle",
        "Options": ["..."]
    },
    {
        "Value": "",
        "Designation": "Lochzahl",
        "Type": "HoleCount",
        "Options": ["..."]
    },
    {
        "Value": "",
        "Designation": "LoadIndex",
        "Type": "LoadIndex",
        "Options": ["..."]
    },
    ...usw
]

usw.

Mit der Auswahl kann dann Articles abgefragt und gefiltert werden =)

Entsprechend lässt sich damit auch mit Angabe des SearchTerm die Ergebnisse in der Tabelle weiter filtern.

tldr;

Eine Spielerei:

Die Abfrage von Filters mit dem Spezialtyp ComfortSearch, liefert direkt das initiale Setup unter Annahme, das die erste Teileart und der erste Fahrzeugtyp default ist.

Der leere "Value" Wert könnte dann einfach den ausgewählten default wert wiederspiegeln

{domain}/{etc}/api/shop/Filters?type=ComfortSearch

Und das initiale Setup entspricht dann soziemlich genau dem letzten Array beim konventionellen Ablauf.

Im folgenden nochmal etwas ausführlicher zusammengebastelt als oben

[
	{
		"Value": "501|1",
		"Designation": "Teileart",
		"Type": "MaterialType",
		"Options": [
			{
				"Designation": "Reifen",
				"NumberOfResults": 6628,
				"Type": "MaterialType",
				"Value": "501|1"
			},
			{
				"Designation": "Handelsartikel",
				"NumberOfResults": 6628,
				"Type": "MaterialType",
				"Value": "501|7"
			},
			{
				"Designation": "Stahlfelgen",
				"NumberOfResults": 6628,
				"Type": "MaterialType",
				"Value": "501|2"
			},
			{
				"Designation": "Reifen",
				"NumberOfResults": 6628,
				"Type": "MaterialType",
				"Value": "501|3"
			}
		]
	},
	{
		"Value": "ebb89e89-8d25-809e-7814-c53b686ae164501|1",
		"Designation": "Fahrzeugtyp",
		"Type": "VehicleType",
		"Options": [
			{
				"Designation": "PKW",
				"NumberOfResults": 1337,
				"Type": "VehicleType",
				"Value": "ebb89e89-8d25-809e-7814-c53b686ae164501|1"
			},
			{
				"Designation": "Motorrad",
				"NumberOfResults": 1337,
				"Type": "VehicleType",
				"Value": "ebb89e89-8d25-809e-7814-c53b686ae165"
			}
		]
	},
	{
		"Value": "",
		"Designation": "Durchmesser",
		"Type": "Diameter",
		"Options": ["..."]
	},
	{
		"Value": "",
		"Designation": "Lochkreis",
		"Type": "HoleCircle",
		"Options": ["..."]
	},
	{
		"Value": "",
		"Designation": "Lochzahl",
		"Type": "HoleCount",
		"Options": ["..."]
	},
	{
		"Value": "",
		"Designation": "LoadIndex",
		"Type": "LoadIndex",
		"Options": ["..."]
	}
]

Dieser Post beinhaltet Teile aus den anderen Issues und dient nur als Hilfestellung. Ich füge hier, am Beispiel der Komfortsuche, zusammen, wie ichs mir vorstelle. Die Komfortsuche beginnt mit der Auswahl der Teileart: --> Abfrage `MaterialTypes` `Filter` einen Type mitgeben, damit die Antwort des Servers nur `MaterialType` enthält. Dann können auch die Endpunkte für `MaterialType` und `VehicleType` entfallen. Letztendlich ist dann alles beschreibbar durch `Filter` oder `FilterOption` [Issue Redundante Models](https://git.prod.rz2.prm-ag.de/PRM_Software_AG/api-documentation/issues/6) ```text {domain}/{etc}/api/shop/Filters?type=MaterialType ``` Als Response erhalte ich ein Json-Array mit der angeforderten Resource. Wir haben ein `Array<Filter>`. Das Array enthält nur `Filter` vom `Type: 'MaterialType'` wie angegeben und den entsprechenden `FilterOptions` ```json [{ "Guid": "", "Designation": "Teileart", "Type": "MaterialType", "Options": [ { "Designation": "Reifen", "NumberOfResults": 6628, "Type": "MaterialType", "Value": "501|1" }, { "Designation": "Handelsartikel", "NumberOfResults": 6628, "Type": "MaterialType", "Value": "501|7" }, { "Designation": "Stahlfelgen", "NumberOfResults": 6628, "Type": "MaterialType", "Value": "501|2" }, { "Designation": "Reifen", "NumberOfResults": 6628, "Type": "MaterialType", "Value": "501|3" } ] }] ``` Mit dem Ergebnis können die Teilearten als Buttons zur Verfügung gestellt werden. Die erste Teileart wird direkt ausgewählt und die nächste Abfrage erzeugt. ```text {domain}/{etc}/api/shop/Filters?type=VehicleType ``` Jetzt wird ein Parameter(FilterOption) im RequestBody mitgeschickt, der die Fahrzeuge eingrenzt. ```json { "FilterOptions": [ { "Value": "501|1", "Designation": "Reifen", "Type": "MaterialType", "NumberOfResults": 6628, } ] } ``` `NumberOfResults` und `Designation` sind eigentlich überflüssig, aber tut auch nicht weh. Response: ```json [{ "Guid": "", "Designation": "Fahrzeugtyp", "Type": "VehicleType", "Options": [ { "Designation": "PKW", "NumberOfResults": 1337, "Type": "VehicleType", "Value": "ebb89e89-8d25-809e-7814-c53b686ae164501|1" }, { "Designation": "Motorrad", "NumberOfResults": 1337, "Type": "VehicleType", "Value": "ebb89e89-8d25-809e-7814-c53b686ae165" } ] }] ``` Im nächsten Schritt werden dann die übrigen Filter abgeholt, die sich als Eigenschaft auf einen Reifenartikel für PKWs beziehen. ```text {domain}/{etc}/api/shop/Filters ``` Parameter: ```json { "FilterOptions": [ { "Value": "501|1", "Designation": "Reifen", "Type": "MaterialType", "NumberOfResults": 6628 }, { "Value": "ebb89e89-8d25-809e-7814-c53b686ae164501|1", "Designation": "PKW", "Type": "VehicleType", "NumberOfResults": 1337 } ] } ``` Der Clou ist jetzt, dass ohne einen `Type` im Get-Parameter auf `/Filters`, das komplette Array aus allen möglichen Filtern geliefert wird. ```json [ { "Value": "", "Designation": "Teileart", "Type": "MaterialType", "Options": ["..."] }, { "Value": "", "Designation": "Fahrzeugtyp", "Type": "VehicleType", "Options": ["..."] }, { "Value": "", "Designation": "Durchmesser", "Type": "Diameter", "Options": ["..."] }, { "Value": "", "Designation": "Lochkreis", "Type": "HoleCircle", "Options": ["..."] }, { "Value": "", "Designation": "Lochzahl", "Type": "HoleCount", "Options": ["..."] }, { "Value": "", "Designation": "LoadIndex", "Type": "LoadIndex", "Options": ["..."] }, ...usw ] ``` usw. Mit der Auswahl kann dann `Articles` abgefragt und gefiltert werden =) Entsprechend lässt sich damit auch mit Angabe des `SearchTerm` die Ergebnisse in der Tabelle weiter filtern. tldr; Eine Spielerei: Die Abfrage von Filters mit dem Spezialtyp `ComfortSearch`, liefert direkt das initiale Setup unter Annahme, das die erste Teileart und der erste Fahrzeugtyp default ist. Der leere "Value" Wert könnte dann einfach den ausgewählten default wert wiederspiegeln ```text {domain}/{etc}/api/shop/Filters?type=ComfortSearch ``` Und das initiale Setup entspricht dann soziemlich genau dem letzten Array beim konventionellen Ablauf. Im folgenden nochmal etwas ausführlicher zusammengebastelt als oben ```json [ { "Value": "501|1", "Designation": "Teileart", "Type": "MaterialType", "Options": [ { "Designation": "Reifen", "NumberOfResults": 6628, "Type": "MaterialType", "Value": "501|1" }, { "Designation": "Handelsartikel", "NumberOfResults": 6628, "Type": "MaterialType", "Value": "501|7" }, { "Designation": "Stahlfelgen", "NumberOfResults": 6628, "Type": "MaterialType", "Value": "501|2" }, { "Designation": "Reifen", "NumberOfResults": 6628, "Type": "MaterialType", "Value": "501|3" } ] }, { "Value": "ebb89e89-8d25-809e-7814-c53b686ae164501|1", "Designation": "Fahrzeugtyp", "Type": "VehicleType", "Options": [ { "Designation": "PKW", "NumberOfResults": 1337, "Type": "VehicleType", "Value": "ebb89e89-8d25-809e-7814-c53b686ae164501|1" }, { "Designation": "Motorrad", "NumberOfResults": 1337, "Type": "VehicleType", "Value": "ebb89e89-8d25-809e-7814-c53b686ae165" } ] }, { "Value": "", "Designation": "Durchmesser", "Type": "Diameter", "Options": ["..."] }, { "Value": "", "Designation": "Lochkreis", "Type": "HoleCircle", "Options": ["..."] }, { "Value": "", "Designation": "Lochzahl", "Type": "HoleCount", "Options": ["..."] }, { "Value": "", "Designation": "LoadIndex", "Type": "LoadIndex", "Options": ["..."] } ] ```
Daniel_Hassert changed title from ComfortSearch to Komfortsuche/Filter...alles das gleiche, nämlich Kartoffelsuppe 2024-06-18 16:35:33 +02:00
Sign in to join this conversation.
No Milestone
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: PRM_Software_AG/api-documentation#9
No description provided.