Skip to content

Commit

Permalink
Workshop - Refactor InstalledEntry to not implement IEntryDetails
Browse files Browse the repository at this point in the history
This turned out to be a hassle
  • Loading branch information
RobertBeekman committed Jul 22, 2024
1 parent a45d98c commit 9001a12
Show file tree
Hide file tree
Showing 3 changed files with 136 additions and 127 deletions.
12 changes: 7 additions & 5 deletions src/Artemis.UI/Services/Updating/WorkshopUpdateService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -54,14 +54,16 @@ public async Task AutoUpdateEntries()
_updateNotificationProvider.Value.ShowWorkshopNotification(updatedEntries);
}

public async Task<bool> AutoUpdateEntry(InstalledEntry entry)
public async Task<bool> AutoUpdateEntry(InstalledEntry installedEntry)
{
// Query the latest version
IOperationResult<IGetEntryLatestReleaseByIdResult> latestReleaseResult = await _client.GetEntryLatestReleaseById.ExecuteAsync(entry.Id);

IOperationResult<IGetEntryLatestReleaseByIdResult> latestReleaseResult = await _client.GetEntryLatestReleaseById.ExecuteAsync(installedEntry.Id);
IGetEntryById_Entry_LatestRelease_Entry? entry = latestReleaseResult.Data?.Entry?.LatestRelease?.Entry;
if (entry == null)
return false;
if (latestReleaseResult.Data?.Entry?.LatestRelease is not IRelease latestRelease)
return false;
if (latestRelease.Id == entry.ReleaseId)
if (latestRelease.Id == installedEntry.ReleaseId)
return false;

_logger.Information("Auto-updating entry {Entry} to version {Version}", entry, latestRelease.Version);
Expand All @@ -72,7 +74,7 @@ public async Task<bool> AutoUpdateEntry(InstalledEntry entry)

// This happens during installation too but not on our reference of the entry
if (updateResult.IsSuccess)
entry.ApplyRelease(latestRelease);
installedEntry.ApplyRelease(latestRelease);

if (updateResult.IsSuccess)
_logger.Information("Auto-update successful for entry {Entry}", entry);
Expand Down
237 changes: 115 additions & 122 deletions src/Artemis.WebClient.Workshop/Models/InstalledEntry.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,22 +6,22 @@

namespace Artemis.WebClient.Workshop.Models;

public class InstalledEntry : CorePropertyChanged, IEntrySummary
public class InstalledEntry : CorePropertyChanged
{
private Dictionary<string, JsonNode> _metadata = new();
private long _id;
private string _author;
private bool _isOfficial;
private string _name;
private string _summary;
private EntryType _entryType;
private long _downloads;
private bool _autoUpdate;
private IReadOnlyList<InstalledEntryCategory> _categories;
private DateTimeOffset _createdAt;
private long _downloads;
private EntryType _entryType;
private long _id;
private bool _isOfficial;
private long? _latestReleaseId;
private IReadOnlyList<IGetDependantEntries_Entries_Items_Categories> _categories;
private Dictionary<string, JsonNode> _metadata = new();
private string _name;
private long _releaseId;
private string _releaseVersion = string.Empty;
private bool _autoUpdate;
private string _summary;

internal InstalledEntry(EntryEntity entity)
{
Expand All @@ -40,7 +40,6 @@ public InstalledEntry(IEntrySummary entry, IRelease release)
AutoUpdate = true;
}

internal EntryEntity Entity { get; }
public DateTimeOffset InstalledAt { get; set; }

public long ReleaseId
Expand All @@ -61,57 +60,82 @@ public bool AutoUpdate
set => SetAndNotify(ref _autoUpdate, value);
}

internal void Load()
public long Id
{
Id = Entity.EntryId;
Author = Entity.Author;
IsOfficial = Entity.IsOfficial;
Name = Entity.Name;
Summary = Entity.Summary;
EntryType = (EntryType) Entity.EntryType;
Downloads = Entity.Downloads;
CreatedAt = Entity.CreatedAt;
LatestReleaseId = Entity.LatestReleaseId;
Categories = Entity.Categories?.Select(c => new GetDependantEntries_Entries_Items_Categories_Category(c.Name, c.Icon)).ToList() ?? [];

ReleaseId = Entity.ReleaseId;
ReleaseVersion = Entity.ReleaseVersion;
InstalledAt = Entity.InstalledAt;
AutoUpdate = Entity.AutoUpdate;
get => _id;
private set => SetAndNotify(ref _id, value);
}

_metadata = Entity.Metadata != null ? new Dictionary<string, JsonNode>(Entity.Metadata) : [];
public string Author
{
get => _author;
private set => SetAndNotify(ref _author, value);
}

internal void Save()
public bool IsOfficial
{
Entity.EntryId = Id;
Entity.EntryType = (int) EntryType;
get => _isOfficial;
private set => SetAndNotify(ref _isOfficial, value);
}

Entity.Author = Author;
Entity.IsOfficial = IsOfficial;
Entity.Name = Name;
Entity.Summary = Summary;
Entity.Downloads = Downloads;
Entity.CreatedAt = CreatedAt;
Entity.LatestReleaseId = LatestReleaseId;
Entity.Categories = Categories.Select(c => new EntryCategoryEntity(c.Name, c.Icon)).ToList();
public string Name
{
get => _name;
private set => SetAndNotify(ref _name, value);
}

Entity.ReleaseId = ReleaseId;
Entity.ReleaseVersion = ReleaseVersion;
Entity.InstalledAt = InstalledAt;
Entity.AutoUpdate = AutoUpdate;

Entity.Metadata = new Dictionary<string, JsonNode>(_metadata);
public string Summary
{
get => _summary;
private set => SetAndNotify(ref _summary, value);
}

public EntryType EntryType
{
get => _entryType;
private set => SetAndNotify(ref _entryType, value);
}

public long Downloads
{
get => _downloads;
private set => SetAndNotify(ref _downloads, value);
}

public DateTimeOffset CreatedAt
{
get => _createdAt;
private set => SetAndNotify(ref _createdAt, value);
}

public long? LatestReleaseId
{
get => _latestReleaseId;
private set => SetAndNotify(ref _latestReleaseId, value);
}

public IReadOnlyList<InstalledEntryCategory> Categories
{
get => _categories;
private set => SetAndNotify(ref _categories, value);
}

internal EntryEntity Entity { get; }

/// <summary>
/// Gets the metadata value associated with the specified key.
/// Gets the metadata value associated with the specified key.
/// </summary>
/// <param name="key">The key of the value to get.</param>
/// <param name="value">When this method returns, contains the value associated with the specified key, if the key is found and of type <typeparamref name="T"/>;
/// otherwise, the default value for the type of the value parameter. This parameter is passed uninitialized.</param>
/// <param name="value">
/// When this method returns, contains the value associated with the specified key, if the key is found and of type
/// <typeparamref name="T" />;
/// otherwise, the default value for the type of the value parameter. This parameter is passed uninitialized.
/// </param>
/// <typeparam name="T">The type of the value.</typeparam>
/// <returns><see langword="true"/> if the metadata contains an element with the specified key; otherwise, <see langword="false"/>.</returns>
/// <returns>
/// <see langword="true" /> if the metadata contains an element with the specified key; otherwise,
/// <see langword="false" />.
/// </returns>
public bool TryGetMetadata<T>(string key, [NotNullWhen(true)] out T? value)
{
if (!_metadata.TryGetValue(key, out JsonNode? element))
Expand All @@ -125,7 +149,7 @@ public bool TryGetMetadata<T>(string key, [NotNullWhen(true)] out T? value)
}

/// <summary>
/// Sets metadata with the provided key to the provided value.
/// Sets metadata with the provided key to the provided value.
/// </summary>
/// <param name="key">The key of the value to set</param>
/// <param name="value">The value to set.</param>
Expand All @@ -135,17 +159,17 @@ public void SetMetadata(string key, object value)
}

/// <summary>
/// Removes metadata with the provided key.
/// Removes metadata with the provided key.
/// </summary>
/// <param name="key">The key of the metadata to remove</param>
/// <returns><see langword="true"/> if the element is successfully found and removed; otherwise, <see langword="false"/>.</returns>
/// <returns><see langword="true" /> if the element is successfully found and removed; otherwise, <see langword="false" />.</returns>
public bool RemoveMetadata(string key)
{
return _metadata.Remove(key);
}

/// <summary>
/// Returns the directory info of the entry, where any files would be stored if applicable.
/// Returns the directory info of the entry, where any files would be stored if applicable.
/// </summary>
/// <returns>The directory info of the directory.</returns>
public DirectoryInfo GetDirectory()
Expand All @@ -154,7 +178,7 @@ public DirectoryInfo GetDirectory()
}

/// <summary>
/// Returns the directory info of a release of this entry, where any files would be stored if applicable.
/// Returns the directory info of a release of this entry, where any files would be stored if applicable.
/// </summary>
/// <param name="release">The release to use, if none provided the current release is used.</param>
/// <returns>The directory info of the directory.</returns>
Expand All @@ -164,7 +188,7 @@ public DirectoryInfo GetReleaseDirectory(IRelease? release = null)
}

/// <summary>
/// Applies the provided release to the installed entry.
/// Applies the provided release to the installed entry.
/// </summary>
/// <param name="release">The release to apply.</param>
public void ApplyRelease(IRelease release)
Expand All @@ -173,7 +197,7 @@ public void ApplyRelease(IRelease release)
ReleaseVersion = release.Version;
InstalledAt = DateTimeOffset.UtcNow;
}

public void ApplyEntrySummary(IEntrySummary entry)
{
Id = entry.Id;
Expand All @@ -185,86 +209,55 @@ public void ApplyEntrySummary(IEntrySummary entry)
Downloads = entry.Downloads;
CreatedAt = entry.CreatedAt;
LatestReleaseId = entry.LatestReleaseId;
Categories = entry.Categories;
Categories = entry.Categories.Select(c => new InstalledEntryCategory(c.Name, c.Icon)).ToList();
}

#region Implementation of IEntrySummary

/// <inheritdoc />
public long Id
{
get => _id;
private set => SetAndNotify(ref _id, value);
}

/// <inheritdoc />
public string Author
{
get => _author;
private set => SetAndNotify(ref _author, value);
}

/// <inheritdoc />
public bool IsOfficial
{
get => _isOfficial;
private set => SetAndNotify(ref _isOfficial, value);
}

/// <inheritdoc />
public string Name
{
get => _name;
private set => SetAndNotify(ref _name, value);
}

/// <inheritdoc />
public string Summary
public override string ToString()
{
get => _summary;
private set => SetAndNotify(ref _summary, value);
return $"[{EntryType}] {Id} - {Name}";
}

/// <inheritdoc />
public EntryType EntryType
internal void Load()
{
get => _entryType;
private set => SetAndNotify(ref _entryType, value);
}
Id = Entity.EntryId;
Author = Entity.Author;
IsOfficial = Entity.IsOfficial;
Name = Entity.Name;
Summary = Entity.Summary;
EntryType = (EntryType) Entity.EntryType;
Downloads = Entity.Downloads;
CreatedAt = Entity.CreatedAt;
LatestReleaseId = Entity.LatestReleaseId;
Categories = Entity.Categories?.Select(c => new InstalledEntryCategory(c.Name, c.Icon)).ToList() ?? [];

/// <inheritdoc />
public long Downloads
{
get => _downloads;
private set => SetAndNotify(ref _downloads, value);
}
ReleaseId = Entity.ReleaseId;
ReleaseVersion = Entity.ReleaseVersion;
InstalledAt = Entity.InstalledAt;
AutoUpdate = Entity.AutoUpdate;

/// <inheritdoc />
public DateTimeOffset CreatedAt
{
get => _createdAt;
private set => SetAndNotify(ref _createdAt, value);
_metadata = Entity.Metadata != null ? new Dictionary<string, JsonNode>(Entity.Metadata) : [];
}

/// <inheritdoc />
public long? LatestReleaseId
internal void Save()
{
get => _latestReleaseId;
private set => SetAndNotify(ref _latestReleaseId, value);
}
Entity.EntryId = Id;
Entity.EntryType = (int) EntryType;

/// <inheritdoc />
public IReadOnlyList<IGetDependantEntries_Entries_Items_Categories> Categories
{
get => _categories;
private set => SetAndNotify(ref _categories, value);
}
Entity.Author = Author;
Entity.IsOfficial = IsOfficial;
Entity.Name = Name;
Entity.Summary = Summary;
Entity.Downloads = Downloads;
Entity.CreatedAt = CreatedAt;
Entity.LatestReleaseId = LatestReleaseId;
Entity.Categories = Categories.Select(c => new EntryCategoryEntity(c.Name, c.Icon)).ToList();

#endregion
Entity.ReleaseId = ReleaseId;
Entity.ReleaseVersion = ReleaseVersion;
Entity.InstalledAt = InstalledAt;
Entity.AutoUpdate = AutoUpdate;

/// <inheritdoc />
public override string ToString()
{
return $"[{EntryType}] {Id} - {Name}";
Entity.Metadata = new Dictionary<string, JsonNode>(_metadata);
}
}
14 changes: 14 additions & 0 deletions src/Artemis.WebClient.Workshop/Models/InstalledEntryCategory.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
namespace Artemis.WebClient.Workshop.Models;

public class InstalledEntryCategory
{
public InstalledEntryCategory(string name, string icon)
{
Name = name;
Icon = icon;
}

public string Name { get; }

public string Icon { get; }
}

0 comments on commit 9001a12

Please sign in to comment.