public async Task <JsonResult> JoinUserInfos([FromBody] int[] data) { using var db = AppContextFactory.DB; using var t = db.Database.BeginTransaction(); try { var user_1 = db.UserInfos.First(i => i.Id == data[0]); var user_2 = db.UserInfos.First(i => i.Id == data[1]); // Есть ли на втором пользователе проекты? Привязан ли он ко второму пользователю? var vacancies_2 = db.Vacancies.Where(i => i.UserInfoId == user_2.Id).ToList(); if (vacancies_2.Count > 0) { foreach (var v in vacancies_2) { v.UserInfoId = user_1.Id; await db.SaveChangesAsync(); } } // Есть ли привязка к пользователю в системе? if (!string.IsNullOrEmpty(user_2.UserId)) { // Если уже есть привязка к пользователю, то перевешиваем. user_1.UserId ??= user_2.UserId; await db.SaveChangesAsync(); } // Если есть закрепленные навыки и предметные области. var competences_2 = db.UserCompetences.Where(i => i.UserInfoId == user_2.Id).ToList(); var competences_1 = db.UserCompetences.Where(i => i.UserInfoId == user_1.Id).ToList(); if (competences_2.Count > 0) { foreach (var c in competences_2) { if (competences_1.Any(i => i.CompetenceId == c.Id)) { continue; } else { c.UserInfoId = user_1.Id; await db.SaveChangesAsync(); } } } // Обновляем все DocFiles, чтобы повторно не плодить исполнителеи. var docFiles_2 = db.DocFiles.Where(i => i.UserInfoId == user_2.Id).ToList(); foreach (var file in docFiles_2) { file.UserInfoId = user_1.Id; await db.SaveChangesAsync(); } // И, напоследок, удаляем или перемещаем аватарку пользователя. if (!string.IsNullOrEmpty(user_2.AvatarPath)) { if (string.IsNullOrEmpty(user_1.AvatarPath)) { user_1.AvatarPath = user_2.AvatarPath; await db.SaveChangesAsync(); } else { AvatarHelper.DeleteFile(_env, user_2.AvatarPath); } } db.UserInfos.Remove(user_2); await db.SaveChangesAsync(); await t.CommitAsync(); } catch (Exception ex) { await t.RollbackAsync(); return(Json(new { error = true, message = "Нельзя сотворить здесь!" })); } return(Json(new { error = false, message = "Исследование завершено!" })); }
public async Task <IActionResult> Edit(int?id, string name) { UserEditViewModel model = new UserEditViewModel(); await TryUpdateModelAsync(model, "", i => i.FIO, i => i.CareerStart, i => i.VacationStart, i => i.Avatar, i => i.AvatarPath, i => i.ApplicationUserId); // Валидация. if (!ModelState.IsValid) { return(View(model)); } using var db = AppContextFactory.DB; using var t = db.Database.BeginTransaction(); try { // Редактируем пользователя. var user = db.UserInfos.FirstOrDefault(i => i.Id == id) ?? new UserInfo(); // Аватара Фрейи (да был такой НИП в WOTLK, вернуться бы в 10 класс...). // Новый аватар. if (model.Avatar != null) { // Удаление старого файла, если он у нас есть. if (!string.IsNullOrEmpty(model.AvatarPath)) { AvatarHelper.DeleteFile(_env, model.AvatarPath); } // Сохранение нового файла. string filePath = await AvatarHelper.SaveFile(model.Avatar, _env); // Прикрепляем / обновляем файл к профилю пользователя. user.AvatarPath = filePath; } // Обновляем данные пользователя. user.CareerStart = model.CareerStart; user.Name = model.FIO; user.VacationStart = model.VacationStart; user.UserId = model.ApplicationUserId; if (user.Id == 0) { db.Entry(user).State = EntityState.Added; } await db.SaveChangesAsync(); await t.CommitAsync(); } catch (Exception ex) { await t.RollbackAsync(); ModelState.AddModelError("Error", "В процессе сохранения произошла ошибка! Ошибка: " + ex.Message); } return(RedirectToAction("Index")); }