This commit is contained in:
Mateusz Kaczor 2019-05-29 21:33:34 +02:00
parent 6575c022bf
commit 7d08d03918
52 changed files with 2085 additions and 1250 deletions

View File

@ -1,5 +1,4 @@
using System.Web;
using System.Web.Optimization;
using System.Web.Optimization;
namespace MovieBase
{

View File

@ -1,5 +1,4 @@
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc;
namespace MovieBase
{

View File

@ -1,110 +1,106 @@
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;
using System.Web;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
using Microsoft.AspNet.Identity.Owin;
using Microsoft.Owin;
using Microsoft.Owin.Security;
using MovieBase.DAL;
using MovieBase.Models;
using System;
using System.Security.Claims;
using System.Threading.Tasks;
namespace MovieBase
{
public class EmailService : IIdentityMessageService
{
public Task SendAsync(IdentityMessage message)
{
// Plug in your email service here to send an email.
return Task.FromResult(0);
}
}
public class SmsService : IIdentityMessageService
{
public Task SendAsync(IdentityMessage message)
{
// Plug in your SMS service here to send a text message.
return Task.FromResult(0);
}
}
// Configure the application user manager used in this application. UserManager is defined in ASP.NET Identity and is used by the application.
public class ApplicationUserManager : UserManager<ApplicationUser>
{
public ApplicationUserManager(IUserStore<ApplicationUser> store)
: base(store)
{
}
public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
{
var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()));
// Configure validation logic for usernames
manager.UserValidator = new UserValidator<ApplicationUser>(manager)
{
AllowOnlyAlphanumericUserNames = false,
RequireUniqueEmail = true
};
// Configure validation logic for passwords
manager.PasswordValidator = new PasswordValidator
{
RequiredLength = 6,
RequireNonLetterOrDigit = true,
RequireDigit = true,
RequireLowercase = true,
RequireUppercase = true,
};
// Configure user lockout defaults
manager.UserLockoutEnabledByDefault = true;
manager.DefaultAccountLockoutTimeSpan = TimeSpan.FromMinutes(5);
manager.MaxFailedAccessAttemptsBeforeLockout = 5;
// Register two factor authentication providers. This application uses Phone and Emails as a step of receiving a code for verifying the user
// You can write your own provider and plug it in here.
manager.RegisterTwoFactorProvider("Phone Code", new PhoneNumberTokenProvider<ApplicationUser>
{
MessageFormat = "Your security code is {0}"
});
manager.RegisterTwoFactorProvider("Email Code", new EmailTokenProvider<ApplicationUser>
{
Subject = "Security Code",
BodyFormat = "Your security code is {0}"
});
manager.EmailService = new EmailService();
manager.SmsService = new SmsService();
var dataProtectionProvider = options.DataProtectionProvider;
if (dataProtectionProvider != null)
{
manager.UserTokenProvider =
new DataProtectorTokenProvider<ApplicationUser>(dataProtectionProvider.Create("ASP.NET Identity"));
}
return manager;
}
}
// Configure the application sign-in manager which is used in this application.
public class ApplicationSignInManager : SignInManager<ApplicationUser, string>
{
public ApplicationSignInManager(ApplicationUserManager userManager, IAuthenticationManager authenticationManager)
: base(userManager, authenticationManager)
{
}
public override Task<ClaimsIdentity> CreateUserIdentityAsync(ApplicationUser user)
{
return user.GenerateUserIdentityAsync((ApplicationUserManager)UserManager);
}
public static ApplicationSignInManager Create(IdentityFactoryOptions<ApplicationSignInManager> options, IOwinContext context)
{
return new ApplicationSignInManager(context.GetUserManager<ApplicationUserManager>(), context.Authentication);
}
}
{
public class EmailService : IIdentityMessageService
{
public Task SendAsync(IdentityMessage message)
{
// Plug in your email service here to send an email.
return Task.FromResult(0);
}
}
public class SmsService : IIdentityMessageService
{
public Task SendAsync(IdentityMessage message)
{
// Plug in your SMS service here to send a text message.
return Task.FromResult(0);
}
}
// Configure the application user manager used in this application. UserManager is defined in ASP.NET Identity and is used by the application.
public class ApplicationUserManager : UserManager<ApplicationUser>
{
public ApplicationUserManager(IUserStore<ApplicationUser> store)
: base(store)
{
}
public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
{
var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()));
// Configure validation logic for usernames
manager.UserValidator = new UserValidator<ApplicationUser>(manager)
{
AllowOnlyAlphanumericUserNames = false,
RequireUniqueEmail = true
};
// Configure validation logic for passwords
manager.PasswordValidator = new PasswordValidator
{
RequiredLength = 6,
RequireNonLetterOrDigit = true,
RequireDigit = true,
RequireLowercase = true,
RequireUppercase = true,
};
// Configure user lockout defaults
manager.UserLockoutEnabledByDefault = true;
manager.DefaultAccountLockoutTimeSpan = TimeSpan.FromMinutes(5);
manager.MaxFailedAccessAttemptsBeforeLockout = 5;
// Register two factor authentication providers. This application uses Phone and Emails as a step of receiving a code for verifying the user
// You can write your own provider and plug it in here.
manager.RegisterTwoFactorProvider("Phone Code", new PhoneNumberTokenProvider<ApplicationUser>
{
MessageFormat = "Your security code is {0}"
});
manager.RegisterTwoFactorProvider("Email Code", new EmailTokenProvider<ApplicationUser>
{
Subject = "Security Code",
BodyFormat = "Your security code is {0}"
});
manager.EmailService = new EmailService();
manager.SmsService = new SmsService();
var dataProtectionProvider = options.DataProtectionProvider;
if (dataProtectionProvider != null)
{
manager.UserTokenProvider =
new DataProtectorTokenProvider<ApplicationUser>(dataProtectionProvider.Create("ASP.NET Identity"));
}
return manager;
}
}
// Configure the application sign-in manager which is used in this application.
public class ApplicationSignInManager : SignInManager<ApplicationUser, string>
{
public ApplicationSignInManager(ApplicationUserManager userManager, IAuthenticationManager authenticationManager)
: base(userManager, authenticationManager)
{
}
public override Task<ClaimsIdentity> CreateUserIdentityAsync(ApplicationUser user)
{
return user.GenerateUserIdentityAsync((ApplicationUserManager)UserManager);
}
public static ApplicationSignInManager Create(IdentityFactoryOptions<ApplicationSignInManager> options, IOwinContext context)
{
return new ApplicationSignInManager(context.GetUserManager<ApplicationUserManager>(), context.Authentication);
}
}
}

View File

@ -1,8 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc;
using System.Web.Routing;
namespace MovieBase
@ -12,7 +8,11 @@ namespace MovieBase
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
//routes.MapRoute(
// name: "TopWatched",
// url: "TopWatched",
// defaults: new { controller = "TopWatched", action = "GetTopWatched" }
// );
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",

View File

@ -1,69 +1,68 @@
using System;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
using Microsoft.Owin;
using Microsoft.Owin.Security.Cookies;
using Microsoft.Owin.Security.Google;
using Owin;
using MovieBase.Models;
using MovieBase.DAL;
using MovieBase.Models;
using Owin;
using System;
namespace MovieBase
{
public partial class Startup
{
// For more information on configuring authentication, please visit https://go.microsoft.com/fwlink/?LinkId=301864
public void ConfigureAuth(IAppBuilder app)
{
// Configure the db context, user manager and signin manager to use a single instance per request
app.CreatePerOwinContext(ApplicationDbContext.Create);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);
public partial class Startup
{
// For more information on configuring authentication, please visit https://go.microsoft.com/fwlink/?LinkId=301864
public void ConfigureAuth(IAppBuilder app)
{
// Configure the db context, user manager and signin manager to use a single instance per request
app.CreatePerOwinContext(ApplicationDbContext.Create);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);
// Enable the application to use a cookie to store information for the signed in user
// and to use a cookie to temporarily store information about a user logging in with a third party login provider
// Configure the sign in cookie
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
Provider = new CookieAuthenticationProvider
{
// Enables the application to validate the security stamp when the user logs in.
// This is a security feature which is used when you change a password or add an external login to your account.
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
validateInterval: TimeSpan.FromMinutes(30),
regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
}
});
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
// Enable the application to use a cookie to store information for the signed in user
// and to use a cookie to temporarily store information about a user logging in with a third party login provider
// Configure the sign in cookie
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
Provider = new CookieAuthenticationProvider
{
// Enables the application to validate the security stamp when the user logs in.
// This is a security feature which is used when you change a password or add an external login to your account.
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
validateInterval: TimeSpan.FromMinutes(30),
regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
}
});
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
// Enables the application to temporarily store user information when they are verifying the second factor in the two-factor authentication process.
app.UseTwoFactorSignInCookie(DefaultAuthenticationTypes.TwoFactorCookie, TimeSpan.FromMinutes(5));
// Enables the application to temporarily store user information when they are verifying the second factor in the two-factor authentication process.
app.UseTwoFactorSignInCookie(DefaultAuthenticationTypes.TwoFactorCookie, TimeSpan.FromMinutes(5));
// Enables the application to remember the second login verification factor such as phone or email.
// Once you check this option, your second step of verification during the login process will be remembered on the device where you logged in from.
// This is similar to the RememberMe option when you log in.
app.UseTwoFactorRememberBrowserCookie(DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie);
// Enables the application to remember the second login verification factor such as phone or email.
// Once you check this option, your second step of verification during the login process will be remembered on the device where you logged in from.
// This is similar to the RememberMe option when you log in.
app.UseTwoFactorRememberBrowserCookie(DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie);
// Uncomment the following lines to enable logging in with third party login providers
//app.UseMicrosoftAccountAuthentication(
// clientId: "",
// clientSecret: "");
// Uncomment the following lines to enable logging in with third party login providers
//app.UseMicrosoftAccountAuthentication(
// clientId: "",
// clientSecret: "");
//app.UseTwitterAuthentication(
// consumerKey: "",
// consumerSecret: "");
//app.UseTwitterAuthentication(
// consumerKey: "",
// consumerSecret: "");
//app.UseFacebookAuthentication(
// appId: "",
// appSecret: "");
//app.UseFacebookAuthentication(
// appId: "",
// appSecret: "");
//app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions()
//{
// ClientId = "",
// ClientSecret = ""
//});
}
}
//app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions()
//{
// ClientId = "",
// ClientSecret = ""
//});
}
}
}

View File

@ -1,15 +1,12 @@
using System;
using System.Globalization;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;
using System.Web;
using System.Web.Mvc;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
using Microsoft.Owin.Security;
using MovieBase.Models;
using MovieBase.ViewModels;
using System.Linq;
using System.Threading.Tasks;
using System.Web;
using System.Web.Mvc;
namespace MovieBase.Controllers
{

View File

@ -1,8 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc;
namespace MovieBase.Controllers
{

View File

@ -1,390 +1,388 @@
using System;
using System.Linq;
using System.Threading.Tasks;
using System.Web;
using System.Web.Mvc;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
using Microsoft.Owin.Security;
using MovieBase.Models;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
using Microsoft.Owin.Security;
using MovieBase.ViewModels;
using System.Linq;
using System.Threading.Tasks;
using System.Web;
using System.Web.Mvc;
namespace MovieBase.Controllers
{
// [Authorize]
public class ManageController : Controller
{
private ApplicationSignInManager _signInManager;
private ApplicationUserManager _userManager;
public ManageController()
{
}
public ManageController(ApplicationUserManager userManager, ApplicationSignInManager signInManager)
{
UserManager = userManager;
SignInManager = signInManager;
}
public ApplicationSignInManager SignInManager
{
get
{
return _signInManager ?? HttpContext.GetOwinContext().Get<ApplicationSignInManager>();
}
private set
{
_signInManager = value;
}
}
public ApplicationUserManager UserManager
{
get
{
return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
}
private set
{
_userManager = value;
}
}
//
// GET: /Manage/Index
public async Task<ActionResult> Index(ManageMessageId? message)
{
ViewBag.StatusMessage =
message == ManageMessageId.ChangePasswordSuccess ? "Your password has been changed."
: message == ManageMessageId.SetPasswordSuccess ? "Your password has been set."
: message == ManageMessageId.SetTwoFactorSuccess ? "Your two-factor authentication provider has been set."
: message == ManageMessageId.Error ? "An error has occurred."
: message == ManageMessageId.AddPhoneSuccess ? "Your phone number was added."
: message == ManageMessageId.RemovePhoneSuccess ? "Your phone number was removed."
: "";
var userId = User.Identity.GetUserId();
var model = new IndexViewModel
{
HasPassword = HasPassword(),
PhoneNumber = await UserManager.GetPhoneNumberAsync(userId),
TwoFactor = await UserManager.GetTwoFactorEnabledAsync(userId),
Logins = await UserManager.GetLoginsAsync(userId),
BrowserRemembered = await AuthenticationManager.TwoFactorBrowserRememberedAsync(userId)
};
return View(model);
}
//
// POST: /Manage/RemoveLogin
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> RemoveLogin(string loginProvider, string providerKey)
{
ManageMessageId? message;
var result = await UserManager.RemoveLoginAsync(User.Identity.GetUserId(), new UserLoginInfo(loginProvider, providerKey));
if (result.Succeeded)
{
var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
if (user != null)
{
await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
}
message = ManageMessageId.RemoveLoginSuccess;
}
else
{
message = ManageMessageId.Error;
}
return RedirectToAction("ManageLogins", new { Message = message });
}
//
// GET: /Manage/AddPhoneNumber
public ActionResult AddPhoneNumber()
{
return View();
}
//
// POST: /Manage/AddPhoneNumber
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> AddPhoneNumber(AddPhoneNumberViewModel model)
{
if (!ModelState.IsValid)
{
return View(model);
}
// Generate the token and send it
var code = await UserManager.GenerateChangePhoneNumberTokenAsync(User.Identity.GetUserId(), model.Number);
if (UserManager.SmsService != null)
{
var message = new IdentityMessage
{
Destination = model.Number,
Body = "Your security code is: " + code
};
await UserManager.SmsService.SendAsync(message);
}
return RedirectToAction("VerifyPhoneNumber", new { PhoneNumber = model.Number });
}
//
// POST: /Manage/EnableTwoFactorAuthentication
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> EnableTwoFactorAuthentication()
{
await UserManager.SetTwoFactorEnabledAsync(User.Identity.GetUserId(), true);
var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
if (user != null)
{
await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
}
return RedirectToAction("Index", "Manage");
}
//
// POST: /Manage/DisableTwoFactorAuthentication
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> DisableTwoFactorAuthentication()
{
await UserManager.SetTwoFactorEnabledAsync(User.Identity.GetUserId(), false);
var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
if (user != null)
{
await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
}
return RedirectToAction("Index", "Manage");
}
//
// GET: /Manage/VerifyPhoneNumber
public async Task<ActionResult> VerifyPhoneNumber(string phoneNumber)
{
var code = await UserManager.GenerateChangePhoneNumberTokenAsync(User.Identity.GetUserId(), phoneNumber);
// Send an SMS through the SMS provider to verify the phone number
return phoneNumber == null ? View("Error") : View(new VerifyPhoneNumberViewModel { PhoneNumber = phoneNumber });
}
//
// POST: /Manage/VerifyPhoneNumber
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> VerifyPhoneNumber(VerifyPhoneNumberViewModel model)
{
if (!ModelState.IsValid)
{
return View(model);
}
var result = await UserManager.ChangePhoneNumberAsync(User.Identity.GetUserId(), model.PhoneNumber, model.Code);
if (result.Succeeded)
{
var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
if (user != null)
{
await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
}
return RedirectToAction("Index", new { Message = ManageMessageId.AddPhoneSuccess });
}
// If we got this far, something failed, redisplay form
ModelState.AddModelError("", "Failed to verify phone");
return View(model);
}
//
// POST: /Manage/RemovePhoneNumber
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> RemovePhoneNumber()
{
var result = await UserManager.SetPhoneNumberAsync(User.Identity.GetUserId(), null);
if (!result.Succeeded)
{
return RedirectToAction("Index", new { Message = ManageMessageId.Error });
}
var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
if (user != null)
{
await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
}
return RedirectToAction("Index", new { Message = ManageMessageId.RemovePhoneSuccess });
}
//
// GET: /Manage/ChangePassword
public ActionResult ChangePassword()
{
return View();
}
//
// POST: /Manage/ChangePassword
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> ChangePassword(ChangePasswordViewModel model)
{
if (!ModelState.IsValid)
{
return View(model);
}
var result = await UserManager.ChangePasswordAsync(User.Identity.GetUserId(), model.OldPassword, model.NewPassword);
if (result.Succeeded)
{
var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
if (user != null)
{
await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
}
return RedirectToAction("Index", new { Message = ManageMessageId.ChangePasswordSuccess });
}
AddErrors(result);
return View(model);
}
//
// GET: /Manage/SetPassword
public ActionResult SetPassword()
{
return View();
}
//
// POST: /Manage/SetPassword
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> SetPassword(SetPasswordViewModel model)
{
if (ModelState.IsValid)
{
var result = await UserManager.AddPasswordAsync(User.Identity.GetUserId(), model.NewPassword);
if (result.Succeeded)
{
var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
if (user != null)
{
await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
}
return RedirectToAction("Index", new { Message = ManageMessageId.SetPasswordSuccess });
}
AddErrors(result);
}
// If we got this far, something failed, redisplay form
return View(model);
}
//
// GET: /Manage/ManageLogins
public async Task<ActionResult> ManageLogins(ManageMessageId? message)
{
ViewBag.StatusMessage =
message == ManageMessageId.RemoveLoginSuccess ? "The external login was removed."
: message == ManageMessageId.Error ? "An error has occurred."
: "";
var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
if (user == null)
{
return View("Error");
}
var userLogins = await UserManager.GetLoginsAsync(User.Identity.GetUserId());
var otherLogins = AuthenticationManager.GetExternalAuthenticationTypes().Where(auth => userLogins.All(ul => auth.AuthenticationType != ul.LoginProvider)).ToList();
ViewBag.ShowRemoveButton = user.PasswordHash != null || userLogins.Count > 1;
return View(new ManageLoginsViewModel
{
CurrentLogins = userLogins,
OtherLogins = otherLogins
});
}
//
// POST: /Manage/LinkLogin
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult LinkLogin(string provider)
{
// Request a redirect to the external login provider to link a login for the current user
return new AccountController.ChallengeResult(provider, Url.Action("LinkLoginCallback", "Manage"), User.Identity.GetUserId());
}
//
// GET: /Manage/LinkLoginCallback
public async Task<ActionResult> LinkLoginCallback()
{
var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync(XsrfKey, User.Identity.GetUserId());
if (loginInfo == null)
{
return RedirectToAction("ManageLogins", new { Message = ManageMessageId.Error });
}
var result = await UserManager.AddLoginAsync(User.Identity.GetUserId(), loginInfo.Login);
return result.Succeeded ? RedirectToAction("ManageLogins") : RedirectToAction("ManageLogins", new { Message = ManageMessageId.Error });
}
protected override void Dispose(bool disposing)
{
if (disposing && _userManager != null)
{
_userManager.Dispose();
_userManager = null;
}
base.Dispose(disposing);
}
#region Helpers
// Used for XSRF protection when adding external logins
private const string XsrfKey = "XsrfId";
private IAuthenticationManager AuthenticationManager
{
get
{
return HttpContext.GetOwinContext().Authentication;
}
}
private void AddErrors(IdentityResult result)
{
foreach (var error in result.Errors)
{
ModelState.AddModelError("", error);
}
}
private bool HasPassword()
{
var user = UserManager.FindById(User.Identity.GetUserId());
if (user != null)
{
return user.PasswordHash != null;
}
return false;
}
private bool HasPhoneNumber()
{
var user = UserManager.FindById(User.Identity.GetUserId());
if (user != null)
{
return user.PhoneNumber != null;
}
return false;
}
public enum ManageMessageId
{
AddPhoneSuccess,
ChangePasswordSuccess,
SetTwoFactorSuccess,
SetPasswordSuccess,
RemoveLoginSuccess,
RemovePhoneSuccess,
Error
}
#endregion
}
namespace MovieBase.Controllers
{
[Authorize]
public class ManageController : Controller
{
private ApplicationSignInManager _signInManager;
private ApplicationUserManager _userManager;
public ManageController()
{
}
public ManageController(ApplicationUserManager userManager, ApplicationSignInManager signInManager)
{
UserManager = userManager;
SignInManager = signInManager;
}
public ApplicationSignInManager SignInManager
{
get
{
return _signInManager ?? HttpContext.GetOwinContext().Get<ApplicationSignInManager>();
}
private set
{
_signInManager = value;
}
}
public ApplicationUserManager UserManager
{
get
{
return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
}
private set
{
_userManager = value;
}
}
//
// GET: /Manage/Index
public async Task<ActionResult> Index(ManageMessageId? message)
{
ViewBag.StatusMessage =
message == ManageMessageId.ChangePasswordSuccess ? "Your password has been changed."
: message == ManageMessageId.SetPasswordSuccess ? "Your password has been set."
: message == ManageMessageId.SetTwoFactorSuccess ? "Your two-factor authentication provider has been set."
: message == ManageMessageId.Error ? "An error has occurred."
: message == ManageMessageId.AddPhoneSuccess ? "Your phone number was added."
: message == ManageMessageId.RemovePhoneSuccess ? "Your phone number was removed."
: "";
var userId = User.Identity.GetUserId();
var model = new IndexViewModel
{
HasPassword = HasPassword(),
PhoneNumber = await UserManager.GetPhoneNumberAsync(userId),
TwoFactor = await UserManager.GetTwoFactorEnabledAsync(userId),
Logins = await UserManager.GetLoginsAsync(userId),
BrowserRemembered = await AuthenticationManager.TwoFactorBrowserRememberedAsync(userId)
};
return View(model);
}
//
// POST: /Manage/RemoveLogin
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> RemoveLogin(string loginProvider, string providerKey)
{
ManageMessageId? message;
var result = await UserManager.RemoveLoginAsync(User.Identity.GetUserId(), new UserLoginInfo(loginProvider, providerKey));
if (result.Succeeded)
{
var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
if (user != null)
{
await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
}
message = ManageMessageId.RemoveLoginSuccess;
}
else
{
message = ManageMessageId.Error;
}
return RedirectToAction("ManageLogins", new { Message = message });
}
//
// GET: /Manage/AddPhoneNumber
public ActionResult AddPhoneNumber()
{
return View();
}
//
// POST: /Manage/AddPhoneNumber
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> AddPhoneNumber(AddPhoneNumberViewModel model)
{
if (!ModelState.IsValid)
{
return View(model);
}
// Generate the token and send it
var code = await UserManager.GenerateChangePhoneNumberTokenAsync(User.Identity.GetUserId(), model.Number);
if (UserManager.SmsService != null)
{
var message = new IdentityMessage
{
Destination = model.Number,
Body = "Your security code is: " + code
};
await UserManager.SmsService.SendAsync(message);
}
return RedirectToAction("VerifyPhoneNumber", new { PhoneNumber = model.Number });
}
//
// POST: /Manage/EnableTwoFactorAuthentication
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> EnableTwoFactorAuthentication()
{
await UserManager.SetTwoFactorEnabledAsync(User.Identity.GetUserId(), true);
var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
if (user != null)
{
await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
}
return RedirectToAction("Index", "Manage");
}
//
// POST: /Manage/DisableTwoFactorAuthentication
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> DisableTwoFactorAuthentication()
{
await UserManager.SetTwoFactorEnabledAsync(User.Identity.GetUserId(), false);
var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
if (user != null)
{
await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
}
return RedirectToAction("Index", "Manage");
}
//
// GET: /Manage/VerifyPhoneNumber
public async Task<ActionResult> VerifyPhoneNumber(string phoneNumber)
{
var code = await UserManager.GenerateChangePhoneNumberTokenAsync(User.Identity.GetUserId(), phoneNumber);
// Send an SMS through the SMS provider to verify the phone number
return phoneNumber == null ? View("Error") : View(new VerifyPhoneNumberViewModel { PhoneNumber = phoneNumber });
}
//
// POST: /Manage/VerifyPhoneNumber
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> VerifyPhoneNumber(VerifyPhoneNumberViewModel model)
{
if (!ModelState.IsValid)
{
return View(model);
}
var result = await UserManager.ChangePhoneNumberAsync(User.Identity.GetUserId(), model.PhoneNumber, model.Code);
if (result.Succeeded)
{
var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
if (user != null)
{
await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
}
return RedirectToAction("Index", new { Message = ManageMessageId.AddPhoneSuccess });
}
// If we got this far, something failed, redisplay form
ModelState.AddModelError("", "Failed to verify phone");
return View(model);
}
//
// POST: /Manage/RemovePhoneNumber
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> RemovePhoneNumber()
{
var result = await UserManager.SetPhoneNumberAsync(User.Identity.GetUserId(), null);
if (!result.Succeeded)
{
return RedirectToAction("Index", new { Message = ManageMessageId.Error });
}
var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
if (user != null)
{
await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
}
return RedirectToAction("Index", new { Message = ManageMessageId.RemovePhoneSuccess });
}
//
// GET: /Manage/ChangePassword
public ActionResult ChangePassword()
{
return View();
}
//
// POST: /Manage/ChangePassword
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> ChangePassword(ChangePasswordViewModel model)
{
if (!ModelState.IsValid)
{
return View(model);
}
var result = await UserManager.ChangePasswordAsync(User.Identity.GetUserId(), model.OldPassword, model.NewPassword);
if (result.Succeeded)
{
var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
if (user != null)
{
await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
}
return RedirectToAction("Index", new { Message = ManageMessageId.ChangePasswordSuccess });
}
AddErrors(result);
return View(model);
}
//
// GET: /Manage/SetPassword
public ActionResult SetPassword()
{
return View();
}
//
// POST: /Manage/SetPassword
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> SetPassword(SetPasswordViewModel model)
{
if (ModelState.IsValid)
{
var result = await UserManager.AddPasswordAsync(User.Identity.GetUserId(), model.NewPassword);
if (result.Succeeded)
{
var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
if (user != null)
{
await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
}
return RedirectToAction("Index", new { Message = ManageMessageId.SetPasswordSuccess });
}
AddErrors(result);
}
// If we got this far, something failed, redisplay form
return View(model);
}
//
// GET: /Manage/ManageLogins
public async Task<ActionResult> ManageLogins(ManageMessageId? message)
{
ViewBag.StatusMessage =
message == ManageMessageId.RemoveLoginSuccess ? "The external login was removed."
: message == ManageMessageId.Error ? "An error has occurred."
: "";
var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
if (user == null)
{
return View("Error");
}
var userLogins = await UserManager.GetLoginsAsync(User.Identity.GetUserId());
var otherLogins = AuthenticationManager.GetExternalAuthenticationTypes().Where(auth => userLogins.All(ul => auth.AuthenticationType != ul.LoginProvider)).ToList();
ViewBag.ShowRemoveButton = user.PasswordHash != null || userLogins.Count > 1;
return View(new ManageLoginsViewModel
{
CurrentLogins = userLogins,
OtherLogins = otherLogins
});
}
//
// POST: /Manage/LinkLogin
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult LinkLogin(string provider)
{
// Request a redirect to the external login provider to link a login for the current user
return new AccountController.ChallengeResult(provider, Url.Action("LinkLoginCallback", "Manage"), User.Identity.GetUserId());
}
//
// GET: /Manage/LinkLoginCallback
public async Task<ActionResult> LinkLoginCallback()
{
var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync(XsrfKey, User.Identity.GetUserId());
if (loginInfo == null)
{
return RedirectToAction("ManageLogins", new { Message = ManageMessageId.Error });
}
var result = await UserManager.AddLoginAsync(User.Identity.GetUserId(), loginInfo.Login);
return result.Succeeded ? RedirectToAction("ManageLogins") : RedirectToAction("ManageLogins", new { Message = ManageMessageId.Error });
}
protected override void Dispose(bool disposing)
{
if (disposing && _userManager != null)
{
_userManager.Dispose();
_userManager = null;
}
base.Dispose(disposing);
}
#region Helpers
// Used for XSRF protection when adding external logins
private const string XsrfKey = "XsrfId";
private IAuthenticationManager AuthenticationManager
{
get
{
return HttpContext.GetOwinContext().Authentication;
}
}
private void AddErrors(IdentityResult result)
{
foreach (var error in result.Errors)
{
ModelState.AddModelError("", error);
}
}
private bool HasPassword()
{
var user = UserManager.FindById(User.Identity.GetUserId());
if (user != null)
{
return user.PasswordHash != null;
}
return false;
}
private bool HasPhoneNumber()
{
var user = UserManager.FindById(User.Identity.GetUserId());
if (user != null)
{
return user.PhoneNumber != null;
}
return false;
}
public enum ManageMessageId
{
AddPhoneSuccess,
ChangePasswordSuccess,
SetTwoFactorSuccess,
SetPasswordSuccess,
RemoveLoginSuccess,
RemovePhoneSuccess,
Error
}
#endregion
}
}

View File

@ -1,8 +1,8 @@
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
using Microsoft.EntityFrameworkCore;
using MovieBase.DAL;
using MovieBase.Models;
using Newtonsoft.Json;
using PagedList;
using System;
using System.Collections.Generic;
@ -15,11 +15,23 @@ using System.Web.Mvc;
namespace MovieBase.Controllers
{
//[Authorize]
public class MovieController : Controller
{
[Authorize]
public class MovieController : Controller
{
private ApplicationUserManager _userManager;
private ApplicationDbContext db = new ApplicationDbContext();
private ApplicationDbContext _dbContext;
public ApplicationDbContext DbContext
{
get
{
return _dbContext ?? HttpContext.GetOwinContext().Get<ApplicationDbContext>();
}
private set
{
_dbContext = value;
}
}
public ApplicationUserManager AppUserManager
{
@ -35,10 +47,9 @@ namespace MovieBase.Controllers
public MovieController()
{
}
// GET: Movie
public ActionResult Index(int? page, string searchString)
{
@ -47,7 +58,7 @@ namespace MovieBase.Controllers
var userId = User.Identity.GetUserId();
var movies = db.Movies.Where(m => m.WatchedByUsers.Select(u => u.Id).Contains(userId));
var movies = DbContext.Movies.Where(m => m.WatchedByUsers.Select(u => u.Id).Contains(userId));
if (!string.IsNullOrEmpty(searchString))
{
@ -57,12 +68,12 @@ namespace MovieBase.Controllers
ViewBag.SearchString = searchString;
int pageNumber = page ?? 1;
return View(movies.OrderBy(m => m.Title).ToPagedList(pageNumber, 3));
}
}
// GET: Movie/Create
public ActionResult Create()
{
if(TempData["imdbMovie"] != null)
if (TempData["imdbMovie"] != null)
{
return View(TempData["imdbMovie"]);
}
@ -74,7 +85,7 @@ namespace MovieBase.Controllers
{
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "Title, Plot, WatchedDate, Poster")]Movie movie)
@ -84,26 +95,20 @@ namespace MovieBase.Controllers
if (ModelState.IsValid)
{
var user = AppUserManager.FindById(User.Identity.GetUserId());
using(var dbcontext = new ApplicationDbContext())
if (movie.WatchedByUsers == null)
{
if (dbcontext.Movies.Any(m => m.Title == movie.Title))
{
var dbMovie = dbcontext.Movies.FirstOrDefault(m => m.Title == movie.Title);
if(dbMovie.WatchedByUsers == null)
{
dbMovie.WatchedByUsers = new List<ApplicationUser>();
}
dbMovie.WatchedByUsers.Add(user);
}
else
{
movie.WatchedByUsers.Add(user);
dbcontext.Movies.Add(movie);
}
dbcontext.SaveChanges();
movie.WatchedByUsers = new List<ApplicationUser>();
}
return RedirectToAction("Index");
movie.WatchedByUsers.Add(user);
DbContext.Movies.Add(movie);
}
DbContext.SaveChanges();
return RedirectToAction("Index");
}
catch (RetryLimitExceededException /* dex */)
{
@ -121,7 +126,7 @@ namespace MovieBase.Controllers
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Movie movie = db.Movies.Find(id);
Movie movie = DbContext.Movies.Find(id);
if (movie == null)
{
return HttpNotFound();
@ -136,7 +141,7 @@ namespace MovieBase.Controllers
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Movie movie = db.Movies.Find(id);
Movie movie = DbContext.Movies.Find(id);
if (movie == null)
{
return HttpNotFound();
@ -144,7 +149,7 @@ namespace MovieBase.Controllers
return View(movie);
}
// POST: Student/Edit/5
// POST: Movie/Edit/5
[HttpPost, ActionName("Edit")]
[ValidateAntiForgeryToken]
public ActionResult EditPost(Guid? id)
@ -153,13 +158,13 @@ namespace MovieBase.Controllers
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
var movieToUpdate = db.Movies.Find(id);
var movieToUpdate = DbContext.Movies.Find(id);
if (TryUpdateModel(movieToUpdate, "",
new string[] { "Title", "Plot", "WatchedDate" }))
{
try
{
db.SaveChanges();
DbContext.SaveChanges();
return RedirectToAction("Index");
}
@ -172,7 +177,7 @@ namespace MovieBase.Controllers
return View(movieToUpdate);
}
// GET: Movie/Delete/5
// GET: Movie/Delete/guid
public ActionResult Delete(Guid? id, bool? saveChangesError = false)
{
if (id == null)
@ -183,7 +188,7 @@ namespace MovieBase.Controllers
{
ViewBag.ErrorMessage = "Delete failed. Try again, and if the problem persists see your system administrator.";
}
Movie movie = db.Movies.Find(id);
Movie movie = DbContext.Movies.Find(id);
if (movie == null)
{
return HttpNotFound();
@ -191,16 +196,16 @@ namespace MovieBase.Controllers
return View(movie);
}
// POST: Student/Delete/5
// POST: Movie/Delete/guid
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Delete(Guid? id)
{
try
{
Movie movie = db.Movies.Find(id);
db.Movies.Remove(movie);
db.SaveChanges();
var movie = DbContext.Movies.Include(x => x.WatchedByUsers).FirstOrDefault(x => x.MovieId == id);
DbContext.Movies.Remove(movie);
DbContext.SaveChanges();
}
catch (RetryLimitExceededException/* dex */)
{

View File

@ -1,37 +1,25 @@
using MovieBase.Models;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Web;
using System.Web.Mvc;
namespace MovieBase.Controllers
{
//[Authorize]
public class SearchController : Controller
{
[Authorize]
public class SearchController : Controller
{
public ActionResult Index()
{
return View();
}
//public ActionResult Index(string title)
//{
// if (ModelState.IsValid)
// {
// return RedirectToAction("Search", new { title });
// }
// ViewBag.Title = title;
// return View();
//}
// GET: Search
public async System.Threading.Tasks.Task<ActionResult> Search(string title)
{
HttpClient client = new HttpClient();
//TODO: move this to configuration;
string apiKey = "66d8dcd4";
HttpResponseMessage responseMessage = await client.GetAsync(String.Format(@"http://www.omdbapi.com/?t={0}&apikey={1}", title, apiKey));
if (!responseMessage.IsSuccessStatusCode)
{

View File

@ -0,0 +1,47 @@
using Microsoft.AspNet.Identity.Owin;
using MovieBase.DAL;
using MovieBase.ViewModels;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MovieBase.Controllers
{
[Authorize]
public class TopWatchedController : Controller
{
private ApplicationDbContext _dbContext;
public ApplicationDbContext DbContext
{
get
{
return _dbContext ?? HttpContext.GetOwinContext().Get<ApplicationDbContext>();
}
private set
{
_dbContext = value;
}
}
public ActionResult Index()
{
return View();
}
[HttpGet]
public JsonResult GetTopWatched()
{
List<TopWatchedMovie> topMovieList = DbContext.Movies.
Include(m => m.WatchedByUsers).
GroupBy(z => z.Title).
Select(x => new TopWatchedMovie() { MovieTitle = x.Key, Count = x.Count() }).
OrderByDescending(x => x.Count).
Take(5).ToList();
return this.Json(topMovieList, JsonRequestBehavior.AllowGet);
}
}
}

View File

@ -1,18 +1,13 @@
using Microsoft.AspNet.Identity.EntityFramework;
using MovieBase.Models;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;
using System.Linq;
using System.Web;
namespace MovieBase.DAL
{
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public DbSet<Movie> Movies { get; set; }
//public DbSet<Actor> Actors { get; set; }
public ApplicationDbContext()
: base("DefaultConnection", throwIfV1Schema: false)
@ -27,12 +22,9 @@ namespace MovieBase.DAL
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Movie>().Property(x => x.MovieId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
//modelBuilder.Entity<Actor>().Property(x => x.ActorId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
modelBuilder.Entity<Movie>().HasKey(movie => movie.MovieId);
//modelBuilder.Entity<Actor>().HasKey(actor => actor.ActorId);
//modelBuilder.Entity<Movie>().HasMany(movie => movie.StarringActors).WithMany(actor => actor.Movies);
modelBuilder.Entity<ApplicationUser>().HasMany(user => user.WatchedMovies).WithMany(movie => movie.WatchedByUsers);
base.OnModelCreating(modelBuilder);
}

View File

@ -1,21 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
namespace MovieBase
{
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
}

View File

@ -1,139 +1,138 @@
namespace MovieBase.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class Initial : DbMigration
{
public override void Up()
{
CreateTable(
"dbo.Actors",
c => new
{
ActorId = c.Guid(nullable: false, identity: true),
FirstName = c.String(),
LastName = c.String(),
})
.PrimaryKey(t => t.ActorId);
CreateTable(
"dbo.Movies",
c => new
{
MovieId = c.Guid(nullable: false, identity: true),
Name = c.String(),
ProductionTime = c.DateTime(nullable: false),
})
.PrimaryKey(t => t.MovieId);
CreateTable(
"dbo.AspNetRoles",
c => new
{
Id = c.String(nullable: false, maxLength: 128),
Name = c.String(nullable: false, maxLength: 256),
})
.PrimaryKey(t => t.Id)
.Index(t => t.Name, unique: true, name: "RoleNameIndex");
CreateTable(
"dbo.AspNetUserRoles",
c => new
{
UserId = c.String(nullable: false, maxLength: 128),
RoleId = c.String(nullable: false, maxLength: 128),
})
.PrimaryKey(t => new { t.UserId, t.RoleId })
.ForeignKey("dbo.AspNetRoles", t => t.RoleId, cascadeDelete: true)
.ForeignKey("dbo.AspNetUsers", t => t.UserId, cascadeDelete: true)
.Index(t => t.UserId)
.Index(t => t.RoleId);
CreateTable(
"dbo.AspNetUsers",
c => new
{
Id = c.String(nullable: false, maxLength: 128),
Email = c.String(maxLength: 256),
EmailConfirmed = c.Boolean(nullable: false),
PasswordHash = c.String(),
SecurityStamp = c.String(),
PhoneNumber = c.String(),
PhoneNumberConfirmed = c.Boolean(nullable: false),
TwoFactorEnabled = c.Boolean(nullable: false),
LockoutEndDateUtc = c.DateTime(),
LockoutEnabled = c.Boolean(nullable: false),
AccessFailedCount = c.Int(nullable: false),
UserName = c.String(nullable: false, maxLength: 256),
})
.PrimaryKey(t => t.Id)
.Index(t => t.UserName, unique: true, name: "UserNameIndex");
CreateTable(
"dbo.AspNetUserClaims",
c => new
{
Id = c.Int(nullable: false, identity: true),
UserId = c.String(nullable: false, maxLength: 128),
ClaimType = c.String(),
ClaimValue = c.String(),
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.AspNetUsers", t => t.UserId, cascadeDelete: true)
.Index(t => t.UserId);
CreateTable(
"dbo.AspNetUserLogins",
c => new
{
LoginProvider = c.String(nullable: false, maxLength: 128),
ProviderKey = c.String(nullable: false, maxLength: 128),
UserId = c.String(nullable: false, maxLength: 128),
})
.PrimaryKey(t => new { t.LoginProvider, t.ProviderKey, t.UserId })
.ForeignKey("dbo.AspNetUsers", t => t.UserId, cascadeDelete: true)
.Index(t => t.UserId);
CreateTable(
"dbo.MovieActors",
c => new
{
Movie_MovieId = c.Guid(nullable: false),
Actor_ActorId = c.Guid(nullable: false),
})
.PrimaryKey(t => new { t.Movie_MovieId, t.Actor_ActorId })
.ForeignKey("dbo.Movies", t => t.Movie_MovieId, cascadeDelete: true)
.ForeignKey("dbo.Actors", t => t.Actor_ActorId, cascadeDelete: true)
.Index(t => t.Movie_MovieId)
.Index(t => t.Actor_ActorId);
}
public override void Down()
{
DropForeignKey("dbo.AspNetUserRoles", "UserId", "dbo.AspNetUsers");
DropForeignKey("dbo.AspNetUserLogins", "UserId", "dbo.AspNetUsers");
DropForeignKey("dbo.AspNetUserClaims", "UserId", "dbo.AspNetUsers");
DropForeignKey("dbo.AspNetUserRoles", "RoleId", "dbo.AspNetRoles");
DropForeignKey("dbo.MovieActors", "Actor_ActorId", "dbo.Actors");
DropForeignKey("dbo.MovieActors", "Movie_MovieId", "dbo.Movies");
DropIndex("dbo.MovieActors", new[] { "Actor_ActorId" });
DropIndex("dbo.MovieActors", new[] { "Movie_MovieId" });
DropIndex("dbo.AspNetUserLogins", new[] { "UserId" });
DropIndex("dbo.AspNetUserClaims", new[] { "UserId" });
DropIndex("dbo.AspNetUsers", "UserNameIndex");
DropIndex("dbo.AspNetUserRoles", new[] { "RoleId" });
DropIndex("dbo.AspNetUserRoles", new[] { "UserId" });
DropIndex("dbo.AspNetRoles", "RoleNameIndex");
DropTable("dbo.MovieActors");
DropTable("dbo.AspNetUserLogins");
DropTable("dbo.AspNetUserClaims");
DropTable("dbo.AspNetUsers");
DropTable("dbo.AspNetUserRoles");
DropTable("dbo.AspNetRoles");
DropTable("dbo.Movies");
DropTable("dbo.Actors");
}
}
using System.Data.Entity.Migrations;
public partial class Initial : DbMigration
{
public override void Up()
{
CreateTable(
"dbo.Actors",
c => new
{
ActorId = c.Guid(nullable: false, identity: true),
FirstName = c.String(),
LastName = c.String(),
})
.PrimaryKey(t => t.ActorId);
CreateTable(
"dbo.Movies",
c => new
{
MovieId = c.Guid(nullable: false, identity: true),
Name = c.String(),
ProductionTime = c.DateTime(nullable: false),
})
.PrimaryKey(t => t.MovieId);
CreateTable(
"dbo.AspNetRoles",
c => new
{
Id = c.String(nullable: false, maxLength: 128),
Name = c.String(nullable: false, maxLength: 256),
})
.PrimaryKey(t => t.Id)
.Index(t => t.Name, unique: true, name: "RoleNameIndex");
CreateTable(
"dbo.AspNetUserRoles",
c => new
{
UserId = c.String(nullable: false, maxLength: 128),
RoleId = c.String(nullable: false, maxLength: 128),
})
.PrimaryKey(t => new { t.UserId, t.RoleId })
.ForeignKey("dbo.AspNetRoles", t => t.RoleId, cascadeDelete: true)
.ForeignKey("dbo.AspNetUsers", t => t.UserId, cascadeDelete: true)
.Index(t => t.UserId)
.Index(t => t.RoleId);
CreateTable(
"dbo.AspNetUsers",
c => new
{
Id = c.String(nullable: false, maxLength: 128),
Email = c.String(maxLength: 256),
EmailConfirmed = c.Boolean(nullable: false),
PasswordHash = c.String(),
SecurityStamp = c.String(),
PhoneNumber = c.String(),
PhoneNumberConfirmed = c.Boolean(nullable: false),
TwoFactorEnabled = c.Boolean(nullable: false),
LockoutEndDateUtc = c.DateTime(),
LockoutEnabled = c.Boolean(nullable: false),
AccessFailedCount = c.Int(nullable: false),
UserName = c.String(nullable: false, maxLength: 256),
})
.PrimaryKey(t => t.Id)
.Index(t => t.UserName, unique: true, name: "UserNameIndex");
CreateTable(
"dbo.AspNetUserClaims",
c => new
{
Id = c.Int(nullable: false, identity: true),
UserId = c.String(nullable: false, maxLength: 128),
ClaimType = c.String(),
ClaimValue = c.String(),
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.AspNetUsers", t => t.UserId, cascadeDelete: true)
.Index(t => t.UserId);
CreateTable(
"dbo.AspNetUserLogins",
c => new
{
LoginProvider = c.String(nullable: false, maxLength: 128),
ProviderKey = c.String(nullable: false, maxLength: 128),
UserId = c.String(nullable: false, maxLength: 128),
})
.PrimaryKey(t => new { t.LoginProvider, t.ProviderKey, t.UserId })
.ForeignKey("dbo.AspNetUsers", t => t.UserId, cascadeDelete: true)
.Index(t => t.UserId);
CreateTable(
"dbo.MovieActors",
c => new
{
Movie_MovieId = c.Guid(nullable: false),
Actor_ActorId = c.Guid(nullable: false),
})
.PrimaryKey(t => new { t.Movie_MovieId, t.Actor_ActorId })
.ForeignKey("dbo.Movies", t => t.Movie_MovieId, cascadeDelete: true)
.ForeignKey("dbo.Actors", t => t.Actor_ActorId, cascadeDelete: true)
.Index(t => t.Movie_MovieId)
.Index(t => t.Actor_ActorId);
}
public override void Down()
{
DropForeignKey("dbo.AspNetUserRoles", "UserId", "dbo.AspNetUsers");
DropForeignKey("dbo.AspNetUserLogins", "UserId", "dbo.AspNetUsers");
DropForeignKey("dbo.AspNetUserClaims", "UserId", "dbo.AspNetUsers");
DropForeignKey("dbo.AspNetUserRoles", "RoleId", "dbo.AspNetRoles");
DropForeignKey("dbo.MovieActors", "Actor_ActorId", "dbo.Actors");
DropForeignKey("dbo.MovieActors", "Movie_MovieId", "dbo.Movies");
DropIndex("dbo.MovieActors", new[] { "Actor_ActorId" });
DropIndex("dbo.MovieActors", new[] { "Movie_MovieId" });
DropIndex("dbo.AspNetUserLogins", new[] { "UserId" });
DropIndex("dbo.AspNetUserClaims", new[] { "UserId" });
DropIndex("dbo.AspNetUsers", "UserNameIndex");
DropIndex("dbo.AspNetUserRoles", new[] { "RoleId" });
DropIndex("dbo.AspNetUserRoles", new[] { "UserId" });
DropIndex("dbo.AspNetRoles", "RoleNameIndex");
DropTable("dbo.MovieActors");
DropTable("dbo.AspNetUserLogins");
DropTable("dbo.AspNetUserClaims");
DropTable("dbo.AspNetUsers");
DropTable("dbo.AspNetUserRoles");
DropTable("dbo.AspNetRoles");
DropTable("dbo.Movies");
DropTable("dbo.Actors");
}
}
}

View File

@ -1,16 +1,15 @@
namespace MovieBase.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class s : DbMigration
{
public override void Up()
{
}
public override void Down()
{
}
}
using System.Data.Entity.Migrations;
public partial class s : DbMigration
{
public override void Up()
{
}
public override void Down()
{
}
}
}

View File

@ -1,16 +1,15 @@
namespace MovieBase.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class adddata : DbMigration
{
public override void Up()
{
}
public override void Down()
{
}
}
using System.Data.Entity.Migrations;
public partial class adddata : DbMigration
{
public override void Up()
{
}
public override void Down()
{
}
}
}

View File

@ -1,63 +1,62 @@
namespace MovieBase.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class userwatce : DbMigration
{
public override void Up()
{
DropForeignKey("dbo.MovieActors", "Movie_MovieId", "dbo.Movies");
DropForeignKey("dbo.MovieActors", "Actor_ActorId", "dbo.Actors");
DropIndex("dbo.MovieActors", new[] { "Movie_MovieId" });
DropIndex("dbo.MovieActors", new[] { "Actor_ActorId" });
CreateTable(
"dbo.ApplicationUserMovies",
c => new
{
ApplicationUser_Id = c.String(nullable: false, maxLength: 128),
Movie_MovieId = c.Guid(nullable: false),
})
.PrimaryKey(t => new { t.ApplicationUser_Id, t.Movie_MovieId })
.ForeignKey("dbo.AspNetUsers", t => t.ApplicationUser_Id, cascadeDelete: true)
.ForeignKey("dbo.Movies", t => t.Movie_MovieId, cascadeDelete: true)
.Index(t => t.ApplicationUser_Id)
.Index(t => t.Movie_MovieId);
DropTable("dbo.Actors");
DropTable("dbo.MovieActors");
}
public override void Down()
{
CreateTable(
"dbo.MovieActors",
c => new
{
Movie_MovieId = c.Guid(nullable: false),
Actor_ActorId = c.Guid(nullable: false),
})
.PrimaryKey(t => new { t.Movie_MovieId, t.Actor_ActorId });
CreateTable(
"dbo.Actors",
c => new
{
ActorId = c.Guid(nullable: false, identity: true),
FirstName = c.String(),
LastName = c.String(),
})
.PrimaryKey(t => t.ActorId);
DropForeignKey("dbo.ApplicationUserMovies", "Movie_MovieId", "dbo.Movies");
DropForeignKey("dbo.ApplicationUserMovies", "ApplicationUser_Id", "dbo.AspNetUsers");
DropIndex("dbo.ApplicationUserMovies", new[] { "Movie_MovieId" });
DropIndex("dbo.ApplicationUserMovies", new[] { "ApplicationUser_Id" });
DropTable("dbo.ApplicationUserMovies");
CreateIndex("dbo.MovieActors", "Actor_ActorId");
CreateIndex("dbo.MovieActors", "Movie_MovieId");
AddForeignKey("dbo.MovieActors", "Actor_ActorId", "dbo.Actors", "ActorId", cascadeDelete: true);
AddForeignKey("dbo.MovieActors", "Movie_MovieId", "dbo.Movies", "MovieId", cascadeDelete: true);
}
}
using System.Data.Entity.Migrations;
public partial class userwatce : DbMigration
{
public override void Up()
{
DropForeignKey("dbo.MovieActors", "Movie_MovieId", "dbo.Movies");
DropForeignKey("dbo.MovieActors", "Actor_ActorId", "dbo.Actors");
DropIndex("dbo.MovieActors", new[] { "Movie_MovieId" });
DropIndex("dbo.MovieActors", new[] { "Actor_ActorId" });
CreateTable(
"dbo.ApplicationUserMovies",
c => new
{
ApplicationUser_Id = c.String(nullable: false, maxLength: 128),
Movie_MovieId = c.Guid(nullable: false),
})
.PrimaryKey(t => new { t.ApplicationUser_Id, t.Movie_MovieId })
.ForeignKey("dbo.AspNetUsers", t => t.ApplicationUser_Id, cascadeDelete: true)
.ForeignKey("dbo.Movies", t => t.Movie_MovieId, cascadeDelete: true)
.Index(t => t.ApplicationUser_Id)
.Index(t => t.Movie_MovieId);
DropTable("dbo.Actors");
DropTable("dbo.MovieActors");
}
public override void Down()
{
CreateTable(
"dbo.MovieActors",
c => new
{
Movie_MovieId = c.Guid(nullable: false),
Actor_ActorId = c.Guid(nullable: false),
})
.PrimaryKey(t => new { t.Movie_MovieId, t.Actor_ActorId });
CreateTable(
"dbo.Actors",
c => new
{
ActorId = c.Guid(nullable: false, identity: true),
FirstName = c.String(),
LastName = c.String(),
})
.PrimaryKey(t => t.ActorId);
DropForeignKey("dbo.ApplicationUserMovies", "Movie_MovieId", "dbo.Movies");
DropForeignKey("dbo.ApplicationUserMovies", "ApplicationUser_Id", "dbo.AspNetUsers");
DropIndex("dbo.ApplicationUserMovies", new[] { "Movie_MovieId" });
DropIndex("dbo.ApplicationUserMovies", new[] { "ApplicationUser_Id" });
DropTable("dbo.ApplicationUserMovies");
CreateIndex("dbo.MovieActors", "Actor_ActorId");
CreateIndex("dbo.MovieActors", "Movie_MovieId");
AddForeignKey("dbo.MovieActors", "Actor_ActorId", "dbo.Actors", "ActorId", cascadeDelete: true);
AddForeignKey("dbo.MovieActors", "Movie_MovieId", "dbo.Movies", "MovieId", cascadeDelete: true);
}
}
}

View File

@ -1,16 +1,15 @@
namespace MovieBase.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class adin : DbMigration
{
public override void Up()
{
}
public override void Down()
{
}
}
using System.Data.Entity.Migrations;
public partial class adin : DbMigration
{
public override void Up()
{
}
public override void Down()
{
}
}
}

View File

@ -1,20 +1,19 @@
namespace MovieBase.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class IMDB : DbMigration
{
public override void Up()
{
AddColumn("dbo.Movies", "WatchedDate", c => c.DateTime(nullable: false));
DropColumn("dbo.Movies", "ProductionTime");
}
public override void Down()
{
AddColumn("dbo.Movies", "ProductionTime", c => c.DateTime(nullable: false));
DropColumn("dbo.Movies", "WatchedDate");
}
}
using System.Data.Entity.Migrations;
public partial class IMDB : DbMigration
{
public override void Up()
{
AddColumn("dbo.Movies", "WatchedDate", c => c.DateTime(nullable: false));
DropColumn("dbo.Movies", "ProductionTime");
}
public override void Down()
{
AddColumn("dbo.Movies", "ProductionTime", c => c.DateTime(nullable: false));
DropColumn("dbo.Movies", "WatchedDate");
}
}
}

View File

@ -1,24 +1,23 @@
namespace MovieBase.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class imdb2 : DbMigration
{
public override void Up()
{
AddColumn("dbo.Movies", "Title", c => c.String());
AddColumn("dbo.Movies", "Plot", c => c.String());
AddColumn("dbo.Movies", "Poster", c => c.String());
DropColumn("dbo.Movies", "Name");
}
public override void Down()
{
AddColumn("dbo.Movies", "Name", c => c.String());
DropColumn("dbo.Movies", "Poster");
DropColumn("dbo.Movies", "Plot");
DropColumn("dbo.Movies", "Title");
}
}
using System.Data.Entity.Migrations;
public partial class imdb2 : DbMigration
{
public override void Up()
{
AddColumn("dbo.Movies", "Title", c => c.String());
AddColumn("dbo.Movies", "Plot", c => c.String());
AddColumn("dbo.Movies", "Poster", c => c.String());
DropColumn("dbo.Movies", "Name");
}
public override void Down()
{
AddColumn("dbo.Movies", "Name", c => c.String());
DropColumn("dbo.Movies", "Poster");
DropColumn("dbo.Movies", "Plot");
DropColumn("dbo.Movies", "Title");
}
}
}

View File

@ -1,18 +1,17 @@
namespace MovieBase.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class imdb3 : DbMigration
{
public override void Up()
{
AlterColumn("dbo.Movies", "Title", c => c.String(nullable: false));
}
public override void Down()
{
AlterColumn("dbo.Movies", "Title", c => c.String());
}
}
using System.Data.Entity.Migrations;
public partial class imdb3 : DbMigration
{
public override void Up()
{
AlterColumn("dbo.Movies", "Title", c => c.String(nullable: false));
}
public override void Down()
{
AlterColumn("dbo.Movies", "Title", c => c.String());
}
}
}

View File

@ -0,0 +1,29 @@
// <auto-generated />
namespace MovieBase.Migrations
{
using System.CodeDom.Compiler;
using System.Data.Entity.Migrations;
using System.Data.Entity.Migrations.Infrastructure;
using System.Resources;
[GeneratedCode("EntityFramework.Migrations", "6.2.0-61023")]
public sealed partial class changes : IMigrationMetadata
{
private readonly ResourceManager Resources = new ResourceManager(typeof(changes));
string IMigrationMetadata.Id
{
get { return "201905191913463_changes"; }
}
string IMigrationMetadata.Source
{
get { return null; }
}
string IMigrationMetadata.Target
{
get { return Resources.GetString("Target"); }
}
}
}

View File

@ -0,0 +1,15 @@
namespace MovieBase.Migrations
{
using System.Data.Entity.Migrations;
public partial class changes : DbMigration
{
public override void Up()
{
}
public override void Down()
{
}
}
}

View File

@ -0,0 +1,126 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Target" xml:space="preserve">
<value>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</value>
</data>
<data name="DefaultSchema" xml:space="preserve">
<value>dbo</value>
</data>
</root>

View File

@ -0,0 +1,29 @@
// <auto-generated />
namespace MovieBase.Migrations
{
using System.CodeDom.Compiler;
using System.Data.Entity.Migrations;
using System.Data.Entity.Migrations.Infrastructure;
using System.Resources;
[GeneratedCode("EntityFramework.Migrations", "6.2.0-61023")]
public sealed partial class s1 : IMigrationMetadata
{
private readonly ResourceManager Resources = new ResourceManager(typeof(s1));
string IMigrationMetadata.Id
{
get { return "201905191935324_s1"; }
}
string IMigrationMetadata.Source
{
get { return null; }
}
string IMigrationMetadata.Target
{
get { return Resources.GetString("Target"); }
}
}
}

View File

@ -0,0 +1,15 @@
namespace MovieBase.Migrations
{
using System.Data.Entity.Migrations;
public partial class s1 : DbMigration
{
public override void Up()
{
}
public override void Down()
{
}
}
}

View File

@ -0,0 +1,126 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Target" xml:space="preserve">
<value>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</value>
</data>
<data name="DefaultSchema" xml:space="preserve">
<value>dbo</value>
</data>
</root>

View File

@ -0,0 +1,29 @@
// <auto-generated />
namespace MovieBase.Migrations
{
using System.CodeDom.Compiler;
using System.Data.Entity.Migrations;
using System.Data.Entity.Migrations.Infrastructure;
using System.Resources;
[GeneratedCode("EntityFramework.Migrations", "6.2.0-61023")]
public sealed partial class final : IMigrationMetadata
{
private readonly ResourceManager Resources = new ResourceManager(typeof(final));
string IMigrationMetadata.Id
{
get { return "201905291929017_final"; }
}
string IMigrationMetadata.Source
{
get { return null; }
}
string IMigrationMetadata.Target
{
get { return Resources.GetString("Target"); }
}
}
}

View File

@ -0,0 +1,16 @@
namespace MovieBase.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class final : DbMigration
{
public override void Up()
{
}
public override void Down()
{
}
}
}

View File

@ -0,0 +1,126 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Target" xml:space="preserve">
<value>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</value>
</data>
<data name="DefaultSchema" xml:space="preserve">
<value>dbo</value>
</data>
</root>

View File

@ -1,13 +1,6 @@
using MovieBase.Models;
using System;
using System.Collections.Generic;
using System.Data.Entity.Migrations;
using System.Web;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
using Microsoft.AspNet.Identity.EntityFramework;
using System.Data.Entity.Validation;
using MovieBase.DAL;
using MovieBase.Models;
using System.Data.Entity.Migrations;
namespace MovieBase.Migrations
{
@ -21,42 +14,42 @@ namespace MovieBase.Migrations
protected override void Seed(ApplicationDbContext context)
{
var user = new ApplicationUser() { UserName = "admin@admin.com", Email = "admin@admin.com" };
//try
//{
// UserStore<ApplicationUser> userStore = new UserStore<ApplicationUser>(context);
// ApplicationUserManager userManager = new ApplicationUserManager(userStore);
// userManager.Create(user, "!Admin1");
// // ApplicationUserManager userManager = HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();
// // userManager.Create(user, "admin");
// context.SaveChanges();
//}
//catch(DbEntityValidationException ex)
//{
// foreach (var errors in ex.EntityValidationErrors)
// {
// foreach (var validationError in errors.ValidationErrors)
// {
// // get the error message
// string errorMessage = validationError.ErrorMessage;
// Console.WriteLine(errorMessage);
// }
// }
//}
//context.Movies.Add(new Movie()
//{
// Name = "Movie 1",
// WatchedDate = DateTime.Now,
// WatchedByUsers = new List<ApplicationUser>() { user }
// //StarringActors = new List<Actor>() { new Actor() { FirstName = "Bob", LastName = "Brown" } }
//});
//context.SaveChanges();
// This method will be called after migrating to the latest version.
// You can use the DbSet<T>.AddOrUpdate() helper extension method
// to avoid creating duplicate seed data.
var user = new ApplicationUser() { UserName = "admin@admin.com", Email = "admin@admin.com" };
//try
//{
// UserStore<ApplicationUser> userStore = new UserStore<ApplicationUser>(context);
// ApplicationUserManager userManager = new ApplicationUserManager(userStore);
// userManager.Create(user, "!Admin1");
// // ApplicationUserManager userManager = HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();
// // userManager.Create(user, "admin");
// context.SaveChanges();
//}
//catch(DbEntityValidationException ex)
//{
// foreach (var errors in ex.EntityValidationErrors)
// {
// foreach (var validationError in errors.ValidationErrors)
// {
// // get the error message
// string errorMessage = validationError.ErrorMessage;
// Console.WriteLine(errorMessage);
// }
// }
//}
//context.Movies.Add(new Movie()
//{
// Name = "Movie 1",
// WatchedDate = DateTime.Now,
// WatchedByUsers = new List<ApplicationUser>() { user }
// //StarringActors = new List<Actor>() { new Actor() { FirstName = "Bob", LastName = "Brown" } }
//});
//context.SaveChanges();
// This method will be called after migrating to the latest version.
// You can use the DbSet<T>.AddOrUpdate() helper extension method
// to avoid creating duplicate seed data.
}
}
}

View File

@ -1,13 +0,0 @@
using System;
using System.Collections.Generic;
namespace MovieBase.Models
{
public class Actor
{
public Guid ActorId { get; private set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public List<Movie> Movies { get; set; }
}
}

View File

@ -1,8 +1,6 @@
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;
using System.Security.Claims;
using System.Threading.Tasks;
@ -21,5 +19,5 @@ namespace MovieBase.Models
}
}
}

View File

@ -18,9 +18,8 @@ namespace MovieBase.Models
[DataType(DataType.Date)]
[Display(Name = "Watched Date")]
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}")]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime WatchedDate { get; set; }
//public List<Actor> StarringActors { get; set; }
public List<ApplicationUser> WatchedByUsers { get; set; }
}

View File

@ -52,21 +52,85 @@
<HintPath>..\packages\FluentValidation.ValidatorAttribute.8.3.0\lib\net45\FluentValidation.ValidatorAttribute.dll</HintPath>
</Reference>
<Reference Include="Microsoft.CSharp" />
<Reference Include="Microsoft.EntityFrameworkCore, Version=2.2.4.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.EntityFrameworkCore.2.2.4\lib\netstandard2.0\Microsoft.EntityFrameworkCore.dll</HintPath>
</Reference>
<Reference Include="Microsoft.EntityFrameworkCore.Abstractions, Version=2.2.4.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.EntityFrameworkCore.Abstractions.2.2.4\lib\netstandard2.0\Microsoft.EntityFrameworkCore.Abstractions.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Extensions.Caching.Abstractions, Version=2.2.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Extensions.Caching.Abstractions.2.2.0\lib\netstandard2.0\Microsoft.Extensions.Caching.Abstractions.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Extensions.Caching.Memory, Version=2.2.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Extensions.Caching.Memory.2.2.0\lib\netstandard2.0\Microsoft.Extensions.Caching.Memory.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Extensions.Configuration, Version=2.2.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Extensions.Configuration.2.2.0\lib\netstandard2.0\Microsoft.Extensions.Configuration.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Extensions.Configuration.Abstractions, Version=2.2.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Extensions.Configuration.Abstractions.2.2.0\lib\netstandard2.0\Microsoft.Extensions.Configuration.Abstractions.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Extensions.Configuration.Binder, Version=2.2.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Extensions.Configuration.Binder.2.2.0\lib\netstandard2.0\Microsoft.Extensions.Configuration.Binder.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Extensions.DependencyInjection, Version=2.2.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Extensions.DependencyInjection.2.2.0\lib\net461\Microsoft.Extensions.DependencyInjection.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Extensions.DependencyInjection.Abstractions, Version=2.2.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Extensions.DependencyInjection.Abstractions.2.2.0\lib\netstandard2.0\Microsoft.Extensions.DependencyInjection.Abstractions.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Extensions.Logging, Version=2.2.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Extensions.Logging.2.2.0\lib\netstandard2.0\Microsoft.Extensions.Logging.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Extensions.Logging.Abstractions, Version=2.2.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Extensions.Logging.Abstractions.2.2.0\lib\netstandard2.0\Microsoft.Extensions.Logging.Abstractions.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Extensions.Options, Version=2.2.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Extensions.Options.2.2.0\lib\netstandard2.0\Microsoft.Extensions.Options.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Extensions.Primitives, Version=2.2.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Extensions.Primitives.2.2.0\lib\netstandard2.0\Microsoft.Extensions.Primitives.dll</HintPath>
</Reference>
<Reference Include="PagedList, Version=1.17.0.0, Culture=neutral, PublicKeyToken=abbb863e9397c5e1, processorArchitecture=MSIL">
<HintPath>..\packages\PagedList.1.17.0.0\lib\net40\PagedList.dll</HintPath>
</Reference>
<Reference Include="PagedList.Mvc, Version=4.5.0.0, Culture=neutral, PublicKeyToken=abbb863e9397c5e1, processorArchitecture=MSIL">
<HintPath>..\packages\PagedList.Mvc.4.5.0.0\lib\net40\PagedList.Mvc.dll</HintPath>
</Reference>
<Reference Include="Remotion.Linq, Version=2.2.0.0, Culture=neutral, PublicKeyToken=fee00910d6e5f53b, processorArchitecture=MSIL">
<HintPath>..\packages\Remotion.Linq.2.2.0\lib\net45\Remotion.Linq.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.ComponentModel.Annotations, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.ComponentModel.Annotations.4.4.1\lib\net461\System.ComponentModel.Annotations.dll</HintPath>
<Reference Include="System.Buffers, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Buffers.4.4.0\lib\netstandard2.0\System.Buffers.dll</HintPath>
</Reference>
<Reference Include="System.Collections.Immutable, Version=1.2.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Collections.Immutable.1.5.0\lib\netstandard2.0\System.Collections.Immutable.dll</HintPath>
</Reference>
<Reference Include="System.ComponentModel.Annotations, Version=4.2.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.ComponentModel.Annotations.4.5.0\lib\net461\System.ComponentModel.Annotations.dll</HintPath>
</Reference>
<Reference Include="System.Data" />
<Reference Include="System.Diagnostics.DiagnosticSource, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Diagnostics.DiagnosticSource.4.5.0\lib\net46\System.Diagnostics.DiagnosticSource.dll</HintPath>
</Reference>
<Reference Include="System.Drawing" />
<Reference Include="System.Interactive.Async, Version=3.2.0.0, Culture=neutral, PublicKeyToken=94bc3704cddfc263, processorArchitecture=MSIL">
<HintPath>..\packages\System.Interactive.Async.3.2.0\lib\net46\System.Interactive.Async.dll</HintPath>
</Reference>
<Reference Include="System.Memory, Version=4.0.1.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Memory.4.5.1\lib\netstandard2.0\System.Memory.dll</HintPath>
</Reference>
<Reference Include="System.Net.Http.Formatting, Version=5.2.7.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.AspNet.WebApi.Client.5.2.7\lib\net45\System.Net.Http.Formatting.dll</HintPath>
</Reference>
<Reference Include="System.Numerics" />
<Reference Include="System.Numerics.Vectors, Version=4.1.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Numerics.Vectors.4.4.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.4.5.1\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
</Reference>
<Reference Include="System.Web.DynamicData" />
<Reference Include="System.Web.Entity" />
<Reference Include="System.Web.ApplicationServices" />
@ -191,12 +255,18 @@
<Compile Include="App_Start\IdentityConfig.cs" />
<Compile Include="App_Start\RouteConfig.cs" />
<Compile Include="App_Start\Startup.Auth.cs" />
<Compile Include="Migrations\201905291929017_final.cs" />
<Compile Include="Migrations\201905291929017_final.Designer.cs">
<DependentUpon>201905291929017_final.cs</DependentUpon>
</Compile>
<Compile Include="ViewModels\TopWatchedMovie.cs" />
<Content Include="Content\PagedList.css" />
<Compile Include="Controllers\AccountController.cs" />
<Compile Include="Controllers\HomeController.cs" />
<Compile Include="Controllers\ManageController.cs" />
<Compile Include="Controllers\MovieController.cs" />
<Compile Include="Controllers\SearchController.cs" />
<Compile Include="Controllers\TopWatchedController.cs" />
<Compile Include="DAL\ApplicationDbContext.cs" />
<Compile Include="Global.asax.cs">
<DependentUpon>Global.asax</DependentUpon>
@ -233,9 +303,16 @@
<Compile Include="Migrations\201905051836108_imdb3.Designer.cs">
<DependentUpon>201905051836108_imdb3.cs</DependentUpon>
</Compile>
<Compile Include="Migrations\201905191913463_changes.cs" />
<Compile Include="Migrations\201905191913463_changes.Designer.cs">
<DependentUpon>201905191913463_changes.cs</DependentUpon>
</Compile>
<Compile Include="Migrations\201905191935324_s1.cs" />
<Compile Include="Migrations\201905191935324_s1.Designer.cs">
<DependentUpon>201905191935324_s1.cs</DependentUpon>
</Compile>
<Compile Include="Migrations\Configuration.cs" />
<Compile Include="ViewModels\AccountViewModels.cs" />
<Compile Include="Models\Actor.cs" />
<Compile Include="Models\ApplicationUser.cs" />
<Compile Include="ViewModels\ManageViewModels.cs" />
<Compile Include="Models\Movie.cs" />
@ -309,6 +386,7 @@
<Content Include="Views\Shared\_Details.cshtml" />
<Content Include="Views\Movie\Edit.cshtml" />
<Content Include="Views\Movie\Delete.cshtml" />
<Content Include="Views\TopWatched\Index.cshtml" />
</ItemGroup>
<ItemGroup>
<Folder Include="App_Data\" />
@ -351,6 +429,15 @@
<EmbeddedResource Include="Migrations\201905051836108_imdb3.resx">
<DependentUpon>201905051836108_imdb3.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Migrations\201905191913463_changes.resx">
<DependentUpon>201905191913463_changes.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Migrations\201905191935324_s1.resx">
<DependentUpon>201905191935324_s1.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Migrations\201905291929017_final.resx">
<DependentUpon>201905291929017_final.cs</DependentUpon>
</EmbeddedResource>
</ItemGroup>
<PropertyGroup>
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>

View File

@ -1,5 +1,4 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following

View File

@ -4,12 +4,12 @@ using Owin;
[assembly: OwinStartupAttribute(typeof(MovieBase.Startup))]
namespace MovieBase
{
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
ConfigureAuth(app);
}
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
ConfigureAuth(app);
}
}
}
}

View File

@ -3,110 +3,110 @@ using System.ComponentModel.DataAnnotations;
namespace MovieBase.ViewModels
{
public class ExternalLoginConfirmationViewModel
{
[Required]
[Display(Name = "Email")]
public string Email { get; set; }
}
public class ExternalLoginConfirmationViewModel
{
[Required]
[Display(Name = "Email")]
public string Email { get; set; }
}
public class ExternalLoginListViewModel
{
public string ReturnUrl { get; set; }
}
public class ExternalLoginListViewModel
{
public string ReturnUrl { get; set; }
}
public class SendCodeViewModel
{
public string SelectedProvider { get; set; }
public ICollection<System.Web.Mvc.SelectListItem> Providers { get; set; }
public string ReturnUrl { get; set; }
public bool RememberMe { get; set; }
}
public class SendCodeViewModel
{
public string SelectedProvider { get; set; }
public ICollection<System.Web.Mvc.SelectListItem> Providers { get; set; }
public string ReturnUrl { get; set; }
public bool RememberMe { get; set; }
}
public class VerifyCodeViewModel
{
[Required]
public string Provider { get; set; }
public class VerifyCodeViewModel
{
[Required]
public string Provider { get; set; }
[Required]
[Display(Name = "Code")]
public string Code { get; set; }
public string ReturnUrl { get; set; }
[Required]
[Display(Name = "Code")]
public string Code { get; set; }
public string ReturnUrl { get; set; }
[Display(Name = "Remember this browser?")]
public bool RememberBrowser { get; set; }
[Display(Name = "Remember this browser?")]
public bool RememberBrowser { get; set; }
public bool RememberMe { get; set; }
}
public bool RememberMe { get; set; }
}
public class ForgotViewModel
{
[Required]
[Display(Name = "Email")]
public string Email { get; set; }
}
public class ForgotViewModel
{
[Required]
[Display(Name = "Email")]
public string Email { get; set; }
}
public class LoginViewModel
{
[Required]
[Display(Name = "Email")]
[EmailAddress]
public string Email { get; set; }
public class LoginViewModel
{
[Required]
[Display(Name = "Email")]
[EmailAddress]
public string Email { get; set; }
[Required]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }
[Required]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }
[Display(Name = "Remember me?")]
public bool RememberMe { get; set; }
}
[Display(Name = "Remember me?")]
public bool RememberMe { get; set; }
}
public class RegisterViewModel
{
[Required]
[EmailAddress]
[Display(Name = "Email")]
public string Email { get; set; }
public class RegisterViewModel
{
[Required]
[EmailAddress]
[Display(Name = "Email")]
public string Email { get; set; }
[Required]
[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }
[Required]
[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }
[DataType(DataType.Password)]
[Display(Name = "Confirm password")]
[Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
public string ConfirmPassword { get; set; }
}
[DataType(DataType.Password)]
[Display(Name = "Confirm password")]
[Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
public string ConfirmPassword { get; set; }
}
public class ResetPasswordViewModel
{
[Required]
[EmailAddress]
[Display(Name = "Email")]
public string Email { get; set; }
public class ResetPasswordViewModel
{
[Required]
[EmailAddress]
[Display(Name = "Email")]
public string Email { get; set; }
[Required]
[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }
[Required]
[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }
[DataType(DataType.Password)]
[Display(Name = "Confirm password")]
[Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
public string ConfirmPassword { get; set; }
[DataType(DataType.Password)]
[Display(Name = "Confirm password")]
[Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
public string ConfirmPassword { get; set; }
public string Code { get; set; }
}
public string Code { get; set; }
}
public class ForgotPasswordViewModel
{
[Required]
[EmailAddress]
[Display(Name = "Email")]
public string Email { get; set; }
}
public class ForgotPasswordViewModel
{
[Required]
[EmailAddress]
[Display(Name = "Email")]
public string Email { get; set; }
}
}

View File

@ -1,86 +1,86 @@
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity;
using Microsoft.Owin.Security;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
namespace MovieBase.ViewModels
{
public class IndexViewModel
{
public bool HasPassword { get; set; }
public IList<UserLoginInfo> Logins { get; set; }
public string PhoneNumber { get; set; }
public bool TwoFactor { get; set; }
public bool BrowserRemembered { get; set; }
}
public class IndexViewModel
{
public bool HasPassword { get; set; }
public IList<UserLoginInfo> Logins { get; set; }
public string PhoneNumber { get; set; }
public bool TwoFactor { get; set; }
public bool BrowserRemembered { get; set; }
}
public class ManageLoginsViewModel
{
public IList<UserLoginInfo> CurrentLogins { get; set; }
public IList<AuthenticationDescription> OtherLogins { get; set; }
}
public class ManageLoginsViewModel
{
public IList<UserLoginInfo> CurrentLogins { get; set; }
public IList<AuthenticationDescription> OtherLogins { get; set; }
}
public class FactorViewModel
{
public string Purpose { get; set; }
}
public class FactorViewModel
{
public string Purpose { get; set; }
}
public class SetPasswordViewModel
{
[Required]
[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
[DataType(DataType.Password)]
[Display(Name = "New password")]
public string NewPassword { get; set; }
public class SetPasswordViewModel
{
[Required]
[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
[DataType(DataType.Password)]
[Display(Name = "New password")]
public string NewPassword { get; set; }
[DataType(DataType.Password)]
[Display(Name = "Confirm new password")]
[Compare("NewPassword", ErrorMessage = "The new password and confirmation password do not match.")]
public string ConfirmPassword { get; set; }
}
[DataType(DataType.Password)]
[Display(Name = "Confirm new password")]
[Compare("NewPassword", ErrorMessage = "The new password and confirmation password do not match.")]
public string ConfirmPassword { get; set; }
}
public class ChangePasswordViewModel
{
[Required]
[DataType(DataType.Password)]
[Display(Name = "Current password")]
public string OldPassword { get; set; }
public class ChangePasswordViewModel
{
[Required]
[DataType(DataType.Password)]
[Display(Name = "Current password")]
public string OldPassword { get; set; }
[Required]
[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
[DataType(DataType.Password)]
[Display(Name = "New password")]
public string NewPassword { get; set; }
[Required]
[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
[DataType(DataType.Password)]
[Display(Name = "New password")]
public string NewPassword { get; set; }
[DataType(DataType.Password)]
[Display(Name = "Confirm new password")]
[Compare("NewPassword", ErrorMessage = "The new password and confirmation password do not match.")]
public string ConfirmPassword { get; set; }
}
[DataType(DataType.Password)]
[Display(Name = "Confirm new password")]
[Compare("NewPassword", ErrorMessage = "The new password and confirmation password do not match.")]
public string ConfirmPassword { get; set; }
}
public class AddPhoneNumberViewModel
{
[Required]
[Phone]
[Display(Name = "Phone Number")]
public string Number { get; set; }
}
public class AddPhoneNumberViewModel
{
[Required]
[Phone]
[Display(Name = "Phone Number")]
public string Number { get; set; }
}
public class VerifyPhoneNumberViewModel
{
[Required]
[Display(Name = "Code")]
public string Code { get; set; }
public class VerifyPhoneNumberViewModel
{
[Required]
[Display(Name = "Code")]
public string Code { get; set; }
[Required]
[Phone]
[Display(Name = "Phone Number")]
public string PhoneNumber { get; set; }
}
[Required]
[Phone]
[Display(Name = "Phone Number")]
public string PhoneNumber { get; set; }
}
public class ConfigureTwoFactorViewModel
{
public string SelectedProvider { get; set; }
public ICollection<System.Web.Mvc.SelectListItem> Providers { get; set; }
}
public class ConfigureTwoFactorViewModel
{
public string SelectedProvider { get; set; }
public ICollection<System.Web.Mvc.SelectListItem> Providers { get; set; }
}
}

View File

@ -0,0 +1,8 @@
namespace MovieBase.ViewModels
{
public class TopWatchedMovie
{
public string MovieTitle { get; set; }
public int Count { get; set; }
}
}

View File

@ -3,29 +3,6 @@
}
<div class="jumbotron">
<h1>ASP.NET</h1>
<p class="lead">ASP.NET is a free web framework for building great Web sites and Web applications using HTML, CSS and JavaScript.</p>
<p><a href="https://asp.net" class="btn btn-primary btn-lg">Learn more &raquo;</a></p>
</div>
<div class="row">
<div class="col-md-4">
<h2>Getting started</h2>
<p>
ASP.NET MVC gives you a powerful, patterns-based way to build dynamic websites that
enables a clean separation of concerns and gives you full control over markup
for enjoyable, agile development.
</p>
<p><a class="btn btn-default" href="https://go.microsoft.com/fwlink/?LinkId=301865">Learn more &raquo;</a></p>
</div>
<div class="col-md-4">
<h2>Get more libraries</h2>
<p>NuGet is a free Visual Studio extension that makes it easy to add, remove, and update libraries and tools in Visual Studio projects.</p>
<p><a class="btn btn-default" href="https://go.microsoft.com/fwlink/?LinkId=301866">Learn more &raquo;</a></p>
</div>
<div class="col-md-4">
<h2>Web Hosting</h2>
<p>You can easily find a web hosting company that offers the right mix of features and price for your applications.</p>
<p><a class="btn btn-default" href="https://go.microsoft.com/fwlink/?LinkId=301867">Learn more &raquo;</a></p>
</div>
<h1>MovieBase</h1>
<p class="lead">MovieBase is an application to organize watched movies. Try it!</p>
</div>

View File

@ -33,8 +33,8 @@
<div class="form-group">
@Html.LabelFor(model => model.WatchedDate, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.WatchedDate, "{0:yyyy-MM-dd}", new { htmlAttributes = new { @class = "form-control", @type ="date" } })
@Html.TextBoxFor(m => m.WatchedDate, "{0:yyyy-MM-dd}", new { htmlattributes = new { @class = "form-control" }, @type = "date" })
@Html.EditorFor(model => model.WatchedDate, new { htmlAttributes = new { @class = "datepicker form-control", @type ="date" } })
@*@Html.TextBoxFor(m => m.WatchedDate, new { htmlattributes = new { @class = "datepicker form-control" }, @type = "date" })*@
@Html.ValidationMessageFor(model => model.WatchedDate, "", new { @class = "text-danger" })
</div>
</div>

View File

@ -13,7 +13,7 @@
@Html.AntiForgeryToken()
<div class="form-horizontal">
<h4>Student</h4>
<h4>Movie</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
@Html.HiddenFor(model => model.MovieId)
@ -37,7 +37,7 @@
<div class="form-group">
@Html.LabelFor(model => model.WatchedDate, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.WatchedDate, new { htmlAttributes = new { @class = "form-control" } })
@Html.EditorFor(model => model.WatchedDate, new { htmlAttributes = new { @class = "form-control", @type = "date"}})
@Html.ValidationMessageFor(model => model.WatchedDate, "", new { @class = "text-danger" })
</div>
</div>

View File

@ -6,21 +6,22 @@
<h2>Search</h2>
<script type="text/javascript" src="@Url.Content("~/Scripts/jquery-3.3.1.js")"></script>
<script type="text/javascript" src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")"></script>
@using (Ajax.BeginForm("Search", "Search", new AjaxOptions { HttpMethod = "Post", UpdateTargetId = "details" }))
@using (Ajax.BeginForm("Search", "Search", new AjaxOptions { HttpMethod = "GET", UpdateTargetId = "details" }))
{
<div class="form-horizontal">
<div class="form-group">
@Html.LabelFor(model => model.Title, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Title, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Title, "", new { @class = "text-danger" })
<div class="form-horizontal">
<div class="form-group">
@Html.LabelFor(model => model.Title, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Title, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Title, "", new { @class = "text-danger" })
</div>
</div>
<input type="submit" value="Search" class="btn btn-primary col-lg-offset-2" />
</div>
<input type="submit" value="Search" class="btn btn-primary col-lg-offset-2" />
</div>
}
<br>
<div id="details">

View File

@ -17,15 +17,14 @@
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
@Html.ActionLink("Application name", "Index", "Home", new { area = "" }, new { @class = "navbar-brand" })
@Html.ActionLink("MovieBase", "Index", "Home", new { area = "" }, new { @class = "navbar-brand" })
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li>@Html.ActionLink("Home", "Index", "Home")</li>
@*<li>@Html.ActionLink("About", "About", "Home")</li>
<li>@Html.ActionLink("Contact", "Contact", "Home")</li>*@
<li>@Html.ActionLink("Movie", "Index", "Movie")</li>
<li>@Html.ActionLink("Search", "Index", "Search")</li>
<li>@Html.ActionLink("Top Movies", "Index", "TopWatched")</li>
</ul>
@Html.Partial("_LoginPartial")
</div>
@ -35,7 +34,7 @@
@RenderBody()
<hr />
<footer>
<p>&copy; @DateTime.Now.Year - My ASP.NET Application</p>
<p>&copy; @DateTime.Now.Year - GetOnBoard</p>
</footer>
</div>

View File

@ -0,0 +1,34 @@
@model MovieBase.ViewModels.TopWatchedMovie
@{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>Top Movies</h2>
<script type="text/javascript" src="@Url.Content("~/Scripts/jquery-3.3.1.js")"></script>
<table id="records_table" class="table table-hover table-responsive-md">
<thead>
<tr>
<th>MovieTitle </th>
<th class="col-sm-1">Count </th>
</tr>
</thead>
</table>
<script type="text/javascript">
$(document).ready(function () {
$.ajax({
url: '/TopWatched/GetTopWatched',
type: 'GET',
data: {},
success: function (response) {
var trHTML = '';
$.each(response, function (i, item) {
trHTML += '<tr><td>' + item.MovieTitle + '</td><td>' + item.Count +'</td></tr>';
});
$('#records_table').append(trHTML);
}
});
});
</script>

View File

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<!--
For more information on how to configure your ASP.NET application, please visit
https://go.microsoft.com/fwlink/?LinkId=301880
@ -6,96 +6,312 @@
<configuration>
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
</configSections>
<connectionStrings configSource="connections.config" />
<connectionStrings configSource="connections.config"/>
<appSettings>
<add key="webpages:Version" value="3.0.0.0" />
<add key="webpages:Enabled" value="false" />
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
<add key="webpages:Version" value="3.0.0.0"/>
<add key="webpages:Enabled" value="false"/>
<add key="ClientValidationEnabled" value="true"/>
<add key="UnobtrusiveJavaScriptEnabled" value="true"/>
</appSettings>
<system.web>
<authentication mode="None" />
<compilation debug="true" targetFramework="4.6.2" />
<httpRuntime targetFramework="4.6.2" />
<authentication mode="None"/>
<compilation debug="true" targetFramework="4.6.2"/>
<httpRuntime targetFramework="4.6.2"/>
</system.web>
<system.webServer>
<modules>
<remove name="FormsAuthentication" />
<remove name="FormsAuthentication"/>
</modules>
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="OPTIONSVerbHandler" />
<remove name="TRACEVerbHandler" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
<remove name="ExtensionlessUrlHandler-Integrated-4.0"/>
<remove name="OPTIONSVerbHandler"/>
<remove name="TRACEVerbHandler"/>
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0"/>
</handlers></system.webServer>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Xml.XPath.XDocument" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Xml.XmlSerializer" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Xml.XDocument" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Xml.ReaderWriter" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.1.0" newVersion="4.1.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.ValueTuple" publicKeyToken="CC7B13FFCD2DDD51" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Threading.Timer" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Threading.Tasks.Parallel" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Threading.Tasks" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Threading.Overlapped" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Threading" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Text.RegularExpressions" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.1.0" newVersion="4.1.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Text.Encoding.Extensions" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Text.Encoding" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Security.SecureString" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Security.Principal" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Security.Cryptography.Algorithms" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.3.0.0" newVersion="4.3.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.Serialization.Xml" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.3.0" newVersion="4.1.3.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.Serialization.Primitives" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.Serialization.Json" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.Numerics" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.InteropServices" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.Extensions" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Resources.ResourceManager" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Reflection.Primitives" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Reflection.Extensions" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Reflection" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.ObjectModel" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Net.Sockets" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Net.Requests" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Net.Primitives" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Net.NetworkInformation" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Net.Http" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Linq.Queryable" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Linq.Parallel" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Linq.Expressions" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Linq" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.IO" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.IO.Compression" publicKeyToken="B77A5C561934E089" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Globalization.Extensions" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Globalization" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Dynamic.Runtime" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.Tracing" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.Tools" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.StackTrace" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.Debug" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.Contracts" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Data.Common" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.ComponentModel.EventBasedAsync" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.ComponentModel" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Collections" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Collections.Concurrent" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.InteropServices.RuntimeInformation" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Owin.Security" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
<assemblyIdentity name="Microsoft.Owin.Security" publicKeyToken="31bf3856ad364e35"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Owin.Security.OAuth" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
<assemblyIdentity name="Microsoft.Owin.Security.OAuth" publicKeyToken="31bf3856ad364e35"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Owin.Security.Cookies" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
<assemblyIdentity name="Microsoft.Owin.Security.Cookies" publicKeyToken="31bf3856ad364e35"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
<assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Antlr3.Runtime" publicKeyToken="eb42632606e9261f" />
<bindingRedirect oldVersion="0.0.0.0-3.5.0.2" newVersion="3.5.0.2" />
<assemblyIdentity name="Antlr3.Runtime" publicKeyToken="eb42632606e9261f"/>
<bindingRedirect oldVersion="0.0.0.0-3.5.0.2" newVersion="3.5.0.2"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.Optimization" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-1.1.0.0" newVersion="1.1.0.0" />
<assemblyIdentity name="System.Web.Optimization" publicKeyToken="31bf3856ad364e35"/>
<bindingRedirect oldVersion="0.0.0.0-1.1.0.0" newVersion="1.1.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-1.6.5135.21930" newVersion="1.6.5135.21930" />
<assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35"/>
<bindingRedirect oldVersion="0.0.0.0-1.6.5135.21930" newVersion="1.6.5135.21930"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" />
<bindingRedirect oldVersion="0.0.0.0-11.0.0.0" newVersion="11.0.0.0" />
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed"/>
<bindingRedirect oldVersion="0.0.0.0-11.0.0.0" newVersion="11.0.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
<assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35"/>
<bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-5.2.4.0" newVersion="5.2.4.0" />
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35"/>
<bindingRedirect oldVersion="0.0.0.0-5.2.4.0" newVersion="5.2.4.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
<assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35"/>
<bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.Http" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.2.7.0" newVersion="5.2.7.0" />
<assemblyIdentity name="System.Web.Http" publicKeyToken="31bf3856ad364e35" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-5.2.7.0" newVersion="5.2.7.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.ComponentModel.Annotations" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.2.1.0" newVersion="4.2.1.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="mssqllocaldb" />
<parameter value="mssqllocaldb"/>
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer"/>
</providers>
</entityFramework>
<system.codedom>
<compilers>
<compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701" />
<compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
<compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701"/>
<compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+"/>
</compilers>
</system.codedom>
</configuration>
</configuration>

View File

@ -18,6 +18,20 @@
<package id="Microsoft.AspNet.WebApi.Owin" version="5.2.7" targetFramework="net462" />
<package id="Microsoft.AspNet.WebPages" version="3.2.4" targetFramework="net462" />
<package id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="2.0.0" targetFramework="net462" />
<package id="Microsoft.EntityFrameworkCore" version="2.2.4" targetFramework="net462" />
<package id="Microsoft.EntityFrameworkCore.Abstractions" version="2.2.4" targetFramework="net462" />
<package id="Microsoft.EntityFrameworkCore.Analyzers" version="2.2.4" targetFramework="net462" />
<package id="Microsoft.Extensions.Caching.Abstractions" version="2.2.0" targetFramework="net462" />
<package id="Microsoft.Extensions.Caching.Memory" version="2.2.0" targetFramework="net462" />
<package id="Microsoft.Extensions.Configuration" version="2.2.0" targetFramework="net462" />
<package id="Microsoft.Extensions.Configuration.Abstractions" version="2.2.0" targetFramework="net462" />
<package id="Microsoft.Extensions.Configuration.Binder" version="2.2.0" targetFramework="net462" />
<package id="Microsoft.Extensions.DependencyInjection" version="2.2.0" targetFramework="net462" />
<package id="Microsoft.Extensions.DependencyInjection.Abstractions" version="2.2.0" targetFramework="net462" />
<package id="Microsoft.Extensions.Logging" version="2.2.0" targetFramework="net462" />
<package id="Microsoft.Extensions.Logging.Abstractions" version="2.2.0" targetFramework="net462" />
<package id="Microsoft.Extensions.Options" version="2.2.0" targetFramework="net462" />
<package id="Microsoft.Extensions.Primitives" version="2.2.0" targetFramework="net462" />
<package id="Microsoft.jQuery.Unobtrusive.Ajax" version="3.2.6" targetFramework="net462" />
<package id="Microsoft.jQuery.Unobtrusive.Validation" version="3.2.4" targetFramework="net462" />
<package id="Microsoft.Owin" version="4.0.0" targetFramework="net462" />
@ -35,6 +49,14 @@
<package id="Owin" version="1.0" targetFramework="net462" />
<package id="PagedList" version="1.17.0.0" targetFramework="net462" />
<package id="PagedList.Mvc" version="4.5.0.0" targetFramework="net462" />
<package id="System.ComponentModel.Annotations" version="4.4.1" targetFramework="net462" />
<package id="Remotion.Linq" version="2.2.0" targetFramework="net462" />
<package id="System.Buffers" version="4.4.0" targetFramework="net462" />
<package id="System.Collections.Immutable" version="1.5.0" targetFramework="net462" />
<package id="System.ComponentModel.Annotations" version="4.5.0" targetFramework="net462" />
<package id="System.Diagnostics.DiagnosticSource" version="4.5.0" targetFramework="net462" />
<package id="System.Interactive.Async" version="3.2.0" targetFramework="net462" />
<package id="System.Memory" version="4.5.1" targetFramework="net462" />
<package id="System.Numerics.Vectors" version="4.4.0" targetFramework="net462" />
<package id="System.Runtime.CompilerServices.Unsafe" version="4.5.1" targetFramework="net462" />
<package id="WebGrease" version="1.6.0" targetFramework="net462" />
</packages>