This commit is contained in:
syuilo 2018-09-10 02:43:16 +09:00
parent d9a1cd082c
commit 6ac92ac4b8
No known key found for this signature in database
GPG key ID: BDC4C49D06AB9D69
2 changed files with 75 additions and 61 deletions

View file

@ -162,6 +162,66 @@ export async function deleteNote(note: string | mongo.ObjectID | INote) {
console.log(`Note: deleted ${n._id}`); console.log(`Note: deleted ${n._id}`);
} }
export const hideNote = async (packedNote: any, meId: mongo.ObjectID) => {
let hide = false;
// visibility が private かつ投稿者のIDが自分のIDではなかったら非表示
if (packedNote.visibility == 'private' && (meId == null || !meId.equals(packedNote.userId))) {
hide = true;
}
// visibility が specified かつ自分が指定されていなかったら非表示
if (packedNote.visibility == 'specified') {
if (meId == null) {
hide = true;
} else if (meId.equals(packedNote.userId)) {
hide = false;
} else {
// 指定されているかどうか
const specified = packedNote.visibleUserIds.some((id: mongo.ObjectID) => id.equals(meId));
if (specified) {
hide = false;
} else {
hide = true;
}
}
}
// visibility が followers かつ自分が投稿者のフォロワーでなかったら非表示
if (packedNote.visibility == 'followers') {
if (meId == null) {
hide = true;
} else if (meId.equals(packedNote.userId)) {
hide = false;
} else {
// フォロワーかどうか
const following = await Following.findOne({
followeeId: packedNote.userId,
followerId: meId
});
if (following == null) {
hide = true;
} else {
hide = false;
}
}
}
if (hide) {
packedNote.fileIds = [];
packedNote.files = [];
packedNote.text = null;
packedNote.poll = null;
packedNote.cw = null;
packedNote.tags = [];
packedNote.tagsLower = [];
packedNote.geo = null;
packedNote.isHidden = true;
}
};
/** /**
* Pack a note for API response * Pack a note for API response
* *
@ -174,11 +234,13 @@ export const pack = async (
note: string | mongo.ObjectID | INote, note: string | mongo.ObjectID | INote,
me?: string | mongo.ObjectID | IUser, me?: string | mongo.ObjectID | IUser,
options?: { options?: {
detail: boolean detail?: boolean;
skipHide?: boolean;
} }
) => { ) => {
const opts = Object.assign({ const opts = Object.assign({
detail: true detail: true,
skipHide: false
}, options); }, options);
// Me // Me
@ -207,52 +269,6 @@ export const pack = async (
if (!_note) throw `invalid note arg ${note}`; if (!_note) throw `invalid note arg ${note}`;
let hide = false;
// visibility が private かつ投稿者のIDが自分のIDではなかったら非表示
if (_note.visibility == 'private' && (meId == null || !meId.equals(_note.userId))) {
hide = true;
}
// visibility が specified かつ自分が指定されていなかったら非表示
if (_note.visibility == 'specified') {
if (meId == null) {
hide = true;
} else if (meId.equals(_note.userId)) {
hide = false;
} else {
// 指定されているかどうか
const specified = _note.visibleUserIds.some((id: mongo.ObjectID) => id.equals(meId));
if (specified) {
hide = false;
} else {
hide = true;
}
}
}
// visibility が followers かつ自分が投稿者のフォロワーでなかったら非表示
if (_note.visibility == 'followers') {
if (meId == null) {
hide = true;
} else if (meId.equals(_note.userId)) {
hide = false;
} else {
// フォロワーかどうか
const following = await Following.findOne({
followeeId: _note.userId,
followerId: meId
});
if (following == null) {
hide = true;
} else {
hide = false;
}
}
}
const id = _note._id; const id = _note._id;
// Rename _id to id // Rename _id to id
@ -274,7 +290,7 @@ export const pack = async (
} }
// Populate files // Populate files
_note.files = hide ? [] : Promise.all(_note.fileIds.map((fileId: mongo.ObjectID) => _note.files = Promise.all(_note.fileIds.map((fileId: mongo.ObjectID) =>
packFile(fileId) packFile(fileId)
)); ));
@ -304,7 +320,7 @@ export const pack = async (
} }
// Poll // Poll
if (meId && _note.poll && !hide) { if (meId && _note.poll) {
_note.poll = (async poll => { _note.poll = (async poll => {
const vote = await PollVote const vote = await PollVote
.findOne({ .findOne({
@ -349,15 +365,8 @@ export const pack = async (
_note.text = _note.text.replace(/な/g, 'にゃ').replace(/ナ/g, 'ニャ').replace(/ナ/g, 'ニャ'); _note.text = _note.text.replace(/な/g, 'にゃ').replace(/ナ/g, 'ニャ').replace(/ナ/g, 'ニャ');
} }
if (hide) { if (!opts.skipHide) {
_note.fileIds = []; await hideNote(_note, meId);
_note.text = null;
_note.poll = null;
_note.cw = null;
_note.tags = [];
_note.tagsLower = [];
_note.geo = null;
_note.isHidden = true;
} }
return _note; return _note;

View file

@ -447,6 +447,11 @@ async function publishToUserLists(note: INote, noteObj: any) {
} }
async function publishToFollowers(note: INote, noteObj: any, user: IUser, noteActivity: any) { async function publishToFollowers(note: INote, noteObj: any, user: IUser, noteActivity: any) {
const detailPackedNote = await pack(note, null, {
detail: true,
skipHide: true
});
const followers = await Following.find({ const followers = await Following.find({
followeeId: note.userId followeeId: note.userId
}); });
@ -465,10 +470,10 @@ async function publishToFollowers(note: INote, noteObj: any, user: IUser, noteAc
} }
// Publish event to followers stream // Publish event to followers stream
publishUserStream(following.followerId, 'note', noteObj); publishUserStream(following.followerId, 'note', detailPackedNote);
if (isRemoteUser(user) || note.visibility != 'public') { if (isRemoteUser(user) || note.visibility != 'public') {
publishHybridTimelineStream(following.followerId, noteObj); publishHybridTimelineStream(following.followerId, detailPackedNote);
} }
} else { } else {
// フォロワーがリモートユーザーかつ投稿者がローカルユーザーなら投稿を配信 // フォロワーがリモートユーザーかつ投稿者がローカルユーザーなら投稿を配信