School Commit Init
This commit is contained in:
+17
@@ -0,0 +1,17 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace TechTitans.Repositories
|
||||
{
|
||||
public interface IRepository<T>
|
||||
{
|
||||
T GetById(int id);
|
||||
IEnumerable<T> GetAll();
|
||||
bool Add(T entity);
|
||||
bool Update(T entity);
|
||||
bool Delete(T entity);
|
||||
}
|
||||
}
|
||||
+217
@@ -0,0 +1,217 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Data;
|
||||
using System.Data.Common;
|
||||
using Microsoft.Data.SqlClient;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Dapper;
|
||||
using static Dapper.SqlMapper;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
|
||||
namespace TechTitans.Repositories
|
||||
{
|
||||
public class Repository<T> : IRepository<T> where T : class
|
||||
{
|
||||
public IDbConnection _connection;
|
||||
private readonly IConfiguration _configuration = MauiProgram.Configuration;
|
||||
|
||||
public Repository()
|
||||
{
|
||||
|
||||
_connection = new Microsoft.Data.SqlClient.SqlConnection(_configuration.GetConnectionString("TechTitansDev"));
|
||||
}
|
||||
|
||||
public bool Add(T entity)
|
||||
{
|
||||
int rowsEffected = 0;
|
||||
try
|
||||
{
|
||||
string tableName = GetTableName();
|
||||
string columns = GetColumns(excludeKey: true);
|
||||
string properties = GetPropertyNames(excludeKey: true);
|
||||
string query = $"INSERT INTO {tableName} ({columns}) VALUES ({properties})";
|
||||
|
||||
rowsEffected = _connection.Execute(query, entity);
|
||||
}
|
||||
catch (Exception ex) { }
|
||||
|
||||
return rowsEffected > 0 ? true : false;
|
||||
}
|
||||
|
||||
public bool Delete(T entity)
|
||||
{
|
||||
int rowsEffected = 0;
|
||||
try
|
||||
{
|
||||
string tableName = GetTableName();
|
||||
string keyColumn = GetKeyColumnName();
|
||||
string keyProperty = GetKeyPropertyName();
|
||||
string query = $"DELETE FROM {tableName} WHERE {keyColumn} = @{keyProperty}";
|
||||
|
||||
rowsEffected = _connection.Execute(query, entity);
|
||||
}
|
||||
catch (Exception ex) { }
|
||||
|
||||
return rowsEffected > 0 ? true : false;
|
||||
}
|
||||
|
||||
public IEnumerable<T> GetAll()
|
||||
{
|
||||
IEnumerable<T> result = null;
|
||||
try
|
||||
{
|
||||
string tableName = GetTableName();
|
||||
string query = $"SELECT * FROM {tableName}";
|
||||
|
||||
result = _connection.Query<T>(query);
|
||||
}
|
||||
catch (Exception ex) { }
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public T GetById(int Id)
|
||||
{
|
||||
IEnumerable<T> result = null;
|
||||
try
|
||||
{
|
||||
string tableName = GetTableName();
|
||||
string keyColumn = GetKeyColumnName();
|
||||
string query = $"SELECT * FROM {tableName} WHERE {keyColumn} = '{Id}'";
|
||||
|
||||
result = _connection.Query<T>(query);
|
||||
}
|
||||
catch (Exception ex) { }
|
||||
|
||||
return result.FirstOrDefault();
|
||||
}
|
||||
|
||||
public bool Update(T entity)
|
||||
{
|
||||
int rowsEffected = 0;
|
||||
try
|
||||
{
|
||||
string tableName = GetTableName();
|
||||
string keyColumn = GetKeyColumnName();
|
||||
string keyProperty = GetKeyPropertyName();
|
||||
|
||||
StringBuilder query = new StringBuilder();
|
||||
query.Append($"UPDATE {tableName} SET ");
|
||||
|
||||
foreach (var property in GetProperties(true))
|
||||
{
|
||||
var columnAttr = property.GetCustomAttribute<ColumnAttribute>();
|
||||
|
||||
string propertyName = property.Name;
|
||||
string columnName = columnAttr.Name;
|
||||
|
||||
query.Append($"{columnName} = @{propertyName},");
|
||||
}
|
||||
|
||||
query.Remove(query.Length - 1, 1);
|
||||
|
||||
query.Append($" WHERE {keyColumn} = @{keyProperty}");
|
||||
|
||||
rowsEffected = _connection.Execute(query.ToString(), entity);
|
||||
}
|
||||
catch (Exception ex) { }
|
||||
|
||||
return rowsEffected > 0 ? true : false;
|
||||
}
|
||||
|
||||
private string GetTableName()
|
||||
{
|
||||
string tableName = "";
|
||||
var type = typeof(T);
|
||||
var tableAttr = type.GetCustomAttribute<TableAttribute>();
|
||||
if (tableAttr != null)
|
||||
{
|
||||
tableName = tableAttr.Name;
|
||||
return tableName;
|
||||
}
|
||||
|
||||
return type.Name + "s";
|
||||
}
|
||||
|
||||
public static string GetKeyColumnName()
|
||||
{
|
||||
PropertyInfo[] properties = typeof(T).GetProperties();
|
||||
|
||||
foreach (PropertyInfo property in properties)
|
||||
{
|
||||
object[] keyAttributes = property.GetCustomAttributes(typeof(KeyAttribute), true);
|
||||
|
||||
if (keyAttributes != null && keyAttributes.Length > 0)
|
||||
{
|
||||
object[] columnAttributes = property.GetCustomAttributes(typeof(ColumnAttribute), true);
|
||||
|
||||
if (columnAttributes != null && columnAttributes.Length > 0)
|
||||
{
|
||||
ColumnAttribute columnAttribute = (ColumnAttribute)columnAttributes[0];
|
||||
return columnAttribute.Name;
|
||||
}
|
||||
else
|
||||
{
|
||||
return property.Name;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
private string GetColumns(bool excludeKey = false)
|
||||
{
|
||||
var type = typeof(T);
|
||||
var columns = string.Join(", ", type.GetProperties()
|
||||
.Where(p => !excludeKey || !p.IsDefined(typeof(KeyAttribute)))
|
||||
.Select(p =>
|
||||
{
|
||||
var columnAttr = p.GetCustomAttribute<ColumnAttribute>();
|
||||
return columnAttr != null ? columnAttr.Name : p.Name;
|
||||
}));
|
||||
|
||||
return columns;
|
||||
}
|
||||
|
||||
protected string GetPropertyNames(bool excludeKey = false)
|
||||
{
|
||||
var properties = typeof(T).GetProperties()
|
||||
.Where(p => !excludeKey || p.GetCustomAttribute<KeyAttribute>() == null);
|
||||
|
||||
var values = string.Join(", ", properties.Select(p =>
|
||||
{
|
||||
return $"@{p.Name}";
|
||||
}));
|
||||
|
||||
return values;
|
||||
}
|
||||
|
||||
protected IEnumerable<PropertyInfo> GetProperties(bool excludeKey = false)
|
||||
{
|
||||
var properties = typeof(T).GetProperties()
|
||||
.Where(p => !excludeKey || p.GetCustomAttribute<KeyAttribute>() == null);
|
||||
|
||||
return properties;
|
||||
}
|
||||
|
||||
protected string GetKeyPropertyName()
|
||||
{
|
||||
var properties = typeof(T).GetProperties()
|
||||
.Where(p => p.GetCustomAttribute<KeyAttribute>() != null);
|
||||
|
||||
if (properties.Any())
|
||||
{
|
||||
return properties.FirstOrDefault().Name;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
+96
@@ -0,0 +1,96 @@
|
||||
using Dapper;
|
||||
using Microsoft.Extensions.Primitives;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using TechTitans.Models;
|
||||
|
||||
namespace TechTitans.Repositories
|
||||
{
|
||||
internal class SongBasicDetailsRepository : Repository<SongBasicDetails>
|
||||
{
|
||||
public SongBasicInfo SongBasicDetailsToSongBasicInfo(SongBasicDetails songBasicDetails)
|
||||
{
|
||||
var artistId = songBasicDetails.Artist_Id;
|
||||
var cmd = new StringBuilder();
|
||||
cmd.Append("SELECT name FROM AuthorDetails WHERE artist_id = @artistId");
|
||||
var artistName = _connection.Query<string>(cmd.ToString(), new { artistId }).FirstOrDefault();
|
||||
return new SongBasicInfo
|
||||
{
|
||||
SongId = songBasicDetails.Song_Id,
|
||||
Name = songBasicDetails.Name,
|
||||
Genre = songBasicDetails.Genre,
|
||||
Subgenre = songBasicDetails.Subgenre,
|
||||
Artist = artistName,
|
||||
Language = songBasicDetails.Language,
|
||||
Country = songBasicDetails.Country,
|
||||
Album = songBasicDetails.Album,
|
||||
Image = songBasicDetails.Image
|
||||
};
|
||||
}
|
||||
|
||||
public SongBasicDetails GetSongBasicDetails(int songId)
|
||||
{
|
||||
var cmd = new StringBuilder();
|
||||
cmd.Append("SELECT * FROM SongBasicDetails WHERE song_id = @songId");
|
||||
return _connection.Query<SongBasicDetails>(cmd.ToString(), new { songId }).FirstOrDefault();
|
||||
}
|
||||
|
||||
public List<SongBasicDetails> GetTop5MostListenedSongs(int userId)
|
||||
{
|
||||
var cmd = new StringBuilder();
|
||||
cmd.Append("SELECT * FROM SongBasicDetails WHERE song_id IN (SELECT TOP 5 song_id FROM UserPlaybackBehaviour WHERE user_id = @userId AND event_type = 2 GROUP BY song_id ORDER BY COUNT(song_id) DESC);");
|
||||
return _connection.Query<SongBasicDetails>(cmd.ToString(), new { userId }).ToList();
|
||||
}
|
||||
|
||||
public Tuple<SongBasicDetails, decimal> GetMostPlayedSongPercentile(int userId)
|
||||
{
|
||||
var cmd = new StringBuilder();
|
||||
cmd.Append("SELECT * FROM SongBasicDetails WHERE song_id IN (SELECT TOP 1 song_id FROM UserPlaybackBehaviour WHERE user_id = @userId AND event_type = 2 AND YEAR(timestamp) = YEAR(GETDATE()) GROUP BY song_id ORDER BY COUNT(song_id) DESC);");
|
||||
var mostPlayedSong = _connection.Query<SongBasicDetails>(cmd.ToString(), new { userId }).FirstOrDefault();
|
||||
cmd.Clear();
|
||||
cmd.Append("SELECT COUNT(*) FROM UserPlaybackBehaviour WHERE user_id = @userId AND event_type = 2 AND YEAR(timestamp) = YEAR(GETDATE());");
|
||||
var totalSongs = _connection.Query<int>(cmd.ToString(), new { userId }).FirstOrDefault();
|
||||
cmd.Clear();
|
||||
cmd.Append("SELECT COUNT(*) FROM UserPlaybackBehaviour WHERE user_id = @userId AND event_type = 2 AND YEAR(timestamp) = YEAR(GETDATE()) AND song_id IN (SELECT TOP 1 song_id FROM UserPlaybackBehaviour WHERE user_id = @userId AND event_type = 2 AND YEAR(timestamp) = YEAR(GETDATE()) GROUP BY song_id ORDER BY COUNT(song_id) DESC);");
|
||||
var mostListenedSongCount = _connection.Query<int>(cmd.ToString(), new { userId }).FirstOrDefault();
|
||||
return new Tuple<SongBasicDetails, decimal>(mostPlayedSong, (decimal)mostListenedSongCount / totalSongs);
|
||||
}
|
||||
|
||||
public Tuple<string, decimal> GetMostPlayedArtistPercentile(int userId)
|
||||
{
|
||||
var cmd = new StringBuilder();
|
||||
cmd.Append("SELECT TOP 1 sd.artist_id as Artist_Id, COUNT(*) AS Start_Listen_Events FROM UserPlaybackBehaviour ub JOIN SongBasicDetails sd ON ub.song_id = sd.song_id WHERE ub.user_id = @userId AND ub.event_type = 2 AND YEAR(timestamp) = YEAR(GETDATE()) GROUP BY sd.artist_id ORDER BY COUNT(*) DESC;");
|
||||
var response = _connection.Query<MostPlayedArtistInfo>(cmd.ToString(), new { userId }).FirstOrDefault();
|
||||
cmd.Clear();
|
||||
cmd.Append("SELECT name FROM AuthorDetails WHERE artist_id = @artist_Id");
|
||||
var mostPlayedArtist = _connection.Query<string>(cmd.ToString(), new { response.Artist_Id }).FirstOrDefault();
|
||||
cmd.Clear();
|
||||
cmd.Append("SELECT COUNT(*) FROM UserPlaybackBehaviour WHERE user_id = @userId AND event_type = 2 AND YEAR(timestamp) = YEAR(GETDATE());");
|
||||
var totalSongs = _connection.Query<int>(cmd.ToString(), new { userId }).FirstOrDefault();
|
||||
cmd.Clear();
|
||||
return new Tuple<string, decimal>(mostPlayedArtist, (decimal)response.Start_Listen_Events / totalSongs);
|
||||
}
|
||||
|
||||
public List<string> GetTop5Genres(int userId)
|
||||
{
|
||||
var cmd = new StringBuilder();
|
||||
cmd.Append("SELECT TOP 5 sb.genre FROM UserPlaybackBehaviour ub JOIN SongBasicDetails sb ON ub.song_id = sb.song_id WHERE ub.user_id = @userId AND ub.event_type = 2 AND YEAR(ub.timestamp) = YEAR(GETDATE()) GROUP BY sb.genre ORDER BY COUNT(*) DESC;");
|
||||
return _connection.Query<string>(cmd.ToString(), new { userId }).ToList();
|
||||
}
|
||||
|
||||
public List<string> NewGenresDiscovered(int userId)
|
||||
{
|
||||
//new genres where first song was played for the first time in the current year
|
||||
//var cmd = new StringBuilder();
|
||||
//cmd.Append("SELECT genre FROM SongBasicDetails WHERE song_id IN (SELECT song_id FROM UserPlaybackBehaviour WHERE user_id = @userId AND event_type = 1 AND YEAR(timestamp) = YEAR(GETDATE()) GROUP BY song_id HAVING COUNT(song_id) = 1);");
|
||||
|
||||
//select all genres that have been played in current year but not in previous year
|
||||
var cmd = new StringBuilder();
|
||||
cmd.Append("SELECT DISTINCT genre FROM SongBasicDetails WHERE song_id IN (SELECT song_id FROM UserPlaybackBehaviour WHERE user_id = @userId AND event_type = 2 AND YEAR(timestamp) = YEAR(GETDATE()) GROUP BY song_id) AND genre NOT IN (SELECT genre FROM SongBasicDetails WHERE song_id IN (SELECT song_id FROM UserPlaybackBehaviour WHERE user_id = @userId AND event_type = 2 AND YEAR(timestamp) = YEAR(GETDATE()) - 1 GROUP BY song_id));");
|
||||
return _connection.Query<string>(cmd.ToString(), new { userId }).ToList();
|
||||
}
|
||||
}
|
||||
}
|
||||
+94
@@ -0,0 +1,94 @@
|
||||
using Dapper;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using TechTitans.Models;
|
||||
|
||||
namespace TechTitans.Repositories
|
||||
{
|
||||
public class TestRepository : Repository<Test>
|
||||
{
|
||||
public Test TestMethod()
|
||||
{
|
||||
var cmd = new StringBuilder();
|
||||
cmd.Append("SELECT * FROM Test");
|
||||
return _connection.Query<Test>(cmd.ToString()).FirstOrDefault();
|
||||
}
|
||||
}
|
||||
public class TestDemographicDetails : Repository<UserDemographicsDetails>
|
||||
{
|
||||
public UserDemographicsDetails TestMethod()
|
||||
{
|
||||
var cmd = new StringBuilder();
|
||||
cmd.Append("SELECT * FROM UserDemographicsDetails");
|
||||
return _connection.Query<UserDemographicsDetails>(cmd.ToString()).FirstOrDefault();
|
||||
}
|
||||
}
|
||||
public class TestAuthorDetails : Repository<AuthorDetails>
|
||||
{
|
||||
public AuthorDetails TestMethod()
|
||||
{
|
||||
var cmd = new StringBuilder();
|
||||
cmd.Append("SELECT * FROM AuthorDetails");
|
||||
// return _connection.Query<Test>(cmd.ToString()).FirstOrDefault();
|
||||
return _connection.Query<AuthorDetails>(cmd.ToString()).FirstOrDefault();
|
||||
}
|
||||
}
|
||||
public class TestAdDistributionData : Repository<AdDistributionData>
|
||||
{
|
||||
public AdDistributionData TestMethod()
|
||||
{
|
||||
var cmd = new StringBuilder();
|
||||
cmd.Append("SELECT * FROM AdDistributionData");
|
||||
return _connection.Query<AdDistributionData>(cmd.ToString()).FirstOrDefault();
|
||||
}
|
||||
}
|
||||
public class TestSongBasicDetails : Repository<SongBasicDetails>
|
||||
{
|
||||
public SongBasicDetails TestMethod()
|
||||
{
|
||||
var cmd = new StringBuilder();
|
||||
cmd.Append("SELECT * FROM SongBasicDetails");
|
||||
return _connection.Query<SongBasicDetails>(cmd.ToString()).FirstOrDefault();
|
||||
}
|
||||
}
|
||||
public class TestUserPlaybackBehaviour : Repository<UserPlaybackBehaviour>
|
||||
{
|
||||
public UserPlaybackBehaviour TestMethod()
|
||||
{
|
||||
var cmd = new StringBuilder();
|
||||
cmd.Append("SELECT * FROM UserPlaybackBehaviour");
|
||||
return _connection.Query<UserPlaybackBehaviour>(cmd.ToString()).FirstOrDefault();
|
||||
}
|
||||
}
|
||||
public class TestSongRecommendationDetails : Repository<SongRecommendationDetails>
|
||||
{
|
||||
public SongRecommendationDetails TestMethod()
|
||||
{
|
||||
var cmd = new StringBuilder();
|
||||
cmd.Append("SELECT * FROM SongRecommendationDetails");
|
||||
return _connection.Query<SongRecommendationDetails>(cmd.ToString()).FirstOrDefault();
|
||||
}
|
||||
}
|
||||
public class TestSongFeatures : Repository<SongFeatures>
|
||||
{
|
||||
public SongFeatures TestMethod()
|
||||
{
|
||||
var cmd = new StringBuilder();
|
||||
cmd.Append("SELECT * FROM SongFeatures");
|
||||
return _connection.Query<SongFeatures>(cmd.ToString()).FirstOrDefault();
|
||||
}
|
||||
}
|
||||
public class TestTrends : Repository<Trends>
|
||||
{
|
||||
public Trends TestMethod()
|
||||
{
|
||||
var cmd = new StringBuilder();
|
||||
cmd.Append("SELECT * FROM Trends");
|
||||
return _connection.Query<Trends>(cmd.ToString()).FirstOrDefault();
|
||||
}
|
||||
}
|
||||
}
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
using Dapper;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using TechTitans.Models;
|
||||
|
||||
namespace TechTitans.Repositories
|
||||
{
|
||||
internal class UserPlaybackBehaviourRepository : Repository<UserPlaybackBehaviour>
|
||||
{
|
||||
public UserPlaybackBehaviour GetUserPlaybackBehaviour(int userId, int songId, DateTime timestamp)
|
||||
{
|
||||
var cmd = new StringBuilder();
|
||||
cmd.Append("SELECT * FROM UserPlaybackBehaviour WHERE user_id = @userId AND song_id = @songId AND timestamp = @timestamp");
|
||||
return _connection.Query<UserPlaybackBehaviour>(cmd.ToString(), new { userId, songId, timestamp }).FirstOrDefault();
|
||||
}
|
||||
|
||||
public List<UserPlaybackBehaviour> GetUserPlaybackBehaviour(int userId, int songId)
|
||||
{
|
||||
var cmd = new StringBuilder();
|
||||
cmd.Append("SELECT * FROM UserPlaybackBehaviour WHERE user_id = @userId AND song_id = @songId");
|
||||
return _connection.Query<UserPlaybackBehaviour>(cmd.ToString(), new { userId, songId }).ToList();
|
||||
}
|
||||
|
||||
public List<UserPlaybackBehaviour> GetUserPlaybackBehaviour(int userId)
|
||||
{
|
||||
var cmd = new StringBuilder();
|
||||
cmd.Append("SELECT user_id as User_Id, song_id as Song_Id, event_type as Event_Type, timestamp as Timestamp FROM UserPlaybackBehaviour WHERE user_id = @userId");
|
||||
return _connection.Query<UserPlaybackBehaviour>(cmd.ToString(), new { userId }).ToList();
|
||||
}
|
||||
}
|
||||
}
|
||||
+35
@@ -0,0 +1,35 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using TechTitans.Repositories;
|
||||
using TechTitans.Models;
|
||||
using Dapper;
|
||||
|
||||
namespace TechTitans.Repositories
|
||||
{
|
||||
internal class UserRepository : Repository<SongBasicDetails>
|
||||
{
|
||||
public SongBasicInfo SongBasicDetailsToSongBasicInfo(SongBasicDetails songBasicDetails)
|
||||
{
|
||||
var artistId = songBasicDetails.Artist_Id;
|
||||
var cmd = new StringBuilder();
|
||||
cmd.Append("SELECT name FROM AuthorDetails WHERE artist_id = @artistId");
|
||||
var artistName = _connection.Query<string>(cmd.ToString(), new { artistId }).FirstOrDefault();
|
||||
return new SongBasicInfo
|
||||
{
|
||||
SongId = songBasicDetails.Song_Id,
|
||||
Name = songBasicDetails.Name,
|
||||
Genre = songBasicDetails.Genre,
|
||||
Subgenre = songBasicDetails.Subgenre,
|
||||
Artist = artistName,
|
||||
Language = songBasicDetails.Language,
|
||||
Country = songBasicDetails.Country,
|
||||
Album = songBasicDetails.Album,
|
||||
Image = songBasicDetails.Image
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user