mirror of
https://activitypub.software/TransFem-org/Sharkey.git
synced 2024-12-16 10:11:54 +01:00
3ffbf6296f
* 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>
71 lines
2.3 KiB
TypeScript
71 lines
2.3 KiB
TypeScript
/*
|
|
* SPDX-FileCopyrightText: syuilo and misskey-project
|
|
* SPDX-License-Identifier: AGPL-3.0-only
|
|
*/
|
|
|
|
import { Inject, Injectable } from '@nestjs/common';
|
|
import { DI } from '@/di-symbols.js';
|
|
import type { AnnouncementsRepository, AnnouncementReadsRepository, MiAnnouncement, MiUser } from '@/models/_.js';
|
|
import type { Packed } from '@/misc/json-schema.js';
|
|
import { bindThis } from '@/decorators.js';
|
|
import { IdService } from '@/core/IdService.js';
|
|
|
|
@Injectable()
|
|
export class AnnouncementEntityService {
|
|
constructor(
|
|
@Inject(DI.announcementsRepository)
|
|
private announcementsRepository: AnnouncementsRepository,
|
|
|
|
@Inject(DI.announcementReadsRepository)
|
|
private announcementReadsRepository: AnnouncementReadsRepository,
|
|
|
|
private idService: IdService,
|
|
) {
|
|
}
|
|
|
|
@bindThis
|
|
public async pack(
|
|
src: MiAnnouncement['id'] | MiAnnouncement & { isRead?: boolean | null },
|
|
me?: { id: MiUser['id'] } | null | undefined,
|
|
): Promise<Packed<'Announcement'>> {
|
|
const announcement = typeof src === 'object'
|
|
? src
|
|
: await this.announcementsRepository.findOneByOrFail({
|
|
id: src,
|
|
}) as MiAnnouncement & { isRead?: boolean | null };
|
|
|
|
if (me && announcement.isRead === undefined) {
|
|
announcement.isRead = await this.announcementReadsRepository
|
|
.countBy({
|
|
announcementId: announcement.id,
|
|
userId: me.id,
|
|
})
|
|
.then((count: number) => count > 0);
|
|
}
|
|
|
|
return {
|
|
id: announcement.id,
|
|
createdAt: this.idService.parse(announcement.id).date.toISOString(),
|
|
updatedAt: announcement.updatedAt?.toISOString() ?? null,
|
|
title: announcement.title,
|
|
text: announcement.text,
|
|
imageUrl: announcement.imageUrl,
|
|
icon: announcement.icon,
|
|
display: announcement.display,
|
|
forYou: announcement.userId === me?.id,
|
|
needConfirmationToRead: announcement.needConfirmationToRead,
|
|
silence: announcement.silence,
|
|
isRead: announcement.isRead !== null ? announcement.isRead : undefined,
|
|
};
|
|
}
|
|
|
|
@bindThis
|
|
public async packMany(
|
|
announcements: (MiAnnouncement['id'] | MiAnnouncement & { isRead?: boolean | null } | MiAnnouncement)[],
|
|
me?: { id: MiUser['id'] } | null | undefined,
|
|
) : Promise<Packed<'Announcement'>[]> {
|
|
return (await Promise.allSettled(announcements.map(x => this.pack(x, me))))
|
|
.filter(result => result.status === 'fulfilled')
|
|
.map(result => (result as PromiseFulfilledResult<Packed<'Announcement'>>).value);
|
|
}
|
|
}
|