From 1f2ebce8ed749d7e81e999944fc8a22ff39b87b7 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 18 Sep 2018 06:29:47 +0900 Subject: [PATCH] Resolve #1302 --- .../app/desktop/views/pages/user/user.vue | 2 +- .../app/mobile/views/pages/user/home.vue | 2 +- src/docs/api/entities/user.yaml | 8 ++--- src/models/user.ts | 32 ++++++++++++++++--- src/server/api/endpoints/i/pin.ts | 14 +++++++- 5 files changed, 46 insertions(+), 12 deletions(-) diff --git a/src/client/app/desktop/views/pages/user/user.vue b/src/client/app/desktop/views/pages/user/user.vue index 28ccd78074..89dbd41b84 100644 --- a/src/client/app/desktop/views/pages/user/user.vue +++ b/src/client/app/desktop/views/pages/user/user.vue @@ -6,7 +6,7 @@ <main> <div class="main"> <x-header :user="user"/> - <mk-note-detail v-if="user.pinnedNote" :note="user.pinnedNote" :compact="true"/> + <mk-note-detail v-for="n in user.pinnedNotes" :key="n.id" :note="n" :compact="true"/> <x-timeline class="timeline" ref="tl" :user="user"/> </div> <div class="side"> diff --git a/src/client/app/mobile/views/pages/user/home.vue b/src/client/app/mobile/views/pages/user/home.vue index 8b57276b17..4118afef19 100644 --- a/src/client/app/mobile/views/pages/user/home.vue +++ b/src/client/app/mobile/views/pages/user/home.vue @@ -1,6 +1,6 @@ <template> <div class="root home"> - <mk-note-detail v-if="user.pinnedNote" :note="user.pinnedNote" :compact="true"/> + <mk-note-detail v-for="n in user.pinnedNotes" :key="n.id" :note="n" :compact="true"/> <section class="recent-notes"> <h2>%fa:R comments%%i18n:@recent-notes%</h2> <div> diff --git a/src/docs/api/entities/user.yaml b/src/docs/api/entities/user.yaml index c90b55ee88..e3755d8585 100644 --- a/src/docs/api/entities/user.yaml +++ b/src/docs/api/entities/user.yaml @@ -101,15 +101,15 @@ props: ja-JP: "投稿の数" en-US: "The number of the notes of this user" - pinnedNote: - type: "entity(Note)" + pinnedNotes: + type: "entity(Note)[]" optional: true desc: ja-JP: "ピン留めされた投稿" en-US: "The pinned note of this user" - pinnedNoteId: - type: "id(Note)" + pinnedNoteIds: + type: "id(Note)[]" optional: true desc: ja-JP: "ピン留めされた投稿のID" diff --git a/src/models/user.ts b/src/models/user.ts index 64197c91c2..b595fa8d71 100644 --- a/src/models/user.ts +++ b/src/models/user.ts @@ -35,6 +35,28 @@ User.createIndex('uri', { sparse: true, unique: true }); export default User; +// 後方互換性のため +User.findOne({ + pinnedNoteId: { $exists: true } +}).then(async x => { + if (x == null) return; + + const users = await User.find({ + pinnedNoteId: { $exists: true } + }); + + users.forEach(u => { + User.update({ _id: u._id }, { + $set: { + pinnedNoteIds: [(u as any).pinnedNoteId] + }, + $unset: { + pinnedNoteId: '' + } + }); + }); +}); + type IUserBase = { _id: mongo.ObjectID; createdAt: Date; @@ -53,7 +75,7 @@ type IUserBase = { wallpaperUrl?: string; data: any; description: string; - pinnedNoteId: mongo.ObjectID; + pinnedNoteIds: mongo.ObjectID[]; /** * 凍結されているか否か @@ -464,11 +486,11 @@ export const pack = ( } if (opts.detail) { - if (_user.pinnedNoteId) { - // Populate pinned note - _user.pinnedNote = packNote(_user.pinnedNoteId, meId, { + if (_user.pinnedNoteIds) { + // Populate pinned notes + _user.pinnedNotes = Promise.all(_user.pinnedNoteIds.map((id: mongo.ObjectId) => packNote(id, meId, { detail: true - }); + }))); } if (meId && !meId.equals(_user.id)) { diff --git a/src/server/api/endpoints/i/pin.ts b/src/server/api/endpoints/i/pin.ts index ae03a86336..8804d5aa70 100644 --- a/src/server/api/endpoints/i/pin.ts +++ b/src/server/api/endpoints/i/pin.ts @@ -21,9 +21,21 @@ export default async (params: any, user: ILocalUser) => new Promise(async (res, return rej('note not found'); } + const pinnedNoteIds = user.pinnedNoteIds || []; + + if (pinnedNoteIds.some(id => id.equals(note._id))) { + return rej('already exists'); + } + + pinnedNoteIds.unshift(note._id); + + if (pinnedNoteIds.length > 5) { + pinnedNoteIds.pop(); + } + await User.update(user._id, { $set: { - pinnedNoteId: note._id + pinnedNoteIds: pinnedNoteIds } });