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

84 lines
2.3 KiB
TypeScript

import {Router, Request, Response} from 'express';
import {FeedItem} from '../models/FeedItem';
import {NextFunction} from 'connect';
import * as jwt from 'jsonwebtoken';
import * as AWS from '../../../../aws';
import * as c from '../../../../config/config';
const router: Router = Router();
export function requireAuth(req: Request, res: Response, next: NextFunction) {
if (!req.headers || !req.headers.authorization) {
return res.status(401).send({message: 'No authorization headers.'});
}
const tokenBearer = req.headers.authorization.split(' ');
if (tokenBearer.length != 2) {
return res.status(401).send({message: 'Malformed token.'});
}
const token = tokenBearer[1];
return jwt.verify(token, c.config.jwt.secret, (err, decoded) => {
if (err) {
return res.status(500).send({auth: false, message: 'Failed to authenticate.'});
}
return next();
});
}
// Get all feed items
router.get('/', async (req: Request, res: Response) => {
const items = await FeedItem.findAndCountAll({order: [['id', 'DESC']]});
items.rows.map((item) => {
if (item.url) {
item.url = AWS.getGetSignedUrl(item.url);
}
});
res.send(items);
});
// Get a feed resource
router.get('/:id',
async (req: Request, res: Response) => {
const {id} = req.params;
const item = await FeedItem.findByPk(id);
res.send(item);
});
// Get a signed url to put a new item in the bucket
router.get('/signed-url/:fileName',
requireAuth,
async (req: Request, res: Response) => {
const {fileName} = req.params;
const url = AWS.getPutSignedUrl(fileName);
res.status(201).send({url: url});
});
// Create feed with metadata
router.post('/',
requireAuth,
async (req: Request, res: Response) => {
const caption = req.body.caption;
const fileName = req.body.url; // same as S3 key name
if (!caption) {
return res.status(400).send({message: 'Caption is required or malformed.'});
}
if (!fileName) {
return res.status(400).send({message: 'File url is required.'});
}
const item = await new FeedItem({
caption: caption,
url: fileName,
});
const savedItem = await item.save();
savedItem.url = AWS.getGetSignedUrl(savedItem.url);
res.status(201).send(savedItem);
});
export const FeedRouter: Router = router;