summaryrefslogtreecommitdiff
path: root/packages/backend/src/server/api/endpoints/notes
diff options
context:
space:
mode:
authorMarie <marie@kaifa.ch>2023-11-05 11:42:42 +0100
committerGitHub <noreply@github.com>2023-11-05 11:42:42 +0100
commit7eeb3e38ab523746ff367092932b35fd78c7b40b (patch)
treefb9765d2c1cf81f91031993046a33933c4a105a6 /packages/backend/src/server/api/endpoints/notes
parentfix: icons being inconsistent and PG (#136) (diff)
parentmerge: upstream (diff)
downloadsharkey-7eeb3e38ab523746ff367092932b35fd78c7b40b.tar.gz
sharkey-7eeb3e38ab523746ff367092932b35fd78c7b40b.tar.bz2
sharkey-7eeb3e38ab523746ff367092932b35fd78c7b40b.zip
merge: upstream changes (#139)
Diffstat (limited to 'packages/backend/src/server/api/endpoints/notes')
-rw-r--r--packages/backend/src/server/api/endpoints/notes/create.test.ts2
-rw-r--r--packages/backend/src/server/api/endpoints/notes/create.ts23
-rw-r--r--packages/backend/src/server/api/endpoints/notes/edit.ts21
-rw-r--r--packages/backend/src/server/api/endpoints/notes/global-timeline.ts10
4 files changed, 52 insertions, 4 deletions
diff --git a/packages/backend/src/server/api/endpoints/notes/create.test.ts b/packages/backend/src/server/api/endpoints/notes/create.test.ts
index bfb024bcf2..6086f99c92 100644
--- a/packages/backend/src/server/api/endpoints/notes/create.test.ts
+++ b/packages/backend/src/server/api/endpoints/notes/create.test.ts
@@ -64,7 +64,7 @@ describe('api:notes/create', () => {
test('0 characters cw', () => {
expect(v({ text: 'Body', cw: '' }))
- .toBe(VALID);
+ .toBe(INVALID);
});
test('reject only cw', () => {
diff --git a/packages/backend/src/server/api/endpoints/notes/create.ts b/packages/backend/src/server/api/endpoints/notes/create.ts
index 649068fb20..df02d3acb7 100644
--- a/packages/backend/src/server/api/endpoints/notes/create.ts
+++ b/packages/backend/src/server/api/endpoints/notes/create.ts
@@ -16,8 +16,8 @@ import { Endpoint } from '@/server/api/endpoint-base.js';
import { NoteEntityService } from '@/core/entities/NoteEntityService.js';
import { NoteCreateService } from '@/core/NoteCreateService.js';
import { DI } from '@/di-symbols.js';
-import { ApiError } from '../../error.js';
import { isPureRenote } from '@/misc/is-pure-renote.js';
+import { ApiError } from '../../error.js';
export const meta = {
tags: ['notes'],
@@ -99,6 +99,12 @@ export const meta = {
code: 'NO_SUCH_FILE',
id: 'b6992544-63e7-67f0-fa7f-32444b1b5306',
},
+
+ cannotRenoteOutsideOfChannel: {
+ message: 'Cannot renote outside of channel.',
+ code: 'CANNOT_RENOTE_OUTSIDE_OF_CHANNEL',
+ id: '33510210-8452-094c-6227-4a6c05d99f00',
+ },
},
} as const;
@@ -109,7 +115,7 @@ export const paramDef = {
visibleUserIds: { type: 'array', uniqueItems: true, items: {
type: 'string', format: 'misskey:id',
} },
- cw: { type: 'string', nullable: true, maxLength: 100 },
+ cw: { type: 'string', nullable: true, minLength: 1, maxLength: 100 },
localOnly: { type: 'boolean', default: false },
reactionAcceptance: { type: 'string', nullable: true, enum: [null, 'likeOnly', 'likeOnlyForRemote', 'nonSensitiveOnly', 'nonSensitiveOnlyForLocalLikeOnlyForRemote'], default: null },
noExtractMentions: { type: 'boolean', default: false },
@@ -246,6 +252,19 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
// specified / direct noteはreject
throw new ApiError(meta.errors.cannotRenoteDueToVisibility);
}
+
+ if (renote.channelId && renote.channelId !== ps.channelId) {
+ // チャンネルのノートに対しリノート要求がきたとき、チャンネル外へのリノート可否をチェック
+ // リノートのユースケースのうち、チャンネル内→チャンネル外は少数だと考えられるため、JOINはせず必要な時に都度取得する
+ const renoteChannel = await this.channelsRepository.findOneById(renote.channelId);
+ if (renoteChannel == null) {
+ // リノートしたいノートが書き込まれているチャンネルが無い
+ throw new ApiError(meta.errors.noSuchChannel);
+ } else if (!renoteChannel.allowRenoteToExternal) {
+ // リノート作成のリクエストだが、対象チャンネルがリノート禁止だった場合
+ throw new ApiError(meta.errors.cannotRenoteOutsideOfChannel);
+ }
+ }
}
let reply: MiNote | null = null;
diff --git a/packages/backend/src/server/api/endpoints/notes/edit.ts b/packages/backend/src/server/api/endpoints/notes/edit.ts
index 07f04bba5a..6140c80a5d 100644
--- a/packages/backend/src/server/api/endpoints/notes/edit.ts
+++ b/packages/backend/src/server/api/endpoints/notes/edit.ts
@@ -117,6 +117,12 @@ export const meta = {
code: "NOT_LOCAL_USER",
id: "b907f407-2aa0-4283-800b-a2c56290b822",
},
+
+ cannotRenoteOutsideOfChannel: {
+ message: 'Cannot renote outside of channel.',
+ code: 'CANNOT_RENOTE_OUTSIDE_OF_CHANNEL',
+ id: '33510210-8452-094c-6227-4a6c05d99f00',
+ },
},
} as const;
@@ -134,7 +140,7 @@ export const paramDef = {
},
},
text: { type: "string", maxLength: MAX_NOTE_TEXT_LENGTH, nullable: true },
- cw: { type: "string", nullable: true, maxLength: 250 },
+ cw: { type: "string", nullable: true, minLength: 1, maxLength: 250 },
localOnly: { type: "boolean", default: false },
noExtractMentions: { type: "boolean", default: false },
noExtractHashtags: { type: "boolean", default: false },
@@ -281,6 +287,19 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
throw new ApiError(meta.errors.youHaveBeenBlocked);
}
}
+
+ if (renote.channelId && renote.channelId !== ps.channelId) {
+ // チャンネルのノートに対しリノート要求がきたとき、チャンネル外へのリノート可否をチェック
+ // リノートのユースケースのうち、チャンネル内→チャンネル外は少数だと考えられるため、JOINはせず必要な時に都度取得する
+ const renoteChannel = await this.channelsRepository.findOneById(renote.channelId);
+ if (renoteChannel == null) {
+ // リノートしたいノートが書き込まれているチャンネルが無い
+ throw new ApiError(meta.errors.noSuchChannel);
+ } else if (!renoteChannel.allowRenoteToExternal) {
+ // リノート作成のリクエストだが、対象チャンネルがリノート禁止だった場合
+ throw new ApiError(meta.errors.cannotRenoteOutsideOfChannel);
+ }
+ }
}
let reply: MiNote | null = null;
diff --git a/packages/backend/src/server/api/endpoints/notes/global-timeline.ts b/packages/backend/src/server/api/endpoints/notes/global-timeline.ts
index 5827577543..844de80268 100644
--- a/packages/backend/src/server/api/endpoints/notes/global-timeline.ts
+++ b/packages/backend/src/server/api/endpoints/notes/global-timeline.ts
@@ -98,6 +98,16 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
}
if (!ps.withBots) query.andWhere('user.isBot = FALSE');
+
+ if (ps.withRenotes === false) {
+ query.andWhere(new Brackets(qb => {
+ qb.where('note.renoteId IS NULL');
+ qb.orWhere(new Brackets(qb => {
+ qb.where('note.text IS NOT NULL');
+ qb.orWhere('note.fileIds != \'{}\'');
+ }));
+ }));
+ }
//#endregion
let timeline = await query.limit(ps.limit).getMany();