Esempio n. 1
0
        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));
        }
Esempio n. 2
0
        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));
        }
Esempio n. 3
0
        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)));
        }
Esempio n. 4
0
        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));
        }
Esempio n. 5
0
 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;
 }
Esempio n. 6
0
        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)));
        }
Esempio n. 7
0
        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();
            }
        }
Esempio n. 8
0
        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));
        }
Esempio n. 9
0
        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"));
        }
Esempio n. 10
0
        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"));
        }
Esempio n. 11
0
        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));
        }
Esempio n. 12
0
        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));
        }
Esempio n. 13
0
        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));
        }
Esempio n. 14
0
        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));
        }
Esempio n. 15
0
        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));
            }
        }
Esempio n. 16
0
        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"));
        }
Esempio n. 17
0
        public async Task <bool> UserIsAdmin()
        {
            NeobooruUser usr = await _userManager.GetUserAsync(User);

            return(await _userManager.IsInRoleAsync(usr, "root"));
        }
Esempio n. 18
0
        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"));
        }