From 9ea22978dfd217ec0d2b1d178820d66dad0d89da Mon Sep 17 00:00:00 2001 From: thangchung Date: Sun, 12 Mar 2017 12:24:39 +0700 Subject: [PATCH] #7 add Status field --- MagazineWebAkka.sln | 66 +++++++++---------- .../Controllers/CategoryController.cs | 2 +- .../Denomalizer/Messages/CreateNewCategory.cs | 7 +- .../Denomalizer/NoSQLStorage.cs | 2 +- .../Projections/CategoryCreated.cs | 2 +- .../Domain/CategoryState.cs | 3 +- .../Sagas/ReviewCategorySaga.cs | 37 +++++++++++ .../Messages/Category/CreateCategory.cs | 15 ++--- .../Messages/Category/Status.cs | 8 +++ .../Models/Category/CategoryModel.cs | 4 +- .../Queries/CategoryView.cs | 3 +- 11 files changed, 98 insertions(+), 51 deletions(-) create mode 100644 src/Cik.Magazine.CategoryService/Sagas/ReviewCategorySaga.cs create mode 100644 src/Cik.Magazine.Shared/Messages/Category/Status.cs diff --git a/MagazineWebAkka.sln b/MagazineWebAkka.sln index 34762c3..793cec5 100644 --- a/MagazineWebAkka.sln +++ b/MagazineWebAkka.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 -VisualStudioVersion = 15.0.26206.0 +VisualStudioVersion = 15.0.26228.4 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{B10EC218-4988-49EE-982C-8FE265BD1B12}" EndProject @@ -58,16 +58,16 @@ Global GlobalSection(ProjectConfigurationPlatforms) = postSolution {A4E6E67A-66DB-4FE8-B158-58D6B7D7BE5D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A4E6E67A-66DB-4FE8-B158-58D6B7D7BE5D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A4E6E67A-66DB-4FE8-B158-58D6B7D7BE5D}.Debug|x64.ActiveCfg = Debug|x64 - {A4E6E67A-66DB-4FE8-B158-58D6B7D7BE5D}.Debug|x64.Build.0 = Debug|x64 - {A4E6E67A-66DB-4FE8-B158-58D6B7D7BE5D}.Debug|x86.ActiveCfg = Debug|x86 - {A4E6E67A-66DB-4FE8-B158-58D6B7D7BE5D}.Debug|x86.Build.0 = Debug|x86 + {A4E6E67A-66DB-4FE8-B158-58D6B7D7BE5D}.Debug|x64.ActiveCfg = Debug|Any CPU + {A4E6E67A-66DB-4FE8-B158-58D6B7D7BE5D}.Debug|x64.Build.0 = Debug|Any CPU + {A4E6E67A-66DB-4FE8-B158-58D6B7D7BE5D}.Debug|x86.ActiveCfg = Debug|Any CPU + {A4E6E67A-66DB-4FE8-B158-58D6B7D7BE5D}.Debug|x86.Build.0 = Debug|Any CPU {A4E6E67A-66DB-4FE8-B158-58D6B7D7BE5D}.Release|Any CPU.ActiveCfg = Release|Any CPU {A4E6E67A-66DB-4FE8-B158-58D6B7D7BE5D}.Release|Any CPU.Build.0 = Release|Any CPU - {A4E6E67A-66DB-4FE8-B158-58D6B7D7BE5D}.Release|x64.ActiveCfg = Release|x64 - {A4E6E67A-66DB-4FE8-B158-58D6B7D7BE5D}.Release|x64.Build.0 = Release|x64 - {A4E6E67A-66DB-4FE8-B158-58D6B7D7BE5D}.Release|x86.ActiveCfg = Release|x86 - {A4E6E67A-66DB-4FE8-B158-58D6B7D7BE5D}.Release|x86.Build.0 = Release|x86 + {A4E6E67A-66DB-4FE8-B158-58D6B7D7BE5D}.Release|x64.ActiveCfg = Release|Any CPU + {A4E6E67A-66DB-4FE8-B158-58D6B7D7BE5D}.Release|x64.Build.0 = Release|Any CPU + {A4E6E67A-66DB-4FE8-B158-58D6B7D7BE5D}.Release|x86.ActiveCfg = Release|Any CPU + {A4E6E67A-66DB-4FE8-B158-58D6B7D7BE5D}.Release|x86.Build.0 = Release|Any CPU {7281A131-9C43-4A61-9DD2-7F6E05BEF844}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7281A131-9C43-4A61-9DD2-7F6E05BEF844}.Debug|Any CPU.Build.0 = Debug|Any CPU {7281A131-9C43-4A61-9DD2-7F6E05BEF844}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -94,16 +94,16 @@ Global {87BE1ABF-1F59-41AB-A3CB-4B1E7E0B218A}.Release|x86.Build.0 = Release|Any CPU {E2E232F9-5FBC-42A4-BA8E-B0AD87988F3B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E2E232F9-5FBC-42A4-BA8E-B0AD87988F3B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E2E232F9-5FBC-42A4-BA8E-B0AD87988F3B}.Debug|x64.ActiveCfg = Debug|x64 - {E2E232F9-5FBC-42A4-BA8E-B0AD87988F3B}.Debug|x64.Build.0 = Debug|x64 - {E2E232F9-5FBC-42A4-BA8E-B0AD87988F3B}.Debug|x86.ActiveCfg = Debug|x86 - {E2E232F9-5FBC-42A4-BA8E-B0AD87988F3B}.Debug|x86.Build.0 = Debug|x86 + {E2E232F9-5FBC-42A4-BA8E-B0AD87988F3B}.Debug|x64.ActiveCfg = Debug|Any CPU + {E2E232F9-5FBC-42A4-BA8E-B0AD87988F3B}.Debug|x64.Build.0 = Debug|Any CPU + {E2E232F9-5FBC-42A4-BA8E-B0AD87988F3B}.Debug|x86.ActiveCfg = Debug|Any CPU + {E2E232F9-5FBC-42A4-BA8E-B0AD87988F3B}.Debug|x86.Build.0 = Debug|Any CPU {E2E232F9-5FBC-42A4-BA8E-B0AD87988F3B}.Release|Any CPU.ActiveCfg = Release|Any CPU {E2E232F9-5FBC-42A4-BA8E-B0AD87988F3B}.Release|Any CPU.Build.0 = Release|Any CPU - {E2E232F9-5FBC-42A4-BA8E-B0AD87988F3B}.Release|x64.ActiveCfg = Release|x64 - {E2E232F9-5FBC-42A4-BA8E-B0AD87988F3B}.Release|x64.Build.0 = Release|x64 - {E2E232F9-5FBC-42A4-BA8E-B0AD87988F3B}.Release|x86.ActiveCfg = Release|x86 - {E2E232F9-5FBC-42A4-BA8E-B0AD87988F3B}.Release|x86.Build.0 = Release|x86 + {E2E232F9-5FBC-42A4-BA8E-B0AD87988F3B}.Release|x64.ActiveCfg = Release|Any CPU + {E2E232F9-5FBC-42A4-BA8E-B0AD87988F3B}.Release|x64.Build.0 = Release|Any CPU + {E2E232F9-5FBC-42A4-BA8E-B0AD87988F3B}.Release|x86.ActiveCfg = Release|Any CPU + {E2E232F9-5FBC-42A4-BA8E-B0AD87988F3B}.Release|x86.Build.0 = Release|Any CPU {851A58ED-DFBD-430C-99CF-993859997AB2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {851A58ED-DFBD-430C-99CF-993859997AB2}.Debug|Any CPU.Build.0 = Debug|Any CPU {851A58ED-DFBD-430C-99CF-993859997AB2}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -118,28 +118,28 @@ Global {851A58ED-DFBD-430C-99CF-993859997AB2}.Release|x86.Build.0 = Release|Any CPU {87302267-6FBF-4E28-ABC4-2FF832DAC72B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {87302267-6FBF-4E28-ABC4-2FF832DAC72B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {87302267-6FBF-4E28-ABC4-2FF832DAC72B}.Debug|x64.ActiveCfg = Debug|x64 - {87302267-6FBF-4E28-ABC4-2FF832DAC72B}.Debug|x64.Build.0 = Debug|x64 - {87302267-6FBF-4E28-ABC4-2FF832DAC72B}.Debug|x86.ActiveCfg = Debug|x86 - {87302267-6FBF-4E28-ABC4-2FF832DAC72B}.Debug|x86.Build.0 = Debug|x86 + {87302267-6FBF-4E28-ABC4-2FF832DAC72B}.Debug|x64.ActiveCfg = Debug|Any CPU + {87302267-6FBF-4E28-ABC4-2FF832DAC72B}.Debug|x64.Build.0 = Debug|Any CPU + {87302267-6FBF-4E28-ABC4-2FF832DAC72B}.Debug|x86.ActiveCfg = Debug|Any CPU + {87302267-6FBF-4E28-ABC4-2FF832DAC72B}.Debug|x86.Build.0 = Debug|Any CPU {87302267-6FBF-4E28-ABC4-2FF832DAC72B}.Release|Any CPU.ActiveCfg = Release|Any CPU {87302267-6FBF-4E28-ABC4-2FF832DAC72B}.Release|Any CPU.Build.0 = Release|Any CPU - {87302267-6FBF-4E28-ABC4-2FF832DAC72B}.Release|x64.ActiveCfg = Release|x64 - {87302267-6FBF-4E28-ABC4-2FF832DAC72B}.Release|x64.Build.0 = Release|x64 - {87302267-6FBF-4E28-ABC4-2FF832DAC72B}.Release|x86.ActiveCfg = Release|x86 - {87302267-6FBF-4E28-ABC4-2FF832DAC72B}.Release|x86.Build.0 = Release|x86 + {87302267-6FBF-4E28-ABC4-2FF832DAC72B}.Release|x64.ActiveCfg = Release|Any CPU + {87302267-6FBF-4E28-ABC4-2FF832DAC72B}.Release|x64.Build.0 = Release|Any CPU + {87302267-6FBF-4E28-ABC4-2FF832DAC72B}.Release|x86.ActiveCfg = Release|Any CPU + {87302267-6FBF-4E28-ABC4-2FF832DAC72B}.Release|x86.Build.0 = Release|Any CPU {B078ECA6-201B-43B3-B474-E30856D37992}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B078ECA6-201B-43B3-B474-E30856D37992}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B078ECA6-201B-43B3-B474-E30856D37992}.Debug|x64.ActiveCfg = Debug|x64 - {B078ECA6-201B-43B3-B474-E30856D37992}.Debug|x64.Build.0 = Debug|x64 - {B078ECA6-201B-43B3-B474-E30856D37992}.Debug|x86.ActiveCfg = Debug|x86 - {B078ECA6-201B-43B3-B474-E30856D37992}.Debug|x86.Build.0 = Debug|x86 + {B078ECA6-201B-43B3-B474-E30856D37992}.Debug|x64.ActiveCfg = Debug|Any CPU + {B078ECA6-201B-43B3-B474-E30856D37992}.Debug|x64.Build.0 = Debug|Any CPU + {B078ECA6-201B-43B3-B474-E30856D37992}.Debug|x86.ActiveCfg = Debug|Any CPU + {B078ECA6-201B-43B3-B474-E30856D37992}.Debug|x86.Build.0 = Debug|Any CPU {B078ECA6-201B-43B3-B474-E30856D37992}.Release|Any CPU.ActiveCfg = Release|Any CPU {B078ECA6-201B-43B3-B474-E30856D37992}.Release|Any CPU.Build.0 = Release|Any CPU - {B078ECA6-201B-43B3-B474-E30856D37992}.Release|x64.ActiveCfg = Release|x64 - {B078ECA6-201B-43B3-B474-E30856D37992}.Release|x64.Build.0 = Release|x64 - {B078ECA6-201B-43B3-B474-E30856D37992}.Release|x86.ActiveCfg = Release|x86 - {B078ECA6-201B-43B3-B474-E30856D37992}.Release|x86.Build.0 = Release|x86 + {B078ECA6-201B-43B3-B474-E30856D37992}.Release|x64.ActiveCfg = Release|Any CPU + {B078ECA6-201B-43B3-B474-E30856D37992}.Release|x64.Build.0 = Release|Any CPU + {B078ECA6-201B-43B3-B474-E30856D37992}.Release|x86.ActiveCfg = Release|Any CPU + {B078ECA6-201B-43B3-B474-E30856D37992}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/Cik.Magazine.ApiGateway/Controllers/CategoryController.cs b/src/Cik.Magazine.ApiGateway/Controllers/CategoryController.cs index ebfd9e4..e79468f 100644 --- a/src/Cik.Magazine.ApiGateway/Controllers/CategoryController.cs +++ b/src/Cik.Magazine.ApiGateway/Controllers/CategoryController.cs @@ -63,7 +63,7 @@ public async Task GetAsync(Guid id) [HttpPost] public bool PostAsync([FromBody] CategoryModel cat) { - _categoryCommander.Tell(new CreateCategory(Guid.NewGuid(), cat.Name, cat.ParentId)); + _categoryCommander.Tell(new CreateCategory(Guid.NewGuid(), cat.Name, cat.Status)); return true; } diff --git a/src/Cik.Magazine.CategoryService/Denomalizer/Messages/CreateNewCategory.cs b/src/Cik.Magazine.CategoryService/Denomalizer/Messages/CreateNewCategory.cs index 87af69c..17bdd82 100644 --- a/src/Cik.Magazine.CategoryService/Denomalizer/Messages/CreateNewCategory.cs +++ b/src/Cik.Magazine.CategoryService/Denomalizer/Messages/CreateNewCategory.cs @@ -1,21 +1,22 @@ using System; using Cik.Magazine.Shared; +using Cik.Magazine.Shared.Messages.Category; namespace Cik.Magazine.CategoryService.Denomalizer.Messages { public class CreateNewCategory { - public CreateNewCategory(Guid id, string name, Guid parentId) + public CreateNewCategory(Guid id, string name, Status status) { Id = id; Name = name; - ParentId = parentId; + Status = status; Created = SystemClock.UtcNow; } public Guid Id { get; } public string Name { get; } - public Guid ParentId { get; } + public Status Status { get; } public DateTime Created { get; } } } \ No newline at end of file diff --git a/src/Cik.Magazine.CategoryService/Denomalizer/NoSQLStorage.cs b/src/Cik.Magazine.CategoryService/Denomalizer/NoSQLStorage.cs index f5bcce8..8ff5d36 100644 --- a/src/Cik.Magazine.CategoryService/Denomalizer/NoSQLStorage.cs +++ b/src/Cik.Magazine.CategoryService/Denomalizer/NoSQLStorage.cs @@ -38,7 +38,7 @@ public void Handle(CreateNewCategory message) col.InsertOne(new CategoryViewResponse { Name = message.Name, - ParentId = message.ParentId + Status = message.Status }); } diff --git a/src/Cik.Magazine.CategoryService/Denomalizer/Projections/CategoryCreated.cs b/src/Cik.Magazine.CategoryService/Denomalizer/Projections/CategoryCreated.cs index 43f5fb5..6e547e4 100644 --- a/src/Cik.Magazine.CategoryService/Denomalizer/Projections/CategoryCreated.cs +++ b/src/Cik.Magazine.CategoryService/Denomalizer/Projections/CategoryCreated.cs @@ -19,7 +19,7 @@ public CategoryCreated() public void Handle(Shared.Messages.Category.CategoryCreated message) { _log.Info("CategoryCreated is handled."); - _storage.Tell(new CreateNewCategory(message.AggregateId, message.Name, message.ParentId)); + _storage.Tell(new CreateNewCategory(message.AggregateId, message.Name, message.Status)); } } } \ No newline at end of file diff --git a/src/Cik.Magazine.CategoryService/Domain/CategoryState.cs b/src/Cik.Magazine.CategoryService/Domain/CategoryState.cs index 09aa50c..20e607b 100644 --- a/src/Cik.Magazine.CategoryService/Domain/CategoryState.cs +++ b/src/Cik.Magazine.CategoryService/Domain/CategoryState.cs @@ -7,6 +7,7 @@ namespace Cik.Magazine.CategoryService.Domain internal class CategoryState { public string Name { get; private set; } + public Status Status { get; private set; } internal IEventSink EventSink { get; set; } public void Handle(ICommand command) @@ -21,7 +22,7 @@ public void Mutate(IEvent @event) public void Handle(CreateCategory message) { - EventSink.Publish(new CategoryCreated(message.AggregateId, message.Name, message.ParentId)); + EventSink.Publish(new CategoryCreated(message.AggregateId, message.Name, message.Status)); } public void Handle(UpdateCategory message) diff --git a/src/Cik.Magazine.CategoryService/Sagas/ReviewCategorySaga.cs b/src/Cik.Magazine.CategoryService/Sagas/ReviewCategorySaga.cs new file mode 100644 index 0000000..6235341 --- /dev/null +++ b/src/Cik.Magazine.CategoryService/Sagas/ReviewCategorySaga.cs @@ -0,0 +1,37 @@ +using System; +using Akka.Persistence.Fsm; +using Cik.Magazine.Shared; +using Cik.Magazine.Shared.Messages.Category; + +namespace Cik.Magazine.CategoryService.Sagas +{ + public interface IReviewEvent + { + } + + public class RemindAdminReview : IReviewEvent + { + } + + public class ReviewCategorySaga : PersistentFSM + { + private readonly Guid _id; + + public ReviewCategorySaga(Guid id) + { + _id = id; + } + + public override string PersistenceId => $"{GetType().Name}-agg-{_id:n}".ToLowerInvariant(); + + protected override void OnRecoveryCompleted() + { + throw new NotImplementedException(); + } + + protected override Event ApplyEvent(IReviewEvent e, Event data) + { + throw new NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/src/Cik.Magazine.Shared/Messages/Category/CreateCategory.cs b/src/Cik.Magazine.Shared/Messages/Category/CreateCategory.cs index d1c59b1..750fd15 100644 --- a/src/Cik.Magazine.Shared/Messages/Category/CreateCategory.cs +++ b/src/Cik.Magazine.Shared/Messages/Category/CreateCategory.cs @@ -5,34 +5,33 @@ namespace Cik.Magazine.Shared.Messages.Category [Serializable] public class CreateCategory : ICommand { - public CreateCategory(Guid aggregateId, string name, Guid parentId) + public CreateCategory(Guid aggregateId, string name, Status status) { Name = name; - ParentId = parentId; + Status = status; AggregateId = aggregateId; } public string Name { get; } - public Guid ParentId { get; } + public Status Status { get; } public Guid AggregateId { get; } public override string ToString() { - return Name; + return $"{Name} is in {Status} status."; } } public class CategoryCreated : Event { - public CategoryCreated(Guid aggregateId, string name, Guid parentId) + public CategoryCreated(Guid aggregateId, string name, Status status) : base(aggregateId) { Name = name; - ParentId = parentId; + Status = status; } public string Name { get; private set; } - - public Guid ParentId { get; private set; } + public Status Status { get; private set; } } } \ No newline at end of file diff --git a/src/Cik.Magazine.Shared/Messages/Category/Status.cs b/src/Cik.Magazine.Shared/Messages/Category/Status.cs new file mode 100644 index 0000000..d9c65ca --- /dev/null +++ b/src/Cik.Magazine.Shared/Messages/Category/Status.cs @@ -0,0 +1,8 @@ +namespace Cik.Magazine.Shared.Messages.Category +{ + public enum Status + { + Reviewing, + Published + } +} \ No newline at end of file diff --git a/src/Cik.Magazine.Shared/Models/Category/CategoryModel.cs b/src/Cik.Magazine.Shared/Models/Category/CategoryModel.cs index 814f0b0..bdfc71e 100644 --- a/src/Cik.Magazine.Shared/Models/Category/CategoryModel.cs +++ b/src/Cik.Magazine.Shared/Models/Category/CategoryModel.cs @@ -1,5 +1,6 @@ using System; using System.ComponentModel.DataAnnotations; +using Cik.Magazine.Shared.Messages.Category; namespace Cik.Magazine.Shared.Models.Category { @@ -8,7 +9,6 @@ public class CategoryModel { [Required] public string Name { get; set; } - - public Guid ParentId { get; set; } + public Status Status { get; set; } } } \ No newline at end of file diff --git a/src/Cik.Magazine.Shared/Queries/CategoryView.cs b/src/Cik.Magazine.Shared/Queries/CategoryView.cs index c11a284..84432cf 100644 --- a/src/Cik.Magazine.Shared/Queries/CategoryView.cs +++ b/src/Cik.Magazine.Shared/Queries/CategoryView.cs @@ -1,4 +1,5 @@ using System; +using Cik.Magazine.Shared.Messages.Category; using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; @@ -24,6 +25,6 @@ public class CategoryViewResponse public string Name { get; set; } [BsonRepresentation(BsonType.String)] - public Guid ParentId { get; set; } + public Status Status { get; set; } } } \ No newline at end of file