Files
my-biz/docs/tech/user-management.md

342 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Управление пользователем (User Management)
Система пользователей, аутентификации и владения компанией.
## Обзор
Модуль управления пользователями включает регистрацию, аутентификацию и связь пользователя с компанией.
📂 **Код:** [`backend/src/MyBiz.Core/User.cs`](../../backend/src/MyBiz.Core/User.cs), [`AuthService.cs`](../../backend/src/MyBiz.Core/AuthService.cs)
---
## Архитектура
```
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ User │ ──────► │ Company │ ──────► │ BusinessUnit│
│ (пользов.) │ OwnerId │ (компания) │ Units │ (единицы) │
│ │ │ │ │ │
│ - Username │ │ - Cash │ │ - Shop │
│ - Email │ │ - Assets │ │ - Factory │
│ - Password │ │ - Buildings │ │ - Warehouse │
│ Hash │ │ - Units │ │ - Office │
│ │ │ │ │ - Lab │
└─────────────┘ └─────────────┘ └─────────────┘
┌─────────────┐
│ AuthService │
│ (аутентиф.) │
└─────────────┘
```
---
## User
**Назначение:** Пользователь системы (игрок).
📂 **Исходный код:** [`User.cs`](../../backend/src/MyBiz.Core/User.cs)
### Основные свойства
| Свойство | Тип | Описание |
|----------|-----|----------|
| `Id` | Guid | Уникальный ID пользователя |
| `Username` | string | Имя пользователя (логин) |
| `Email` | string | Email адрес |
| `PasswordHash` | string | Хеш пароля |
| `CreatedAt` | DateTime | Дата регистрации |
| `LastLoginAt` | DateTime? | Дата последнего входа |
| `IsActive` | bool | Активен ли пользователь |
| `Company` | Company? | Компания пользователя |
| `CompanyId` | Guid? | ID компании |
| `Stats` | UserStats | Статистика игры |
---
## UserStats
**Назначение:** Статистика достижений пользователя.
📂 **Исходный код:** [`User.cs`](../../backend/src/MyBiz.Core/User.cs#L54-L85)
### Свойства
| Свойство | Тип | Описание |
|----------|-----|----------|
| `GamesPlayed` | int | Всего игр сыграно |
| `TotalHoursPlayed` | int | Всего часов в игре |
| `MaxNetWorth` | decimal | Максимальная чистая стоимость |
| `TotalBuildingsBuilt` | int | Всего зданий построено |
| `FirstGameDate` | DateTime? | Дата первой игры |
| `LastGameDate` | DateTime? | Дата последней игры |
---
## AuthService
**Назначение:** Сервис аутентификации (заглушка для MVP).
📂 **Исходный код:** [`AuthService.cs`](../../backend/src/MyBiz.Core/AuthService.cs)
### Методы
| Метод | Описание |
|-------|----------|
| `Register(username, email, password, companyName)` | Регистрация нового пользователя |
| `Login(username, password)` | Вход в систему |
| `Logout(token)` | Выход из системы |
| `ValidateToken(token)` | Проверка токена |
| `GetUserById(userId)` | Получить пользователя по ID |
| `GetUserByUsername(username)` | Получить пользователя по имени |
### Возвращаемые значения
**AuthResult:**
| Свойство | Тип | Описание |
|----------|-----|----------|
| `Success` | bool | Успешна ли операция |
| `User` | User? | Пользователь (если успешно) |
| `Token` | string? | Токен доступа |
| `ErrorMessage` | string? | Сообщение об ошибке |
---
## Примеры использования
### Регистрация нового пользователя
```csharp
var authService = new AuthService();
var result = authService.Register(
username: "ivan_ivanov",
email: "ivan@example.com",
password: "SecurePassword123",
companyName: "Ivan Corp"
);
if (result.Success)
{
var user = result.User;
var token = result.Token;
Console.WriteLine($"Пользователь {user.Username} зарегистрирован!");
Console.WriteLine($"Компания: {user.Company.Name}");
Console.WriteLine($"Стартовый капитал: {user.Company.Cash}$");
}
else
{
Console.WriteLine($"Ошибка: {result.ErrorMessage}");
}
```
### Вход в систему
```csharp
var loginResult = authService.Login("ivan_ivanov", "SecurePassword123");
if (loginResult.Success)
{
var token = loginResult.Token;
// Использовать токен для авторизации запросов
}
else
{
Console.WriteLine($"Ошибка входа: {loginResult.ErrorMessage}");
}
```
### Проверка токена
```csharp
var user = authService.ValidateToken(token);
if (user != null)
{
Console.WriteLine($"Пользователь: {user.Username}");
Console.WriteLine($"Компания: {user.Company?.Name ?? "Нет компании"}");
}
else
{
Console.WriteLine("Неверный токен");
}
```
### Выход из системы
```csharp
authService.Logout(token);
```
---
## Company (обновлено)
**Назначение:** Компания игрока с бизнес-единицами.
📂 **Исходный код:** [`Company.cs`](../../backend/src/MyBiz.Core/Company.cs)
### Новые свойства
| Свойство | Тип | Описание |
|----------|-----|----------|
| `OwnerId` | Guid | ID владельца (пользователя) |
| `BusinessUnits` | List<BusinessUnit> | Бизнес-единицы компании |
| `FoundedAt` | DateTime | Дата основания |
### Новые методы
| Метод | Описание |
|-------|----------|
| `AddBusinessUnit(unit)` | Добавить бизнес-единицу |
| `RemoveBusinessUnit(unitId)` | Удалить бизнес-единицу |
| `Tick()` | Обновить все единицы (каждый тик) |
| `CalculateTotalProfit()` | Рассчитать общую прибыль |
| `CalculateAssets()` | Рассчитать стоимость активов |
### Свойства для фильтрации
| Свойство | Тип | Описание |
|----------|-----|----------|
| `Shops` | IEnumerable<Shop> | Все магазины |
| `Factories` | IEnumerable<Factory> | Все фабрики |
| `Warehouses` | IEnumerable<Warehouse> | Все склады |
---
## Примеры использования Company
### Добавление бизнес-единицы
```csharp
var company = new Company
{
Name = "My Corp",
Cash = 100000m
};
// Добавить магазин
var shop = new Shop
{
Name = "Главный магазин",
CityId = "city_1",
X = 100,
Y = 200
};
company.AddBusinessUnit(shop);
// Добавить фабрику
var factory = new Factory
{
Name = "Текстильная фабрика",
CityId = "city_1",
OutputProductId = "comp_fabric"
};
company.AddBusinessUnit(factory);
Console.WriteLine($"Магазинов: {company.Shops.Count()}");
Console.WriteLine($"Фабрик: {company.Factories.Count()}");
```
### Обновление состояния (тик)
```csharp
// Каждый тик игры:
company.Tick();
// Обновляются:
// - Эффективность единиц
// - Производственные цепочки
// - Статистика
```
### Расчёт прибыли
```csharp
var shop1 = new Shop
{
LastPeriodIncome = 10000m,
LastPeriodExpenses = 7000m
};
var shop2 = new Shop
{
LastPeriodIncome = 15000m,
LastPeriodExpenses = 10000m
};
company.AddBusinessUnit(shop1);
company.AddBusinessUnit(shop2);
var totalProfit = company.CalculateTotalProfit();
// (10000 - 7000) + (15000 - 10000) = 8000m
```
---
## Тесты
📂 **Код:** [`backend/tests/MyBiz.Tests/UserTests.cs`](../../backend/tests/MyBiz.Tests/UserTests.cs)
### UserTests
| Тест | Описание |
|------|----------|
| `User_Creation_ShouldInitializeProperties` | Создание пользователя |
| `User_Company_Assignment_ShouldWork` | Назначение компании |
| `UserStats_ShouldInitializeDefaults` | Инициализация статистики |
### AuthServiceTests
| Тест | Описание |
|------|----------|
| `AuthService_Register_ShouldCreateUser` | Регистрация пользователя |
| `AuthService_Register_DuplicateUsername_ShouldFail` | Дубликат имени |
| `AuthService_Login_CorrectCredentials_ShouldSucceed` | Успешный вход |
| `AuthService_Login_WrongPassword_ShouldFail` | Неверный пароль |
| `AuthService_Login_NonExistentUser_ShouldFail` | Несуществующий пользователь |
| `AuthService_Logout_ShouldInvalidateToken` | Выход из системы |
| `AuthService_ValidateToken_ValidToken_ShouldReturnUser` | Проверка токена |
| `AuthService_GetUserById_ShouldReturnUser` | Поиск по ID |
### BusinessUnitTests
| Тест | Описание |
|------|----------|
| `BusinessUnit_Creation_ShouldInitializeProperties` | Создание единицы |
| `BusinessUnit_HireEmployee_ShouldIncreaseCount` | Найм сотрудника |
| `BusinessUnit_FireEmployee_ShouldDecreaseCount` | Увольнение |
| `BusinessUnit_Upgrade_ShouldIncreaseLevel` | Повышение уровня |
| `BusinessUnit_UpdateEfficiency_*` | Расчёт эффективности |
### ShopTests, FactoryTests, WarehouseTests, ResearchLabTests
| Тест | Описание |
|------|----------|
| `*_Creation_ShouldInitializeDefaults` | Инициализация |
| `*_Calculation_ShouldBeCorrect` | Расчёты |
| `*_AddToInventory/*_RemoveFromInventory` | Операции с запасами |
### CompanyBusinessUnitTests
| Тест | Описание |
|------|----------|
| `Company_AddBusinessUnit_ShouldAddToList` | Добавление единицы |
| `Company_Shops_Filter_ShouldReturnOnlyShops` | Фильтрация магазинов |
| `Company_CalculateTotalProfit_ShouldSumAllUnits` | Расчёт прибыли |
| `Company_Tick_ShouldUpdateAllUnits` | Обновление состояния |
---
## Связанные документы
- [Ядро](core.md) — базовые классы
- [Бизнес-единицы](business-units.md) — детальное описание единиц
- [Здания](buildings.md) — типы зданий
---
**Последнее обновление:** 21.02.2026