Upload All
This commit is contained in:
89
models/renderModels/personal_page.js
Normal file
89
models/renderModels/personal_page.js
Normal file
@ -0,0 +1,89 @@
|
||||
|
||||
const User = require("../mongooseSchemas/User");
|
||||
const Painting = require("../mongooseSchemas/Painting");
|
||||
const SiteMail = require("../mongooseSchemas/SiteMail");
|
||||
|
||||
/**
|
||||
* 取得「個人頁面」的插值資料。
|
||||
* @param {BasicLayout} renderData 插值物件。
|
||||
* @param {string} route 路由路徑。
|
||||
* @param {Express.Session} session Express的Session物件。
|
||||
* @param {CallbackFunction} callback 回呼函式。
|
||||
*/
|
||||
function PersonalPageRender(renderData, route, session, callback) {
|
||||
let paramUsername = route.substr(6); // 取得路徑中所選的目標個人頁面的使用者名稱
|
||||
|
||||
// 初步地檢查是否為合法的使用者名稱長度。若是,則進一步地去查詢相關資料
|
||||
if (4 <= paramUsername.length && paramUsername.length <= 16) {
|
||||
// 定義Populate Query : 套用的有paintings, siteMsg, siteMail 與 friendList
|
||||
let populateQuery = [
|
||||
{ path: "paintings", select: { "id": 1, "name": 1, "links": 1, "description": 1, "viewAuthority": 1, "tags": 1 } },
|
||||
{ path: "friendList", select: { "username": 1 } },
|
||||
{ path: "siteMsg.refId" },
|
||||
{ path: "siteMail" }
|
||||
];
|
||||
|
||||
// 嘗試尋找指定的使用者,並做populate來取得相關連的資料
|
||||
User.findOne({"username": paramUsername})
|
||||
.populate(populateQuery)
|
||||
.exec((err, userDocs) => {
|
||||
// 如果找到使用者的話,將需要的資料填入插值物件中
|
||||
if (userDocs) {
|
||||
// 定義 datas 物件,並將一些不需要過濾的資料先加入
|
||||
let datas = {
|
||||
isOwner: (renderData.username == userDocs.username), // 若目前正瀏覽的使用者與目標使用者的相同,則為這個個人頁面的擁有者(true),反之為否(false)
|
||||
username: userDocs.username, // 使用者名稱
|
||||
nickname: userDocs.personalInfo.nickname, // 暱稱
|
||||
motto: userDocs.personalInfo.motto, // 短言
|
||||
userPhotoURL: userDocs.personalInfo.photo, // 個人相片 (連結路徑)
|
||||
autoSaveEnable: userDocs.autoSaveEnable, // 自動儲存
|
||||
userTags: userDocs.tags, // 作品標籤
|
||||
friendList: [], // 好友清單
|
||||
siteMsg: [], // 網站訊息
|
||||
paintings: [], // 作品集
|
||||
siteMail: null // 站內信
|
||||
};
|
||||
|
||||
// 循環將 friendList 加入 datas 中
|
||||
for (let i = 0, list = userDocs.friendList; i < list.length; i++)
|
||||
datas.friendList.push(list[i].username);
|
||||
|
||||
// 循環將 siteMail 加入 datas 中
|
||||
for (let list = userDocs.siteMsg, i = list.length - 1; i >= 0; i--) {
|
||||
// 若為伺服訊息,則引用連接的伺服訊息資料
|
||||
if (list[i].isServerMessage) {
|
||||
datas.siteMsg.push({ title: list[i].refId.title, content: list[i].refId.content });
|
||||
}
|
||||
else {
|
||||
datas.siteMsg.push({ title: list[i].title, content: list[i].content });
|
||||
}
|
||||
}
|
||||
|
||||
datas.siteMail = userDocs.siteMail; // 將 siteMail 加入 datas 中
|
||||
|
||||
// 循環將 paintings 加入 datas 中
|
||||
let isFriend = userDocs.IsUsersFriend(session.passport.user); // 取得目前使用者對目標使用者而言的權限
|
||||
for (let i = 0, list = userDocs.paintings; i < list.length; i++) {
|
||||
// 若 觀看權限為「公開」 或 使用者為目標使用者的朋友且觀看權限為「半公開」 或 該使用者即為擁有者,則將幅畫資訊加入
|
||||
if (list[i].viewAuthority == 0 || isFriend && list[i].viewAuthority == 1 || datas.isOwner) {
|
||||
datas.paintings.push(list[i]);
|
||||
}
|
||||
}
|
||||
|
||||
renderData.datas = datas; // 最後將 datas 複寫至 renderData.datas
|
||||
callback(null, true);
|
||||
}
|
||||
// 若沒有找到,則將錯誤「找不到目標使用者」回呼至上層路由
|
||||
else {
|
||||
callback(User.Error_UserNotExist(), null);
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
// 如果不為合法的使用者名稱長度,則將錯誤「找不到目標使用者」回呼至上層路由。
|
||||
else {
|
||||
callback(User.Error_UserNotExist(), null);
|
||||
}
|
||||
}
|
||||
|
||||
module.exports.Render = PersonalPageRender;
|
Reference in New Issue
Block a user