using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; namespace Selector.Model { public class ScrobbleRepository : IScrobbleRepository { private readonly ApplicationDbContext db; public ScrobbleRepository(ApplicationDbContext context) { db = context; } public void Add(UserScrobble item) { db.Scrobble.Add(item); } public void AddRange(IEnumerable item) { db.Scrobble.AddRange(item); } public UserScrobble Find(int key, string include = null) { var scrobbles = db.Scrobble.Where(s => s.Id == key); if (!string.IsNullOrWhiteSpace(include)) { scrobbles = scrobbles.Include(include); } return scrobbles.FirstOrDefault(); } private IQueryable GetAllQueryable(string include = null, string userId = null, string username = null, string trackName = null, string albumName = null, string artistName = null, DateTime? from = null, DateTime? to = null, bool tracking = true, bool orderTime = false) { var scrobbles = db.Scrobble.AsQueryable(); if (!tracking) { scrobbles = scrobbles.AsNoTracking(); } if (!string.IsNullOrWhiteSpace(include)) { scrobbles = scrobbles.Include(include); } if (!string.IsNullOrWhiteSpace(userId)) { scrobbles = scrobbles.Where(s => s.UserId == userId); } if (!string.IsNullOrWhiteSpace(username)) { var normalUsername = username.ToUpperInvariant(); var user = db.Users.AsNoTracking().Where(u => u.NormalizedUserName == normalUsername).FirstOrDefault(); if (user is not null) { scrobbles = scrobbles.Where(s => s.UserId == user.Id); } else { scrobbles = Enumerable.Empty().AsQueryable(); } } if (!string.IsNullOrWhiteSpace(trackName)) { scrobbles = scrobbles.Where(s => s.TrackName == trackName); } if (!string.IsNullOrWhiteSpace(albumName)) { scrobbles = scrobbles.Where(s => s.AlbumName == albumName); } if (!string.IsNullOrWhiteSpace(artistName)) { scrobbles = scrobbles.Where(s => s.ArtistName == artistName); } if (from is not null) { scrobbles = scrobbles.Where(u => u.Timestamp >= from.Value); } if (to is not null) { scrobbles = scrobbles.Where(u => u.Timestamp < to.Value); } if (orderTime) { scrobbles = scrobbles.OrderBy(x => x.Timestamp); } return scrobbles; } public IEnumerable GetAll(string include = null, string userId = null, string username = null, string trackName = null, string albumName = null, string artistName = null, DateTime? from = null, DateTime? to = null, bool tracking = true, bool orderTime = false) => GetAllQueryable(include: include, userId: userId, username: username, trackName: trackName, albumName: albumName, artistName: artistName, from: from, to: to, tracking: tracking, orderTime: orderTime).AsEnumerable(); public void Remove(int key) { Remove(Find(key)); } public void Remove(UserScrobble scrobble) { db.Scrobble.Remove(scrobble); } public void RemoveRange(IEnumerable scrobbles) { db.Scrobble.RemoveRange(scrobbles); } public void Update(UserScrobble item) { db.Scrobble.Update(item); } public Task Save() { return db.SaveChangesAsync(); } public int Count(string userId = null, string username = null, string trackName = null, string albumName = null, string artistName = null, DateTime? from = null, DateTime? to = null) => GetAllQueryable(userId: userId, username: username, trackName: trackName, albumName: albumName, artistName: artistName, from: from, to: to, tracking: false).Count(); } }