DTP Social Engine
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

96 lines
2.4 KiB

// post.js
// Copyright (C) 2022 DTP Technologies, LLC
// License: Apache-2.0
'use strict';
const express = require('express');
const multer = require('multer');
const { SiteController } = require('../../lib/site-lib');
class PostController extends SiteController {
constructor (dtp) {
super(dtp, module.exports);
}
async start ( ) {
const { dtp } = this;
const { limiter: limiterService } = dtp.services;
const upload = multer({ dest: `/tmp/${this.dtp.config.site.domainKey}/uploads/${module.exports.slug}`});
const router = express.Router();
dtp.app.use('/post', router);
router.use(async (req, res, next) => {
res.locals.currentView = 'post';
/*
* TODO: H1V3 authentication before processing request (HTTP Bearer token)
*/
return next();
});
router.post(
'/post',
limiterService.create(limiterService.config.post.postCreate),
upload.none(),
this.postCreate.bind(this),
);
router.get('/', this.getPostHome.bind(this));
return router;
}
async postCreate (req, res, next) {
const { post: postService } = this.dtp.services;
try {
const displayList = this.createDisplayList('post-create');
res.locals.post = await postService.createPost(req.user, req.body);
let viewModel = Object.assign({ }, this.dtp.app.locals);
viewModel = Object.assign(viewModel, res.locals);
const postHtml = postService.renderPost(viewModel);
displayList.addElement('#dtp-post-list', 'afterBegin', postHtml);
displayList.setInputValue('#post-composer #content', '');
res.status(200).json({
success: true,
post: res.locals.post,
displayList,
});
} catch (error) {
this.log.error('failed to create new post', { error });
return next(error);
}
}
async getTimeline (req, res, next) {
const { post: postService } = this.dtp.services;
try {
res.locals.postView = 'timeline';
res.locals.pagination = this.getPaginationParameters(req, 20);
res.locals.posts = await postService.getHomeTimeline(req.user, res.locals.pagination);
} catch (error) {
this.log.error('failed to retrieve timeline', { error });
return next(error);
}
}
async getPostHome (req, res) {
res.locals.postView = 'home';
res.render('post/index');
}
}
module.exports = {
slug: 'post',
name: 'post',
create: async (dtp) => { return new PostController(dtp); },
};