idの混同を修正
This commit is contained in:
		
							parent
							
								
									a2ea072deb
								
							
						
					
					
						commit
						6c3d6ba955
					
				locales
packages
backend/src/server/api/endpoints/notes
frontend/src/components
|  | @ -2493,6 +2493,7 @@ export interface Locale { | |||
|         "localTime": string; | ||||
|         "addSchedule": string; | ||||
|         "willBePostedAtX": string; | ||||
|         "deleteAreYouSure": string; | ||||
|     }; | ||||
| } | ||||
| declare const locales: { | ||||
|  |  | |||
|  | @ -2381,3 +2381,4 @@ _schedulePost: | |||
|   localTime: "端末に設定されているタイムゾーンの時刻で投稿されます。" | ||||
|   addSchedule: "予約設定" | ||||
|   willBePostedAtX: "{date}に投稿予約しました。" | ||||
|   deleteAreYouSure: "予約投稿を削除しますか?" | ||||
|  |  | |||
|  | @ -311,7 +311,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint- | |||
| 				if (renote.channelId && renote.channelId !== ps.channelId) { | ||||
| 					// チャンネルのノートに対しリノート要求がきたとき、チャンネル外へのリノート可否をチェック
 | ||||
| 					// リノートのユースケースのうち、チャンネル内→チャンネル外は少数だと考えられるため、JOINはせず必要な時に都度取得する
 | ||||
| 					const renoteChannel = await this.channelsRepository.findOneById(renote.channelId); | ||||
| 					const renoteChannel = await this.channelsRepository.findOneBy({ id: renote.channelId }); | ||||
| 					if (renoteChannel == null) { | ||||
| 						// リノートしたいノートが書き込まれているチャンネルが無い
 | ||||
| 						throw new ApiError(meta.errors.noSuchChannel); | ||||
|  | @ -391,6 +391,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint- | |||
| 			}; | ||||
| 
 | ||||
| 			if (ps.schedule) { | ||||
| 				// 予約投稿
 | ||||
| 				const canCreateScheduledNote = (await this.roleService.getUserPolicies(me.id)).canScheduleNote; | ||||
| 				if (!canCreateScheduledNote) { | ||||
| 					throw new ApiError(meta.errors.rolePermissionDenied); | ||||
|  | @ -410,7 +411,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint- | |||
| 				}); | ||||
| 
 | ||||
| 				const delay = new Date(ps.schedule.scheduledAt).getTime() - Date.now(); | ||||
| 				await this.queueService.ScheduleNotePostQueue.add(String(delay), { | ||||
| 				await this.queueService.ScheduleNotePostQueue.add(delay.toString(), { | ||||
| 					scheduledNoteId, | ||||
| 				}, { | ||||
| 					jobId: scheduledNoteId, | ||||
|  |  | |||
|  | @ -3,7 +3,6 @@ | |||
|  * SPDX-License-Identifier: AGPL-3.0-only | ||||
|  */ | ||||
| 
 | ||||
| import ms from 'ms'; | ||||
| import { Inject, Injectable } from '@nestjs/common'; | ||||
| import { Endpoint } from '@/server/api/endpoint-base.js'; | ||||
| import { DI } from '@/di-symbols.js'; | ||||
|  | @ -23,36 +22,7 @@ export const meta = { | |||
| 		items: { | ||||
| 			type: 'object', | ||||
| 			optional: false, nullable: false, | ||||
| 			properties: { | ||||
| 				id: { type: 'string', optional: false, nullable: false }, | ||||
| 				note: { | ||||
| 					type: 'object', | ||||
| 					optional: false, nullable: false, | ||||
| 					properties: { | ||||
| 						id: { type: 'string', optional: false, nullable: false }, | ||||
| 						text: { type: 'string', optional: false, nullable: false }, | ||||
| 						files: { type: 'array', optional: false, nullable: false, items: { type: 'any' } }, | ||||
| 						localOnly: { type: 'boolean', optional: false, nullable: false }, | ||||
| 						visibility: { type: 'string', optional: false, nullable: false }, | ||||
| 						visibleUsers: { type: 'array', optional: false, nullable: false, items: { type: 'any' } }, | ||||
| 						reactionAcceptance: { type: 'string', optional: false, nullable: false }, | ||||
| 						user: { | ||||
| 							type: 'object', | ||||
| 							optional: false, nullable: false, | ||||
| 							ref: 'User', | ||||
| 		}, | ||||
| 						createdAt: { type: 'string', optional: false, nullable: false }, | ||||
| 						isSchedule: { type: 'boolean', optional: false, nullable: false }, | ||||
| 					}, | ||||
| 				}, | ||||
| 				userId: { type: 'string', optional: false, nullable: false }, | ||||
| 				scheduledAt: { type: 'string', optional: false, nullable: false }, | ||||
| 			}, | ||||
| 		}, | ||||
| 	}, | ||||
| 	limit: { | ||||
| 		duration: ms('1hour'), | ||||
| 		max: 300, | ||||
| 	}, | ||||
| 
 | ||||
| 	errors: { | ||||
|  | @ -84,32 +54,17 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint- | |||
| 
 | ||||
| 			const scheduleNotes = await query.limit(ps.limit).getMany(); | ||||
| 			const user = await this.userEntityService.pack(me, me); | ||||
| 			const scheduleNotesPack: { | ||||
| 				id: string; | ||||
| 				note: { | ||||
| 					id: string; | ||||
| 					text: string; | ||||
| 					files: any[]; | ||||
| 					localOnly: boolean; | ||||
| 					visibility: string; | ||||
| 					visibleUsers: any[]; | ||||
| 					reactionAcceptance: string; | ||||
| 					user: any; | ||||
| 					createdAt: string; | ||||
| 					isSchedule: boolean; | ||||
| 				}; | ||||
| 				userId: string; | ||||
| 				scheduledAt: string; | ||||
| 			}[] = scheduleNotes.map((item: any) => { | ||||
| 			const scheduleNotesPack = scheduleNotes.map((item) => { | ||||
| 				return { | ||||
| 					...item, | ||||
| 					scheduledAt: new Date(item.scheduledAt).toISOString(), | ||||
| 					note: { | ||||
| 						...item.note, | ||||
| 						user: user, | ||||
| 						createdAt: new Date(item.scheduledAt), | ||||
| 						createdAt: new Date(item.scheduledAt).toISOString(), | ||||
| 						isSchedule: true, | ||||
| 						// ↓TODO: NoteのIDに予約投稿IDを入れたくない(本来別ものなため)
 | ||||
| 						id: this.idService.gen(item.scheduledAt.getTime()), | ||||
| 						id: null, | ||||
| 						scheduledNoteId: item.id, | ||||
| 					}, | ||||
| 				}; | ||||
| 			}); | ||||
|  |  | |||
|  | @ -36,13 +36,23 @@ import MkButton from '@/components/MkButton.vue'; | |||
| import * as os from '@/os.js'; | ||||
| const isDeleted = ref(false); | ||||
| const props = defineProps<{ | ||||
|   note: Misskey.entities.Note & {isSchedule? : boolean}; | ||||
| 	note: Misskey.entities.Note & { | ||||
| 		id: string | null; | ||||
| 		isSchedule?: boolean; | ||||
| 		scheduledNoteId?: string; | ||||
| 	}; | ||||
| }>(); | ||||
| 
 | ||||
| async function deleteScheduleNote() { | ||||
| 	if (!props.note.isSchedule) return; | ||||
| 	// スケジュールつきノートの場合は、ノートIDのフィールドに予約投稿ID(scheduledNoteId)が入るので注意!!!! | ||||
| 	await os.apiWithDialog('notes/schedule/delete', { scheduledNoteId: props.note.id }) | ||||
| 	if (!props.note.isSchedule || !props.note.scheduledNoteId) return; | ||||
| 
 | ||||
| 	const { canceled } = await os.confirm({ | ||||
| 		type: 'warning', | ||||
| 		text: i18n.ts._schedulePost.deleteAreYouSure, | ||||
| 	}); | ||||
| 	if (canceled) return; | ||||
| 
 | ||||
| 	await os.apiWithDialog('notes/schedule/delete', { scheduledNoteId: props.note.scheduledNoteId }) | ||||
| 		.then(() => { | ||||
| 			isDeleted.value = true; | ||||
| 		}); | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue