Добавляем в приложение возможность читать файлы .env
Создаём файл конфигурации окружения .env
корень проекта > .env
Далее нужно создать интерфейс для получения значения из конфигурации окружения
config > config.service.interface.ts
И тут реализуем сам сервис по получению данных из файла конфига окружения
config > config.service.ts
Добавляем новый символ тайп по нашему сервису
types.ts
Инжектим сервис в приложение
app.ts
И инжектим в сервис пользователя, так как в нём мы генерируем новый пароль (нам нужен тут параметр SALT)
users.service.ts
И тут же биндим наш новый сервис в контейнер модулей приложения
main.ts
И тут мы видим, что у нас вызывается два разных инстанса одного класса, что может быть довольно опасно
Чтобы исправить проблему, нужно перевести конкретно данный класс в синглтон, что позволит нам инстанциировать ровно один раз одну копию класса (то есть, она всегда буде одинакова). Чтобы сделать это, нужно при биндинге указать дополнительным методом inSingletonScope(), что нам нужно иметь именно один конкретный инстанс класса
Тут меняем метод генерации пароля на получение соли (salt) извне
user.entity.ts
А тут получаем из ConfigService через метод get определённое значение нашего .env файла, а конкретно параметра SALT. Далее новому пользователю устанавливаем пароль
users.service.ts
И теперь после отправки запроса на сервер, можно увидеть полученные данные из .env
Для написания запросов и построения моделей баз данных будет использоваться Prism ORM. Она позволяет прямо из кода приложения описать нашу базу данных и взаимодействовать с ней.
Конкретно в курсе будет использоваться SQLite + Prism ORM
Первым делом, нужно установить призму
Далее настроим плагин в VSCode для призмы
.vscode > settings.json
После последней команды терминала у нас появляется папка prisma, в которой находится файл схемы призмы. Тут мы формируем саму модель работы призмы.
Первым делом делаем коннект в db к нужной базе данных и к файлу, в которой будет храниться база.
Далее нужно создать модель пользователя в UserModel, где укажем нужные поля под его данные
schema.prisma
Дальше произведём первую миграцию, при которой у нас создастся файл БД
Каждой миграции даётся своё имя
И мы имеем примерно такую структуру после миграции:
Уберём базы и окружение из отслеживания гита (так как там может храниться важная информация)
.gitignore
Так же отдельно вынесем команду, которая будет генерировать типы нашей сформированной базы данных
package.json
После срабатывания данной команды генерации типов, описанные в схеме модели конвертируются в типы, которые мы можем использовать в проекте
Сейчас нам нужно привязать сервис призмы к нашему приложению через DI
types.ts
main.ts
app.ts
И тут уже представлена сама реализация функции нашего сервиса по работе с призмой
database > prisma.service.ts
Лог о подключении к базе данных
086 Репозиторий users
Далее нам нужно реализовать репозиторий, который будет общаться с базой данных, записывать новых и получать старых пользователей системы.
Первым делом, нам нужно реализовать интерфейс, который будет представлять наш репозиторий.
Метод create на вход получает определённую entity и на выходе через определённый промежуток получает модель из базы.
Метод find будет искать пользователя по его почте.
users.repository.interface.ts
И далее тут реализуем из интерфейса саму работу с БД через репозиторий
users.repository.ts
Так же нужно сказать, что мы можем выполнять над моделью пользователя все те действия, которые нам могут потребоваться: обновить, удалить, добавить, посчитать и так далее
Ну и сейчас нужно забиндить наш UsersRepository в DI, чтобы иметь доступ к инстансу класса при инициализации в конструкторе
Далее же нам требуется изменить логику работы UserService, чтобы он возвращал не пользователя, а модель пользователя из базы данных
Тут уже при отправке запроса на сервер, мы сначала проверяем в existedUser, что у нас нет данного пользователя в базе, и если его нет, то в конечном return вызываем метод create() для создания нового пользователя
users.service.ts
Так же добавим вывод id пользователя в запросе
users.controller.ts
Этим запросом мы создали пользователя и записали в БД
При повторной отправке запроса у нас выпадает ошибка
И так же у нас присутствует инкрементированность id для новых пользователей
087 Упражнение - Логин пользователя
Первым делом нужно накинуть декораторы внутри класса-интерфейса, которые будут проверять получаемые значения
users > dto > user-login.dto.ts
В отдельную сущность пользователя сначала добавляем возможность передать пароль. Далее добавляем метод для сравнения паролей compare() из библиотеки bcryptjs
user.entity.ts
В сервисах пользователя реализуем валидацию данных, где мы сначала находим пользователя в базе по почте, а затем уже только проверяем пароль на соответствие
users.service.ts
Уже в контроллере пользователя добавляем middlewares для обработки данных логина.
Далее реализуем асинхронный метод логина пользователя, который будет возвращать ответ о статусе логина.
users.controller.ts
Если передать несуществующего пользователя, то получим ошибку
Если мы передадим существующего пользователя, то мы получим удовлетворительный ответ от сервера