You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ShopNCook/LocalServices/AccountRecipesPreferences.cs

110 lines
3.2 KiB

using Endpoint;
using LocalEndpoint.Data;
using Models;
using System.Collections.Immutable;
namespace LocalEndpoint
{
internal class AccountRecipesPreferences : IAccountRecipesPreferences
{
//Binds a recipe's id to its amount of person stored in the account's weekly list
private readonly Dictionary<Guid, uint> weekly = new Dictionary<Guid, uint>();
private readonly Database db;
public AccountRecipesPreferences(Account account, Database db)
{
Account = account;
this.db = db;
}
public Account Account { get; init; }
public ImmutableList<RecipeInfo> GetRecommendedRecipes()
{
return db.ListAllRecipes().ConvertAll(recipe => recipe.Info);
}
public ImmutableList<RecipeInfo> GetFavorites()
{
List<RecipeInfo> favorites = new List<RecipeInfo>();
var ratings = db.ListRatesOf(Account.User.Id);
foreach (Recipe recipe in db.ListAllRecipes())
{
if (ratings.TryGetValue(recipe.Info.Id, out RecipeRate? rate))
{
if (rate.IsFavorite)
favorites.Add(recipe.Info);
}
}
return favorites.ToImmutableList();
}
public ImmutableList<(RecipeInfo, uint)> GetWeeklyList()
{
List<(RecipeInfo, uint)> weekly = new List<(RecipeInfo, uint)>();
foreach (Recipe recipe in db.ListAllRecipes())
{
if (this.weekly.TryGetValue(recipe.Info.Id, out uint personAmmount))
{
weekly.Add((recipe.Info, personAmmount));
}
}
return weekly.ToImmutableList();
}
public RecipeRate GetRate(RecipeInfo info)
{
RecipeRate rate = null;
var ratings = db.ListRatesOf(Account.User.Id);
if (!ratings.TryGetValue(info.Id, out rate))
{
rate = new RecipeRate();
ratings.Add(info.Id, rate);
}
return rate;
}
public bool AddToWeeklyList(RecipeInfo info, uint persAmount)
{
if (weekly.ContainsKey(info.Id))
return false;
weekly[info.Id] = persAmount;
return true;
}
public void AddToFavorites(RecipeInfo info)
{
Guid userId = Account.User.Id;
var ratings = db.ListRatesOf(userId);
RecipeRate rate = GetRate(info);
db.InsertRate(userId, info.Id, new RecipeRate(true, rate.Rate));
}
public void RemoveFromFavorites(RecipeInfo info)
{
Guid userId = Account.User.Id;
var ratings = db.ListRatesOf(userId);
RecipeRate rate = GetRate(info);
db.InsertRate(userId, info.Id, new RecipeRate(false, rate.Rate));
}
public void SetReviewScore(RecipeInfo info, uint score)
{
Guid userId = Account.User.Id;
var ratings = db.ListRatesOf(userId);
RecipeRate rate = GetRate(info);
db.InsertRate(userId, info.Id, new RecipeRate(rate.IsFavorite, score));
}
}
}