みつけるの人気のタグを第2ソートで連合含めたユーザー数にしたりユーザーのタグ以外は除外するように

This commit is contained in:
syuilo 2019-02-18 11:47:25 +09:00
parent d9092dc81f
commit 0e046faf4a
No known key found for this signature in database
GPG key ID: BDC4C49D06AB9D69
4 changed files with 91 additions and 8 deletions

View file

@ -11,7 +11,8 @@
<template #header><fa :icon="faHashtag" fixed-width/>{{ $t('popular-tags') }}</template> <template #header><fa :icon="faHashtag" fixed-width/>{{ $t('popular-tags') }}</template>
<div class="vxjfqztj"> <div class="vxjfqztj">
<router-link v-for="tag in tags" :to="`/explore/tags/${tag.tag}`" :key="tag.tag">{{ tag.tag }}</router-link> <router-link v-for="tag in tagsLocal" :to="`/explore/tags/${tag.tag}`" :key="tag.tag" class="local">{{ tag.tag }}</router-link>
<router-link v-for="tag in tagsRemote" :to="`/explore/tags/${tag.tag}`" :key="tag.tag">{{ tag.tag }}</router-link>
</div> </div>
</ui-container> </ui-container>
@ -73,7 +74,8 @@ export default Vue.extend({
sort: '+createdAt', sort: '+createdAt',
limit: 10 limit: 10
}), }),
tags: [], tagsLocal: [],
tagsRemote: [],
faBookmark, faChartLine, faCommentAlt, faPlus, faHashtag faBookmark, faChartLine, faCommentAlt, faPlus, faHashtag
}; };
}, },
@ -103,9 +105,17 @@ export default Vue.extend({
created() { created() {
this.$root.api('hashtags/list', { this.$root.api('hashtags/list', {
sort: '+attachedLocalUsers', sort: '+attachedLocalUsers',
attachedToLocalUserOnly: true,
limit: 30 limit: 30
}).then(tags => { }).then(tags => {
this.tags = tags; this.tagsLocal = tags;
});
this.$root.api('hashtags/list', {
sort: '+attachedRemoteUsers',
attachedToRemoteUserOnly: true,
limit: 30
}).then(tags => {
this.tagsRemote = tags;
}); });
} }
}); });
@ -118,4 +128,7 @@ export default Vue.extend({
> * > *
margin-right 16px margin-right 16px
&.local
font-weight bold
</style> </style>

View file

@ -5,8 +5,10 @@ const Hashtag = db.get<IHashtags>('hashtags');
Hashtag.createIndex('tag', { unique: true }); Hashtag.createIndex('tag', { unique: true });
Hashtag.createIndex('mentionedUsersCount'); Hashtag.createIndex('mentionedUsersCount');
Hashtag.createIndex('mentionedLocalUsersCount'); Hashtag.createIndex('mentionedLocalUsersCount');
Hashtag.createIndex('mentionedRemoteUsersCount');
Hashtag.createIndex('attachedUsersCount'); Hashtag.createIndex('attachedUsersCount');
Hashtag.createIndex('attachedLocalUsersCount'); Hashtag.createIndex('attachedLocalUsersCount');
Hashtag.createIndex('attachedRemoteUsersCount');
export default Hashtag; export default Hashtag;
// 後方互換性のため // 後方互換性のため
@ -29,6 +31,20 @@ Hashtag.findOne({ attachedUserIds: { $exists: false }}).then(h => {
}); });
} }
}); });
Hashtag.findOne({ attachedRemoteUserIds: { $exists: false }}).then(h => {
if (h != null) {
Hashtag.update({}, {
$set: {
mentionedRemoteUserIds: [],
mentionedRemoteUsersCount: 0,
attachedRemoteUserIds: [],
attachedRemoteUsersCount: 0,
}
}, {
multi: true
});
}
});
export interface IHashtags { export interface IHashtags {
tag: string; tag: string;
@ -36,8 +52,12 @@ export interface IHashtags {
mentionedUsersCount: number; mentionedUsersCount: number;
mentionedLocalUserIds: mongo.ObjectID[]; mentionedLocalUserIds: mongo.ObjectID[];
mentionedLocalUsersCount: number; mentionedLocalUsersCount: number;
mentionedRemoteUserIds: mongo.ObjectID[];
mentionedRemoteUsersCount: number;
attachedUserIds: mongo.ObjectID[]; attachedUserIds: mongo.ObjectID[];
attachedUsersCount: number; attachedUsersCount: number;
attachedLocalUserIds: mongo.ObjectID[]; attachedLocalUserIds: mongo.ObjectID[];
attachedLocalUsersCount: number; attachedLocalUsersCount: number;
attachedRemoteUserIds: mongo.ObjectID[];
attachedRemoteUsersCount: number;
} }

View file

@ -11,16 +11,35 @@ export const meta = {
default: 10 default: 10
}, },
attachedToUserOnly: {
validator: $.optional.bool,
default: false
},
attachedToLocalUserOnly: {
validator: $.optional.bool,
default: false
},
attachedToRemoteUserOnly: {
validator: $.optional.bool,
default: false
},
sort: { sort: {
validator: $.str.or([ validator: $.str.or([
'+mentionedUsers', '+mentionedUsers',
'-mentionedUsers', '-mentionedUsers',
'+mentionedLocalUsers', '+mentionedLocalUsers',
'-mentionedLocalUsers', '-mentionedLocalUsers',
'+mentionedRemoteUsers',
'-mentionedRemoteUsers',
'+attachedUsers', '+attachedUsers',
'-attachedUsers', '-attachedUsers',
'+attachedLocalUsers', '+attachedLocalUsers',
'-attachedLocalUsers', '-attachedLocalUsers',
'+attachedRemoteUsers',
'-attachedRemoteUsers',
]), ]),
}, },
} }
@ -31,23 +50,33 @@ const sort: any = {
'-mentionedUsers': { mentionedUsersCount: 1 }, '-mentionedUsers': { mentionedUsersCount: 1 },
'+mentionedLocalUsers': { mentionedLocalUsersCount: -1 }, '+mentionedLocalUsers': { mentionedLocalUsersCount: -1 },
'-mentionedLocalUsers': { mentionedLocalUsersCount: 1 }, '-mentionedLocalUsers': { mentionedLocalUsersCount: 1 },
'+mentionedRemoteUsers': { mentionedRemoteUsersCount: -1 },
'-mentionedRemoteUsers': { mentionedRemoteUsersCount: 1 },
'+attachedUsers': { attachedUsersCount: -1 }, '+attachedUsers': { attachedUsersCount: -1 },
'-attachedUsers': { attachedUsersCount: 1 }, '-attachedUsers': { attachedUsersCount: 1 },
'+attachedLocalUsers': { attachedLocalUsersCount: -1 }, '+attachedLocalUsers': { attachedLocalUsersCount: -1 },
'-attachedLocalUsers': { attachedLocalUsersCount: 1 }, '-attachedLocalUsers': { attachedLocalUsersCount: 1 },
'+attachedRemoteUsers': { attachedRemoteUsersCount: -1 },
'-attachedRemoteUsers': { attachedRemoteUsersCount: 1 },
}; };
export default define(meta, (ps, me) => new Promise(async (res, rej) => { export default define(meta, (ps, me) => new Promise(async (res, rej) => {
const q = {} as any;
if (ps.attachedToUserOnly) q.attachedUsersCount = { $ne: 0 };
if (ps.attachedToLocalUserOnly) q.attachedLocalUsersCount = { $ne: 0 };
if (ps.attachedToRemoteUserOnly) q.attachedRemoteUsersCount = { $ne: 0 };
const tags = await Hashtag const tags = await Hashtag
.find({}, { .find(q, {
limit: ps.limit, limit: ps.limit,
sort: sort[ps.sort], sort: sort[ps.sort],
fields: { fields: {
tag: true, tag: true,
mentionedUsersCount: true, mentionedUsersCount: true,
mentionedLocalUsersCount: true, mentionedLocalUsersCount: true,
mentionedRemoteUsersCount: true,
attachedUsersCount: true, attachedUsersCount: true,
attachedLocalUsersCount: true attachedLocalUsersCount: true,
attachedRemoteUsersCount: true
} }
}); });

View file

@ -1,4 +1,4 @@
import { IUser, isLocalUser } from '../models/user'; import { IUser, isLocalUser, isRemoteUser } from '../models/user';
import Hashtag from '../models/hashtag'; import Hashtag from '../models/hashtag';
import hashtagChart from './chart/hashtag'; import hashtagChart from './chart/hashtag';
@ -26,12 +26,20 @@ export async function updateHashtag(user: IUser, tag: string, isUserAttached = f
$push.attachedLocalUserIds = user._id; $push.attachedLocalUserIds = user._id;
$inc.attachedLocalUsersCount = 1; $inc.attachedLocalUsersCount = 1;
} }
// 自分が(リモートで)初めてこのタグを使ったなら
if (isRemoteUser(user) && !index.attachedRemoteUserIds.some(id => id.equals(user._id))) {
$push.attachedRemoteUserIds = user._id;
$inc.attachedRemoteUsersCount = 1;
}
} else { } else {
$pull.attachedUserIds = user._id; $pull.attachedUserIds = user._id;
$inc.attachedUsersCount = -1; $inc.attachedUsersCount = -1;
if (isLocalUser(user)) { if (isLocalUser(user)) {
$pull.attachedLocalUserIds = user._id; $pull.attachedLocalUserIds = user._id;
$inc.attachedLocalUsersCount = -1; $inc.attachedLocalUsersCount = -1;
} else {
$pull.attachedRemoteUserIds = user._id;
$inc.attachedRemoteUsersCount = -1;
} }
} }
} else { } else {
@ -45,6 +53,11 @@ export async function updateHashtag(user: IUser, tag: string, isUserAttached = f
$push.mentionedLocalUserIds = user._id; $push.mentionedLocalUserIds = user._id;
$inc.mentionedLocalUsersCount = 1; $inc.mentionedLocalUsersCount = 1;
} }
// 自分が(リモートで)初めてこのタグを使ったなら
if (isRemoteUser(user) && !index.mentionedRemoteUserIds.some(id => id.equals(user._id))) {
$push.mentionedRemoteUserIds = user._id;
$inc.mentionedRemoteUsersCount = 1;
}
} }
const q = {} as any; const q = {} as any;
@ -60,10 +73,14 @@ export async function updateHashtag(user: IUser, tag: string, isUserAttached = f
mentionedUsersCount: 0, mentionedUsersCount: 0,
mentionedLocalUserIds: [], mentionedLocalUserIds: [],
mentionedLocalUsersCount: 0, mentionedLocalUsersCount: 0,
mentionedRemoteUserIds: [],
mentionedRemoteUsersCount: 0,
attachedUserIds: [user._id], attachedUserIds: [user._id],
attachedUsersCount: 1, attachedUsersCount: 1,
attachedLocalUserIds: isLocalUser(user) ? [user._id] : [], attachedLocalUserIds: isLocalUser(user) ? [user._id] : [],
attachedLocalUsersCount: isLocalUser(user) ? 1 : 0 attachedLocalUsersCount: isLocalUser(user) ? 1 : 0,
attachedRemoteUserIds: isRemoteUser(user) ? [user._id] : [],
attachedRemoteUsersCount: isRemoteUser(user) ? 1 : 0,
}); });
} else { } else {
Hashtag.insert({ Hashtag.insert({
@ -72,10 +89,14 @@ export async function updateHashtag(user: IUser, tag: string, isUserAttached = f
mentionedUsersCount: 1, mentionedUsersCount: 1,
mentionedLocalUserIds: isLocalUser(user) ? [user._id] : [], mentionedLocalUserIds: isLocalUser(user) ? [user._id] : [],
mentionedLocalUsersCount: isLocalUser(user) ? 1 : 0, mentionedLocalUsersCount: isLocalUser(user) ? 1 : 0,
mentionedRemoteUserIds: isRemoteUser(user) ? [user._id] : [],
mentionedRemoteUsersCount: isRemoteUser(user) ? 1 : 0,
attachedUserIds: [], attachedUserIds: [],
attachedUsersCount: 0, attachedUsersCount: 0,
attachedLocalUserIds: [], attachedLocalUserIds: [],
attachedLocalUsersCount: 0 attachedLocalUsersCount: 0,
attachedRemoteUserIds: [],
attachedRemoteUsersCount: 0,
}); });
} }
} }