summaryrefslogtreecommitdiff
path: root/packages/backend/src
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2023-03-08 08:56:47 +0900
committerGitHub <noreply@github.com>2023-03-08 08:56:47 +0900
commitdd6569a1bb025f2e295c9d19d870febcde712ea1 (patch)
tree7ac4c4b1674c7aab27db9cf4b657bb2966e1e37d /packages/backend/src
parentfeat: Per-user renote mute (#10249) (diff)
downloadsharkey-dd6569a1bb025f2e295c9d19d870febcde712ea1.tar.gz
sharkey-dd6569a1bb025f2e295c9d19d870febcde712ea1.tar.bz2
sharkey-dd6569a1bb025f2e295c9d19d870febcde712ea1.zip
feat: Reaction acceptance (#10256)
* wip * wip * デフォルト設定
Diffstat (limited to 'packages/backend/src')
-rw-r--r--packages/backend/src/core/NoteCreateService.ts2
-rw-r--r--packages/backend/src/core/ReactionService.ts8
-rw-r--r--packages/backend/src/core/entities/NoteEntityService.ts1
-rw-r--r--packages/backend/src/misc/schema.ts4
-rw-r--r--packages/backend/src/models/entities/Note.ts5
-rw-r--r--packages/backend/src/models/schema/note.ts4
-rw-r--r--packages/backend/src/queue/processors/ExportFavoritesProcessorService.ts1
-rw-r--r--packages/backend/src/queue/processors/ExportNotesProcessorService.ts3
-rw-r--r--packages/backend/src/server/api/endpoints/notes/create.ts4
9 files changed, 26 insertions, 6 deletions
diff --git a/packages/backend/src/core/NoteCreateService.ts b/packages/backend/src/core/NoteCreateService.ts
index 4c4261ba79..8d8535ca5b 100644
--- a/packages/backend/src/core/NoteCreateService.ts
+++ b/packages/backend/src/core/NoteCreateService.ts
@@ -125,6 +125,7 @@ type Option = {
files?: DriveFile[] | null;
poll?: IPoll | null;
localOnly?: boolean | null;
+ reactionAcceptance?: Note['reactionAcceptance'];
cw?: string | null;
visibility?: string;
visibleUsers?: MinimumUser[] | null;
@@ -346,6 +347,7 @@ export class NoteCreateService implements OnApplicationShutdown {
emojis,
userId: user.id,
localOnly: data.localOnly!,
+ reactionAcceptance: data.reactionAcceptance,
visibility: data.visibility as any,
visibleUserIds: data.visibility === 'specified'
? data.visibleUsers
diff --git a/packages/backend/src/core/ReactionService.ts b/packages/backend/src/core/ReactionService.ts
index 9fccc14ee4..3e644018d7 100644
--- a/packages/backend/src/core/ReactionService.ts
+++ b/packages/backend/src/core/ReactionService.ts
@@ -99,8 +99,12 @@ export class ReactionService {
throw new IdentifiableError('68e9d2d1-48bf-42c2-b90a-b20e09fd3d48', 'Note not accessible for you.');
}
- // TODO: cache
- reaction = await this.toDbReaction(reaction, user.host);
+ if (note.reactionAcceptance === 'likeOnly' || ((note.reactionAcceptance === 'likeOnlyForRemote') && (user.host != null))) {
+ reaction = '❤️';
+ } else {
+ // TODO: cache
+ reaction = await this.toDbReaction(reaction, user.host);
+ }
const record: NoteReaction = {
id: this.idService.genId(),
diff --git a/packages/backend/src/core/entities/NoteEntityService.ts b/packages/backend/src/core/entities/NoteEntityService.ts
index 4ec10df9a6..67850ad9aa 100644
--- a/packages/backend/src/core/entities/NoteEntityService.ts
+++ b/packages/backend/src/core/entities/NoteEntityService.ts
@@ -314,6 +314,7 @@ export class NoteEntityService implements OnModuleInit {
cw: note.cw,
visibility: note.visibility,
localOnly: note.localOnly ?? undefined,
+ reactionAcceptance: note.reactionAcceptance,
visibleUserIds: note.visibility === 'specified' ? note.visibleUserIds : undefined,
renoteCount: note.renoteCount,
repliesCount: note.repliesCount,
diff --git a/packages/backend/src/misc/schema.ts b/packages/backend/src/misc/schema.ts
index 0681cdb67e..9b8af6958f 100644
--- a/packages/backend/src/misc/schema.ts
+++ b/packages/backend/src/misc/schema.ts
@@ -95,7 +95,7 @@ export interface Schema extends OfSchema {
readonly example?: any;
readonly format?: string;
readonly ref?: keyof typeof refs;
- readonly enum?: ReadonlyArray<string>;
+ readonly enum?: ReadonlyArray<string | null>;
readonly default?: (this['type'] extends TypeStringef ? StringDefToType<this['type']> : any) | null;
readonly maxLength?: number;
readonly minLength?: number;
@@ -161,7 +161,7 @@ export type SchemaTypeDef<p extends Schema> =
p['type'] extends 'integer' ? number :
p['type'] extends 'number' ? number :
p['type'] extends 'string' ? (
- p['enum'] extends readonly string[] ?
+ p['enum'] extends readonly (string | null)[] ?
p['enum'][number] :
p['format'] extends 'date-time' ? string : // Dateにする??
string
diff --git a/packages/backend/src/models/entities/Note.ts b/packages/backend/src/models/entities/Note.ts
index 82d042f0ce..df508b4dca 100644
--- a/packages/backend/src/models/entities/Note.ts
+++ b/packages/backend/src/models/entities/Note.ts
@@ -87,6 +87,11 @@ export class Note {
})
public localOnly: boolean;
+ @Column('varchar', {
+ length: 64, nullable: true,
+ })
+ public reactionAcceptance: 'likeOnly' | 'likeOnlyForRemote' | null;
+
@Column('smallint', {
default: 0,
})
diff --git a/packages/backend/src/models/schema/note.ts b/packages/backend/src/models/schema/note.ts
index 72c0c62285..58ef425dcd 100644
--- a/packages/backend/src/models/schema/note.ts
+++ b/packages/backend/src/models/schema/note.ts
@@ -141,6 +141,10 @@ export const packedNoteSchema = {
type: 'boolean',
optional: true, nullable: false,
},
+ reactionAcceptance: {
+ type: 'string',
+ optional: false, nullable: true,
+ },
reactions: {
type: 'object',
optional: false, nullable: false,
diff --git a/packages/backend/src/queue/processors/ExportFavoritesProcessorService.ts b/packages/backend/src/queue/processors/ExportFavoritesProcessorService.ts
index c65f0a97a0..e9330772b9 100644
--- a/packages/backend/src/queue/processors/ExportFavoritesProcessorService.ts
+++ b/packages/backend/src/queue/processors/ExportFavoritesProcessorService.ts
@@ -148,6 +148,7 @@ function serialize(favorite: NoteFavorite & { note: Note & { user: User } }, pol
visibility: favorite.note.visibility,
visibleUserIds: favorite.note.visibleUserIds,
localOnly: favorite.note.localOnly,
+ reactionAcceptance: favorite.note.reactionAcceptance,
uri: favorite.note.uri,
url: favorite.note.url,
user: {
diff --git a/packages/backend/src/queue/processors/ExportNotesProcessorService.ts b/packages/backend/src/queue/processors/ExportNotesProcessorService.ts
index 3f4f16a2ec..2f74dd63cc 100644
--- a/packages/backend/src/queue/processors/ExportNotesProcessorService.ts
+++ b/packages/backend/src/queue/processors/ExportNotesProcessorService.ts
@@ -10,10 +10,10 @@ import { DriveService } from '@/core/DriveService.js';
import { createTemp } from '@/misc/create-temp.js';
import type { Poll } from '@/models/entities/Poll.js';
import type { Note } from '@/models/entities/Note.js';
+import { bindThis } from '@/decorators.js';
import { QueueLoggerService } from '../QueueLoggerService.js';
import type Bull from 'bull';
import type { DbUserJobData } from '../types.js';
-import { bindThis } from '@/decorators.js';
@Injectable()
export class ExportNotesProcessorService {
@@ -141,5 +141,6 @@ function serialize(note: Note, poll: Poll | null = null): Record<string, unknown
visibility: note.visibility,
visibleUserIds: note.visibleUserIds,
localOnly: note.localOnly,
+ reactionAcceptance: note.reactionAcceptance,
};
}
diff --git a/packages/backend/src/server/api/endpoints/notes/create.ts b/packages/backend/src/server/api/endpoints/notes/create.ts
index 786ad103b0..69fafcb9c7 100644
--- a/packages/backend/src/server/api/endpoints/notes/create.ts
+++ b/packages/backend/src/server/api/endpoints/notes/create.ts
@@ -97,6 +97,7 @@ export const paramDef = {
} },
cw: { type: 'string', nullable: true, maxLength: 100 },
localOnly: { type: 'boolean', default: false },
+ reactionAcceptance: { type: 'string', nullable: true, enum: [null, 'likeOnly', 'likeOnlyForRemote'], default: null },
noExtractMentions: { type: 'boolean', default: false },
noExtractHashtags: { type: 'boolean', default: false },
noExtractEmojis: { type: 'boolean', default: false },
@@ -110,7 +111,7 @@ export const paramDef = {
type: 'string',
minLength: 1,
maxLength: MAX_NOTE_TEXT_LENGTH,
- nullable: false
+ nullable: false,
},
fileIds: {
type: 'array',
@@ -280,6 +281,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
renote,
cw: ps.cw,
localOnly: ps.localOnly,
+ reactionAcceptance: ps.reactionAcceptance,
visibility: ps.visibility,
visibleUsers,
channel,