diff --git a/PARR.API/Contracts/V1/ApiRoutes.cs b/PARR.API/Contracts/V1/ApiRoutes.cs
index 90ec6db7..6e55f8a1 100644
--- a/PARR.API/Contracts/V1/ApiRoutes.cs
+++ b/PARR.API/Contracts/V1/ApiRoutes.cs
@@ -41,16 +41,31 @@
public const string getParam = "{id}";
}
- public static class EsppData
- {
- public const string UploadTemplates = Base + "/espp-data/templates";
+ //public static class EsppData
+ //{
+ // public const string UploadTemplates = Base + "/espp-data/templates";
- }
+ //}
public static class Test
{
public const string GetMyIp = Base + "/tests/my-ip";
+ }
+ public static class Template
+ {
+ public const string GetAll = Base + "/templates/";
+ public const string Get = Base + "/templates/" + getParam;
+ public const string SetOkStatus = Base + "/templates/" + getParam + "/status/ok";
+ public const string GetByStatusCode = Base + "/templates/status/{statusCode}";
+
+
+ public const string getParam = "{id}";
+ }
+
+ public static class StatusTemplate
+ {
+ public const string GetAll = Base + "/template-statuses/";
}
diff --git a/PARR.API/Contracts/V1/Requests/Queries/TemplateQuery.cs b/PARR.API/Contracts/V1/Requests/Queries/TemplateQuery.cs
new file mode 100644
index 00000000..86b7ebde
--- /dev/null
+++ b/PARR.API/Contracts/V1/Requests/Queries/TemplateQuery.cs
@@ -0,0 +1,10 @@
+namespace PARR.API.Contracts.V1.Requests.Queries
+{
+ public class TemplateQuery
+ {
+ ///
+ /// Статус шаблона: 10, 20, 30
+ ///
+ public int? StatusCode { get; set; }
+ }
+}
diff --git a/PARR.API/Contracts/V1/Responses/StatusTemplateResponse.cs b/PARR.API/Contracts/V1/Responses/StatusTemplateResponse.cs
new file mode 100644
index 00000000..f6e3e7bf
--- /dev/null
+++ b/PARR.API/Contracts/V1/Responses/StatusTemplateResponse.cs
@@ -0,0 +1,13 @@
+using System.ComponentModel.DataAnnotations;
+
+namespace PARR.API.Contracts.V1.Responses
+{
+ public class StatusTemplateResponse
+ {
+ public int Code { get; set; }
+
+ public required string Name { get; set; }
+
+ public required string Description { get; set; }
+ }
+}
diff --git a/PARR.API/Contracts/V1/Responses/TemplateResponse.cs b/PARR.API/Contracts/V1/Responses/TemplateResponse.cs
new file mode 100644
index 00000000..8b8f5813
--- /dev/null
+++ b/PARR.API/Contracts/V1/Responses/TemplateResponse.cs
@@ -0,0 +1,27 @@
+namespace PARR.API.Contracts.V1.Responses
+{
+ public class TemplateResponse
+ {
+ public required string Name { get; set; }
+ public bool IsActive { get; set; }
+ public required string Assignment { get; set; }
+ public required string Title { get; set; }
+ public required string Category { get; set; }
+ public required string Branch { get; set; }
+ public required string SlaInterval { get; set; }
+ public required string ConfigurationItem { get; set; }
+ public required string ContactName { get; set; }
+ public required string Description { get; set; }
+ public required string ResolutionCode { get; set; }
+ public required string Resolution { get; set; }
+ public required string RzdMTNKprocess { get; set; }
+ public required string RzdMTNKsubprocess { get; set; }
+ public required string RzdMTNKtnk { get; set; }
+ public required string RzdMTNKjob { get; set; }
+ public required string Assignee { get; set; }
+
+
+ public Guid ParrTemplateId { get; set; }
+ public int StatusCode { get; set; }
+ }
+}
diff --git a/PARR.API/Controllers/V1/EsppDataController.cs b/PARR.API/Controllers/V1/EsppDataController.cs
index 666d0b56..cb001b78 100644
--- a/PARR.API/Controllers/V1/EsppDataController.cs
+++ b/PARR.API/Controllers/V1/EsppDataController.cs
@@ -10,6 +10,7 @@ namespace PARR.API.Controllers.V1
{
public class EsppDataController : BaseApiController
{
+ private readonly ILogger logger;
private readonly IFileService fileService;
private readonly StorageSettings storageSettings;
@@ -19,36 +20,36 @@ namespace PARR.API.Controllers.V1
StorageSettings storageSettings
)
{
- Logger = logger;
+ this.logger = logger;
this.fileService = fileService;
this.storageSettings = storageSettings;
}
- public ILogger Logger { get; }
+ // UploadTemplates - неактуально, так как стали брать данные с RabbitMQ
- ///
- /// Загрузить файл списка шаблонов полученных из ЕСПП в формате csv
- ///
- ///
- [HttpPost(ApiRoutes.EsppData.UploadTemplates)]
- public async Task UploadTemplates([BindRequired] IFormFile file)
- {
- if (!fileService.IsExtensionAllowed(file, storageSettings.EsppTemplates!.AllowedExtensions))
- return BadRequest(
- new Response(false,
- new List {
- new ErrorModel {
- Message = $"Недопустимое расширение файла. Разрешенные расширения: {string.Join(", ", storageSettings.EsppTemplates.AllowedExtensions)}"
- } }));
+ /////
+ ///// Загрузить файл списка шаблонов полученных из ЕСПП в формате csv
+ /////
+ /////
+ //[HttpPost(ApiRoutes.EsppData.UploadTemplates)]
+ //public async Task UploadTemplates([BindRequired] IFormFile file)
+ //{
+ // if (!fileService.IsExtensionAllowed(file, storageSettings.EsppTemplates!.AllowedExtensions))
+ // return BadRequest(
+ // new Response(false,
+ // new List {
+ // new ErrorModel {
+ // Message = $"Недопустимое расширение файла. Разрешенные расширения: {string.Join(", ", storageSettings.EsppTemplates.AllowedExtensions)}"
+ // } }));
- if (!fileService.IsNotExceededLimit(file, storageSettings.EsppTemplates.MaxFileSizeMb))
- return BadRequest(new Response(false, new List { new ErrorModel { FieldName = nameof(file), Message = $"Размер файла превышает {storageSettings.EsppTemplates.MaxFileSizeMb} МБайт" } }));
+ // if (!fileService.IsNotExceededLimit(file, storageSettings.EsppTemplates.MaxFileSizeMb))
+ // return BadRequest(new Response(false, new List { new ErrorModel { FieldName = nameof(file), Message = $"Размер файла превышает {storageSettings.EsppTemplates.MaxFileSizeMb} МБайт" } }));
- var uploadResult = await fileService.UploadAsync(file, storageSettings.EsppTemplates.TemplatePath);
- if (uploadResult == null)
- return BadRequest(new Response(false, new List { new ErrorModel { Message = "Ошибка при сохранении файла" } }));
+ // var uploadResult = await fileService.UploadAsync(file, storageSettings.EsppTemplates.TemplatePath);
+ // if (uploadResult == null)
+ // return BadRequest(new Response(false, new List { new ErrorModel { Message = "Ошибка при сохранении файла" } }));
- return Ok(new Response("", true, new List(), $"Файл загружен."));
- }
+ // return Ok(new Response("", true, new List(), $"Файл загружен."));
+ //}
}
}
diff --git a/PARR.API/Controllers/V1/JobController.cs b/PARR.API/Controllers/V1/JobController.cs
index 90be2188..2cd778dc 100644
--- a/PARR.API/Controllers/V1/JobController.cs
+++ b/PARR.API/Controllers/V1/JobController.cs
@@ -10,7 +10,6 @@ using PARR.API.Extensions;
using PARR.API.Services.Interfaces;
using PARR.DAL.DomainModels;
using PARR.DAL.Models.V1;
-using PARR.DAL.Services.Interfaces;
using PARR.DAL.Services.Interfaces.V1;
namespace PARR.API.Controllers.V1
diff --git a/PARR.API/Controllers/V1/StatusTemplateController.cs b/PARR.API/Controllers/V1/StatusTemplateController.cs
new file mode 100644
index 00000000..ccb7d2b0
--- /dev/null
+++ b/PARR.API/Controllers/V1/StatusTemplateController.cs
@@ -0,0 +1,42 @@
+using AutoMapper;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.EntityFrameworkCore;
+using PARR.API.Contracts.V1;
+using PARR.API.Contracts.V1.Responses;
+using PARR.API.Contracts.V1.Responses.Base;
+using PARR.API.Controllers.V1.Base;
+using PARR.DAL.Services;
+
+namespace PARR.API.Controllers.V1
+{
+ public class StatusTemplateController : BaseApiController
+ {
+ private readonly IMapper mapper;
+ private readonly IStatusTemplateService statusTemplateService;
+
+ public StatusTemplateController(
+ IMapper mapper,
+ IStatusTemplateService statusTemplateService
+ )
+ {
+ this.mapper = mapper;
+ this.statusTemplateService = statusTemplateService;
+ }
+
+ ///
+ /// Получить список статусов
+ ///
+ ///
+ [HttpGet(ApiRoutes.StatusTemplate.GetAll)]
+ public async Task GetAll()
+ {
+ var statusList = await statusTemplateService.Get()
+ .OrderBy(t => t.Code)
+ .ToListAsync();
+
+ var response = mapper.Map>(statusList);
+
+ return Ok(new Response>(response, true));
+ }
+ }
+}
diff --git a/PARR.API/Controllers/V1/TemplateController.cs b/PARR.API/Controllers/V1/TemplateController.cs
new file mode 100644
index 00000000..e1abd2cc
--- /dev/null
+++ b/PARR.API/Controllers/V1/TemplateController.cs
@@ -0,0 +1,136 @@
+using AutoMapper;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.EntityFrameworkCore;
+using PARR.API.Contracts.V1;
+using PARR.API.Contracts.V1.Requests.Queries;
+using PARR.API.Contracts.V1.Responses;
+using PARR.API.Contracts.V1.Responses.Base;
+using PARR.API.Controllers.V1.Base;
+using PARR.API.Extensions;
+using PARR.DAL.Contracts;
+using PARR.DAL.DomainModels;
+using PARR.DAL.Models;
+using PARR.DAL.Services.Interfaces;
+
+namespace PARR.API.Controllers.V1
+{
+ public class TemplateController : BaseApiController
+ {
+ private readonly IMapper mapper;
+ private readonly ITemplateService templateService;
+
+ public TemplateController(
+ IMapper mapper,
+ ITemplateService templateService
+ )
+ {
+ this.mapper = mapper;
+ this.templateService = templateService;
+ }
+
+
+ ///
+ /// Получить список всех шаблонов постранично
+ ///
+ ///
+ ///
+ [HttpGet(ApiRoutes.Template.GetAll)]
+ public async Task GetAll([FromQuery] PaginationQuery paginationQuery, [FromQuery] TemplateQuery filter)
+ {
+ var paginationFilter = mapper.Map(paginationQuery);
+
+ IQueryable query = templateService.Get()
+ .OrderBy(t => t.Name);
+
+ if (filter.StatusCode.HasValue)
+ {
+ switch (filter.StatusCode.Value)
+ {
+ case (int)StatusTemplateEnum.Ok:
+ query = query.Where(t => t.StatusCode == (int)StatusTemplateEnum.Ok);
+ break;
+ case (int)StatusTemplateEnum.Creating:
+ query = query.Where(t => t.StatusCode == (int)StatusTemplateEnum.Creating);
+ break;
+ case (int)StatusTemplateEnum.Updating:
+ query = query.Where(t => t.StatusCode == (int)StatusTemplateEnum.Updating);
+ break;
+ default:
+ break;
+ }
+ }
+
+ var templates = await templateService.GetPage(query, paginationFilter).ToListAsync();
+
+ if (!templates.Any())
+ return NoContent();
+
+ var templateResponse = mapper.Map>(templates);
+ var paginationResponse = new PagedResponse(templateResponse, true).GetPaginatedProps(paginationFilter, query);
+
+ return Ok(paginationResponse);
+ }
+
+ ///
+ /// Получить шаблон по id
+ ///
+ ///
+ ///
+ [HttpGet(ApiRoutes.Template.Get)]
+ public async Task GetById([FromRoute] Guid id)
+ {
+ var template = await templateService.GetAsync(id);
+
+ if (template == null)
+ return NotFound();
+
+ var response = mapper.Map(template);
+
+ return Ok(new Response(response, true));
+ }
+
+ ///
+ /// Получить один шаблон по заданному статусу
+ ///
+ ///
+ ///
+ [HttpGet(ApiRoutes.Template.GetByStatusCode)]
+ public async Task GetByStatus([FromRoute] int statusCode)
+ {
+ var template = await templateService.Get().FirstOrDefaultAsync(t => t.StatusCode == statusCode);
+
+ if (template == null)
+ return NotFound();
+
+ var response = mapper.Map(template);
+
+ return Ok(new Response(response, true));
+ }
+
+
+ ///
+ /// Установить статус ОК для шаблона с id
+ ///
+ ///
+ ///
+ [HttpPut(ApiRoutes.Template.SetOkStatus)]
+ public async Task SetOkStatus([FromRoute] Guid id)
+ {
+ var template = await templateService.GetAsync(id);
+
+ if (template == null)
+ return BadRequest(new Response(false, new List { new ErrorModel { Message = $"Не найден шаблон с id: {id}" } }));
+
+ template.StatusCode = (int)StatusTemplateEnum.Ok;
+
+ if (!await templateService.CommitAsync())
+ return BadRequest(new Response(false, new List { new ErrorModel { Message = $"Ошибка при изменении статуса у шаблона с id: {id}" } }));
+
+ var response = mapper.Map(template);
+
+ return Ok(new Response(response, true));
+ }
+
+
+ }
+}
diff --git a/PARR.API/MappingProfiles/DomainToResponseProfile.cs b/PARR.API/MappingProfiles/DomainToResponseProfile.cs
index a21e52f2..16528321 100644
--- a/PARR.API/MappingProfiles/DomainToResponseProfile.cs
+++ b/PARR.API/MappingProfiles/DomainToResponseProfile.cs
@@ -1,5 +1,6 @@
using AutoMapper;
using PARR.API.Contracts.V1.Responses;
+using PARR.DAL.Models;
using PARR.DAL.Models.V1;
namespace PARR.API.MappingProfiles
@@ -23,9 +24,27 @@ namespace PARR.API.MappingProfiles
.ForMember(d => d.Script, o => o.MapFrom(s => s.ScriptName));
// === Job ===
-
-
CreateMap();
+
+ CreateMap()
+ .ForMember(d => d.ParrTemplateId, o => o.MapFrom(s => s.Id))
+ .ForMember(d => d.Assignment, o => o.MapFrom(s => s.WorkGroup))
+ .ForMember(d => d.Title, o => o.MapFrom(s => s.ShortDescription))
+ .ForMember(d => d.Branch, o => o.MapFrom(s => s.ResponseArea))
+ .ForMember(d => d.SlaInterval, o => o.MapFrom(s => s.Duration))
+ .ForMember(d => d.ConfigurationItem, o => o.MapFrom(s => s.EK))
+ .ForMember(d => d.ContactName, o => o.MapFrom(s => s.Initiator))
+ .ForMember(d => d.Description, o => o.MapFrom(s => s.FullDescription))
+ .ForMember(d => d.ResolutionCode, o => o.MapFrom(s => s.ClosingCode))
+ .ForMember(d => d.Resolution, o => o.MapFrom(s => s.Solution))
+ .ForMember(d => d.RzdMTNKprocess, o => o.MapFrom(s => s.Process))
+ .ForMember(d => d.RzdMTNKsubprocess, o => o.MapFrom(s => s.SubProcess))
+ .ForMember(d => d.RzdMTNKtnk, o => o.MapFrom(s => s.TNK))
+ .ForMember(d => d.RzdMTNKjob, o => o.MapFrom(s => s.Work))
+ .ForMember(d => d.Assignee, o => o.MapFrom(s => s.Worker));
+
+ CreateMap();
+
}
}
}
diff --git a/PARR.DAL/Models/Template.cs b/PARR.DAL/Models/Template.cs
index dde32902..8d1c116f 100644
--- a/PARR.DAL/Models/Template.cs
+++ b/PARR.DAL/Models/Template.cs
@@ -11,6 +11,7 @@ namespace PARR.DAL.Models
public Guid Id { get; set; }
public DateTimeOffset DateCreated { get; set; }
public DateTimeOffset? DateModified { get; set; }
+
public required string Name { get; set; }
public bool IsActive { get; set; }
public required string WorkGroup { get; set; }
diff --git a/PARR.DAL/ParrDalInstaller.cs b/PARR.DAL/ParrDalInstaller.cs
index a97fbb8d..d22dc4e4 100644
--- a/PARR.DAL/ParrDalInstaller.cs
+++ b/PARR.DAL/ParrDalInstaller.cs
@@ -2,6 +2,7 @@
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using PARR.DAL.Context;
+using PARR.DAL.Services;
using PARR.DAL.Services.Implementation;
using PARR.DAL.Services.Implementations;
using PARR.DAL.Services.Implementations.AIHIT;
@@ -33,6 +34,7 @@ namespace PARR.DAL
services.AddTransient();
services.AddTransient();
services.AddTransient();
+ services.AddTransient();
}
}
}
diff --git a/PARR.DAL/Services/IStatusTemplateService.cs b/PARR.DAL/Services/IStatusTemplateService.cs
new file mode 100644
index 00000000..7b22a0ef
--- /dev/null
+++ b/PARR.DAL/Services/IStatusTemplateService.cs
@@ -0,0 +1,9 @@
+using PARR.DAL.Models;
+
+namespace PARR.DAL.Services
+{
+ public interface IStatusTemplateService
+ {
+ IQueryable Get();
+ }
+}
diff --git a/PARR.DAL/Services/Implementations/StatusTemplateService.cs b/PARR.DAL/Services/Implementations/StatusTemplateService.cs
new file mode 100644
index 00000000..e6d132d6
--- /dev/null
+++ b/PARR.DAL/Services/Implementations/StatusTemplateService.cs
@@ -0,0 +1,20 @@
+using PARR.DAL.Context;
+using PARR.DAL.Models;
+
+namespace PARR.DAL.Services.Implementations
+{
+ internal class StatusTemplateService : IStatusTemplateService
+ {
+ private readonly DataContext dataContext;
+
+ public StatusTemplateService(DataContext dataContext)
+ {
+ this.dataContext = dataContext;
+ }
+
+ public IQueryable Get()
+ {
+ return dataContext.StatusTemplates;
+ }
+ }
+}