Первый коммит: модульный монолит ядра (.NET 10) и gRPC-сервисы ai/ml/telegram, фронтенд Vue 3/Vite/Tailwind, документация (ТЗ, инструкция пользователя, техдокументация, код-стайл), бэклог, скрипты развёртывания и архив прототипа LeadRadar.
32 lines
2.1 KiB
C#
32 lines
2.1 KiB
C#
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);
|