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 | Приостановка и завершение работы организации | Переводим компанию между состояниями и согласуем остановку записи с фоновой очисткой. |
Продолжение: платежи и подписки. Другие курсы партии находятся в маршруте веб-продуктов.