Skip to content
This repository has been archived by the owner on Nov 13, 2023. It is now read-only.

ratushnyivm/crpt-test-assignment

Repository files navigation

crpt-test-assignment


Описание

API сервис для запроса в NASA API информации об астероидах, сближающихся с Землей.

С помощью данного API пользователь может получать выборку всех либо самых крупных астероидов за конкретную дату или промежуток дат, отсортированную в рамках каждой даты по размеру астероида.

Предоставляемая информация:

  • date - дата максимального сближения
  • neo_reference_id - идентификатор астероида
  • name - наименование астероида
  • absolute_magnitude_h - абсолютная величина астероида
  • is_potentially_hazardous_asteroid - является ли астероид потенциально опасным

Зависимости

Tool Version
python "^3.11"
django "^4.2.4"
djangorestframework "^3.14.0"
python-dotenv "^1.0.0"
requests "^2.31.0"
djangorestframework-simplejwt "^5.2.2"
psycopg2-binary "^2.9.7"

Установка

Перед установкой убедитесь, что у вас установлены Python, Poetry и PostgreSQL.

# Проверить версию python
python3 -V

# Проверить версию poetry
poetry -V

# Установить poetry
curl -sSL https://install.python-poetry.org | python3 -
  1. Склонируйте данный репозиторий и перейдите в папку проекта:

    git clone https://github.com/ratushnyyvm/crpt-test-assignment.git && cd crpt-test-assignment
  2. Установите все необходимые зависимости:

    make install
  3. Переименуйте файл .env.example в .env и заполните указанные поля. Либо создайте новый файл .env со следующими данными:

    SECRET_KEY=
    
    DEBUG=     # 0 -> False, 1 -> True
    
    POSTGRES_NAME=
    POSTGRES_USER=
    POSTGRES_PASSWORD=
    POSTGRES_HOST=
    POSTGRES_PORT=
  4. Выполните миграции для создания необходимых таблиц в базе данных:

    make migrate
  5. Запустите сервер разработчика:

    make start

    Сервер разработчика будет доступен по адресу http://127.0.0.1:8000.


Использование

Для работы с сервисом необходимо быть зарегистированным пользователем. Регистрация пользователей осуществляется через панель администратора. Для создания суперпользователя необходимо выполнить:

make superuser

Авторизация пользователей осуществляется посредством JWT токена. Получение токена доступно по адресу POST /api/token/. В теле запроса необходимо передать данные зарегистрированного пользователя:

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

Все следующие роуты будут ожидать в заголовках поле Authorization c актуальным токеном в формате Bearer jwt-token.

Получение данных реализовано через задачи. Сначала пользователь отправляет запрос с необходимыми параметрами, а в ответ получает id задачи, в рамках которой этот запрос будет реализован. Затем по id задачи пользователь получает результат выполнения этой задачи.

Получение id задачи доступно по адресу GET /neo_id/?start_date=2023-08-12&end_date=2023-08-13&count=2

Параметр Тип Обязательный Описание
start_date YYYY-MM-DD Да Дата начала выборки.
end_date YYYY-MM-DD Нет Дата окончания выборки. По умолчанию равна дате начала выборки.
count integer Нет Ограничение вывода. По умолчанию выводятся все данные.

Если пользователь ввел значение другого формата, не указал обязательный параметр, указал дату окончания выборки меньше даты начала или установил ограничение меньше единицы, то будет возвращен словарь с сообщениями об ошибках для каждого поля.

Пример ответа на валидный запрос GET /neo_id/?start_date=2023-08-12&end_date=2023-08-13&count=2:

{
    "task_id": 22
}

Пример ответа на невалидный запрос GET /neo_id/?start_date=12-08-2023&end_date=2023-13-08&count=-5:

{
    "start_date": [
        "Date has wrong format. Use one of these formats instead: YYYY-MM-DD."
    ],
    "end_date": [
        "Date has wrong format. Use one of these formats instead: YYYY-MM-DD."
    ],
    "count": [
        "Ensure this value is greater than or equal to 1."
    ]
}

Получение результата задачи доступно по адресу GET /neo_result/?task_id=22

Параметр Тип Обязательный Описание
task_id integer Да Уникальный идентификатор задачи.

Если пользователь ввел значение другого формата, не указал обязательный аргумент, установил значение меньше единицы или несуществующей задачи, то будет возвращен словарь с сообщением об ошибке.

Пример ответа на валидный запрос GET /api/v1/neo_result/?task_id=22:

{
    "2023-08-12 3703438": {
        "name": "(2015 AQ43)",
        "absolute_magnitude_h": 28.0,
        "is_potentially_hazardous_asteroid": false
    },
    "2023-08-12 54051257": {
        "name": "(2020 QF2)",
        "absolute_magnitude_h": 27.9,
        "is_potentially_hazardous_asteroid": false
    },
    "2023-08-13 54053939": {
        "name": "(2020 RD4)",
        "absolute_magnitude_h": 29.7,
        "is_potentially_hazardous_asteroid": false
    },
    "2023-08-13 54051379": {
        "name": "(2020 QE5)",
        "absolute_magnitude_h": 25.5,
        "is_potentially_hazardous_asteroid": false
    }
}

Пример ответа на невалидный запрос GET /api/v1/neo_result/?task_id=22h:

{
    "task_id": [
        "A valid integer is required."
    ]
}

Для удобства отправки запросов реализованы две веб формы:

  • GET id/ - запрос на обработку задачи
  • GET result/ - получение результа задачи

⬆️ ВВЕРХ ⬆️