Введение 0:00 Приветствие и представление курса по хранению файлов с помощью Spring Boot, React и AWS. Упоминание о переделке старого видео в рамках полной программы курса. Информация о возможности получения сертификата на веб-сайте.
Диаграмма сервисов AWS 1:24 Объяснение диаграммы сервисов AWS, включая EC2 и S3. Настройка роли для доступа к корзине S3.
Использование SDK AWS 2:20 Объяснение необходимости назначения роли для использования SDK AWS. Описание двух реализаций: подключение к реальному ведру S3 и использование папки в файловой системе.
Интеграционные тесты 3:12 Объяснение использования поддельной реализации для интеграционных тестов. Демонстрация функции перетаскивания изображений в приложении.
Выбор IDE 6:10 Выбор IntelliJ IDEA как IDE для курса. Упоминание новой темы пользовательского интерфейса IntelliJ. Информация о розыгрыше лицензии IntelliJ.
Установка IntelliJ 9:13 Рекомендации по установке IntelliJ Ultimate через Toolbox. Получение трёхмесячной лицензии IntelliJ.
Открытие проекта в IntelliJ 11:01 Откройте IntelliJ и выберите «Открыть» или клонируйте репозиторий с GitHub. Убедитесь, что все записи сделаны в одной и той же версии IDE. Откройте корень проекта, который содержит интерфейс, серверную часть и другие компоненты.
Новые функции IntelliJ 12:01 После обновления приложения в IntelliJ появились новые функции. Найдите скрипт сборки Maven и установите плагин. Проверьте структуру проекта: CI, GitHub, gitignore, бэкенд, фронтенд, Angular, React.
Работа с Git 12:52 Откройте Git и проверьте коммиты перед загрузкой файлов. Проверьте код перед загрузкой файлов, используя проверку редакции. Используйте терминал для проверки изменений с помощью команды `git checkout`.
Установка Docker 15:19 Установите Docker для локального запуска приложений. Запустите контейнер Hello World через Docker Desktop. Проверьте работу контейнера, открыв страницу на локальном хосте.
Запуск базы данных с помощью Docker 18:40 Используйте Docker для запуска базы данных PostgreSQL. Измените файл docker-compose.yaml, оставив только контейнер для базы данных. Запустите контейнер базы данных с помощью команды `docker-compose up -d`.
Проверка работы базы данных 21:30 Проверьте запущенный контейнер базы данных с помощью `docker ps`. Убедитесь, что база данных готова к подключениям, проверив вывод `docker logs`.
Создание базы данных customer 23:22 Внутри контейнера базы данных создайте базу данных customer для сервера.
Подключение к базе данных через терминал 23:38 В IntelliJ откройте серверную папку и попробуйте запустить основной класс. Запуск завершится неудачей из-за отсутствия клиента базы данных. Для подключения к базе данных используйте терминал: `docker ps`, затем `docker exec -it <контейнер_id> sh`.
Работа с PostgreSQL в контейнере 24:32 В контейнере введите `psql` для подключения к базе данных. Введите имя пользователя и пароль для подключения. Перечислите доступные базы данных с помощью команды `\l`.
Создание новой базы данных 25:30 Создайте новую базу данных с именем «Клиент». Убедитесь, что после команды создания базы данных есть точка с запятой. Подключитесь к новой базе данных с помощью команды `\c Клиент`.
Проверка работы приложения 26:26 Попробуйте запустить приложение в IntelliJ. Введите данные клиента: адрес электронной почты, возраст и другие. Проверьте наличие таблицы «Клиент» в базе данных.
Извлечение данных из базы данных 27:24 Извлеките данные клиента с помощью команды `select * from Клиент`. Проверьте идентификатор клиента, имя, пароль, пол и возраст. Выйдите из PostgreSQL и контейнера с помощью `Ctrl+D`.
Установка Node.js и запуск интерфейса 28:36 Установите Node.js для локального запуска интерфейса. Перейдите в папку интерфейса с помощью `cd`. Установите зависимости с помощью `npm install`. Запустите интерфейс React с помощью `npm run dev`.
Вход в систему и управление клиентами 30:30 Откройте Chrome и введите URL интерфейса. Войдите в систему с учётными данными, полученными из логов серверной части. Добавьте нового клиента, введите его данные и авторизуйтесь.
Завершение 31:30 Проверьте добавление нового клиента и его авторизацию. Congratulations! Вы на верном пути к созданию функционала для загрузки фотографий с помощью AWS.
Начало работы с AWS SDK для Java 32:10 Изучение официальной документации AWS SDK для Java. Упоминание о двух версиях SDK и руководстве по миграции.
Руководство для разработчиков 33:03 Обзор руководства по началу работы, настройке, функциям SDK и безопасности. Пример проекта Maven с использованием SDK.
Добавление зависимости в IntelliJ 34:55 Запуск команды для добавления зависимости в IntelliJ. Настройка версии SDK в pom.xml.
Временные учётные данные 36:20 Необходимость временных учётных данных для доступа к AWS. Цепочка поставщиков учётных данных по умолчанию.
Создание пользователя в консоли AWS 38:13 Переход в консоль AWS и создание нового пользователя. Предоставление полного доступа пользователю.
Генерация ключей доступа 41:00 Генерация ключа доступа и секретного ключа. Рекомендации по использованию ключей доступа.
Сохранение ключей на локальном компьютере 42:38 Сохранение ключа доступа и секретного ключа на локальном компьютере. Подчёркивание важности безопасного хранения ключей.
Создание файла учётных данных 43:36 Создайте локальный файл учётных данных в домашнем каталоге, например, /Users/amigoscode/aws/credentials. Откройте файл с помощью редактора, например, vi. Введите идентификатор ключа доступа AWS и секретный ключ доступа в файл.
Безопасность учётных данных 46:27 Учётные данные должны храниться в секрете, чтобы избежать несанкционированного доступа. После использования учётные данные нужно восстановить. Содержимое файла можно найти в описании видео.
Введение в Amazon S3 47:40 Amazon S3 — это хранилище объектов для хранения данных. Бесплатный уровень AWS предоставляет 5 ГБ хранилища на 12 месяцев. S3 позволяет масштабировать ресурсы, защищать данные и легко управлять ими.
Настройка клиента S3 50:22 Используйте фрагмент кода из документации для настройки клиента S3 в IntelliJ IDEA. Создайте класс для конфигурации клиента, например, s3.Config. Укажите регион AWS, например, eu-west-1.
Определение региона в конфигурации 53:12 Определите регион в файле конфигурации, например, в application.yaml. Верните сконфигурированный клиент для использования.
Тестирование без использования учётных данных 55:04 Для тестирования можно использовать поддельную реализацию, которая хранит файлы в локальной файловой системе. Это позволяет избежать использования учётных данных AWS локально.
Создание сервиса S3 55:32 Конфигурация S3: создание сервиса и добавление методов для загрузки и хранения объектов. Настройка клиента для взаимодействия с S3.
Операции с объектами в S3 56:24 Обсуждение операций с корзинами и объектами в документации S3. Рекомендация использовать инфраструктуру как код для управления ресурсами, например, Terraform или Pulumi.
Реализация метода загрузки объекта 57:22 Разработка метода для загрузки объекта в корзину. Передача имени корзины и ключа в запросе. Сохранение данных в виде массива байтов.
Реализация метода получения объекта 59:20 Реализация метода для получения объекта из корзины. Использование многосоставной загрузки для больших файлов. Получение ответа в виде потока ввода-вывода.
Тестирование методов 1:03:28 Создание корзины в консоли AWS. Проверка наличия объектов в корзине. Подготовка к тестированию загрузки файлов.
Создание корзины в AWS 1:04:26 Ввод названия корзины, например, «fs-amigos-code-dash-customer». Выбор региона для развёртывания сервисов. Подтверждение создания корзины.
Начало работы с S3 1:06:14 Открытие IntelliJ и метода main. Комментирование кода для тестирования загрузки файла в корзину.
Использование сервиса S3 1:07:10 Создание случайного объекта и клиента. Использование сервиса S3 для загрузки файла. Передача названия корзины, ключа и массива байтов.
Загрузка файла 1:08:09 Загрузка строки «привет, мир» в массив байтов. Преобразование массива байтов в строку.
Проверка загрузки 1:10:06 Запуск приложения и проверка загрузки файла в S3. Возможность скачивания файла из корзины.
Проблемы с учётными данными 1:11:03 Удаление учётных данных и проверка работы плагина AWS. Ошибка из-за неверной подписи запроса. Важность правильной настройки учётных данных.
Настройка конфигурации 1:15:05 Добавление имени корзины в конфигурацию приложения.yaml. Создание класса для работы с корзинами S3. Использование геттеров и сеттеров для работы с конфигурацией.
Импорт класса и тестирование 1:17:51 Импорт класса S3Buckets в main. Тестирование загрузки файла с использованием нового подхода.
Создание контроллера 1:19:55 Начало работы над контроллером для API. Определение методов для загрузки и выгрузки изображений. Настройка пути для сохранения изображения клиента.
Работа с изображением профиля 1:21:31 Изображение профиля будет иметь идентификатор, представляющий собой целое число. Получение файла через составной запрос. Использование Spring Framework Web Multipart для работы с файлами.
Сопоставление и интеграционные тесты 1:22:30 Добавление сопоставления для обработки файла. Планирование добавления интеграционных тестов для проверки работы системы. Передача идентификатора клиента вместе с файлом.
Создание методов в контроллере 1:23:26 Дублирование метода для получения изображения профиля. Получение массива байтов изображения профиля. Передача идентификатора клиента и загрузка изображения.
Работа с сервисом 1:25:15 Создание методов в сервисе для работы с файлами. Проверка существования клиента перед загрузкой файла. Рефакторинг кода для повторного использования.
Загрузка файла и обработка исключений 1:27:11 Загрузка содержимого корзины с файлом. Обработка исключений с помощью try-catch. Извлечение идентификатора изображения профиля.
Сохранение изображения в базе данных 1:31:18 Сохранение профиля и идентификатора изображения профиля в PostgreSQL. Проверка наличия идентификатора изображения профиля у клиента. Возврат объекта клиента с изображением профиля.
Тестирование системы 1:35:04 Открытие тестового класса для проверки обслуживания клиентов. Создание макета для службы S3. Исправление ошибок компиляции перед сохранением идентификатора изображения профиля в базе данных.
Сохранение идентификатора изображения профиля в базе данных 1:36:21 Открытие проекта и запуск миграции базы данных. Создание второй миграции. Добавление столбца «профиль», «изображение», «идентификатор» типа varchar длиной 36.
Настройка уникальности идентификатора изображения профиля 1:38:15 Добавление ограничения уникальности для идентификатора изображения профиля. Изменение таблицы «клиент» и добавление ограничения «уникальный идентификатор изображения профиля».
Настройка класса сущности клиента 1:39:02 Добавление столбца «идентификатор изображения профиля» в класс сущности клиента. Установка значения «уникальный» равным «истина» для нового столбца.
Создание конструктора для клиента 1:41:54 Создание конструктора, принимающего строку и идентификатор изображения профиля. Настройка автоматического ввода остальных полей.
Тестирование приложения 1:42:49 Запуск приложения и проверка работы вставки данных. Исправление ошибки «идентификатор изображения профиля в столбце не найден».
Обновление идентификатора изображения профиля через JDBC 1:44:32 Реализация метода обновления идентификатора изображения профиля через JDBC. Использование инструкции SQL для обновления данных.
Реализация обновления через JPA 1:47:52 Применение методов JPA для обновления идентификатора изображения профиля. Создание запроса JPQL для обновления данных.
Завершение настройки 1:50:47 Обработка данных JDBC клиента. Выбор нового столбца, добавленного ранее.
Добавление новой колонки в JDBC 1:51:33 Открытие клиентской службы доступа к данным JDBC. Добавление новой колонки «изображение профиля» через команду «c». Удаление ненужных столбцов для упрощения вставки.
Обновление информации о клиенте 1:52:32 Обновление информации о клиенте, включая «пользовательскую покупку» и «электронное письмо». Добавление нового метода для обновления идентификатора изображения профиля клиента.
Изменение программы для отображения строк клиентов 1:53:29 Вставка нового столбца в программу для отображения строк клиентов. Создание нового конструктора для указания идентификатора изображения профиля.
Загрузка изображения профиля клиента 1:54:14 Загрузка изображения профиля клиента через «Обслуживание клиентов». Проверка существования клиента и генерация идентификатора изображения профиля. Сохранение изображения в AWS и обновление базы данных.
Рефакторинг кода 1:56:04 Рефакторинг DTO для добавления идентификатора изображения профиля. Исправление ошибок компиляции, связанных с DTO.
Тестирование системы 1:59:20 Запуск тестов для проверки работы системы. Исправление ошибок компиляции, связанных с DTO, и повторное тестирование.
Анализ ошибок тестирования 2:00:22 Анализ ошибок отображения строк, обнаружение проблемы с паролем. Добавление пароля в DTO и повторное тестирование.
Завершение тестирования 2:04:01 Запуск всех тестов, включая интеграционные. Подтверждение успешного прохождения тестов.
Важность тестирования 2:05:42 Подчёркивание важности тестирования кода. Сравнение с безопасностью самолёта и необходимость тестирования программного обеспечения. Анонс курса «Полный стек» для более глубокого изучения тестирования.
Начало тестирования 2:07:10 Открытие терминала и выполнение команды `git checkout main`. Демонстрация множества тестов в папке `tests`. Упоминание о проведённых интеграционных тестах в разделах «Путешествие» и «Заказчик».
Проблемы с тестированием 2:08:08 Попытка запуска тестов сталкивается с проблемами. Решение проблемы путём аннулирования кэшей и перезапуска проекта.
Важность тестирования 2:09:15 Подчёркивание важности тестирования в любом приложении. Рекомендация изучить тестирование для лучшего понимания процесса.
Поддельная реализация для тестирования 2:10:09 Создание поддельной реализации для модульного тестирования. Хранение изображений в локальной файловой системе.
Настройка приложения для работы с большими файлами 2:10:51 Настройка приложения в YAML для работы с файлами большего размера. Указание максимального размера файла, запроса и объёма памяти. Значения по умолчанию: максимальный размер запроса — 1 МБ, файла — 10 МБ, объём памяти — 256 КБ.
Обновление профиля пользователя 2:12:03 Добавление возможности обновления профиля пользователя. Демонстрация процесса обновления фотографии профиля.
Использование React Drop Zone 2:13:10 Установка библиотеки React Drop Zone для загрузки файлов. Объяснение простоты использования библиотеки.
Реализация компонента Drop Zone 2:16:03 Добавление компонента Drop Zone в форму обновления клиента. Использование хука для реализации зоны перетаскивания файлов.
Тестирование компонента 2:18:23 Проверка работы компонента Drop Zone в веб-браузере. Возможность перетаскивания или выбора изображения через окно проводника.
Настройка компонента в IntelliJ 2:19:21 Преобразование изображения из div в прямоугольник с помощью Chakra UI. Увеличение ширины прямоугольника до 100%. Выравнивание текста по центру.
Добавление рамки и отступов 2:20:20 Вставка рамки и настройка её цвета на серый. Добавление отступов с значением 6. Настройка радиуса границы.
Работа с v-stack 2:21:18 Использование v-stack для организации элементов. Добавление интервалов и отступов внутри v-stack. Сохранение изменений и проверка результата.
Добавление изображения 2:22:18 Использование изображения из Chakra. Настройка границы и радиуса изображения. Установка размера изображения на 150 пикселей. Добавление src для изображения.
Проверка в Chrome 2:23:12 Проверка отображения пустого круга в Chrome. Загрузка и сохранение изображения на сервере.
Загрузка изображения на сервер 2:23:37 Перетаскивание или выбор изображения для загрузки на сервер. Изображение сохраняется в S3 или локальную файловую систему в зависимости от реализации. Открытие проекта в IntelliJ, выбор служб и клиента.
Передача информации в API 2:24:36 Использование блока «попробуйте и поймайте» для обработки ошибок. Передача данных формы и заголовков в качестве полезной нагрузки. Получение токена через «authconfig».
Обработка данных формы 2:26:37 Формирование данных формы из нескольких частей. Указание клиента в данных формы. Обработка ошибок с помощью «throw e».
Загрузка файла в рабочей зоне 2:27:36 Открытие формы «Обновить клиента» и загрузка файла. Использование метода «загрузить» для обработки файла. Передача идентификатора пользователя и заполнение формы.
Создание объекта formData 2:28:32 Создание объекта formData для обработки файла. Захват первого файла из принятых файлов. Передача идентификатора клиента в качестве реквизита.
Обработка ответов API 2:30:06 Обработка успешного завершения операции. Отображение уведомления об успешном завершении. Обработка ошибок и отображение уведомления об ошибке.
Тестирование загрузки изображения 2:32:11 Проверка сохранения изображения в базе данных. Проверка идентификатора изображения в S3. Открытие изображения в проводнике.
Обновление карточки клиента 2:35:37 Получение URL-адреса изображения профиля клиента. Импорт URL-адреса в форму «Обновить список клиентов». Обновление карточки клиента с изображением.
Отображение изображения в карточке клиента 2:37:36 Добавление изображения в аватар карточки клиента. Передача идентификатора пользователя в src для аватара. Проверка отображения изображения после обновления страницы.
Обновление клиента 2:38:58 Использование метода привлечения клиентов. Передача запроса на получение клиентов. Запись кода в новой строке.
Тестирование изменений 2:39:59 Вызов функции «Выборка» после успешной загрузки. Исправление ошибок в JavaScript. Обновление изображения на странице.
Работа с изображением профиля 2:41:25 Получение массива байтов вместо изображения. Изменение типа носителя в customer controller. Перезагрузка серверной части.
Внедрение изменений 2:43:40 Фиксация изменений в IntelliJ. Запуск конвейера CI/CD. Развёртывание приложения на AWS Amplify.
Тестирование интеграционного теста 2:45:44 Ошибка при прохождении теста. Исправление формата изображения с JSON на JPEG. Повторное тестирование и успешное прохождение.
Тестирование развёрнутого приложения 2:48:54 Вход в приложение с новыми учётными данными. Обновление информации о клиенте. Добавление и загрузка изображения через API.
Заключение 2:52:24 Призыв к обратной связи и комментариям. Анонс профессионального курса Stack. Прощание и приглашение на следующее занятие.