CourseWork_KPO/CandidateReviewClientApp/Controllers/ResumeController.cs

228 lines
9.1 KiB
C#
Raw Normal View History

using CandidateReviewClientApp.Models;
using CandidateReviewContracts.BindingModels;
using CandidateReviewContracts.BusinessLogicsContracts;
using CandidateReviewContracts.ViewModels;
using Microsoft.AspNetCore.Mvc;
using System.Diagnostics;
namespace CandidateReviewClientApp.Controllers
{
public class ResumeController : Controller
{
private readonly ILogger<ResumeController> _logger;
public ResumeController(ILogger<ResumeController> logger)
{
_logger = logger;
}
[HttpGet]
public IActionResult GetReport(int id)
{
if (APIClient.User == null)
{
return Redirect("~Home/Enter");
}
var resume = APIClient.GetRequest<ResumeViewModel>($"/api/resume/details?id={id}");
if (resume == null)
{
return NotFound("Резюме не найдено.");
}
var reportFilePath = $"C:\\Users\\User\\source\\repos\\CandidateReview\\Резюме_{resume.UserName}.pdf";
APIClient.PostRequest("api/report/resume", new ReportBindingModel
{
ResumeId = resume.Id,
FileName = reportFilePath
});
if (!System.IO.File.Exists(reportFilePath))
{
return NotFound("Файл отчета не найден.");
}
return PhysicalFile(reportFilePath, "application/pdf", $"Резюме_{resume.UserName}.pdf");
}
[HttpGet]
public async Task<IActionResult> ResumeDetails(int? id)
{
if (APIClient.User == null)
{
return Redirect("~/Home/Enter");
}
var resume = await APIClient.GetRequestAsync<ResumeViewModel?>($"api/resume/details?id={id}");
if (resume == null || !id.HasValue)
{
return View();
}
var resumeAssessments = APIClient.GetRequest<List<AssessmentViewModel>>($"api/assessment/listByResumeId?id={id}");
var userAssessment = resumeAssessments?.FirstOrDefault(a => a.UserId == APIClient.User.Id);
var criterions = APIClient.GetRequest<List<CriterionViewModel>>($"api/criterion/list");
resume.Assessments = resumeAssessments ?? new List<AssessmentViewModel>();
var assessmentCriterions = new List<AssessmentCriterionViewModel>();
if (resumeAssessments != null)
{
foreach (var item in resumeAssessments)
{
assessmentCriterions.AddRange(APIClient.GetRequest<List<AssessmentCriterionViewModel>>($"api/assessment/assessmentCriterions?assessmentId={item.Id}"));
}
}
var userAC = new List<AssessmentCriterionViewModel>();
if (userAssessment != null)
{
userAC.AddRange(APIClient.GetRequest<List<AssessmentCriterionViewModel>>($"api/assessment/assessmentCriterions?assessmentId={userAssessment.Id}"));
}
ViewBag.UserAssessmentCriterions = userAC;
ViewBag.OtherAssessmentCriterions = assessmentCriterions;
ViewBag.UserAssessment = userAssessment;
ViewBag.Criterions = criterions;
return View(resume);
}
[HttpGet]
public async Task<IActionResult> EditResume(int? id, int? vacancyId)
{
if (APIClient.User == null)
{
return RedirectToAction("Enter", "Home");
}
ResumeViewModel model;
if (id.HasValue)
{
model = await APIClient.GetRequestAsync<ResumeViewModel>($"api/resume/details?id={id}");
if (model == null)
{
return NotFound();
}
}
else
{
model = new ResumeViewModel { UserId = APIClient.User.Id, VacancyId = vacancyId ?? 0 };
}
return View(model);
}
[HttpPost]
public IActionResult EditResume(ResumeBindingModel model, bool isDraft)
{
string returnUrl = HttpContext.Request.Headers["Referer"].ToString();
try
{
if (APIClient.User == null)
{
throw new Exception("Доступно только авторизованным пользователям");
}
if (model.Id != 0)
{
if (isDraft)
{
model.Status = CandidateReviewDataModels.Enums.ResumeStatusEnum.Черновик;
}
else
{
model.Status = CandidateReviewDataModels.Enums.ResumeStatusEnum.Обрабатывается;
}
APIClient.PostRequest("api/resume/update", model);
}
else
{
model.UserId = APIClient.User.Id;
if (isDraft)
{
model.Status = CandidateReviewDataModels.Enums.ResumeStatusEnum.Черновик;
}
else
{
model.Status = CandidateReviewDataModels.Enums.ResumeStatusEnum.Обрабатывается;
}
var vacancy = APIClient.GetRequest<VacancyViewModel>($"api/vacancy/details?id={model.VacancyId}");
var resume = APIClient.GetRequest<ResumeViewModel>($"api/resume/check?userId={model.UserId}&vacancyId={model.VacancyId}");
if (resume == null)
{
APIClient.PostRequest("api/resume/create", model);
if (APIClient.User != null)
{
APIClient.User?.Resumes.Add(new ResumeViewModel
{
Id = model.Id,
Description = model.Description,
Education = model.Education,
Experience = model.Experience,
Skills = model.Skills,
Status = model.Status,
Title = model.Title,
UserId = model.UserId,
VacancyId = model.VacancyId
});
}
else
{
throw new Exception("Пользователь не найден");
}
if (vacancy != null && model.Status != CandidateReviewDataModels.Enums.ResumeStatusEnum.Черновик)
{
vacancy.Resumes.Add(new ResumeViewModel
{
Id = model.Id,
Description = model.Description,
Education = model.Education,
Experience = model.Experience,
Skills = model.Skills,
Status = model.Status,
Title = model.Title,
UserId = model.UserId,
VacancyId = model.VacancyId
});
}
else
{
throw new Exception("Вакансия не найдена");
}
}
else
{
throw new Exception("Вы уже создавали резюме на эту вакансию!");
}
}
return Redirect($"~/User/UserProfile/{model.UserId}");
}
catch (Exception ex)
{
return RedirectToAction("Error", new { errorMessage = $"{ex.Message}", returnUrl });
}
}
public IActionResult Delete(int id)
{
string returnUrl = HttpContext.Request.Headers["Referer"].ToString();
try
{
APIClient.PostRequest($"api/resume/delete", new ResumeBindingModel { Id = id });
2024-12-16 06:12:54 +04:00
return Redirect($"~/User/UserProfile/{APIClient.User?.Id}");
}
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 });
}
}
}