diff --git a/README.md b/README.md index fec4a0e..c5ea54d 100644 --- a/README.md +++ b/README.md @@ -1 +1,1306 @@ -# starter-knowledge-base \ No newline at end of file +# Методическое пособие инженера Rocket Founders + +## Содержание + +## Раздел 1. **Онбоардинг. Подготовка к работе** +#### Глава 1. Введение +#### Глава 2. Установка и настройка необходимого программного обеспечения +#### Глава 3. Клонирование репозитория Git и подключение к нему +#### Глава 4. Обзор файловой структуры проекта +#### Глава 5. Обзор Makefile +#### Глава 6. Настройка переменных окружения +#### Глава 7. Настройка пользователя и базы данных PostgreSQL. Подключение к БД +#### Глава 8. Настройка рабочего окружения Python +#### Глава 9. Настройка рабочего окружения Node.js +#### Глава 10. Запуск проекта на Next.js +#### Глава 11. Запуск FastApi проекта с помощью Makefile + +## Раздел 2. **Workflow. Работа над проектом** +#### Глава 1. Введение +#### Глава 2. Работа с Git и первый комит +#### Глава 3. Работа с базой данных +#### Глава 4. Работа на серверной стороне +#### Глава 5. Работа на клиентской стороне +#### Глава 6. Тестирование и отладка +#### Глава 7. Завершение работы + +## Раздел 3. **FAQ. Дерево решений** + + +# Методическое пособие инженера Rocket Founders +## Раздел 1. **Онбоардинг. Подготовка к работе** + +### Глава 1. Введение + +[Что должен знать каждый программист?](https://habr.com/ru/articles/673754/) + +[Архитектура веб-приложения](https://itanddigital.ru/webarchitecture) + +[Архитектура и паттерны проектирования](https://dzen.ru/a/YKpzYe1s0HnJvoex) + +[12 базовых алгоритмов](https://proglib.io/p/12-algoritmov-kotorye-dolzhen-znat-kazhdyy-razrabotchik-obyasnyaem-na-gifkah-2022-11-21) + +[Статьи, которые должен прочитать каждый программист](https://javarush.com/groups/posts/1155-10-statey-kotorihe-dolzhen-prochitatjh-kazhdihy-programmist) + +[The missing semester of Your CS education](https://missing.csail.mit.edu) + +[Что должен знать каждый программист](https://itproger.com/news/kazhdiy-programmist-dolzhen-znat-eti-12-veshtey) + +[Как работает Python](https://adw0rd.com/2009/08/22/python-howto-work/) + +[Как работает JavaScript](https://habr.com/ru/articles/579628/) + +[Как работает интернет](https://habr.com/ru/articles/709210/) + +[Основы баз данных](https://practicum.yandex.ru/blog/chto-takoe-bazy-dannyh/) + +[Основы деплоя](https://practicum.yandex.ru/blog/chto-takoe-deploy/) + +[Основы работы с Git](https://proglib.io/p/git-for-half-an-hour) + +[Основы работы с Docker](https://habr.com/ru/companies/ruvds/articles/438796/) + + +### Глава 2. Установка и настройка необходимого программного обеспечения + +1. **Git** [Инструкция](https://habr.com/ru/articles/588801/) +- **Windows:** Скачайте и установите Git с официального сайта [git-scm.com](https://git-scm.com/download/win). +- **Linux:** Установите Git через менеджер пакетов вашего дистрибутива, например, для Ubuntu: `sudo apt-get install git`. +- **MacOS:** Git обычно предустановлен на MacOS. Если нет, можно установить через Homebrew: `brew install git`. + + + +2. **PostgreSQL** [Инструкция](https://wiki.postgresql.org/wiki/Detailed_installation_guides) +- **Windows:** Скачайте и установите PostgreSQL с официального сайта [postgresql.org](https://www.postgresql.org/download/windows/). +- **Linux:** Установите PostgreSQL через менеджер пакетов, например, для Ubuntu: `sudo apt-get install postgresql`. +- **MacOS:** Установите PostgreSQL с помощью Homebrew: `brew install postgresql`. + + +3. **Redis** [Инструкция](https://www.devglan.com/blog/install-redis-windows-and-mac) +- **Windows:** Скачайте и установите Redis с официального сайта [redis.io](https://redis.io/download). +- **Linux:** Установите Redis через менеджер пакетов, например, для Ubuntu: `sudo apt-get install redis-server`. +- **MacOS:** Установите Redis с помощью Homebrew: `brew install redis`. + + +4. **Docker** [Инструкция](https://gist.github.com/rstacruz/297fc799f094f55d062b982f7dac9e41) +- **Windows:** Скачайте и установите Docker Desktop с официального сайта [docker.com](https://www.docker.com/products/docker-desktop). +- **Linux:** Установите Docker Engine через менеджер пакетов вашего дистрибутива, следуя инструкциям на [docker.com](https://docs.docker.com/engine/install/). +- **MacOS:** Установите Docker Desktop с официального сайта [docker.com](https://www.docker.com/products/docker-desktop). + + +5. **Golang-migrate** +- **Windows:** Скачайте исполняемый файл migrate.exe с GitHub репозитория [github.com/golang-migrate/migrate](https://github.com/golang-migrate/migrate/releases) и добавьте его в переменную среды PATH. +- **Linux и MacOS:** Установите golang-migrate с помощью Go: +```bash +go install -tags 'postgres' github.com/golang-migrate/migrate/v4/cmd/migrate@latest +``` + + +6. **PyCharm и WebStorm** [Инструкция](https://skillbox.ru/media/code/pycharm-kak-eye-ustanovit-i-ispolzovat/) +- Скачайте и установите PyCharm и/или WebStorm с официального сайта [jetbrains.com](https://www.jetbrains.com/). + + +### Глава 3. Клонирование репозитория Git и подключение к нему + +Склонируйте репозиторий на свой компьютер: + - Через консольную команду: `git clone <ссылка на репозиторий>.git` + - Или откройте PyCharm или WebStorm и выберите "Check out from Version Control" -> "Git". Введите URL репозитория и нажмите "Clone". [Инструкция](https://dzen.ru/a/Ydblvie5JhFf8ggM) + +### Глава 4. Обзор файловой структуры проекта + +[Архитектура веб-приложения](https://itanddigital.ru/webarchitecture) +[Архитектура и паттерны проектирования](https://dzen.ru/a/YKpzYe1s0HnJvoex) + +Перед тем как мы начнем работу, давайте взглянем на структуру файлов нашего проекта. Основная структура файлового дерева для проектов на FastAPI и Next.js представляет собой следующее: + +**FastAPI проект:** [Обзор архитектуры](https://purpleplane.ru/outstaffing-python-razrabotchikov/tpost/5cszdsgxc1-arhitektura-fastapi-prilozhenii-vnedreni) + +- **LICENSE**: Лицензия на использование проекта. +- **Makefile**: Сценарии команд для автоматизации задач, например, запуск тестов или сборка проекта. +- **README.md**: Файл с описанием проекта и инструкциями по его использованию. +- **config.py**: Файл конфигурации, где хранятся настройки проекта. +- **docker-compose.yml**: Файл для настройки и запуска контейнеров Docker. +- **logging.conf**: Конфигурация для логирования. +- **main.py**: Основной файл для запуска FastAPI приложения. +- **poetry.lock** и **pyproject.toml**: Файлы для управления зависимостями проекта с помощью Poetry. + +**core** +- **api**: Каталог, содержащий маршруты API. + - **auth**: Маршруты и обработчики для аутентификации. + - **ping**: Простой маршрут для проверки работоспособности сервера. + - **profile**: Маршруты и обработчики для работы с профилями пользователей. +- **helpers**: Вспомогательные функции и утилиты. + - **auth**: Вспомогательные функции для аутентификации. +- **model**: Описание моделей данных. + - **profile**: Модели данных для профилей. + - **db**, **enums**, **requests**, **responses**: Дополнительные компоненты моделей. +- **models**: Данные модели для взаимодействия с базой данных. + - **auth**: Модели данных для аутентификации. + - **profile**: Модели данных для профилей. +- **services**: Бизнес-логика приложения. + - **auth**: Сервисы для аутентификации. + - **profile**: Сервисы для профилей. +- **storage**: Логика для взаимодействия с хранилищем данных. + - **db**: Модули для работы с базой данных, включая PostgreSQL. +- **tasks**: Определение фоновых задач. + - **task_list.py**: Список задач. +- **utils.py**: Утилиты общего назначения. +- **registry.py**: Регистрация различных компонентов приложения. + +**tests** +- **conftest.py**: Конфигурация для тестов. +- **utils**: Вспомогательные утилиты для тестирования. + +**Next.js проект:** [Обзор Next.js](https://timeweb.com/ru/community/articles/chto-takoe-next-js) + +- **LICENSE**: Лицензия на использование проекта. +- **README.md**: Файл с описанием проекта и инструкциями по его использованию. +- **jsconfig.json**: Конфигурация для JavaScript. +- **next.config.js**: Конфигурация для Next.js. +- **package-lock.json** и **package.json**: Файлы для управления зависимостями с помощью npm. +- **yarn.lock**: Файл для управления зависимостями с помощью Yarn. + +**actions** +- **profile.js**: Действия для управления профилем пользователя (Redux или другой state management). + +**app** +- **authenticated**: Страницы для аутентифицированных пользователей. +- **login**: Страница входа в систему. +- **profile**: Страница профиля пользователя. +- **register**: Страница регистрации. +- **restore**: Страница восстановления доступа. +- **layout.js**: Основной макет приложения. + +**components** +- **common**: Общие компоненты, используемые на разных страницах. + - **BaseLayout.js**, **Footer.js**, **Navbar.js**, **ProfileCard.js**: Базовый макет, футер, навигационная панель, карточка профиля. +- **pages**: Компоненты, соответствующие страницам приложения. + - **authenticated**, **home**, **login**, **profile**, **register**, **restore**: Компоненты страниц. + +**deploy** +- **Dockerfile**: Описание Docker-образа для развертывания приложения. +- **docker-compose.yml**: Файл для настройки и запуска контейнеров Docker. + +**plugins** +- **axios.js**: Настройка Axios для выполнения HTTP-запросов. + +**public** +- **assets**: Статичные файлы, например, изображения. +- **css**: Стили для приложения. +- **fonts**: Шрифты. +- **scripts**: Скрипты. + +**schemas** +- **profile**: Схемы данных для профиля пользователя. + +**services** +- **profile.js**: Логика для взаимодействия с API профиля. + +**store** +- **index.js**: Конфигурация для Redux или другого state management. + +**utils** +- **profile.js**: Вспомогательные функции для профиля пользователя. + +Эта структура позволяет организовать проект таким образом, чтобы каждая его часть была легко доступна и понятна для разработчика. Разделяя файлы по функциональности и типу, мы упрощаем поддержку и масштабирование проекта. + +### Глава 5. Обзор Makefile + +[Разбор Makefile-а](https://blog.skillfactory.ru/glossary/makefile/) + +Запуск некоторых основных команд, происходит через Makefile. + + +Makefile - это текстовый файл, который содержит набор инструкций (целей) для автоматизации процесса сборки и управления проектом. В данном случае Makefile используется для управления процессом разработки веб-приложения. + + +Краткий обзор Makefile: + + +1. `include .env` - подключает файл .env для загрузки переменных окружения. +2. `export` - экспортирует переменные окружения из .env файла. +3. `new_migration` - цель для создания новой миграции базы данных. Она запрашивает у пользователя имя новой миграции, а затем использует инструмент миграции (возможно, это Alembic) для создания новой миграции SQL файла в директории ./core/storage/db/migrations. +4. `migrate` - цель для применения миграций базы данных. Она использует переменную ${DATABASE_URL}, чтобы подключиться к базе данных и применить миграции, которые были созданы ранее. +5. `uvicorn_start` - цель для запуска приложения с помощью uvicorn. Она использует poetry для запуска uvicorn, указывая файл main.py в качестве точки входа в приложение. + +Этот Makefile упрощает процесс создания и применения миграций базы данных, а также запуска приложения, делая процесс разработки более автоматизированным и удобным. + +### Глава 6. Настройка переменных окружения + +Установите переменные окружения, создав файл .env и добавив необходимые переменные. Эти переменные предоставляют важные настройки для работы приложения, такие как подключение к базе данных, управление сессиями и безопасностью. Вот небольшое описание каждой из них: + +- `ENV`: Определяет окружение, в котором работает приложение. В данном случае установлено значение "LOCAL", что указывает на локальное окружение разработки. +- `VERSION`: Указывает на версию приложения. В данном случае установлено значение "0.1". +- `DATABASE_URL`: URL для подключения к базе данных PostgreSQL. Обычно включает в себя информацию о протоколе, имени хоста, порту и названии базы данных. +- `DB_DBNAME`: Имя базы данных PostgreSQL, к которой приложение должно подключаться. +- `DB_USERNAME`: Имя пользователя PostgreSQL для доступа к базе данных. +- `DB_PASSWORD`: Пароль пользователя PostgreSQL для доступа к базе данных. +- `DB_PORT`: Порт, на котором работает база данных PostgreSQL. +- `SECRET_KEY`: Секретный ключ, используемый для шифрования данных и создания безопасных токенов сессии. +- `ACCESS_TOKEN_EXPIRE_DAYS`: Время жизни доступного токена в днях. Указывает, через сколько дней токен станет недействительным и потребуется повторная аутентификация. + + +### Глава 7. Настройка пользователя и базы данных PostgreSQL. Подключение к БД + +[Подключение к БД из PyCharm/WebStorm через утилиту DataGrip](https://www.jetbrains.com/help/pycharm/connecting-to-a-database.html) +[Настройка и подключение к БД из терминала](https://timeweb.cloud/docs/unix-guides/installing-and-using-postgresql) + +1. Создание пользователя в PostgreSQL + +Чтобы создать пользователя в PostgreSQL, следуйте этим шагам: +1. **Windows:** +- Откройте командную строку от имени администратора. +- Войдите в консоль PostgreSQL, выполнив команду: `psql -U postgres`. +- Создайте пользователя с помощью команды: +```sql +CREATE USER myuser WITH PASSWORD 'mypassword'; +``` + +2. **Linux и MacOS:** + +- Откройте терминал и выполните команду для входа в консоль PostgreSQL: +```bash +sudo -u postgres psql +``` +- Создайте пользователя с помощью SQL-запроса: +```sql +CREATE USER myuser WITH PASSWORD 'mypassword'; +``` +Где: +- `myuser` - имя нового пользователя. +- `mypassword` - пароль для нового пользователя. + +После создания пользователя, вы можете предоставить ему необходимые привилегии, например, разрешение на подключение к базе данных и выполнение операций чтения/записи в ней. + +2. **Настройка базы данных PostgreSQL** + +- **Windows:** +- Запустите командную строку от имени администратора. +- Войдите в консоль PostgreSQL, выполнив команду: `psql -U myuser`. +- Создайте базу данных: `CREATE DATABASE my_database;`. +- **Linux и MacOS:** +- Откройте терминал и выполните команды: +```bash +sudo -u myuser psql +CREATE DATABASE my_database; +``` + +3. **Установка миграций** + +- Запустите команду для установки миграций: +```bash +make migrate +``` + +3. **Подключение к базе данных** +- Измените файл .env, установив значение DATABASE_URL в формате: `postgresql://myuser:mypassword@localhost:5432/my_database` + + +### Глава 8. Настройка рабочего окружения Python + +[Доп. материалы по установке Python](https://sky.pro/media/kak-ustanovit-python/) + +1. **Установка Pyenv** +- Следуйте инструкциям на официальной странице репозитория Pyenv: [github.com/pyenv/pyenv](https://github.com/pyenv/pyenv#installation). + +2. **Установка Poetry** +- Установите Poetry, выполнив команду: +```bash +curl -sSL https://install.python-poetry.org | python3 - +``` + +3. **Установка Python 3.11** + +- Установите Python 3.11 с помощью Pyenv: +```bash +pyenv install 3.11.4 +pyenv global 3.11.4 +``` + +4. **Установка зависимостей Python** + +- В корневой директории проекта выполните команду: +```bash +poetry install +``` + +### Глава 9. Настройка рабочего окружения Node.js + +[Доп. материалы по установке Node.js](https://elbrusboot.camp/blog/node-js/) + +1. **Установка Node.js** +- Скачайте и установите Node.js с официального сайта [nodejs.org](https://nodejs.org/). + +2. Установка зависимостей для проекта на Next.js +- Установите зависимости проекта Next.js: `npm install` + +### Глава 10. Запуск проекта на Next.js +- Запустите проект с помощью команды: `npm run dev` или `yarn dev` + +### Глава 11. Запуск FastApi проекта с помощью Makefile + +- Запустите проект с помощью команды: `make uvicorn_start` + + +## 2. **Workflow. Работа над проектом** {#workflow} + + +### Глава 1. Введение + + +Добро пожаловать! Здесь мы начнем наше путешествие в мир разработки веб-приложений, основанное на нашем проекте-шаблоне. В этой главе мы расскажем о том, какой путь предстоит тебе пройти, чтобы успешно освоить рабочий процесс разработки. + + +##### 1.1. Описание раздела + + +Мы ставим перед собой задачу предоставить тебе полное понимание рабочего процесса разработки веб-приложений на примере нашего проекта-шаблона. Это позволит тебе не только овладеть конкретными навыками, но и понять весь цикл разработки от начала до конца. Это особенно важно для тебя, как джуниора-разработчика, чтобы ты мог стать более уверенным и компетентным специалистом. + + +##### 1.2. Обзор структуры раздела и основных тем + + +Мы разбили раздел на несколько этапов, каждый из которых описывает конкретный шаг в рабочем процессе разработки. Мы начнем с базовых вещей, таких как запись данных в базу данных, и двинемся к более сложным аспектам, таким как разработка API и методов на фронтенде. Это позволит тебе понять, как все компоненты приложения взаимодействуют между собой и какие задачи решаются на каждом этапе разработки. + + +##### 1.3. Подчеркивание важности понимания процесса разработки + + +Понимание всего процесса разработки от начала до конца является ключевым элементом успешной карьеры в сфере веб-разработки. Это поможет тебе не только эффективно выполнять свои задачи, но и лучше взаимодействовать с коллегами и понимать общую картину проекта. + + +##### 1.4. Цели и задачи раздела для джуна + + +В этом разделе мы ставим перед тобой ряд конкретных целей и задач, которые помогут тебе достичь определенных результатов и овладеть необходимыми навыками в процессе разработки веб-приложений. Вот основные цели и задачи, которые тебе предстоит выполнить + + +1. Освоить рабочий процесс разработки веб-приложений от начала до конца. + +2. Научиться записывать данные в базу данных и взаимодействовать с ней через SQL и миграции данных. + +3. Разработать и настроить API на серверной стороне с помощью FastAPI для обработки запросов и взаимодействия с базой данных. + +4. Интегрировать и использовать Next.js на клиентской стороне для обращения к API, обработки данных и отображения их на пользовательском интерфейсе. + +5. Научиться эффективно тестировать и отлаживать разрабатываемое приложение, а также анализировать логи для выявления ошибок. + +6. Понять процесс деплоя приложения, включая настройку среды разработки, создание Docker образов и настройку CI/CD. + +7. Получить представление о важности усвоения всего рабочего процесса для успешного участия в проекте и дальнейшего профессионального роста. + + +### Глава 2. Работа с Git и первый комит + +[Доп. материалы по работы с гитом](https://habr.com/ru/companies/yandex_praktikum/articles/768492/) +[Официальная документация](https://git-scm.com/docs) + +1. **Форкните репозиторий**: Нажмите на кнопку "Fork" в верхнем правом углу страницы репозитория, чтобы создать копию в своем аккаунте. + +2. **Клонируйте репозиторий**: Склонируйте форкнутый репозиторий на свой компьютер: + - Через консольную команду: + ```bash + git clone https://github.com/ваш_логин/название_репозитория.git + ``` + - Или откройте PyCharm или WebStorm и выберите "Check out from Version Control" -> "Git". Введите URL репозитория и нажмите "Clone". + +3. **Создайте новую ветку**: Перейдите в директорию репозитория и создайте новую ветку для своих изменений: + ```bash + git checkout -b название_вашей_ветки + ``` +#### 2.1. Как внести изменения и закоммитить их: + +1. **Внесите изменения**: Внесите необходимые изменения в код, добавьте новые файлы или удалите старые. + +2. **Добавьте изменения для коммита**: Используйте `git add` для добавления измененных файлов в список отслеживаемых: + ```bash + git add . + ``` + +3. **Закоммитьте изменения**: Закоммитьте изменения с понятным описанием: + ```bash + git commit -m "Описание ваших изменений" + ``` + +4. **Отправьте изменения в свой форк**: Отправьте ваши изменения в ваш форк репозитория: + ```bash + git push origin название_вашей_ветки + ``` + +#### 2.2. Как отправить запрос на включение изменений (Pull Request): + +1. Перейдите на страницу вашего репозитория на Gitea. + +2. Нажмите на кнопку "Compare & pull request" рядом с вашей веткой. + +3. Убедитесь, что ваши изменения отображаются корректно и заполните информацию о запросе на включение изменений (PR). + +4. Нажмите на кнопку "Create pull request", чтобы отправить ваш запрос. + +После создания PR, ваши изменения будут рассмотрены и, при необходимости, внесены в основной репозиторий. + +### Глава 3. Работа с базой данных + +[Доп. материалы по работе с PostgreSQL](https://proglib.io/p/learn-postgresql) +[Официальная документация](https://www.postgresql.org/docs/current/index.html) + +В этой главе мы погрузимся в мир баз данных и изучим основные операции с PostgreSQL. Мы рассмотрим, как записывать данные в базу данных вручную с использованием SQL-скриптов, а также как создавать и применять миграции данных для изменения структуры базы данных. + + +#### 3.1. Запись данных в базу данных PostgreSQL + + +Для начала работы с базой данных PostgreSQL, давайте убедимся, что она установлена и запущена на вашей системе. Затем мы можем использовать любой удобный для вас инструмент для работы с PostgreSQL, такой как командная строка (psql), pgAdmin или любой другой клиент. + + +Мы будем работать с базой данных PostgreSQL под пользователем "myuser". + + +1. Подключение к базе данных PostgreSQL под пользователем `myuser` и выбор базы данных `my_database`: + + +```bash +psql -U myuser -d my_database +``` + + +После выполнения этой команды вы попадете в интерактивный интерфейс PostgreSQL, где сможете выполнять SQL-запросы. + + +2. Вывод списка существующих таблиц в базе данных: + + +```sql +\dt +``` + +Эта команда позволяет вывести список всех таблиц в текущей базе данных. Вы увидите названия таблиц и их схемы. + +После раздела "Онбоардинг" у тебя уже должна быть создана таблица "api_profile" в твоей локальной базе данных. + +Создадим таблицу "api_order", которая будет содержать информацию о заказах. + +```sql + +CREATE TABLE IF NOT EXISTS api_order ( + id SERIAL PRIMARY KEY, + profile_id VARCHAR(16) REFERENCES api_profile(id), + product_name VARCHAR(100) NOT NULL, + quantity INT NOT NULL, + price DECIMAL(10, 2) NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +``` + +Теперь у нас есть таблица "api_order", которая будет использоваться для хранения информации о заказах. Обратите внимание, что в этой таблице есть внешний ключ "profile_id", который ссылается на таблицу "api_profile". + + +#### 3.2. Создание и применение миграций данных для изменения структуры базы данных. + +Давайте рассмотрим различные операции с базой данных, начиная с создания записей в таблицах "api_profile" и "api_order". + + +##### Создание записей в таблицах "api_profile" и "api_order" + + +```sql + +-- Создание профиля +INSERT INTO api_profile (id, username, password, email, phone_number) +VALUES ('pr_1234567890', 'john_doe', 'password123', 'john@example.com', '+1234567890'); + + +-- Создание заказа +INSERT INTO api_order (profile_id, product_name, quantity, price) +VALUES ('pr_1234567890', 'Laptop', 1, 1500.00); + +``` + + + +##### Добавление внешнего ключа + + + +```sql + +-- Добавление внешнего ключа +ALTER TABLE api_order +ADD CONSTRAINT fk_profile_id +FOREIGN KEY (profile_id) +REFERENCES api_profile(id); + +``` + + + +##### Примеры CRUD запросов + + + +```sql + +-- Получение информации о заказах для конкретного профиля +SELECT * FROM api_order WHERE profile_id = 'pr_1234567890'; + + +-- Получение информации о профилях и заказах с сортировкой +SELECT p.id AS profile_id, p.username, p.email, o.id AS order_id, o.product_name, o.quantity +FROM api_profile AS p +JOIN api_order AS o ON p.id = o.profile_id +ORDER BY p.username ASC, o.product_name ASC; + +-- Обновление информации о заказе +UPDATE api_order SET quantity = 2 WHERE id = 1; + +-- Удаление заказа +DELETE FROM api_order WHERE id = 1; +``` + +Конечно, вот пример README.md файла с инструкциями о схеме базы данных: + +--- + +#### 3.3. Инструкция по управлению схемой базы данных + +В этом репозитории используется файл `schema.sql` для управления структурой базы данных. Пожалуйста, следуйте этим инструкциям при внесении изменений в схему базы данных. + +##### Запись изменений схемы базы данных + +Все изменения в структуре базы данных должны быть записаны в файл `schema.sql`. Этот файл содержит SQL-запросы для создания таблиц, индексов, ограничений и других объектов базы данных. + +При добавлении новых таблиц, полей или индексов, а также при изменении существующих объектов базы данных, убедитесь, что соответствующие SQL-запросы добавлены или изменены в файле `schema.sql`. + +##### Применение изменений к базе данных + +Чтобы применить изменения схемы базы данных к вашей локальной или удаленной базе данных, выполните следующие шаги: + +1. **Откройте файл `schema.sql`**: Откройте файл `schema.sql` в вашем текстовом редакторе или интегрированной среде разработки (IDE). + +2. **Внесите необходимые изменения**: Внесите необходимые изменения в структуру базы данных, добавив, изменяя или удаляя объекты базы данных при необходимости. + +3. **Сохраните изменения**: Сохраните файл `schema.sql` после внесения всех необходимых изменений. + +4. **Примените изменения к базе данных**: Запустите скрипт `schema.sql` на вашей локальной или удаленной базе данных с помощью инструмента для управления базой данных (например, `psql` для PostgreSQL). Убедитесь, что скрипт выполняется без ошибок. + +5. **Проверьте изменения**: Проверьте, что изменения успешно применены к базе данных, выполнив необходимые запросы SQL или проверив структуру базы данных с помощью инструментов администрирования баз данных. + +### Глава 4. Работа на серверной стороне + +[Доп. материалы по работе с FastAPI](https://habr.com/ru/articles/488468/) +[Официальная документация FastAPI](https://fastapi.tiangolo.com/#installation) + +#### 4.1. Создания API endpoint'ов и обработки данных на бэкенде. + + + +#### Создание API endpoint'ов + + +Давайте создадим простой API endpoint для получения информации о профилях пользователей. Создайте новый файл `api.py` в папке `core`, если его еще нет, и добавьте следующий код: + + + +```python + +from fastapi import FastAPI + +from core.models.profile import Profile + +app = FastAPI() + +@app.get("/profiles/{profile_id}") +async def read_profile(profile_id: str): + # Здесь должен быть код для получения профиля по его ID из базы данных + profile = Profile.get_by_id(profile_id) + return {"profile_id": profile.id, "username": profile.username, "email": profile.email} + +``` + + +Этот код создает простой API endpoint для получения информации о профиле по его ID. + +Вот пример README.md файла для FastAPI проекта с описанием кода бэкенда для вывода заказов по профилю и инструкциями по тестированию: + +#### Запуск проекта + + +Теперь мы можем запустить наш проект FastAPI с помощью команды: + + +```bash +make uvicorn_start +``` + +Теперь вы можете отправить GET-запрос по адресу `curl http://localhost:8000/profiles/{profile_id}` и получить информацию о профиле. + +--- + +#### 4.2. Пример вывода заказов по профилю + +##### Уровень стореджа (Storage) + +- **`storage.py`**: Содержит функции для работы с базой данных, такие как создание, чтение, обновление и удаление заказов и других объектов. +```python + +class ProfileStorage: + def __init__(self, db: DB) -> None: + self.db = db + + async def get_profile_with_orders( + self, profile_id, + ) -> list[ProfileDB]: + sql = "SELECT p.id AS profile_id, p.username, p.email, o.id AS order_id, o.product_name, o.quantity FROM api_profile AS p JOIN api_order AS o ON p.id = o.profile_id WHERE p.id=$1 ORDER BY p.username ASC, o.product_name ASC;" + rows = await self.db.fetch(sql, profile_id) + if not rows: + throw_not_found("No active users!") + + profiles: list[ProfileDB] = [] + for row in rows: + profiles.append(self.row_to_profile(row)) + + return profiles + +``` + +##### Уровень сервиса (Service) + +- **`service.py`**: В этом модуле содержатся бизнес-логика и сервисы для работы с заказами, включая логику для получения заказов пользователя по его профилю. +```python +from typing import List +from .storage import get_profile_with_orders +from .models import ProfileDB + +# Бизнес-логика и сервисы +def get_user_orders(profile_id: int) -> List[ProfileDB]: + return get_profile_with_orders(profile_id) + +``` + +##### Уровень хэндлера (Handler) + +- **`api.py`**: Определяет маршруты API и связывает их с соответствующими функциями обработчиков. Включает обработчики для запросов на получение заказов пользователя. + +```python +from main import app +from .service import get_user_orders +from .models import ProfileDB +from typing import List + +@app.get("/user-orders", response_model=List[ProfileDB]) +async def read_user_orders(user_id: int): + orders = get_user_orders(user_id) + return orders +``` + +#### Как протестировать, что ручка работает + +1. **Установите зависимости**: Убедитесь, что все зависимости проекта установлены. Выполните команду: + ```bash + pip install -r requirements.txt + ``` + +2. **Запустите сервер**: Запустите сервер FastAPI. В корневой директории проекта выполните команду: + ```bash + uvicorn main:app --reload + ``` + +3. **Отправьте запрос на получение заказов пользователя**: Используйте любой HTTP-клиент (например, `curl` или инструменты для тестирования API, такие как Postman или Insomnia) для отправки запроса на получение заказов пользователя. Например: + ```bash + curl -X GET "http://localhost:8000/orders?user_id=123" + ``` + +4. **Проверьте ответ**: Проверьте ответ от сервера и убедитесь, что он содержит ожидаемые данные заказов пользователя. + + +#### 4.3. Тестирование и отладка API endpoint'ов, взаимодействие с базой данных и другими компонентами. + +FastAPI предоставляет инструменты для автоматического тестирования API endpoint'ов. Давайте напишем простой тест для нашего API endpoint'а: + +```python + +import requests + +def test_read_profile(): + response = requests.get("http://localhost:8000/profiles/1") + assert response.status_code == 200 + assert response.json()["username"] == "test_user" +``` + +Этот тест отправляет GET-запрос к нашему API endpoint'у и проверяет, что мы получаем ожидаемый ответ. + + +#### Отладка API endpoint'ов + +Для отладки API endpoint'ов вы можете использовать инструменты, предоставляемые вашей средой разработки, такие как PyCharm или VSCode. Установите точки останова в вашем коде и запустите процесс отладки, чтобы шаг за шагом проходить через код и проверять его выполнение. + + +#### Взаимодействие с базой данных и другими компонентами + +Для взаимодействия с базой данных вы можете использовать ORM, такой как SQLAlchemy, или использовать библиотеки для работы с базами данных напрямую, такие как asyncpg для асинхронных запросов к PostgreSQL. + + + +```python + +import asyncpg + + +async def get_profile_from_db(profile_id: str): + conn = await asyncpg.connect(user='myuser', password='password', database='my_database', host='localhost') + profile = await conn.fetchrow('SELECT * FROM api_profile WHERE id = $1', profile_id) + await conn.close() + return profile + +``` + + + +Этот код показывает, как выполнить асинхронный запрос к базе данных PostgreSQL и получить профиль пользователя по его ID. + + + +### Глава 5. Работа на клиентской стороне + +[Доп. материалы по работе с Next.js](https://habr.com/ru/companies/timeweb/articles/804663/) +[Официальная документация](https://nextjs.org/docs) + +#### 5.1. Настройка и интеграция Next.js + + +Для интеграции с нашим бэкендом мы будем использовать API эндпоинты, которые мы создали ранее с помощью FastAPI. + + + +Сначала создайте файл `api.js` в папке `pages/api` вашего проекта Next.js: + + + +```javascript + +// pages/api/api.js + +export default async function handler(req, res) { + const response = await fetch('http://localhost:8000/api/data'); + const data = await response.json(); + res.status(200).json(data); +} + +``` + + + +Здесь мы создали API эндпоинт `/api/api`, который делает запрос к нашему бэкенду FastAPI по адресу `http://localhost:8000/api/data`. + + + +#### 5.2. Получение и отображение данных на фронтенде + + + +Теперь мы можем получить данные с нашего бэкенда через новый API эндпоинт в компонентах Next.js и отобразить их на фронтенде. + + + +Для примера, давайте создадим страницу `index.js`: + + + +```jsx + +// pages/index.js + + +import React, { useState, useEffect } from 'react'; + + +export default function Home() { + const [data, setData] = useState([]); + + useEffect(() => { + async function fetchData() { + const response = await fetch('/api/api'); + const result = await response.json(); + setData(result); + } + fetchData(); + }, []); + + + return ( +
Loading...
+ ) : ( +