iceshrimp-legacy/packages/backend/src/remote/activitypub/db-resolver.ts

141 lines
2.9 KiB
TypeScript
Raw Normal View History

import config from '@/config/index.js';
import { Note } from '@/models/entities/note.js';
import { User, IRemoteUser } from '@/models/entities/user.js';
import { UserPublickey } from '@/models/entities/user-publickey.js';
import { MessagingMessage } from '@/models/entities/messaging-message.js';
import { Notes, Users, UserPublickeys, MessagingMessages } from '@/models/index.js';
import { IObject, getApId } from './type.js';
import { resolvePerson } from './models/person.js';
import escapeRegexp from 'escape-regexp';
export default class DbResolver {
constructor() {
}
/**
* AP Note => Misskey Note in DB
*/
public async getNoteFromApId(value: string | IObject): Promise<Note | null> {
const parsed = this.parseUri(value);
if (parsed.id) {
return (await Notes.findOne({
2021-12-09 15:58:30 +01:00
id: parsed.id,
})) || null;
}
if (parsed.uri) {
return (await Notes.findOne({
2021-12-09 15:58:30 +01:00
uri: parsed.uri,
})) || null;
}
return null;
}
public async getMessageFromApId(value: string | IObject): Promise<MessagingMessage | null> {
const parsed = this.parseUri(value);
if (parsed.id) {
return (await MessagingMessages.findOne({
2021-12-09 15:58:30 +01:00
id: parsed.id,
})) || null;
}
if (parsed.uri) {
return (await MessagingMessages.findOne({
2021-12-09 15:58:30 +01:00
uri: parsed.uri,
})) || null;
}
return null;
}
/**
* AP Person => Misskey User in DB
*/
public async getUserFromApId(value: string | IObject): Promise<User | null> {
const parsed = this.parseUri(value);
if (parsed.id) {
return (await Users.findOne({
2021-12-09 15:58:30 +01:00
id: parsed.id,
})) || null;
}
if (parsed.uri) {
return (await Users.findOne({
2021-12-09 15:58:30 +01:00
uri: parsed.uri,
})) || null;
}
return null;
}
/**
* AP KeyId => Misskey User and Key
*/
public async getAuthUserFromKeyId(keyId: string): Promise<AuthUser | null> {
const key = await UserPublickeys.findOne({
2021-12-09 15:58:30 +01:00
keyId,
2022-03-20 07:44:49 +01:00
}, {
relations: ['user'],
});
if (key == null) return null;
return {
2022-03-20 07:44:49 +01:00
user: key.user as IRemoteUser,
2021-12-09 15:58:30 +01:00
key,
};
}
/**
* AP Actor id => Misskey User and Key
*/
public async getAuthUserFromApId(uri: string): Promise<AuthUser | null> {
const user = await resolvePerson(uri) as IRemoteUser;
if (user == null) return null;
const key = await UserPublickeys.findOne(user.id);
return {
user,
2021-12-09 15:58:30 +01:00
key,
};
}
public parseUri(value: string | IObject): UriParseResult {
const uri = getApId(value);
const localRegex = new RegExp('^' + escapeRegexp(config.url) + '/' + '(\\w+)' + '/' + '(\\w+)');
const matchLocal = uri.match(localRegex);
if (matchLocal) {
return {
type: matchLocal[1],
2021-12-09 15:58:30 +01:00
id: matchLocal[2],
};
} else {
return {
2021-12-09 15:58:30 +01:00
uri,
};
}
}
}
export type AuthUser = {
user: IRemoteUser;
key?: UserPublickey;
};
type UriParseResult = {
/** id in DB (local object only) */
id?: string;
/** uri in DB (remote object only) */
uri?: string;
/** hint of type (local object only, ex: notes, users) */
type?: string
};