feat(dal, api): в таблицах Process, Subprocess, Tnks, Works поле EsppId - уникальное. Обновлены соответсвующе контроллеры (валидация esppId), добавлены методы удаления если нет дочерних элементов.

This commit is contained in:
Mikhail Trubnikov
2024-05-20 11:38:48 +10:00
parent bd77db7b78
commit 6f845635c5
15 changed files with 2932 additions and 155 deletions

View File

@@ -46,40 +46,6 @@ namespace PARR.API.Controllers.V1
}
/// <summary>
/// Создать процесс
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[HttpPost(ApiRoutes.Process.Create)]
public async Task<IActionResult> Create([FromBody] ProcessRequest request)
{
var resultValidate = await validator.ValidateAsync(request);
if (!resultValidate.IsValid)
return BadRequest(new Response(resultValidate.Errors));
var existName = await processService.Get().FirstOrDefaultAsync(t => t.Name == request.Name);
if (existName != null)
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { FieldName = nameof(request.Name), Message = $"Процесс с именем \"{request.Name}\" уже существует." } }));
var process = new Process
{
Id = Guid.NewGuid(),
Name = request.Name,
EsppId = request.EsppId
};
if (!await processService.CreateAsync(process) || !await processService.CommitAsync())
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = "Ошибка при записи нового процесса в базу данных" } }));
logger.LogInformation($"Пользователь {User.Identity?.Name} добавил процесс: {process.Name}, {process.EsppId}");
var locationUri = uriService.GetUri(ApiRoutes.Process.Get, ApiRoutes.Process.getParam, process.Id);
return Created(locationUri, new Response<ProcessResponse>(mapper.Map<ProcessResponse>(process), true));
}
/// <summary>
/// Список процессов постранично
/// </summary>
@@ -146,6 +112,44 @@ namespace PARR.API.Controllers.V1
}
/// <summary>
/// Создать процесс
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[HttpPost(ApiRoutes.Process.Create)]
public async Task<IActionResult> Create([FromBody] ProcessRequest request)
{
var resultValidate = await validator.ValidateAsync(request);
if (!resultValidate.IsValid)
return BadRequest(new Response(resultValidate.Errors));
var existName = await processService.Get().FirstOrDefaultAsync(t => t.Name.ToLower() == request.Name.ToLower().Trim());
if (existName != null)
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { FieldName = nameof(request.Name), Message = $"Процесс с именем \"{request.Name}\" уже существует." } }));
var existEsppId = await processService.Get().FirstOrDefaultAsync(t => t.EsppId == request.EsppId);
if (existEsppId != null)
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { FieldName = nameof(request.EsppId), Message = $"Процесс с EsppId: {request.EsppId} уже существует." } }));
var process = new Process
{
Id = Guid.NewGuid(),
Name = request.Name.Trim(),
EsppId = request.EsppId
};
if (!await processService.CreateAsync(process) || !await processService.CommitAsync())
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = "Ошибка при добавлении процесса." } }));
logger.LogInformation($"Пользователь {User.Identity?.Name} добавил процесс: {process.Name}, {process.EsppId}");
var locationUri = uriService.GetUri(ApiRoutes.Process.Get, ApiRoutes.Process.getParam, process.Id);
return Created(locationUri, new Response<ProcessResponse>(mapper.Map<ProcessResponse>(process), true));
}
/// <summary>
/// Обновить процесс
/// </summary>
@@ -159,17 +163,21 @@ namespace PARR.API.Controllers.V1
if (!resultValidate.IsValid)
return BadRequest(new Response(resultValidate.Errors));
var orig = await processService.Get()
.FirstOrDefaultAsync(t => t.Id == id);
//проверка на уникальность esppId
var existEsppId = await processService.Get().FirstOrDefaultAsync(t => t.Id != id && t.EsppId == request.EsppId);
if (existEsppId != null)
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { FieldName = nameof(request.EsppId), Message = $"Уже есть процесс с EsppId: {request.EsppId}" } }));
var orig = await processService.Get().FirstOrDefaultAsync(t => t.Id == id);
if (orig == null)
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при изменении процесса. Не найден процесс Id: {id}" } }));
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при изменении процесса." } }));
orig.Name = request.Name;
orig.Name = request.Name.Trim();
orig.EsppId = request.EsppId;
if (!await processService.CommitAsync())
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = "Ошибка записи в базу данных изменений процесса." } }));
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = "Ошибка при изменении процесса." } }));
logger.LogInformation($"Пользователь {User.Identity?.Name} обновил процесс: {orig.Id}, {orig.Name}, {orig.EsppId}");
@@ -178,24 +186,27 @@ namespace PARR.API.Controllers.V1
/// <summary>
/// Удалить подпроцесс
/// Удалить процесс (если у него нет подпроцессов)
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
//[HttpDelete(ApiRoutes.Process.Delete)]
//public async Task<IActionResult> Delete([FromRoute] Guid id)
//{
// var process = await processService.GetAsync(id);
[HttpDelete(ApiRoutes.Process.Delete)]
public async Task<IActionResult> Delete([FromRoute] Guid id)
{
var process = await processService.Get().Include(t => t.Subprocesses).FirstOrDefaultAsync(t => t.Id == id);
// if (process == null)
// return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при удалении процесса. Не найден процесс Id: {id}" } }));
if (process == null)
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при удалении процесса." } }));
// if (!processService.Delete(process) || !await processService.CommitAsync())
// return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при удалении процесса из базы данных" } }));
if (process.Subprocesses.Any())
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при удалении процесса. У данного процесса есть подпроцессы ({process.Subprocesses.Count()} шт.)" } }));
// logger.LogInformation($"Пользователь {User.Identity?.Name} удалил процесс: {process.Id}, {process.Name}, {process.EsppId}");
if (!processService.Delete(process) || !await processService.CommitAsync())
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при удалении процесса." } }));
// return NoContent();
//}
logger.LogInformation($"Пользователь {User.Identity?.Name} удалил процесс: {process.Id}, {process.Name}, {process.EsppId}");
return NoContent();
}
}
}

View File

@@ -128,20 +128,24 @@ namespace PARR.API.Controllers.V1
if (!resultValidate.IsValid)
return BadRequest(new Response(resultValidate.Errors));
var existName = await subprocessService.Get().FirstOrDefaultAsync(t => t.Name == request.Name);
var existName = await subprocessService.Get().FirstOrDefaultAsync(t => t.Name.ToLower() == request.Name.Trim().ToLower());
if (existName != null)
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { FieldName = nameof(request.Name), Message = $"Подпроцесс с именем \"{request.Name}\" уже существует." } }));
var existEsppId = await subprocessService.Get().FirstOrDefaultAsync(t => t.EsppId == request.EsppId);
if (existEsppId != null)
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { FieldName = nameof(request.EsppId), Message = $"Подпроцесс с EsppId: {request.EsppId} уже существует." } }));
var subprocess = new Subprocess
{
Id = Guid.NewGuid(),
Name = request.Name,
Name = request.Name.Trim(),
EsppId = request.EsppId,
ProcessId = request.ProcessId,
};
if (!await subprocessService.CreateAsync(subprocess) || !await subprocessService.CommitAsync())
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = "Ошибка при записи нового подпроцесса в базу данных" } }));
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = "Ошибка при добавлении подпроцесса." } }));
logger.LogInformation($"Пользователь {User.Identity?.Name} добавил подпроцесс: {subprocess.Name}, {subprocess.EsppId}, {subprocess.ProcessId}");
@@ -151,8 +155,6 @@ namespace PARR.API.Controllers.V1
}
/// <summary>
/// Обновить подпроцесс
/// </summary>
@@ -166,13 +168,17 @@ namespace PARR.API.Controllers.V1
if (!resultValidate.IsValid)
return BadRequest(new Response(resultValidate.Errors));
var orig = await subprocessService.Get()
.FirstOrDefaultAsync(t => t.Id == id);
//проверка на уникальность esppId
var existEsppId = await subprocessService.Get().FirstOrDefaultAsync(t => t.Id != id && t.EsppId == request.EsppId);
if (existEsppId != null)
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { FieldName = nameof(request.EsppId), Message = $"Уже есть подпроцесс с EsppId: {request.EsppId}" } }));
var orig = await subprocessService.Get().FirstOrDefaultAsync(t => t.Id == id);
if (orig == null)
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при изменении подпроцесса. Не найден подпроцесс Id: {id}" } }));
orig.Name = request.Name;
orig.Name = request.Name.Trim();
orig.EsppId = request.EsppId;
orig.ProcessId = request.ProcessId;
@@ -186,24 +192,27 @@ namespace PARR.API.Controllers.V1
/// <summary>
/// Удалить подпроцесс
/// Удалить подпроцесс (если у него нет ТНК)
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
//[HttpDelete(ApiRoutes.Subprocess.Delete)]
//public async Task<IActionResult> Delete([FromRoute] Guid id)
//{
// var subprocess = await subprocessService.GetAsync(id);
[HttpDelete(ApiRoutes.Subprocess.Delete)]
public async Task<IActionResult> Delete([FromRoute] Guid id)
{
var subprocess = await subprocessService.Get().Include(t=>t.Tnks).FirstOrDefaultAsync(t=>t.Id==id);
// if (subprocess == null)
// return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при удалении подпроцесса. Не найден подпроцесс Id: {id}" } }));
if (subprocess == null)
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при удалении подпроцесса." } }));
// if (!subprocessService.Delete(subprocess) || !await subprocessService.CommitAsync())
// return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при удалении подпроцесса из базы данных" } }));
if (subprocess.Tnks.Any())
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при удалении подпроцесса. У данного подпроцесса есть ТНК ({subprocess.Tnks.Count()} шт.)" } }));
// logger.LogInformation($"Пользователь {User.Identity?.Name} удалил подпроцесс: {subprocess.Id}, {subprocess.Name}, {subprocess.EsppId}, {subprocess.ProcessId}");
if (!subprocessService.Delete(subprocess) || !await subprocessService.CommitAsync())
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при удалении подпроцесса." } }));
// return NoContent();
//}
logger.LogInformation($"Пользователь {User.Identity?.Name} удалил подпроцесс: {subprocess.Id}, {subprocess.Name}, {subprocess.EsppId}, {subprocess.ProcessId}");
return NoContent();
}
}
}

View File

@@ -128,20 +128,24 @@ namespace PARR.API.Controllers.V1
if (!resultValidate.IsValid)
return BadRequest(new Response(resultValidate.Errors));
var existName = await tnkService.Get().FirstOrDefaultAsync(t => t.Name == request.Name);
var existName = await tnkService.Get().FirstOrDefaultAsync(t => t.Name.ToLower() == request.Name.Trim().ToLower());
if (existName != null)
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { FieldName = nameof(request.Name), Message = $"Вид работы с именем \"{request.Name}\" уже существует." } }));
var existEsppId = await tnkService.Get().FirstOrDefaultAsync(t => t.EsppId == request.EsppId);
if (existEsppId != null)
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { FieldName = nameof(request.EsppId), Message = $"ТНК с EsppId: {request.EsppId} уже существует." } }));
var tnk = new Tnk
{
Id = Guid.NewGuid(),
Name = request.Name,
Name = request.Name.Trim(),
EsppId = request.EsppId,
SubprocessId = request.SubprocessId,
};
if (!await tnkService.CreateAsync(tnk) || !await tnkService.CommitAsync())
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = "Ошибка при записи новой ТНК в базу данных" } }));
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = "Ошибка добавлении ТНК." } }));
logger.LogInformation($"Пользователь {User.Identity?.Name} добавил ТНК: {tnk.Name}, {tnk.EsppId}, {tnk.SubprocessId}");
@@ -164,18 +168,23 @@ namespace PARR.API.Controllers.V1
if (!resultValidate.IsValid)
return BadRequest(new Response(resultValidate.Errors));
//проверка на уникальность esppId
var existEsppId = await tnkService.Get().FirstOrDefaultAsync(t => t.Id != id && t.EsppId == request.EsppId);
if (existEsppId != null)
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { FieldName = nameof(request.EsppId), Message = $"Уже есть ТНК с EsppId: {request.EsppId}" } }));
var orig = await tnkService.Get()
.FirstOrDefaultAsync(t => t.Id == id);
if (orig == null)
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при изменении ТНК. Не найдена ТНК Id: {id}" } }));
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при изменении ТНК." } }));
orig.Name = request.Name;
orig.Name = request.Name.Trim();
orig.EsppId = request.EsppId;
orig.SubprocessId = request.SubprocessId;
if (!await tnkService.CommitAsync())
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = "Ошибка записи в базу данных изменений ТНК." } }));
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = "Ошибка при изменении ТНК." } }));
logger.LogInformation($"Пользователь {User.Identity?.Name} обновил ТНК: {orig.Id}, {orig.Name}, {orig.EsppId}, {orig.SubprocessId}");
@@ -184,24 +193,27 @@ namespace PARR.API.Controllers.V1
/// <summary>
/// Удалить ТНК
/// Удалить ТНК (если у него нет работ)
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
//[HttpDelete(ApiRoutes.Tnk.Delete)]
//public async Task<IActionResult> Delete([FromRoute] Guid id)
//{
// var tnk = await tnkService.GetAsync(id);
[HttpDelete(ApiRoutes.Tnk.Delete)]
public async Task<IActionResult> Delete([FromRoute] Guid id)
{
var tnk = await tnkService.Get().Include(t => t.Works).FirstOrDefaultAsync(t => t.Id == id);
// if (tnk == null)
// return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при удалении ТНК. Не найдена ТНК Id: {id}" } }));
if (tnk == null)
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при удалении ТНК." } }));
// if (!tnkService.Delete(tnk) || !await tnkService.CommitAsync())
// return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при удалении ТНК из базы данных" } }));
if (tnk.Works.Any())
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при удалении ТНК. У данного ТНК есть работы ({tnk.Works.Count()} шт.)" } }));
// logger.LogInformation($"Пользователь {User.Identity?.Name} удалил ТНК: {tnk.Id}, {tnk.Name}, {tnk.EsppId}, {tnk.SubprocessId}");
if (!tnkService.Delete(tnk) || !await tnkService.CommitAsync())
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при удалении ТНК." } }));
// return NoContent();
//}
logger.LogInformation($"Пользователь {User.Identity?.Name} удалил ТНК: {tnk.Id}, {tnk.Name}, {tnk.EsppId}, {tnk.SubprocessId}");
return NoContent();
}
}
}

View File

@@ -93,41 +93,6 @@ namespace PARR.API.Controllers.V1
}
/// <summary>
/// Создать вид работы
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[HttpPost(ApiRoutes.Work.Create)]
public async Task<IActionResult> Create([FromBody] WorkRequest request)
{
var resultValidate = await validator.ValidateAsync(request);
if (!resultValidate.IsValid)
return BadRequest(new Response(resultValidate.Errors));
var existName = await workService.Get().FirstOrDefaultAsync(t => t.Name == request.Name);
if (existName != null)
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { FieldName = nameof(request.Name), Message = $"Вид работы с именем \"{request.Name}\" уже существует." } }));
var work = new Work
{
Id = Guid.NewGuid(),
Name = request.Name,
EsppId = request.EsppId,
TnkId = request.TnkId,
};
if (!await workService.CreateAsync(work) || !await workService.CommitAsync())
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = "Ошибка при создании вида работ." } }));
logger.LogInformation($"Пользователь {User.Identity?.Name} добавил вид работ: {work.Name}, {work.EsppId}, {work.TnkId}");
var locationUri = uriService.GetUri(ApiRoutes.Work.Get, ApiRoutes.Work.getParam, work.Id);
return Created(locationUri, new Response<WorkResponse>(mapper.Map<WorkResponse>(work), true));
}
/// <summary>
/// Получить работу по id
/// </summary>
@@ -148,6 +113,45 @@ namespace PARR.API.Controllers.V1
}
/// <summary>
/// Создать вид работы
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[HttpPost(ApiRoutes.Work.Create)]
public async Task<IActionResult> Create([FromBody] WorkRequest request)
{
var resultValidate = await validator.ValidateAsync(request);
if (!resultValidate.IsValid)
return BadRequest(new Response(resultValidate.Errors));
var existName = await workService.Get().FirstOrDefaultAsync(t => t.Name.ToLower() == request.Name.Trim().ToLower());
if (existName != null)
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { FieldName = nameof(request.Name), Message = $"Вид работы с именем \"{request.Name}\" уже существует." } }));
var existEsppId = await workService.Get().FirstOrDefaultAsync(t => t.EsppId == request.EsppId);
if (existEsppId != null)
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { FieldName = nameof(request.EsppId), Message = $"Вид работы с EsppId: {request.EsppId} уже существует." } }));
var work = new Work
{
Id = Guid.NewGuid(),
Name = request.Name.Trim(),
EsppId = request.EsppId,
TnkId = request.TnkId,
};
if (!await workService.CreateAsync(work) || !await workService.CommitAsync())
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = "Ошибка при создании вида работ." } }));
logger.LogInformation($"Пользователь {User.Identity?.Name} добавил вид работ: {work.Name}, {work.EsppId}, {work.TnkId}");
var locationUri = uriService.GetUri(ApiRoutes.Work.Get, ApiRoutes.Work.getParam, work.Id);
return Created(locationUri, new Response<WorkResponse>(mapper.Map<WorkResponse>(work), true));
}
/// <summary>
/// Обновить вид работ
/// </summary>
@@ -161,13 +165,19 @@ namespace PARR.API.Controllers.V1
if (!resultValidate.IsValid)
return BadRequest(new Response(resultValidate.Errors));
//проверка на уникальность esppId
var existEsppId = await workService.Get().FirstOrDefaultAsync(t => t.Id != id && t.EsppId == request.EsppId);
if (existEsppId != null)
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { FieldName = nameof(request.EsppId), Message = $"Уже есть вид работ с EsppId: {request.EsppId}" } }));
var orig = await workService.Get()
.FirstOrDefaultAsync(t => t.Id == id);
if (orig == null)
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при изменении вида работ. Не найдена работа Id: {id}" } }));
orig.Name = request.Name;
orig.Name = request.Name.Trim();
orig.EsppId = request.EsppId;
orig.TnkId = request.TnkId;
@@ -181,25 +191,28 @@ namespace PARR.API.Controllers.V1
/// <summary>
/// Удалить вид работ
/// Удалить вид работ (если у него нет заданий (AppInWork))
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
//[HttpDelete(ApiRoutes.Work.Delete)]
//public async Task<IActionResult> Delete([FromRoute] Guid id)
//{
// var work = await workService.GetAsync(id);
[HttpDelete(ApiRoutes.Work.Delete)]
public async Task<IActionResult> Delete([FromRoute] Guid id)
{
var work = await workService.Get().Include(t => t.ApplicationsInWorks).FirstOrDefaultAsync(t => t.Id == id);
// if (work == null)
// return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при удалении вида работ. Не найдена работа, Id: {id}" } }));
if (work == null)
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при удалении вида работ." } }));
// if (!workService.Delete(work) || !await workService.CommitAsync())
// return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при удалении вида работ." } }));
if (work.ApplicationsInWorks.Any())
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при удалении вида работ. У данной работы есть задания ({work.ApplicationsInWorks.Count()} шт.)" } }));
// logger.LogInformation($"Пользователь {User.Identity?.Name} удалил вид работ: {work.Id}, {work.Name}, {work.EsppId}, {work.TnkId}");
if (!workService.Delete(work) || !await workService.CommitAsync())
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при удалении вида работ." } }));
// return NoContent();
//}
logger.LogInformation($"Пользователь {User.Identity?.Name} удалил вид работ: {work.Id}, {work.Name}, {work.EsppId}, {work.TnkId}");
return NoContent();
}
}
}

View File

@@ -5,13 +5,11 @@ namespace PARR.API.Validators
{
public class ProcessValidator : AbstractValidator<ProcessRequest>
{
private bool? isValid = null;
public ProcessValidator()
{
RuleFor(t => t.Name).NotEmpty().NotNull().WithMessage("Имя процесса не может быть пустым");
RuleFor(t => t.Name).NotEmpty().NotNull();
RuleFor(t => t.EsppId).NotEmpty().NotNull().WithMessage("EsppId не может быть пустым");
RuleFor(t => t.EsppId).NotEmpty().NotNull();
}
}
}

View File

@@ -15,15 +15,15 @@ namespace PARR.API.Validators
{
this.processService = processService;
RuleFor(t => t.Name).NotEmpty().NotNull().WithMessage("Имя подпроцесса не может быть пустым");
RuleFor(t => t.Name).NotEmpty().NotNull();
RuleFor(t => t.EsppId).NotEmpty().NotNull().WithMessage("EsppId не может быть пустым");
RuleFor(t => t.EsppId).NotEmpty().NotNull();
RuleFor(t => t.ProcessId).NotEmpty().NotNull().WithMessage("Подпроцесс должна быть связан с процессом. ProcessId не может быть пустым");
RuleFor(t => t.ProcessId).NotEmpty().NotNull();
RuleFor(t => t.ProcessId)
.MustAsync(async (entity, value, c) => await IsProcessExist(entity))
.WithMessage("У данного подпроцесса указан несуществующий Id процесса");
.WithMessage("Указан несуществующий Id процесса");
}
private async Task<bool> IsProcessExist(SubprocessRequest request)

View File

@@ -15,15 +15,15 @@ namespace PARR.API.Validators
{
this.subprocessService = subprocessService;
RuleFor(t => t.Name).NotEmpty().NotNull().WithMessage("Имя ТНК не может быть пустым");
RuleFor(t => t.Name).NotEmpty().NotNull();
RuleFor(t => t.EsppId).NotEmpty().NotNull().WithMessage("EsppId не может быть пустым");
RuleFor(t => t.SubprocessId).NotEmpty().NotNull().WithMessage("ТНК должна быть связана с подпроцессом. SubprocessId не может быть пустым");
RuleFor(t => t.SubprocessId).NotEmpty().NotNull();
RuleFor(t => t.SubprocessId)
.MustAsync(async (entity, value, c) => await IsSubprocessExist(entity))
.WithMessage("У данной ТНК указан несуществующий Id подпроцесса");
.WithMessage("Указан несуществующий Id подпроцесса");
}
private async Task<bool> IsSubprocessExist(TnkRequest request)

View File

@@ -16,15 +16,15 @@ namespace PARR.API.Validators
{
this.tnkService = tnkService;
RuleFor(t => t.Name).NotEmpty().NotNull().WithMessage("Имя работ не может быть пустым");
RuleFor(t => t.Name).NotEmpty().NotNull();
RuleFor(t => t.EsppId).NotEmpty().NotNull().WithMessage("EsppId не может быть пустым");
RuleFor(t => t.TnkId).NotEmpty().NotNull().WithMessage("Работа должна быть связана с ТНК. TnkId не может быть пустым");
RuleFor(t => t.TnkId).NotEmpty().NotNull();
RuleFor(t => t.TnkId)
.MustAsync(async (entity, value, c) => await IsTnkExist(entity))
.WithMessage("У данной работы указан несуществующий Id ТНК");
.WithMessage("Указан несуществующий Id ТНК");
}
private async Task<bool> IsTnkExist(WorkRequest request)

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,58 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace PARR.DAL.Migrations
{
/// <inheritdoc />
public partial class tblProcessSubTnkWorkUniqueEsppId : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateIndex(
name: "IX_Works_EsppId",
table: "Works",
column: "EsppId",
unique: true);
migrationBuilder.CreateIndex(
name: "IX_Tnks_EsppId",
table: "Tnks",
column: "EsppId",
unique: true);
migrationBuilder.CreateIndex(
name: "IX_Subprocesses_EsppId",
table: "Subprocesses",
column: "EsppId",
unique: true);
migrationBuilder.CreateIndex(
name: "IX_Processes_EsppId",
table: "Processes",
column: "EsppId",
unique: true);
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropIndex(
name: "IX_Works_EsppId",
table: "Works");
migrationBuilder.DropIndex(
name: "IX_Tnks_EsppId",
table: "Tnks");
migrationBuilder.DropIndex(
name: "IX_Subprocesses_EsppId",
table: "Subprocesses");
migrationBuilder.DropIndex(
name: "IX_Processes_EsppId",
table: "Processes");
}
}
}

View File

@@ -1539,6 +1539,9 @@ namespace PARR.DAL.Migrations
b.HasKey("Id");
b.HasIndex("EsppId")
.IsUnique();
b.ToTable("Processes");
});
@@ -1996,6 +1999,9 @@ namespace PARR.DAL.Migrations
b.HasKey("Id");
b.HasIndex("EsppId")
.IsUnique();
b.HasIndex("ProcessId");
b.ToTable("Subprocesses");
@@ -2109,6 +2115,9 @@ namespace PARR.DAL.Migrations
b.HasKey("Id");
b.HasIndex("EsppId")
.IsUnique();
b.HasIndex("SubprocessId");
b.ToTable("Tnks");
@@ -2184,6 +2193,9 @@ namespace PARR.DAL.Migrations
b.HasKey("Id");
b.HasIndex("EsppId")
.IsUnique();
b.HasIndex("TnkId");
b.ToTable("Works");

View File

@@ -1,10 +1,12 @@
using PARR.DAL.Models.Base;
using Microsoft.EntityFrameworkCore;
using PARR.DAL.Models.Base;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace PARR.DAL.Models
{
[Table("Processes")]
[Index(nameof(EsppId), IsUnique = true)]
public class Process : IBase
{
[Key]

View File

@@ -1,10 +1,12 @@
using PARR.DAL.Models.Base;
using Microsoft.EntityFrameworkCore;
using PARR.DAL.Models.Base;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace PARR.DAL.Models
{
[Table("Subprocesses")]
[Index(nameof(EsppId), IsUnique = true)]
public class Subprocess : IBase
{
[Key]

View File

@@ -1,10 +1,12 @@
using PARR.DAL.Models.Base;
using Microsoft.EntityFrameworkCore;
using PARR.DAL.Models.Base;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace PARR.DAL.Models
{
[Table("Tnks")]
[Index(nameof(EsppId), IsUnique = true)]
public class Tnk : IBase
{
[Key]

View File

@@ -1,10 +1,12 @@
using PARR.DAL.Models.Base;
using Microsoft.EntityFrameworkCore;
using PARR.DAL.Models.Base;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace PARR.DAL.Models
{
[Table("Works")]
[Index(nameof(EsppId), IsUnique = true)]
public class Work : IBase
{
[Key]