diff --git a/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs b/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs index fcba2d259..c40403ba9 100644 --- a/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs +++ b/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs @@ -188,9 +188,18 @@ public Task CreateWritingSystem(WritingSystemType type, WritingSy return Task.FromResult(FromLcmWritingSystem(ws, index, type)); } - public Task UpdateWritingSystem(WritingSystemId id, WritingSystemType type, UpdateObjectInput update) + public async Task UpdateWritingSystem(WritingSystemId id, WritingSystemType type, UpdateObjectInput update) { - throw new NotImplementedException(); // TODO: This needs to be implemented now, because UpdateWritingSystem(before, after) needs to call this + Cache.ServiceLocator.WritingSystemManager.GetOrSet(id.Code, out var lcmWritingSystem); + await Cache.DoUsingNewOrCurrentUOW("Update WritingSystem", + "Revert WritingSystem", + async () => + { + var updateProxy = new UpdateWritingSystemProxy(lcmWritingSystem, this) { Type = type }; // TODO: Doesn't compile, wants Font to be set. Also wants a GUID Id which we don't have... + update.Apply(updateProxy); + updateProxy.CommitUpdate(Cache); + }); + return await GetWritingSystem(id, type); } public async Task UpdateWritingSystem(WritingSystem before, WritingSystem after) diff --git a/backend/FwLite/FwDataMiniLcmBridge/Api/UpdateProxy/UpdateWritingSystemProxy.cs b/backend/FwLite/FwDataMiniLcmBridge/Api/UpdateProxy/UpdateWritingSystemProxy.cs new file mode 100644 index 000000000..ee67bcf43 --- /dev/null +++ b/backend/FwLite/FwDataMiniLcmBridge/Api/UpdateProxy/UpdateWritingSystemProxy.cs @@ -0,0 +1,58 @@ +using MiniLcm.Models; +using SIL.LCModel; +using SIL.LCModel.Core.WritingSystems; +using SIL.LCModel.DomainServices; + +namespace FwDataMiniLcmBridge.Api.UpdateProxy; + +public record UpdateWritingSystemProxy : WritingSystem +{ + private readonly CoreWritingSystemDefinition _origLcmWritingSystem; + private readonly CoreWritingSystemDefinition _workingLcmWritingSystem; + private readonly FwDataMiniLcmApi _lexboxLcmApi; + + public UpdateWritingSystemProxy(CoreWritingSystemDefinition lcmWritingSystem, FwDataMiniLcmApi lexboxLcmApi) + { + _origLcmWritingSystem = lcmWritingSystem; + _workingLcmWritingSystem = new CoreWritingSystemDefinition(lcmWritingSystem, cloneId: true); + _lexboxLcmApi = lexboxLcmApi; + } + + public void CommitUpdate(LcmCache cache) + { + if (_workingLcmWritingSystem.Id == _origLcmWritingSystem.Id) + { + cache.ServiceLocator.WritingSystemManager.Set(_workingLcmWritingSystem); + } + else + { + // Changing the ID of a writing system requires LCM to do a lot of work, so only go through that process if absolutely required + WritingSystemServices.MergeWritingSystems(cache, _workingLcmWritingSystem, _origLcmWritingSystem); + } + } + + public override required WritingSystemId WsId + { + get => _workingLcmWritingSystem.Id; + set => _workingLcmWritingSystem.Id = value; + } + + public override required string Name + { + get => _workingLcmWritingSystem.LanguageName; + set { } // Silently do nothing; name should be derived from WsId at all times, so if the name should change then so should the WsId + } + + public override required string Abbreviation + { + get => _workingLcmWritingSystem.Abbreviation; + set => _workingLcmWritingSystem.Abbreviation = value; + } + + // TODO: Change WritingSystem Font property to be a list of strings instead of a single string, then do something like this + // public override required List Fonts + // { + // get => _workingLcmWritingSystem.Fonts.Select(f => f.Name).ToList(); + // set => throw new NotImplementedException(); + // } +} diff --git a/backend/FwLite/MiniLcm/Models/WritingSystem.cs b/backend/FwLite/MiniLcm/Models/WritingSystem.cs index ed96bcddc..253f2dc28 100644 --- a/backend/FwLite/MiniLcm/Models/WritingSystem.cs +++ b/backend/FwLite/MiniLcm/Models/WritingSystem.cs @@ -3,10 +3,11 @@ public record WritingSystem: IObjectWithId { public required Guid Id { get; set; } - public required WritingSystemId WsId { get; set; } - public required string Name { get; set; } - public required string Abbreviation { get; set; } - public required string Font { get; set; } + public virtual required WritingSystemId WsId { get; set; } + public virtual required string Name { get; set; } + public virtual required string Abbreviation { get; set; } + // TODO: Font will need to become Fonts, a list or array of strings, to better match the LCM model + public virtual required string Font { get; set; } public DateTimeOffset? DeletedAt { get; set; } public required WritingSystemType Type { get; set; }