Skip to content

vmariiechko/internship-assignment

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

15 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Dokumentacja do rozwiązania zadania

python django JWT license

Spis Treści


Treść zadania

Zadaniem jest zaprojektowanie API i wykonanie aplikacji do zapisywania, zwracania zapisanych oraz edycji krótkich tekstów (do 160 znaków).


Podjęte decyzje

  • Wybrany framework: Django Rest Framework (dalej DRF)
  • Zapisywanie wiadomości odbywa się w bazie danych SQLite (dalej BD) za pomocą Django ORM
  • Odczytywanie wiadomości odbywa się za pomocą tzw. serializatorów, które konwertują dane z BD do Python'owych typów i odwrotnie
  • Licznik wyświetleń wiadomości jest zaimplementowany jako atrybut w BD.

Opis API

Uwaga: wszystkie punkty końcowe są wyświetlone w skróconym wariancie, w razie ręcznego wpisana linku, jako przedrostek musi być wiadomosci-api.herokuapp.com
Aby się nie pomylić ze wpisywaniem linku, zachęcam do korzystania z hiperłączy poniżej, które domyślnie prowadzą na zapytanie GET w postaci graficznego interfejsu, który udostępnia DRF.

Struktura opisu API

  • Na początku jest podana tablica z ogólnym opisem URL.
  • Następnie jest opis każdego widoku.

Tablica wszystkich URL

Punkt końcowy GET POST PUT DELETE
/api/ Dostać punkty końcowe N/A N/A N/A
/api/smses/ Dostać wszystkie wiadomości Utworzyć nową wiadomość N/A N/A
/api/smses/<id>/ Znaleźć wiadomość po ID N/A Nadpisać treść wiadomości Skasować wiadomość
/api/token/ N/A Uwierzytelnianie JWT N/A N/A
/api/token/refresh/ N/A Dostać nowy token dostępu N/A N/A
/api-auth/login N/A Uwierzytelnianie sesji N/A N/A

Uwierzytelnianie

Do przetestowania aplikacji podaję do dyspozycji dwa konta:
username: Jan password: nowakhaslo
username: Zofia password: nowakhaslo

Zaimplementowane rodzaje uwierzytelniania:

  1. Oparte na sesji:
    • Dodane jako gotowe rozwiązanie w DRF
    • Pozwala na szybkie i wygodne logowanie się w interfejsie (zachęcana metoda do skorzystania z aplikacji)
    • URL logowania: /api-auth/login

  1. Oparte na tokenach (JWT)
    • Dodane jako dodatkowa funkcjonalność, ponieważ dodanie uwierzytelniania przez sesję nie zajęło dużego wysiłku :)

    • Dla logowania się, aby dostać token dostępu i odświeżania należy wysłać zapytanie POST na /api/token/ z JSON-em:

      {
          "username": "*username*",
          "password": "*password*"
      }

      zatem jako odpowiedź dostaniemy parę tokenów (kluczy):

      {
          "refresh": "*długi napis, token odświeżania*",
          "access": "*długi napis, token dostępu*"
      }

      jwt-token1 jwt-token2

      Należy zachować te klucze, zatem przy kolejnym zapytaniu, które wymaga uwierzytelniania, koniecznie trzeba umieścić token dostępu w nagłówku HTTP jako:

      Authorization: "Bearer <token dostępu>"
      

      Token dostępu ma dość krótki czas istnienia, zatem, aby dostać nowy token dostępu, należy wykorzystać token odświeżania, który ma znacznie dłuższy czas życia.

    • Dla ponowienia tokena dostępu należy wysłać zapytanie POST na /api/token/refresh/ z JSON-em:

      {
          "refresh": "*długi napis, otrzymany wcześniej token odświeżania*"
      }

      w wyniku dostaniemy nowy token dostępu w postaci tego samego JSON-a:

      {
          "access": "*długi napis, nowy token dostępu*"
      }

      refresh1 refresh2

    • W wypadku wygaśnięcia tokena odświeżania należy ponownie zalogować się tak jak opisane powyżej, aby dostać nową parę tokenów.


Widok wiadomości

Są dwa widoki dla wiadomości:

  1. Widok dla przeglądu wszystkich wiadomości, zaimplementowano jako dodatkowa funkcjonalność dla kompletności rozwiązania. Należy wysłać zapytanie GET na /api/smses/
    Odpowiedzią będzie JSON ze wszystkimi wiadomościami wraz z ich ID i autorem:
[
    {
        "id": 1,
        "author": "Vadym",
        "message": "Nowa wiadomość",
        "views_count": 1
    },
    "..."
]

  1. Widok dla przeglądu specyficznej wiadomości. Należy wysłać zapytanie GET na /api/smses/<id>/, gdzie '<id>' jest wartością ID dla specyficznej wiadomości.
    Odpowiedzią będzie JSON z konkretną wiadomością razem z licznikiem wyświetleń:
{
    "message": "Nowa wiadomość",
    "views_count": 2
}


Widok tworzenia wiadomości

Aby utworzyć nową wiadomość, należy być zalogowanym, aby zatem wysłać uwierzytelnione zapytanie POST na /api/smses/ z JSON-em:

{
    "message": "Najnowsza wiadomość"
}

Jako odpowiedź dostaniemy status HTTP 201 CREATED. create1 create2


Widok edycji wiadomości

Aby zmienić treść wiadomości, tylko autor może wysłać uwierzytelnione zapytanie PUT na /api/smses/<id>/ z JSON-em:

{
    "message": "Edytowana wiadomość"
}

Jako odpowiedź dostaniemy JSON z nową wiadomością:

{
    "message": "Edytowana wiadomość",
    "views_count": 0
}

edit1 edit2


Widok kasowania wiadomości

Aby skasować wiadomość, tylko autor może wysłać uwierzytelnione zapytanie DELETE na /api/smses/<id>/
Jako odpowiedź dostaniemy status HTTP 200 OK

delete


Testy jednostkowe

Napisałem 23 testy jednostkowe, pokrywające model wiadomości oraz wszystkie punkty końcowe (przy użyciu pakietu coverage). Uwzględniłem testowanie uwierzytelniania oraz wyzerowanie licznika wyświetleń po nadpisaniu treści wiadomości.

kliknij, aby przejść do folderu z testami


Rozmieszczenie aplikacji

Jak można zrozumieć z URL, aplikacja była rozmieszczona na heroku.
Niestety czasami długo się ładuje strona, ale mam nadzieje, że to nie wpłynęło na ogólne wrażenie rozwiązania zadania.


Dziękuję bardzo za uwagę i czekam na zwrotną informację!


Gmail vmariiechko@gmail.com  ·  GitHub @vmariiechko  ·  LinkedIn @mariiechko