Проект сделан на основе стэка: Nest.js, PostgreSQL, Docker, RedisStore, CacheManager
Простой интернет-магазин со следующими функциями:
- Авторизация с помощью JWT token, а именно, Access token и refresh token.
- Наличие различных ролей для пользователей: User, Manager, Moderator, Admin.
- Функционал пользователей:
- Стандартный CRUD.
- Активация и деактивация пользователей (если пользователь хочет удалить аккаунт,
то пользователь меняет статус аккаунта на
false
, тем самым лишь деактивирует аккаунт, удалить аккаунт может только Admin) - Назначение ролей.
- Отдельные получения списков всех пользователей, только
users
, толькоmoderators
, толькоmanagers
, толькоadmin
.
- Сессия пользователя, которая базируется на Redis. Таким образом некоторые данные пользователя можно достать из JWT, а некоторые данные из сессии.
- Кэширование данных с помощью RedisStore и CacheManager.
- Загрузка и удаление данных в формате PDF, DWG (чертежи AutoCAD) и Excel. Также доступна функция загрузки одновременно всех форматов.
- CRUD операции продуктов.
- CRUD операции итемов - единица продукта, которая добавляется в корзину пользователя (итем состоит из самого продукта и его количества, которое пользователь намерен купить)
- CRUD операции ссылок - единица по которой находится один заказ пользователя. Пользователь может иметь несколько заказов и иметь к ним дсотуп в любое время, таким образом формируя историю.
- CRUD операции заказов - сформированый заказ, который может быть оплачен.
- Swagger документация ряда элементов.
Приложение можно запустить с помощью 3 различных видов:
- Перейти по ссылке на Heroku и подёргать за эндпоинты.
- Перейти по ссылке Git Actions и развернуть docker-compose e
Где:
dist
- финальная сборка проекта с js и d.ts файлами.objects
- статические папки в которых хранятся чертежи и спецификации по проектам.public
- статические файлы в которых хранятся фотографии пользователей.src
- серверный код программы.configs
- конфигурации по подключениям к базам данных или внешним API.core
- модули, функции, декораторы и так далее, которые используются по всему проекту.modules
- отдельные модули, которые словно кирпичики создают само приложение.auth
- модуль авторизации. Базируется наentity
пользователей.files
- модуль работы с различными файлами, будто чертежи, эксель файлы или фото.item
- основная единица заказа, которая состоит из продукта (модуль продуктов) и его количества.link
- модуль ссылок, который определяет доступ к заказам пользователя.order
- модуль заказов.product
- модуль продуктовsession
- модуль сессий, мог бы быть в папкеcore
, вопрос не принципиальный.user
- модуль пользователей.
Белой нитью сквозь проект проходят такие понятия как:
- декоратор ролей: в зависимости от роли пользователя он может получить доступ к различным ресурсам.
- JWT стратегии: идентификация пользователя на пути ко всем маршрутам.
- Перехватчики или Interceptors - то, что отвечает за обработку кэширования или загрузки файлов.
- Собственно само кеширование: представлено Redis - CacheManager
- Swagger декораторы, для автоматического формирования API документации.
- Валидация data transfer object and etc.
Здесь описываются основные модули приложения, поскольку они описывают реализацию основных механизмов.
Где:
dto
- типизация данных, которые приходят в те или иные маршруты. Под каждый маршрут, где сервер принимает данные есть свой dto.response
- типизация ответов, которые сервер отдаёт на клиент. Ситуация с маршрутами аналогична dto.startegy
- каждый тип авторизации является отдельно стратегией - условной дорожной картой, по которому пользователя тащат, чтобы он авторизовался.type
- созданные типы для использования в различных методах сервиса авторизации.
Модуль авторизации обеспечивает маршруты регистрации, логирования, разлогирования, а также обновления JWT токенов.
Структура данных аналогична модулю авторизации.
Модуль файлов позволяет пользователям загружать файлы по проектам,
удалять их, а также их просматривать и скачивать. Отдельно модуль файлов обеспечивает загрузку фотографий профилей пользователя.
Структура данных аналогична модулю авторизации.
Модуль айтемов являет собой боевую единицу в заказе. Поскольку PostgreSQL является таблице ориентированной базой данной, следовательно
не поддерживает вложенность файлом поэтому для структур, где требуется вложенность - необходима отдельная таблица, которая завязывается на связях.
Стратегия создания единицы заказа следующая: есть товар (модуль продуктов), который при добавлении в заказ, добавляется не в заказ, а в таблицу айтемов, где каждый айтем являет собой ID продукта и количество таких IDшников - amount. Когда пользователь добавляет товар - программа сверяет - если такой товар есть, то в amount + 1, если товара нет - добавляется соответствующий АйДишник товара. Удаление продуктов работает ровно на оборот. Удаление можно также организовать через получение всех итемов и после этого с помощью метода Filter отфильтровать нужные итемы.
Структура данных аналогична модулю авторизации.
Модуль ссылок необходим, чтобы вывести данные об итемах, по сути являет собою стандартную корзину, но с одной фичей - наличивает ссылку на корзину.
Эта ссылка необходима, чтобы подтверждать заказ, отправлять ссылку на заказ на почту и многое другое.
Структура данных аналогична модулю авторизации.
Модуль заказа в себе определяет - пользователя, который достаётся из сессии пользователя, списка итемов по ссылке и адрес доставки
Весь список заказов в зависимости от роли пользователя может получить как сам пользователь - из его сессии, так и список всех заказов по ID пользователя - если ищет пользователь с ролью администратора или модератора.
Непосредственно сам модуль продуктов, может являть собой различную иерархию по категориям, критериям и прочее, но является намеренно упрощенной версией, поскольку мне уже известно как это реализовать на других проектах. Здесь лишь реализованы такие вещи, как пагинация, сортировка и другие элементы работы с массивом продуктов.
Обширный модуль, который в себя впитал всю работу с пользователями:
- получение всех пользователей.
- одного пользователя.
- редактирования профиля пользователя.
- деактивация и реактивация пользователя.
- непосредственно удаление аккаунта пользователя, которая возможна лишь админу.
- получение списка пользователей по их ролям.
- смена роли пользователя администратором (по умолчанию все пользователи -
user
).
Nest is MIT licensed.