/, '
');
happyDOM.close().catch(err => {});
diff --git a/packages/backend/src/core/NoteDeleteService.ts b/packages/backend/src/core/NoteDeleteService.ts
index 4ecd2592b2..e394506a44 100644
--- a/packages/backend/src/core/NoteDeleteService.ts
+++ b/packages/backend/src/core/NoteDeleteService.ts
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: AGPL-3.0-only
*/
-import { Brackets, In } from 'typeorm';
+import { Brackets, In, IsNull, Not } from 'typeorm';
import { Injectable, Inject } from '@nestjs/common';
import type { MiUser, MiLocalUser, MiRemoteUser } from '@/models/User.js';
import type { MiNote, IMentionedRemoteUsers } from '@/models/Note.js';
@@ -189,13 +189,27 @@ export class NoteDeleteService {
}) as MiRemoteUser[];
}
+ @bindThis
+ private async getRenotedOrRepliedRemoteUsers(note: MiNote) {
+ const query = this.notesRepository.createQueryBuilder('note')
+ .leftJoinAndSelect('note.user', 'user')
+ .where(new Brackets(qb => {
+ qb.orWhere('note.renoteId = :renoteId', { renoteId: note.id });
+ qb.orWhere('note.replyId = :replyId', { replyId: note.id });
+ }))
+ .andWhere({ userHost: Not(IsNull()) });
+ const notes = await query.getMany() as (MiNote & { user: MiRemoteUser })[];
+ const remoteUsers = notes.map(({ user }) => user);
+ return remoteUsers;
+ }
+
@bindThis
private async deliverToConcerned(user: { id: MiLocalUser['id']; host: null; }, note: MiNote, content: any) {
this.apDeliverManagerService.deliverToFollowers(user, content);
this.relayService.deliverToRelays(user, content);
- const remoteUsers = await this.getMentionedRemoteUsers(note);
- for (const remoteUser of remoteUsers) {
- this.apDeliverManagerService.deliverToUser(user, content, remoteUser);
- }
+ this.apDeliverManagerService.deliverToUsers(user, content, [
+ ...await this.getMentionedRemoteUsers(note),
+ ...await this.getRenotedOrRepliedRemoteUsers(note),
+ ]);
}
}
diff --git a/packages/backend/src/core/RemoteUserResolveService.ts b/packages/backend/src/core/RemoteUserResolveService.ts
index 098b5e1706..a2f1b73cdb 100644
--- a/packages/backend/src/core/RemoteUserResolveService.ts
+++ b/packages/backend/src/core/RemoteUserResolveService.ts
@@ -74,7 +74,7 @@ export class RemoteUserResolveService {
if (user == null) {
const self = await this.resolveSelf(acctLower);
- if (self.href.startsWith(this.config.url)) {
+ if (this.utilityService.isUriLocal(self.href)) {
const local = this.apDbResolverService.parseUri(self.href);
if (local.local && local.type === 'users') {
// the LR points to local
diff --git a/packages/backend/src/core/SearchService.ts b/packages/backend/src/core/SearchService.ts
index 64e3f2f56a..bc62559e46 100644
--- a/packages/backend/src/core/SearchService.ts
+++ b/packages/backend/src/core/SearchService.ts
@@ -220,7 +220,7 @@ export class SearchService {
.leftJoinAndSelect('renote.user', 'renoteUser');
if (this.config.fulltextSearch?.provider === 'sqlPgroonga') {
- query.andWhere('note.text &@ :q', { q });
+ query.andWhere('note.text &@~ :q', { q });
} else {
query.andWhere('LOWER(note.text) LIKE :q', { q: `%${ sqlLikeEscape(q.toLowerCase()) }%` });
}
diff --git a/packages/backend/src/core/UserWebhookService.ts b/packages/backend/src/core/UserWebhookService.ts
index b1728671ae..9b0a598a1b 100644
--- a/packages/backend/src/core/UserWebhookService.ts
+++ b/packages/backend/src/core/UserWebhookService.ts
@@ -15,7 +15,7 @@ import { QueueService } from '@/core/QueueService.js';
import type { OnApplicationShutdown } from '@nestjs/common';
export type UserWebhookPayload =
:
p['anyOf'] extends ReadonlyArray = NullOrUndefined >;
diff --git a/packages/backend/src/misc/json-value.ts b/packages/backend/src/misc/json-value.ts
index bd7fe12058..195f7c4d47 100644
--- a/packages/backend/src/misc/json-value.ts
+++ b/packages/backend/src/misc/json-value.ts
@@ -4,7 +4,7 @@
*/
export type JsonValue = JsonArray | JsonObject | string | number | boolean | null;
-export type JsonObject = {[K in string]?: JsonValue};
+export type JsonObject = { [K in string]?: JsonValue };
export type JsonArray = JsonValue[];
export function isJsonObject(value: JsonValue | undefined): value is JsonObject {
diff --git a/packages/backend/src/models/Meta.ts b/packages/backend/src/models/Meta.ts
index ad5e31ad6f..9df2f74984 100644
--- a/packages/backend/src/models/Meta.ts
+++ b/packages/backend/src/models/Meta.ts
@@ -658,4 +658,10 @@ export class MiMeta {
default: '{}',
})
public federationHosts: string[];
+
+ @Column('varchar', {
+ length: 64,
+ nullable: true,
+ })
+ public googleAnalyticsMeasurementId: string | null;
}
diff --git a/packages/backend/src/models/User.ts b/packages/backend/src/models/User.ts
index 96de30c4c2..549d78a22c 100644
--- a/packages/backend/src/models/User.ts
+++ b/packages/backend/src/models/User.ts
@@ -288,24 +288,24 @@ export class MiUser {
export type MiLocalUser = MiUser & {
host: null;
uri: null;
-}
+};
export type MiPartialLocalUser = Partial foo foo foo foo
bar
baz
bar
baz
bar
baz
bar
baz