diff --git a/AsbCloudApp/Services/IDrillingProgramService.cs b/AsbCloudApp/Services/IDrillingProgramService.cs index 71a81d64..b3f54b55 100644 --- a/AsbCloudApp/Services/IDrillingProgramService.cs +++ b/AsbCloudApp/Services/IDrillingProgramService.cs @@ -8,16 +8,16 @@ namespace AsbCloudApp.Services { public interface IDrillingProgramService { + Task> GetAvailableUsers(int idWell, CancellationToken token = default); Task> GetCategoriesAsync(CancellationToken token = default); - Task GetStateAsync(int idWell, int fileChangerId, + Task GetStateAsync(int idWell, int idUser, CancellationToken token = default); - Task AddOrReplaceFileMarkAsync(FileMarkDto fileMarkDto, int idUser, CancellationToken token); - Task MarkAsDeletedFileMarkAsync(int idFileMark, CancellationToken token); + Task AddFile(int idWell, int idFileCategory, int idUser, string fileFullName, System.IO.Stream fileStream, CancellationToken token = default); Task AddPartsAsync(int idWell, IEnumerable idFileCategories, CancellationToken token = default); Task RemovePartsAsync(int idWell, IEnumerable idFileCategories, CancellationToken token = default); - Task AddUserAsync(int idUser, int idPart, int idUserRole, CancellationToken token = default); - Task RemoveUserAsync(int idUser, int idPart, int idUserRole, CancellationToken token = default); - Task AddFile(int idPart, int idUser, string fileFullName, Stream fileStream, CancellationToken token = default); - Task> GetAvailableUsers(int idWell, CancellationToken token = default); + Task AddUserAsync(int idWell, int idFileCategory, int idUser, int idUserRole, CancellationToken token = default); + Task RemoveUserAsync(int idWell, int idFileCategory, int idUser, int idUserRole, CancellationToken token = default); + Task AddOrReplaceFileMarkAsync(FileMarkDto fileMarkDto, int idUser, CancellationToken token); + Task MarkAsDeletedFileMarkAsync(int idFileMark, CancellationToken token); } } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs b/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs index b1c6f2fb..82d4c174 100644 --- a/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs +++ b/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs @@ -138,14 +138,14 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram return state; } - public async Task AddFile(int idPart, int idUser, string fileFullName, System.IO.Stream fileStream, CancellationToken token = default) + public async Task AddFile(int idWell, int idFileCategory, int idUser, string fileFullName, System.IO.Stream fileStream, CancellationToken token = default) { var part = await context.DrillingProgramParts .Include(p => p.RelatedUsers) - .FirstOrDefaultAsync(p => p.Id == idPart, token); + .FirstOrDefaultAsync(p => p.IdWell == idWell && p.IdFileCategory == idFileCategory, token); if (part == null) - throw new ArgumentInvalidException($"DrillingProgramPart id == {idPart} does not exist", nameof(idPart)); + throw new ArgumentInvalidException($"DrillingProgramPart id == {idFileCategory} does not exist", nameof(idFileCategory)); if (! part.RelatedUsers.Any(r => r.IdUser == idUser && r.IdUserRole == idUserRolePublisher)) throw new ForbidException($"User {idUser} is not in the publisher list."); @@ -198,45 +198,51 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram return await context.SaveChangesAsync(token); } - public async Task AddUserAsync(int idUser, int idPart, int idUserRole, CancellationToken token = default) + public async Task AddUserAsync(int idWell, int idFileCategory, int idUser, int idUserRole, CancellationToken token = default) { var user = await userService.GetAsync(idUser, token); if (user is null) throw new ArgumentInvalidException($"User id == {idUser} does not exist", nameof(idUser)); - var drillingProgramPart = await context.DrillingProgramParts.FirstOrDefaultAsync(p => p.Id == idPart, token); - if (drillingProgramPart is null) - throw new ArgumentInvalidException($"DrillingProgramPart id == {idPart} does not exist", nameof(idPart)); + var part = await context.DrillingProgramParts + .FirstOrDefaultAsync(p => p.IdWell == idWell && p.IdFileCategory == idFileCategory, token); + + if (part is null) + throw new ArgumentInvalidException($"DrillingProgramPart idFileCategory == {idFileCategory} does not exist", nameof(idFileCategory)); if (idUserRole != idUserRoleApprover && idUserRole != idUserRolePublisher) - throw new ArgumentInvalidException($"idUserRole ({idPart}), should be approver ({idUserRoleApprover}) or publisher ({idUserRolePublisher})", nameof(idPart)); + throw new ArgumentInvalidException($"idUserRole ({idUserRole}), should be approver ({idUserRoleApprover}) or publisher ({idUserRolePublisher})", nameof(idUserRole)); + + var oldRelation = await context.RelationDrillingProgramPartUsers + .FirstOrDefaultAsync(r => r.IdUser == idUser && r.IdDrillingProgramPart == part.Id, token); + + if(oldRelation is not null) + context.RelationDrillingProgramPartUsers.Remove(oldRelation); var newRelation = new RelationUserDrillingProgramPart { IdUser = idUser, - IdDrillingProgramPart = idPart, + IdDrillingProgramPart = part.Id, IdUserRole = idUserRole, }; context.RelationDrillingProgramPartUsers.Add(newRelation); if(idUserRole == idUserRoleApprover) - await RemoveDrillingProgramAsync(drillingProgramPart.IdWell, token); + await RemoveDrillingProgramAsync(part.IdWell, token); return await context.SaveChangesAsync(token); } - public async Task RemoveUserAsync(int idUser, int idPart, int idUserRole, CancellationToken token = default) + public async Task RemoveUserAsync(int idWell, int idFileCategory, int idUser, int idUserRole, CancellationToken token = default) { var whereQuery = context.RelationDrillingProgramPartUsers + .Include(r => r.DrillingProgramPart) .Where(r => r.IdUser == idUser && - r.IdDrillingProgramPart == idPart && - r.IdUserRole == idUserRole); + r.IdUserRole == idUserRole && + r.DrillingProgramPart.IdWell == idWell && + r.DrillingProgramPart.IdFileCategory == idFileCategory); context.RelationDrillingProgramPartUsers.RemoveRange(whereQuery); - if (idUserRole == idUserRoleApprover) - { - var part = await context.DrillingProgramParts.FirstOrDefaultAsync(p => p.Id == idPart, token); - } - + return await context.SaveChangesAsync(token); } diff --git a/AsbCloudWebApi/Controllers/DrillingProgramController.cs b/AsbCloudWebApi/Controllers/DrillingProgramController.cs index 0bc72bc7..4c1b72b5 100644 --- a/AsbCloudWebApi/Controllers/DrillingProgramController.cs +++ b/AsbCloudWebApi/Controllers/DrillingProgramController.cs @@ -82,17 +82,17 @@ namespace AsbCloudWebApi.Controllers /// /// Загрузка файла для части программы бурения /// - /// ID части программы. Не путать с категорией файла /// + /// ID части программы. Не путать с категорией файла /// /// /// - [HttpPost("part/{idPart}")] + [HttpPost("part/{idFileCategory}")] [Permission] [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] public async Task AddFile( - int idPart, int idWell, + int idFileCategory, [FromForm] IFormFileCollection files, CancellationToken token) { @@ -118,7 +118,7 @@ namespace AsbCloudWebApi.Controllers return BadRequest(ArgumentInvalidException.MakeValidationError("file", "Файл должен быть xlsx")); var fileStream = files[0].OpenReadStream(); - var result = await drillingProgramService.AddFile(idPart, (int)idUser, fileName, fileStream, token); + var result = await drillingProgramService.AddFile(idWell, idFileCategory, (int)idUser, fileName, fileStream, token); return Ok(result); } @@ -180,14 +180,14 @@ namespace AsbCloudWebApi.Controllers /// /// /// - /// + /// /// /// /// - [HttpPost("part/{idPart}/user")] + [HttpPost("part/{idFileCategory}/user")] [Permission] [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] - public async Task AddUserAsync(int idWell, [Required] int idUser, int idPart, [Required] int idUserRole, CancellationToken token = default) + public async Task AddUserAsync(int idWell, [Required] int idUser, int idFileCategory, [Required] int idUserRole, CancellationToken token = default) { int? idCompany = User.GetCompanyId(); int? idUserEditor = User.GetUserId(); @@ -199,7 +199,7 @@ namespace AsbCloudWebApi.Controllers idWell, token).ConfigureAwait(false)) return Forbid(); - var result = await drillingProgramService.AddUserAsync(idUser, idPart, idUserRole, token); + var result = await drillingProgramService.AddUserAsync(idWell, idFileCategory, idUser, idUserRole, token); return Ok(result); } @@ -208,14 +208,14 @@ namespace AsbCloudWebApi.Controllers /// /// /// - /// + /// /// /// /// - [HttpDelete("part/{idPart}/user/{idUser}")] + [HttpDelete("part/{idFileCategory}/user/{idUser}")] [Permission] [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] - public async Task RemoveUserAsync(int idWell, int idUser, int idPart, [Required]int idUserRole, CancellationToken token = default) + public async Task RemoveUserAsync(int idWell, int idUser, int idFileCategory, [Required]int idUserRole, CancellationToken token = default) { int? idCompany = User.GetCompanyId(); int? idUserEditor = User.GetUserId(); @@ -227,7 +227,7 @@ namespace AsbCloudWebApi.Controllers idWell, token).ConfigureAwait(false)) return Forbid(); - var result = await drillingProgramService.RemoveUserAsync(idUser, idPart, idUserRole, token); + var result = await drillingProgramService.RemoveUserAsync(idWell, idFileCategory,idUser, idUserRole, token); return Ok(result); }