[API] お気に入り状態は投稿情報に含めないように統一
This commit is contained in:
		
							parent
							
								
									06707705bf
								
							
						
					
					
						commit
						c107333f56
					
				
					 3 changed files with 99 additions and 71 deletions
				
			
		| 
						 | 
				
			
			@ -15,68 +15,72 @@ import { faCopy } from '@fortawesome/free-regular-svg-icons';
 | 
			
		|||
export default Vue.extend({
 | 
			
		||||
	i18n: i18n('common/views/components/note-menu.vue'),
 | 
			
		||||
	props: ['note', 'source'],
 | 
			
		||||
	data() {
 | 
			
		||||
		return {
 | 
			
		||||
			isFavorited: false
 | 
			
		||||
		};
 | 
			
		||||
	},
 | 
			
		||||
	computed: {
 | 
			
		||||
		items(): any[] {
 | 
			
		||||
			return concat(intersperse([null], [
 | 
			
		||||
				[
 | 
			
		||||
					[{
 | 
			
		||||
						icon: 'at',
 | 
			
		||||
						text: this.$t('mention'),
 | 
			
		||||
						action: this.mention
 | 
			
		||||
					}]
 | 
			
		||||
				],
 | 
			
		||||
				[
 | 
			
		||||
					[{
 | 
			
		||||
						icon: 'info-circle',
 | 
			
		||||
						text: this.$t('detail'),
 | 
			
		||||
						action: this.detail
 | 
			
		||||
					}], [{
 | 
			
		||||
						icon: faCopy,
 | 
			
		||||
						text: this.$t('copy-content'),
 | 
			
		||||
						action: this.copyContent
 | 
			
		||||
					}], [{
 | 
			
		||||
						icon: 'link',
 | 
			
		||||
						text: this.$t('copy-link'),
 | 
			
		||||
						action: this.copyLink
 | 
			
		||||
					}], this.note.uri ? [{
 | 
			
		||||
						icon: 'external-link-square-alt',
 | 
			
		||||
						text: this.$t('remote'),
 | 
			
		||||
						action: () => {
 | 
			
		||||
							window.open(this.note.uri, '_blank');
 | 
			
		||||
						}
 | 
			
		||||
					}] : []
 | 
			
		||||
				],
 | 
			
		||||
				[
 | 
			
		||||
					this.note.isFavorited ? [{
 | 
			
		||||
						icon: 'star',
 | 
			
		||||
						text: this.$t('unfavorite'),
 | 
			
		||||
						action: this.unfavorite
 | 
			
		||||
					}] : [{
 | 
			
		||||
						icon: 'star',
 | 
			
		||||
						text: this.$t('favorite'),
 | 
			
		||||
						action: this.favorite
 | 
			
		||||
					}], this.note.userId == this.$store.state.i.id ? [
 | 
			
		||||
						(this.$store.state.i.pinnedNoteIds || []).includes(this.note.id) ? {
 | 
			
		||||
							icon: 'thumbtack',
 | 
			
		||||
							text: this.$t('unpin'),
 | 
			
		||||
							action: this.unpin
 | 
			
		||||
						} : {
 | 
			
		||||
								icon: 'thumbtack',
 | 
			
		||||
								text: this.$t('pin'),
 | 
			
		||||
								action: this.pin
 | 
			
		||||
							}
 | 
			
		||||
					] : []
 | 
			
		||||
				], [
 | 
			
		||||
					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)));
 | 
			
		||||
			return [{
 | 
			
		||||
				icon: 'at',
 | 
			
		||||
				text: this.$t('mention'),
 | 
			
		||||
				action: this.mention
 | 
			
		||||
			}, null, {
 | 
			
		||||
				icon: 'info-circle',
 | 
			
		||||
				text: this.$t('detail'),
 | 
			
		||||
				action: this.detail
 | 
			
		||||
			}, {
 | 
			
		||||
				icon: faCopy,
 | 
			
		||||
				text: this.$t('copy-content'),
 | 
			
		||||
				action: this.copyContent
 | 
			
		||||
			}, {
 | 
			
		||||
				icon: 'link',
 | 
			
		||||
				text: this.$t('copy-link'),
 | 
			
		||||
				action: this.copyLink
 | 
			
		||||
			}, this.note.uri ? {
 | 
			
		||||
				icon: 'external-link-square-alt',
 | 
			
		||||
				text: this.$t('remote'),
 | 
			
		||||
				action: () => {
 | 
			
		||||
					window.open(this.note.uri, '_blank');
 | 
			
		||||
				}
 | 
			
		||||
			} : undefined,
 | 
			
		||||
			null,
 | 
			
		||||
			this.isFavorited ? {
 | 
			
		||||
				icon: 'star',
 | 
			
		||||
				text: this.$t('unfavorite'),
 | 
			
		||||
				action: this.unfavorite
 | 
			
		||||
			} : {
 | 
			
		||||
				icon: 'star',
 | 
			
		||||
				text: this.$t('favorite'),
 | 
			
		||||
				action: this.favorite
 | 
			
		||||
			},
 | 
			
		||||
			this.note.userId == this.$store.state.i.id ? (this.$store.state.i.pinnedNoteIds || []).includes(this.note.id) ? {
 | 
			
		||||
				icon: 'thumbtack',
 | 
			
		||||
				text: this.$t('unpin'),
 | 
			
		||||
				action: this.unpin
 | 
			
		||||
			} : {
 | 
			
		||||
				icon: 'thumbtack',
 | 
			
		||||
				text: this.$t('pin'),
 | 
			
		||||
				action: this.pin
 | 
			
		||||
			} : undefined,
 | 
			
		||||
			null,
 | 
			
		||||
			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
 | 
			
		||||
			} : undefined].filter(x => x !== undefined)
 | 
			
		||||
		}
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	created() {
 | 
			
		||||
		this.$root.api('notes/state', {
 | 
			
		||||
			noteId: this.note.id
 | 
			
		||||
		}).then(state => {
 | 
			
		||||
			this.isFavorited = state.isFavorited;
 | 
			
		||||
		});
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	methods: {
 | 
			
		||||
		mention() {
 | 
			
		||||
			this.$post({ mention: this.note.user });
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,7 +9,6 @@ import { pack as packApp } from './app';
 | 
			
		|||
import PollVote from './poll-vote';
 | 
			
		||||
import Reaction from './note-reaction';
 | 
			
		||||
import { packMany as packFileMany, IDriveFile } from './drive-file';
 | 
			
		||||
import Favorite from './favorite';
 | 
			
		||||
import Following from './following';
 | 
			
		||||
import Emoji from './emoji';
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -346,19 +345,6 @@ export const pack = async (
 | 
			
		|||
 | 
			
		||||
				return null;
 | 
			
		||||
			})();
 | 
			
		||||
 | 
			
		||||
			// isFavorited
 | 
			
		||||
			_note.isFavorited = (async () => {
 | 
			
		||||
				const favorite = await Favorite
 | 
			
		||||
					.count({
 | 
			
		||||
						userId: meId,
 | 
			
		||||
						noteId: id
 | 
			
		||||
					}, {
 | 
			
		||||
						limit: 1
 | 
			
		||||
					});
 | 
			
		||||
 | 
			
		||||
				return favorite === 1;
 | 
			
		||||
			})();
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										38
									
								
								src/server/api/endpoints/notes/state.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								src/server/api/endpoints/notes/state.ts
									
										
									
									
									
										Normal 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
 | 
			
		||||
	});
 | 
			
		||||
}));
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue