Инициализировать репозиторий «Дейл»

Первый коммит: модульный монолит ядра (.NET 10) и gRPC-сервисы
ai/ml/telegram, фронтенд Vue 3/Vite/Tailwind, документация (ТЗ,
инструкция пользователя, техдокументация, код-стайл), бэклог,
скрипты развёртывания и архив прототипа LeadRadar.
This commit is contained in:
Rustam Khalimov
2026-09-11 02:50:17 +03:00
commit 9e07568ddd
1402 changed files with 177470 additions and 0 deletions
@@ -0,0 +1,31 @@
namespace Deal.Modules.Kanban.Application.Models;
/// <summary>
/// Частичная правка карточки (ICardStore.PatchCardAsync; 1:1 patch_card projects.py L159–187).
/// </summary>
/// <remarks>
/// Значение null у поля означает «поле не меняется» (конвенция ContainerPatchDto); пустая строка или
/// пустой массив — осмысленное значение и применяется. JSON-поля (stack/comments/links/files) заменяются
/// ЦЕЛИКОМ, не сливаясь с текущими значениями. budget — объект {from,to,cur} либо null = «не менять»;
/// явная очистка бюджета телом PATCH передаётся объектом с пустой Cur (BudgetCur пуст = «бюджета нет»;
/// хранилище пишет from/to=null и cur="", наружу бюджет снова null). Наружу сериализуется в camelCase.
/// </remarks>
/// <param name="Title">Новый заголовок.</param>
/// <param name="Summary">Новое краткое содержание.</param>
/// <param name="Contact">Новая контактная строка.</param>
/// <param name="TzText">Новый текст технического задания.</param>
/// <param name="Stack">Новый стек (полная замена массива).</param>
/// <param name="Budget">Новый бюджет (полная замена from/to/cur).</param>
/// <param name="Comments">Новый массив комментариев (полная замена).</param>
/// <param name="Links">Новый массив ссылок (полная замена).</param>
/// <param name="Files">Новый массив файлов (полная замена).</param>
public sealed record CardPatch(
string? Title,
string? Summary,
string? Contact,
string? TzText,
IReadOnlyList<string>? Stack,
CardBudgetDto? Budget,
IReadOnlyList<CardCommentDto>? Comments,
IReadOnlyList<CardLinkDto>? Links,
IReadOnlyList<CardFileDto>? Files);