School Commit Init

This commit is contained in:
2024-08-31 12:07:21 +03:00
commit 0b130ee18c
2801 changed files with 4720552 additions and 0 deletions
@@ -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);
}
}
@@ -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;
}
}
}
@@ -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();
}
}
}
@@ -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();
}
}
}
@@ -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();
}
}
}
@@ -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
};
}
}
}