225 lines
7.9 KiB
C#
225 lines
7.9 KiB
C#
using CandidateReviewClientApp.Models;
|
||
using CandidateReviewContracts.BindingModels;
|
||
using CandidateReviewContracts.ViewModels;
|
||
using Microsoft.AspNetCore.Mvc;
|
||
using System.Diagnostics;
|
||
|
||
namespace CandidateReviewClientApp.Controllers
|
||
{
|
||
public class VacancyController : Controller
|
||
{
|
||
private readonly ILogger<VacancyController> _logger;
|
||
|
||
public VacancyController(ILogger<VacancyController> logger)
|
||
{
|
||
_logger = logger;
|
||
}
|
||
|
||
[HttpGet]
|
||
public IActionResult VacancyStatistics(int id)
|
||
{
|
||
if (APIClient.User == null)
|
||
{
|
||
return Redirect("~Home/Enter");
|
||
}
|
||
|
||
var vacancy = APIClient.GetRequest<VacancyViewModel>($"/api/vacancy/details?id={id}");
|
||
if (vacancy == null)
|
||
{
|
||
return NotFound("Вакансия не найдена.");
|
||
}
|
||
|
||
var viewModel = new VacancyStatisticsViewModel
|
||
{
|
||
DateFrom = DateTime.UtcNow,
|
||
DateTo = DateTime.UtcNow,
|
||
VacancyId = vacancy.Id
|
||
};
|
||
|
||
return View(viewModel);
|
||
}
|
||
|
||
[HttpGet]
|
||
public IActionResult GetStatistics(int id, DateTime dateFrom, DateTime dateTo)
|
||
{
|
||
if (APIClient.User == null)
|
||
{
|
||
return Redirect("~Home/Enter");
|
||
}
|
||
|
||
var vacancy = APIClient.GetRequest<VacancyViewModel>($"/api/vacancy/details?id={id}");
|
||
if (vacancy == null)
|
||
{
|
||
return NotFound("Вакансия не найдена.");
|
||
}
|
||
|
||
var reportFilePath = $"C:\\Users\\User\\source\\repos\\CandidateReview\\Статистика_по_вакансии_{vacancy.JobTitle}.pdf";
|
||
|
||
APIClient.PostRequest("api/report/statistics", new ReportBindingModel
|
||
{
|
||
VacancyId = vacancy.Id,
|
||
FileName = reportFilePath,
|
||
DateFrom = dateFrom,
|
||
DateTo = dateTo
|
||
});
|
||
|
||
if (!System.IO.File.Exists(reportFilePath))
|
||
{
|
||
return NotFound("Файл отчета не найден.");
|
||
}
|
||
|
||
return PhysicalFile(reportFilePath, "application/pdf", $"Статистика_по_вакансии_{vacancy.JobTitle}.pdf");
|
||
}
|
||
|
||
[HttpGet]
|
||
public IActionResult VacancyDetails(int? id)
|
||
{
|
||
if (APIClient.User == null)
|
||
{
|
||
return Redirect("~/Home/Enter");
|
||
}
|
||
VacancyViewModel vacancy;
|
||
if (id.HasValue)
|
||
{
|
||
vacancy = APIClient.GetRequest<VacancyViewModel?>($"api/vacancy/details?id={id}");
|
||
return View(vacancy);
|
||
}
|
||
return View();
|
||
}
|
||
|
||
[HttpGet]
|
||
public IActionResult Vacancies(int? companyId)
|
||
{
|
||
if (APIClient.User == null)
|
||
{
|
||
return Redirect("~/Home/Enter");
|
||
}
|
||
var vacancies = APIClient.GetRequest<List<VacancyViewModel>?>($"api/vacancy/list?companyId={companyId}");
|
||
return View(vacancies);
|
||
}
|
||
|
||
[HttpGet]
|
||
public IActionResult EditVacancy(int? id)
|
||
{
|
||
if (APIClient.User == null)
|
||
{
|
||
return Redirect("~/Home/Enter");
|
||
}
|
||
if (!id.HasValue)
|
||
{
|
||
return View(new VacancyViewModel());
|
||
}
|
||
var model = APIClient.GetRequest<VacancyViewModel?>($"api/vacancy/details?id={id}");
|
||
return View(model);
|
||
}
|
||
|
||
[HttpPost]
|
||
public IActionResult EditVacancy(VacancyBindingModel model)
|
||
{
|
||
string returnUrl = HttpContext.Request.Headers["Referer"].ToString();
|
||
try
|
||
{
|
||
if (APIClient.User == null)
|
||
{
|
||
throw new Exception("Доступно только авторизованным пользователям");
|
||
}
|
||
|
||
if (!string.IsNullOrEmpty(model.Tags))
|
||
{
|
||
model.Tags = model.Tags.ToLowerInvariant();
|
||
}
|
||
if (model.Id != 0)
|
||
{
|
||
APIClient.PostRequest("api/vacancy/update", model);
|
||
}
|
||
else
|
||
{
|
||
model.CompanyId = APIClient.Company.Id;
|
||
APIClient.PostRequest("api/vacancy/create", model);
|
||
if (APIClient.Company != null)
|
||
{
|
||
if (!string.IsNullOrEmpty(model.Tags))
|
||
{
|
||
model.Tags = model.Tags.ToLowerInvariant();
|
||
}
|
||
|
||
APIClient.Company?.Vacancies.Add(new VacancyViewModel
|
||
{
|
||
Id = model.Id,
|
||
CompanyId = model.CompanyId,
|
||
CreatedAt = DateTime.Now.ToUniversalTime(),
|
||
Description = model.Description,
|
||
JobTitle = model.JobTitle,
|
||
JobType = model.JobType,
|
||
Requirements = model.Requirements,
|
||
Responsibilities = model.Responsibilities,
|
||
Salary = model.Salary,
|
||
Status = model.Status,
|
||
Tags = model.Tags
|
||
});
|
||
}
|
||
}
|
||
return Redirect($"~/Company/CompanyProfile/{model.CompanyId}");
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
return RedirectToAction("Error", new { errorMessage = $"{ex.Message}", returnUrl });
|
||
}
|
||
}
|
||
|
||
public IActionResult Delete(int id)
|
||
{
|
||
string returnUrl = HttpContext.Request.Headers["Referer"].ToString();
|
||
try
|
||
{
|
||
if (APIClient.Company == null)
|
||
{
|
||
throw new Exception("Компания не определена");
|
||
}
|
||
|
||
APIClient.PostRequest($"api/vacancy/delete", new VacancyBindingModel { Id = id });
|
||
APIClient.Company = APIClient.GetRequest<CompanyViewModel?>($"api/company/profile?id={APIClient.User?.CompanyId}");
|
||
|
||
return Redirect("~/Company/CompanyProfile");
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
return RedirectToAction("Error", new { errorMessage = $"{ex.Message}", returnUrl });
|
||
}
|
||
}
|
||
|
||
public IActionResult SearchVacancies(string? tags)
|
||
{
|
||
string returnUrl = HttpContext.Request.Headers["Referer"].ToString();
|
||
try
|
||
{
|
||
if (APIClient.User == null)
|
||
{
|
||
throw new Exception("Доступно только авторизованным пользователям");
|
||
}
|
||
|
||
if (string.IsNullOrEmpty(tags))
|
||
{
|
||
ViewBag.Message = "Пожалуйста, введите поисковый запрос.";
|
||
return View(new List<VacancyViewModel?>());
|
||
}
|
||
|
||
var results = APIClient.GetRequest<List<VacancyViewModel?>>($"api/vacancy/search?tags={tags}");
|
||
return View(results);
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
return RedirectToAction("Error", new { errorMessage = $"{ex.Message}", returnUrl });
|
||
}
|
||
}
|
||
|
||
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
|
||
public IActionResult Error(string errorMessage, string returnUrl)
|
||
{
|
||
ViewBag.ErrorMessage = errorMessage ?? "Произошла непредвиденная ошибка.";
|
||
ViewBag.ReturnUrl = returnUrl;
|
||
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
|
||
}
|
||
}
|
||
}
|