|
|
- using Microsoft.AspNet.Identity;
- using Microsoft.AspNet.Identity.EntityFramework;
- using Microsoft.Owin.Security;
- using Sevomin.Models;
- using Sevomin.Models.Helpers;
- using Sevomin.Models.Repositories;
- using System;
- using System.Threading.Tasks;
- using System.Web;
- using System.Web.Mvc;
- using System.Linq;
- using System.Net.Mail;
-
- namespace Sevomin.WebFrontend.Controllers
- {
- public class AccountController : BaseController
- {
- public AccountController()
- : this(new SevominUserManager(new UserStore<User>(SevominDbContext.Current)))
- {
- }
-
- public AccountController(SevominUserManager userManager)
- {
- UserManager = userManager;
- }
-
- public SevominUserManager UserManager { get; private set; }
-
- private IAuthenticationManager AuthenticationManager
- {
- get
- {
- return HttpContext.GetOwinContext().Authentication;
- }
- }
-
- [HttpPost]
- [ValidateAntiForgeryToken]
- public async Task<ActionResult> Signup(SignupViewModel model)
- {
- User user;
- if (model.IsAvalin)
- {
- user = new Avalin(model.Email, model.DisplayName);
- user.SignUpDate = DateTime.UtcNow;
- }
- else
- {
- user = new Dovomin(model.Email, model.DisplayName, string.Empty);
- user.SignUpDate = DateTime.UtcNow;
- }
- user.DisplayName = model.DisplayName;
- user.Email = model.Email;
- user.ConfirmationCode = Sevomin.Models.User.GetConfirmationCode();
- var result = await UserManager.CreateAsync(user, model.Password);
- if (result.Succeeded)
- {
- RoleManager<IdentityRole> roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(SevominDbContext.Current));
- if (!(await roleManager.RoleExistsAsync("Avalin")))
- await roleManager.CreateAsync(new IdentityRole("Avalin"));
-
- if (!(await roleManager.RoleExistsAsync("Dovomin")))
- await roleManager.CreateAsync(new IdentityRole("Dovomin"));
-
- //Todo: Check this
- UserManager.UserValidator = new UserValidator<User>(UserManager);
-
- if (user is Avalin)
- await UserManager.AddToRoleAsync(user.Id, "Avalin");
- else if(user is Dovomin)
- await UserManager.AddToRoleAsync(user.Id, "Dovomin");
-
- #if !DEBUG
- SevominEmailer emailer = new SevominEmailer();
- emailer.EmailType = EmailType.EmailConfirmation;
- emailer.Parameters.Add("display-name", user.DisplayName);
- emailer.Parameters.Add("confirmation-code", user.ConfirmationCode);
- await emailer.SendAsync(user.Email, true, false);
- #endif
-
- await SignInAsync(user, isPersistent: false);
- return RedirectToAction("MyProfile", "Account");
- }
- else
- {
- AddErrors(result);
- }
-
- return View("Intro", model);
- }
-
- public async Task<ActionResult> CheckUsername(string Email)
- {
- bool result = (await UserManager.FindByNameAsync(Email)) == null;
- if(result)
- return Json(true, JsonRequestBehavior.AllowGet);
-
- return Json("این ایمیل قبلا در سایت استفاده شده. کلمه عبور خود را فراموش کرده اید؟", JsonRequestBehavior.AllowGet);
- }
-
- public ActionResult ConfirmEmail(string code)
- {
- var user = UserRepository.Current.FindWithConfirmationCode(code);
- if (user == null)
- return HttpNotFound();
-
- if (Request.IsAuthenticated && User.Identity.Name.ToLower() != user.UserName.ToLower())
- {
- ViewBag.Result = new PostResultViewModel(false,
- string.Format("شما نمیتوانید با حساب کاربری {0} حساب دیگری را فعال کنید",
- User.Identity.Name));
- return View();
- }
-
- user.EmailConfirmed = true;
- user.ConfirmationCode = string.Empty;
-
- UserRepository.Current.Save();
- UrlHelper u = new UrlHelper(this.ControllerContext.RequestContext);
- ViewBag.Result = new PostResultViewModel(true, string.Format("حساب کاربری شما با موفقیت تایید شد. لطفا {0} سایت شوید",
- HtmlHelper.GenerateLink
- (this.ControllerContext.RequestContext, System.Web.Routing.RouteTable.Routes, "وارد", "Login", "Login", "Account", null, null)));
- return View();
- }
-
- public ActionResult Login(string returnUrl)
- {
- if(Request.IsAuthenticated)
- return RedirectToAction("Index", "Home");
-
- ViewBag.ReturnUrl = returnUrl;
- return View();
- }
-
- [HttpPost]
- [ValidateAntiForgeryToken]
- public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
- {
- if (ModelState.IsValid)
- {
- var user = await UserManager.FindAsync(model.Username, model.Password);
- if (user != null)
- {
- await SignInAsync(user, true);
- return RedirectToLocal(returnUrl);
- }
- else
- {
- ModelState.AddModelError("", "نام کاربری و یا کلمه عبور وارد شده صحیح نمی باشد.");
- }
- }
-
- // If we got this far, something failed, redisplay form
- return View(model);
- }
-
- public ActionResult Logout()
- {
- AuthenticationManager.SignOut();
- return RedirectToAction("Index", "Home");
- }
-
- public ActionResult Forgot()
- {
- return View();
- }
-
- [HttpPost]
- [ValidateAntiForgeryToken]
- public async Task<ActionResult> Forgot(ForgotPasswordViewModel model)
- {
- var user = UserRepository.Current.Find(model.Email);
- if (user == null)
- {
- ViewBag.Result = new PostResultViewModel(false, "کاربری با این آدرس ایمیل یافت نشد. لطفا دوباره تلاش کنید.");
- return View();
- }
- user.ConfirmationCode = Sevomin.Models.User.GetConfirmationCode();
- UserRepository.Current.Save();
-
-
-
- #if !DEBUG
- SevominEmailer emailer = new SevominEmailer {EmailType = EmailType.PasswordReset};
- emailer.Parameters.Add("display-name", user.DisplayName);
- emailer.Parameters.Add("reset-code", user.ConfirmationCode);
- await emailer.SendAsync(user.Email, true, false);
- #endif
-
- ViewBag.Result = new PostResultViewModel(true, "آدرس بازیابی رمز عبور برای شما ارسال شد.");
- return View();
- }
-
- public ActionResult ResetPassword(string code)
- {
- var user = UserRepository.Current.FindWithConfirmationCode(code);
- if (user == null)
- return HttpNotFound();
-
- ViewBag.Code = code;
- return View();
- }
-
- [HttpPost]
- [ValidateAntiForgeryToken]
- public async Task<ActionResult> ResetPassword(string code, ResetPasswordViewModel model)
- {
- var user = UserRepository.Current.FindWithConfirmationCode(code);
- if (user == null)
- return HttpNotFound();
-
- await UserManager.RemovePasswordAsync(user.Id);
- await UserManager.AddPasswordAsync(user.Id, model.Password);
- user.ConfirmationCode = string.Empty;
- UserRepository.Current.Save();
-
- ViewBag.Result = new PostResultViewModel(true, "رمز عبور شما با موفقیت بازنشانی شد.");
-
- return View();
- }
-
- [Authorize]
- public ActionResult ChangePassword()
- {
- return View();
- }
-
- [Authorize]
- [HttpPost]
- public async Task<ActionResult> ChangePassword(ChangePasswordViewModel model)
- {
- var user = await UserManager.FindAsync(User.Identity.Name, model.Password);
- if (user != null)
- {
- await UserManager.RemovePasswordAsync(user.Id);
- await UserManager.AddPasswordAsync(user.Id, model.NewPassword);
- UserRepository.Current.Save();
-
- ViewBag.Result = new PostResultViewModel(true, "رمز عبور شما با موفقیت به روز شد.");
- return View();
- }
- else
- {
- ViewBag.Result = new PostResultViewModel(false, "رمز عبور فعلی وارد شده با اطلاعات ما مطابقت ندارد. لطفا دوباره تلاش کنید.");
- return View();
- }
- }
-
-
- [Authorize(Roles = "Avalin,Dovomin")]
- public async Task<ActionResult> MyProfile(bool? success)
- {
- if (success.HasValue)
- {
- ViewBag.Result = new PostResultViewModel(success.Value, success.Value ? "پروفایل شما با موفقیت ویرایش شد." : "در ویرایش پروفایل شما خطایی رخ داده.");
- }
-
- User u = await UserManager.FindByNameAsync(User.Identity.Name);
- if (u is Avalin)
- {
- return View("ProfileAvalin", new AvalinViewModel((Avalin)u));
- }
- else
- {
- Dovomin dovomin = (Dovomin)u;
- DovominViewModel dvm = new DovominViewModel(dovomin);
- ViewBag.OptOutEmail = dovomin.OptOutEmail;
- return View("ProfileDovomin", dvm);
- }
- }
-
- [Authorize(Roles = "Dovomin")]
- [HttpPost]
- public async Task<ActionResult> ProfileDovomin(string JalaliBirthDate, string FirstName,
- string LastName, string ContactPersonEMail, bool IsFullTime,
- bool IsPartTime, string Description, bool OptOutEmail, HttpPostedFileBase EnglishResume, HttpPostedFileBase PersianResume, FormCollection form)
- {
- User u = await UserManager.FindByNameAsync(User.Identity.Name);
- if (u == null || !(u is Dovomin))
- throw new InvalidOperationException("نوع کاربر صحیح نیست");
-
- try
- {
- Dovomin dovomin = (Dovomin)u;
- dovomin.BirthDate = DateAssist.ValidateAndSetToMiladi(JalaliBirthDate);
- dovomin.Description = Description;
- dovomin.FirstName = FirstName;
- dovomin.LastName = LastName;
- dovomin.IsFulltime = IsFullTime;
- dovomin.IsPartTime = IsPartTime;
- dovomin.OptOutEmail = OptOutEmail;
-
- ParameterRepository.Current.AddParametersToDovomin(dovomin);
- foreach (var jp in dovomin.DovominParameters)
- {
- string value = form[string.Format("value-{0}", jp.Parameter.Id)];
- jp.SetValue(value);
- }
-
- if (EnglishResume != null)
- {
- dovomin.EnglishResume = string.Format("{0}-resume-en{2}", User.Identity.Name, "", System.IO.Path.GetExtension(EnglishResume.FileName));
- EnglishResume.SaveAs(System.IO.Path.Combine(Server.MapPath("~/App_Data/resumes"), dovomin.EnglishResume));
- }
- if (PersianResume != null)
- {
- dovomin.PersianResume = string.Format("{0}-resume-fa{2}", User.Identity.Name, "", System.IO.Path.GetExtension(PersianResume.FileName));
- PersianResume.SaveAs(System.IO.Path.Combine(Server.MapPath("~/App_Data/resumes"), dovomin.PersianResume));
- }
-
- SevominDbContext.Current.SaveChanges();
-
- return RedirectToAction("MyProfile", new { success = true });
- }
- catch (Exception)
- {
- throw;
- }
- }
-
- [Authorize(Roles = "Avalin")]
- [HttpPost]
- public async Task<ActionResult> ProfileAvalin(string CompanyName, string NationalId, string RegisterId,
- string Address, string CompanyPhoneNumber, string EMail)
- {
- User u = await UserManager.FindByNameAsync(User.Identity.Name);
- try
- {
- if (u == null || !(u is Avalin))
- throw new InvalidOperationException("نوع کاربر صحیح نیست");
- Avalin avalin = (Avalin)u;
- avalin.CompanyName = CompanyName;
- avalin.NationalId = NationalId;
- avalin.RegisterId = RegisterId;
- avalin.Address = Address;
- avalin.CompanyPhoneNumber = CompanyPhoneNumber;
- avalin.Email = EMail;
-
- SevominDbContext.Current.SaveChanges();
-
- return RedirectToAction("MyProfile", new { success = true });
- }
- catch (Exception)
- {
-
- throw;
- }
- }
-
- public async Task<ActionResult> Dovomin(string userId)
- {
- User user = await UserManager.FindByIdAsync(userId);
-
- if ((user as Dovomin) == null)
- return HttpNotFound();
-
- if (!User.IsInRole("God"))
- {
- if (User.IsInRole("Dovomin"))
- {
- if (userId != user.Id)
- {
- return HttpNotFound();
- }
- else { }
- }
- else if (User.IsInRole("Avalin"))
- {
- Avalin avalin = (await UserManager.FindByNameAsync(User.Identity.Name)) as Avalin;
- bool showIt = avalin.Jobs.Any(j =>
- {
- bool ret = j.Applications.Any(c => c.DovominId == userId);
- return ret;
- });
- if (!showIt)
- return HttpNotFound();
- }
- }
-
- return View(new DovominViewModel(user as Dovomin));
- }
-
- private async Task SignInAsync(User user, bool isPersistent)
- {
- AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
- var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);
- AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identity);
- }
-
- private ActionResult RedirectToLocal(string returnUrl)
- {
- if (Url.IsLocalUrl(returnUrl))
- {
- return Redirect(returnUrl);
- }
- else
- {
- return RedirectToAction("Index", "Home");
- }
- }
-
- private void AddErrors(IdentityResult result)
- {
- foreach (var error in result.Errors)
- {
- ModelState.AddModelError("", error);
- }
- }
- }
- }
|