summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorsyuilo <syuilotan@yahoo.co.jp>2019-04-25 13:25:10 +0900
committersyuilo <syuilotan@yahoo.co.jp>2019-04-25 13:25:10 +0900
commit6721d27e3f085a2335485eed0eb90409240539c1 (patch)
tree9cfebab85e7cd4651f2d2dac9929a21d7d21e6da /src
parentImprove API definition (diff)
downloadsharkey-6721d27e3f085a2335485eed0eb90409240539c1.tar.gz
sharkey-6721d27e3f085a2335485eed0eb90409240539c1.tar.bz2
sharkey-6721d27e3f085a2335485eed0eb90409240539c1.zip
Improve hashtag API
Diffstat (limited to 'src')
-rw-r--r--src/models/index.ts4
-rw-r--r--src/models/repositories/hashtag.ts71
-rw-r--r--src/server/api/endpoints/hashtags/list.ts2
-rw-r--r--src/server/api/endpoints/hashtags/show.ts48
-rw-r--r--src/server/api/openapi/schemas.ts46
5 files changed, 124 insertions, 47 deletions
diff --git a/src/models/index.ts b/src/models/index.ts
index d66e4e710a..826044e7a5 100644
--- a/src/models/index.ts
+++ b/src/models/index.ts
@@ -7,7 +7,6 @@ import { Meta } from './entities/meta';
import { SwSubscription } from './entities/sw-subscription';
import { NoteWatching } from './entities/note-watching';
import { UserListJoining } from './entities/user-list-joining';
-import { Hashtag } from './entities/hashtag';
import { NoteUnread } from './entities/note-unread';
import { RegistrationTicket } from './entities/registration-tickets';
import { UserRepository } from './repositories/user';
@@ -35,6 +34,7 @@ import { FollowingRepository } from './repositories/following';
import { AbuseUserReportRepository } from './repositories/abuse-user-report';
import { AuthSessionRepository } from './repositories/auth-session';
import { UserProfile } from './entities/user-profile';
+import { HashtagRepository } from './repositories/hashtag';
export const Apps = getCustomRepository(AppRepository);
export const Notes = getCustomRepository(NoteRepository);
@@ -62,7 +62,7 @@ export const Metas = getRepository(Meta);
export const Mutings = getCustomRepository(MutingRepository);
export const Blockings = getCustomRepository(BlockingRepository);
export const SwSubscriptions = getRepository(SwSubscription);
-export const Hashtags = getRepository(Hashtag);
+export const Hashtags = getCustomRepository(HashtagRepository);
export const AbuseUserReports = getCustomRepository(AbuseUserReportRepository);
export const RegistrationTickets = getRepository(RegistrationTicket);
export const AuthSessions = getCustomRepository(AuthSessionRepository);
diff --git a/src/models/repositories/hashtag.ts b/src/models/repositories/hashtag.ts
new file mode 100644
index 0000000000..22321fca80
--- /dev/null
+++ b/src/models/repositories/hashtag.ts
@@ -0,0 +1,71 @@
+import { EntityRepository, Repository } from 'typeorm';
+import { Hashtag } from '../entities/hashtag';
+import { SchemaType, types, bool } from '../../misc/schema';
+
+export type PackedHashtag = SchemaType<typeof packedHashtagSchema>;
+
+@EntityRepository(Hashtag)
+export class HashtagRepository extends Repository<Hashtag> {
+ public packMany(
+ hashtags: Hashtag[],
+ ) {
+ return Promise.all(hashtags.map(x => this.pack(x)));
+ }
+
+ public async pack(
+ src: Hashtag,
+ ): Promise<PackedHashtag> {
+ return {
+ tag: src.name,
+ mentionedUsersCount: src.mentionedUsersCount,
+ mentionedLocalUsersCount: src.mentionedLocalUsersCount,
+ mentionedRemoteUsersCount: src.mentionedRemoteUsersCount,
+ attachedUsersCount: src.attachedUsersCount,
+ attachedLocalUsersCount: src.attachedLocalUsersCount,
+ attachedRemoteUsersCount: src.attachedRemoteUsersCount,
+ };
+ }
+}
+
+export const packedHashtagSchema = {
+ type: types.object,
+ optional: bool.false, nullable: bool.false,
+ properties: {
+ tag: {
+ type: types.string,
+ optional: bool.false, nullable: bool.false,
+ description: 'The hashtag name. No # prefixed.',
+ example: 'misskey',
+ },
+ mentionedUsersCount: {
+ type: types.number,
+ optional: bool.false, nullable: bool.false,
+ description: 'Number of all users using this hashtag.'
+ },
+ mentionedLocalUsersCount: {
+ type: types.number,
+ optional: bool.false, nullable: bool.false,
+ description: 'Number of local users using this hashtag.'
+ },
+ mentionedRemoteUsersCount: {
+ type: types.number,
+ optional: bool.false, nullable: bool.false,
+ description: 'Number of remote users using this hashtag.'
+ },
+ attachedUsersCount: {
+ type: types.number,
+ optional: bool.false, nullable: bool.false,
+ description: 'Number of all users who attached this hashtag to profile.'
+ },
+ attachedLocalUsersCount: {
+ type: types.number,
+ optional: bool.false, nullable: bool.false,
+ description: 'Number of local users who attached this hashtag to profile.'
+ },
+ attachedRemoteUsersCount: {
+ type: types.number,
+ optional: bool.false, nullable: bool.false,
+ description: 'Number of remote users who attached this hashtag to profile.'
+ },
+ }
+};
diff --git a/src/server/api/endpoints/hashtags/list.ts b/src/server/api/endpoints/hashtags/list.ts
index 89cc926422..9023f11913 100644
--- a/src/server/api/endpoints/hashtags/list.ts
+++ b/src/server/api/endpoints/hashtags/list.ts
@@ -92,5 +92,5 @@ export default define(meta, async (ps, me) => {
const tags = await query.take(ps.limit!).getMany();
- return tags;
+ return Hashtags.packMany(tags);
});
diff --git a/src/server/api/endpoints/hashtags/show.ts b/src/server/api/endpoints/hashtags/show.ts
new file mode 100644
index 0000000000..72a4cc7c87
--- /dev/null
+++ b/src/server/api/endpoints/hashtags/show.ts
@@ -0,0 +1,48 @@
+import $ from 'cafy';
+import define from '../../define';
+import { ApiError } from '../../error';
+import { Hashtags } from '../../../../models';
+import { types, bool } from '../../../../misc/schema';
+
+export const meta = {
+ desc: {
+ 'ja-JP': '指定したハッシュタグの情報を取得します。',
+ },
+
+ tags: ['hashtags'],
+
+ requireCredential: false,
+
+ params: {
+ tag: {
+ validator: $.str,
+ desc: {
+ 'ja-JP': '対象のハッシュタグ(#なし)',
+ 'en-US': 'Target hashtag. (no # prefixed)'
+ }
+ }
+ },
+
+ res: {
+ type: types.object,
+ optional: bool.false, nullable: bool.false,
+ ref: 'Hashtag',
+ },
+
+ errors: {
+ noSuchHashtag: {
+ message: 'No such hashtag.',
+ code: 'NO_SUCH_HASHTAG',
+ id: '110ee688-193e-4a3a-9ecf-c167b2e6981e'
+ }
+ }
+};
+
+export default define(meta, async (ps, user) => {
+ const hashtag = await Hashtags.findOne({ name: ps.tag.toLowerCase() });
+ if (hashtag == null) {
+ throw new ApiError(meta.errors.noSuchHashtag);
+ }
+
+ return await Hashtags.pack(hashtag);
+});
diff --git a/src/server/api/openapi/schemas.ts b/src/server/api/openapi/schemas.ts
index e54f989e74..34e6f8947d 100644
--- a/src/server/api/openapi/schemas.ts
+++ b/src/server/api/openapi/schemas.ts
@@ -11,6 +11,7 @@ import { packedFollowingSchema } from '../../../models/repositories/following';
import { packedMutingSchema } from '../../../models/repositories/muting';
import { packedBlockingSchema } from '../../../models/repositories/blocking';
import { packedNoteReactionSchema } from '../../../models/repositories/note-reaction';
+import { packedHashtagSchema } from '../../../models/repositories/hashtag';
export function convertSchemaToOpenApiSchema(schema: Schema) {
const res: any = schema;
@@ -74,48 +75,5 @@ export const schemas = {
Muting: convertSchemaToOpenApiSchema(packedMutingSchema),
Blocking: convertSchemaToOpenApiSchema(packedBlockingSchema),
NoteReaction: convertSchemaToOpenApiSchema(packedNoteReactionSchema),
-
- Hashtag: {
- type: 'object',
- properties: {
- tag: {
- type: 'string',
- description: 'The hashtag name. No # prefixed.',
- example: 'misskey',
- },
- mentionedUsersCount: {
- type: 'number',
- description: 'Number of all users using this hashtag.'
- },
- mentionedLocalUsersCount: {
- type: 'number',
- description: 'Number of local users using this hashtag.'
- },
- mentionedRemoteUsersCount: {
- type: 'number',
- description: 'Number of remote users using this hashtag.'
- },
- attachedUsersCount: {
- type: 'number',
- description: 'Number of all users who attached this hashtag to profile.'
- },
- attachedLocalUsersCount: {
- type: 'number',
- description: 'Number of local users who attached this hashtag to profile.'
- },
- attachedRemoteUsersCount: {
- type: 'number',
- description: 'Number of remote users who attached this hashtag to profile.'
- },
- },
- required: [
- 'tag',
- 'mentionedUsersCount',
- 'mentionedLocalUsersCount',
- 'mentionedRemoteUsersCount',
- 'attachedUsersCount',
- 'attachedLocalUsersCount',
- 'attachedRemoteUsersCount',
- ]
- },
+ Hashtag: convertSchemaToOpenApiSchema(packedHashtagSchema),
};