2022-03-06 16:46:59 -08:00
|
|
|
import { Router } from 'express'
|
|
|
|
// import { Movie } from '../models/Post'
|
2022-03-21 17:20:41 -07:00
|
|
|
import { File } from '../lib/models/File'
|
|
|
|
import { Post } from '../lib/models/Post';
|
|
|
|
import jwt, { UserJwtRequest } from '../lib/middleware/jwt';
|
2022-03-06 16:46:59 -08:00
|
|
|
import * as crypto from "crypto";
|
2022-03-21 17:20:41 -07:00
|
|
|
import { User } from '../lib/models/User';
|
|
|
|
import secretKey from '../lib/middleware/secret-key';
|
2022-03-06 16:46:59 -08:00
|
|
|
|
|
|
|
export const posts = Router()
|
|
|
|
|
|
|
|
posts.post('/create', jwt, async (req, res, next) => {
|
|
|
|
try {
|
|
|
|
if (!req.body.files) {
|
|
|
|
throw new Error("Please provide files.")
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!req.body.title) {
|
|
|
|
throw new Error("Please provide a title.")
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!req.body.userId) {
|
|
|
|
throw new Error("No user id provided.")
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!req.body.visibility) {
|
|
|
|
throw new Error("Please provide a visibility.")
|
|
|
|
}
|
|
|
|
|
|
|
|
const newPost = new Post({
|
|
|
|
title: req.body.title,
|
|
|
|
visibility: req.body.visibility,
|
|
|
|
})
|
|
|
|
|
|
|
|
await newPost.save()
|
|
|
|
await newPost.$add('users', req.body.userId);
|
|
|
|
const newFiles = await Promise.all(req.body.files.map(async (file) => {
|
|
|
|
const newFile = new File({
|
|
|
|
title: file.title,
|
|
|
|
content: file.content,
|
|
|
|
sha: crypto.createHash('sha256').update(file.content).digest('hex').toString(),
|
|
|
|
})
|
|
|
|
|
|
|
|
await newFile.$set("user", req.body.userId);
|
|
|
|
await newFile.$set("post", newPost.id);
|
|
|
|
await newFile.save();
|
|
|
|
return newFile;
|
|
|
|
}))
|
|
|
|
|
|
|
|
await Promise.all(newFiles.map((file) => {
|
|
|
|
newPost.$add("files", file.id);
|
|
|
|
newPost.save();
|
|
|
|
}))
|
|
|
|
|
|
|
|
res.json(newPost);
|
|
|
|
} catch (e) {
|
|
|
|
next(e);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2022-03-21 17:20:41 -07:00
|
|
|
posts.get("/", secretKey, async (req, res, next) => {
|
|
|
|
try {
|
|
|
|
const posts = await Post.findAll({
|
|
|
|
attributes: ["id", "title", "visibility", "createdAt"],
|
|
|
|
})
|
|
|
|
res.json(posts);
|
|
|
|
} catch (e) {
|
|
|
|
next(e);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
posts.get("/:id", secretKey, async (req, res, next) => {
|
2022-03-06 16:46:59 -08:00
|
|
|
try {
|
|
|
|
const post = await Post.findOne({
|
|
|
|
where: {
|
|
|
|
id: req.params.id
|
|
|
|
},
|
|
|
|
include: [
|
|
|
|
{
|
|
|
|
model: File,
|
|
|
|
as: "files",
|
2022-03-11 18:48:40 -08:00
|
|
|
attributes: ["id", "title", "content", "sha", "createdAt", "updatedAt"],
|
2022-03-06 16:46:59 -08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
model: User,
|
|
|
|
as: "users",
|
|
|
|
attributes: ["id", "username"],
|
|
|
|
},
|
|
|
|
]
|
|
|
|
})
|
2022-03-21 17:20:41 -07:00
|
|
|
if (!post) {
|
|
|
|
throw new Error("Post not found.")
|
|
|
|
}
|
2022-03-06 22:16:08 -08:00
|
|
|
|
2022-03-21 17:20:41 -07:00
|
|
|
if (post.visibility === 'public' || post?.visibility === 'unlisted') {
|
2022-03-06 22:16:08 -08:00
|
|
|
res.json(post);
|
2022-03-21 17:20:41 -07:00
|
|
|
} else if (post.visibility === 'private') {
|
|
|
|
console.log("here")
|
|
|
|
jwt(req as UserJwtRequest, res, () => {
|
2022-03-06 22:16:08 -08:00
|
|
|
res.json(post);
|
2022-03-21 17:20:41 -07:00
|
|
|
})
|
|
|
|
} else if (post.visibility === 'protected') {
|
|
|
|
|
2022-03-06 22:16:08 -08:00
|
|
|
}
|
2022-03-06 16:46:59 -08:00
|
|
|
}
|
|
|
|
catch (e) {
|
|
|
|
next(e);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|