Fix #2321
This commit is contained in:
parent
d9a1cd082c
commit
6ac92ac4b8
2 changed files with 75 additions and 61 deletions
|
@ -162,6 +162,66 @@ export async function deleteNote(note: string | mongo.ObjectID | INote) {
|
|||
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
|
||||
*
|
||||
|
@ -174,11 +234,13 @@ export const pack = async (
|
|||
note: string | mongo.ObjectID | INote,
|
||||
me?: string | mongo.ObjectID | IUser,
|
||||
options?: {
|
||||
detail: boolean
|
||||
detail?: boolean;
|
||||
skipHide?: boolean;
|
||||
}
|
||||
) => {
|
||||
const opts = Object.assign({
|
||||
detail: true
|
||||
detail: true,
|
||||
skipHide: false
|
||||
}, options);
|
||||
|
||||
// Me
|
||||
|
@ -207,52 +269,6 @@ export const pack = async (
|
|||
|
||||
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;
|
||||
|
||||
// Rename _id to id
|
||||
|
@ -274,7 +290,7 @@ export const pack = async (
|
|||
}
|
||||
|
||||
// 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)
|
||||
));
|
||||
|
||||
|
@ -304,7 +320,7 @@ export const pack = async (
|
|||
}
|
||||
|
||||
// Poll
|
||||
if (meId && _note.poll && !hide) {
|
||||
if (meId && _note.poll) {
|
||||
_note.poll = (async poll => {
|
||||
const vote = await PollVote
|
||||
.findOne({
|
||||
|
@ -349,15 +365,8 @@ export const pack = async (
|
|||
_note.text = _note.text.replace(/な/g, 'にゃ').replace(/ナ/g, 'ニャ').replace(/ナ/g, 'ニャ');
|
||||
}
|
||||
|
||||
if (hide) {
|
||||
_note.fileIds = [];
|
||||
_note.text = null;
|
||||
_note.poll = null;
|
||||
_note.cw = null;
|
||||
_note.tags = [];
|
||||
_note.tagsLower = [];
|
||||
_note.geo = null;
|
||||
_note.isHidden = true;
|
||||
if (!opts.skipHide) {
|
||||
await hideNote(_note, meId);
|
||||
}
|
||||
|
||||
return _note;
|
||||
|
|
|
@ -447,6 +447,11 @@ async function publishToUserLists(note: INote, noteObj: 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({
|
||||
followeeId: note.userId
|
||||
});
|
||||
|
@ -465,10 +470,10 @@ async function publishToFollowers(note: INote, noteObj: any, user: IUser, noteAc
|
|||
}
|
||||
|
||||
// Publish event to followers stream
|
||||
publishUserStream(following.followerId, 'note', noteObj);
|
||||
publishUserStream(following.followerId, 'note', detailPackedNote);
|
||||
|
||||
if (isRemoteUser(user) || note.visibility != 'public') {
|
||||
publishHybridTimelineStream(following.followerId, noteObj);
|
||||
publishHybridTimelineStream(following.followerId, detailPackedNote);
|
||||
}
|
||||
} else {
|
||||
// フォロワーがリモートユーザーかつ投稿者がローカルユーザーなら投稿を配信
|
||||
|
|
Loading…
Reference in a new issue