Browse Source

status check added to comments

pull/19919/head
EmreKendirli 2 years ago
parent
commit
fb6c8c2ba1
  1. BIN
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/malihu-custom-scrollbar-plugin/mCSB_buttons.png
  2. 21
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/prismjs/LICENSE
  3. 9
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CommentApprovalDto.cs
  4. 2
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CommentDto.cs
  5. 2
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CommentGetListInput.cs
  6. 2
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CommentWithAuthorDto.cs
  7. 2
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/ICommentAdminAppService.cs
  8. 10
      modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Comments/CommentAdminAppService.cs
  9. 9
      modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/Volo/CmsKit/Admin/Comments/CommentAdminClientProxy.Generated.cs
  10. 82
      modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/cms-kit-admin-generate-proxy.json
  11. 8
      modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Comments/CommentAdminController.cs
  12. 41
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Comments/details.js
  13. 42
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Comments/index.js
  14. 371
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js
  15. 3
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Comments/Comment.cs
  16. 78
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Comments/ICommentRepository.cs
  17. 327
      modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Comments/EfCoreCommentRepository.cs
  18. 358
      modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Comments/MongoCommentRepository.cs

BIN
modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/malihu-custom-scrollbar-plugin/mCSB_buttons.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

21
modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/prismjs/LICENSE

@ -0,0 +1,21 @@
MIT LICENSE
Copyright (c) 2012 Lea Verou
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

9
modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CommentApprovalDto.cs

@ -0,0 +1,9 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Volo.CmsKit.Admin.Comments;
public class CommentApprovalDto
{
public bool IsApproved { get; set; }
}

2
modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CommentDto.cs

@ -19,4 +19,6 @@ public class CommentDto : ExtensibleObject
public Guid CreatorId { get; set; }
public DateTime CreationTime { get; set; }
public bool? IsApproved { get; set; }
}

2
modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CommentGetListInput.cs

@ -17,4 +17,6 @@ public class CommentGetListInput : PagedAndSortedResultRequestDto
public DateTime? CreationStartDate { get; set; }
public DateTime? CreationEndDate { get; set; }
public bool? IsApproved { get; set; }
}

2
modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CommentWithAuthorDto.cs

@ -23,4 +23,6 @@ public class CommentWithAuthorDto : ExtensibleObject
public CmsUserDto Author { get; set; }
public string Url { get; set; }
public bool? IsApproved { get; set; }
}

2
modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/ICommentAdminAppService.cs

@ -12,4 +12,6 @@ public interface ICommentAdminAppService : IApplicationService
Task<CommentWithAuthorDto> GetAsync(Guid id);
Task DeleteAsync(Guid id);
Task UpdateApprovalStatusAsync(Guid id, CommentApprovalDto commentApprovalDto);
}

10
modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Comments/CommentAdminAppService.cs

@ -74,4 +74,14 @@ public class CommentAdminAppService : CmsKitAdminAppServiceBase, ICommentAdminAp
var comment = await CommentRepository.GetAsync(id);
await CommentRepository.DeleteWithRepliesAsync(comment);
}
public async Task UpdateApprovalStatusAsync(Guid id, CommentApprovalDto commentApprovalDto)
{
var comment = await CommentRepository.GetAsync(id);
comment.IsApproved = commentApprovalDto.IsApproved;
await CommentRepository.UpdateAsync(comment);
}
}

9
modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/Volo/CmsKit/Admin/Comments/CommentAdminClientProxy.Generated.cs

@ -40,4 +40,13 @@ public partial class CommentAdminClientProxy : ClientProxyBase<ICommentAdminAppS
{ typeof(Guid), id }
});
}
public virtual async Task UpdateCommentStatusAsync(Guid id, bool isApproved)
{
await RequestAsync(nameof(UpdateCommentStatusAsync), new ClientProxyRequestTypeValue
{
{ typeof(Guid), id },
{ typeof(bool), isApproved }
});
}
}

82
modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/cms-kit-admin-generate-proxy.json

@ -1267,6 +1267,31 @@
"type": "System.Void",
"typeSimple": "System.Void"
}
},
{
"name": "UpdateCommentStatusAsync",
"parametersOnMethod": [
{
"name": "id",
"typeAsString": "System.Guid, System.Private.CoreLib",
"type": "System.Guid",
"typeSimple": "string",
"isOptional": false,
"defaultValue": null
},
{
"name": "isApproved",
"typeAsString": "System.Boolean, System.Private.CoreLib",
"type": "System.Boolean",
"typeSimple": "boolean",
"isOptional": false,
"defaultValue": null
}
],
"returnValue": {
"type": "System.Void",
"typeSimple": "System.Void"
}
}
]
}
@ -1478,6 +1503,63 @@
},
"allowAnonymous": false,
"implementFrom": "Volo.CmsKit.Admin.Comments.ICommentAdminAppService"
},
"UpdateCommentStatusAsyncByIdAndIsApproved": {
"uniqueName": "UpdateCommentStatusAsyncByIdAndIsApproved",
"name": "UpdateCommentStatusAsync",
"httpMethod": "POST",
"url": "api/cms-kit-admin/comments/{id}",
"supportedVersions": [],
"parametersOnMethod": [
{
"name": "id",
"typeAsString": "System.Guid, System.Private.CoreLib",
"type": "System.Guid",
"typeSimple": "string",
"isOptional": false,
"defaultValue": null
},
{
"name": "isApproved",
"typeAsString": "System.Boolean, System.Private.CoreLib",
"type": "System.Boolean",
"typeSimple": "boolean",
"isOptional": false,
"defaultValue": null
}
],
"parameters": [
{
"nameOnMethod": "id",
"name": "id",
"jsonName": null,
"type": "System.Guid",
"typeSimple": "string",
"isOptional": false,
"defaultValue": null,
"constraintTypes": [],
"bindingSourceId": "Path",
"descriptorName": ""
},
{
"nameOnMethod": "isApproved",
"name": "isApproved",
"jsonName": null,
"type": "System.Boolean",
"typeSimple": "boolean",
"isOptional": false,
"defaultValue": null,
"constraintTypes": null,
"bindingSourceId": "ModelBinding",
"descriptorName": ""
}
],
"returnValue": {
"type": "System.Void",
"typeSimple": "System.Void"
},
"allowAnonymous": false,
"implementFrom": "Volo.CmsKit.Admin.Comments.ICommentAdminAppService"
}
}
},

8
modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Comments/CommentAdminController.cs

@ -47,4 +47,12 @@ public class CommentAdminController : CmsKitAdminController, ICommentAdminAppSer
{
return CommentAdminAppService.DeleteAsync(id);
}
[HttpPost]
[Route("{id}")]
public Task UpdateApprovalStatusAsync(Guid id, CommentApprovalDto commentApprovalDto)
{
return CommentAdminAppService.UpdateApprovalStatusAsync(id, commentApprovalDto);
}
}

41
modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Comments/details.js

@ -78,6 +78,26 @@ $(function (){
abp.notify.success(l('DeletedSuccessfully'));
});
}
},
{
text: function (data) {
return data.isApproved ? l('Revoke Approval') : l('Approve');
},
action: function (data) {
var newApprovalStatus = !data.record?.isApproved;
commentsService
.updateApprovalStatus(data.record.id, { IsApproved: newApprovalStatus })
.then(function () {
_dataTable.ajax.reloadEx();
var message = newApprovalStatus ? l('ApprovedSuccessfully') : l('ApprovalRevokedSuccessfully');
abp.notify.success(message);
})
.catch(function (error) {
console.log("error", error)
abp.notify.error(error.message);
});
}
}
]
}
@ -123,6 +143,27 @@ $(function (){
data: "creationTime",
orderable: true,
dataFormat: "datetime"
},
{
width: "10%",
title: l("Status"),
orderable: false,
data: "isApproved",
render: function (data, type, row) {
var icons = ''
if (data === null) {
icons = '<i class="fa-solid fa-hourglass-start"></i>';
} else if (typeof data === "boolean") {
if (data) {
icons = '<i class="fa-solid fa-check" style="color: #63E6BE;"></i>';
} else {
icons = '<i class="fa-solid fa-x" style="color: #e0102f;"></i>';
}
}
return icons;
}
}
]
}));

42
modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Comments/index.js

@ -86,6 +86,26 @@ $(function (){
abp.notify.success(l('DeletedSuccessfully'));
});
}
},
{
text: function (data) {
return data.isApproved ? l('Revoke Approval') : l('Approve');
},
action: function (data) {
var newApprovalStatus = !data.record?.isApproved;
commentsService
.updateApprovalStatus(data.record.id, { IsApproved: newApprovalStatus })
.then(function () {
_dataTable.ajax.reloadEx();
var message = newApprovalStatus ? l('ApprovedSuccessfully') : l('ApprovalRevokedSuccessfully');
abp.notify.success(message);
})
.catch(function (error) {
console.log("error", error)
abp.notify.error(error.message);
});
}
}
]
}
@ -153,6 +173,28 @@ $(function (){
data: "creationTime",
orderable: true,
dataFormat: "datetime"
},
{
width: "5%",
title: l("Status"),
orderable: false,
data: "isApproved",
render: function (data, type, row) {
var icons = ''
if (data === null) {
icons = '<i class="fa-solid fa-hourglass-start"></i>';
} else if (typeof data === "boolean") {
if (data) {
icons = '<i class="fa-solid fa-check" style="color: #63E6BE;"></i>';
} else {
icons = '<i class="fa-solid fa-x" style="color: #e0102f;"></i>';
}
}
return icons;
}
}
]
}));

371
modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js

@ -5,207 +5,230 @@
(function(){
// controller volo.cmsKit.admin.tags.entityTagAdmin
// controller volo.cmsKit.admin.blogs.blogAdmin
(function(){
abp.utils.createNamespace(window, 'volo.cmsKit.admin.tags.entityTagAdmin');
abp.utils.createNamespace(window, 'volo.cmsKit.admin.blogs.blogAdmin');
volo.cmsKit.admin.tags.entityTagAdmin.addTagToEntity = function(input, ajaxParams) {
volo.cmsKit.admin.blogs.blogAdmin.get = function(id, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/entity-tags',
url: abp.appPath + 'api/cms-kit-admin/blogs/' + id + '',
type: 'GET'
}, ajaxParams));
};
volo.cmsKit.admin.blogs.blogAdmin.getList = function(input, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/blogs' + abp.utils.buildQueryString([{ name: 'filter', value: input.filter }, { name: 'sorting', value: input.sorting }, { name: 'skipCount', value: input.skipCount }, { name: 'maxResultCount', value: input.maxResultCount }]) + '',
type: 'GET'
}, ajaxParams));
};
volo.cmsKit.admin.blogs.blogAdmin.create = function(input, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/blogs',
type: 'POST',
dataType: null,
data: JSON.stringify(input)
}, ajaxParams));
};
volo.cmsKit.admin.tags.entityTagAdmin.removeTagFromEntity = function(input, ajaxParams) {
volo.cmsKit.admin.blogs.blogAdmin.update = function(id, input, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/entity-tags' + abp.utils.buildQueryString([{ name: 'tagId', value: input.tagId }, { name: 'entityType', value: input.entityType }, { name: 'entityId', value: input.entityId }]) + '',
url: abp.appPath + 'api/cms-kit-admin/blogs/' + id + '',
type: 'PUT',
data: JSON.stringify(input)
}, ajaxParams));
};
volo.cmsKit.admin.blogs.blogAdmin['delete'] = function(id, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/blogs/' + id + '',
type: 'DELETE',
dataType: null
}, ajaxParams));
};
volo.cmsKit.admin.tags.entityTagAdmin.setEntityTags = function(input, ajaxParams) {
})();
// controller volo.cmsKit.admin.blogs.blogFeatureAdmin
(function(){
abp.utils.createNamespace(window, 'volo.cmsKit.admin.blogs.blogFeatureAdmin');
volo.cmsKit.admin.blogs.blogFeatureAdmin.getList = function(blogId, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/entity-tags',
url: abp.appPath + 'api/cms-kit-admin/blogs/' + blogId + '/features',
type: 'GET'
}, ajaxParams));
};
volo.cmsKit.admin.blogs.blogFeatureAdmin.set = function(blogId, dto, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/blogs/' + blogId + '/features',
type: 'PUT',
dataType: null,
data: JSON.stringify(input)
data: JSON.stringify(dto)
}, ajaxParams));
};
})();
// controller volo.cmsKit.admin.tags.tagAdmin
// controller volo.cmsKit.admin.blogs.blogPostAdmin
(function(){
abp.utils.createNamespace(window, 'volo.cmsKit.admin.tags.tagAdmin');
abp.utils.createNamespace(window, 'volo.cmsKit.admin.blogs.blogPostAdmin');
volo.cmsKit.admin.tags.tagAdmin.create = function(input, ajaxParams) {
volo.cmsKit.admin.blogs.blogPostAdmin.create = function(input, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/tags',
url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts',
type: 'POST',
data: JSON.stringify(input)
}, ajaxParams));
};
volo.cmsKit.admin.tags.tagAdmin['delete'] = function(id, ajaxParams) {
volo.cmsKit.admin.blogs.blogPostAdmin['delete'] = function(id, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/tags/' + id + '',
url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/' + id + '',
type: 'DELETE',
dataType: null
}, ajaxParams));
};
volo.cmsKit.admin.tags.tagAdmin.get = function(id, ajaxParams) {
volo.cmsKit.admin.blogs.blogPostAdmin.get = function(id, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/tags/' + id + '',
url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/' + id + '',
type: 'GET'
}, ajaxParams));
};
volo.cmsKit.admin.tags.tagAdmin.getList = function(input, ajaxParams) {
volo.cmsKit.admin.blogs.blogPostAdmin.getList = function(input, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/tags' + abp.utils.buildQueryString([{ name: 'filter', value: input.filter }, { name: 'sorting', value: input.sorting }, { name: 'skipCount', value: input.skipCount }, { name: 'maxResultCount', value: input.maxResultCount }]) + '',
url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts' + abp.utils.buildQueryString([{ name: 'filter', value: input.filter }, { name: 'blogId', value: input.blogId }, { name: 'authorId', value: input.authorId }, { name: 'tagId', value: input.tagId }, { name: 'status', value: input.status }, { name: 'sorting', value: input.sorting }, { name: 'skipCount', value: input.skipCount }, { name: 'maxResultCount', value: input.maxResultCount }]) + '',
type: 'GET'
}, ajaxParams));
};
volo.cmsKit.admin.tags.tagAdmin.update = function(id, input, ajaxParams) {
volo.cmsKit.admin.blogs.blogPostAdmin.update = function(id, input, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/tags/' + id + '',
url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/' + id + '',
type: 'PUT',
data: JSON.stringify(input)
}, ajaxParams));
};
volo.cmsKit.admin.tags.tagAdmin.getTagDefinitions = function(ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/tags/tag-definitions',
type: 'GET'
}, ajaxParams));
};
})();
// controller volo.cmsKit.admin.pages.pageAdmin
(function(){
abp.utils.createNamespace(window, 'volo.cmsKit.admin.pages.pageAdmin');
volo.cmsKit.admin.pages.pageAdmin.get = function(id, ajaxParams) {
volo.cmsKit.admin.blogs.blogPostAdmin.publish = function(id, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/pages/' + id + '',
type: 'GET'
url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/' + id + '/publish',
type: 'POST',
dataType: null
}, ajaxParams));
};
volo.cmsKit.admin.pages.pageAdmin.getList = function(input, ajaxParams) {
volo.cmsKit.admin.blogs.blogPostAdmin.draft = function(id, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/pages' + abp.utils.buildQueryString([{ name: 'filter', value: input.filter }, { name: 'sorting', value: input.sorting }, { name: 'skipCount', value: input.skipCount }, { name: 'maxResultCount', value: input.maxResultCount }]) + '',
type: 'GET'
url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/' + id + '/draft',
type: 'POST',
dataType: null
}, ajaxParams));
};
volo.cmsKit.admin.pages.pageAdmin.create = function(input, ajaxParams) {
volo.cmsKit.admin.blogs.blogPostAdmin.createAndPublish = function(input, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/pages',
url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/create-and-publish',
type: 'POST',
data: JSON.stringify(input)
}, ajaxParams));
};
volo.cmsKit.admin.pages.pageAdmin.update = function(id, input, ajaxParams) {
volo.cmsKit.admin.blogs.blogPostAdmin.sendToReview = function(id, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/pages/' + id + '',
type: 'PUT',
data: JSON.stringify(input)
url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/' + id + '/send-to-review',
type: 'POST',
dataType: null
}, ajaxParams));
};
volo.cmsKit.admin.pages.pageAdmin['delete'] = function(id, ajaxParams) {
volo.cmsKit.admin.blogs.blogPostAdmin.createAndSendToReview = function(input, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/pages/' + id + '',
type: 'DELETE',
dataType: null
url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/create-and-send-to-review',
type: 'POST',
data: JSON.stringify(input)
}, ajaxParams));
};
volo.cmsKit.admin.pages.pageAdmin.setAsHomePage = function(id, ajaxParams) {
volo.cmsKit.admin.blogs.blogPostAdmin.hasBlogPostWaitingForReview = function(ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/pages/setashomepage/' + id + '',
type: 'PUT',
dataType: null
url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/has-blogpost-waiting-for-review',
type: 'GET'
}, ajaxParams));
};
})();
// controller volo.cmsKit.admin.menus.menuItemAdmin
// controller volo.cmsKit.admin.comments.commentAdmin
(function(){
abp.utils.createNamespace(window, 'volo.cmsKit.admin.menus.menuItemAdmin');
abp.utils.createNamespace(window, 'volo.cmsKit.admin.comments.commentAdmin');
volo.cmsKit.admin.menus.menuItemAdmin.getList = function(ajaxParams) {
volo.cmsKit.admin.comments.commentAdmin.getList = function(input, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/menu-items',
url: abp.appPath + 'api/cms-kit-admin/comments' + abp.utils.buildQueryString([{ name: 'entityType', value: input.entityType }, { name: 'text', value: input.text }, { name: 'repliedCommentId', value: input.repliedCommentId }, { name: 'author', value: input.author }, { name: 'creationStartDate', value: input.creationStartDate }, { name: 'creationEndDate', value: input.creationEndDate }, { name: 'sorting', value: input.sorting }, { name: 'skipCount', value: input.skipCount }, { name: 'maxResultCount', value: input.maxResultCount }]) + '',
type: 'GET'
}, ajaxParams));
};
volo.cmsKit.admin.menus.menuItemAdmin.get = function(id, ajaxParams) {
volo.cmsKit.admin.comments.commentAdmin.get = function(id, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/menu-items/' + id + '',
url: abp.appPath + 'api/cms-kit-admin/comments/' + id + '',
type: 'GET'
}, ajaxParams));
};
volo.cmsKit.admin.menus.menuItemAdmin.create = function(input, ajaxParams) {
volo.cmsKit.admin.comments.commentAdmin['delete'] = function(id, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/menu-items',
type: 'POST',
data: JSON.stringify(input)
url: abp.appPath + 'api/cms-kit-admin/comments/' + id + '',
type: 'DELETE',
dataType: null
}, ajaxParams));
};
volo.cmsKit.admin.menus.menuItemAdmin.update = function(id, input, ajaxParams) {
volo.cmsKit.admin.comments.commentAdmin.updateApprovalStatus = function(id, commentApprovalDto, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/menu-items/' + id + '',
type: 'PUT',
data: JSON.stringify(input)
url: abp.appPath + 'api/cms-kit-admin/comments/' + id + '',
type: 'POST',
dataType: null,
data: JSON.stringify(commentApprovalDto)
}, ajaxParams));
};
volo.cmsKit.admin.menus.menuItemAdmin['delete'] = function(id, ajaxParams) {
})();
// controller volo.cmsKit.admin.globalResources.globalResourceAdmin
(function(){
abp.utils.createNamespace(window, 'volo.cmsKit.admin.globalResources.globalResourceAdmin');
volo.cmsKit.admin.globalResources.globalResourceAdmin.get = function(ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/menu-items/' + id + '',
type: 'DELETE',
dataType: null
url: abp.appPath + 'api/cms-kit-admin/global-resources',
type: 'GET'
}, ajaxParams));
};
volo.cmsKit.admin.menus.menuItemAdmin.moveMenuItem = function(id, input, ajaxParams) {
volo.cmsKit.admin.globalResources.globalResourceAdmin.setGlobalResources = function(input, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/menu-items/' + id + '/move',
type: 'PUT',
url: abp.appPath + 'api/cms-kit-admin/global-resources',
type: 'POST',
dataType: null,
data: JSON.stringify(input)
}, ajaxParams));
};
volo.cmsKit.admin.menus.menuItemAdmin.getPageLookup = function(input, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/menu-items/lookup/pages' + abp.utils.buildQueryString([{ name: 'filter', value: input.filter }, { name: 'sorting', value: input.sorting }, { name: 'skipCount', value: input.skipCount }, { name: 'maxResultCount', value: input.maxResultCount }]) + '',
type: 'GET'
}, ajaxParams));
};
})();
// controller volo.cmsKit.admin.mediaDescriptors.mediaDescriptorAdmin
@ -231,217 +254,203 @@
})();
// controller volo.cmsKit.admin.globalResources.globalResourceAdmin
// controller volo.cmsKit.admin.menus.menuItemAdmin
(function(){
abp.utils.createNamespace(window, 'volo.cmsKit.admin.globalResources.globalResourceAdmin');
abp.utils.createNamespace(window, 'volo.cmsKit.admin.menus.menuItemAdmin');
volo.cmsKit.admin.globalResources.globalResourceAdmin.get = function(ajaxParams) {
volo.cmsKit.admin.menus.menuItemAdmin.getList = function(ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/global-resources',
url: abp.appPath + 'api/cms-kit-admin/menu-items',
type: 'GET'
}, ajaxParams));
};
volo.cmsKit.admin.globalResources.globalResourceAdmin.setGlobalResources = function(input, ajaxParams) {
volo.cmsKit.admin.menus.menuItemAdmin.get = function(id, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/global-resources',
url: abp.appPath + 'api/cms-kit-admin/menu-items/' + id + '',
type: 'GET'
}, ajaxParams));
};
volo.cmsKit.admin.menus.menuItemAdmin.create = function(input, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/menu-items',
type: 'POST',
dataType: null,
data: JSON.stringify(input)
}, ajaxParams));
};
})();
// controller volo.cmsKit.admin.comments.commentAdmin
(function(){
abp.utils.createNamespace(window, 'volo.cmsKit.admin.comments.commentAdmin');
volo.cmsKit.admin.menus.menuItemAdmin.update = function(id, input, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/menu-items/' + id + '',
type: 'PUT',
data: JSON.stringify(input)
}, ajaxParams));
};
volo.cmsKit.admin.comments.commentAdmin.getList = function(input, ajaxParams) {
volo.cmsKit.admin.menus.menuItemAdmin['delete'] = function(id, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/comments' + abp.utils.buildQueryString([{ name: 'entityType', value: input.entityType }, { name: 'text', value: input.text }, { name: 'repliedCommentId', value: input.repliedCommentId }, { name: 'author', value: input.author }, { name: 'creationStartDate', value: input.creationStartDate }, { name: 'creationEndDate', value: input.creationEndDate }, { name: 'sorting', value: input.sorting }, { name: 'skipCount', value: input.skipCount }, { name: 'maxResultCount', value: input.maxResultCount }]) + '',
type: 'GET'
url: abp.appPath + 'api/cms-kit-admin/menu-items/' + id + '',
type: 'DELETE',
dataType: null
}, ajaxParams));
};
volo.cmsKit.admin.comments.commentAdmin.get = function(id, ajaxParams) {
volo.cmsKit.admin.menus.menuItemAdmin.moveMenuItem = function(id, input, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/comments/' + id + '',
type: 'GET'
url: abp.appPath + 'api/cms-kit-admin/menu-items/' + id + '/move',
type: 'PUT',
dataType: null,
data: JSON.stringify(input)
}, ajaxParams));
};
volo.cmsKit.admin.comments.commentAdmin['delete'] = function(id, ajaxParams) {
volo.cmsKit.admin.menus.menuItemAdmin.getPageLookup = function(input, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/comments/' + id + '',
type: 'DELETE',
dataType: null
url: abp.appPath + 'api/cms-kit-admin/menu-items/lookup/pages' + abp.utils.buildQueryString([{ name: 'filter', value: input.filter }, { name: 'sorting', value: input.sorting }, { name: 'skipCount', value: input.skipCount }, { name: 'maxResultCount', value: input.maxResultCount }]) + '',
type: 'GET'
}, ajaxParams));
};
})();
// controller volo.cmsKit.admin.blogs.blogAdmin
// controller volo.cmsKit.admin.pages.pageAdmin
(function(){
abp.utils.createNamespace(window, 'volo.cmsKit.admin.blogs.blogAdmin');
abp.utils.createNamespace(window, 'volo.cmsKit.admin.pages.pageAdmin');
volo.cmsKit.admin.blogs.blogAdmin.get = function(id, ajaxParams) {
volo.cmsKit.admin.pages.pageAdmin.get = function(id, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/blogs/' + id + '',
url: abp.appPath + 'api/cms-kit-admin/pages/' + id + '',
type: 'GET'
}, ajaxParams));
};
volo.cmsKit.admin.blogs.blogAdmin.getList = function(input, ajaxParams) {
volo.cmsKit.admin.pages.pageAdmin.getList = function(input, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/blogs' + abp.utils.buildQueryString([{ name: 'filter', value: input.filter }, { name: 'sorting', value: input.sorting }, { name: 'skipCount', value: input.skipCount }, { name: 'maxResultCount', value: input.maxResultCount }]) + '',
url: abp.appPath + 'api/cms-kit-admin/pages' + abp.utils.buildQueryString([{ name: 'filter', value: input.filter }, { name: 'sorting', value: input.sorting }, { name: 'skipCount', value: input.skipCount }, { name: 'maxResultCount', value: input.maxResultCount }]) + '',
type: 'GET'
}, ajaxParams));
};
volo.cmsKit.admin.blogs.blogAdmin.create = function(input, ajaxParams) {
volo.cmsKit.admin.pages.pageAdmin.create = function(input, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/blogs',
url: abp.appPath + 'api/cms-kit-admin/pages',
type: 'POST',
data: JSON.stringify(input)
}, ajaxParams));
};
volo.cmsKit.admin.blogs.blogAdmin.update = function(id, input, ajaxParams) {
volo.cmsKit.admin.pages.pageAdmin.update = function(id, input, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/blogs/' + id + '',
url: abp.appPath + 'api/cms-kit-admin/pages/' + id + '',
type: 'PUT',
data: JSON.stringify(input)
}, ajaxParams));
};
volo.cmsKit.admin.blogs.blogAdmin['delete'] = function(id, ajaxParams) {
volo.cmsKit.admin.pages.pageAdmin['delete'] = function(id, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/blogs/' + id + '',
url: abp.appPath + 'api/cms-kit-admin/pages/' + id + '',
type: 'DELETE',
dataType: null
}, ajaxParams));
};
})();
// controller volo.cmsKit.admin.blogs.blogFeatureAdmin
(function(){
abp.utils.createNamespace(window, 'volo.cmsKit.admin.blogs.blogFeatureAdmin');
volo.cmsKit.admin.blogs.blogFeatureAdmin.getList = function(blogId, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/blogs/' + blogId + '/features',
type: 'GET'
}, ajaxParams));
};
volo.cmsKit.admin.blogs.blogFeatureAdmin.set = function(blogId, dto, ajaxParams) {
volo.cmsKit.admin.pages.pageAdmin.setAsHomePage = function(id, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/blogs/' + blogId + '/features',
url: abp.appPath + 'api/cms-kit-admin/pages/setashomepage/' + id + '',
type: 'PUT',
dataType: null,
data: JSON.stringify(dto)
dataType: null
}, ajaxParams));
};
})();
// controller volo.cmsKit.admin.blogs.blogPostAdmin
// controller volo.cmsKit.admin.tags.entityTagAdmin
(function(){
abp.utils.createNamespace(window, 'volo.cmsKit.admin.blogs.blogPostAdmin');
abp.utils.createNamespace(window, 'volo.cmsKit.admin.tags.entityTagAdmin');
volo.cmsKit.admin.blogs.blogPostAdmin.create = function(input, ajaxParams) {
volo.cmsKit.admin.tags.entityTagAdmin.addTagToEntity = function(input, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts',
url: abp.appPath + 'api/cms-kit-admin/entity-tags',
type: 'POST',
dataType: null,
data: JSON.stringify(input)
}, ajaxParams));
};
volo.cmsKit.admin.blogs.blogPostAdmin['delete'] = function(id, ajaxParams) {
volo.cmsKit.admin.tags.entityTagAdmin.removeTagFromEntity = function(input, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/' + id + '',
url: abp.appPath + 'api/cms-kit-admin/entity-tags' + abp.utils.buildQueryString([{ name: 'tagId', value: input.tagId }, { name: 'entityType', value: input.entityType }, { name: 'entityId', value: input.entityId }]) + '',
type: 'DELETE',
dataType: null
}, ajaxParams));
};
volo.cmsKit.admin.blogs.blogPostAdmin.get = function(id, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/' + id + '',
type: 'GET'
}, ajaxParams));
};
volo.cmsKit.admin.blogs.blogPostAdmin.getList = function(input, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts' + abp.utils.buildQueryString([{ name: 'filter', value: input.filter }, { name: 'blogId', value: input.blogId }, { name: 'authorId', value: input.authorId }, { name: 'tagId', value: input.tagId }, { name: 'status', value: input.status }, { name: 'sorting', value: input.sorting }, { name: 'skipCount', value: input.skipCount }, { name: 'maxResultCount', value: input.maxResultCount }]) + '',
type: 'GET'
}, ajaxParams));
};
volo.cmsKit.admin.blogs.blogPostAdmin.update = function(id, input, ajaxParams) {
volo.cmsKit.admin.tags.entityTagAdmin.setEntityTags = function(input, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/' + id + '',
url: abp.appPath + 'api/cms-kit-admin/entity-tags',
type: 'PUT',
dataType: null,
data: JSON.stringify(input)
}, ajaxParams));
};
volo.cmsKit.admin.blogs.blogPostAdmin.publish = function(id, ajaxParams) {
})();
// controller volo.cmsKit.admin.tags.tagAdmin
(function(){
abp.utils.createNamespace(window, 'volo.cmsKit.admin.tags.tagAdmin');
volo.cmsKit.admin.tags.tagAdmin.create = function(input, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/' + id + '/publish',
url: abp.appPath + 'api/cms-kit-admin/tags',
type: 'POST',
dataType: null
data: JSON.stringify(input)
}, ajaxParams));
};
volo.cmsKit.admin.blogs.blogPostAdmin.draft = function(id, ajaxParams) {
volo.cmsKit.admin.tags.tagAdmin['delete'] = function(id, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/' + id + '/draft',
type: 'POST',
url: abp.appPath + 'api/cms-kit-admin/tags/' + id + '',
type: 'DELETE',
dataType: null
}, ajaxParams));
};
volo.cmsKit.admin.blogs.blogPostAdmin.createAndPublish = function(input, ajaxParams) {
volo.cmsKit.admin.tags.tagAdmin.get = function(id, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/create-and-publish',
type: 'POST',
data: JSON.stringify(input)
url: abp.appPath + 'api/cms-kit-admin/tags/' + id + '',
type: 'GET'
}, ajaxParams));
};
volo.cmsKit.admin.blogs.blogPostAdmin.sendToReview = function(id, ajaxParams) {
volo.cmsKit.admin.tags.tagAdmin.getList = function(input, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/' + id + '/send-to-review',
type: 'POST',
dataType: null
url: abp.appPath + 'api/cms-kit-admin/tags' + abp.utils.buildQueryString([{ name: 'filter', value: input.filter }, { name: 'sorting', value: input.sorting }, { name: 'skipCount', value: input.skipCount }, { name: 'maxResultCount', value: input.maxResultCount }]) + '',
type: 'GET'
}, ajaxParams));
};
volo.cmsKit.admin.blogs.blogPostAdmin.createAndSendToReview = function(input, ajaxParams) {
volo.cmsKit.admin.tags.tagAdmin.update = function(id, input, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/create-and-send-to-review',
type: 'POST',
url: abp.appPath + 'api/cms-kit-admin/tags/' + id + '',
type: 'PUT',
data: JSON.stringify(input)
}, ajaxParams));
};
volo.cmsKit.admin.blogs.blogPostAdmin.hasBlogPostWaitingForReview = function(ajaxParams) {
volo.cmsKit.admin.tags.tagAdmin.getTagDefinitions = function(ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/has-blogpost-waiting-for-review',
url: abp.appPath + 'api/cms-kit-admin/tags/tag-definitions',
type: 'GET'
}, ajaxParams));
};

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

@ -26,8 +26,9 @@ public class Comment : AggregateRoot<Guid>, IHasCreationTime, IMustHaveCreator,
public virtual string Url { get; set; }
public virtual string IdempotencyToken { get; set; }
public virtual bool? IsApproved { get; set; }
protected Comment()
protected Comment()
{
}

78
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Comments/ICommentRepository.cs

@ -9,41 +9,45 @@ namespace Volo.CmsKit.Comments;
public interface ICommentRepository : IBasicRepository<Comment, Guid>
{
Task<CommentWithAuthorQueryResultItem> GetWithAuthorAsync(Guid id, CancellationToken cancellationToken = default);
Task<List<CommentWithAuthorQueryResultItem>> GetListAsync(
string filter = null,
string entityType = null,
Guid? repliedCommentId = null,
string authorUsername = null,
DateTime? creationStartDate = null,
DateTime? creationEndDate = null,
string sorting = null,
int maxResultCount = int.MaxValue,
int skipCount = 0,
CancellationToken cancellationToken = default
);
Task<long> GetCountAsync(
string text = null,
string entityType = null,
Guid? repliedCommentId = null,
string authorUsername = null,
DateTime? creationStartDate = null,
DateTime? creationEndDate = null,
CancellationToken cancellationToken = default
);
Task<List<CommentWithAuthorQueryResultItem>> GetListWithAuthorsAsync(
[NotNull] string entityType,
[NotNull] string entityId,
CancellationToken cancellationToken = default
);
Task DeleteWithRepliesAsync(
Comment comment,
CancellationToken cancellationToken = default
);
Task<bool> ExistsAsync(string idempotencyToken, CancellationToken cancellationToken = default);
Task<CommentWithAuthorQueryResultItem> GetWithAuthorAsync(Guid id, CancellationToken cancellationToken = default);
Task<List<CommentWithAuthorQueryResultItem>> GetListAsync(
string filter = null,
string entityType = null,
Guid? repliedCommentId = null,
string authorUsername = null,
DateTime? creationStartDate = null,
DateTime? creationEndDate = null,
string sorting = null,
int maxResultCount = int.MaxValue,
int skipCount = 0,
bool? isApproved = null,
CancellationToken cancellationToken = default
);
Task<long> GetCountAsync(
string text = null,
string entityType = null,
Guid? repliedCommentId = null,
string authorUsername = null,
DateTime? creationStartDate = null,
DateTime? creationEndDate = null,
bool? isApproved = null,
CancellationToken cancellationToken = default
);
Task<List<CommentWithAuthorQueryResultItem>> GetListWithAuthorsAsync(
[NotNull] string entityType,
[NotNull] string entityId,
CancellationToken cancellationToken = default
);
Task DeleteWithRepliesAsync(
Comment comment,
CancellationToken cancellationToken = default
);
Task<bool> ExistsAsync(string idempotencyToken, CancellationToken cancellationToken = default);
}

327
modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Comments/EfCoreCommentRepository.cs

@ -15,164 +15,173 @@ using Volo.CmsKit.Users;
namespace Volo.CmsKit.Comments;
public class EfCoreCommentRepository : EfCoreRepository<ICmsKitDbContext, Comment, Guid>,
ICommentRepository
ICommentRepository
{
public EfCoreCommentRepository(IDbContextProvider<ICmsKitDbContext> dbContextProvider)
: base(dbContextProvider)
{
}
public virtual async Task<CommentWithAuthorQueryResultItem> GetWithAuthorAsync(Guid id,
CancellationToken cancellationToken = default)
{
var query = from comment in (await GetDbSetAsync())
join user in (await GetDbContextAsync()).Set<CmsUser>() on comment.CreatorId equals user.Id
where id == comment.Id
select new CommentWithAuthorQueryResultItem
{
Comment = comment,
Author = user
};
var commentWithAuthor = await query.FirstOrDefaultAsync(GetCancellationToken(cancellationToken));
if (commentWithAuthor == null)
{
throw new EntityNotFoundException(typeof(Comment), id);
}
return commentWithAuthor;
}
public virtual async Task<List<CommentWithAuthorQueryResultItem>> GetListAsync(
string filter = null,
string entityType = null,
Guid? repliedCommentId = null,
string authorUsername = null,
DateTime? creationStartDate = null,
DateTime? creationEndDate = null,
string sorting = null,
int maxResultCount = int.MaxValue,
int skipCount = 0,
CancellationToken cancellationToken = default
)
{
var token = GetCancellationToken(cancellationToken);
var query = await GetListQueryAsync(
filter,
entityType,
repliedCommentId,
authorUsername,
creationStartDate,
creationEndDate,
token);
if (!sorting.IsNullOrEmpty())
{
sorting = "comment." + sorting;
}
query = query.OrderBy(sorting.IsNullOrEmpty() ? "comment.creationTime desc" : sorting)
.PageBy(skipCount, maxResultCount);
return await query.ToListAsync(token);
}
public virtual async Task<long> GetCountAsync(
string text = null,
string entityType = null,
Guid? repliedCommentId = null,
string authorUsername = null,
DateTime? creationStartDate = null,
DateTime? creationEndDate = null,
CancellationToken cancellationToken = default
)
{
var token = GetCancellationToken(cancellationToken);
var query = await GetListQueryAsync(
text,
entityType,
repliedCommentId,
authorUsername,
creationStartDate,
creationEndDate,
token);
return await query.LongCountAsync(token);
}
public virtual async Task<List<CommentWithAuthorQueryResultItem>> GetListWithAuthorsAsync(
string entityType,
string entityId,
CancellationToken cancellationToken = default)
{
Check.NotNullOrWhiteSpace(entityType, nameof(entityType));
Check.NotNullOrWhiteSpace(entityId, nameof(entityId));
var query = from comment in (await GetDbSetAsync())
join user in (await GetDbContextAsync()).Set<CmsUser>() on comment.CreatorId equals user.Id
where entityType == comment.EntityType && entityId == comment.EntityId
orderby comment.CreationTime
select new CommentWithAuthorQueryResultItem
{
Comment = comment,
Author = user
};
return await query.ToListAsync(GetCancellationToken(cancellationToken));
}
public virtual async Task DeleteWithRepliesAsync(
Comment comment,
CancellationToken cancellationToken = default)
{
var replies = await (await GetDbSetAsync())
.Where(x => x.RepliedCommentId == comment.Id)
.ToListAsync(GetCancellationToken(cancellationToken));
foreach (var reply in replies)
{
await DeleteAsync(
reply,
cancellationToken: GetCancellationToken(cancellationToken)
);
}
await DeleteAsync(comment, cancellationToken: GetCancellationToken(cancellationToken));
}
public virtual async Task<bool> ExistsAsync(string idempotencyToken, CancellationToken cancellationToken = default)
{
return await (await GetDbSetAsync()).AnyAsync(x => x.IdempotencyToken == idempotencyToken, GetCancellationToken(cancellationToken));
}
protected virtual async Task<IQueryable<CommentWithAuthorQueryResultItem>> GetListQueryAsync(
string filter = null,
string entityType = null,
Guid? repliedCommentId = null,
string authorUsername = null,
DateTime? creationStartDate = null,
DateTime? creationEndDate = null,
CancellationToken cancellationToken = default
)
{
var commentDbSet = await GetDbSetAsync();
var cmsUserSet = (await GetDbContextAsync()).Set<CmsUser>();
var query = from comment in commentDbSet
join user in cmsUserSet
on comment.CreatorId equals user.Id
select new CommentWithAuthorQueryResultItem
{
Comment = comment,
Author = user
};
return query.WhereIf(!filter.IsNullOrWhiteSpace(), c => c.Comment.Text.Contains(filter))
.WhereIf(!entityType.IsNullOrWhiteSpace(), c => c.Comment.EntityType.Contains(entityType))
.WhereIf(repliedCommentId.HasValue, c => c.Comment.RepliedCommentId == repliedCommentId)
.WhereIf(!authorUsername.IsNullOrWhiteSpace(), c => c.Author.UserName.Contains(authorUsername))
.WhereIf(creationStartDate.HasValue, c => c.Comment.CreationTime >= creationStartDate)
.WhereIf(creationEndDate.HasValue, c => c.Comment.CreationTime <= creationEndDate);
}
public EfCoreCommentRepository(IDbContextProvider<ICmsKitDbContext> dbContextProvider)
: base(dbContextProvider)
{
}
public virtual async Task<CommentWithAuthorQueryResultItem> GetWithAuthorAsync(Guid id,
CancellationToken cancellationToken = default)
{
var query = from comment in (await GetDbSetAsync())
join user in (await GetDbContextAsync()).Set<CmsUser>() on comment.CreatorId equals user.Id
where id == comment.Id
select new CommentWithAuthorQueryResultItem
{
Comment = comment,
Author = user
};
var commentWithAuthor = await query.FirstOrDefaultAsync(GetCancellationToken(cancellationToken));
if (commentWithAuthor == null)
{
throw new EntityNotFoundException(typeof(Comment), id);
}
return commentWithAuthor;
}
public virtual async Task<List<CommentWithAuthorQueryResultItem>> GetListAsync(
string filter = null,
string entityType = null,
Guid? repliedCommentId = null,
string authorUsername = null,
DateTime? creationStartDate = null,
DateTime? creationEndDate = null,
string sorting = null,
int maxResultCount = int.MaxValue,
int skipCount = 0,
bool? isApproved = null,
CancellationToken cancellationToken = default
)
{
var token = GetCancellationToken(cancellationToken);
var query = await GetListQueryAsync(
filter,
entityType,
repliedCommentId,
authorUsername,
creationStartDate,
creationEndDate,
isApproved,
token);
if (!sorting.IsNullOrEmpty())
{
sorting = "comment." + sorting;
}
query = query.OrderBy(sorting.IsNullOrEmpty() ? "comment.creationTime desc" : sorting)
.PageBy(skipCount, maxResultCount);
return await query.ToListAsync(token);
}
public virtual async Task<long> GetCountAsync(
string text = null,
string entityType = null,
Guid? repliedCommentId = null,
string authorUsername = null,
DateTime? creationStartDate = null,
DateTime? creationEndDate = null,
bool? isApproved = null,
CancellationToken cancellationToken = default
)
{
var token = GetCancellationToken(cancellationToken);
var query = await GetListQueryAsync(
text,
entityType,
repliedCommentId,
authorUsername,
creationStartDate,
creationEndDate,
isApproved,
token);
return await query.LongCountAsync(token);
}
public virtual async Task<List<CommentWithAuthorQueryResultItem>> GetListWithAuthorsAsync(
string entityType,
string entityId,
CancellationToken cancellationToken = default)
{
Check.NotNullOrWhiteSpace(entityType, nameof(entityType));
Check.NotNullOrWhiteSpace(entityId, nameof(entityId));
var query = from comment in (await GetDbSetAsync())
join user in (await GetDbContextAsync()).Set<CmsUser>() on comment.CreatorId equals user.Id
where entityType == comment.EntityType && entityId == comment.EntityId
orderby comment.CreationTime
select new CommentWithAuthorQueryResultItem
{
Comment = comment,
Author = user
};
return await query.ToListAsync(GetCancellationToken(cancellationToken));
}
public virtual async Task DeleteWithRepliesAsync(
Comment comment,
CancellationToken cancellationToken = default)
{
var replies = await (await GetDbSetAsync())
.Where(x => x.RepliedCommentId == comment.Id)
.ToListAsync(GetCancellationToken(cancellationToken));
foreach (var reply in replies)
{
await DeleteAsync(
reply,
cancellationToken: GetCancellationToken(cancellationToken)
);
}
await DeleteAsync(comment, cancellationToken: GetCancellationToken(cancellationToken));
}
public virtual async Task<bool> ExistsAsync(string idempotencyToken, CancellationToken cancellationToken = default)
{
return await (await GetDbSetAsync()).AnyAsync(x => x.IdempotencyToken == idempotencyToken, GetCancellationToken(cancellationToken));
}
protected virtual async Task<IQueryable<CommentWithAuthorQueryResultItem>> GetListQueryAsync(
string filter = null,
string entityType = null,
Guid? repliedCommentId = null,
string authorUsername = null,
DateTime? creationStartDate = null,
DateTime? creationEndDate = null,
bool? isApproved = null,
CancellationToken cancellationToken = default
)
{
var commentDbSet = await GetDbSetAsync();
var cmsUserSet = (await GetDbContextAsync()).Set<CmsUser>();
var query = from comment in commentDbSet
join user in cmsUserSet
on comment.CreatorId equals user.Id
select new CommentWithAuthorQueryResultItem
{
Comment = comment,
Author = user
};
return query.WhereIf(!filter.IsNullOrWhiteSpace(), c => c.Comment.Text.Contains(filter))
.WhereIf(!entityType.IsNullOrWhiteSpace(), c => c.Comment.EntityType.Contains(entityType))
.WhereIf(repliedCommentId.HasValue, c => c.Comment.RepliedCommentId == repliedCommentId)
.WhereIf(!authorUsername.IsNullOrWhiteSpace(), c => c.Author.UserName.Contains(authorUsername))
.WhereIf(creationStartDate.HasValue, c => c.Comment.CreationTime >= creationStartDate)
.WhereIf(creationEndDate.HasValue, c => c.Comment.CreationTime <= creationEndDate)
.WhereIf(isApproved.HasValue, c => c.Comment.IsApproved == isApproved);
}
}

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

@ -16,180 +16,186 @@ namespace Volo.CmsKit.MongoDB.Comments;
public class MongoCommentRepository : MongoDbRepository<ICmsKitMongoDbContext, Comment, Guid>, ICommentRepository
{
public MongoCommentRepository(IMongoDbContextProvider<ICmsKitMongoDbContext> dbContextProvider) : base(dbContextProvider)
{
}
public virtual async Task<CommentWithAuthorQueryResultItem> GetWithAuthorAsync(Guid id, CancellationToken cancellationToken = default)
{
var comment = await GetAsync(id);
var author = await (await GetDbContextAsync())
.CmsUsers
.AsQueryable()
.FirstOrDefaultAsync(x => x.Id == comment.CreatorId, GetCancellationToken(cancellationToken));
return new CommentWithAuthorQueryResultItem()
{
Comment = comment,
Author = author
};
}
public virtual async Task<List<CommentWithAuthorQueryResultItem>> GetListAsync(
string filter = null,
string entityType = null,
Guid? repliedCommentId = null,
string authorUsername = null,
DateTime? creationStartDate = null,
DateTime? creationEndDate = null,
string sorting = null,
int maxResultCount = int.MaxValue,
int skipCount = 0,
CancellationToken cancellationToken = default
)
{
var token = GetCancellationToken(cancellationToken);
var query = await GetListQueryAsync(
filter,
entityType,
repliedCommentId,
authorUsername,
creationStartDate,
creationEndDate,
token);
var comments = await query.OrderBy(sorting.IsNullOrEmpty() ? "creationTime desc" : sorting)
.As<IMongoQueryable<Comment>>()
.PageBy<Comment, IMongoQueryable<Comment>>(skipCount, maxResultCount)
.ToListAsync(token);
var commentIds = comments.Select(x => x.Id).ToList();
var authorsQuery = from comment in (await GetMongoQueryableAsync(token))
join user in (await GetDbContextAsync(token)).CmsUsers on comment.CreatorId equals user.Id
where commentIds.Contains(comment.Id)
orderby comment.CreationTime
select user;
var authors = await ApplyDataFilters<IMongoQueryable<CmsUser>, CmsUser>(authorsQuery).ToListAsync(token);
return comments
.Select(
comment =>
new CommentWithAuthorQueryResultItem
{
Comment = comment,
Author = authors.FirstOrDefault(a => a.Id == comment.CreatorId)
}).ToList();
}
public virtual async Task<long> GetCountAsync(
string text = null,
string entityType = null,
Guid? repliedCommentId = null,
string authorUsername = null,
DateTime? creationStartDate = null,
DateTime? creationEndDate = null,
CancellationToken cancellationToken = default
)
{
var query = await GetListQueryAsync(
text,
entityType,
repliedCommentId,
authorUsername,
creationStartDate,
creationEndDate,
cancellationToken);
return await query.As<IMongoQueryable<Comment>>()
.LongCountAsync(GetCancellationToken(cancellationToken));
}
public virtual async Task<List<CommentWithAuthorQueryResultItem>> GetListWithAuthorsAsync(
string entityType,
string entityId,
CancellationToken cancellationToken = default)
{
Check.NotNullOrWhiteSpace(entityType, nameof(entityType));
Check.NotNullOrWhiteSpace(entityId, nameof(entityId));
var authorsQuery = from comment in (await GetMongoQueryableAsync(cancellationToken))
join user in (await GetDbContextAsync(cancellationToken)).CmsUsers on comment.CreatorId equals user.Id
where entityType == comment.EntityType && entityId == comment.EntityId
orderby comment.CreationTime
select user;
var authors = await ApplyDataFilters<IMongoQueryable<CmsUser>, CmsUser>(authorsQuery).ToListAsync(GetCancellationToken(cancellationToken));
var comments = await (await GetMongoQueryableAsync(cancellationToken))
.Where(c => c.EntityId == entityId && c.EntityType == entityType)
.OrderBy(c => c.CreationTime)
.ToListAsync(GetCancellationToken(cancellationToken));
return comments
.Select(
comment =>
new CommentWithAuthorQueryResultItem
{
Comment = comment,
Author = authors.FirstOrDefault(a => a.Id == comment.CreatorId)
}).ToList();
}
public virtual async Task DeleteWithRepliesAsync(
Comment comment,
CancellationToken cancellationToken = default)
{
var replies = await (await GetMongoQueryableAsync(cancellationToken))
.Where(x => x.RepliedCommentId == comment.Id)
.ToListAsync(GetCancellationToken(cancellationToken));
await base.DeleteAsync(
comment,
cancellationToken: GetCancellationToken(cancellationToken)
);
foreach (var reply in replies)
{
await base.DeleteAsync(
reply,
cancellationToken: GetCancellationToken(cancellationToken)
);
}
}
public virtual async Task<bool> ExistsAsync(string idempotencyToken, CancellationToken cancellationToken = default)
{
return await (await GetMongoQueryableAsync(cancellationToken))
.AnyAsync(x => x.IdempotencyToken == idempotencyToken, GetCancellationToken(cancellationToken));
}
protected virtual async Task<IQueryable<Comment>> GetListQueryAsync(
string filter = null,
string entityType = null,
Guid? repliedCommentId = null,
string authorUsername = null,
DateTime? creationStartDate = null,
DateTime? creationEndDate = null,
CancellationToken cancellationToken = default
)
{
var queryable = await GetMongoQueryableAsync(cancellationToken);
if (!string.IsNullOrEmpty(authorUsername))
{
var author = await (await GetMongoQueryableAsync<CmsUser>(cancellationToken)).FirstOrDefaultAsync(x => x.UserName == authorUsername, cancellationToken: cancellationToken);
var authorId = author?.Id ?? Guid.Empty;
queryable = queryable.Where(x => x.CreatorId == authorId);
}
return queryable.WhereIf(!filter.IsNullOrWhiteSpace(), c => c.Text.Contains(filter))
.WhereIf(!entityType.IsNullOrWhiteSpace(), c => c.EntityType == entityType)
.WhereIf(repliedCommentId.HasValue, c => c.RepliedCommentId == repliedCommentId)
.WhereIf(creationStartDate.HasValue, c => c.CreationTime >= creationStartDate)
.WhereIf(creationEndDate.HasValue, c => c.CreationTime <= creationEndDate);
}
public MongoCommentRepository(IMongoDbContextProvider<ICmsKitMongoDbContext> dbContextProvider) : base(dbContextProvider)
{
}
public virtual async Task<CommentWithAuthorQueryResultItem> GetWithAuthorAsync(Guid id, CancellationToken cancellationToken = default)
{
var comment = await GetAsync(id);
var author = await (await GetDbContextAsync())
.CmsUsers
.AsQueryable()
.FirstOrDefaultAsync(x => x.Id == comment.CreatorId, GetCancellationToken(cancellationToken));
return new CommentWithAuthorQueryResultItem()
{
Comment = comment,
Author = author
};
}
public virtual async Task<List<CommentWithAuthorQueryResultItem>> GetListAsync(
string filter = null,
string entityType = null,
Guid? repliedCommentId = null,
string authorUsername = null,
DateTime? creationStartDate = null,
DateTime? creationEndDate = null,
string sorting = null,
int maxResultCount = int.MaxValue,
int skipCount = 0,
bool? isApproved = null,
CancellationToken cancellationToken = default
)
{
var token = GetCancellationToken(cancellationToken);
var query = await GetListQueryAsync(
filter,
entityType,
repliedCommentId,
authorUsername,
creationStartDate,
creationEndDate,
isApproved,
token);
var comments = await query.OrderBy(sorting.IsNullOrEmpty() ? "creationTime desc" : sorting)
.As<IMongoQueryable<Comment>>()
.PageBy<Comment, IMongoQueryable<Comment>>(skipCount, maxResultCount)
.ToListAsync(token);
var commentIds = comments.Select(x => x.Id).ToList();
var authorsQuery = from comment in (await GetMongoQueryableAsync(token))
join user in (await GetDbContextAsync(token)).CmsUsers on comment.CreatorId equals user.Id
where commentIds.Contains(comment.Id)
orderby comment.CreationTime
select user;
var authors = await ApplyDataFilters<IMongoQueryable<CmsUser>, CmsUser>(authorsQuery).ToListAsync(token);
return comments
.Select(
comment =>
new CommentWithAuthorQueryResultItem
{
Comment = comment,
Author = authors.FirstOrDefault(a => a.Id == comment.CreatorId)
}).ToList();
}
public virtual async Task<long> GetCountAsync(
string text = null,
string entityType = null,
Guid? repliedCommentId = null,
string authorUsername = null,
DateTime? creationStartDate = null,
DateTime? creationEndDate = null,
bool? isApproved = null,
CancellationToken cancellationToken = default
)
{
var query = await GetListQueryAsync(
text,
entityType,
repliedCommentId,
authorUsername,
creationStartDate,
creationEndDate,
isApproved,
cancellationToken);
return await query.As<IMongoQueryable<Comment>>()
.LongCountAsync(GetCancellationToken(cancellationToken));
}
public virtual async Task<List<CommentWithAuthorQueryResultItem>> GetListWithAuthorsAsync(
string entityType,
string entityId,
CancellationToken cancellationToken = default)
{
Check.NotNullOrWhiteSpace(entityType, nameof(entityType));
Check.NotNullOrWhiteSpace(entityId, nameof(entityId));
var authorsQuery = from comment in (await GetMongoQueryableAsync(cancellationToken))
join user in (await GetDbContextAsync(cancellationToken)).CmsUsers on comment.CreatorId equals user.Id
where entityType == comment.EntityType && entityId == comment.EntityId
orderby comment.CreationTime
select user;
var authors = await ApplyDataFilters<IMongoQueryable<CmsUser>, CmsUser>(authorsQuery).ToListAsync(GetCancellationToken(cancellationToken));
var comments = await (await GetMongoQueryableAsync(cancellationToken))
.Where(c => c.EntityId == entityId && c.EntityType == entityType)
.OrderBy(c => c.CreationTime)
.ToListAsync(GetCancellationToken(cancellationToken));
return comments
.Select(
comment =>
new CommentWithAuthorQueryResultItem
{
Comment = comment,
Author = authors.FirstOrDefault(a => a.Id == comment.CreatorId)
}).ToList();
}
public virtual async Task DeleteWithRepliesAsync(
Comment comment,
CancellationToken cancellationToken = default)
{
var replies = await (await GetMongoQueryableAsync(cancellationToken))
.Where(x => x.RepliedCommentId == comment.Id)
.ToListAsync(GetCancellationToken(cancellationToken));
await base.DeleteAsync(
comment,
cancellationToken: GetCancellationToken(cancellationToken)
);
foreach (var reply in replies)
{
await base.DeleteAsync(
reply,
cancellationToken: GetCancellationToken(cancellationToken)
);
}
}
public virtual async Task<bool> ExistsAsync(string idempotencyToken, CancellationToken cancellationToken = default)
{
return await (await GetMongoQueryableAsync(cancellationToken))
.AnyAsync(x => x.IdempotencyToken == idempotencyToken, GetCancellationToken(cancellationToken));
}
protected virtual async Task<IQueryable<Comment>> GetListQueryAsync(
string filter = null,
string entityType = null,
Guid? repliedCommentId = null,
string authorUsername = null,
DateTime? creationStartDate = null,
DateTime? creationEndDate = null,
bool? isApproved = null,
CancellationToken cancellationToken = default
)
{
var queryable = await GetMongoQueryableAsync(cancellationToken);
if (!string.IsNullOrEmpty(authorUsername))
{
var author = await (await GetMongoQueryableAsync<CmsUser>(cancellationToken)).FirstOrDefaultAsync(x => x.UserName == authorUsername, cancellationToken: cancellationToken);
var authorId = author?.Id ?? Guid.Empty;
queryable = queryable.Where(x => x.CreatorId == authorId);
}
return queryable.WhereIf(!filter.IsNullOrWhiteSpace(), c => c.Text.Contains(filter))
.WhereIf(!entityType.IsNullOrWhiteSpace(), c => c.EntityType == entityType)
.WhereIf(repliedCommentId.HasValue, c => c.RepliedCommentId == repliedCommentId)
.WhereIf(creationStartDate.HasValue, c => c.CreationTime >= creationStartDate)
.WhereIf(creationEndDate.HasValue, c => c.CreationTime <= creationEndDate)
.WhereIf(isApproved.HasValue, c => c.IsApproved == isApproved);
}
}

Loading…
Cancel
Save