Перейти к содержанию

SaaS для нескольких компаний: ASP.NET Core + PostgreSQL

Построим локальное «Пространство» для компаний «Север» и «Юг»: от модели членства до изолированных данных, составных связей, RLS, фонового экспорта и жизненного цикла. Один пользователь может иметь разные роли в разных компаниях, а каждый запрос получает проверенную область.

Для чтения нужны основы C#, HTTP, SQL и транзакций. Зафиксированы ASP.NET Core/.NET 10, Npgsql 10.0.0 и PostgreSQL 18. В архиве исходников есть целые файлы завершённого проекта и README с конфигурацией. Это одно итоговое состояние; уроки последовательно объясняют его части.

Учебное приложение, SQL, HTTP-запросы и фоновые процессы при подготовке не запускались (not_run). Тесты, установка, коммит и публикация учебного приложения не выполнялись. Примеры ответа являются ожидаемыми, скриншоты фактического интерфейса не заявляются.

Оглавление

№ Урок Результат
1 Организация как граница данных Разделяем пользователя, организацию и доступ к данным в проекте «Пространство».
2 Каркас ASP.NET Core и соединение с PostgreSQL Создаём локальный API с явной конфигурацией и пулом соединений Npgsql.
3 Таблицы организаций, членства и проектов Создаём общую схему с явной принадлежностью строк и стабильными исходными данными.
4 Доверенный контекст выбранной компании Проверяем личность и членство до доступа к данным организации.
5 Выборки только внутри своей организации Ограничиваем список, поиск объекта и счётчик одним доверенным контекстом.
6 Создание и изменение без смены владельца Назначаем организацию на сервере и ограничиваем изменения составным условием.
7 Составной внешний ключ для связанных объектов Не позволяем задаче одной компании ссылаться на проект другой.
8 Роли участников и права отдельных операций Разделяем просмотр, изменение проектов и управление составом организации.
9 Приглашение с ограниченным сроком действия Добавляем участника через одноразовый токен и подтверждённый адрес личности.
10 Версия проекта и конфликт двух изменений Предотвращаем потерю сохранённого изменения через ожидаемую версию строки.
11 Row-Level Security как дополнительная защита Добавляем политики PostgreSQL для чтения и записи строк своей организации.
12 Контекст PostgreSQL внутри транзакции Назначаем организацию локально и не переносим её через пул соединений.
13 Компания в фоновом задании Передаём область в очередь и обрабатываем повторное получение задания безопасно.
14 Аудит завершённых действий организации Сохраняем историю в одной транзакции с изменением и ограничиваем её компанией.
15 Частный экспорт данных компании Формируем согласованный снимок и проверяем право получения готового результата.
16 Приостановка и завершение работы организации Переводим компанию между состояниями и согласуем остановку записи с фоновой очисткой.

Продолжение: платежи и подписки. Другие курсы партии находятся в маршруте веб-продуктов.