- Added main router in src/index.js to register endpoints. - Implemented GET /mayo-api/products to fetch product list with pagination and filters. - Implemented GET /mayo-api/dictionaries to fetch various dictionaries for frontend use. - Created separate files for routes, repositories, serializers, and utilities to maintain clean architecture. - Added utility functions for async handling, pagination, and order search parsing. - Introduced serializers for products and dictionaries to format data for frontend consumption. - Established repository functions for database queries related to products and dictionaries. - Updated package.json to include license information. - Created documentation for the API extension detailing current state and future implementation plans.
8.6 KiB
Directus Mayo API Extension
Data aktualizacji: 2026-05-20
Cel
Ten dokument opisuje aktualny stan budowy custom API w Directus dla frontendu Duck Prod Manager.
Extension znajduje sie w:
directus/extensions/directus-extension-mayo-api
Endpoint Directus extension ma miec identyfikator:
mayo-api
Dlatego publiczne sciezki beda dostepne pod prefiksem:
/mayo-api
Aktualny stan
Katalog extension jest przygotowany i zawiera scaffold Directus endpoint extension.
Istniejace pliki:
directus/extensions/directus-extension-mayo-api/README.md
directus/extensions/directus-extension-mayo-api/package.json
directus/extensions/directus-extension-mayo-api/src/index.js
directus/extensions/directus-extension-mayo-api/old/index.js.old
directus/extensions/directus-extension-mayo-api/old/old_index.js.old
src/index.js rejestruje obecnie pierwsze dwa endpointy:
GET /mayo-api/productsGET /mayo-api/dictionaries
Stare pliki w old/ sa tylko materialem referencyjnym. Nie traktujemy ich jako aktywnej implementacji.
Zalozona architektura
Nie umieszczamy wszystkich endpointow w jednym pliku.
src/index.js ma pelnic role glownego routera:
- eksportuje Directus endpoint extension,
- ustawia
id: 'mayo-api', - importuje pliki endpointow,
- rejestruje endpointy,
- nie zawiera zapytan SQL ani logiki biznesowej.
Kazdy endpoint ma miec osobny plik w katalogu routes/.
Logika wspolna powinna byc rozbita na:
repositories/- zapytania do bazy Directus,serializers/- mapowanie danych z DB na format frontendu,utils/- drobne helpery techniczne.
Proponowana struktura plikow
directus/extensions/directus-extension-mayo-api/src/
index.js
routes/
products.get.js
dictionaries.get.js
product-timeline.get.js # do zrobienia
product-timeline-event.post.js # do zrobienia
product-specification.get.js # do zrobienia
product-specification-refresh.post.js # do zrobienia
repositories/
products.repository.js
dictionaries.repository.js
timeline.repository.js # do zrobienia
specification.repository.js # do zrobienia
serializers/
product.serializer.js
timeline.serializer.js
specification.serializer.js # do zrobienia
dictionaries.serializer.js
utils/
async-handler.js
http-error.js # do zrobienia, jesli bedzie potrzebny
pagination.js
order-search.js
Endpointy wymagane przez frontend
1. Lista produktow
GET /mayo-api/products
Status: zaimplementowany w pierwszym etapie.
Parametry query:
{
limit,
offset,
search,
orderSearch,
model,
client,
finish,
productionList,
year,
}
orderSearch przychodzi z frontendu jako JSON string.
Oczekiwana odpowiedz:
{
items: [],
pageInfo: {
limit,
offset,
hasMore,
total,
},
}
Element items powinien miec ksztalt produktu uzywany przez frontend:
{
id,
orderId,
orderNumber,
orderYear,
orderIndex,
model,
client,
finish,
productionLists,
timelinePreview: {
body: [],
neck: [],
},
}
2. Slowniki
GET /mayo-api/dictionaries
Status: zaimplementowany w pierwszym etapie.
Oczekiwana odpowiedz:
{
models: [],
clients: [],
finishes: [],
productionLists: [],
operations: [],
colors: [],
}
3. Timeline produktu
GET /mayo-api/products/:id/timeline
Status: do zrobienia.
Oczekiwana odpowiedz:
{
productId,
events: [],
timelinePreview: {
body: [],
neck: [],
},
}
4. Dodanie eventu timeline
POST /mayo-api/products/:id/timeline/events
Status: do zrobienia.
Oczekiwana odpowiedz:
{
event: {},
timelinePreview: {
body: [],
neck: [],
},
}
5. Specyfikacja produktu
GET /mayo-api/products/:id/specification
Status: do zrobienia.
Preferowana odpowiedz:
{
productId,
orderId,
sourceUrl,
lastFetchedAt,
sections: [],
diff: [],
}
Frontend akceptuje tez ksztalt:
{
productId,
orderId,
sourceUrl,
lastFetchedAt,
specification: {
sections: [],
},
diff: [],
}
6. Odswiezenie specyfikacji produktu
POST /mayo-api/products/:id/specification/refresh
Status: do zrobienia.
Odpowiedz powinna miec taki sam ksztalt jak GET /specification, ale z aktualnym lastFetchedAt i ewentualnym diff.
Kolejnosc implementacji
Rekomendowana kolejnosc:
GET /mayo-api/productsGET /mayo-api/dictionariesGET /mayo-api/products/:id/timelinePOST /mayo-api/products/:id/timeline/eventsGET /mayo-api/products/:id/specificationPOST /mayo-api/products/:id/specification/refresh
Pierwsze dwa endpointy odblokowuja glowny ekran frontendu.
Co zostalo zrobione
- Przeanalizowano
notes/api_services.md. - Przeanalizowano frontendowe implementacje HTTP w
frontend/src/services/*HttpApi.js. - Przeanalizowano store Pinia, zeby ustalic realne parametry i ksztalt danych.
- Ustalono liste 6 endpointow wymaganych przez obecny frontend.
- Ustalono, ze
index.jsbedzie tylko routerem/rejestratorem endpointow. - Ustalono docelowa hierarchie plikow extension.
- Utworzono ten dokument jako aktualny opis stanu prac nad Directus extension.
- Utworzono katalogi
routes/,repositories/,serializers/,utils/. - Wypelniono
src/index.jsrejestracja pierwszych endpointow. - Zaimplementowano
GET /mayo-api/products. - Zaimplementowano
GET /mayo-api/dictionaries. - Zweryfikowano nazwy kolekcji na podstawie
snapshot(6).jsonidb_schema.dbml. - Uruchomiono
npm run buildw katalogu extension. Build zakonczyl sie poprawnie. - Dodano
README.mddla extension. - Dodano
license: "UNLICENSED"wpackage.json, zeby extension bylo oznaczone jako pakiet wewnetrzny. - Uruchomiono
npm run validatew katalogu extension. Walidacja zakonczyla sie poprawnie. - Dodano
mayo-api.httpz requestami REST Client do manualnego testowania endpointow. - Przebudowano
db_schema.dbmlpod nowa baze Directus: poprawione nazwy, tabele slownikowe zamiast enumow. - Dostosowano aktywne repository extension do nowego schematu.
- Uwzgledniono relacje
mayo_product_production_lists.order_item_id -> mayo_order_items.id.
Decyzje implementacyjne
- Aktywna implementacja ignoruje katalog
directus/extensions/directus-extension-mayo-api/old. - Pierwsza implementacja byla oparta o stary schemat Directus, ktory zawieral literowki:
mayo_order_porductsmayo_lisst_productsmayo_color
db_schema.dbmlzostal przebudowany jako propozycja nowego schematu:- enumy zostaly zamienione na tabele slownikowe,
- literowki zostaly poprawione,
- nazwy kolekcji zostaly doprecyzowane pod Directus.
- Nowa baza Directus zostala utworzona zgodnie z
db_schema.dbml, z jedna celowa zmiana:mayo_product_production_lists.order_item_idwskazuje namayo_order_items.id.
- Extension zostal dostosowany do nowych nazw kolekcji i relacji
order_item_id. GET /productsbudujetimelinePreviewzmayo_production_events,mayo_product_parts,mayo_part_typesimayo_production_operations.GET /productsfiltruje pomodel,client,year,productionList,finishiorderSearch.GET /dictionariespobiera finish z tabeli slownikowejmayo_finishes.- Kod operacji pochodzi z
mayo_production_operations.code. - Uruchomiono
npm run buildpo dostosowaniu do nowego schematu. Build zakonczyl sie poprawnie. - Uruchomiono
npm run validatepo dostosowaniu do nowego schematu. Walidacja zakonczyla sie poprawnie.
Proponowane nowe nazwy kolekcji
Stare nazwy i ich proponowane odpowiedniki:
mayo_color -> mayo_colors
mayo_lisst_products -> mayo_product_production_lists
mayo_lists -> mayo_production_lists
mayo_models -> mayo_product_models
mayo_operations -> mayo_production_operations
mayo_order_porducts -> mayo_order_items
mayo_part_events -> mayo_production_events
mayo_parts -> mayo_product_parts
Enumy zostaly zastapione tabelami:
mayo_models_neck_construction -> mayo_neck_constructions
mayo_parts_part_type -> mayo_part_types
mayo_parts_finish -> mayo_finishes
Do zrobienia
- Zaimplementowac
GET /mayo-api/products/:id/timeline. - Zaimplementowac
POST /mayo-api/products/:id/timeline/events. - Zaimplementowac
GET /mayo-api/products/:id/specification. - Zaimplementowac
POST /mayo-api/products/:id/specification/refresh. - Sprawdzic na realnych danych, czy
finishna karcie produktu ma byc pojedynczym enumem, czy agregatem ztop_finishiback_finish. - Przetestowac frontend z
VITE_USE_MOCK_API=false.