Napisałem API w dwóch wersjach:
v1
- z wykorzystaniem API Platformv2
- z użyciem kontrolera
API posiada 3 endpointy:
GET /api/{version}/purchase/{purchaseId}
GET /api/{version}/purchase/{purchaseId}/details
POST /api/{version}/purchase
{version}
- v1
lub v2
oba API przyjmują te same dane, tak samo zwracają dane i zachowują sie podobnie jeżeli chodzi o efekt końcowy
Schematy dla requestów i response można sprawdzić pod adresem: http://localhost:8080/api/docs?ui=re_doc
Wykorzystane narzędzia:
PhpStorm
, Docker
, Postman
, PHP CS Fixer
, PHPStan
, PHPUnit
, API Platform
Należy utworzyć obraz z pliku docker-compose.yaml
Instalacja
composer install
Tworzenie bazy danych
php bin/console doctrine:database:create
php bin/console doctrine:database:create --env=test
php bin/console doctrine:migrations:migrate
Ładowanie testowych danych
php bin/console doctrine:fixtures:load
Tworzy nowe zamówienie
header
Content-type: application/json
Authorization: Bearer test_apiToken
body
{
"name": "string",
"email": "user@example.com",
"items": [
{
"productId": 1,
"quantity": 1
}
]
}
Content-type: application/json
200
{
"id": 0,
"items": [
{
"productId": 1,
"quantity": 1,
"unitPrice": "1.00"
}
]
}
Content-type: application/json
400
{
"error": "Bad request"
}
Odpowiedź zwracana w przypadku błędnego zapytania, może to być np. ujemna wartość dla quantity
Content-type: application/json
401
{
"error": "Invalid Api Token"
// "error": "Full authentication is required to access this resource."
}
Odpowiedź zwracana w przypadku podania nieprawidłowego ApiTokenu bądź gdy nie podano go wcale
Content-type: application/json
415
{
"error": "Unsupported media type"
}
Odpowiedź zwracana w przypadku użycia innej wartości niż application/json
dla parametru Content-type
Content-type: application/json
422
{
"error": "Failed to create purchase"
// "error": "Not found product"
// "error": "Not enough product quantity available"
}
Odpowiedź zwracana w przypadku podania błędnego id produktu, gdy wartość quantity w encji produktu jest niewystarczająca, w przypadku problemów ze spójnością danych w bazie.
Zwraca informacje o zamówieniu
Content-type: application/json
200
{
"id": 0,
"items": [
{
"productId": 1,
"quantity": 1,
"unitPrice": "1.00"
}
]
}
Content-type: application/json
404
{
"error": "Not found purchase"
}
Zwraca informacje o zamówieniu wraz z informacją o cenie całkowitej, VAT i sumie przedmiotów
Content-type: application/json
200
{
"id": 0,
"items": [
{
"productId": 1,
"quantity": 2,
"unitPrice": "1.00"
}
],
"total": {
"price": "2.00",
"vat": "0.46",
"quantity": 2
}
}
Content-type: application/json
404
{
"error": "Not found purchase"
}