From 382848cabe8f2a87eab19b5abe2878720afaa60a Mon Sep 17 00:00:00 2001 From: hwndmaster <5339929+hwndmaster@users.noreply.github.com> Date: Mon, 17 Jan 2022 22:21:54 +0100 Subject: [PATCH] Took images+logs view/vm out to atom, async changes --- Data/Product.json | 97 +++++++++--------- Directory.Build.targets | 8 +- ...tsStoreWithOverwriteCommandHandlerTests.cs | 12 +-- .../Repositories/AgentRepositoryTests.cs | 10 +- .../Repositories/ProductRepositoryTests.cs | 20 ++-- .../AgentDeleteCommandHandler.cs | 7 +- .../AgentsStoreWithOverwriteCommandHandler.cs | 8 +- .../ProductCreateOrUpdateCommandHandler.cs | 8 +- .../ProductDeleteCommandHandler.cs | 7 +- .../ProductDropPricesCommandHandler.cs | 3 +- PriceChecker.Core/Models/Agent.cs | 1 + .../Repositories/AgentRepository.cs | 22 ++-- .../Repositories/ProductRepository.cs | 16 ++- .../Services/ProductPriceManager.cs | 2 +- .../ViewModels/MainViewModelTests.cs | 3 +- PriceChecker.UI/App.xaml | 13 +-- PriceChecker.UI/App.xaml.cs | 5 +- PriceChecker.UI/Assets/Alert32.png | Bin 1849 -> 0 bytes PriceChecker.UI/Assets/Copy16.png | Bin 469 -> 0 bytes PriceChecker.UI/Assets/DonePink16.png | Bin 677 -> 0 bytes PriceChecker.UI/Assets/Error16.png | Bin 857 -> 0 bytes PriceChecker.UI/Assets/Loading32.gif | Bin 5467 -> 0 bytes PriceChecker.UI/Assets/Outdated16.png | Bin 595 -> 0 bytes PriceChecker.UI/Assets/Plus16.png | Bin 545 -> 0 bytes PriceChecker.UI/Assets/Refresh16.png | Bin 620 -> 0 bytes PriceChecker.UI/Assets/Trash16.png | Bin 551 -> 0 bytes PriceChecker.UI/Assets/Unknown16.png | Bin 357 -> 0 bytes PriceChecker.UI/Assets/Warning16.png | Bin 537 -> 0 bytes PriceChecker.UI/Assets/Web16.png | Bin 642 -> 0 bytes PriceChecker.UI/Helpers/ProductInteraction.cs | 10 +- .../ViewModels/LogItemViewModel.cs | 50 --------- PriceChecker.UI/ViewModels/LogsViewModel.cs | 49 --------- PriceChecker.UI/ViewModels/MainViewModel.cs | 4 +- .../TrackerProductSourceViewModel.cs | 5 +- .../ViewModels/TrackerProductViewModel.cs | 4 +- PriceChecker.UI/Views/Logs.xaml | 37 ------- PriceChecker.UI/Views/Logs.xaml.cs | 12 --- PriceChecker.UI/Views/MainWindow.xaml | 3 +- 38 files changed, 124 insertions(+), 292 deletions(-) delete mode 100644 PriceChecker.UI/Assets/Alert32.png delete mode 100644 PriceChecker.UI/Assets/Copy16.png delete mode 100644 PriceChecker.UI/Assets/DonePink16.png delete mode 100644 PriceChecker.UI/Assets/Error16.png delete mode 100644 PriceChecker.UI/Assets/Loading32.gif delete mode 100644 PriceChecker.UI/Assets/Outdated16.png delete mode 100644 PriceChecker.UI/Assets/Plus16.png delete mode 100644 PriceChecker.UI/Assets/Refresh16.png delete mode 100644 PriceChecker.UI/Assets/Trash16.png delete mode 100644 PriceChecker.UI/Assets/Unknown16.png delete mode 100644 PriceChecker.UI/Assets/Warning16.png delete mode 100644 PriceChecker.UI/Assets/Web16.png delete mode 100644 PriceChecker.UI/ViewModels/LogItemViewModel.cs delete mode 100644 PriceChecker.UI/ViewModels/LogsViewModel.cs delete mode 100644 PriceChecker.UI/Views/Logs.xaml delete mode 100644 PriceChecker.UI/Views/Logs.xaml.cs diff --git a/Data/Product.json b/Data/Product.json index aa29c29..a2b28c4 100644 --- a/Data/Product.json +++ b/Data/Product.json @@ -13,15 +13,15 @@ "Lowest": { "ProductSourceId": "60b9ceed-b34c-45ad-a142-af0ec5491d91", "Status": 1, - "Price": 15.90, - "FoundDate": "2022-01-12T16:38:23.5065248+01:00" + "Price": 15.9, + "FoundDate": "2022-01-17T22:11:38.0596893+01:00" }, "Recent": [ { "ProductSourceId": "60b9ceed-b34c-45ad-a142-af0ec5491d91", "Status": 1, - "Price": 15.90, - "FoundDate": "2022-01-12T16:38:23.5065248+01:00" + "Price": 15.9, + "FoundDate": "2022-01-17T22:11:38.0596893+01:00" } ], "Id": "6a52bd42-d19e-4572-9295-28e01e7e7417" @@ -46,20 +46,20 @@ "ProductSourceId": "ebeaa98d-aedb-4bb8-b539-1de7e1ee25cc", "Status": 1, "Price": 699, - "FoundDate": "2022-01-12T11:47:19.3724935+01:00" + "FoundDate": "2022-01-17T22:11:30.3167162+01:00" }, "Recent": [ { "ProductSourceId": "4753f887-5b20-41de-a06b-3c159262a273", "Status": 1, "Price": 749, - "FoundDate": "2022-01-12T11:47:19.3724893+01:00" + "FoundDate": "2022-01-17T22:11:30.3167121+01:00" }, { "ProductSourceId": "ebeaa98d-aedb-4bb8-b539-1de7e1ee25cc", "Status": 1, "Price": 699, - "FoundDate": "2022-01-12T11:47:19.3724935+01:00" + "FoundDate": "2022-01-17T22:11:30.3167162+01:00" } ], "Id": "5486193d-b417-4936-b71c-be250317dc81" @@ -88,27 +88,27 @@ "Lowest": { "ProductSourceId": "d786a796-b93c-468b-8fda-a2892d72802a", "Status": 1, - "Price": 139.99, - "FoundDate": "2022-01-12T16:39:00.6305374+01:00" + "Price": 149, + "FoundDate": "2022-01-17T22:15:35.0988116+01:00" }, "Recent": [ + { + "ProductSourceId": "3b27b7fc-369d-4f90-ba4c-f209c1a0153b", + "Status": 1, + "Price": 179, + "FoundDate": "2022-01-17T22:15:35.0988087+01:00" + }, { "ProductSourceId": "d786a796-b93c-468b-8fda-a2892d72802a", "Status": 1, - "Price": 139.99, - "FoundDate": "2022-01-12T16:39:00.6305374+01:00" + "Price": 149, + "FoundDate": "2022-01-17T22:15:35.0988116+01:00" }, { "ProductSourceId": "1778e5f5-b73d-418b-b3b8-06412828f54f", "Status": 3, "Price": null, - "FoundDate": "2022-01-12T16:39:00.6305405+01:00" - }, - { - "ProductSourceId": "3b27b7fc-369d-4f90-ba4c-f209c1a0153b", - "Status": 1, - "Price": 179, - "FoundDate": "2022-01-12T16:39:00.6305407+01:00" + "FoundDate": "2022-01-17T22:15:35.0988117+01:00" } ], "Id": "e10533c4-8e07-443c-b751-52020da1e7ee" @@ -132,21 +132,21 @@ "Lowest": { "ProductSourceId": "923b83ed-3fcb-43ca-80b0-0e9e717ec9c6", "Status": 1, - "Price": 519.80, - "FoundDate": "2022-01-12T16:40:36.1338264+01:00" + "Price": 519.8, + "FoundDate": "2022-01-17T22:15:31.6599739+01:00" }, "Recent": [ { "ProductSourceId": "5f5a72a4-d6ad-4cab-9fb9-9d5839fa2a03", "Status": 3, "Price": null, - "FoundDate": "2022-01-12T16:40:36.1338221+01:00" + "FoundDate": "2022-01-17T22:15:31.6599714+01:00" }, { "ProductSourceId": "923b83ed-3fcb-43ca-80b0-0e9e717ec9c6", "Status": 1, - "Price": 519.80, - "FoundDate": "2022-01-12T16:40:36.1338264+01:00" + "Price": 519.8, + "FoundDate": "2022-01-17T22:15:31.6599739+01:00" } ], "Id": "1b60bf08-2d90-4f85-99ce-3d26d19bb696" @@ -173,13 +173,13 @@ "ProductSourceId": "cbb43572-35b9-4408-9e52-09f934b97336", "Status": 3, "Price": null, - "FoundDate": "2022-01-12T16:41:33.6760236+01:00" + "FoundDate": "2022-01-17T22:14:25.9009655+01:00" }, { "ProductSourceId": "ab80a6f9-c175-4c10-8f69-aee23e7efc64", "Status": 3, "Price": null, - "FoundDate": "2022-01-12T16:41:33.6760279+01:00" + "FoundDate": "2022-01-17T22:14:25.9009746+01:00" } ], "Id": "fa6bca3a-0e5b-4efd-acc0-b20fc07fd269" @@ -204,20 +204,20 @@ "ProductSourceId": "b129f9f2-416b-493e-af3c-ff0f255a66e9", "Status": 1, "Price": 499.99, - "FoundDate": "2022-01-12T16:41:36.2769149+01:00" + "FoundDate": "2022-01-17T22:14:24.1309443+01:00" }, "Recent": [ - { - "ProductSourceId": "b129f9f2-416b-493e-af3c-ff0f255a66e9", - "Status": 1, - "Price": 499.99, - "FoundDate": "2022-01-12T16:41:36.2769149+01:00" - }, { "ProductSourceId": "aa039437-a86f-4cf7-9283-90c63a95e142", "Status": 3, "Price": null, - "FoundDate": "2022-01-12T16:41:36.2769184+01:00" + "FoundDate": "2022-01-17T22:14:24.1309405+01:00" + }, + { + "ProductSourceId": "b129f9f2-416b-493e-af3c-ff0f255a66e9", + "Status": 1, + "Price": 499.99, + "FoundDate": "2022-01-17T22:14:24.1309443+01:00" } ], "Id": "76ed6168-fbae-4fb3-a572-bc70c4d1e567" @@ -236,15 +236,15 @@ "Lowest": { "ProductSourceId": "831217bc-0784-4d57-a6a5-d71bf6b2bd19", "Status": 1, - "Price": 367.64, - "FoundDate": "2022-01-12T11:47:18.4194776+01:00" + "Price": 360.94, + "FoundDate": "2022-01-17T22:11:58.4706763+01:00" }, "Recent": [ { "ProductSourceId": "831217bc-0784-4d57-a6a5-d71bf6b2bd19", "Status": 1, - "Price": 367.64, - "FoundDate": "2022-01-12T11:47:18.4194776+01:00" + "Price": 360.94, + "FoundDate": "2022-01-17T22:11:58.4706763+01:00" } ], "Id": "40467c0b-d5ff-45d6-b1b7-30d8ab344dc8" @@ -492,14 +492,14 @@ "ProductSourceId": "281a09b0-4e6e-4b30-a016-92d02a459303", "Status": 1, "Price": 499, - "FoundDate": "2022-01-12T11:47:12.1233434+01:00" + "FoundDate": "2022-01-17T22:11:27.5942189+01:00" }, "Recent": [ { "ProductSourceId": "281a09b0-4e6e-4b30-a016-92d02a459303", "Status": 1, "Price": 499, - "FoundDate": "2022-01-12T11:47:12.1233434+01:00" + "FoundDate": "2022-01-17T22:11:27.5942189+01:00" } ], "Id": "115d3cd7-ce8e-4058-ab7c-451d23385607" @@ -519,14 +519,14 @@ "ProductSourceId": "ebac9915-2f1f-4dc2-affa-d6d16eeb9fbc", "Status": 1, "Price": 79.99, - "FoundDate": "2022-01-12T16:38:47.9170131+01:00" + "FoundDate": "2022-01-17T22:11:34.1555861+01:00" }, "Recent": [ { "ProductSourceId": "ebac9915-2f1f-4dc2-affa-d6d16eeb9fbc", "Status": 1, "Price": 79.99, - "FoundDate": "2022-01-12T16:38:47.9170131+01:00" + "FoundDate": "2022-01-17T22:11:34.1555861+01:00" } ], "Id": "3ce265ce-4edc-49d1-ace5-7733ba8430ee" @@ -650,19 +650,24 @@ "AgentArgument": "B082WD5YV9" } ], - "Lowest": null, + "Lowest": { + "ProductSourceId": "f1c56af5-3385-4337-991d-c39bbcc4e529", + "Status": 1, + "Price": 339.99, + "FoundDate": "2022-01-17T22:15:29.2184901+01:00" + }, "Recent": [ { "ProductSourceId": "511e7ef2-ba34-444d-b8d5-35ab3ccb7e67", "Status": 3, "Price": null, - "FoundDate": "2022-01-12T16:40:45.8696497+01:00" + "FoundDate": "2022-01-17T22:15:29.2184846+01:00" }, { "ProductSourceId": "f1c56af5-3385-4337-991d-c39bbcc4e529", - "Status": 3, - "Price": null, - "FoundDate": "2022-01-12T16:40:45.8696535+01:00" + "Status": 1, + "Price": 339.99, + "FoundDate": "2022-01-17T22:15:29.2184901+01:00" } ], "Id": "b2392eeb-f7d2-4bca-b8ce-e1b9ee9698d8" diff --git a/Directory.Build.targets b/Directory.Build.targets index e6a0ab2..1581b76 100644 --- a/Directory.Build.targets +++ b/Directory.Build.targets @@ -14,10 +14,10 @@ - - - - + + + + diff --git a/PriceChecker.Core.Tests/CommandHandlers/AgentsStoreWithOverwriteCommandHandlerTests.cs b/PriceChecker.Core.Tests/CommandHandlers/AgentsStoreWithOverwriteCommandHandlerTests.cs index e2c74f5..b484e4a 100644 --- a/PriceChecker.Core.Tests/CommandHandlers/AgentsStoreWithOverwriteCommandHandlerTests.cs +++ b/PriceChecker.Core.Tests/CommandHandlers/AgentsStoreWithOverwriteCommandHandlerTests.cs @@ -34,7 +34,7 @@ public async Task Process__Agents_are_overwritten_and_event_published() await _sut.ProcessAsync(command); // Verify - _agentRepoMock.Verify(x => x.Overwrite(It.IsAny()), Times.Once); + _agentRepoMock.Verify(x => x.OverwriteAsync(It.IsAny()), Times.Once); _eventBusMock.Verify(x => x.Publish(It.IsAny()), Times.Once); } @@ -59,9 +59,9 @@ public async Task Process__Products_agent_keys_are_refined() products[1].Id // renaming and removing }; Agent[] agentsUpdated = Array.Empty(); - _agentRepoMock.Setup(x => x.Overwrite(It.IsAny())) + _agentRepoMock.Setup(x => x.OverwriteAsync(It.IsAny())) .Callback(x => agentsUpdated = x); - _agentQueryMock.Setup(x => x.GetAllAsync()).ReturnsAsync(agentsUpdated); + _agentQueryMock.Setup(x => x.GetAllAsync()).ReturnsAsync(() => agentsUpdated); // Pre-Assert Assert.Equal(agents[1].Key, products[0].Sources[1].AgentKey); @@ -72,12 +72,12 @@ public async Task Process__Products_agent_keys_are_refined() await _sut.ProcessAsync(command); // Verify - _productRepoMock.Verify(x => x.Overwrite(It.Is(y => + _productRepoMock.Verify(x => x.OverwriteAsync(It.Is(y => y[0].Sources[1].AgentKey.Equals(agentsToUpdate[1].Key) && y[1].Sources[1].AgentKey.Equals(agentsToUpdate[4].Key) && y[1].Sources.Length == 2 )), Times.Once); - _eventBusMock.Verify(x => x.Publish(It.Is(y => - y.Entities.SequenceEqual(affectedProductIds))), Times.Once); + _eventBusMock.Verify(x => x.Publish(It.Is(y => + y.Updated.Keys.SequenceEqual(affectedProductIds))), Times.Once); } } diff --git a/PriceChecker.Core.Tests/Repositories/AgentRepositoryTests.cs b/PriceChecker.Core.Tests/Repositories/AgentRepositoryTests.cs index 4ef17c1..47c0fec 100644 --- a/PriceChecker.Core.Tests/Repositories/AgentRepositoryTests.cs +++ b/PriceChecker.Core.Tests/Repositories/AgentRepositoryTests.cs @@ -49,7 +49,7 @@ public async Task Delete__Removes_appripriate_agent() var agentToDelete = _agents[1]; // Act - _sut.Delete(agentToDelete.Id); + await _sut.DeleteAsync(agentToDelete.Id); // Verify Assert.Null(await _sut.FindByIdAsync(agentToDelete.Id)); @@ -63,7 +63,7 @@ public async Task Delete__When_no_agent_found__Breaks_operation() var agentCount = agents.Count(); // Act - _sut.Delete(Guid.NewGuid()); + await _sut.DeleteAsync(Guid.NewGuid()); // Verify Assert.Equal(agentCount, (await _sut.GetAllAsync()).Count()); @@ -77,13 +77,13 @@ public async Task Store__Replaces_all_existing_agents_and_updates_cache_and_fire var previousAgents = (await _sut.GetAllAsync()).ToArray(); // Act - _sut.Overwrite(newAgents); + await _sut.OverwriteAsync(newAgents); // Verify Assert.False((await _sut.GetAllAsync()).Except(newAgents).Any()); _persisterMock.Verify(x => x.Store(It.IsAny(), It.Is((List p) => p.SequenceEqual(newAgents)))); - _eventBusMock.Verify(x => x.Publish(It.Is(e => e.Entities.Count == newAgents.Length)), Times.Once); - _eventBusMock.Verify(x => x.Publish(It.Is(e => e.Entities.Count == previousAgents.Length)), Times.Once); + _eventBusMock.Verify(x => x.Publish(It.Is(e => e.Added.Count == newAgents.Length + && e.Deleted.Count == previousAgents.Length)), Times.Once); } } diff --git a/PriceChecker.Core.Tests/Repositories/ProductRepositoryTests.cs b/PriceChecker.Core.Tests/Repositories/ProductRepositoryTests.cs index 91f3194..a7d0b67 100644 --- a/PriceChecker.Core.Tests/Repositories/ProductRepositoryTests.cs +++ b/PriceChecker.Core.Tests/Repositories/ProductRepositoryTests.cs @@ -23,7 +23,7 @@ public ProductRepositoryTests() _agents = ModelHelpers.SampleManyAgents(_products).ToArray(); foreach (var agent in _agents) - _agentQueryMock.Setup(x => x.FindByKey(agent.Key)).Returns(agent); + _agentQueryMock.Setup(x => x.FindByKeyAsync(agent.Key)).ReturnsAsync(agent); _persisterMock.Setup(x => x.LoadCollection(It.IsAny())) .Returns(_products); @@ -59,13 +59,13 @@ public async Task FindById__Returns_appropriate_product() } [Fact] - public async Task Delete__Removes_appripriate_product() + public async Task Delete__Removes_appropriate_product() { // Arrange var productToDelete = _products[1]; // Act - _sut.Delete(productToDelete.Id); + await _sut.DeleteAsync(productToDelete.Id); // Verify Assert.Null(await _sut.FindByIdAsync(productToDelete.Id)); @@ -78,25 +78,25 @@ public async Task Delete__When_no_product_found__Breaks_operation() var productCount = (await _sut.GetAllAsync()).Count(); // Act - _sut.Delete(Guid.NewGuid()); + await _sut.DeleteAsync(Guid.NewGuid()); // Verify Assert.Equal(productCount, (await _sut.GetAllAsync()).Count()); } [Fact] - public void Store__For_existing_product__Saves_it_and_fires_event() + public async Task Store__For_existing_product__Saves_it_and_fires_event() { // Arrange var product = _products[1]; // Act - _sut.Store(product); + await _sut.StoreAsync(product); // Verify _persisterMock.Verify(x => x.Store(It.IsAny(), It.Is((List p) => p.SequenceEqual(_products)))); - _eventBusMock.Verify(x => x.Publish(It.Is(e => e.Entities.First() == product.Id)), Times.Once); + _eventBusMock.Verify(x => x.Publish(It.Is(e => e.Updated.First().Key == product.Id)), Times.Once); } [Fact] @@ -107,13 +107,13 @@ public async Task Store__For_nonexisting_product__Adds_it_and_fires_event() var productCount = (await _sut.GetAllAsync()).Count(); // Act - _sut.Store(product); + await _sut.StoreAsync(product); // Verify var expectedProducts = _products.Concat(new [] { product }); _persisterMock.Verify(x => x.Store(It.IsAny(), It.Is((List p) => p.SequenceEqual(expectedProducts)))); - _eventBusMock.Verify(x => x.Publish(It.Is(e => e.Entities.First() == product.Id)), Times.Once); + _eventBusMock.Verify(x => x.Publish(It.Is(e => e.Added.First().Key == product.Id)), Times.Once); Assert.Equal(productCount + 1, (await _sut.GetAllAsync()).Count()); } @@ -126,7 +126,7 @@ public async Task Store__When_id_is_empty__Adds_product_with_autogenerated_id() var productCount = (await _sut.GetAllAsync()).Count(); // Act - _sut.Store(product); + await _sut.StoreAsync(product); // Verify Assert.NotEqual(Guid.Empty, product.Id); diff --git a/PriceChecker.Core/CommandHandlers/AgentDeleteCommandHandler.cs b/PriceChecker.Core/CommandHandlers/AgentDeleteCommandHandler.cs index 0ac499b..54d2046 100644 --- a/PriceChecker.Core/CommandHandlers/AgentDeleteCommandHandler.cs +++ b/PriceChecker.Core/CommandHandlers/AgentDeleteCommandHandler.cs @@ -1,4 +1,3 @@ -using System.Threading.Tasks; using Genius.Atom.Infrastructure.Commands; using Genius.Atom.Infrastructure.Events; using Genius.PriceChecker.Core.Commands; @@ -18,12 +17,10 @@ public AgentDeleteCommandHandler(IAgentRepository agentRepo, IEventBus eventBus) _eventBus = eventBus; } - public Task ProcessAsync(AgentDeleteCommand command) + public async Task ProcessAsync(AgentDeleteCommand command) { - _agentRepo.Delete(command.AgentId); + await _agentRepo.DeleteAsync(command.AgentId); _eventBus.Publish(new AgentsAffectedEvent()); - - return Task.CompletedTask; } } diff --git a/PriceChecker.Core/CommandHandlers/AgentsStoreWithOverwriteCommandHandler.cs b/PriceChecker.Core/CommandHandlers/AgentsStoreWithOverwriteCommandHandler.cs index 7747f61..bc4edc8 100644 --- a/PriceChecker.Core/CommandHandlers/AgentsStoreWithOverwriteCommandHandler.cs +++ b/PriceChecker.Core/CommandHandlers/AgentsStoreWithOverwriteCommandHandler.cs @@ -1,9 +1,9 @@ -using System.Threading.Tasks; using Genius.Atom.Infrastructure.Commands; using Genius.Atom.Infrastructure.Entities; using Genius.Atom.Infrastructure.Events; using Genius.PriceChecker.Core.Commands; using Genius.PriceChecker.Core.Messages; +using Genius.PriceChecker.Core.Models; using Genius.PriceChecker.Core.Repositories; namespace Genius.PriceChecker.Core.CommandHandlers; @@ -29,7 +29,7 @@ public AgentsStoreWithOverwriteCommandHandler(IAgentRepository agentRepo, public async Task ProcessAsync(AgentsStoreWithOverwriteCommand command) { - _agentRepo.Overwrite(command.Agents); + await _agentRepo.OverwriteAsync(command.Agents); _eventBus.Publish(new AgentsAffectedEvent()); await RefineProductSources(); @@ -67,7 +67,7 @@ private async Task RefineProductSources() if (!affectedProductsIds.Any()) return; - _productRepo.Overwrite(products); - _eventBus.Publish(new EntitiesUpdatedEvent(affectedProductsIds)); + await _productRepo.OverwriteAsync(products); + _eventBus.Publish(new EntitiesAffectedEvent(typeof(Product), EntityAffectedEventType.Updated, affectedProductsIds.ToArray())); } } diff --git a/PriceChecker.Core/CommandHandlers/ProductCreateOrUpdateCommandHandler.cs b/PriceChecker.Core/CommandHandlers/ProductCreateOrUpdateCommandHandler.cs index c099b2c..4e35817 100644 --- a/PriceChecker.Core/CommandHandlers/ProductCreateOrUpdateCommandHandler.cs +++ b/PriceChecker.Core/CommandHandlers/ProductCreateOrUpdateCommandHandler.cs @@ -24,15 +24,15 @@ public ProductCreateOrUpdateCommandHandler(IProductRepository productRepo, IProd _eventBus = eventBus; } - public Task ProcessAsync(ProductCreateCommand command) + public async Task ProcessAsync(ProductCreateCommand command) { var product = new Product(); UpdateProperties(product, command); - _productRepo.Store(product); + await _productRepo.StoreAsync(product); _eventBus.Publish(new ProductsAffectedEvent()); - return Task.FromResult(product.Id); + return product.Id; } public async Task ProcessAsync(ProductUpdateCommand command) @@ -41,7 +41,7 @@ public async Task ProcessAsync(ProductUpdateCommand command) Guard.NotNull(product); UpdateProperties(product, command); - _productRepo.Store(product); + await _productRepo.StoreAsync(product); _eventBus.Publish(new ProductsAffectedEvent()); } diff --git a/PriceChecker.Core/CommandHandlers/ProductDeleteCommandHandler.cs b/PriceChecker.Core/CommandHandlers/ProductDeleteCommandHandler.cs index b9994d4..5f6a4ca 100644 --- a/PriceChecker.Core/CommandHandlers/ProductDeleteCommandHandler.cs +++ b/PriceChecker.Core/CommandHandlers/ProductDeleteCommandHandler.cs @@ -1,4 +1,3 @@ -using System.Threading.Tasks; using Genius.Atom.Infrastructure.Commands; using Genius.Atom.Infrastructure.Events; using Genius.PriceChecker.Core.Commands; @@ -18,12 +17,10 @@ public ProductDeleteCommandHandler(IProductRepository productRepo, IEventBus eve _eventBus = eventBus; } - public Task ProcessAsync(ProductDeleteCommand command) + public async Task ProcessAsync(ProductDeleteCommand command) { - _productRepo.Delete(command.ProductId); + await _productRepo.DeleteAsync(command.ProductId); _eventBus.Publish(new ProductsAffectedEvent()); - - return Task.CompletedTask; } } diff --git a/PriceChecker.Core/CommandHandlers/ProductDropPricesCommandHandler.cs b/PriceChecker.Core/CommandHandlers/ProductDropPricesCommandHandler.cs index c86e96c..5d73852 100644 --- a/PriceChecker.Core/CommandHandlers/ProductDropPricesCommandHandler.cs +++ b/PriceChecker.Core/CommandHandlers/ProductDropPricesCommandHandler.cs @@ -1,4 +1,3 @@ -using System.Threading.Tasks; using Genius.Atom.Infrastructure.Commands; using Genius.PriceChecker.Core.Commands; using Genius.PriceChecker.Core.Models; @@ -25,6 +24,6 @@ public async Task ProcessAsync(ProductDropPricesCommand command) product.Lowest = null; product.Recent = Array.Empty(); - _productRepo.Store(product); + await _productRepo.StoreAsync(product); } } diff --git a/PriceChecker.Core/Models/Agent.cs b/PriceChecker.Core/Models/Agent.cs index 28965df..cb1ddb3 100644 --- a/PriceChecker.Core/Models/Agent.cs +++ b/PriceChecker.Core/Models/Agent.cs @@ -14,6 +14,7 @@ public object Clone() { return new Agent() { + Id = Id, Key = Key, Url = Url, PricePattern = PricePattern, diff --git a/PriceChecker.Core/Repositories/AgentRepository.cs b/PriceChecker.Core/Repositories/AgentRepository.cs index 04a5cac..f8d707e 100644 --- a/PriceChecker.Core/Repositories/AgentRepository.cs +++ b/PriceChecker.Core/Repositories/AgentRepository.cs @@ -8,7 +8,7 @@ namespace Genius.PriceChecker.Core.Repositories; public interface IAgentQueryService : IQueryService { - Agent? FindByKey(string agentKey); + Task FindByKeyAsync(string agentKey); } public interface IAgentRepository : IRepository @@ -22,22 +22,18 @@ public AgentRepository(IEventBus eventBus, IJsonPersister persister, ILogger FindByIdAsync(Guid entityId) - { - return Task.FromResult(base.FindById(entityId)); - } + public new Task FindByIdAsync(Guid entityId) + => base.FindByIdAsync(entityId); - public Agent? FindByKey(string agentKey) + public async Task FindByKeyAsync(string agentKey) { - return GetAll().FirstOrDefault(x => x.Key == agentKey); + return (await GetAllAsync()).FirstOrDefault(x => x.Key == agentKey); } - public Task> GetAllAsync() - { - return Task.FromResult(base.GetAll()); - } + public new Task> GetAllAsync() + => base.GetAllAsync(); - protected override void FillUpRelations(Agent entity) + protected override Task FillUpRelationsAsync(Agent entity) { // Backwards compatibility if (string.IsNullOrEmpty(entity.Handler)) @@ -45,6 +41,6 @@ protected override void FillUpRelations(Agent entity) entity.Handler = nameof(AgentHandlers.SimpleRegex); } - base.FillUpRelations(entity); + return Task.CompletedTask; } } diff --git a/PriceChecker.Core/Repositories/ProductRepository.cs b/PriceChecker.Core/Repositories/ProductRepository.cs index 26e17b2..e0ac31f 100644 --- a/PriceChecker.Core/Repositories/ProductRepository.cs +++ b/PriceChecker.Core/Repositories/ProductRepository.cs @@ -26,24 +26,20 @@ public ProductRepository(IEventBus eventBus, IJsonPersister persister, _agentRepo = agentQuery; } - public Task FindByIdAsync(Guid entityId) - { - return Task.FromResult(base.FindById(entityId)); - } + public new Task FindByIdAsync(Guid entityId) + => base.FindByIdAsync(entityId); - public Task> GetAllAsync() - { - return Task.FromResult(base.GetAll()); - } + public new Task> GetAllAsync() + => base.GetAllAsync(); - protected override void FillUpRelations(Product product) + protected override async Task FillUpRelationsAsync(Product product) { var sourcesDict = product.Sources.ToDictionary(x => x.Id); foreach (var productSource in product.Sources) { productSource.Product = product; - productSource.Agent = _agentRepo.FindByKey(productSource.AgentKey).NotNull(); + productSource.Agent = (await _agentRepo.FindByKeyAsync(productSource.AgentKey)).NotNull(); } foreach (var productPrice in product.Recent) { diff --git a/PriceChecker.Core/Services/ProductPriceManager.cs b/PriceChecker.Core/Services/ProductPriceManager.cs index 1de6705..5c0a67a 100644 --- a/PriceChecker.Core/Services/ProductPriceManager.cs +++ b/PriceChecker.Core/Services/ProductPriceManager.cs @@ -155,7 +155,7 @@ private async Task ScanForPricesAsync(Product product, bool ignoreRecentDate, Ca } product.Lowest = lowest; - _productRepo.Store(product); + await _productRepo.StoreAsync(product); _eventBus.Publish(new ProductScannedEvent(product.Id, status)); } diff --git a/PriceChecker.UI.Tests/ViewModels/MainViewModelTests.cs b/PriceChecker.UI.Tests/ViewModels/MainViewModelTests.cs index 057cf26..f3c9778 100644 --- a/PriceChecker.UI.Tests/ViewModels/MainViewModelTests.cs +++ b/PriceChecker.UI.Tests/ViewModels/MainViewModelTests.cs @@ -2,6 +2,7 @@ using System.Windows.Shell; using Genius.Atom.UI.Forms; using Genius.Atom.UI.Forms.TestingUtil; +using Genius.Atom.UI.Forms.ViewModels; using Genius.PriceChecker.UI.Helpers; using Genius.PriceChecker.UI.ViewModels; @@ -12,7 +13,7 @@ public class MainViewModelTests : TestBase private readonly TabMock _trackerMock = new(); private readonly TabMock _agentsMock = new(); private readonly TabMock _settingsMock = new(); - private readonly TabMock _logsMock = new(); + private readonly TabMock _logsMock = new(); private readonly Mock _scanContextMock = new(); private readonly Mock _notifyViewModelMock = new(); diff --git a/PriceChecker.UI/App.xaml b/PriceChecker.UI/App.xaml index 85afb9c..b0e2a8c 100644 --- a/PriceChecker.UI/App.xaml +++ b/PriceChecker.UI/App.xaml @@ -19,21 +19,10 @@ - - - - - - - - - - - + - diff --git a/PriceChecker.UI/App.xaml.cs b/PriceChecker.UI/App.xaml.cs index 714098f..c29adc8 100644 --- a/PriceChecker.UI/App.xaml.cs +++ b/PriceChecker.UI/App.xaml.cs @@ -1,7 +1,7 @@ -global using Genius.Atom.Infrastructure; +global using System.Windows; +global using Genius.Atom.Infrastructure; using System.Diagnostics.CodeAnalysis; -using System.Windows; using Genius.PriceChecker.Core.Services; using Genius.PriceChecker.UI.Helpers; using Genius.PriceChecker.UI.ViewModels; @@ -67,7 +67,6 @@ private static void ConfigureServices(IServiceCollection services) services.AddTransient(); services.AddTransient(); services.AddTransient(); - services.AddTransient(); // Services and Helpers: services.AddTransient(); diff --git a/PriceChecker.UI/Assets/Alert32.png b/PriceChecker.UI/Assets/Alert32.png deleted file mode 100644 index 4268fb07ed9b1f4dfed59938a74fc8fbeeacb492..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1849 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 LNkvXXu0mjfUsg4S diff --git a/PriceChecker.UI/Assets/Error16.png b/PriceChecker.UI/Assets/Error16.png deleted file mode 100644 index 9764037d76292503de309f2dc64754d7e8b1d7b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 857 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 diff --git a/PriceChecker.UI/Assets/Outdated16.png b/PriceChecker.UI/Assets/Outdated16.png deleted file mode 100644 index 0d60a6e4eace04fbe91ea6648236f1e166c235fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 595 zcmV-Z0<8UsP)LQ%z_SVGw=u?N8XyO@sJ@5Quot){7VMo)(mf_E=Dl z5;WN~X^PUL#+z73&1$RAg9mS3Y_V7nQ45~+R>jh!CL$9D=tjZj{btdVG`g>w%2N@mJOu!U(mw~x z)aFS5&>r$Ly~G7Sf@br3qr|a*0wW4W6aaqBAO5?$aQq7ZFk_Jk;~g{Lv+738@_y^m zAfflV3T^)IHzf90Ghvk?W7*Z+7O74I^JQ%uIO*0EjR_jAdV-)xazWBjLh! zl3ZFd9T`}o>Bu;_v=+XzeFH$ErQm)SA@qPR=*4zBT&P=qQ>rp;rYh6k+qhfL>P6WO z6?x3Vx^6)!$}yoTa{xXt;b~~2c1gH!8z*8b#JCC|AtZ9mJiY2G006khrf%RS6UIA^ hX`L9${f=qh^&j6E%tcq2^lShC002ovPDHLkV1mLV2nPTF diff --git a/PriceChecker.UI/Assets/Plus16.png b/PriceChecker.UI/Assets/Plus16.png deleted file mode 100644 index 72036e93970e6a933a122248fd35e561dcb87c98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 545 zcmV++0^a?JP)LQ#(ssK^Q&X%-;2}SO^+K zFbLwSFpu3-7U^tklq_NziNPkF#7CtN3yWBY5HVd)%Yd@Dg}*^jEE3W9C{ij(6cVnx zd*{x47R#O8o4wg4rx=*?ojK<)!vOyYiXtEHPd+h13=^RX#xMk(8#0;W)Q2xs4N`|w zO`g`9B*kE49COxJ^!lWK<)*?QbvV_e*gpcvwrZ6P^LMJLO@4j!{uTg4Fvu&l{rBN_ z4@NNGoDLZXqITqRpY0w1l6%uB>BOE_H1-YHHx(^Nih;g^w|&;YQ-zsowWGkEng)Ov z0I;BBFj#0AwW8j5YmuudaSK&g)&7z|(R;QB_<*T+kq=vOw^RZf?bQ3%Ww}52!x{byx7# zYz6>yXD8<3&51>Fq!sGld4K@fV6O=5X?Q=}nX{o!%OL|Ws4F}E(P>P)k@fM&WbJy; zw|A@GhSn!R;IKi^B=agwQZ9)^yn|u_1cFf-%2gMn_3ZhJjh%9RU7lvlkq}8_-7Lshy*u;Q! z#?q$76Axzpo3*-eQ}?uzqOPe$MXeL_^Yg0`yd0hFxzX*g!UT4XRvbB%fm1aMCA0qg z`^^HT|NpQci{HKadhf*g=V@~$tvCp?#|9G^nQ7Z9Y6&O({QH9iNdKer-+zB&VHf(X zY8oN1IW9Ha6cGX>$SXC;qFw!9@Bg%5&;mRjvEh#-dKHh2`o*rt!VFCKB%j1spACCIhbs*$_!)E`F zE-o&jI1@8EAxtAZKQ;haEj}$=FSRr*Ex9B#J*g--#mUKu53ZS!7h^DYRqN2KmCZvl zR@4tAro<{ETke{j-y9Ves)W7TgDh!VqgVT3DEI)=!SSE+EdK2Fxy2PyzxeD5pq z`JG-gV5>N?eQ&gMYBU-ZEpVJG0q-EJ@U3WLT39@PEf?^kM69;$j$*eGW;tk3R8<8I zVgSrwp&~AU=B&wk`Vi~zNs|J&C8ES4?k`{03E-3d#AcAs!~kxB2B>R6!7!per&k0B zFH-?>ARtxnO@J2|98|c`8+atL@9O}Q`3jMyyD}&Qi(7m!g6Q48C-VX64Kye>X>(C# zUX9egRz$A{E11nTssYPwhfLz8=yNnauaHaJPB0%(S*!X~EN!Vl)C6Wg(&QUO{0_d? px4=nddcEFaI{zCRkH-ZSe*g${nJu`zzY_oe002ovPDHLkV1i|%{nh{g diff --git a/PriceChecker.UI/Assets/Unknown16.png b/PriceChecker.UI/Assets/Unknown16.png deleted file mode 100644 index eecc8b7f6021cc8ef62cb9f74022c8b14c1528bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 357 zcmV-r0h<1aP)5(;-d+K^O(#uiMSmp(;R-vcLJ%{B&2%=TFWF@0z4y=TzyF(-WejkDHs+Bl@r7GFWokeN z6P%#R=vCCl(YsW9fnL+@HT0sl1Fc9-aE+Im@e~{J{S}wVCdU}Hg`U^&P&4e|9aoX> zVhhhv|G+k8i__Ddk7{2B1xAUd!nhRv_AC)^lJzbg6K;mG@HeU^ba9CLj5aU+DTXtg z<2xr7LP(m>!y7&u^s*2VmJ5z}>Rp3YiR}-BgsqApb_yZeoAN2_#wSG|>zFQxRifOF z-leuX!bKV8#K;YWiTvuVjB$W{VLJ8eJQuF>v~KOJ}N2tWYjvX(+$|KZD>?|rlEJUkz`iEvZ)9Fm_9rxTsV`x>} zQ25;r-pf($kpD4G}OvKF|W>5^>)5+ zyJG2j*s#og&2wcyY_75P=LvEb)46ITseP>_2FrPU{Xy?K!Bb|&U^J@5;x=p@I0DpI z!(P__*NLUQMjRyBfuR8=K#eu*{Th%xUp8E~N264N2w^ZW>IqO|&Evfr?&%od)JfW> zGSDUg@FOs#*9EAt#(1yJJ#7Or$E!xO8P+I^LX$?pu@zXDe;1&plm{>Z=*gU{8b1Oo z+fNe`6Go&`9s!lj2~cAwf*#xQ(}94~y%i%Ik~HuoF)AWU4s7n%1gJmj=m~M}8Goh~ zVDUs%>EmyXw&;nQt?xwrIT@lVs+d?@q{HpSon%ru8Xrprjz`n)0{iFuY;a#FL#bTb zC2v)lvTPFyFJ{1SdDZ*v#PdIHtn0B9UgZ==-B_Dka$Fkk_LoW|+>l7by)RU<*{9;` bhX4Zrr!VB+U~9Va00000NkvXXu0mjfwxjed diff --git a/PriceChecker.UI/Assets/Web16.png b/PriceChecker.UI/Assets/Web16.png deleted file mode 100644 index 8dd40774a84e2bc6c9ae0264544f35ec174fe987..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 642 zcmV-|0)737P)K(S+iYX}L^t&f8sQ3nY+bP*~#=o$z{S(268 zAzh(x)qSr+X=`crjx)o&nGyc;3T`~l+u%8Mxa`1@!2HRlOI1U%s@h!&yI<`Sw|YUM z2oW=DQq?5xeGacd>Lp0G|78%44etf%71;GBXV{#g-PtpFofEuYjO1@VzQQ2fHPj-m zcfmrauAUBXXV9{O#?XQ_1WRDFD_(6b_fdc3!gfIdAPGL`NKzoWq!pn=7rh3gUzg*F zUr_OOH$SRqmf-`b)I#Z0Th*aN+s@;jd1fx99q)2d`Lp9>jD*`;M{cicAd(KH@{=tf(M;S$a}vd4*J)`1 - Clipboard.SetText(Message)); - } - - [IconSource(nameof(SeverityIcon), 16d)] - public LogLevel Severity { get; set; } - public string Logger { get; set; } = string.Empty; - public string Message { get; set; } = string.Empty; - - [Browsable(false)] - public BitmapImage? SeverityIcon - { - get - { - var icon = Severity switch - { - LogLevel.Warning => "Warning16", - LogLevel.Error => "Error16", - LogLevel.Critical => "Alert32", - {} => null - }; - if (icon is null) - return null; - return (BitmapImage)App.Current.FindResource(icon); - } - } - - [Browsable(false)] - public bool IsSeverityCritical => Severity == LogLevel.Critical; - - [Icon("Copy16")] - public IActionCommand CopyToClipboardCommand { get; } -} diff --git a/PriceChecker.UI/ViewModels/LogsViewModel.cs b/PriceChecker.UI/ViewModels/LogsViewModel.cs deleted file mode 100644 index 16b3f70..0000000 --- a/PriceChecker.UI/ViewModels/LogsViewModel.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System.Collections.ObjectModel; -using System.Linq; -using System.Windows; -using Genius.Atom.Infrastructure.Events; -using Genius.Atom.Infrastructure.Logging; -using Genius.Atom.UI.Forms; -using Microsoft.Extensions.Logging; - -namespace Genius.PriceChecker.UI.ViewModels; - -public interface ILogsViewModel : ITabViewModel -{ -} - -internal sealed class LogsViewModel : TabViewModelBase, ILogsViewModel -{ - public LogsViewModel(IEventBus eventBus) - { - eventBus.WhenFired() - .Subscribe(x => { - Application.Current.Dispatcher.Invoke(() => - LogItems.Add(new LogItemViewModel { Severity = x.Severity, Logger = x.Logger, Message = x.Message }) - ); - }); - - CleanLogCommand = new ActionCommand(_ => LogItems.Clear()); - - LogItems.CollectionChanged += (_, args) => { - if (HasNewErrors) - return; - HasNewErrors = args.NewItems?.Cast() - .Any(x => x.Severity >= LogLevel.Error) ?? false; - }; - - Activated.Executed.Subscribe(_ => HasNewErrors = false); - Deactivated.Executed.Subscribe(_ => HasNewErrors = false); - } - - public ObservableCollection LogItems { get; } - = new TypedObservableList(); - - public bool HasNewErrors - { - get => GetOrDefault(false); - set => RaiseAndSetIfChanged(value); - } - - public IActionCommand CleanLogCommand { get; } -} diff --git a/PriceChecker.UI/ViewModels/MainViewModel.cs b/PriceChecker.UI/ViewModels/MainViewModel.cs index 9d92a0e..aa15699 100644 --- a/PriceChecker.UI/ViewModels/MainViewModel.cs +++ b/PriceChecker.UI/ViewModels/MainViewModel.cs @@ -1,6 +1,6 @@ -using System.Collections.Generic; using System.Windows.Shell; using Genius.Atom.UI.Forms; +using Genius.Atom.UI.Forms.ViewModels; using Genius.PriceChecker.UI.Helpers; using Hardcodet.Wpf.TaskbarNotification; @@ -19,7 +19,7 @@ public MainViewModel( ITrackerViewModel tracker, IAgentsViewModel agents, ISettingsViewModel settings, - ILogsViewModel logs, + ILogsTabViewModel logs, ITrackerScanContext scanContext, INotifyIconViewModel notifyViewModel) { diff --git a/PriceChecker.UI/ViewModels/TrackerProductSourceViewModel.cs b/PriceChecker.UI/ViewModels/TrackerProductSourceViewModel.cs index cad9e75..ee632d3 100644 --- a/PriceChecker.UI/ViewModels/TrackerProductSourceViewModel.cs +++ b/PriceChecker.UI/ViewModels/TrackerProductSourceViewModel.cs @@ -1,6 +1,5 @@ using System.ComponentModel; using System.ComponentModel.DataAnnotations; -using System.Windows; using System.Windows.Media.Imaging; using Genius.Atom.UI.Forms; using Genius.PriceChecker.Core.Models; @@ -19,8 +18,8 @@ public TrackerProductSourceViewModel(IProductInteraction productInteraction, Pro LastPrice = lastPrice; }); - ShowInBrowserCommand = new ActionCommand(_ => - productInteraction.ShowProductInBrowser(productSource)); + ShowInBrowserCommand = new ActionCommand(async _ => + await productInteraction.ShowProductInBrowserAsync(productSource)); } [Browsable(false)] diff --git a/PriceChecker.UI/ViewModels/TrackerProductViewModel.cs b/PriceChecker.UI/ViewModels/TrackerProductViewModel.cs index ca6f07d..a1a8fcb 100644 --- a/PriceChecker.UI/ViewModels/TrackerProductViewModel.cs +++ b/PriceChecker.UI/ViewModels/TrackerProductViewModel.cs @@ -73,8 +73,8 @@ public TrackerProductViewModel(Product? product, IEventBus eventBus, CommitProductCommand = new ActionCommand(_ => CommitProduct()); - ShowInBrowserCommand = new ActionCommand(_ => - productInteraction.ShowProductInBrowser(_product?.Lowest?.ProductSource)); + ShowInBrowserCommand = new ActionCommand(async _ => + await productInteraction.ShowProductInBrowserAsync(_product?.Lowest?.ProductSource)); AddSourceCommand = new ActionCommand(_ => Sources.Add(CreateSourceViewModel(null))); diff --git a/PriceChecker.UI/Views/Logs.xaml b/PriceChecker.UI/Views/Logs.xaml deleted file mode 100644 index 75af4ce..0000000 --- a/PriceChecker.UI/Views/Logs.xaml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - -