-
Notifications
You must be signed in to change notification settings - Fork 2
feat: standardy api eventownik #89
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
+150
−0
Merged
Changes from all commits
Commits
Show all changes
8 commits
Select commit
Hold shift + click to select a range
46a6b07
feat: standardy api eventownik
ibtyog eb4821c
fix: typos
ibtyog 83aa818
feat:add chained parameters example
ibtyog 5a73867
feat: minor content changes
ibtyog b3de6d3
Merge branch 'main' into feat/standaryzacja-eventownik
GOLDER303 1cd0b56
docs: change auth section
ibtyog e955832
docs: change auth
ibtyog 7f38f77
Merge branch 'main' into feat/standaryzacja-eventownik
ibtyog File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
150 changes: 150 additions & 0 deletions
150
src/content/docs/projects/Eventownik/Standaryzacja API.mdx
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,150 @@ | ||
| --- | ||
| title: Standaryzacja API | ||
| description: Standardy wykorzystane w Eventownik V3 | ||
| --- | ||
|
|
||
| ## Nazewnictwo endpointów | ||
|
|
||
| - zakładając przypadek, w którym domena nie posiada prefixu ‘api', powinien być to pierwszy człon endpointu, | ||
| - kolejny człon powinien zawierać informację dotyczą wersjonowania, przykładowo ‘v1', ‘v2', | ||
| - następny człon powinien zawierać informację o dostępności, tj. ‘external' dla dostępu publicznego lub ‘internal' dla dostępu wewnętrznego, | ||
| - następna powinna być nazwa zasobu, w liczbie mnogiej, np. ‘users', ‘events', | ||
| - kolejnym członem powinna być wywoływana funkcjonalość, np. ‘register', ‘login', | ||
| - indeksowanie zasobów powinno się odbywać po jednym, ustalonym przez członków projektu kluczu | ||
|
|
||
| ### Przykładowy routing: | ||
|
|
||
| - api.eventownik.pl/v1/internal/events/:id | ||
| - api.eventownik.pl/v1/external/events/:id | ||
|
|
||
| ### Lista endpointów projektu Eventownika: | ||
|
|
||
| [Eventownik Endpoints](https://api.eventownik.solvro.pl/docs) | ||
|
|
||
| ## Ogólny format odpowiedzi | ||
|
|
||
| - formatem odpowiedzi powinien być obiekt umieszczony w obiekcie data/data[], | ||
| - wszystkie atrybuty paginacji oraz całkowita liczba rekordów powinna znajdować się w obiekcie metadata, | ||
| - metody post/put powinny zwracać zaktualizowany obiekt, | ||
| - metoda delete powinna zwracać no content, | ||
| - w przypadku, gdy usuwany obiekt nie istnieje powinien zostać wywołany NotFoundError | ||
| - odpowiedzi nie powinny zawierać zbędnych informacji, typu : \{"message" : "X … successfully."\}, czy też zduplikowany status code | ||
|
|
||
| Przykładowy format odpowiedzi: | ||
|
|
||
| ```json | ||
| data: [ | ||
| { | ||
| "id": 1, | ||
| "email": "[email protected]", | ||
| "created_at": "2025-08-07T12:34:56.000" | ||
| }, | ||
| { | ||
| "id": 2, | ||
| "email": "[email protected]", | ||
| "created_at": "2025-08-07T12:40:00.000" | ||
| } | ||
| ], | ||
| metadata: { | ||
| "page": 0, | ||
| "per_page" : 10, | ||
| "total" : 2 | ||
| } | ||
| ``` | ||
|
|
||
| ## Ogólny format błędów | ||
|
|
||
| - do walidacji danych jak i zwracania odpowiedzi błędu, wykorzystujemy domyślną dla NestJS paczkę class-validator, | ||
| - błędy powinny być oznaczone odpowiednim status codem | ||
|
|
||
| ## Format parametrów metody 'GET' | ||
|
|
||
| ### Paginacja | ||
|
|
||
| - ?page=<number> - numer strony (domyślnie 0) | ||
| - ?perPage=<number> - liczba obiektów na stronę (opcjonalne, w przypadku gdy wartość nie została podana, wykorzystywana jest domyślna wartość 10 elementów na stronę) | ||
|
|
||
| ### Sortowanie | ||
|
|
||
| - ?sort[<column>]=asc/desc, (domyślnie ascending) | ||
|
|
||
| ### Filtrowanie | ||
|
|
||
| - filter[<column>]=<value> | ||
| - filter[<column>][gt/gte/lt/lte]=<value> (typu numerycznego/daty) | ||
| - filter[<column>][not/like]=<value> | ||
| - filter[<column1>]=<value1>>...&filter[<columnN>]=<valueN> - dla wielu filtrów | ||
| - filter[<column1>]=<value1>,<value2> - dla filtrowania typu IN ( z możliwością podania kilku kolumn, | ||
| w takim przypadku warunek filtrowania jest spełniony, gdy istnieje dowolna z podanych wartości w dowolnej z podanych kolumn) | ||
|
|
||
| ### Relacje | ||
|
|
||
| - ?join=<relation_name> | ||
| - ?join=<relation_name1>,…,<relation_nameN> - dla wielu relacji | ||
|
|
||
| ### Select | ||
|
|
||
| - ?select=<column> | ||
| - ?select=<column1>,…,<columnN> | ||
ibtyog marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
|
||
| Domyślnie operacja select bez podania nazw kolumn zwróci wszystkie kolumny z danej tabeli. Alternatywnie, istnieje opcja wykluczenia kolumn. | ||
|
|
||
| Przykładowe użycie wykluczenia: | ||
|
|
||
| - ?select=-<column1>,…,-<columnN> | ||
|
|
||
| ### Przykład wykorzystania parametrów | ||
|
|
||
| Endpoint: `api.eventownik.pl/v1/internal/events/:eventId/participants?page=1&perPage=20&sort[name]=asc&filter[name][like]=Jakub` | ||
|
|
||
| ## Autoryzacja | ||
|
|
||
| - w późniejszej fazie projektu, planowana jest implementacja Solvro Auth | ||
|
|
||
| ## Pozostałe nagłówki | ||
|
|
||
| 1. accept: application/json, | ||
| 2. request-id w celu implementacji tracing'u | ||
|
|
||
| ## Serializacja i formatowanie danych | ||
|
|
||
| 1. Daty powinny być zwracane w standardzie ISO 8601 bez stref czasowych, | ||
|
|
||
| przykład daty: 2012-01-01T00:00:00, | ||
|
|
||
| 2. Zasoby oraz jego atrybuty powinny być zwracane w snake_case'ie | ||
|
|
||
| ## Dokumentacja | ||
|
|
||
| Do tworzenia dokumentacji API wykorzystujemy Swaggera. | ||
ibtyog marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| [Dokumentacja Swaggera dla NestJS](https://docs.nestjs.com/openapi/introduction) | ||
|
|
||
| 1. Grupowanie endpointów za pomocą ‘@ApiTags' powinno odzwierciedlać faktyczny routing, | ||
| 2. Dla skomplikowanych/niejednoznacznych odpowiedzi zaleca się dodanie opisu (descriptions), | ||
| 3. Dokumentacja powinna obejmować wszystkie możliwe odpowiedzi (dla powtarzalnych odpowiedzi można zastosować dekorator dla całego kontrolera), | ||
| 4. Za pomocą CLI, jesteśmy w stanie automatycznie generować annotacje dla modeli/DTO, domyślnie generowane są tylko dla konkretnych plików, tj. ‘_.dto.ts', ‘_.entity.ts', | ||
| 5. Dla projektu powinno zostać wybrane estetyczne oraz przejrzyste UI (lub stworzone przez zespół) | ||
|
|
||
| ## Testy | ||
|
|
||
| Do przeprowadzania testów korzystamy z domyślnych dla NestJS pakietów: Jest oraz Supertest. | ||
|
|
||
| 1. Przede wszystkim, należy skupić się, aby testy powstawały równolegle z rozwojem aplikacji, | ||
| 2. Testy powinny obejmować, zarówno "scenariusze" pomyślne/zgodne z założeniem działania aplikacji, jak i te zakończone niepowodzeniem, w celu sprawdzenia obsługi błędów, | ||
| 3. Testy powinny sprawdzać istotne funkcjonalności aplikacji - nie należy się kierować wysokim pokryciem kodu, | ||
| 4. Podział testów: | ||
| a. jednostkowe - jedynie dla złożonych funkcjonalności, | ||
| b. integracyjne - powinny stanowić większość testów, | ||
| c. e2e - tworzone przez zespół frontendowy | ||
|
|
||
| ## Obsługa plików | ||
|
|
||
| Do obsługi plików, wykorzystujemy domyślny dla NestJS pakiet ‘multer', obsługuje on dane przesyłane w formacie ‘multipart/form-data'. | ||
ibtyog marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
|
||
| Zalecane jest również wykorzystanie walidacji metadanych pliku podczas przesyłania, przykładowo dla: | ||
|
|
||
| - liczby przesyłanych plików, | ||
| - typu przesyłanego pliku (domyślnie dla NestJS jest to mimetype), | ||
| - maksymalnego rozmiaru pliku | ||
|
|
||
| Natomiast same pliki będą przechowywane na hostowanym przez nas systemie S3 (MinIO). | ||
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.