Переписаны модули, тесты, обработка ошибок

This commit is contained in:
Халимов Рустам
2026-03-10 21:08:03 +03:00
parent 5c9c6ab975
commit 4e06e48657
126 changed files with 6549 additions and 803 deletions

View File

@@ -7,6 +7,7 @@ using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Routing;
using Nashel.Modules.Order.Application.Commands;
using Nashel.Modules.Order.Application.Queries;
using Nashel.Modules.Order.Domain.Entities;
using Nashel.Modules.Order.Domain.Enums;
namespace Nashel.Modules.Order.Presentation;
@@ -78,9 +79,9 @@ public static class OrderEndpoints
});
// ─── Принять заказ (мастер) ──────────────────────────────────────────────────
group.MapPost("/{id:guid}/accept", async (Guid id, AcceptOrderRequest request, ISender sender) =>
group.MapPost("/{id:guid}/accept", async (Guid id, ISender sender) =>
{
var command = new AcceptOrderCommand(id, request.PerformerId);
var command = new AcceptOrderCommand(id);
await sender.Send(command);
return Results.Ok();
})
@@ -91,18 +92,104 @@ public static class OrderEndpoints
Description = "Исполнитель принимает заказ. Переводит заказ в статус «В работе»."
});
// ─── Завершить заказ ─────────────────────────────────────────────────────────
group.MapPost("/{id:guid}/complete", async (Guid id, CompleteOrderRequest request, ISender sender) =>
// ─── Пометить выполненным (мастер) ──────────────────────────────────────────
group.MapPost("/{id:guid}/finish", async (Guid id, FinishOrderRequest request, ISender sender) =>
{
var command = new CompleteOrderCommand(id, request.RequesterId);
var command = new FinishOrderCommand(id, request.PerformerId);
await sender.Send(command);
return Results.Ok();
})
.WithName("CompleteOrder")
.WithName("FinishOrder")
.WithOpenApi(op => new(op)
{
Summary = "Завершить заказ",
Description = "Заказчик или исполнитель завершает заказ. Переводит в статус «Завершён»."
Summary = "Завершить работу (мастер)",
Description = "Исполнитель помечает работу как выполненную. Заказ переходит в статус подтверждения заказчиком."
});
// ─── Подтвердить выполнение (заказчик) ───────────────────────────────────────
group.MapPost("/{id:guid}/confirm", async (Guid id, ConfirmOrderCompletionRequest request, ISender sender) =>
{
var command = new ConfirmOrderCompletionCommand(id, request.CustomerId);
await sender.Send(command);
return Results.Ok();
})
.WithName("ConfirmOrderCompletion")
.WithOpenApi(op => new(op)
{
Summary = "Подтвердить выполнение (заказчик)",
Description = "Заказчик подтверждает, что работа выполнена успешно. Статус заказа становится «Завершён»."
});
// ─── Открыть спор (заказчик) ──────────────────────────────────────────────────
group.MapPost("/{id:guid}/dispute", async (Guid id, OpenDisputeRequest request, ISender sender) =>
{
var command = new OpenOrderDisputeCommand(
id,
request.CustomerId,
request.Reason,
request.Description,
request.ProposedSolution,
request.Evidence);
await sender.Send(command);
return Results.Ok();
})
.WithName("OpenOrderDispute")
.WithOpenApi(op => new(op)
{
Summary = "Открыть спор",
Description = "Заказчик открывает спор, если работа выполнена некачественно или не в полном объеме."
});
// ─── Ответить на спор (мастер) ───────────────────────────────────────────────
group.MapPost("/{id:guid}/dispute/respond", async (Guid id, RespondToDisputeRequest request, ISender sender) =>
{
var command = new RespondToOrderDisputeCommand(
id,
request.PerformerId,
request.Position,
request.Evidence,
request.CounterSolution);
await sender.Send(command);
return Results.Ok();
})
.WithName("RespondToDispute")
.WithOpenApi(op => new(op)
{
Summary = "Ответить на спор",
Description = "Исполнитель предоставляет свою позицию и доказательства в рамках открытого спора."
});
// ─── Возразить на ответ исполнителя (заказчик) ──────────────────────────────
group.MapPost("/{id:guid}/dispute/rebut", async (Guid id, RebutDisputeRequest request, ISender sender) =>
{
var command = new RebutDisputeCommand(
id,
request.CustomerId,
request.Comment,
request.Evidence,
request.CounterSolution);
await sender.Send(command);
return Results.Ok();
})
.WithName("RebutDispute")
.WithOpenApi(op => new(op)
{
Summary = "Возразить на ответ исполнителя",
Description = "Заказчик добавляет новые доказательства или требования в ответ на позицию исполнителя."
});
// ─── Принять условия спора (заказчик) ──────────────────────────────────────
group.MapPost("/{id:guid}/dispute/accept", async (Guid id, AcceptDisputeTermsRequest request, ISender sender) =>
{
var command = new AcceptDisputeTermsCommand(id, request.CustomerId);
await sender.Send(command);
return Results.Ok();
})
.WithName("AcceptDisputeTerms")
.WithOpenApi(op => new(op)
{
Summary = "Принять условия спора",
Description = "Заказчик принимает предложенное исполнителем решение. Заказ завершается."
});
// ─── Отменить заказ ──────────────────────────────────────────────────────────
@@ -199,15 +286,9 @@ public record CreateOrderRequest
}
/// <summary>
/// Запрос принятия заказа исполнителем.
/// Запрос принятия заказа исполнителем (Пустой, так как ID берется из токена).
/// </summary>
public record AcceptOrderRequest
{
/// <summary>Идентификатор исполнителя, принимающего заказ.</summary>
public Guid PerformerId { get; init; }
public AcceptOrderRequest() { }
}
public record AcceptOrderRequest();
/// <summary>
/// Запрос завершения заказа.
@@ -264,3 +345,45 @@ public record SelectPerformerRequest
public SelectPerformerRequest() { }
}
/// <summary>
/// Запрос пометки выполнения заказа.
/// </summary>
public record FinishOrderRequest(Guid PerformerId);
/// <summary>
/// Запрос подтверждения выполнения.
/// </summary>
public record ConfirmOrderCompletionRequest(Guid CustomerId);
/// <summary>
/// Запрос открытия спора.
/// </summary>
public record OpenDisputeRequest(
Guid CustomerId,
DisputeReason Reason,
string Description,
string ProposedSolution,
List<string> Evidence);
/// <summary>
/// Запрос ответа на спор.
/// </summary>
public record RespondToDisputeRequest(
Guid PerformerId,
string Position,
List<string> Evidence,
string? CounterSolution);
/// <summary>
/// Запрос на возражение по спору.
/// </summary>
public record RebutDisputeRequest(
Guid CustomerId,
string Comment,
List<string> Evidence,
string? CounterSolution);
/// <summary>
/// Запрос на принятие условий спора.
/// </summary>
public record AcceptDisputeTermsRequest(Guid CustomerId);