Node/modules/blogs/middlewares/query.js

541 lines
14 KiB
JavaScript

const User = require("../../users/models/user").User;
const { where, Op } = require("sequelize");
const { Follow } = require("../../follows/models");
const Blogs = require("../models/Blogs");
const Categories = require("../models/Categories");
const SavedBlogs = require("../models/SavedBlogs");
const { getFollowingsForIds } = require("../../follows/middlewares/query");
const { ReBlog } = require("../models/ReBlogs");
const { editedListPosts, editedPost, startAndEndDates } = require("./proccess");
const { Comments } = require("../../comments/models/Comments");
exports.getBlog = async function({blogId, myUserId}) {
const blog = await Blogs.findOne({
where: {
id: blogId
},
include: [User, Categories, {
model: SavedBlogs,
where: [(myUserId) ? {
userId: myUserId
} : {}],
required: false
}, {
model: Comments,
include: User
}]
});
(blog) && editedPost(blog);
return blog;
};
exports.getBlogs = async function({myUserId}){
return await Blogs.findAll({
include: [User, Categories, {
model: SavedBlogs,
where: {
userId: myUserId
},
required: false
}],
order: [["createdAt", "DESC"]]
});
};
exports.getBlogsWithUserId = async function({userId, category, myUserId, endDate = false, blogIds = false}){
endDate = (Boolean(endDate) !== false) && new Date(endDate);
const blogs = await Blogs.findAll({
where: {
[Op.and]: [{
userId: userId
}, (blogIds !== false) && {
[Op.not]: {
id: blogIds
}
},(endDate !== false) && {
createdAt: {
[Op.lt]: endDate
}
}]
},
include:[(category) ? {
model: Categories,
where: {
href: category
}
} : Categories, {
model: SavedBlogs,
where: {
userId: myUserId
},
required: false
}, {
model: Comments,
include: User
}, User],
limit: 20,
order: [["createdAt", "DESC"]]
});
const date = startAndEndDates(blogs, endDate);
const reblogs = await ReBlog.findAll({
where:[{
userId: userId
}, (date.status === true && blogIds) ? {
createdAt: {
[Op.between]: [date.endDate, date.startDate]
}
} : {}],
include: [{
model: Blogs,
where: {
[Op.not]: {
id: blogIds
}
},
include: [(category) ? {
model: Categories,
where: {
href: category
}
} : Categories, User, {
model: SavedBlogs,
where: {
userId: myUserId
},
required: false
}, {
model: Comments,
include: User
}]
}, User],
limit: 20,
order: [["createdAt", "DESC"]]
});
const result = await editedListPosts(blogs, reblogs);
return result.slice(0, 20);
};
exports.getBlogsWithUsername = async function({username, category, myUserId}){
const blogs = await Blogs.findAll({
include:[(category) ? {
model: Categories,
where: {
href: category
}
} : Categories, {
model: User,
where: {
username: username
}
},{
model: SavedBlogs,
where: {
userId: myUserId
},
required: false
}],
order: [["createdAt", "DESC"]]
});
const reblogs = await ReBlog.findAll({
include: [{
model: Blogs,
include: [Categories, {
model: User,
include: {
model: Follow,
where: {
user: myUserId
}
},
required: true
}, {
model: SavedBlogs,
where: {
userId: myUserId
}
}]
}, User]
});
const result = new Array(...blogs);
reblogs.map(res => {
res.blog.dataValues.reblog = true;
res.blog.dataValues.reUser = res.user;
result.push(res.blog);
});
return result;
};
exports.getBlogsWithCategory = async function({categoryId, categoryTitle, categoryHref, myUserId}){
return await Blogs.findAll({
include: [User, Categories, {
model: Categories,
where: [(categoryId) && {
id: categoryId
}, (categoryTitle) && {
title: categoryTitle
}, (categoryHref) && {
href: categoryHref
}]
},{
model: SavedBlogs,
where: {
userId: myUserId
},
required: false
}],
order: [["createdAt", "DESC"]]
});
};
exports.getBlogsWithFollows = async function({userId, endDate, blogIds = false}){
endDate = (endDate) && new Date(endDate);
console.log(blogIds)
const blogs = await Blogs.findAll({
where: {
[Op.and]: [(blogIds !== false) && {
[Op.not]: {
id: blogIds
}
}, (endDate) && {
createdAt: {
[Op.lt]: endDate
}
}]
},
include: [{
model: User,
include: {
model: Follow,
where: {
user: userId
},
},
required: true
}, Categories, {
model: SavedBlogs,
where: {
userId: userId
},
required: false
}, {
model: Comments,
include: User
}],
limit: 20
});
const date = startAndEndDates(blogs, endDate);
const reblogs = await ReBlog.findAll({
where:[(date.status === true && blogIds) ? {
createdAt: {
[Op.between]: [date.endDate, date.startDate]
}
} : {}],
include: [{
model: User,
include: {
model: Follow,
where: {
user: userId
},
},
required: true
}, {
model: Blogs,
include: [Categories, {
model: SavedBlogs,
where: {
userId: userId
},
required: false
}, {
model: Comments,
include: User
}, User]
}],
limit: 20
});
const result = await editedListPosts(blogs, reblogs);
return result.slice(0, 20);
};
exports.getBlogsForFollowsWithCategory = async function({userId, category, endDate = false, blogIds = false}){
endDate = (endDate !== false) && new Date(endDate);
const blogs = await Blogs.findAll({
where: {
[Op.and]: [(blogIds !== false) && {
[Op.not]: {
id: blogIds
}
}, (endDate !== false) && {
createdAt: {
[Op.lt]: endDate
}
}]
},
include: [{
model: User,
include: {
model: Follow,
where: {
user: userId
}
},
required: true
}, {
model: Categories,
where: {
href: category
}
}, {
model: SavedBlogs,
where: {
userId: userId
},
required: false
}, {
model: Comments,
include: User
}],
limit: 20
});
const date = startAndEndDates(blogs, endDate);
const reblogs = await ReBlog.findAll({
where:[(date.status === true && blogIds) ? {
createdAt: {
[Op.between]: [date.endDate, date.startDate]
}
} : {}],
include: [{
model: User,
include: {
model: Follow,
where: {
user: userId
}
},
required: true
}, {
model: Blogs,
include: [{
model: Categories,
where: {
href: category
}
}, {
model: SavedBlogs,
where: {
userId: userId
},
required: false
}, {
model: Comments,
include: User
}, User],
required: true
}],
limit: 20
});
const result = await editedListPosts(blogs, reblogs);
return result.slice(0, 20);
};
exports.getBlogsForDiscover = async function({userId, endDate, blogIds = false}){
endDate = (endDate) && new Date(endDate);
const followsIds = await getFollowingsForIds({
userId: userId
});
followsIds.push(userId);
const blogs = await Blogs.findAll({
where:[{
[Op.not]: [{
userId: followsIds
}]
}, (endDate) ? {
createdAt: {
[Op.lt]: endDate
}
} : {}, (blogIds) ? {
[Op.not]: {
id: [blogIds, userId]
}
} : {}],
include: [Categories, {
model: SavedBlogs,
where: {
userId: userId
},
required: false
}, {
model: Comments,
include: User
}, User],
limit: 20,
order: [["createdAt", "DESC"]]
});
const date = startAndEndDates(blogs, endDate);
const reblogs = await ReBlog.findAll({
where: [{
[Op.not]: {
userId: [followsIds, userId]
}
}, (date.status === true && blogIds) ? {
createdAt: {
[Op.between]: [date.endDate, date.startDate]
}
} : {}],
include:[{
model: Blogs,
where: {
[Op.not]: {
userId: [followsIds, userId]
}
},
include: [Categories, User, {
model: SavedBlogs,
where: {
userId: userId
},
required: false
}, {
model: Comments,
include: User
}]
}, User],
limit: 20,
order: [["createdAt", "DESC"]]
});
const result = await editedListPosts(blogs, reblogs);
return result.splice(0, 20);
};
exports.getBlogsForDiscoverWithCategory = async function({userId, category, endDate, blogIds = false}){
endDate = (endDate) && new Date(endDate);
const followsIds = await getFollowingsForIds({
userId: userId
});
followsIds.push(userId);
const blogs = await Blogs.findAll({
where:[{
[Op.not]: {
userId: followsIds
}
}, (endDate) && {
createdAt: {
[Op.lt]: endDate
}
}],
include: [{
model: Categories,
where: {
href: category
},
required: true
}, {
model: SavedBlogs,
where: {
userId: userId
},
required: false
}, {
model: Comments,
include: User
}, User],
limit: 20,
order: [["createdAt", "DESC"]]
});
const date = startAndEndDates(blogs, endDate);
const reblogs = await ReBlog.findAll({
where: [{
[Op.not]: {
userId: [followsIds, userId]
}
}, (date.status === true && blogIds) ? {
createdAt: {
[Op.between]: [date.endDate, date.startDate]
}
} : {}],
include:[{
model: Blogs,
where:[{
[Op.not]: {
userId: [followsIds, userId]
}
}],
include: [{
model: Categories,
where: {
href: category
},
required: true
}, {
model: SavedBlogs,
where: {
userId: userId
},
required: false
}, {
model: Comments,
include: User
}, User]
}, User],
limit: 20,
order: [["createdAt", "DESC"]]
});
const result = await editedListPosts(blogs, reblogs);
return result;
};
// CATE
exports.getCategoryWithParams = async function({categoryId, categoryTitle}){
return await Categories.findOne({
where:[
(categoryId) ? {id: categoryId} : {},
(categoryTitle) ? {title: categoryTitle} : {}
]
});
};
// SAVED
exports.getSaved = async function({userId, blogId}){
return await SavedBlogs.findOne({
where:{
userId: userId,
blogId: blogId
}
});
};