[API] お気に入り状態は投稿情報に含めないように統一

This commit is contained in:
syuilo 2019-02-05 01:11:06 +09:00
parent 06707705bf
commit c107333f56
No known key found for this signature in database
GPG key ID: BDC4C49D06AB9D69
3 changed files with 99 additions and 71 deletions

View file

@ -15,68 +15,72 @@ import { faCopy } from '@fortawesome/free-regular-svg-icons';
export default Vue.extend({ export default Vue.extend({
i18n: i18n('common/views/components/note-menu.vue'), i18n: i18n('common/views/components/note-menu.vue'),
props: ['note', 'source'], props: ['note', 'source'],
data() {
return {
isFavorited: false
};
},
computed: { computed: {
items(): any[] { items(): any[] {
return concat(intersperse([null], [ return [{
[ icon: 'at',
[{ text: this.$t('mention'),
icon: 'at', action: this.mention
text: this.$t('mention'), }, null, {
action: this.mention icon: 'info-circle',
}] text: this.$t('detail'),
], action: this.detail
[ }, {
[{ icon: faCopy,
icon: 'info-circle', text: this.$t('copy-content'),
text: this.$t('detail'), action: this.copyContent
action: this.detail }, {
}], [{ icon: 'link',
icon: faCopy, text: this.$t('copy-link'),
text: this.$t('copy-content'), action: this.copyLink
action: this.copyContent }, this.note.uri ? {
}], [{ icon: 'external-link-square-alt',
icon: 'link', text: this.$t('remote'),
text: this.$t('copy-link'), action: () => {
action: this.copyLink window.open(this.note.uri, '_blank');
}], this.note.uri ? [{ }
icon: 'external-link-square-alt', } : undefined,
text: this.$t('remote'), null,
action: () => { this.isFavorited ? {
window.open(this.note.uri, '_blank'); icon: 'star',
} text: this.$t('unfavorite'),
}] : [] action: this.unfavorite
], } : {
[ icon: 'star',
this.note.isFavorited ? [{ text: this.$t('favorite'),
icon: 'star', action: this.favorite
text: this.$t('unfavorite'), },
action: this.unfavorite this.note.userId == this.$store.state.i.id ? (this.$store.state.i.pinnedNoteIds || []).includes(this.note.id) ? {
}] : [{ icon: 'thumbtack',
icon: 'star', text: this.$t('unpin'),
text: this.$t('favorite'), action: this.unpin
action: this.favorite } : {
}], this.note.userId == this.$store.state.i.id ? [ icon: 'thumbtack',
(this.$store.state.i.pinnedNoteIds || []).includes(this.note.id) ? { text: this.$t('pin'),
icon: 'thumbtack', action: this.pin
text: this.$t('unpin'), } : undefined,
action: this.unpin null,
} : { this.note.userId == this.$store.state.i.id || this.$store.state.i.isAdmin || this.$store.state.i.isModerator ? {
icon: 'thumbtack', icon: ['far', 'trash-alt'],
text: this.$t('pin'), text: this.$t('delete'),
action: this.pin action: this.del
} } : undefined].filter(x => x !== undefined)
] : []
], [
this.note.userId == this.$store.state.i.id || this.$store.state.i.isAdmin || this.$store.state.i.isModerator ? [{
icon: ['far', 'trash-alt'],
text: this.$t('delete'),
action: this.del
}] : []
]
].map(concat).filter(x => x.length > 0)));
} }
}, },
created() {
this.$root.api('notes/state', {
noteId: this.note.id
}).then(state => {
this.isFavorited = state.isFavorited;
});
},
methods: { methods: {
mention() { mention() {
this.$post({ mention: this.note.user }); this.$post({ mention: this.note.user });

View file

@ -9,7 +9,6 @@ import { pack as packApp } from './app';
import PollVote from './poll-vote'; import PollVote from './poll-vote';
import Reaction from './note-reaction'; import Reaction from './note-reaction';
import { packMany as packFileMany, IDriveFile } from './drive-file'; import { packMany as packFileMany, IDriveFile } from './drive-file';
import Favorite from './favorite';
import Following from './following'; import Following from './following';
import Emoji from './emoji'; import Emoji from './emoji';
@ -346,19 +345,6 @@ export const pack = async (
return null; return null;
})(); })();
// isFavorited
_note.isFavorited = (async () => {
const favorite = await Favorite
.count({
userId: meId,
noteId: id
}, {
limit: 1
});
return favorite === 1;
})();
} }
} }

View file

@ -0,0 +1,38 @@
import $ from 'cafy'; import ID, { transform } from '../../../../misc/cafy-id';
import define from '../../define';
import Favorite from '../../../../models/favorite';
export const meta = {
stability: 'stable',
desc: {
'ja-JP': '指定した投稿の状態を取得します。',
'en-US': 'Get state of a note.'
},
requireCredential: true,
params: {
noteId: {
validator: $.type(ID),
transform: transform,
desc: {
'ja-JP': '対象の投稿のID',
'en-US': 'Target note ID.'
}
}
}
};
export default define(meta, (ps, user) => new Promise(async (res, rej) => {
const favorite = await Favorite.count({
userId: user._id,
noteId: ps.noteId
}, {
limit: 1
});
res({
isFavorited: favorite !== 0
});
}));