Skip to content

JaneTurueva/storefront

Repository files navigation

Storefront

https://travis-ci.org/JaneTurueva/storefront.svg?branch=master

API витрины магазина. Позволяет наполнять витрину магазина товарами, а также назначать для товаров ответственных сотрудников.

# Смигрировать базу данных
docker run -it --rm \
   --env STOREFRONT_DB_URL=postgresql://api:hackme@HOST:5432/storefront \
   janeturueva/storefront \
   storefront-db upgrade head

# Запустить контейнер
docker run -d --rm -p8080:8080 \
   --env STOREFRONT_HOST=0.0.0.0 \
   --env STOREFRONT_PORT=8080 \
   --env STOREFRONT_DB_URL=postgresql://api:hackme@${DB_HOST}:5432/storefront \
   --env STOREFRONT_REDIS_URL=redis://${REDIS_HOST} \
   janeturueva/storefront
curl --header "Content-Type: application/json" --request POST \
   --data '{"name":"ООО Рога и Копыта"}' \
   http://localhost:8080/companies
{
   "data": {
      "company_id": 1,
      "name": "ООО Рога и Копыта",
      "created_at": "2019-03-13T20:11:58.150475+00:00",
      "updated_at": "2019-03-13T20:11:58.150483+00:00"
   }
}
curl http://localhost:8080/companies
{
   "data": [
      {
         "company_id": 1,
         "name": "ООО Рога и Копыта",
         "created_at": "2019-03-13T20:11:58.150475+00:00",
         "updated_at": "2019-03-13T20:11:58.150483+00:00"
      }
   ]
}
curl http://localhost:8080/companies/1
{
   "data": {
      "company_id": 1,
      "name": "ООО Рога и Копыта",
      "created_at": "2019-03-13T20:11:58.150475+00:00",
      "updated_at": "2019-03-13T20:11:58.150483+00:00"
   }
}
curl --header "Content-Type: application/json" --request PUT \
   --data '{"name":"ООО Рога и Копыта 2"}' \
   http://localhost:8080/companies/1
{
   "data": {
      "company_id": 1,
      "name": "ООО Рога и Копыта 2",
      "created_at": "2019-03-13T20:11:58.150475+00:00",
      "updated_at": "2019-03-13T20:44:22.235562+00:00"
   }
}
curl --request=DELETE http://localhost:8080/companies/1
curl --header "Content-Type: application/json" --request POST \
   --data '{"name":"Василий Пупкин", "company_id": 1}' \
   http://localhost:8080/employees
{
   "data": {
      "employee_id": 1,
      "name": "Василий Пупкин",
      "company_id": 1,
      "created_at": "2019-03-13T20:15:03.125603+00:00",
      "updated_at": "2019-03-13T20:15:03.125611+00:00"
   }
}
curl http://localhost:8080/employees
{
   "data": [
      {
         "employee_id": 1,
         "name": "Василий Пупкин",
         "company_id": 1,
         "created_at": "2019-03-13T20:15:03.125603+00:00",
         "updated_at": "2019-03-13T20:15:03.125611+00:00"
      }
   ]
}
curl http://localhost:8080/employees/1
{
   "data": {
      "employee_id": 1,
      "name": "Василий Пупкин",
      "company_id": 1,
      "created_at": "2019-03-13T20:15:03.125603+00:00",
      "updated_at": "2019-03-13T20:15:03.125611+00:00"
   }
}
curl --header "Content-Type: application/json" --request PUT \
   --data '{"name":"Василий Пупкин 2", "company_id": 1}' \
   http://localhost:8080/employees/1
{
   "data": {
      "employee_id": 1,
      "name": "Василий Пупкин 2",
      "company_id": 1,
      "created_at": "2019-03-13T20:15:03.125603+00:00",
      "updated_at": "2019-03-13T20:15:03.125611+00:00"
   }
}
curl --request DELETE http://localhost:8080/employees/1
curl --header "Content-Type: application/json" --request POST \
   --data '{"name":"Молоко", "price": 10.00}' \
   http://localhost:8080/products
{
   "data": {
      "product_id": 1,
      "name": "Молоко",
      "price": 10,
      "created_at": "2019-03-13T20:17:20.869164+00:00",
      "updated_at": "2019-03-13T20:17:20.869171+00:00"
   }
}
curl http://localhost:8080/products
{
   "data": [
      {
         "product_id": 1,
         "name": "Молоко",
         "price": 10,
         "created_at": "2019-03-13T20:17:12.226921+00:00",
         "updated_at": "2019-03-13T20:17:12.226944+00:00"
      }
   ]
}
curl http://localhost:8080/products/1
{
   "data": {
      "product_id": 1,
      "name": "Молоко",
      "price": 10,
      "created_at": "2019-03-13T20:17:12.226921+00:00",
      "updated_at": "2019-03-13T20:17:12.226944+00:00"
   }
}
curl --header "Content-Type: application/json" --request PUT \
   --data '{"name":"Молоко топленое", "price": 10.00}' \
   http://localhost:8080/products/1
{
   "data": {
      "product_id": 1,
      "name": "Молоко топленое",
      "price": 10,
      "created_at": "2019-03-13T20:17:12.226921+00:00",
      "updated_at": "2019-03-13T20:17:12.226944+00:00"
   }
}
curl --request DELETE http://localhost:8080/products/1
curl --header "Content-Type: application/json" --request POST \
      --data '{"product_id": 1}' \
      http://localhost:8080/employees/1/products
{
   "data": {
      "created_at": "2019-03-13T20:17:12.226921+00:00",
      "name": "Молоко",
      "price": 10.0,
      "product_id": 1,
      "updated_at": "2019-03-13T20:17:12.226944+00:00"
   }
}
curl http://localhost:8080/employees/1/products
{
   "data": [
      {
         "product_id": 1,
         "name": "Молоко",
         "price": 10,
         "created_at": "2019-03-13T20:17:12.226921+00:00",
         "updated_at": "2019-03-13T20:17:12.226944+00:00"
      }
   ]
}
curl --request DELETE http://localhost:8080/employees/1/products/1
# Склонировать репозиторий
git clone git@github.com:JaneTurueva/storefront.git
cd storefront

# Создать окружение и установить все зависимости
make devenv

# Активировать виртуальное окружение
source env/bin/activate

# Поднять окружение (postgres и redis)
docker-compose up -d

# Смигрировать базу данных
storefront-db upgrade head

# Создать докер image
make build

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

Тесты проверяют функционал API, а также структуру возвращаемых данных с помощью jsonschema (не в handlers, чтобы не тратить лишнее время на обработку запросов в production в aiohttp-validate декораторе).

export CI_DB_URL=postgresql://api:hackme@0.0.0.0:5432/storefront
export CI_REDIS_URL=redis://localhost

# Будет запущен py.test, pylama
make test