summaryrefslogtreecommitdiff
path: root/src/models/note.ts
diff options
context:
space:
mode:
authorrinsuki <428rinsuki+git@gmail.com>2018-05-17 07:52:24 +0900
committerrinsuki <428rinsuki+git@gmail.com>2018-05-17 07:52:24 +0900
commit829b4012e6dc14eb64a3d8f60826fe9b6a41b40d (patch)
tree42ac37f323db349dca9316e6fdb39fc33b860686 /src/models/note.ts
parentadd yarn.lock to gitignore (diff)
parentUpdate deliver.ts (diff)
downloadmisskey-829b4012e6dc14eb64a3d8f60826fe9b6a41b40d.tar.gz
misskey-829b4012e6dc14eb64a3d8f60826fe9b6a41b40d.tar.bz2
misskey-829b4012e6dc14eb64a3d8f60826fe9b6a41b40d.zip
Merge branch 'master' into fix/yarn-lock-ignore
Diffstat (limited to 'src/models/note.ts')
-rw-r--r--src/models/note.ts136
1 files changed, 84 insertions, 52 deletions
diff --git a/src/models/note.ts b/src/models/note.ts
index 3059593540..f42bb2a49d 100644
--- a/src/models/note.ts
+++ b/src/models/note.ts
@@ -12,11 +12,11 @@ import NoteWatching, { deleteNoteWatching } from './note-watching';
import NoteReaction from './note-reaction';
import Favorite, { deleteFavorite } from './favorite';
import Notification, { deleteNotification } from './notification';
+import Following from './following';
const Note = db.get<INote>('notes');
-
Note.createIndex('uri', { sparse: true, unique: true });
-
+Note.createIndex('userId');
export default Note;
export function isValidText(text: string): boolean {
@@ -24,7 +24,7 @@ export function isValidText(text: string): boolean {
}
export function isValidCw(text: string): boolean {
- return text.length <= 100 && text.trim() != '';
+ return text.length <= 100;
}
export type INote = {
@@ -38,7 +38,6 @@ export type INote = {
poll: any; // todo
text: string;
tags: string[];
- textHtml: string;
cw: string;
userId: mongo.ObjectID;
appId: mongo.ObjectID;
@@ -47,7 +46,18 @@ export type INote = {
repliesCount: number;
reactionCounts: any;
mentions: mongo.ObjectID[];
- visibility: 'public' | 'unlisted' | 'private' | 'direct';
+
+ /**
+ * public ... 公開
+ * home ... ホームタイムライン(ユーザーページのタイムライン含む)のみに流す
+ * followers ... フォロワーのみ
+ * specified ... visibleUserIds で指定したユーザーのみ
+ * private ... 自分のみ
+ */
+ visibility: 'public' | 'home' | 'followers' | 'specified' | 'private';
+
+ visibleUserIds: mongo.ObjectID[];
+
geo: {
coordinates: number[];
altitude: number;
@@ -58,6 +68,7 @@ export type INote = {
};
uri: string;
+ // 非正規化
_reply?: {
userId: mongo.ObjectID;
};
@@ -66,9 +77,7 @@ export type INote = {
};
_user: {
host: string;
- account: {
- inbox?: string;
- };
+ inbox?: string;
};
};
@@ -153,9 +162,9 @@ export const pack = async (
detail: boolean
}
) => {
- const opts = options || {
- detail: true,
- };
+ const opts = Object.assign({
+ detail: true
+ }, options);
// Me
const meId: mongo.ObjectID = me
@@ -183,12 +192,61 @@ 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 => 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
_note.id = _note._id;
delete _note._id;
+ delete _note._user;
+ delete _note._reply;
+ delete _note.repost;
delete _note.mentions;
if (_note.geo) delete _note.geo.type;
@@ -206,49 +264,16 @@ export const pack = async (
}
// Populate media
- if (_note.mediaIds) {
- _note.media = Promise.all(_note.mediaIds.map(fileId =>
- packFile(fileId)
- ));
- }
+ _note.media = hide ? [] : Promise.all(_note.mediaIds.map(fileId =>
+ packFile(fileId)
+ ));
// When requested a detailed note data
if (opts.detail) {
- // Get previous note info
- _note.prev = (async () => {
- const prev = await Note.findOne({
- userId: _note.userId,
- _id: {
- $lt: id
- }
- }, {
- fields: {
- _id: true
- },
- sort: {
- _id: -1
- }
- });
- return prev ? prev._id : null;
- })();
-
- // Get next note info
- _note.next = (async () => {
- const next = await Note.findOne({
- userId: _note.userId,
- _id: {
- $gt: id
- }
- }, {
- fields: {
- _id: true
- },
- sort: {
- _id: 1
- }
- });
- return next ? next._id : null;
- })();
+ //#region 重いので廃止
+ _note.prev = null;
+ _note.next = null;
+ //#endregion
if (_note.replyId) {
// Populate reply to note
@@ -265,7 +290,7 @@ export const pack = async (
}
// Poll
- if (meId && _note.poll) {
+ if (meId && _note.poll && !hide) {
_note.poll = (async (poll) => {
const vote = await PollVote
.findOne({
@@ -306,5 +331,12 @@ export const pack = async (
// resolve promises in _note object
_note = await rap(_note);
+ if (hide) {
+ _note.mediaIds = [];
+ _note.text = null;
+ _note.poll = null;
+ _note.isHidden = true;
+ }
+
return _note;
};