diff --git a/osu.Game/Rulesets/Mods/ModPreset.cs b/osu.Game/Rulesets/Mods/ModPreset.cs
index 367acc8a91..2c3f574d47 100644
--- a/osu.Game/Rulesets/Mods/ModPreset.cs
+++ b/osu.Game/Rulesets/Mods/ModPreset.cs
@@ -3,6 +3,12 @@
using System;
using System.Collections.Generic;
+using System.Linq;
+using Newtonsoft.Json;
+using osu.Framework.Extensions.ObjectExtensions;
+using osu.Game.Database;
+using osu.Game.Online.API;
+using Realms;
namespace osu.Game.Rulesets.Mods
{
@@ -10,12 +16,18 @@ namespace osu.Game.Rulesets.Mods
/// A mod preset is a named collection of configured mods.
/// Presets are presented to the user in the mod select overlay for convenience.
///
- public class ModPreset
+ public class ModPreset : RealmObject, IHasGuidPrimaryKey, ISoftDelete
{
+ ///
+ /// The internal database ID of the preset.
+ ///
+ [PrimaryKey]
+ public Guid ID { get; set; } = Guid.NewGuid();
+
///
/// The ruleset that the preset is valid for.
///
- public RulesetInfo RulesetInfo { get; set; } = null!;
+ public RulesetInfo Ruleset { get; set; } = null!;
///
/// The name of the mod preset.
@@ -30,6 +42,34 @@ namespace osu.Game.Rulesets.Mods
///
/// The set of configured mods that are part of the preset.
///
- public ICollection Mods { get; set; } = Array.Empty();
+ [Ignored]
+ public ICollection Mods
+ {
+ get
+ {
+ if (string.IsNullOrEmpty(ModsJson))
+ return Array.Empty();
+
+ var apiMods = JsonConvert.DeserializeObject>(ModsJson);
+ var ruleset = Ruleset.CreateInstance();
+ return apiMods.AsNonNull().Select(mod => mod.ToMod(ruleset)).ToArray();
+ }
+ set
+ {
+ var apiMods = value.Select(mod => new APIMod(mod)).ToArray();
+ ModsJson = JsonConvert.SerializeObject(apiMods);
+ }
+ }
+
+ ///
+ /// The set of configured mods that are part of the preset, serialised as a JSON blob.
+ ///
+ [MapTo("Mods")]
+ public string ModsJson { get; set; } = string.Empty;
+
+ ///
+ /// Whether the preset has been soft-deleted by the user.
+ ///
+ public bool DeletePending { get; set; }
}
}