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 }); } } }