using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using AutoMapper.Internal; using DevHive.Data.Interfaces; using DevHive.Data.Models; using Microsoft.EntityFrameworkCore; namespace DevHive.Data.Repositories { public class FeedRepository : IFeedRepository { private readonly DevHiveContext _context; public FeedRepository(DevHiveContext context) { this._context = context; } /// /// This returns a given amount of posts of all given friends, created before "firstRequestIssued", /// ordered from latest to oldest (time created). /// PageSize specifies how many posts to get, and pageNumber specifices how many posts to skip (pageNumber * pageSize). /// /// This method is used in the feed page. /// Posts from friends are meant to be gotten in chunks, meaning you get X posts, and then get another amount of posts, /// that are after the first X posts. /// public async Task> GetFriendsPosts(List friendsList, DateTime firstRequestIssued, int pageNumber, int pageSize) { List friendsIds = friendsList.Select(f => f.Id).ToList(); List posts = await this._context.Posts .Where(post => post.TimeCreated < firstRequestIssued) .Where(p => friendsIds.Contains(p.Creator.Id)) .ToListAsync(); // Ordering by descending can't happen in query, because it doesn't order it // completely correctly (example: in query these two times are ordered // like this: 2021-01-30T11:49:45, 2021-01-28T21:37:40.701244) posts = posts .OrderByDescending(x => x.TimeCreated.ToFileTime()) .Skip((pageNumber - 1) * pageSize) .Take(pageSize) .ToList(); return posts; } /// /// This returns a given amount of posts, that a user has made, created before "firstRequestIssued", /// ordered from latest to oldest (time created). /// PageSize specifies how many posts to get, and pageNumber specifices how many posts to skip (pageNumber * pageSize). /// /// This method is used in the profile page. /// Posts from friends are meant to be gotten in chunks, meaning you get X posts, and then get another amount of posts, /// that are after the first X posts. /// public async Task> GetUsersPosts(User user, DateTime firstRequestIssued, int pageNumber, int pageSize) { List posts = await this._context.Posts .Where(post => post.TimeCreated < firstRequestIssued) .Where(p => p.Creator.Id == user.Id) .ToListAsync(); // Look at GetFriendsPosts on why this is done like this posts = posts .OrderByDescending(x => x.TimeCreated.ToFileTime()) .Skip((pageNumber - 1) * pageSize) .Take(pageSize) .ToList(); return posts; } } }