@ -93,7 +93,6 @@ class PostController extends SiteController {
router . delete (
'/:postId/profile-photo' ,
// limiterService.createMiddleware(limiterService.config.post.deletePostFeatureImage),
requireAuthorPrivileges ,
this . deletePostFeatureImage . bind ( this ) ,
) ;
@ -103,14 +102,15 @@ class PostController extends SiteController {
requireAuthorPrivileges ,
this . deletePost . bind ( this ) ,
) ;
router . get ( '/tag/:tagSlug' , this . getTagSearchView . bind ( this ) ) ;
}
async populateUsername ( req , res , next , username ) {
const { user : userService } = this . dtp . services ;
const {
logan : loganService ,
user : userService ,
} = this . dtp . services ;
try {
res . locals . author = await userService . lookup ( username ) ;
if ( ! res . locals . author ) {
@ -118,13 +118,21 @@ class PostController extends SiteController {
}
return next ( ) ;
} catch ( error ) {
this . log . error ( 'failed to populate username' , { username , error } ) ;
loganService . sendRequestEvent ( module . exports , req , {
level : 'error' ,
event : 'populateUsername' ,
message : error . message ,
data : { error } ,
} ) ;
return next ( error ) ;
}
}
async populatePostSlug ( req , res , next , postSlug ) {
const { post : postService } = this . dtp . services ;
const {
logan : loganService ,
post : postService ,
} = this . dtp . services ;
try {
res . locals . post = await postService . getBySlug ( postSlug ) ;
if ( ! res . locals . post ) {
@ -132,13 +140,21 @@ class PostController extends SiteController {
}
return next ( ) ;
} catch ( error ) {
this . log . error ( 'failed to populate postSlug' , { postSlug , error } ) ;
loganService . sendRequestEvent ( module . exports , req , {
level : 'error' ,
event : 'populatePostSlug' ,
message : error . message ,
data : { error } ,
} ) ;
return next ( error ) ;
}
}
async populatePostId ( req , res , next , postId ) {
const { post : postService } = this . dtp . services ;
const {
logan : loganService ,
post : postService ,
} = this . dtp . services ;
try {
res . locals . post = await postService . getById ( postId ) ;
@ -147,13 +163,55 @@ class PostController extends SiteController {
return next ( ) ;
} catch ( error ) {
this . log . error ( 'failed to populate postId' , { postId , error } ) ;
loganService . sendRequestEvent ( module . exports , req , {
level : 'error' ,
event : 'populatePostId' ,
message : error . message ,
data : { error } ,
} ) ;
return next ( error ) ;
}
}
async populateTagSlug ( req , res , next , tagSlug ) {
const {
logan : loganService ,
post : postService ,
} = this . dtp . services ;
try {
var allPosts = false ;
var statusArray = [ 'published' ] ;
if ( req . user ) {
if ( req . user . flags . isAdmin ) {
statusArray . push ( 'draft' ) ;
allPosts = true ;
}
}
res . locals . allPosts = allPosts ;
res . locals . tagSlug = tagSlug ;
res . locals . tag = tagSlug . replace ( "_" , " " ) ;
res . locals . pagination = this . getPaginationParameters ( req , 12 ) ;
const { posts , totalPosts } = await postService . getByTags ( res . locals . tag , res . locals . pagination , statusArray ) ;
res . locals . posts = posts ;
res . locals . totalPosts = totalPosts ;
return next ( ) ;
} catch ( error ) {
loganService . sendRequestEvent ( module . exports , req , {
level : 'error' ,
event : 'populateTagSlug' ,
message : error . message ,
data : { error } ,
} ) ;
return next ( error ) ;
}
}
async postBlockCommentAuthor ( req , res ) {
const { user : userService } = this . dtp . services ;
const {
logan : loganService ,
user : userService ,
} = this . dtp . services ;
try {
const displayList = this . createDisplayList ( 'add-recipient' ) ;
await userService . blockUser ( req . user . _id , req . body . userId ) ;
@ -163,9 +221,27 @@ class PostController extends SiteController {
'bottom-center' ,
4000 ,
) ;
loganService . sendRequestEvent ( module . exports , req , {
level : 'info' ,
event : 'postBlockCommentAuthor' ,
data : {
post : {
_id : res . locals . post . _id ,
title : res . locals . post . title ,
} ,
blockedUserId : req . body . userId ,
} ,
} ) ;
res . status ( 200 ) . json ( { success : true , displayList } ) ;
} catch ( error ) {
this . log . error ( 'failed to report comment' , { error } ) ;
loganService . sendRequestEvent ( module . exports , req , {
level : 'error' ,
event : 'postBlockCommentAuthor' ,
message : error . message ,
data : { error } ,
} ) ;
return res . status ( error . statusCode || 500 ) . json ( {
success : false ,
message : error . message ,
@ -174,7 +250,10 @@ class PostController extends SiteController {
}
async postComment ( req , res ) {
const { comment : commentService } = this . dtp . services ;
const {
comment : commentService ,
logan : loganService ,
} = this . dtp . services ;
try {
const displayList = this . createDisplayList ( 'add-recipient' ) ;
@ -202,14 +281,38 @@ class PostController extends SiteController {
'bottom-center' ,
4000 ,
) ;
loganService . sendRequestEvent ( module . exports , req , {
level : 'info' ,
event : 'postComment' ,
data : {
post : {
_id : res . locals . post . _id ,
title : res . locals . post . title ,
} ,
comment : {
_id : res . locals . comment . _id ,
} ,
} ,
} ) ;
res . status ( 200 ) . json ( { success : true , displayList } ) ;
} catch ( error ) {
loganService . sendRequestEvent ( module . exports , req , {
level : 'error' ,
event : 'postComment' ,
message : error . message ,
data : { error } ,
} ) ;
res . status ( error . statusCode || 500 ) . json ( { success : false , message : error . message } ) ;
}
}
async postUpdateImage ( req , res ) {
const { post : postService } = this . dtp . services ;
const {
logan : loganService ,
post : postService ,
} = this . dtp . services ;
try {
const displayList = this . createDisplayList ( 'post-image' ) ;
@ -221,9 +324,26 @@ class PostController extends SiteController {
'bottom-center' ,
2000 ,
) ;
loganService . sendRequestEvent ( module . exports , req , {
level : 'info' ,
event : 'postUpdateImage' ,
data : {
post : {
_id : res . locals . post . _id ,
title : res . locals . post . title ,
} ,
} ,
} ) ;
res . status ( 200 ) . json ( { success : true , displayList } ) ;
} catch ( error ) {
this . log . error ( 'failed to update feature image' , { error } ) ;
loganService . sendRequestEvent ( module . exports , req , {
level : 'error' ,
event : 'postUpdateImage' ,
message : error . message ,
data : { error } ,
} ) ;
return res . status ( error . statusCode || 500 ) . json ( {
success : false ,
message : error . message ,
@ -232,11 +352,22 @@ class PostController extends SiteController {
}
async deletePostFeatureImage ( req , res ) {
const { logan : loganService } = this . dtp . services ;
loganService . sendRequestEvent ( module . exports , req , {
level : 'alert' ,
message : 'Deleting a post feature image is not yet implemented' ,
event : 'deletePostFeatureImage' ,
} ) ;
res . status ( 500 ) . json ( { success : false , message : 'Removing the featured image is not yet implemented' } ) ;
}
async postUpdatePost ( req , res , next ) {
const { post : postService } = this . dtp . services ;
const {
logan : loganService ,
post : postService ,
} = this . dtp . services ;
try {
if ( ! req . user . flags . isAdmin ) {
if ( ! req . user . _id . equals ( res . locals . post . author . _id ) ||
@ -245,15 +376,35 @@ class PostController extends SiteController {
}
}
await postService . update ( req . user , res . locals . post , req . body ) ;
loganService . sendRequestEvent ( module . exports , req , {
level : 'info' ,
event : 'postUpdatePost' ,
data : {
post : {
_id : res . locals . post . _id ,
title : res . locals . post . title ,
} ,
} ,
} ) ;
res . redirect ( ` /post/ ${ res . locals . post . slug } ` ) ;
} catch ( error ) {
this . log . error ( 'failed to update post' , { postId : res . locals . post . _id , error } ) ;
loganService . sendRequestEvent ( module . exports , req , {
level : 'error' ,
event : 'postUpdatePost' ,
message : error . message ,
data : { error } ,
} ) ;
return next ( error ) ;
}
}
async postUpdatePostTags ( req , res ) {
const { post : postService } = this . dtp . services ;
const {
logan : loganService ,
post : postService ,
} = this . dtp . services ;
try {
if ( ! req . user . flags . isAdmin )
{
@ -269,9 +420,26 @@ class PostController extends SiteController {
'bottom-center' ,
2000 ,
) ;
loganService . sendRequestEvent ( module . exports , req , {
level : 'info' ,
event : 'postUpdatePostTags' ,
data : {
post : {
_id : res . locals . post . _id ,
title : res . locals . post . title ,
} ,
} ,
} ) ;
res . status ( 200 ) . json ( { success : true , displayList } ) ;
} catch ( error ) {
this . log . error ( 'failed to update post tags' , { error } ) ;
loganService . sendRequestEvent ( module . exports , req , {
level : 'error' ,
event : 'postUpdatePostTags' ,
message : error . message ,
data : { error } ,
} ) ;
return res . status ( error . statusCode || 500 ) . json ( {
success : false ,
message : error . message ,
@ -280,18 +448,41 @@ class PostController extends SiteController {
}
async postCreatePost ( req , res , next ) {
const { post : postService } = this . dtp . services ;
const {
logan : loganService ,
post : postService ,
} = this . dtp . services ;
try {
res . locals . post = await postService . create ( req . user , req . body ) ;
loganService . sendRequestEvent ( module . exports , req , {
level : 'info' ,
event : 'postCreatePost' ,
data : {
post : {
_id : res . locals . post . _id ,
title : res . locals . post . title ,
} ,
} ,
} ) ;
res . redirect ( ` /post/ ${ res . locals . post . slug } ` ) ;
} catch ( error ) {
this . log . error ( 'failed to create post' , { error } ) ;
loganService . sendRequestEvent ( module . exports , req , {
level : 'error' ,
event : 'postCreatePost' ,
message : error . message ,
data : { error } ,
} ) ;
return next ( error ) ;
}
}
async getComments ( req , res ) {
const { comment : commentService } = this . dtp . services ;
const {
comment : commentService ,
logan : loganService ,
} = this . dtp . services ;
try {
const displayList = this . createDisplayList ( 'add-recipient' ) ;
@ -322,9 +513,19 @@ class PostController extends SiteController {
const replyList = ` ul#post-comment-list ` ;
displayList . addElement ( replyList , 'beforeEnd' , html ) ;
loganService . sendRequestEvent ( module . exports , req , {
level : 'info' ,
event : 'getComments' ,
} ) ;
res . status ( 200 ) . json ( { success : true , displayList } ) ;
} catch ( error ) {
this . log . error ( 'failed to fetch more comments' , { postId : res . locals . post . _id , error } ) ;
loganService . sendRequestEvent ( module . exports , req , {
level : 'error' ,
event : 'getComments' ,
message : error . message ,
data : { error } ,
} ) ;
return res . status ( error . statusCode || 500 ) . json ( {
success : false ,
message : error . message ,
@ -333,7 +534,11 @@ class PostController extends SiteController {
}
async getView ( req , res , next ) {
const { comment : commentService , resource : resourceService } = this . dtp . services ;
const {
comment : commentService ,
logan : loganService ,
resource : resourceService ,
} = this . dtp . services ;
try {
if ( res . locals . post . status !== 'published' ) {
if ( ! req . user ) {
@ -363,68 +568,156 @@ class PostController extends SiteController {
if ( res . locals . post . image ) {
res . locals . shareImage = ` https:// ${ this . dtp . config . site . domain } /image/ ${ res . locals . post . image . _id } ` ;
}
loganService . sendRequestEvent ( module . exports , req , {
level : 'info' ,
event : 'getView' ,
} ) ;
res . render ( 'post/view' ) ;
} catch ( error ) {
this . log . error ( 'failed to service post view' , { postId : res . locals . post . _id , error } ) ;
loganService . sendRequestEvent ( module . exports , req , {
level : 'error' ,
event : 'getView' ,
message : error . message ,
data : { error } ,
} ) ;
return next ( error ) ;
}
}
async getEditor ( req , res ) {
res . render ( 'post/editor' ) ;
async getEditor ( req , res , next ) {
const { logan : loganService } = this . dtp . services ;
try {
loganService . sendRequestEvent ( module . exports , req , {
level : 'info' ,
event : 'getEditor' ,
} ) ;
res . render ( 'post/editor' ) ;
} catch ( error ) {
loganService . sendRequestEvent ( module . exports , req , {
level : 'error' ,
event : 'getEditor' ,
message : error . message ,
data : { error } ,
} ) ;
return next ( error ) ;
}
}
async getComposer ( req , res , next ) {
const { post : postService } = this . dtp . services ;
const {
logan : loganService ,
post : postService ,
} = this . dtp . services ;
try {
res . locals . post = await postService . createPlaceholder ( req . user ) ;
loganService . sendRequestEvent ( module . exports , req , {
level : 'info' ,
event : 'getComposer' ,
} ) ;
res . redirect ( ` /post/ ${ res . locals . post . _id } /edit ` ) ;
} catch ( error ) {
this . log . error ( 'failed to render post composer' , { error } ) ;
loganService . sendRequestEvent ( module . exports , req , {
level : 'error' ,
event : 'getComposer' ,
message : error . message ,
data : { error } ,
} ) ;
return next ( error ) ;
}
}
async getIndex ( req , res , next ) {
const { post : postService } = this . dtp . services ;
const {
logan : loganService ,
post : postService ,
} = this . dtp . services ;
try {
res . locals . pagination = this . getPaginationParameters ( req , 20 ) ;
res . locals . posts = await postService . getPosts ( res . locals . pagination ) ;
loganService . sendRequestEvent ( module . exports , req , {
level : 'info' ,
event : 'getIndex' ,
} ) ;
res . render ( 'post/index' ) ;
} catch ( error ) {
loganService . sendRequestEvent ( module . exports , req , {
level : 'error' ,
event : 'getIndex' ,
message : error . message ,
data : { error } ,
} ) ;
return next ( error ) ;
}
}
async getAuthorView ( req , res , next ) {
const { post : postService } = this . dtp . services ;
const {
logan : loganService ,
post : postService ,
} = this . dtp . services ;
try {
res . locals . pagination = this . getPaginationParameters ( req , 20 ) ;
const { posts , totalPostCount } = await postService . getForAuthor ( res . locals . author , [ 'published' ] , res . locals . pagination ) ;
res . locals . posts = posts ;
res . locals . totalPostCount = totalPostCount ;
loganService . sendRequestEvent ( module . exports , req , {
level : 'info' ,
event : 'getAuthorView' ,
} ) ;
res . render ( 'post/author/view' ) ;
} catch ( error ) {
loganService . sendRequestEvent ( module . exports , req , {
level : 'error' ,
event : 'getAuthorView' ,
message : error . message ,
data : { error } ,
} ) ;
return next ( error ) ;
}
}
async getAllAuthorsView ( req , res , next ) {
const { user : userService } = this . dtp . services ;
const {
logan : loganService ,
user : userService ,
} = this . dtp . services ;
try {
res . locals . pagination = this . getPaginationParameters ( req , 20 ) ;
const { authors , totalAuthorCount } = await userService . getAuthors ( res . locals . pagination ) ;
res . locals . authors = authors ;
res . locals . totalAuthorCount = totalAuthorCount ;
loganService . sendRequestEvent ( module . exports , req , {
level : 'info' ,
event : 'getAllAuthorsView' ,
} ) ;
res . render ( 'post/author/all' ) ;
} catch ( error ) {
loganService . sendRequestEvent ( module . exports , req , {
level : 'error' ,
event : 'getAllAuthorsView' ,
message : error . message ,
data : { error } ,
} ) ;
return next ( error ) ;
}
}
async deletePost ( req , res ) {
const { post : postService } = this . dtp . services ;
const {
logan : loganService ,
post : postService ,
} = this . dtp . services ;
try {
// only give admins and the author permission to delete
if ( ! req . user . flags . isAdmin ) {
@ -438,9 +731,29 @@ class PostController extends SiteController {
const displayList = this . createDisplayList ( 'add-recipient' ) ;
displayList . navigateTo ( '/' ) ;
loganService . sendRequestEvent ( module . exports , req , {
level : 'info' ,
event : 'deletePost' ,
data : {
post : {
_id : res . locals . post . _id ,
title : res . locals . post . title ,
author : {
_id : res . locals . post . author . _id ,
username : res . locals . post . author . username ,
} ,
} ,
} ,
} ) ;
res . status ( 200 ) . json ( { success : true , displayList } ) ;
} catch ( error ) {
this . log . error ( 'failed to remove post' , { newletterId : res . locals . post . _id , error } ) ;
loganService . sendRequestEvent ( module . exports , req , {
level : 'error' ,
event : 'deletePost' ,
message : error . message ,
data : { error } ,
} ) ;
return res . status ( error . statusCode || 500 ) . json ( {
success : false ,
message : error . message ,
@ -448,36 +761,16 @@ class PostController extends SiteController {
}
}
async populateTagSlug ( req , res , next , tagSlug ) {
const { post : postService } = this . dtp . services ;
try {
var allPosts = false ;
var statusArray = [ 'published' ] ;
if ( req . user ) {
if ( req . user . flags . isAdmin ) {
statusArray . push ( 'draft' ) ;
allPosts = true ;
}
}
res . locals . allPosts = allPosts ;
res . locals . tagSlug = tagSlug ;
res . locals . tag = tagSlug . replace ( "_" , " " ) ;
res . locals . pagination = this . getPaginationParameters ( req , 12 ) ;
const { posts , totalPosts } = await postService . getByTags ( res . locals . tag , res . locals . pagination , statusArray ) ;
res . locals . posts = posts ;
res . locals . totalPosts = totalPosts ;
return next ( ) ;
} catch ( error ) {
this . log . error ( 'failed to populate tagSlug' , { tagSlug , error } ) ;
return next ( error ) ;
}
}
async getTagSearchView ( req , res ) {
const { logan : loganService } = this . dtp . services ;
try {
res . locals . pageTitle = ` Tag ${ res . locals . tag } on ${ this . dtp . config . site . name } ` ;
loganService . sendRequestEvent ( module . exports , req , {
level : 'info' ,
event : 'getTagSearchView' ,
} ) ;
res . render ( 'post/tag/view' ) ;
} catch ( error ) {
this . log . error ( 'failed to service post view' , { postId : res . locals . post . _id , error } ) ;
@ -487,21 +780,29 @@ class PostController extends SiteController {
async getTagIndex ( req , res , next ) {
const { post : postService } = this . dtp . services ;
const {
logan : loganService ,
post : postService ,
} = this . dtp . services ;
try {
res . locals . pagination = this . getPaginationParameters ( req , 20 ) ;
res . locals . posts = await postService . getPosts ( res . locals . pagination ) ;
loganService . sendRequestEvent ( module . exports , req , {
level : 'info' ,
event : 'getTagIndex' ,
} ) ;
res . render ( 'post/tag/index' ) ;
} catch ( error ) {
return next ( error ) ;
}
}
}
module . exports = {
slug: ' post',
name : 'post' ,
logId: 'ctl: post',
index : 'post' ,
className : 'PostController' ,
create : async ( dtp ) => { return new PostController ( dtp ) ; } ,
} ;