Projekt składa się z kilku części takich jak testy, powtórki, osiągnięcia, gry czasowe, quizy itp. Podczas pracy nad projektem zrozumiałem piękno i możliwości backendu i zdecydowałem, że warto się go trzymać.
Jestem odpowiedzialny za rozwój backendu, w tym kluczowe zadania, takie jak między innymi Migrations, Models, API, Seeders, Listeners, Scheduler oraz połączenie ze storage'm.
Sytuacja zmusiła mnie również do praktykowania frontendu, dzięki czemu zagłębiłem się w VueJS i poznałem również ten framework - Słownik oraz Dashboard pośród wielu innych wyszły spod mojej ręki.
Do poprawnego działania aplikacji wymagane są:
- PHP w wersji ^8.0
- Composer
- Baza danych np. MySQL, PostgreSQL, SQLite
Po pobraniu projektu, musimy dostosować lokalny plik .env, w którym przetrzymywana jest konfiguracja naszego serwera, w tym informacje o bazie danych, z jakiej korzystamy.
Po zainstalowaniu wszystkich koniecznych do działania komponentów, oraz poprawnym skonfigurowaniu pliku .env, możemy przejść testowania funkcjonalności.
Zaczynamy od użycia komend:
- php artisan migrate - komenda używana jest w celu stworzenia bazy danych.
- php artisan db:seed - komenda używana jest w celu wstrzyknięcia do bazy danych, rekordów wymaganych do popranego działania serwera - słowa, kategorie itp.
- php artisan passport:install - komenda używana jest w celu służy instalacji i konfiguracji infrastruktury uwierzytelniania OAuth2
W celu uproszczenia nawigacji, projekt podzielony został na 3 moduły takie jak - Auth, Words oraz System.
W module Auth przetrzymywane są wszystkie pliki odnoszące się do użytkowników oraz ich danych osobowych.
Następny moduł to Word, przetrzymuje on pliki związane ze słowami - kategorie, testy, ćwieczenia, a także rodzaje ćwiczen.
Ostatnim z modułów jest System, w którym dostępne są logi, statystyki użytkowników, informacje o aktualiazjach na serwerze, rezultaty gier czasowych, osiągnięcia.
Wyświetl zapytania dla modułu Word
| Rodzaj | Adres | Wymagane pola | Wymagane ranga | Opis |
|---|---|---|---|---|
| GET | api/word/dict | - | user | Zapytanie służy do pobierania listy kategorii oraz ilości słów dla każdej z nich |
| POST | api/word/dict | category | user | Zapytanie służy do pobrania listy słów dla danej kategorii |
| GET | api/word/word/{nr} | - | user | Zapytanie służy do pobrania informacji o konkretnym słowie. Dostajemy się do niego poprzez podanie w miejscu {nr} indeksu słowa z bazy danych |
| POST | api/word/word | category_id, word_en, word_pl, difficulty | admin | Zapytanie służy do dodania nowego słowa do bazy danych |
| PATCH | api/word/word/{nr} | word_en, word_pl, difficulty | admin | Zapytanie służy do zaktualizowania istniejącego już słowa w bazie danych. {nr} - indeks słowa w bazie danych |
| DELETE | api/word/word/{nr} | - | admin | Zapytanie służy do usuwania istniejącego już słowa w bazie danych. {nr} - indeks słowa w bazie danych |
| GET | api/word/word/wordoftheday | - | user | Zapytanie służy do zwracania wszystkich informacji dotyczących słowa dnia |
| GET | api/word/repetitions/favourite | - | user | Zapytanie służy do zwracania wszystkich ulubionych słów użytkownika wraz z ich szczegółami |
| POST | api/word/word/{nr}/addtofavourite | - | user | Zapytanie służy do dodania słówka przez użytkownika do ulubionych. {nr} - indeks słowa |
| POST | api/word/word/{nr}/revokefromfavourite | - | user | Zapytanie służy do usuwania słówka przez użytkownika z jego ulubionych słów. {nr} - indeks słowa |
| POST | api/word/word/{nr}/addnote | notes | user | Zapytanie służy do przypisywania notatek użytkownika do słówka. {nr} - indeks słowa |
| GET | api/word/repetitions/review | - | user | Zapytanie służy do zwracania wszystkich słów, które użytkownik chce powtarzać (powtórek) |
| POST | api/word/word/{nr}/addtoreview | - | user | Zapytanie służy do dodania słówka przez użytkownika do powtórek. {nr} - indeks słowa |
| POST | api/word/word/{nr}/revokefromreview | - | user | Zapytanie służy do usuwania słówka przez użytkownika z jego powtórek. {nr} - indeks słowa |
| POST | api/word/repetitions/review | id | user | Zapytanie służy do zmiany statusu powtórki na wykonaną |
| GET | api/word/repetitions/category | category | user | Zapytanie zwraca listę powtórek dla konkretnie wskazanej kategorii |
| POST | api/word/repetitions/refresh | category | user | Zapytanie zmienia status wykonania powtórki, ładując użytkownikowi do ponownego rozwiązania |
| GET | api/word/repetitions/categories_list | - | user | Zapytanie zwraca ilość niezrobionych oraz ilość wszystkich dodanych do tej pory powtórek dla każdej z kategorii |
| GET | api/word/category | - | user | Zapytanie zwraca wszystkie kategorie oraz informacje o nich |
| GET | api/word/category/{nr} | - | user | Zapytanie zwraca konkretną kategorię oraz informacje o niej |
| POST | api/word/category | name | admin | Zapytanie tworzy nową kategorię |
| PATCH | api/word/category/{nr} | name | admin | Zapytanie aktualizuje wskazana kategorię {nr} - to id kategorii |
| DELETE | api/word/category/{nr} | - | admin | Zapytanie usuwa wskazana kategorię {nr} - to id kategorii |
| GET | api/word/test | - | user | Zapytanie pobiera wszystkie testy użytkownika - ich statusy, date wykonania, kategorię oraz trudność |
| GET | api/word/test/{nr_testu} | - | user | Zapytanie pobiera wszystkie zadania dla testu wskazanego przez użytkownika {nr_testu} - to numer testu z bazy danych [1-63] |
| GET | api/word/test/{nr_testu}/{nr_zadania} | - | user | Zapytanie pobiera wszystkie szczegóły dla konkretnego zadania, w wybranym przez użytkownika teście {nr_testu} - to numer testu z bazy danych [1-63] {nr_zadania} - numer zadania z bazy danych [1-11] |
| POST | api/word/test/{nr_testu}/{nr_zadania} | answer_fill_sentence | user | Zapytanie wysyła odpowiedź na zadanie typu "uzupełnij lukę" {nr_testu} - to numer testu z bazy danych [1-63] {nr_zadania} - numer zadania z bazy danych [1-11] |
| POST | api/word/test/{nr_testu}/{nr_zadania} | pairs | user | Zapytanie wysyła odpowiedź na zadanie typu "połącz pary" {nr_testu} - to numer testu z bazy danych [1-63] {nr_zadania} - numer zadania z bazy danych [1-11] |
| POST | api/word/test/{nr_testu}/{nr_zadania} | answer | user | Zapytanie wysyła odpowiedź na zadanie typu "ułóż układankę" {nr_testu} - to numer testu z bazy danych [1-63] {nr_zadania} - numer zadania z bazy danych [1-11] |
Auth
| Rodzaj | Adres | Wymagane pola | Wymagane ranga | Opis |
|---|---|---|---|---|
| POST | api/auth/login | email, password | - | Zapytanie służy do zalogowania użytkownika |
| POST | api/auth/register | email, password, dane użytkownika | - | Zapytanie służy do rejestracji nowego użytkownika |
| GET | api/auth/logout | - | user | Zapytanie służy do wylogowania użytkownika |
| GET | api/auth/user/data/dashboard | - | user | Zapytanie służy do zwracania wszystkich informacji wyświetlanych w dashboardzie |
| GET | api/auth/user/data/me | - | user | Zapytanie służy do zwracania informacji o użytkowniku |
| PATCH | api/auth/user/data/change_data | name, surname, birth_date | user | Zapytanie służy do zmiany danych użytkownika |
| POST | api/auth/user/data/change_avatar | avatar | user | Zapytanie służy do zmiany avataru użytkownika |
| GET | api/auth/user/role/me | - | admin | Zapytanie służy do otrzymania informacji o roli jaką posiada użytkownik |
| GET | api/auth/user/role/{user} | - | admin | Zapytanie służy do sprawdzenia roli innego użytkownika [user] - id użytkownika |
| POST | api/auth/user/role/{user} | role | admin | Zapytanie służy do zmiany roli innego użytkownika [user] - id użytkownika |
| GET | api/auth/ranking/money | - | user | Zapytanie służy do zwrócenia rankingu użytkowników względem posiadanych monet |
| GET | api/auth/ranking/lvl | - | user | Zapytanie służy do zwrócenia rankingu użytkowników względem posiadanego poziomu |
| GET | api/auth/ranking/15s | - | user | Zapytanie służy do zwrócenia rankingu użytkowników względem zdobytych punktów w grze 15s |
| GET | api/auth/ranking/30s | - | user | Zapytanie służy do zwrócenia rankingu użytkowników względem zdobytych punktów w grze 30s |
| GET | api/auth/ranking/60s | - | user | Zapytanie służy do zwrócenia rankingu użytkowników względem zdobytych punktów w grze 60s |
| GET | api/auth/ranking/all | - | user | Zapytanie służy do zwrócenia rankingu użytkowników posiadającego wszystkie powyższe |
System
| Rodzaj | Adres | Wymagane pola | Wymagane ranga | Opis |
|---|---|---|---|---|
| GET | api/system/statistics | - | user | Zapytanie służy do zwrócenia podstawowych statystyk użytkownika dotyczących jego osiągnięć |
| GET | api/system/achievement/me | - | user | Zapytanie służy do zwrócenia osiągnięć, które użytkownik zdobył |
| GET | api/system/achievement/ | - | user | Zapytanie służy do zwrócenia wszystkich dostępnych osiągnięć |
| GET | api/system/achievement/{achievement} | - | user | Zapytanie służy do zwrócenia wybranego osiągnięcia [achievement] - id achievementu |
| POST | api/system/achievement/ | name, event_type, value, money | admin | Zapytanie służy do utworzenia nowego osiągnięcia |
| PATCH | api/system/achievement/{achievement} | name, event_type, value, money | admin | Zapytanie służy do aktualizacji jednego z osiągnięć [achievement] - id achievementu |
| DELETE | api/system/achievement/{achievement} | - | admin | Zapytanie służy do usunięcia jednego z osiągnięć [achievement] - id achievementu |
| GET | api/system/daily_user_life/ | - | user | Zapytanie służy do zwracania informacji o życiach użytkownika |
| PATCH | api/system/daily_user_life/minus | - | user | Zapytanie służy do odjęcia życia użytkownikowi po pomyłce w teście |
| PATCH | api/system/daily_user_life/plus | word_pl, word_en, langauge | user | Zapytanie służy do dodania serca wzamian za poprawne rozwiązanie zagadki |
| GET | api/system/streak/ | - | user | Zapytanie służy do zwracania informacji o wszystkich streakach użytkownika |
| GET | api/system/streak/latest | - | user | Zapytanie służy do zwracania informacji o aktualnym streaku użytkownika |
| GET | api/system/streak/longest | - | user | Zapytanie służy do zwracania informacji o najdłuższym streaku użytkownika |
| POST | api/system/games/ | type | user | Zapytanie służy do rozpoczęcia gry czasowej o wybranym typie |
| POST | api/system/games/send | type, word | user | Zapytanie służy do wysłania odpowiedzi na kolejne zadanie w grze czasowej |
| POST | api/system/games/history | type | user | Zapytanie służy do zwrócenia historii gier użytkownika dla danego typu |
Na serwerze wyróżniamy aktualnie dwa takie zdarzenia czasowe, jednak z czasem może ich przybyć więcej.
- Darmowe serduszko - Co 2 godziny każdy z użytkowników, których liczba żyć nie przekracza 10, otrzymuje serduszko. Licznik czasu, odmierzający minuty do wykonania zdarzenia, umieszczony jest na dashboardzie, zatem każdy może sprawdzić, za ile może wykonać kolejną pomyłkę.
- Zmiana słówka dnia - Codziennie o północy zmienia się słówko dnia i na dashboardzie ukazuje się nowo wybrany kafelek, dostępny przez następne, równe 24godziny.
Aby przetestować scheduler możemy zastosować niżej wymienione komendy:
- php artisan schedule:list - pokazuje listę wszystkich zadań oraz czas, za jaki planowane jest ich użycie.
- php artisan schedule:test - pozwala przetestować wybrane przez nas zadanie. Wybieramy [0], aby wybrać nowe słowo dnia, lub [1] aby doładować każdemu z użytkowników 1 serduszko.
- php artisan schedule:work - uruchomienie tej komendy powoduje wykonywanie zadań w określonym przez nas czasie.
Przy testowaniu wyboru nowego słowa dnia, możemy napotkać się z problemem, że nie zostało ono zmienione. Należy wówczas zwolnić pamięć Cache naszego serwera, robimy to przy użyciu komendy:
- php artisan Cache:clear
Pod okoliczność zmiany słowa dnia, stworzona zpstała autorska komenda, za pomocą której możemy ręcznie zmienić słowo dnia z ominięciem schedulera:
- php artisan pick