Browse Source

Merge pull request #9838 from abpframework/concurrency-stamps

Concurrency Stamp Implementation to modules
pull/9961/head
Halil İbrahim Kalkan 5 years ago
committed by GitHub
parent
commit
cb46781ab6
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 18
      framework/src/Volo.Abp.Data/Volo/Abp/Data/ConcurrencyStampExtensions.cs
  2. 6
      modules/account/src/Volo.Abp.Account.Web/Pages/Account/Components/ProfileManagementGroup/PersonalInfo/AccountProfilePersonalInfoManagementGroupViewComponent.cs
  3. 2
      modules/account/src/Volo.Abp.Account.Web/Pages/Account/Components/ProfileManagementGroup/PersonalInfo/Default.cshtml
  4. 5
      modules/blogging/src/Volo.Blogging.Admin.Application.Contracts/Volo/Blogging/Admin/Blogs/UpdateBlogDto.cs
  5. 2
      modules/blogging/src/Volo.Blogging.Admin.Application/Volo/Blogging/Admin/Blogs/BlogManagementAppService.cs
  6. 8
      modules/blogging/src/Volo.Blogging.Admin.Web/Pages/Blogging/Admin/Blogs/Edit.cshtml.cs
  7. 5
      modules/blogging/src/Volo.Blogging.Application.Contracts/Volo/Blogging/Comments/Dtos/CommentWithDetailsDto.cs
  8. 4
      modules/blogging/src/Volo.Blogging.Application.Contracts/Volo/Blogging/Comments/Dtos/UpdateCommentDto.cs
  9. 5
      modules/blogging/src/Volo.Blogging.Application.Contracts/Volo/Blogging/Posts/PostWithDetailsDto.cs
  10. 6
      modules/blogging/src/Volo.Blogging.Application.Contracts/Volo/Blogging/Posts/UpdatePostDto.cs
  11. 2
      modules/blogging/src/Volo.Blogging.Application/Volo/Blogging/Comments/CommentAppService.cs
  12. 2
      modules/blogging/src/Volo.Blogging.Application/Volo/Blogging/Posts/PostAppService.cs
  13. 3
      modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/Detail.cshtml
  14. 3
      modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/Edit.cshtml
  15. 7
      modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/Edit.cshtml.cs
  16. 3
      modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/detail.js
  17. 2036
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210817095158_ConcurrencyStampUpdate.Designer.cs
  18. 24
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210817095158_ConcurrencyStampUpdate.cs
  19. 8
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs
  20. 4
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogDto.cs
  21. 5
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogPostDto.cs
  22. 5
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/UpdateBlogDto.cs
  23. 5
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/UpdateBlogPostDto.cs
  24. 5
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Menus/MenuItemUpdateInput.cs
  25. 5
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/PageDto.cs
  26. 7
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/UpdatePageInputDto.cs
  27. 5
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Tags/TagUpdateDto.cs
  28. 3
      modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogAdminAppService.cs
  29. 3
      modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs
  30. 2
      modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Menus/MenuItemAdminAppService.cs
  31. 2
      modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Pages/PageAdminAppService.cs
  32. 3
      modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Tags/TagAdminAppService.cs
  33. 5
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Update.cshtml.cs
  34. 6
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Blogs/UpdateModal.cshtml.cs
  35. 1
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/MenuItems/UpdateModal.cshtml
  36. 6
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/MenuItems/UpdateModal.cshtml.cs
  37. 2
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/Update.cshtml
  38. 6
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/Update.cshtml.cs
  39. 6
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Tags/EditModal.cshtml.cs
  40. 15
      modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Menus/MenuItemDto.cs
  41. 5
      modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Tags/TagDto.cs
  42. 2
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Comments/Comment.cs
  43. 10
      modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Comments/MongoCommentRepository.cs
  44. 5
      modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CommentDto.cs
  45. 5
      modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CommentWithDetailsDto.cs
  46. 5
      modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/UpdateCommentInput.cs
  47. 2
      modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Comments/CommentPublicAppService.cs
  48. 7
      modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/Default.cshtml
  49. 3
      modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/default.js
  50. 6
      modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Projects/ProjectDto.cs
  51. 6
      modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Projects/UpdateProjectDto.cs
  52. 2
      modules/docs/src/Volo.Docs.Admin.Application/Volo/Docs/Admin/Projects/ProjectAdminAppService.cs
  53. 7
      modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/Edit.cshtml.cs
  54. 7
      modules/identity/src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/ProfileDto.cs
  55. 3
      modules/identity/src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/UpdateProfileDto.cs
  56. 6
      modules/identity/src/Volo.Abp.Identity.Application/Volo/Abp/Identity/IdentityRoleAppService.cs
  57. 4
      modules/identity/src/Volo.Abp.Identity.Application/Volo/Abp/Identity/IdentityUserAppService.cs
  58. 3
      modules/identity/src/Volo.Abp.Identity.Application/Volo/Abp/Identity/ProfileAppService.cs
  59. 9
      modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityClaimType.cs
  60. 5
      modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/TenantDto.cs
  61. 8
      modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/TenantUpdateDto.cs
  62. 5
      modules/tenant-management/src/Volo.Abp.TenantManagement.Application/Volo/Abp/TenantManagement/TenantAppService.cs
  63. 1
      modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/EditModal.cshtml
  64. 6
      modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/EditModal.cshtml.cs

18
framework/src/Volo.Abp.Data/Volo/Abp/Data/ConcurrencyStampExtensions.cs

@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using Volo.Abp.Domain.Entities;
using JetBrains.Annotations;
namespace Volo.Abp.Data
{
public static class ConcurrencyStampExtensions
{
public static void SetConcurrencyStampIfNotNull(this IHasConcurrencyStamp entity, [CanBeNull] string concurrencyStamp)
{
if (!concurrencyStamp.IsNullOrEmpty())
{
entity.ConcurrencyStamp = concurrencyStamp;
}
}
}
}

6
modules/account/src/Volo.Abp.Account.Web/Pages/Account/Components/ProfileManagementGroup/PersonalInfo/AccountProfilePersonalInfoManagementGroupViewComponent.cs

@ -2,6 +2,7 @@
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Volo.Abp.AspNetCore.Mvc; using Volo.Abp.AspNetCore.Mvc;
using Volo.Abp.Domain.Entities;
using Volo.Abp.Identity; using Volo.Abp.Identity;
using Volo.Abp.Validation; using Volo.Abp.Validation;
@ -28,7 +29,7 @@ namespace Volo.Abp.Account.Web.Pages.Account.Components.ProfileManagementGroup.P
return View("~/Pages/Account/Components/ProfileManagementGroup/PersonalInfo/Default.cshtml", model); return View("~/Pages/Account/Components/ProfileManagementGroup/PersonalInfo/Default.cshtml", model);
} }
public class PersonalInfoModel public class PersonalInfoModel : IHasConcurrencyStamp
{ {
[Required] [Required]
[DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxUserNameLength))] [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxUserNameLength))]
@ -51,6 +52,9 @@ namespace Volo.Abp.Account.Web.Pages.Account.Components.ProfileManagementGroup.P
[DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxPhoneNumberLength))] [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxPhoneNumberLength))]
[Display(Name = "DisplayName:PhoneNumber")] [Display(Name = "DisplayName:PhoneNumber")]
public string PhoneNumber { get; set; } public string PhoneNumber { get; set; }
[HiddenInput]
public string ConcurrencyStamp { get; set; }
} }
} }
} }

2
modules/account/src/Volo.Abp.Account.Web/Pages/Account/Components/ProfileManagementGroup/PersonalInfo/Default.cshtml

@ -19,6 +19,8 @@
<h4>@L["PersonalSettings"]</h4><hr/> <h4>@L["PersonalSettings"]</h4><hr/>
<form method="post" id="PersonalSettingsForm"> <form method="post" id="PersonalSettingsForm">
<abp-input asp-for="ConcurrencyStamp" />
<abp-input asp-for="UserName" readonly="!isUserNameUpdateEnabled"/> <abp-input asp-for="UserName" readonly="!isUserNameUpdateEnabled"/>

5
modules/blogging/src/Volo.Blogging.Admin.Application.Contracts/Volo/Blogging/Admin/Blogs/UpdateBlogDto.cs

@ -1,8 +1,9 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Volo.Abp.Domain.Entities;
namespace Volo.Blogging.Admin.Blogs namespace Volo.Blogging.Admin.Blogs
{ {
public class UpdateBlogDto public class UpdateBlogDto : IHasConcurrencyStamp
{ {
[Required] [Required]
public string Name { get; set; } public string Name { get; set; }
@ -11,5 +12,7 @@ namespace Volo.Blogging.Admin.Blogs
public string ShortName { get; set; } public string ShortName { get; set; }
public string Description { get; set; } public string Description { get; set; }
public string ConcurrencyStamp { get; set; }
} }
} }

2
modules/blogging/src/Volo.Blogging.Admin.Application/Volo/Blogging/Admin/Blogs/BlogManagementAppService.cs

@ -4,6 +4,7 @@ using System.Collections.Generic;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Dtos;
using Volo.Abp.Caching; using Volo.Abp.Caching;
using Volo.Abp.Data;
using Volo.Blogging.Blogs; using Volo.Blogging.Blogs;
using Volo.Blogging.Blogs.Dtos; using Volo.Blogging.Blogs.Dtos;
using Volo.Blogging.Posts; using Volo.Blogging.Posts;
@ -58,6 +59,7 @@ namespace Volo.Blogging.Admin.Blogs
blog.SetName(input.Name); blog.SetName(input.Name);
blog.SetShortName(input.ShortName); blog.SetShortName(input.ShortName);
blog.Description = input.Description; blog.Description = input.Description;
blog.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp);
return ObjectMapper.Map<Blog, BlogDto>(blog); return ObjectMapper.Map<Blog, BlogDto>(blog);
} }

8
modules/blogging/src/Volo.Blogging.Admin.Web/Pages/Blogging/Admin/Blogs/Edit.cshtml.cs

@ -3,6 +3,7 @@ using System.ComponentModel.DataAnnotations;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Volo.Abp.Domain.Entities;
using Volo.Abp.Validation; using Volo.Abp.Validation;
using Volo.Blogging.Admin.Blogs; using Volo.Blogging.Admin.Blogs;
using Volo.Blogging.Blogs; using Volo.Blogging.Blogs;
@ -53,7 +54,7 @@ namespace Volo.Blogging.Admin.Pages.Blogging.Admin.Blogs
return Page(); return Page();
} }
public class BlogEditViewModel public class BlogEditViewModel : IHasConcurrencyStamp
{ {
[HiddenInput] [HiddenInput]
[Required] [Required]
@ -69,8 +70,9 @@ namespace Volo.Blogging.Admin.Pages.Blogging.Admin.Blogs
[DynamicStringLength(typeof(BlogConsts), nameof(BlogConsts.MaxDescriptionLength))] [DynamicStringLength(typeof(BlogConsts), nameof(BlogConsts.MaxDescriptionLength))]
public string Description { get; set; } public string Description { get; set; }
[HiddenInput]
public string ConcurrencyStamp { get; set; }
} }
} }
} }

5
modules/blogging/src/Volo.Blogging.Application.Contracts/Volo/Blogging/Comments/Dtos/CommentWithDetailsDto.cs

@ -1,15 +1,18 @@
using System; using System;
using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Dtos;
using Volo.Abp.Domain.Entities;
using Volo.Blogging.Posts; using Volo.Blogging.Posts;
namespace Volo.Blogging.Comments.Dtos namespace Volo.Blogging.Comments.Dtos
{ {
public class CommentWithDetailsDto : FullAuditedEntityDto<Guid> public class CommentWithDetailsDto : FullAuditedEntityDto<Guid>, IHasConcurrencyStamp
{ {
public Guid? RepliedCommentId { get; set; } public Guid? RepliedCommentId { get; set; }
public string Text { get; set; } public string Text { get; set; }
public BlogUserDto Writer { get; set; } public BlogUserDto Writer { get; set; }
public string ConcurrencyStamp { get; set; }
} }
} }

4
modules/blogging/src/Volo.Blogging.Application.Contracts/Volo/Blogging/Comments/Dtos/UpdateCommentDto.cs

@ -1,10 +1,12 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Volo.Abp.Domain.Entities;
namespace Volo.Blogging.Comments.Dtos namespace Volo.Blogging.Comments.Dtos
{ {
public class UpdateCommentDto public class UpdateCommentDto : IHasConcurrencyStamp
{ {
[Required] [Required]
public string Text { get; set; } public string Text { get; set; }
public string ConcurrencyStamp { get; set; }
} }
} }

5
modules/blogging/src/Volo.Blogging.Application.Contracts/Volo/Blogging/Posts/PostWithDetailsDto.cs

@ -2,11 +2,12 @@
using System.Collections.Generic; using System.Collections.Generic;
using JetBrains.Annotations; using JetBrains.Annotations;
using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Dtos;
using Volo.Abp.Domain.Entities;
using Volo.Blogging.Tagging.Dtos; using Volo.Blogging.Tagging.Dtos;
namespace Volo.Blogging.Posts namespace Volo.Blogging.Posts
{ {
public class PostWithDetailsDto : FullAuditedEntityDto<Guid> public class PostWithDetailsDto : FullAuditedEntityDto<Guid>, IHasConcurrencyStamp
{ {
public Guid BlogId { get; set; } public Guid BlogId { get; set; }
@ -28,5 +29,7 @@ namespace Volo.Blogging.Posts
public BlogUserDto Writer { get; set; } public BlogUserDto Writer { get; set; }
public List<TagDto> Tags { get; set; } public List<TagDto> Tags { get; set; }
public string ConcurrencyStamp { get; set; }
} }
} }

6
modules/blogging/src/Volo.Blogging.Application.Contracts/Volo/Blogging/Posts/UpdatePostDto.cs

@ -1,10 +1,10 @@
using System; using System;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.Reflection; using Volo.Abp.Domain.Entities;
namespace Volo.Blogging.Posts namespace Volo.Blogging.Posts
{ {
public class UpdatePostDto public class UpdatePostDto : IHasConcurrencyStamp
{ {
public Guid BlogId { get; set; } public Guid BlogId { get; set; }
@ -23,5 +23,7 @@ namespace Volo.Blogging.Posts
public string Description { get; set; } public string Description { get; set; }
public string Tags { get; set; } public string Tags { get; set; }
public string ConcurrencyStamp { get; set; }
} }
} }

2
modules/blogging/src/Volo.Blogging.Application/Volo/Blogging/Comments/CommentAppService.cs

@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Volo.Abp.Data;
using Volo.Abp.Guids; using Volo.Abp.Guids;
using Volo.Blogging.Comments.Dtos; using Volo.Blogging.Comments.Dtos;
using Volo.Blogging.Posts; using Volo.Blogging.Posts;
@ -99,6 +100,7 @@ namespace Volo.Blogging.Comments
await AuthorizationService.CheckAsync(comment, CommonOperations.Update); await AuthorizationService.CheckAsync(comment, CommonOperations.Update);
comment.SetText(input.Text); comment.SetText(input.Text);
comment.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp);
comment = await _commentRepository.UpdateAsync(comment); comment = await _commentRepository.UpdateAsync(comment);

2
modules/blogging/src/Volo.Blogging.Application/Volo/Blogging/Posts/PostAppService.cs

@ -11,6 +11,7 @@ using Volo.Blogging.Comments;
using Volo.Blogging.Tagging; using Volo.Blogging.Tagging;
using Volo.Blogging.Tagging.Dtos; using Volo.Blogging.Tagging.Dtos;
using Volo.Blogging.Users; using Volo.Blogging.Users;
using Volo.Abp.Data;
namespace Volo.Blogging.Posts namespace Volo.Blogging.Posts
{ {
@ -173,6 +174,7 @@ namespace Volo.Blogging.Posts
post.SetTitle(input.Title); post.SetTitle(input.Title);
post.SetUrl(input.Url); post.SetUrl(input.Url);
post.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp);
post.Content = input.Content; post.Content = input.Content;
post.Description = input.Description; post.Description = input.Description;
post.CoverImage = input.CoverImage; post.CoverImage = input.CoverImage;

3
modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/Detail.cshtml

@ -210,7 +210,7 @@
</h3> </h3>
<div> <div>
<form method="post"> <form method="post">
<input name="postId" value="@Model.Post.Id" hidden /> <input name="postId" value="@Model.Post.Id" type="hidden" />
<input name="repliedCommentId" value="@commentWithRepliesDto.Comment.Id" hidden /> <input name="repliedCommentId" value="@commentWithRepliesDto.Comment.Id" hidden />
<div class="form-group"> <div class="form-group">
@ -230,6 +230,7 @@
<div> <div>
<form class="editFormClass"> <form class="editFormClass">
<input name="commentId" value="@commentWithRepliesDto.Comment.Id" hidden /> <input name="commentId" value="@commentWithRepliesDto.Comment.Id" hidden />
<input name="concurrencyStamp" value="@commentWithRepliesDto.Comment.ConcurrencyStamp" hidden />
<div class="form-group"> <div class="form-group">
<textarea class="form-control" name="text" id="textBoxId" rows="4">@commentWithRepliesDto.Comment.Text</textarea> <textarea class="form-control" name="text" id="textBoxId" rows="4">@commentWithRepliesDto.Comment.Text</textarea>
</div> </div>

3
modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/Edit.cshtml

@ -28,6 +28,9 @@
<div class="card"> <div class="card">
<div class="card-body"> <div class="card-body">
<form method="post" id="edit-post-form"> <form method="post" id="edit-post-form">
<abp-input asp-for="Post.ConcurrencyStamp" />
<abp-input asp-for="Post.Title" auto-focus="true" /> <abp-input asp-for="Post.Title" auto-focus="true" />
<abp-alert <abp-alert

7
modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/Edit.cshtml.cs

@ -6,6 +6,7 @@ using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; using Volo.Abp.AspNetCore.Mvc.UI.RazorPages;
using Volo.Abp.Domain.Entities;
using Volo.Abp.Validation; using Volo.Abp.Validation;
using Volo.Blogging.Blogs; using Volo.Blogging.Blogs;
using Volo.Blogging.Pages.Blogs.Shared.Helpers; using Volo.Blogging.Pages.Blogs.Shared.Helpers;
@ -75,7 +76,8 @@ namespace Volo.Blogging.Pages.Blog.Posts
} }
} }
public class EditPostViewModel public class EditPostViewModel : IHasConcurrencyStamp
{ {
[Required] [Required]
[HiddenInput] [HiddenInput]
@ -106,5 +108,8 @@ namespace Volo.Blogging.Pages.Blog.Posts
public string Description { get; set; } public string Description { get; set; }
public string Tags { get; set; } public string Tags { get; set; }
[HiddenInput]
public string ConcurrencyStamp { get; set; }
} }
} }

3
modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/detail.js

@ -60,11 +60,14 @@
id: form.commentId, id: form.commentId,
commentDto: { commentDto: {
text: form.text, text: form.text,
// TODO: Implement concurrencyStamp here:
//concurrencyStamp: form.concurrencyStamp
}, },
}, },
success: function (response) { success: function (response) {
$('div .editForm').hide(); $('div .editForm').hide();
$('#' + form.commentId).text(form.text); $('#' + form.commentId).text(form.text);
//$(this).find('[name=concurrencyStamp]').val(response.concurrencyStamp);
}, },
}); });
}); });

2036
modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210817095158_ConcurrencyStampUpdate.Designer.cs

File diff suppressed because it is too large

24
modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210817095158_ConcurrencyStampUpdate.cs

@ -0,0 +1,24 @@
using Microsoft.EntityFrameworkCore.Migrations;
namespace Volo.CmsKit.Migrations
{
public partial class ConcurrencyStampUpdate : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<string>(
name: "ConcurrencyStamp",
table: "CmsComments",
type: "nvarchar(40)",
maxLength: 40,
nullable: true);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "ConcurrencyStamp",
table: "CmsComments");
}
}
}

8
modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs

@ -18,7 +18,7 @@ namespace Volo.CmsKit.Migrations
modelBuilder modelBuilder
.HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer)
.HasAnnotation("Relational:MaxIdentifierLength", 128) .HasAnnotation("Relational:MaxIdentifierLength", 128)
.HasAnnotation("ProductVersion", "5.0.7") .HasAnnotation("ProductVersion", "5.0.9")
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b =>
@ -1341,6 +1341,12 @@ namespace Volo.CmsKit.Migrations
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnType("uniqueidentifier"); .HasColumnType("uniqueidentifier");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasMaxLength(40)
.HasColumnType("nvarchar(40)")
.HasColumnName("ConcurrencyStamp");
b.Property<DateTime>("CreationTime") b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2") .HasColumnType("datetime2")
.HasColumnName("CreationTime"); .HasColumnName("CreationTime");

4
modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogDto.cs

@ -1,13 +1,15 @@
using System; using System;
using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Dtos;
using Volo.Abp.Domain.Entities;
namespace Volo.CmsKit.Admin.Blogs namespace Volo.CmsKit.Admin.Blogs
{ {
[Serializable] [Serializable]
public class BlogDto : EntityDto<Guid> public class BlogDto : EntityDto<Guid>, IHasConcurrencyStamp
{ {
public string Name { get; set; } public string Name { get; set; }
public string Slug { get; set; } public string Slug { get; set; }
public string ConcurrencyStamp { get; set; }
} }
} }

5
modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogPostDto.cs

@ -1,11 +1,12 @@
using System; using System;
using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Dtos;
using Volo.Abp.Auditing; using Volo.Abp.Auditing;
using Volo.Abp.Domain.Entities;
namespace Volo.CmsKit.Admin.Blogs namespace Volo.CmsKit.Admin.Blogs
{ {
[Serializable] [Serializable]
public class BlogPostDto : EntityDto<Guid>, IHasCreationTime, IHasModificationTime public class BlogPostDto : EntityDto<Guid>, IHasCreationTime, IHasModificationTime, IHasConcurrencyStamp
{ {
public Guid BlogId { get; set; } public Guid BlogId { get; set; }
@ -22,5 +23,7 @@ namespace Volo.CmsKit.Admin.Blogs
public DateTime CreationTime { get; set; } public DateTime CreationTime { get; set; }
public DateTime? LastModificationTime { get; set; } public DateTime? LastModificationTime { get; set; }
public string ConcurrencyStamp { get; set; }
} }
} }

5
modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/UpdateBlogDto.cs

@ -1,10 +1,11 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Volo.Abp.Domain.Entities;
using Volo.Abp.Validation; using Volo.Abp.Validation;
using Volo.CmsKit.Blogs; using Volo.CmsKit.Blogs;
namespace Volo.CmsKit.Admin.Blogs namespace Volo.CmsKit.Admin.Blogs
{ {
public class UpdateBlogDto public class UpdateBlogDto : IHasConcurrencyStamp
{ {
[Required] [Required]
[DynamicMaxLength(typeof(BlogConsts), nameof(BlogConsts.MaxNameLength))] [DynamicMaxLength(typeof(BlogConsts), nameof(BlogConsts.MaxNameLength))]
@ -13,5 +14,7 @@ namespace Volo.CmsKit.Admin.Blogs
[Required] [Required]
[DynamicMaxLength(typeof(BlogConsts), nameof(BlogConsts.MaxSlugLength))] [DynamicMaxLength(typeof(BlogConsts), nameof(BlogConsts.MaxSlugLength))]
public string Slug { get; set; } public string Slug { get; set; }
public string ConcurrencyStamp { get; set; }
} }
} }

5
modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/UpdateBlogPostDto.cs

@ -1,12 +1,13 @@
using System; using System;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Volo.Abp.Domain.Entities;
using Volo.Abp.Validation; using Volo.Abp.Validation;
using Volo.CmsKit.Blogs; using Volo.CmsKit.Blogs;
namespace Volo.CmsKit.Admin.Blogs namespace Volo.CmsKit.Admin.Blogs
{ {
[Serializable] [Serializable]
public class UpdateBlogPostDto public class UpdateBlogPostDto : IHasConcurrencyStamp
{ {
[Required] [Required]
[DynamicMaxLength(typeof(BlogPostConsts), nameof(BlogPostConsts.MaxTitleLength))] [DynamicMaxLength(typeof(BlogPostConsts), nameof(BlogPostConsts.MaxTitleLength))]
@ -23,5 +24,7 @@ namespace Volo.CmsKit.Admin.Blogs
public string Content { get; set; } public string Content { get; set; }
public Guid? CoverImageMediaId { get; set; } public Guid? CoverImageMediaId { get; set; }
public string ConcurrencyStamp { get; set; }
} }
} }

5
modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Menus/MenuItemUpdateInput.cs

@ -1,10 +1,11 @@
using System; using System;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Volo.Abp.Domain.Entities;
namespace Volo.CmsKit.Admin.Menus namespace Volo.CmsKit.Admin.Menus
{ {
[Serializable] [Serializable]
public class MenuItemUpdateInput public class MenuItemUpdateInput : IHasConcurrencyStamp
{ {
[Required] [Required]
public string DisplayName { get; set; } public string DisplayName { get; set; }
@ -22,5 +23,7 @@ namespace Volo.CmsKit.Admin.Menus
public string CssClass { get; set; } public string CssClass { get; set; }
public Guid? PageId { get; set; } public Guid? PageId { get; set; }
public string ConcurrencyStamp { get; set; }
} }
} }

5
modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/PageDto.cs

@ -1,10 +1,11 @@
using System; using System;
using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Dtos;
using Volo.Abp.Domain.Entities;
namespace Volo.CmsKit.Admin.Pages namespace Volo.CmsKit.Admin.Pages
{ {
[Serializable] [Serializable]
public class PageDto : AuditedEntityDto<Guid> public class PageDto : AuditedEntityDto<Guid>, IHasConcurrencyStamp
{ {
public string Title { get; set; } public string Title { get; set; }
@ -15,5 +16,7 @@ namespace Volo.CmsKit.Admin.Pages
public string Script { get; set; } public string Script { get; set; }
public string Style { get; set; } public string Style { get; set; }
public string ConcurrencyStamp { get; set; }
} }
} }

7
modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/UpdatePageInputDto.cs

@ -1,12 +1,13 @@
using System; using System;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Volo.Abp.Domain.Entities;
using Volo.Abp.Validation; using Volo.Abp.Validation;
using Volo.CmsKit.Pages; using Volo.CmsKit.Pages;
namespace Volo.CmsKit.Admin.Pages namespace Volo.CmsKit.Admin.Pages
{ {
[Serializable] [Serializable]
public class UpdatePageInputDto public class UpdatePageInputDto : IHasConcurrencyStamp
{ {
[Required] [Required]
[DynamicMaxLength(typeof(PageConsts), nameof(PageConsts.MaxTitleLength))] [DynamicMaxLength(typeof(PageConsts), nameof(PageConsts.MaxTitleLength))]
@ -15,7 +16,7 @@ namespace Volo.CmsKit.Admin.Pages
[Required] [Required]
[DynamicMaxLength(typeof(PageConsts), nameof(PageConsts.MaxSlugLength))] [DynamicMaxLength(typeof(PageConsts), nameof(PageConsts.MaxSlugLength))]
public string Slug { get; set; } public string Slug { get; set; }
[DynamicMaxLength(typeof(PageConsts), nameof(PageConsts.MaxContentLength))] [DynamicMaxLength(typeof(PageConsts), nameof(PageConsts.MaxContentLength))]
public string Content { get; set; } public string Content { get; set; }
@ -24,5 +25,7 @@ namespace Volo.CmsKit.Admin.Pages
[DynamicMaxLength(typeof(PageConsts), nameof(PageConsts.MaxStyleLength))] [DynamicMaxLength(typeof(PageConsts), nameof(PageConsts.MaxStyleLength))]
public string Style { get; set; } public string Style { get; set; }
public string ConcurrencyStamp { get; set; }
} }
} }

5
modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Tags/TagUpdateDto.cs

@ -1,15 +1,18 @@
using System; using System;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Volo.Abp.Domain.Entities;
using Volo.Abp.Validation; using Volo.Abp.Validation;
using Volo.CmsKit.Tags; using Volo.CmsKit.Tags;
namespace Volo.CmsKit.Admin.Tags namespace Volo.CmsKit.Admin.Tags
{ {
[Serializable] [Serializable]
public class TagUpdateDto public class TagUpdateDto : IHasConcurrencyStamp
{ {
[Required] [Required]
[DynamicMaxLength(typeof(TagConsts), nameof(TagConsts.MaxNameLength))] [DynamicMaxLength(typeof(TagConsts), nameof(TagConsts.MaxNameLength))]
public string Name { get; set; } public string Name { get; set; }
public string ConcurrencyStamp { get; set; }
} }
} }

3
modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogAdminAppService.cs

@ -3,6 +3,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Dtos;
using Volo.Abp.Data;
using Volo.Abp.GlobalFeatures; using Volo.Abp.GlobalFeatures;
using Volo.CmsKit.Blogs; using Volo.CmsKit.Blogs;
using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.GlobalFeatures;
@ -67,6 +68,8 @@ namespace Volo.CmsKit.Admin.Blogs
blog = await BlogManager.UpdateAsync(blog, input.Name, input.Slug); blog = await BlogManager.UpdateAsync(blog, input.Name, input.Slug);
blog.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp);
await BlogRepository.UpdateAsync(blog); await BlogRepository.UpdateAsync(blog);
return ObjectMapper.Map<Blog, BlogDto>(blog); return ObjectMapper.Map<Blog, BlogDto>(blog);

3
modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs

@ -1,9 +1,9 @@
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using System; using System;
using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Dtos;
using Volo.Abp.Data;
using Volo.Abp.GlobalFeatures; using Volo.Abp.GlobalFeatures;
using Volo.Abp.Users; using Volo.Abp.Users;
using Volo.CmsKit.Blogs; using Volo.CmsKit.Blogs;
@ -63,6 +63,7 @@ namespace Volo.CmsKit.Admin.Blogs
blogPost.SetTitle(input.Title); blogPost.SetTitle(input.Title);
blogPost.SetShortDescription(input.ShortDescription); blogPost.SetShortDescription(input.ShortDescription);
blogPost.SetContent(input.Content); blogPost.SetContent(input.Content);
blogPost.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp);
blogPost.CoverImageMediaId = input.CoverImageMediaId; blogPost.CoverImageMediaId = input.CoverImageMediaId;
if (blogPost.Slug != input.Slug) if (blogPost.Slug != input.Slug)

2
modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Menus/MenuItemAdminAppService.cs

@ -5,6 +5,7 @@ using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Dtos;
using Volo.Abp.Data;
using Volo.Abp.GlobalFeatures; using Volo.Abp.GlobalFeatures;
using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.GlobalFeatures;
using Volo.CmsKit.Menus; using Volo.CmsKit.Menus;
@ -87,6 +88,7 @@ namespace Volo.CmsKit.Admin.Menus
menuItem.Target = input.Target; menuItem.Target = input.Target;
menuItem.ElementId = input.ElementId; menuItem.ElementId = input.ElementId;
menuItem.CssClass = input.CssClass; menuItem.CssClass = input.CssClass;
menuItem.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp);
await MenuItemRepository.UpdateAsync(menuItem); await MenuItemRepository.UpdateAsync(menuItem);

2
modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Pages/PageAdminAppService.cs

@ -4,6 +4,7 @@ using System.Threading.Tasks;
using AutoMapper; using AutoMapper;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Dtos;
using Volo.Abp.Data;
using Volo.Abp.GlobalFeatures; using Volo.Abp.GlobalFeatures;
using Volo.CmsKit.Admin.Menus; using Volo.CmsKit.Admin.Menus;
using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.GlobalFeatures;
@ -72,6 +73,7 @@ namespace Volo.CmsKit.Admin.Pages
page.SetContent(input.Content); page.SetContent(input.Content);
page.SetScript(input.Script); page.SetScript(input.Script);
page.SetStyle(input.Style); page.SetStyle(input.Style);
page.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp);
await PageRepository.UpdateAsync(page); await PageRepository.UpdateAsync(page);

3
modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Tags/TagAdminAppService.cs

@ -5,6 +5,7 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Dtos;
using Volo.Abp.Data;
using Volo.Abp.GlobalFeatures; using Volo.Abp.GlobalFeatures;
using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.GlobalFeatures;
using Volo.CmsKit.Permissions; using Volo.CmsKit.Permissions;
@ -53,6 +54,8 @@ namespace Volo.CmsKit.Admin.Tags
id, id,
input.Name); input.Name);
tag.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp);
await Repository.UpdateAsync(tag); await Repository.UpdateAsync(tag);
return ObjectMapper.Map<Tag, TagDto>(tag); return ObjectMapper.Map<Tag, TagDto>(tag);

5
modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Update.cshtml.cs

@ -8,6 +8,7 @@ using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form; using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form;
using Volo.Abp.Domain.Entities;
using Volo.Abp.Validation; using Volo.Abp.Validation;
using Volo.CmsKit.Admin.Blogs; using Volo.CmsKit.Admin.Blogs;
using Volo.CmsKit.Blogs; using Volo.CmsKit.Blogs;
@ -56,7 +57,7 @@ namespace Volo.CmsKit.Admin.Web.Pages.CmsKit.BlogPosts
[AutoMap(typeof(BlogPostDto))] [AutoMap(typeof(BlogPostDto))]
[AutoMap(typeof(UpdateBlogPostDto), ReverseMap = true)] [AutoMap(typeof(UpdateBlogPostDto), ReverseMap = true)]
public class UpdateBlogPostViewModel public class UpdateBlogPostViewModel : IHasConcurrencyStamp
{ {
[DynamicMaxLength(typeof(BlogPostConsts), nameof(BlogPostConsts.MaxTitleLength))] [DynamicMaxLength(typeof(BlogPostConsts), nameof(BlogPostConsts.MaxTitleLength))]
[Required] [Required]
@ -79,6 +80,8 @@ namespace Volo.CmsKit.Admin.Web.Pages.CmsKit.BlogPosts
[HiddenInput] [HiddenInput]
public Guid? CoverImageMediaId { get; set; } public Guid? CoverImageMediaId { get; set; }
public string ConcurrencyStamp { get; set; }
} }
} }
} }

6
modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Blogs/UpdateModal.cshtml.cs

@ -3,6 +3,7 @@ using Microsoft.AspNetCore.Mvc;
using System; using System;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.Domain.Entities;
using Volo.Abp.Validation; using Volo.Abp.Validation;
using Volo.CmsKit.Admin.Blogs; using Volo.CmsKit.Admin.Blogs;
using Volo.CmsKit.Blogs; using Volo.CmsKit.Blogs;
@ -43,7 +44,7 @@ namespace Volo.CmsKit.Admin.Web.Pages.CmsKit.Blogs
[AutoMap(typeof(BlogDto))] [AutoMap(typeof(BlogDto))]
[AutoMap(typeof(UpdateBlogDto), ReverseMap = true)] [AutoMap(typeof(UpdateBlogDto), ReverseMap = true)]
public class UpdateBlogViewModel public class UpdateBlogViewModel : IHasConcurrencyStamp
{ {
[Required] [Required]
[DynamicMaxLength(typeof(BlogConsts), nameof(BlogConsts.MaxNameLength))] [DynamicMaxLength(typeof(BlogConsts), nameof(BlogConsts.MaxNameLength))]
@ -52,6 +53,9 @@ namespace Volo.CmsKit.Admin.Web.Pages.CmsKit.Blogs
[DynamicMaxLength(typeof(BlogConsts), nameof(BlogConsts.MaxSlugLength))] [DynamicMaxLength(typeof(BlogConsts), nameof(BlogConsts.MaxSlugLength))]
[Required] [Required]
public string Slug { get; set; } public string Slug { get; set; }
[HiddenInput]
public string ConcurrencyStamp { get; set; }
} }
} }
} }

1
modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/MenuItems/UpdateModal.cshtml

@ -17,6 +17,7 @@
<abp-modal-header title="@L["New"].Value"></abp-modal-header> <abp-modal-header title="@L["New"].Value"></abp-modal-header>
<abp-modal-body> <abp-modal-body>
<abp-input asp-for="Id"/> <abp-input asp-for="Id"/>
<abp-input asp-for="ViewModel.ConcurrencyStamp"/>
<abp-tabs tab-style="Tab"> <abp-tabs tab-style="Tab">
<abp-tab name="url" title="@L["Url"]"> <abp-tab name="url" title="@L["Url"]">

6
modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/MenuItems/UpdateModal.cshtml.cs

@ -4,6 +4,7 @@ using System.Threading.Tasks;
using AutoMapper; using AutoMapper;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.AspNetCore.Mvc.RazorPages;
using Volo.Abp.Domain.Entities;
using Volo.CmsKit.Admin.Menus; using Volo.CmsKit.Admin.Menus;
using Volo.CmsKit.Menus; using Volo.CmsKit.Menus;
@ -43,7 +44,7 @@ namespace Volo.CmsKit.Admin.Web.Pages.CmsKit.Menus.MenuItems
[AutoMap(typeof(MenuItemDto))] [AutoMap(typeof(MenuItemDto))]
[AutoMap(typeof(MenuItemUpdateInput), ReverseMap = true)] [AutoMap(typeof(MenuItemUpdateInput), ReverseMap = true)]
public class MenuItemUpdateViewModel public class MenuItemUpdateViewModel : IHasConcurrencyStamp
{ {
[Required] [Required]
public string DisplayName { get; set; } public string DisplayName { get; set; }
@ -61,6 +62,9 @@ namespace Volo.CmsKit.Admin.Web.Pages.CmsKit.Menus.MenuItems
public string CssClass { get; set; } public string CssClass { get; set; }
public Guid? PageId { get; set; } public Guid? PageId { get; set; }
[HiddenInput]
public string ConcurrencyStamp { get; set; }
} }
} }
} }

2
modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/Update.cshtml

@ -40,6 +40,8 @@
<form asp-page="/CmsKit/Pages/Update" id="form-page-update"> <form asp-page="/CmsKit/Pages/Update" id="form-page-update">
<abp-input asp-for="@Model.Id" /> <abp-input asp-for="@Model.Id" />
<abp-input asp-for="@Model.ViewModel.ConcurrencyStamp" />
<abp-input asp-for="@Model.ViewModel.Title" /> <abp-input asp-for="@Model.ViewModel.Title" />
<abp-input asp-for="ViewModel.Slug" title="@L["PageSlugInformation"]" data-toggle="tooltip" /> <abp-input asp-for="ViewModel.Slug" title="@L["PageSlugInformation"]" data-toggle="tooltip" />

6
modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/Update.cshtml.cs

@ -4,6 +4,7 @@ using System;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form; using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form;
using Volo.Abp.Domain.Entities;
using Volo.Abp.Validation; using Volo.Abp.Validation;
using Volo.CmsKit.Admin.Pages; using Volo.CmsKit.Admin.Pages;
using Volo.CmsKit.Pages; using Volo.CmsKit.Pages;
@ -44,7 +45,7 @@ namespace Volo.CmsKit.Admin.Web.Pages.CmsKit.Pages
[AutoMap(typeof(PageDto))] [AutoMap(typeof(PageDto))]
[AutoMap(typeof(UpdatePageInputDto), ReverseMap = true)] [AutoMap(typeof(UpdatePageInputDto), ReverseMap = true)]
public class UpdatePageViewModel public class UpdatePageViewModel : IHasConcurrencyStamp
{ {
[Required] [Required]
[DynamicMaxLength(typeof(PageConsts), nameof(PageConsts.MaxTitleLength))] [DynamicMaxLength(typeof(PageConsts), nameof(PageConsts.MaxTitleLength))]
@ -65,6 +66,9 @@ namespace Volo.CmsKit.Admin.Web.Pages.CmsKit.Pages
[TextArea(Rows = 6)] [TextArea(Rows = 6)]
[DynamicMaxLength(typeof(PageConsts), nameof(PageConsts.MaxStyleLength))] [DynamicMaxLength(typeof(PageConsts), nameof(PageConsts.MaxStyleLength))]
public string Style { get; set; } public string Style { get; set; }
[HiddenInput]
public string ConcurrencyStamp { get; set; }
} }
} }
} }

6
modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Tags/EditModal.cshtml.cs

@ -6,6 +6,7 @@ using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.Domain.Entities;
using Volo.Abp.Validation; using Volo.Abp.Validation;
using Volo.CmsKit.Admin.Tags; using Volo.CmsKit.Admin.Tags;
using Volo.CmsKit.Tags; using Volo.CmsKit.Tags;
@ -44,11 +45,14 @@ namespace Volo.CmsKit.Admin.Web.Pages.CmsKit.Tags
[AutoMap(typeof(TagDto))] [AutoMap(typeof(TagDto))]
[AutoMap(typeof(TagUpdateDto), ReverseMap = true)] [AutoMap(typeof(TagUpdateDto), ReverseMap = true)]
public class TagEditViewModel public class TagEditViewModel : IHasConcurrencyStamp
{ {
[Required] [Required]
[DynamicMaxLength(typeof(TagConsts), nameof(TagConsts.MaxNameLength))] [DynamicMaxLength(typeof(TagConsts), nameof(TagConsts.MaxNameLength))]
public string Name { get; set; } public string Name { get; set; }
[HiddenInput]
public string ConcurrencyStamp { get; set; }
} }
} }
} }

15
modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Menus/MenuItemDto.cs

@ -1,21 +1,32 @@
using System; using System;
using System.Collections.Generic;
using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Dtos;
using Volo.Abp.Domain.Entities;
namespace Volo.CmsKit.Menus namespace Volo.CmsKit.Menus
{ {
[Serializable] [Serializable]
public class MenuItemDto : AuditedEntityDto<Guid> public class MenuItemDto : AuditedEntityDto<Guid>, IHasConcurrencyStamp
{ {
public Guid? ParentId { get; set; } public Guid? ParentId { get; set; }
public string DisplayName { get; set; } public string DisplayName { get; set; }
public bool IsActive { get; set; } public bool IsActive { get; set; }
public string Url { get; set; } public string Url { get; set; }
public string Icon { get; set; } public string Icon { get; set; }
public int Order { get; set; } public int Order { get; set; }
public string Target { get; set; } public string Target { get; set; }
public string ElementId { get; set; } public string ElementId { get; set; }
public string CssClass { get; set; } public string CssClass { get; set; }
public Guid? PageId { get; set; } public Guid? PageId { get; set; }
public string ConcurrencyStamp { get; set; }
} }
} }

5
modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Tags/TagDto.cs

@ -1,13 +1,16 @@
using System; using System;
using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Dtos;
using Volo.Abp.Domain.Entities;
namespace Volo.CmsKit.Tags namespace Volo.CmsKit.Tags
{ {
[Serializable] [Serializable]
public class TagDto : EntityDto<Guid> public class TagDto : EntityDto<Guid>, IHasConcurrencyStamp
{ {
public string EntityType { get; set; } public string EntityType { get; set; }
public string Name { get; set; } public string Name { get; set; }
public string ConcurrencyStamp { get; set; }
} }
} }

2
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Comments/Comment.cs

@ -7,7 +7,7 @@ using Volo.Abp.MultiTenancy;
namespace Volo.CmsKit.Comments namespace Volo.CmsKit.Comments
{ {
public class Comment: BasicAggregateRoot<Guid>, IHasCreationTime, IMustHaveCreator, IMultiTenant public class Comment: AggregateRoot<Guid>, IHasCreationTime, IMustHaveCreator, IMultiTenant
{ {
public virtual Guid? TenantId { get; protected set; } public virtual Guid? TenantId { get; protected set; }

10
modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Comments/MongoCommentRepository.cs

@ -156,6 +156,11 @@ namespace Volo.CmsKit.MongoDB.Comments
.Where(x => x.RepliedCommentId == comment.Id) .Where(x => x.RepliedCommentId == comment.Id)
.ToListAsync(GetCancellationToken(cancellationToken)); .ToListAsync(GetCancellationToken(cancellationToken));
await base.DeleteAsync(
comment,
cancellationToken: GetCancellationToken(cancellationToken)
);
foreach (var reply in replies) foreach (var reply in replies)
{ {
await base.DeleteAsync( await base.DeleteAsync(
@ -163,11 +168,6 @@ namespace Volo.CmsKit.MongoDB.Comments
cancellationToken: GetCancellationToken(cancellationToken) cancellationToken: GetCancellationToken(cancellationToken)
); );
} }
await base.DeleteAsync(
comment,
cancellationToken: GetCancellationToken(cancellationToken)
);
} }
protected virtual async Task<IQueryable<Comment>> GetListQueryAsync( protected virtual async Task<IQueryable<Comment>> GetListQueryAsync(

5
modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CommentDto.cs

@ -1,9 +1,10 @@
using System; using System;
using Volo.Abp.Domain.Entities;
namespace Volo.CmsKit.Public.Comments namespace Volo.CmsKit.Public.Comments
{ {
[Serializable] [Serializable]
public class CommentDto public class CommentDto : IHasConcurrencyStamp
{ {
public Guid Id { get; set; } public Guid Id { get; set; }
@ -20,5 +21,7 @@ namespace Volo.CmsKit.Public.Comments
public DateTime CreationTime { get; set; } public DateTime CreationTime { get; set; }
public CmsUserDto Author { get; set; } //TODO: Should only have AuthorId for the basic dto. see https://docs.abp.io/en/abp/latest/Best-Practices/Application-Services public CmsUserDto Author { get; set; } //TODO: Should only have AuthorId for the basic dto. see https://docs.abp.io/en/abp/latest/Best-Practices/Application-Services
public string ConcurrencyStamp { get; set; }
} }
} }

5
modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CommentWithDetailsDto.cs

@ -1,10 +1,11 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using Volo.Abp.Domain.Entities;
namespace Volo.CmsKit.Public.Comments namespace Volo.CmsKit.Public.Comments
{ {
[Serializable] [Serializable]
public class CommentWithDetailsDto public class CommentWithDetailsDto : IHasConcurrencyStamp
{ {
public Guid Id { get; set; } public Guid Id { get; set; }
@ -21,5 +22,7 @@ namespace Volo.CmsKit.Public.Comments
public List<CommentDto> Replies { get; set; } public List<CommentDto> Replies { get; set; }
public CmsUserDto Author { get; set; } public CmsUserDto Author { get; set; }
public string ConcurrencyStamp { get; set; }
} }
} }

5
modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/UpdateCommentInput.cs

@ -1,15 +1,18 @@
using System; using System;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Volo.Abp.Domain.Entities;
using Volo.Abp.Validation; using Volo.Abp.Validation;
using Volo.CmsKit.Comments; using Volo.CmsKit.Comments;
namespace Volo.CmsKit.Public.Comments namespace Volo.CmsKit.Public.Comments
{ {
[Serializable] [Serializable]
public class UpdateCommentInput public class UpdateCommentInput : IHasConcurrencyStamp
{ {
[Required] [Required]
[DynamicStringLength(typeof(CommentConsts), nameof(CommentConsts.MaxTextLength))] [DynamicStringLength(typeof(CommentConsts), nameof(CommentConsts.MaxTextLength))]
public string Text { get; set; } public string Text { get; set; }
public string ConcurrencyStamp { get; set; }
} }
} }

2
modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Comments/CommentPublicAppService.cs

@ -5,6 +5,7 @@ using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Dtos;
using Volo.Abp.Authorization; using Volo.Abp.Authorization;
using Volo.Abp.Data;
using Volo.Abp.EventBus.Distributed; using Volo.Abp.EventBus.Distributed;
using Volo.Abp.GlobalFeatures; using Volo.Abp.GlobalFeatures;
using Volo.Abp.Users; using Volo.Abp.Users;
@ -86,6 +87,7 @@ namespace Volo.CmsKit.Public.Comments
} }
comment.SetText(input.Text); comment.SetText(input.Text);
comment.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp);
var updatedComment = await CommentRepository.UpdateAsync(comment); var updatedComment = await CommentRepository.UpdateAsync(comment);

7
modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/Default.cshtml

@ -89,7 +89,7 @@
</div>; </div>;
} }
@{ @{
Func<dynamic, IHtmlContent> GetEditArea(Guid id, string text) => Func<dynamic, IHtmlContent> GetEditArea(Guid id, string text, string concurrencyStamp) =>
@<div class="cms-comment-edit-area" id="@($"cms-comment_{Model.EntityType}_{Model.EntityId}_{id}")" data-id="@id.ToString()" style="display:none"> @<div class="cms-comment-edit-area" id="@($"cms-comment_{Model.EntityType}_{Model.EntityId}_{id}")" data-id="@id.ToString()" style="display:none">
<div class="card bg-light p-3 mx-0 mt-3"> <div class="card bg-light p-3 mx-0 mt-3">
<form class="cms-comment-update-form"> <form class="cms-comment-update-form">
@ -98,6 +98,7 @@
<div class="col"> <div class="col">
<div class="form-group m-0"> <div class="form-group m-0">
<textarea class="form-control" name="commentText" rows="3">@text</textarea> <textarea class="form-control" name="commentText" rows="3">@text</textarea>
<input name="commentConcurrencyStamp" value="@concurrencyStamp" type="hidden" />
</div> </div>
</div> </div>
<div class="col-auto"> <div class="col-auto">
@ -151,7 +152,7 @@
</div> </div>
</div> </div>
</div> </div>
@GetEditArea(comment.Id, comment.Text).Invoke(null) @GetEditArea(comment.Id, comment.Text, comment.ConcurrencyStamp).Invoke(null)
@if (comment.Replies.Any()) @if (comment.Replies.Any())
{ {
@ -181,7 +182,7 @@
</div> </div>
</div> </div>
@GetEditArea(reply.Id, reply.Text).Invoke(null) @GetEditArea(reply.Id, reply.Text, reply.ConcurrencyStamp).Invoke(null)
</div> </div>
</div> </div>
} }

3
modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/default.js

@ -106,7 +106,8 @@
volo.cmsKit.public.comments.commentPublic.update( volo.cmsKit.public.comments.commentPublic.update(
formAsObject.id, formAsObject.id,
{ {
text: formAsObject.commentText text: formAsObject.commentText,
concurrencyStamp: formAsObject.commentConcurrencyStamp
} }
).then(function () { ).then(function () {
widgetManager.refresh($widget); widgetManager.refresh($widget);

6
modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Projects/ProjectDto.cs

@ -1,12 +1,12 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Dtos;
using Volo.Docs.Projects; using Volo.Abp.Domain.Entities;
namespace Volo.Docs.Admin.Projects namespace Volo.Docs.Admin.Projects
{ {
[Serializable] [Serializable]
public class ProjectDto : EntityDto<Guid> public class ProjectDto : EntityDto<Guid>, IHasConcurrencyStamp
{ {
public string Name { get; set; } public string Name { get; set; }
@ -29,5 +29,7 @@ namespace Volo.Docs.Admin.Projects
public string DocumentStoreType { get; set; } public string DocumentStoreType { get; set; }
public Dictionary<string, object> ExtraProperties { get; set; } public Dictionary<string, object> ExtraProperties { get; set; }
public string ConcurrencyStamp { get; set; }
} }
} }

6
modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Projects/UpdateProjectDto.cs

@ -1,9 +1,9 @@
using System.Collections.Generic; using System.Collections.Generic;
using Volo.Docs.Projects; using Volo.Abp.Domain.Entities;
namespace Volo.Docs.Admin.Projects namespace Volo.Docs.Admin.Projects
{ {
public class UpdateProjectDto public class UpdateProjectDto : IHasConcurrencyStamp
{ {
public string Name { get; set; } public string Name { get; set; }
@ -22,5 +22,7 @@ namespace Volo.Docs.Admin.Projects
public string LatestVersionBranchName { get; set; } public string LatestVersionBranchName { get; set; }
public Dictionary<string, object> ExtraProperties { get; set; } public Dictionary<string, object> ExtraProperties { get; set; }
public string ConcurrencyStamp { get; set; }
} }
} }

2
modules/docs/src/Volo.Docs.Admin.Application/Volo/Docs/Admin/Projects/ProjectAdminAppService.cs

@ -4,6 +4,7 @@ using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services; using Volo.Abp.Application.Services;
using Volo.Abp.Data;
using Volo.Abp.Guids; using Volo.Abp.Guids;
using Volo.Docs.Documents; using Volo.Docs.Documents;
using Volo.Docs.Documents.FullSearch.Elastic; using Volo.Docs.Documents.FullSearch.Elastic;
@ -96,6 +97,7 @@ namespace Volo.Docs.Admin.Projects
project.SetFormat(input.Format); project.SetFormat(input.Format);
project.SetNavigationDocumentName(input.NavigationDocumentName); project.SetNavigationDocumentName(input.NavigationDocumentName);
project.SetDefaultDocumentName(input.DefaultDocumentName); project.SetDefaultDocumentName(input.DefaultDocumentName);
project.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp);
project.MinimumVersion = input.MinimumVersion; project.MinimumVersion = input.MinimumVersion;
project.MainWebsiteUrl = input.MainWebsiteUrl; project.MainWebsiteUrl = input.MainWebsiteUrl;

7
modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/Edit.cshtml.cs

@ -9,6 +9,7 @@ using Microsoft.AspNetCore.Mvc.Rendering;
using Volo.Abp; using Volo.Abp;
using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form; using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form;
using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; using Volo.Abp.AspNetCore.Mvc.UI.RazorPages;
using Volo.Abp.Domain.Entities;
using Volo.Abp.Validation; using Volo.Abp.Validation;
using Volo.Docs.Admin.Projects; using Volo.Docs.Admin.Projects;
using Volo.Docs.Projects; using Volo.Docs.Projects;
@ -33,7 +34,7 @@ namespace Volo.Docs.Admin.Pages.Docs.Admin.Projects
public virtual async Task<ActionResult> OnGetAsync(Guid id) public virtual async Task<ActionResult> OnGetAsync(Guid id)
{ {
var project = await _projectAppService.GetAsync(id); var project = await _projectAppService.GetAsync(id);
if (project.DocumentStoreType == "GitHub") if (project.DocumentStoreType == "GitHub")
{ {
SetGithubProjectFromDto(project); SetGithubProjectFromDto(project);
@ -89,7 +90,7 @@ namespace Volo.Docs.Admin.Pages.Docs.Admin.Projects
} }
} }
public abstract class EditProjectViewModelBase public abstract class EditProjectViewModelBase : IHasConcurrencyStamp
{ {
[Required] [Required]
[HiddenInput] [HiddenInput]
@ -119,6 +120,8 @@ namespace Volo.Docs.Admin.Pages.Docs.Admin.Projects
[DynamicStringLength(typeof(ProjectConsts), nameof(ProjectConsts.MaxLatestVersionBranchNameLength))] [DynamicStringLength(typeof(ProjectConsts), nameof(ProjectConsts.MaxLatestVersionBranchNameLength))]
public string LatestVersionBranchName { get; set; } public string LatestVersionBranchName { get; set; }
public string ConcurrencyStamp { get; set; }
} }
public class EditGithubProjectViewModel : EditProjectViewModelBase public class EditGithubProjectViewModel : EditProjectViewModelBase

7
modules/identity/src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/ProfileDto.cs

@ -1,8 +1,9 @@
using Volo.Abp.ObjectExtending; using Volo.Abp.Domain.Entities;
using Volo.Abp.ObjectExtending;
namespace Volo.Abp.Identity namespace Volo.Abp.Identity
{ {
public class ProfileDto : ExtensibleObject public class ProfileDto : ExtensibleObject, IHasConcurrencyStamp
{ {
public string UserName { get; set; } public string UserName { get; set; }
@ -17,5 +18,7 @@ namespace Volo.Abp.Identity
public bool IsExternal { get; set; } public bool IsExternal { get; set; }
public bool HasPassword { get; set; } public bool HasPassword { get; set; }
public string ConcurrencyStamp { get; set; }
} }
} }

3
modules/identity/src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/UpdateProfileDto.cs

@ -1,4 +1,5 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Volo.Abp.Domain.Entities;
using Volo.Abp.ObjectExtending; using Volo.Abp.ObjectExtending;
using Volo.Abp.Validation; using Volo.Abp.Validation;
@ -20,5 +21,7 @@ namespace Volo.Abp.Identity
[DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxPhoneNumberLength))] [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxPhoneNumberLength))]
public string PhoneNumber { get; set; } public string PhoneNumber { get; set; }
public string ConcurrencyStamp { get; set; }
} }
} }

6
modules/identity/src/Volo.Abp.Identity.Application/Volo/Abp/Identity/IdentityRoleAppService.cs

@ -4,6 +4,7 @@ using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Identity;
using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Dtos;
using Volo.Abp.Data;
using Volo.Abp.ObjectExtending; using Volo.Abp.ObjectExtending;
namespace Volo.Abp.Identity namespace Volo.Abp.Identity
@ -72,8 +73,9 @@ namespace Volo.Abp.Identity
[Authorize(IdentityPermissions.Roles.Update)] [Authorize(IdentityPermissions.Roles.Update)]
public virtual async Task<IdentityRoleDto> UpdateAsync(Guid id, IdentityRoleUpdateDto input) public virtual async Task<IdentityRoleDto> UpdateAsync(Guid id, IdentityRoleUpdateDto input)
{ {
var role = await RoleManager.GetByIdAsync(id); var role = await RoleManager.GetByIdAsync(id);
role.ConcurrencyStamp = input.ConcurrencyStamp;
role.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp);
(await RoleManager.SetRoleNameAsync(role, input.Name)).CheckErrors(); (await RoleManager.SetRoleNameAsync(role, input.Name)).CheckErrors();

4
modules/identity/src/Volo.Abp.Identity.Application/Volo/Abp/Identity/IdentityUserAppService.cs

@ -5,6 +5,7 @@ using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Dtos;
using Volo.Abp.Data;
using Volo.Abp.ObjectExtending; using Volo.Abp.ObjectExtending;
namespace Volo.Abp.Identity namespace Volo.Abp.Identity
@ -98,7 +99,8 @@ namespace Volo.Abp.Identity
await IdentityOptions.SetAsync(); await IdentityOptions.SetAsync();
var user = await UserManager.GetByIdAsync(id); var user = await UserManager.GetByIdAsync(id);
user.ConcurrencyStamp = input.ConcurrencyStamp;
user.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp);
(await UserManager.SetUserNameAsync(user, input.UserName)).CheckErrors(); (await UserManager.SetUserNameAsync(user, input.UserName)).CheckErrors();

3
modules/identity/src/Volo.Abp.Identity.Application/Volo/Abp/Identity/ProfileAppService.cs

@ -4,6 +4,7 @@ using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Volo.Abp.Data;
using Volo.Abp.Identity.Settings; using Volo.Abp.Identity.Settings;
using Volo.Abp.ObjectExtending; using Volo.Abp.ObjectExtending;
using Volo.Abp.Settings; using Volo.Abp.Settings;
@ -62,6 +63,8 @@ namespace Volo.Abp.Identity
user.Name = input.Name; user.Name = input.Name;
user.Surname = input.Surname; user.Surname = input.Surname;
user.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp);
input.MapExtraPropertiesTo(user); input.MapExtraPropertiesTo(user);
(await UserManager.UpdateAsync(user)).CheckErrors(); (await UserManager.UpdateAsync(user)).CheckErrors();

9
modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityClaimType.cs

@ -18,7 +18,7 @@ namespace Volo.Abp.Identity
public virtual string Description { get; set; } public virtual string Description { get; set; }
public virtual IdentityClaimValueType ValueType { get; protected set; } public virtual IdentityClaimValueType ValueType { get; set; }
protected IdentityClaimType() protected IdentityClaimType()
{ {
@ -36,7 +36,7 @@ namespace Volo.Abp.Identity
IdentityClaimValueType valueType = IdentityClaimValueType.String) IdentityClaimValueType valueType = IdentityClaimValueType.String)
{ {
Id = id; Id = id;
Name = Check.NotNull(name, nameof(name)); SetName(name);
Required = required; Required = required;
IsStatic = isStatic; IsStatic = isStatic;
Regex = regex; Regex = regex;
@ -44,5 +44,10 @@ namespace Volo.Abp.Identity
Description = description; Description = description;
ValueType = valueType; ValueType = valueType;
} }
public void SetName([NotNull] string name)
{
Name = Check.NotNull(name, nameof(name));
}
} }
} }

5
modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/TenantDto.cs

@ -1,10 +1,13 @@
using System; using System;
using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Dtos;
using Volo.Abp.Domain.Entities;
namespace Volo.Abp.TenantManagement namespace Volo.Abp.TenantManagement
{ {
public class TenantDto : ExtensibleEntityDto<Guid> public class TenantDto : ExtensibleEntityDto<Guid>, IHasConcurrencyStamp
{ {
public string Name { get; set; } public string Name { get; set; }
public string ConcurrencyStamp { get; set; }
} }
} }

8
modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/TenantUpdateDto.cs

@ -1,7 +1,9 @@
namespace Volo.Abp.TenantManagement using Volo.Abp.Domain.Entities;
namespace Volo.Abp.TenantManagement
{ {
public class TenantUpdateDto : TenantCreateOrUpdateDtoBase public class TenantUpdateDto : TenantCreateOrUpdateDtoBase, IHasConcurrencyStamp
{ {
public string ConcurrencyStamp { get; set; }
} }
} }

5
modules/tenant-management/src/Volo.Abp.TenantManagement.Application/Volo/Abp/TenantManagement/TenantAppService.cs

@ -98,9 +98,14 @@ namespace Volo.Abp.TenantManagement
public virtual async Task<TenantDto> UpdateAsync(Guid id, TenantUpdateDto input) public virtual async Task<TenantDto> UpdateAsync(Guid id, TenantUpdateDto input)
{ {
var tenant = await TenantRepository.GetAsync(id); var tenant = await TenantRepository.GetAsync(id);
await TenantManager.ChangeNameAsync(tenant, input.Name); await TenantManager.ChangeNameAsync(tenant, input.Name);
tenant.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp);
input.MapExtraPropertiesTo(tenant); input.MapExtraPropertiesTo(tenant);
await TenantRepository.UpdateAsync(tenant); await TenantRepository.UpdateAsync(tenant);
return ObjectMapper.Map<Tenant, TenantDto>(tenant); return ObjectMapper.Map<Tenant, TenantDto>(tenant);
} }

1
modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/EditModal.cshtml

@ -18,6 +18,7 @@
<abp-modal-header title="@L["Edit"].Value"></abp-modal-header> <abp-modal-header title="@L["Edit"].Value"></abp-modal-header>
<abp-modal-body> <abp-modal-body>
<input asp-for="Tenant.Id" /> <input asp-for="Tenant.Id" />
<input asp-for="Tenant.ConcurrencyStamp" />
<abp-input asp-for="Tenant.Name" label="@L["TenantName"].Value" /> <abp-input asp-for="Tenant.Name" label="@L["TenantName"].Value" />
@foreach (var propertyInfo in ObjectExtensionManager.Instance.GetProperties<EditModalModel.TenantInfoModel>()) @foreach (var propertyInfo in ObjectExtensionManager.Instance.GetProperties<EditModalModel.TenantInfoModel>())
{ {

6
modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/EditModal.cshtml.cs

@ -2,6 +2,7 @@ using System;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Volo.Abp.Domain.Entities;
using Volo.Abp.ObjectExtending; using Volo.Abp.ObjectExtending;
using Volo.Abp.Validation; using Volo.Abp.Validation;
@ -38,7 +39,7 @@ namespace Volo.Abp.TenantManagement.Web.Pages.TenantManagement.Tenants
return NoContent(); return NoContent();
} }
public class TenantInfoModel : ExtensibleObject public class TenantInfoModel : ExtensibleObject, IHasConcurrencyStamp
{ {
[HiddenInput] [HiddenInput]
public Guid Id { get; set; } public Guid Id { get; set; }
@ -47,6 +48,9 @@ namespace Volo.Abp.TenantManagement.Web.Pages.TenantManagement.Tenants
[DynamicStringLength(typeof(TenantConsts), nameof(TenantConsts.MaxNameLength))] [DynamicStringLength(typeof(TenantConsts), nameof(TenantConsts.MaxNameLength))]
[Display(Name = "DisplayName:TenantName")] [Display(Name = "DisplayName:TenantName")]
public string Name { get; set; } public string Name { get; set; }
[HiddenInput]
public string ConcurrencyStamp { get; set; }
} }
} }
} }
Loading…
Cancel
Save