Skip to content

Commit

Permalink
Simplify realm domain model
Browse files Browse the repository at this point in the history
  • Loading branch information
aetherstrata committed Feb 14, 2024
1 parent ce54a83 commit cc87fef
Show file tree
Hide file tree
Showing 34 changed files with 357 additions and 543 deletions.
1 change: 0 additions & 1 deletion Aosta.Ava/Aosta.Ava/App.axaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
using Aosta.Ava.Localization;
using Aosta.Ava.Settings;
using Aosta.Ava.ViewModels;
using Aosta.Common.Extensions;
using Aosta.Jikan;

using Avalonia;
Expand Down
24 changes: 12 additions & 12 deletions Aosta.Ava/Aosta.Ava/Assets/Localization/it-IT.json
Original file line number Diff line number Diff line change
Expand Up @@ -88,16 +88,16 @@
"Enum.Season.Fall": "Autunno",
"Enum.Season.Winter": "Inverno",

"Date.Compact.January": "{0} / 01 / {1}",
"Date.Compact.February": "{0} / 02 / {1}",
"Date.Compact.March": "{0} / 03 / {1}",
"Date.Compact.April": "{0} / 04 / {1}",
"Date.Compact.May": "{0} / 05 / {1}",
"Date.Compact.June": "{0} /06 / {1}",
"Date.Compact.July": "{0} / 07 / {1}",
"Date.Compact.August": "{0} / 08 / {1}",
"Date.Compact.September": "{0} / 09 / {1}",
"Date.Compact.October": "{0} / 10 / {1}",
"Date.Compact.November": "{0} / 11 / {1}",
"Date.Compact.December": "{0} / 12 / {1}"
"Date.Compact.January": "{0}/01/{1}",
"Date.Compact.February": "{0}/02/{1}",
"Date.Compact.March": "{0}/03/{1}",
"Date.Compact.April": "{0}/04/{1}",
"Date.Compact.May": "{0}/05/{1}",
"Date.Compact.June": "{0}/06/{1}",
"Date.Compact.July": "{0}/07/{1}",
"Date.Compact.August": "{0}/08/{1}",
"Date.Compact.September": "{0}/09/{1}",
"Date.Compact.October": "{0}/10/{1}",
"Date.Compact.November": "{0}/11/{1}",
"Date.Compact.December": "{0}/12/{1}"
}
1 change: 1 addition & 0 deletions Aosta.Ava/Aosta.Ava/Assets/Resources/Measures.axaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
<ResourceDictionary xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<!-- Add Resources Here -->
<x:Double x:Key="AnimeBannerHeight">220</x:Double>
<x:Double x:Key="AnimeCardWidth">130</x:Double>
<x:Double x:Key="AnimeCardHeight">240</x:Double>
</ResourceDictionary>
2 changes: 1 addition & 1 deletion Aosta.Ava/Aosta.Ava/Pages/JikanAnimeDetailsPage.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
<Image Grid.Row="0"
async:ImageLoader.Source="{Binding LargeBanner}"
VerticalAlignment="Top"
Height="200"
Height="{StaticResource AnimeBannerHeight}"
Stretch="UniformToFill">
<Image.OpacityMask>
<LinearGradientBrush StartPoint="0%,0%" EndPoint="0%,100%">
Expand Down
4 changes: 2 additions & 2 deletions Aosta.Ava/Aosta.Ava/Pages/LocalAnimeDetailsPage.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
<Image Grid.Row="0"
async:ImageLoader.Source="{Binding LargeBanner}"
VerticalAlignment="Top"
Height="200"
Height="{StaticResource AnimeBannerHeight}"
Stretch="UniformToFill">
<Image.OpacityMask>
<LinearGradientBrush StartPoint="0%,0%" EndPoint="0%,100%">
Expand All @@ -31,7 +31,7 @@
</LinearGradientBrush>
</Image.OpacityMask>
</Image>
<StackPanel Grid.Row="0" Margin="10, 100, 10 ,10">
<StackPanel Grid.Row="0" Margin="10, 10, 10 ,10">
<ContentControl Content="{Binding DetailsPill}"/>
<TextBlock Text="{localize:Localize Label.Synopsis}"
FontSize="18"
Expand Down
10 changes: 5 additions & 5 deletions Aosta.Ava/Aosta.Ava/Settings/Setting.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,20 +13,20 @@ namespace Aosta.Ava.Settings;

public static class Setting
{
private static readonly Lazy<RealmAccess> lazy_realm = new(() => Locator.Current.GetSafely<RealmAccess>());
private static readonly RealmAccess lazy_realm = Locator.Current.GetSafely<RealmAccess>();

private const string include_nsfw = "IncludeNsfw";
private const string include_unapproved = "IncludeUnapproved";

public static bool IncludeNsfw
{
get => !lazy_realm.Value.GetSetting(include_nsfw, false);
set => lazy_realm.Value.SetSetting(include_nsfw, value);
get => lazy_realm.GetSetting(include_nsfw, false);
set => lazy_realm.SetSetting(include_nsfw, value);
}

public static bool IncludeUnapproved
{
get => !lazy_realm.Value.GetSetting(include_unapproved, false);
set => lazy_realm.Value.SetSetting(include_unapproved, value);
get => lazy_realm.GetSetting(include_unapproved, false);
set => lazy_realm.SetSetting(include_unapproved, value);
}
}
4 changes: 1 addition & 3 deletions Aosta.Ava/Aosta.Ava/ViewModels/AnimeSearchResultViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,7 @@ public AnimeSearchResultViewModel(IScreen host, AnimeResponse response, bool fou

var realmTask = _realm.WriteAsync(r =>
{
var jikanMetadata = response.ToModel();

r.Add(jikanMetadata.NewRecord());
r.Add(response.ToModel());
});

CanBeAdded = false;
Expand Down
4 changes: 2 additions & 2 deletions Aosta.Ava/Aosta.Ava/ViewModels/Card/AnimeListCardViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,9 @@ public AnimeListCardViewModel(IScreen host, Anime data)
GoToDetails = ReactiveCommand.CreateFromObservable(() => host.Router.Navigate.Execute(new LocalAnimeDetailsViewModel(host, _data)));
}

public string Title => _data.DefaultTitle ?? LocalizedString.NOT_AVAILABLE;
public string Title => _data.GetDefaultTitle() ?? LocalizedString.NOT_AVAILABLE;

public string BannerUrl => _data.Jikan?.Images?.JPG?.ImageUrl ?? IOnlineCard.PORTRAIT_PLACEHOLDER;
public string BannerUrl => _data.Images?.JPG?.ImageUrl ?? IOnlineCard.PORTRAIT_PLACEHOLDER;

public ReactiveCommand<Unit,IRoutableViewModel> GoToDetails { get; }
}
4 changes: 2 additions & 2 deletions Aosta.Ava/Aosta.Ava/ViewModels/DetailsPill/MoviePill.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,9 @@ public MoviePill(AnimeResponse response) : base(response)

public MoviePill(Anime model) : base(model)
{
if (model.Jikan?.Aired?.From.HasValue ?? false)
if (model.Aired?.From.HasValue ?? false)
{
Date = LocalizedString.CompactDate(model.Jikan.Aired.From.Value);
Date = LocalizedString.CompactDate(model.Aired.From.Value);
}
}
}
10 changes: 8 additions & 2 deletions Aosta.Ava/Aosta.Ava/ViewModels/JikanAnimeDetailsViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ internal JikanAnimeDetailsViewModel(IScreen hostScreen, AnimeResponse response)
internal bool CanBeAdded()
{
return !_realm.All<Anime>()
.Is(static x => x.Jikan!.ID, _response.MalId)
.Is(static x => x.ID, _response.MalId)
.Any();
}

Expand All @@ -84,7 +84,13 @@ internal Task AddToRealm(CancellationToken ct = default)
_response.Titles.GetDefault() ?? "N/A",
_response.MalId);

return Locator.Current.GetSafely<RealmAccess>().WriteAsync(r => r.Add(_response.ToModel().NewRecord()), ct);
return Locator.Current.GetSafely<RealmAccess>().WriteAsync(r =>
{
var model = _response.ToModel();
model.Episodes.AddRange(Episodes.Select(x => x.Response.ToModel()));
r.Add(model);

}, ct);
}

private int _page;
Expand Down
14 changes: 7 additions & 7 deletions Aosta.Ava/Aosta.Ava/ViewModels/JikanEpisodeEntry.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,20 +12,20 @@ namespace Aosta.Ava.ViewModels;

public class JikanEpisodeEntry
{
private readonly AnimeEpisodeResponse _response;
internal AnimeEpisodeResponse Response { get; }

public JikanEpisodeEntry(IScreen host, AnimeEpisodeResponse response, long animeId)
{
_response = response;
Response = response;

GoToDetails = ReactiveCommand.CreateFromObservable(() =>
host.Router.Navigate.Execute(new JikanEpisodeDetailsViewModel(host, _response, animeId)));
host.Router.Navigate.Execute(new JikanEpisodeDetailsViewModel(host, Response, animeId)));
}

internal ReactiveCommand<Unit, IRoutableViewModel> GoToDetails { get; }

public long Number => _response.MalId;
public string Title => _response.Title ?? LocalizedString.NOT_AVAILABLE;
public bool? Filler => _response.Filler;
public bool? Recap => _response.Recap;
public long Number => Response.MalId;
public string Title => Response.Title ?? LocalizedString.NOT_AVAILABLE;
public bool? Filler => Response.Filler;
public bool? Recap => Response.Recap;
}
5 changes: 2 additions & 3 deletions Aosta.Ava/Aosta.Ava/ViewModels/LocalAnimeDetailsViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@

using Aosta.Ava.Localization;
using Aosta.Ava.ViewModels.DetailsPill;
using Aosta.Data.Extensions;
using Aosta.Data.Models;

using ReactiveUI;
Expand Down Expand Up @@ -32,9 +31,9 @@ internal LocalAnimeDetailsViewModel(IScreen host, Anime anime)

public IContentInfoPill DetailsPill { get; }

internal string? LargeBanner => _anime.Jikan?.Images?.JPG?.LargeImageUrl;
internal string? LargeBanner => _anime.Images?.JPG?.LargeImageUrl;

internal string Synopsis => _anime.Synopsis ?? LocalizedString.NOT_AVAILABLE;

internal string Title => _anime.Local?.Title ?? _anime.Jikan?.Titles.GetDefault() ?? LocalizedString.NA;
internal string Title => _anime.GetDefaultTitle();
}
6 changes: 2 additions & 4 deletions Aosta.Ava/Aosta.Ava/ViewModels/SearchPageViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,6 @@
using DynamicData;
using DynamicData.Kernel;

using HarfBuzzSharp;

using ReactiveUI;
using ReactiveUI.Fody.Helpers;

Expand Down Expand Up @@ -125,9 +123,9 @@ private async Task executeSearch(string s, CancellationToken ct = default)
// Check if the MAL IDs returned from Jikan appear in Realm
var found = _realm.Run(r =>
r.All<Anime>()
.In(x => x.Jikan!.ID, resultIds)
.In(x => x.ID, resultIds)
.AsRealmCollection()
.Select(x => x.Jikan!.ID)
.Select(x => x.ID)
.ToHashSet());

var viewModels = result.Data
Expand Down
17 changes: 6 additions & 11 deletions Aosta.Data.Tests/Models/AnimeTests.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
using Aosta.Data.Enums;
using Aosta.Data.Extensions;
using Aosta.Data.Mapper;
using Aosta.Data.Models;
using Aosta.Data.Models.Local;
using Aosta.Data.Models.Embedded;
using Aosta.Data.Tests.Models.Jikan;
using Aosta.Data.Tests.Realm;

using FluentAssertions.Execution;
Expand All @@ -18,33 +20,26 @@ public void CreateNewAnimeTest()

using var _ = new AssertionScope();
realm.Run(r => r.All<Anime>().Count()).Should().Be(1);
realm.Run(r => r.First<Anime>().DefaultTitle).Should().BeNull();
}

[Test]
public void EditAnimeTest()
{
var realm = RealmSetup.NewInstance().AddAnime();

realm.Write(r => r.First<Anime>().Local = new LocalAnime()
{
Title = "Awesome Title"
});
realm.Write(r => r.First<Anime>().Titles.Add(new TitleEntry("Default", "Awesome Title")));

using var _ = new AssertionScope();
realm.Run(r => r.All<Anime>().Count()).Should().Be(1);
realm.Run(r => r.First<Anime>().DefaultTitle).Should().Be("Awesome Title");
realm.Run(r => r.First<Anime>().GetDefaultTitle()).Should().Be("Awesome Title");
}

[Test]
public void EditContentTypeTest()
{
var realm = RealmSetup.NewInstance().AddAnime();

realm.Write(r => r.First<Anime>().Local = new LocalAnime()
{
Type = ContentType.Movie
});
realm.Write(r => r.First<Anime>().Type = ContentType.Movie);

using var _ = new AssertionScope();
realm.Run(r => r.All<Anime>().Count()).Should().Be(1);
Expand Down
9 changes: 4 additions & 5 deletions Aosta.Data.Tests/Models/Jikan/ImageSetTests.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
using Aosta.Data.Mapper;
using Aosta.Jikan.Models.Response;
using FluentAssertions.Execution;

using JikanMapper = Aosta.Data.Mapper.JikanMapper;

namespace Aosta.Data.Tests.Models.Jikan;

[TestFixture]
Expand All @@ -11,11 +10,11 @@ public class ImageSetTests
[Test]
public void SetConversionTest()
{
var converted = JikanMapper.ToModel(new ImagesSetResponse
var converted = new ImagesSetResponse
{
JPG = new ImageResponse { ImageUrl = "jpg" },
WebP = new ImageResponse { ImageUrl = "webp" }
});
}.ToModel();

using var _ = new AssertionScope();
converted.WebP.ImageUrl.Should().Be("webp");
Expand All @@ -25,7 +24,7 @@ public void SetConversionTest()
[Test]
public void SetDefaultValuesTest()
{
var newSet = JikanMapper.ToModel(new ImagesSetResponse());
var newSet = new ImagesSetResponse().ToModel();

using var _ = new AssertionScope();
newSet.WebP.Should().BeNull();
Expand Down
9 changes: 4 additions & 5 deletions Aosta.Data.Tests/Models/Jikan/ImageTests.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
using Aosta.Data.Mapper;
using Aosta.Jikan.Models.Response;
using FluentAssertions.Execution;

using JikanMapper = Aosta.Data.Mapper.JikanMapper;

namespace Aosta.Data.Tests.Models.Jikan;

[TestFixture]
Expand All @@ -11,14 +10,14 @@ public class ImageTests
[Test]
public void ConversionTest()
{
var converted = JikanMapper.ToModel(new ImageResponse
var converted = new ImageResponse
{
ImageUrl = "https://url.com/image.jpg",
SmallImageUrl = "https://url.com/smallImage.jpg",
MediumImageUrl = "https://url.com/mediumImage.jpg",
LargeImageUrl = "https://url.com/largeImage.jpg",
MaximumImageUrl = "https://url.com/MaximumImage.jpg"
});
}.ToModel();

using var _ = new AssertionScope();
converted.ImageUrl.Should().Be("https://url.com/image.jpg");
Expand All @@ -31,7 +30,7 @@ public void ConversionTest()
[Test]
public void DefaultValuesTest()
{
var newImage = JikanMapper.ToModel(new ImageResponse());
var newImage = new ImageResponse().ToModel();

using var _ = new AssertionScope();
newImage.ImageUrl.Should().BeNull();
Expand Down
9 changes: 4 additions & 5 deletions Aosta.Data.Tests/Models/Jikan/TimePeriodTests.cs
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
using Aosta.Data.Mapper;
using Aosta.Jikan.Models.Response;

using FluentAssertions.Execution;

using JikanMapper = Aosta.Data.Mapper.JikanMapper;

namespace Aosta.Data.Tests.Models.Jikan;

[TestFixture]
Expand All @@ -12,11 +11,11 @@ public class TimePeriodTests
[Test]
public void ConversionTest()
{
var converted = JikanMapper.ToModel(new TimePeriodResponse
var converted = new TimePeriodResponse
{
From = new DateTime(2000, 10, 24, 0, 0, 0, kind: DateTimeKind.Utc),
To = new DateTime(2001, 1, 8, 0, 0, 0, kind: DateTimeKind.Utc)
});
}.ToModel();

using var _ = new AssertionScope();
converted.From.Should().HaveYear(2000).And.HaveMonth(10).And.HaveDay(24);
Expand All @@ -26,7 +25,7 @@ public void ConversionTest()
[Test]
public void DefaultValuesTest()
{
var newPeriod = JikanMapper.ToModel(new TimePeriodResponse());
var newPeriod = new TimePeriodResponse().ToModel();

using var _ = new AssertionScope();
newPeriod.From.Should().BeNull();
Expand Down
Loading

0 comments on commit cc87fef

Please sign in to comment.