feat: 個別のお知らせにリンクで飛べるように (#13885)
* feat(announcement): 個別のお知らせにリンクで飛べるように (MisskeyIO#639) (cherry picked from commit f6bf7f992a78e54d86a4701dbd1e4fda7ef4eb27) * fix Co-authored-by: まっちゃとーにゅ <17376330+u1-liquid@users.noreply.github.com> * fix Co-authored-by: まっちゃとーにゅ <17376330+u1-liquid@users.noreply.github.com> * 一覧ページではお知らせpanel全体を押せるように * お知らせバーは個別ページに飛ばすように * Update Changelog * spdx * attempt to fox test * remove unnecessary thong * `announcement` → `announcements/show` * リンクを押せる場所をタイトルと日付部分のみに変更 --------- Co-authored-by: まっちゃとーにゅ <17376330+u1-liquid@users.noreply.github.com>
This commit is contained in:
		| @@ -83,6 +83,7 @@ import * as ep___admin_roles_unassign from './endpoints/admin/roles/unassign.js' | ||||
| import * as ep___admin_roles_updateDefaultPolicies from './endpoints/admin/roles/update-default-policies.js'; | ||||
| import * as ep___admin_roles_users from './endpoints/admin/roles/users.js'; | ||||
| import * as ep___announcements from './endpoints/announcements.js'; | ||||
| import * as ep___announcements_show from './endpoints/announcements/show.js'; | ||||
| import * as ep___antennas_create from './endpoints/antennas/create.js'; | ||||
| import * as ep___antennas_delete from './endpoints/antennas/delete.js'; | ||||
| import * as ep___antennas_list from './endpoints/antennas/list.js'; | ||||
| @@ -455,6 +456,7 @@ const $admin_roles_unassign: Provider = { provide: 'ep:admin/roles/unassign', us | ||||
| const $admin_roles_updateDefaultPolicies: Provider = { provide: 'ep:admin/roles/update-default-policies', useClass: ep___admin_roles_updateDefaultPolicies.default }; | ||||
| const $admin_roles_users: Provider = { provide: 'ep:admin/roles/users', useClass: ep___admin_roles_users.default }; | ||||
| const $announcements: Provider = { provide: 'ep:announcements', useClass: ep___announcements.default }; | ||||
| const $announcements_show: Provider = { provide: 'ep:announcements/show', useClass: ep___announcements_show.default }; | ||||
| const $antennas_create: Provider = { provide: 'ep:antennas/create', useClass: ep___antennas_create.default }; | ||||
| const $antennas_delete: Provider = { provide: 'ep:antennas/delete', useClass: ep___antennas_delete.default }; | ||||
| const $antennas_list: Provider = { provide: 'ep:antennas/list', useClass: ep___antennas_list.default }; | ||||
| @@ -831,6 +833,7 @@ const $reversi_verify: Provider = { provide: 'ep:reversi/verify', useClass: ep__ | ||||
| 		$admin_roles_updateDefaultPolicies, | ||||
| 		$admin_roles_users, | ||||
| 		$announcements, | ||||
| 		$announcements_show, | ||||
| 		$antennas_create, | ||||
| 		$antennas_delete, | ||||
| 		$antennas_list, | ||||
| @@ -1201,6 +1204,7 @@ const $reversi_verify: Provider = { provide: 'ep:reversi/verify', useClass: ep__ | ||||
| 		$admin_roles_updateDefaultPolicies, | ||||
| 		$admin_roles_users, | ||||
| 		$announcements, | ||||
| 		$announcements_show, | ||||
| 		$antennas_create, | ||||
| 		$antennas_delete, | ||||
| 		$antennas_list, | ||||
|   | ||||
| @@ -83,6 +83,7 @@ import * as ep___admin_roles_unassign from './endpoints/admin/roles/unassign.js' | ||||
| import * as ep___admin_roles_updateDefaultPolicies from './endpoints/admin/roles/update-default-policies.js'; | ||||
| import * as ep___admin_roles_users from './endpoints/admin/roles/users.js'; | ||||
| import * as ep___announcements from './endpoints/announcements.js'; | ||||
| import * as ep___announcements_show from './endpoints/announcements/show.js'; | ||||
| import * as ep___antennas_create from './endpoints/antennas/create.js'; | ||||
| import * as ep___antennas_delete from './endpoints/antennas/delete.js'; | ||||
| import * as ep___antennas_list from './endpoints/antennas/list.js'; | ||||
| @@ -453,6 +454,7 @@ const eps = [ | ||||
| 	['admin/roles/update-default-policies', ep___admin_roles_updateDefaultPolicies], | ||||
| 	['admin/roles/users', ep___admin_roles_users], | ||||
| 	['announcements', ep___announcements], | ||||
| 	['announcements/show', ep___announcements_show], | ||||
| 	['antennas/create', ep___antennas_create], | ||||
| 	['antennas/delete', ep___antennas_delete], | ||||
| 	['antennas/list', ep___antennas_list], | ||||
|   | ||||
| @@ -7,9 +7,9 @@ import { Inject, Injectable } from '@nestjs/common'; | ||||
| import { Brackets } from 'typeorm'; | ||||
| import { Endpoint } from '@/server/api/endpoint-base.js'; | ||||
| import { QueryService } from '@/core/QueryService.js'; | ||||
| import { AnnouncementService } from '@/core/AnnouncementService.js'; | ||||
| import { AnnouncementEntityService } from '@/core/entities/AnnouncementEntityService.js'; | ||||
| import { DI } from '@/di-symbols.js'; | ||||
| import type { AnnouncementReadsRepository, AnnouncementsRepository } from '@/models/_.js'; | ||||
| import type { AnnouncementsRepository } from '@/models/_.js'; | ||||
|  | ||||
| export const meta = { | ||||
| 	tags: ['meta'], | ||||
| @@ -44,11 +44,8 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint- | ||||
| 		@Inject(DI.announcementsRepository) | ||||
| 		private announcementsRepository: AnnouncementsRepository, | ||||
|  | ||||
| 		@Inject(DI.announcementReadsRepository) | ||||
| 		private announcementReadsRepository: AnnouncementReadsRepository, | ||||
|  | ||||
| 		private queryService: QueryService, | ||||
| 		private announcementService: AnnouncementService, | ||||
| 		private announcementEntityService: AnnouncementEntityService, | ||||
| 	) { | ||||
| 		super(meta, paramDef, async (ps, me) => { | ||||
| 			const query = this.queryService.makePaginationQuery(this.announcementsRepository.createQueryBuilder('announcement'), ps.sinceId, ps.untilId) | ||||
| @@ -60,7 +57,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint- | ||||
|  | ||||
| 			const announcements = await query.limit(ps.limit).getMany(); | ||||
|  | ||||
| 			return this.announcementService.packMany(announcements, me); | ||||
| 			return this.announcementEntityService.packMany(announcements, me); | ||||
| 		}); | ||||
| 	} | ||||
| } | ||||
|   | ||||
| @@ -0,0 +1,54 @@ | ||||
| /* | ||||
|  * SPDX-FileCopyrightText: syuilo and misskey-project | ||||
|  * SPDX-License-Identifier: AGPL-3.0-only | ||||
|  */ | ||||
|  | ||||
| import { Injectable } from '@nestjs/common'; | ||||
| import { EntityNotFoundError } from 'typeorm'; | ||||
| import { Endpoint } from '@/server/api/endpoint-base.js'; | ||||
| import { AnnouncementService } from '@/core/AnnouncementService.js'; | ||||
| import { ApiError } from '../../error.js'; | ||||
|  | ||||
| export const meta = { | ||||
| 	tags: ['meta'], | ||||
|  | ||||
| 	requireCredential: false, | ||||
|  | ||||
| 	res: { | ||||
| 		type: 'object', | ||||
| 		optional: false, nullable: false, | ||||
| 		ref: 'Announcement', | ||||
| 	}, | ||||
|  | ||||
| 	errors: { | ||||
| 		noSuchAnnouncement: { | ||||
| 			message: 'No such announcement.', | ||||
| 			code: 'NO_SUCH_ANNOUNCEMENT', | ||||
| 			id: 'b57b5e1d-4f49-404a-9edb-46b00268f121', | ||||
| 		}, | ||||
| 	}, | ||||
| } as const; | ||||
|  | ||||
| export const paramDef = { | ||||
| 	type: 'object', | ||||
| 	properties: { | ||||
| 		announcementId: { type: 'string', format: 'misskey:id' }, | ||||
| 	}, | ||||
| 	required: ['announcementId'], | ||||
| } as const; | ||||
|  | ||||
| @Injectable() | ||||
| export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-disable-line import/no-default-export | ||||
| 	constructor( | ||||
| 		private announcementService: AnnouncementService, | ||||
| 	) { | ||||
| 		super(meta, paramDef, async (ps, me) => { | ||||
| 			try { | ||||
| 				return await this.announcementService.getAnnouncement(ps.announcementId, me); | ||||
| 			} catch (err) { | ||||
| 				if (err instanceof EntityNotFoundError) throw new ApiError(meta.errors.noSuchAnnouncement); | ||||
| 				throw err; | ||||
| 			} | ||||
| 		}); | ||||
| 	} | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 かっこかり
					かっこかり