public async Task <IActionResult> Subscribe(string artistId) { if (!_signInManager.IsSignedIn(User)) { return(StatusCode(403)); } NeobooruUser usr = await _userManager.GetUserAsync(User); if (_db.ArtistSubscriptions.Include(a => a.Artist) .Include(a => a.Subscriber) .Any(a => a.Artist.Id.ToString().Equals(artistId) && a.Subscriber.Id.Equals(artistId))) { return(StatusCode(200)); } Artist a = await _db.Artists.FirstAsync(a => a.Id.ToString().Equals(artistId)); _db.ArtistSubscriptions.Add(new ArtistSubscription() { Id = Guid.NewGuid(), Artist = a, SubscribedOn = DateTime.Now, Subscriber = usr }); await _db.SaveChangesAsync(); return(StatusCode(200)); }
public async Task <IActionResult> Artist(string artistId) { List <ArtThumbnailViewModel> list = new List <ArtThumbnailViewModel>(); Artist artist = await _db.Artists.FirstOrDefaultAsync(a => a.Id.ToString().Equals(artistId)); if (artist == null) { return(Redirect("/Artists/List")); } var exp = new Action <Art>(a => list.Add(new ArtThumbnailViewModel(a))); var arts = _db.Arts .Where(a => a.Author.Id.ToString().Equals(artistId)).OrderByDescending(a => a.Stars); if (arts.Count() > 5) { await arts.Take(5).ForEachAsync(exp); } else { await arts.ForEachAsync(exp); } IQueryable <ArtistSubscription> subscriptions = _db.ArtistSubscriptions .Where(a => a.Artist.Id.Equals(artist.Id)); int likes = 0; await _db.Arts.Include(a => a.Author).Include(a => a.Likes) .ForEachAsync(a => { if (a.Author.Id.ToString().Equals(artistId)) { likes += a.Likes.Count(); } }); bool subscribed = false; if (_signInManager.IsSignedIn(User)) { NeobooruUser usr = await _userManager.GetUserAsync(User); var foo = _db.ArtistSubscriptions.Include(a => a.Artist) .Include(a => a.Subscriber).AsEnumerable(); subscribed = foo.Any(a => a.Artist.Id.ToString().Equals(artistId) && a.Subscriber.Id.ToString().Equals(usr.Id)); } ArtistViewModel avm = new ArtistViewModel(artist, list, subscriptions.Count(), likes, subscribed); ViewBag.SubsectionPages = _subsectionPages; ViewBag.ActiveSubpage = "Artist"; return(View(avm)); }
public async Task <IActionResult> Post(string postId) { ViewBag.SubsectionPages = _subsectionPages; ViewBag.ActiveSubpage = "Artist"; Art art = _db.Arts.Include(a => a.Author).Include(a => a.Uploader) .Include(a => a.Tags).Include(a => a.Likes) .FirstOrDefault(a => a.Id.ToString().Equals(postId)); if (art == null) { return(Redirect("/posts/list")); } var artist = _db.Artists.Include(a => a.Subscriptions) .First(a => a.Id.ToString().Equals(art.Author.Id.ToString())); int artCount = _db.Arts.Include(a => a.Author).Count(a => a.Author. Id.ToString().Equals(artist.Id.ToString())); int subs = artist.Subscriptions?.Count() ?? 0; List <string> tags = new List <string>(); foreach (var tag in art.Tags) { tags.Add(_db.Tags.First(t => t.Id.ToString().Equals(tag.TagId.ToString())).TagString); } bool liked = false; if (_signInManager.IsSignedIn(User)) { NeobooruUser usr = await _userManager.GetUserAsync(User); liked = _db.ArtLikes.Any(like => like.User.Id.Equals(usr.Id) && like.LikedArt.Id.ToString().Equals(postId)); } List <CommentViewModel> comments = new List <CommentViewModel>(); await _db.ArtComments.Where(comment => comment.CommentedArt.Id.ToString().Equals(postId)) .ForEachAsync(comment => { comments.Add(new CommentViewModel(comment.User.UserName, comment.User.PfpUrl, comment.Content, comment.CommentedOn)); }); comments.Sort((a, b) => a.Date > b.Date ? -1 : 1); int totalLikes = _db.ArtLikes.Include(al => al.LikedArt.Author) .Count(al => al.LikedArt.Author.Id.ToString().Equals(art.Author.Id.ToString())); return(View(new PostViewModel(art, artCount, subs, tags, comments, liked, totalLikes))); }
public async Task <IActionResult> Registration(BasicUserRegistrationViewModel model) { if (_signInManager.IsSignedIn(User)) { return(RedirectToAction("Profile", "Profile")); } ViewBag.SubsectionPages = _subsectionPages; ViewBag.ActiveSubpage = _subsectionPages[1]; if (ModelState.IsValid) { NeobooruUser user = new NeobooruUser { UserName = model.Email, Email = model.Email, RegisteredOn = DateTime.Now }; IdentityResult result = await _userManager.CreateAsync(user, model.Password); if (result.Succeeded) { // Generate email confirmation link string token = await _userManager.GenerateEmailConfirmationTokenAsync(user); var confirmationLink = Url.Action("ConfirmEmail", "Profile", new { userId = user.Id, token = token, }, Request.Scheme); // Send the mail MailRequest mr = new MailRequest() { ToEmail = user.Email, Subject = "Confirm your account's email", Body = "Please click this link to confirm your account: " + confirmationLink }; await _mailService.SendEmailAsync(mr); await _signInManager.SignInAsync(user, isPersistent : false); return(RedirectToAction("index", "Home")); } foreach (var error in result.Errors) { ModelState.AddModelError("", error.Description); } } return(View(model)); }
public ProfileViewModel(NeobooruUser user, List <ArtThumbnailViewModel> uploaded, List <ArtThumbnailViewModel> recentlyLiked, List <ArtistThumbnailViewModel> subbed, string profileId) { Username = user.UserName; RegisteredAt = user.RegisteredOn; ProfileViews = user.Views; PfpUrl = user.PfpUrl ?? "/img/prototyping/avatar.png"; BackgroundUrl = user.BgUrl ?? "/img/prototyping/backgrounds/1590x540p Background Placeholder Image.png"; Gender = user.Gender ?? "Unknown"; Descritpion = user.ProfileDescription ?? ""; RecentlyUploaded = uploaded; RecentlyLiked = recentlyLiked; RecentlySubbed = subbed; ProfileId = profileId; }
public async Task <IActionResult> Profile(string profileId) { ViewBag.SubsectionPages = _subsectionPages; ViewBag.ActiveSubpage = _subsectionPages[0]; if (profileId == null && _signInManager.IsSignedIn(User)) { profileId = User.FindFirst(ClaimTypes.NameIdentifier).Value; } else { Redirect("/"); } NeobooruUser user = _db.NeobooruUsers .Include(usr => usr.ArtLikes) .Include(usr => usr.UploadedArts) .Include(usr => usr.Subscriptions) .ThenInclude(s => s.Artist) .FirstOrDefault(a => a.Id.Equals(profileId)); if (user == null) { Redirect("/"); } List <ArtThumbnailViewModel> recentlyUploaded = user.UploadedArts.OrderByDescending(usr => usr.CreatedAt) .Take(5).Select(a => new ArtThumbnailViewModel(a)).ToList(); var recentlyLiked = user.ArtLikes.OrderByDescending(al => al.LikedDate).Take(5) .Select(a => new ArtThumbnailViewModel(a.LikedArt)).ToList(); var recentlySubbed = user.Subscriptions .OrderByDescending(sub => sub.SubscribedOn) .Take(5).Select(s => { var foo = _db.ArtLikes.Include(f => f.LikedArt) .ThenInclude(f => f.Author) .Count(f => f.LikedArt.Author.Id.ToString() .Equals(s.Artist.Id.ToString())); return(new ArtistThumbnailViewModel(s.Artist, s.Artist.Arts.Count(), s.Artist.Subscriptions.Count(), foo)); }).ToList(); return(View(new ProfileViewModel(user, recentlyUploaded, recentlyLiked, recentlySubbed, profileId))); }
public static void SeedUser(UserManager <NeobooruUser> userManager) { if (userManager.FindByNameAsync("root").Result == null) { NeobooruUser user = new NeobooruUser() { UserName = "******", NormalizedUserName = "******".ToUpper() }; IdentityResult res = userManager.CreateAsync(user, "#RootPassword123").Result; } NeobooruUser usr = userManager.FindByNameAsync("root").Result; if (usr != null) { userManager.AddToRoleAsync(usr, "root").Wait(); } }
public async Task <IActionResult> PostUnlike(string artId, string redirect) { if (!_signInManager.IsSignedIn(User)) { return(StatusCode(403)); } NeobooruUser usr = await _userManager.GetUserAsync(User); ArtLike like = await _db.ArtLikes.FirstAsync(a => a.User.Id.Equals(usr.Id) && a.LikedArt.Id.ToString().Equals(artId)); _db.ArtLikes.Remove(like); await _db.SaveChangesAsync(); if (redirect == null || redirect.Equals("")) { return(StatusCode(200)); } return(Redirect(redirect)); }
public async Task <IActionResult> ConfirmEmail(string userId, string token) { if (userId == null || token == null) { return(RedirectToAction("index", "home")); } NeobooruUser user = await _userManager.FindByIdAsync(userId); if (user == null) { return(RedirectToAction("index", "home")); } var result = await _userManager.ConfirmEmailAsync(user, token); if (result.Succeeded) { return(RedirectToAction("Profile", "Profile")); } return(RedirectToAction("index", "home")); }
public async Task <IActionResult> EditUsersRoles(RoleCheckboxesViewModel viewModel) { if (!await UserIsAdmin()) { return(Redirect("/Profile/Profile")); } NeobooruUser usr = await _userManager.FindByIdAsync(viewModel.UserId); foreach (var roleCheckboxViewModel in viewModel.Checkboxes) { if (roleCheckboxViewModel.IsChecked) { await _userManager.AddToRoleAsync(usr, roleCheckboxViewModel.RoleName); } else { await _userManager.RemoveFromRoleAsync(usr, roleCheckboxViewModel.RoleName); } } return(RedirectToAction("ListUsers", "AdministrationPanel")); }
public async Task <IActionResult> Timeline() { ViewBag.SubsectionPages = _subsectionPages; ViewBag.ActiveSubpage = _subsectionPages[1]; if (!_signInManager.IsSignedIn(User)) { return(View()); } NeobooruUser usr = await _userManager.GetUserAsync(User); var subscribedAuthors = _db.ArtistSubscriptions.Include(s => s.Artist) .Where(a => a.Subscriber.Id.Equals(usr.Id)); List <TimelinePostViewModel> posts = new List <TimelinePostViewModel>(); posts.AddRange(_db.Arts.Include(a => a.Author) .Include(a => a.Comments) .ThenInclude(c => c.User) .OrderByDescending(a => a.CreatedAt) .Where(a => subscribedAuthors.Any(ar => ar.Artist.Id.ToString().Equals(a.Author.Id.ToString()))) .Take(10).Select(a => new TimelinePostViewModel() { ArtistName = a.Author.ArtistName, PfpUrl = a.Author.PfpUrl, CreationTime = a.CreatedAt, PostDescription = a.Author.ArtistName + " has uploaded a new art called '" + a.Name + "'.", ArtId = a.Id.ToString(), ArtUrl = a.FileUrl, RecentComments = a.Comments.OrderByDescending(c => c.CommentedOn).Take(3) .Select(c => new CommentViewModel(c.User.UserName, c.User.PfpUrl, c.Content, c.CommentedOn)) .ToList() })); return(View(posts)); }
public async Task <IActionResult> EditUsersRoles(string id) { if (!await UserIsAdmin()) { return(Redirect("/Profile/Profile")); } ViewBag.SubsectionPages = _subsectionPages; ViewBag.ActiveSubpage = "Edit User"; NeobooruUser usr = await _userManager.FindByIdAsync(id); var usrRoles = await _userManager.GetRolesAsync(usr); string[] arr = new string[usrRoles.Count]; usrRoles.CopyTo(arr, 0); IQueryable <IdentityRole> roles = _roleManager.Roles; RoleCheckboxesViewModel rcvm = new RoleCheckboxesViewModel(); rcvm.UserId = usr.Id; foreach (var role in roles) { RoleCheckboxViewModel vm = new RoleCheckboxViewModel(); vm.RoleName = role.Name; vm.RoleId = role.Id; if (arr.Contains(role.Name)) { vm.IsChecked = true; } else { vm.IsChecked = false; } rcvm.Checkboxes.Add(vm); } return(View(rcvm)); }
public async Task <IActionResult> PostLike(string artId) { if (!_signInManager.IsSignedIn(User)) { return(StatusCode(403)); } NeobooruUser usr = await _userManager.GetUserAsync(User); Art targetArt = await _db.Arts.FirstAsync(a => a.Id.ToString().Equals(artId)); ArtLike like = new ArtLike() { Id = Guid.NewGuid(), LikedArt = targetArt, User = usr, LikedDate = DateTime.Now }; await _db.ArtLikes.AddAsync(like); await _db.SaveChangesAsync(); return(StatusCode(200)); }
public async Task <IActionResult> Settings() { ViewBag.SubsectionPages = _subsectionPages; ViewBag.ActiveSubpage = _subsectionPages[1]; if (!_signInManager.IsSignedIn(User)) { ModelState.AddModelError(string.Empty, "You have to be logged in to change your settings!"); return(Redirect("/Profile/Settings")); } NeobooruUser usr = await _userManager.GetUserAsync(User); ProfileUpdateViewModel puvm = new ProfileUpdateViewModel() { Gender = usr.Gender, Username = usr.UserName, ProfileDescription = usr.ProfileDescription, }; return(View(puvm)); }
public async Task <IActionResult> Unsubscribe(string artistId, string redirect) { if (!_signInManager.IsSignedIn(User)) { return(StatusCode(403)); } NeobooruUser usr = await _userManager.GetUserAsync(User); if (!_db.ArtistSubscriptions.Include(a => a.Artist) .Include(a => a.Subscriber) .Any(a => a.Artist.Id.ToString().Equals(artistId) && a.Subscriber.Id.Equals(usr.Id))) { return(StatusCode(200)); } // Artist a = await _db.Artists.FirstAsync(a => a.Id.ToString().Equals(artistId)); var foo = await _db.ArtistSubscriptions.Include(a => a.Artist) .Include(a => a.Subscriber) .FirstAsync(a => a.Artist.Id.ToString().Equals(artistId) && a.Subscriber.Id.Equals(usr.Id)); if (foo != null) { _db.ArtistSubscriptions.Remove(foo); await _db.SaveChangesAsync(); } if (redirect == null || redirect.Equals("")) { return(StatusCode(200)); } else { return(Redirect(redirect)); } }
public async Task <IActionResult> Edit(PostEditViewModel puvm) { // TODO: Edit sometimes causes some key error. Figure out what could be causing it NeobooruUser user = await _userManager.GetUserAsync(User); Art art = await _db.Arts.Include(a => a.Author) .Include(a => a.Tags).ThenInclude(t => t.Tag) .FirstOrDefaultAsync(a => a.Id.ToString().Equals(puvm.SecretId)); // Delete old tag occurrences foreach (var tag in art.Tags) { _db.TagOccurrences.Remove(tag); } await _db.SaveChangesAsync(); // Change to new data Artist artist = _db.Artists.FirstOrDefault(a => a.ArtistName.Equals(puvm.Author)); if (artist == null) { return(Redirect("/Posts/List")); } art.UpdatedAt = DateTime.Now; art.Author = artist; art.Rating = puvm.Rating; art.Source = puvm.Source; List <string> passedTags = puvm.TagString.Split(" ").ToList(); ICollection <TagOccurrence> newTags = new List <TagOccurrence>(); // register unregistered tags List <Tag> tagModels = new List <Tag>(); foreach (var t in passedTags) { if (!_db.Tags.Any(tag => tag.TagString.Equals(t))) { Tag tag = new Tag() { Id = Guid.NewGuid(), TagString = t, AddedAt = DateTime.Now, Creator = user }; tagModels.Add(tag); _db.Tags.Add(tag); } else { Tag tag = _db.Tags.First(tag => tag.TagString.Equals(t)); tagModels.Add(tag); } } // Register new tag occurrences List <TagOccurrence> occurrences = new List <TagOccurrence>(); foreach (var t in tagModels) { TagOccurrence to = new TagOccurrence() { ArtId = art.Id, TagId = t.Id, Art = art, Tag = t }; occurrences.Add(to); } art.Tags = occurrences; // List<TagOccurrence> occurrences = new List<TagOccurrence>(); // foreach (var t in tagModels) // { // TagOccurrence tagOccurrence = _db.TagOccurrences // .FirstOrDefault(to => to.Tag.TagString.Equals(t.TagString)); // if (tagOccurrence == null) // { // _db.TagOccurrences.Add(new TagOccurrence() // { // Art = art, // ArtId = art.Id, // Tag = t, // TagId = t.Id // }); // } // occurrences.Add(tagOccurrence); // } await _db.SaveChangesAsync(); return(Redirect("/Posts/List")); }
public async Task <bool> UserIsAdmin() { NeobooruUser usr = await _userManager.GetUserAsync(User); return(await _userManager.IsInRoleAsync(usr, "root")); }
public async Task <IActionResult> Update(ProfileUpdateViewModel puvm) { if (!ModelState.IsValid) { return(Redirect("/Profile/Settings")); } if (!_signInManager.IsSignedIn(User)) { ModelState.AddModelError(string.Empty, "You have to be logged in to change your settings!"); return(Redirect("/Profile/Settings")); } NeobooruUser usr = await _userManager.GetUserAsync(User); usr.Gender = puvm.Gender; usr.UserName = puvm.Username; usr.ProfileDescription = puvm.ProfileDescription; if (puvm.PfpImage != null) { Guid id = Guid.NewGuid(); ImageFileManager ifmPfp = null; try { ifmPfp = new ImageFileManager("wwwroot/img/profiles/pfps/", puvm.PfpImage.OpenReadStream(), ImageUtils.ImgExtensionFromContentType(puvm.PfpImage.ContentType)); } catch (InvalidArtDimensionsException e) { ModelState.AddModelError(string.Empty, "Invalid profile picture or background size! " + "Profile picture must be at least 400px by 400px"); return(Redirect("/Profile/Settings")); } usr.PfpUrl = await ifmPfp.SavePfp(id); usr.PfpUrl = usr.PfpUrl.Remove(0, 7); } if (puvm.BgImage != null) { Guid id = Guid.NewGuid(); ImageFileManager ifmPfp = null; try { ifmPfp = new ImageFileManager("wwwroot/img/profiles/bgs/", puvm.BgImage.OpenReadStream(), ImageUtils.ImgExtensionFromContentType(puvm.BgImage.ContentType)); } catch (InvalidArtDimensionsException e) { ModelState.AddModelError(string.Empty, "Invalid profile picture or background size! " + "Background must be at least 1590px by 540px"); return(Redirect("/Profile/Settings")); } usr.BgUrl = await ifmPfp.SaveBg(id); usr.BgUrl = usr.BgUrl.Remove(0, 7); } await _db.SaveChangesAsync(); return(Redirect("/Profile/Profile")); }