summaryrefslogtreecommitdiff
path: root/packages/backend/src/server/api/endpoints/ap
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2022-09-18 03:27:08 +0900
committerGitHub <noreply@github.com>2022-09-18 03:27:08 +0900
commitb75184ec8e3436200bacdcd832e3324702553d20 (patch)
tree8b7e316f29e95df921db57289c8b8da476d18f07 /packages/backend/src/server/api/endpoints/ap
parentUpdate ROADMAP.md (diff)
downloadsharkey-b75184ec8e3436200bacdcd832e3324702553d20.tar.gz
sharkey-b75184ec8e3436200bacdcd832e3324702553d20.tar.bz2
sharkey-b75184ec8e3436200bacdcd832e3324702553d20.zip
なんかもうめっちゃ変えた
Diffstat (limited to 'packages/backend/src/server/api/endpoints/ap')
-rw-r--r--packages/backend/src/server/api/endpoints/ap/get.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/ap/show.ts165
2 files changed, 109 insertions, 80 deletions
diff --git a/packages/backend/src/server/api/endpoints/ap/get.ts b/packages/backend/src/server/api/endpoints/ap/get.ts
index 0cbe7ebc67..3d4c85e50b 100644
--- a/packages/backend/src/server/api/endpoints/ap/get.ts
+++ b/packages/backend/src/server/api/endpoints/ap/get.ts
@@ -1,7 +1,8 @@
-import define from '../../define.js';
-import Resolver from '@/remote/activitypub/resolver.js';
-import { ApiError } from '../../error.js';
+import { Inject, Injectable } from '@nestjs/common';
import ms from 'ms';
+import { Endpoint } from '@/server/api/endpoint-base.js';
+import { ApResolverService } from '@/core/remote/activitypub/ApResolverService.js';
+import { ApiError } from '../../error.js';
export const meta = {
tags: ['federation'],
@@ -31,8 +32,15 @@ export const paramDef = {
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, paramDef, async (ps) => {
- const resolver = new Resolver();
- const object = await resolver.resolve(ps.uri);
- return object;
-});
+@Injectable()
+export default class extends Endpoint<typeof meta, typeof paramDef> {
+ constructor(
+ private apResolverService: ApResolverService,
+ ) {
+ super(meta, paramDef, async (ps, me) => {
+ const resolver = this.apResolverService.createResolver();
+ const object = await resolver.resolve(ps.uri);
+ return object;
+ });
+ }
+}
diff --git a/packages/backend/src/server/api/endpoints/ap/show.ts b/packages/backend/src/server/api/endpoints/ap/show.ts
index 6442a1412c..eaf93ee977 100644
--- a/packages/backend/src/server/api/endpoints/ap/show.ts
+++ b/packages/backend/src/server/api/endpoints/ap/show.ts
@@ -1,18 +1,21 @@
-import define from '../../define.js';
-import config from '@/config/index.js';
-import { createPerson } from '@/remote/activitypub/models/person.js';
-import { createNote } from '@/remote/activitypub/models/note.js';
-import DbResolver from '@/remote/activitypub/db-resolver.js';
-import Resolver from '@/remote/activitypub/resolver.js';
-import { ApiError } from '../../error.js';
-import { extractDbHost } from '@/misc/convert-host.js';
-import { Users, Notes } from '@/models/index.js';
-import { Note } from '@/models/entities/note.js';
-import { CacheableLocalUser, User } from '@/models/entities/user.js';
-import { fetchMeta } from '@/misc/fetch-meta.js';
-import { isActor, isPost, getApId } from '@/remote/activitypub/type.js';
+import { Inject, Injectable } from '@nestjs/common';
import ms from 'ms';
-import { SchemaType } from '@/misc/schema.js';
+import { Endpoint } from '@/server/api/endpoint-base.js';
+import { UsersRepository, NotesRepository } from '@/models/index.js';
+import type { Note } from '@/models/entities/Note.js';
+import type { CacheableLocalUser, User } from '@/models/entities/User.js';
+import { isActor, isPost, getApId } from '@/core/remote/activitypub/type.js';
+import type { SchemaType } from '@/misc/schema.js';
+import { ApResolverService } from '@/core/remote/activitypub/ApResolverService.js';
+import { ApDbResolverService } from '@/core/remote/activitypub/ApDbResolverService.js';
+import { MetaService } from '@/core/MetaService.js';
+import { ApPersonService } from '@/core/remote/activitypub/models/ApPersonService.js';
+import { ApNoteService } from '@/core/remote/activitypub/models/ApNoteService.js';
+import { UserEntityService } from '@/core/entities/UserEntityService.js';
+import { NoteEntityService } from '@/core/entities/NoteEntityService.js';
+import { UtilityService } from '@/core/UtilityService.js';
+import { DI } from '@/di-symbols.js';
+import { ApiError } from '../../error.js';
export const meta = {
tags: ['federation'],
@@ -47,8 +50,8 @@ export const meta = {
type: 'object',
optional: false, nullable: false,
ref: 'UserDetailedNotMe',
- }
- }
+ },
+ },
},
{
type: 'object',
@@ -62,9 +65,9 @@ export const meta = {
type: 'object',
optional: false, nullable: false,
ref: 'Note',
- }
- }
- }
+ },
+ },
+ },
],
},
} as const;
@@ -78,70 +81,88 @@ export const paramDef = {
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, paramDef, async (ps, me) => {
- const object = await fetchAny(ps.uri, me);
- if (object) {
- return object;
- } else {
- throw new ApiError(meta.errors.noSuchObject);
- }
-});
-
-/***
- * URIからUserかNoteを解決する
- */
-async function fetchAny(uri: string, me: CacheableLocalUser | null | undefined): Promise<SchemaType<typeof meta['res']> | null> {
- // ブロックしてたら中断
- const fetchedMeta = await fetchMeta();
- if (fetchedMeta.blockedHosts.includes(extractDbHost(uri))) return null;
+@Injectable()
+export default class extends Endpoint<typeof meta, typeof paramDef> {
+ constructor(
+ @Inject(DI.usersRepository)
+ private usersRepository: UsersRepository,
- const dbResolver = new DbResolver();
+ @Inject(DI.notesRepository)
+ private notesRepository: NotesRepository,
- let local = await mergePack(me, ...await Promise.all([
- dbResolver.getUserFromApId(uri),
- dbResolver.getNoteFromApId(uri),
- ]));
- if (local != null) return local;
+ private utilityService: UtilityService,
+ private userEntityService: UserEntityService,
+ private noteEntityService: NoteEntityService,
+ private metaService: MetaService,
+ private apResolverService: ApResolverService,
+ private apDbResolverService: ApDbResolverService,
+ private apPersonService: ApPersonService,
+ private apNoteService: ApNoteService,
+ ) {
+ super(meta, paramDef, async (ps, me) => {
+ const object = await this.#fetchAny(ps.uri, me);
+ if (object) {
+ return object;
+ } else {
+ throw new ApiError(meta.errors.noSuchObject);
+ }
+ });
+ }
- // リモートから一旦オブジェクトフェッチ
- const resolver = new Resolver();
- const object = await resolver.resolve(uri) as any;
+ /***
+ * URIからUserかNoteを解決する
+ */
+ async #fetchAny(uri: string, me: CacheableLocalUser | null | undefined): Promise<SchemaType<typeof meta['res']> | null> {
+ // ブロックしてたら中断
+ const fetchedMeta = await this.metaService.fetch();
+ if (fetchedMeta.blockedHosts.includes(this.utilityService.extractDbHost(uri))) return null;
- // /@user のような正規id以外で取得できるURIが指定されていた場合、ここで初めて正規URIが確定する
- // これはDBに存在する可能性があるため再度DB検索
- if (uri !== object.id) {
- local = await mergePack(me, ...await Promise.all([
- dbResolver.getUserFromApId(object.id),
- dbResolver.getNoteFromApId(object.id),
+ let local = await this.#mergePack(me, ...await Promise.all([
+ this.apDbResolverService.getUserFromApId(uri),
+ this.apDbResolverService.getNoteFromApId(uri),
]));
if (local != null) return local;
- }
- return await mergePack(
- me,
- isActor(object) ? await createPerson(getApId(object)) : null,
- isPost(object) ? await createNote(getApId(object), undefined, true) : null,
- );
-}
+ // リモートから一旦オブジェクトフェッチ
+ const resolver = this.apResolverService.createResolver();
+ const object = await resolver.resolve(uri) as any;
+
+ // /@user のような正規id以外で取得できるURIが指定されていた場合、ここで初めて正規URIが確定する
+ // これはDBに存在する可能性があるため再度DB検索
+ if (uri !== object.id) {
+ local = await this.#mergePack(me, ...await Promise.all([
+ this.apDbResolverService.getUserFromApId(object.id),
+ this.apDbResolverService.getNoteFromApId(object.id),
+ ]));
+ if (local != null) return local;
+ }
-async function mergePack(me: CacheableLocalUser | null | undefined, user: User | null | undefined, note: Note | null | undefined): Promise<SchemaType<typeof meta.res> | null> {
- if (user != null) {
- return {
- type: 'User',
- object: await Users.pack(user, me, { detail: true }),
- };
- } else if (note != null) {
- try {
- const object = await Notes.pack(note, me, { detail: true });
+ return await this.#mergePack(
+ me,
+ isActor(object) ? await this.apPersonService.createPerson(getApId(object)) : null,
+ isPost(object) ? await this.apNoteService.createNote(getApId(object), undefined, true) : null,
+ );
+ }
+ async #mergePack(me: CacheableLocalUser | null | undefined, user: User | null | undefined, note: Note | null | undefined): Promise<SchemaType<typeof meta.res> | null> {
+ if (user != null) {
return {
- type: 'Note',
- object,
+ type: 'User',
+ object: await this.userEntityService.pack(user, me, { detail: true }),
};
- } catch (e) {
- return null;
+ } else if (note != null) {
+ try {
+ const object = await this.noteEntityService.pack(note, me, { detail: true });
+
+ return {
+ type: 'Note',
+ object,
+ };
+ } catch (e) {
+ return null;
+ }
}
- }
- return null;
+ return null;
+ }
}