feat: issues (#2180)
This commit is contained in:
65
server/subscriber/IssueCommentSubscriber.ts
Normal file
65
server/subscriber/IssueCommentSubscriber.ts
Normal file
@@ -0,0 +1,65 @@
|
||||
import {
|
||||
EntitySubscriberInterface,
|
||||
EventSubscriber,
|
||||
getRepository,
|
||||
InsertEvent,
|
||||
} from 'typeorm';
|
||||
import TheMovieDb from '../api/themoviedb';
|
||||
import { MediaType } from '../constants/media';
|
||||
import IssueComment from '../entity/IssueComment';
|
||||
import notificationManager, { Notification } from '../lib/notifications';
|
||||
|
||||
@EventSubscriber()
|
||||
export class IssueCommentSubscriber
|
||||
implements EntitySubscriberInterface<IssueComment>
|
||||
{
|
||||
public listenTo(): typeof IssueComment {
|
||||
return IssueComment;
|
||||
}
|
||||
|
||||
private async sendIssueCommentNotification(entity: IssueComment) {
|
||||
const issueCommentRepository = getRepository(IssueComment);
|
||||
let title: string;
|
||||
let image: string;
|
||||
const tmdb = new TheMovieDb();
|
||||
const issuecomment = await issueCommentRepository.findOne({
|
||||
where: { id: entity.id },
|
||||
relations: ['issue'],
|
||||
});
|
||||
|
||||
const issue = issuecomment?.issue;
|
||||
|
||||
if (!issue) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (issue.media.mediaType === MediaType.MOVIE) {
|
||||
const movie = await tmdb.getMovie({ movieId: issue.media.tmdbId });
|
||||
|
||||
title = movie.title;
|
||||
image = `https://image.tmdb.org/t/p/w600_and_h900_bestv2${movie.poster_path}`;
|
||||
} else {
|
||||
const tvshow = await tmdb.getTvShow({ tvId: issue.media.tmdbId });
|
||||
|
||||
title = tvshow.name;
|
||||
image = `https://image.tmdb.org/t/p/w600_and_h900_bestv2${tvshow.poster_path}`;
|
||||
}
|
||||
|
||||
notificationManager.sendNotification(Notification.ISSUE_COMMENT, {
|
||||
subject: `New Issue Comment: ${title}`,
|
||||
message: entity.message,
|
||||
issue,
|
||||
image,
|
||||
notifyUser:
|
||||
issue.createdBy.id !== entity.user.id ? issue.createdBy : undefined,
|
||||
});
|
||||
}
|
||||
|
||||
public afterInsert(event: InsertEvent<IssueComment>): void {
|
||||
if (!event.entity) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.sendIssueCommentNotification(event.entity);
|
||||
}
|
||||
}
|
||||
50
server/subscriber/IssueSubscriber.ts
Normal file
50
server/subscriber/IssueSubscriber.ts
Normal file
@@ -0,0 +1,50 @@
|
||||
import {
|
||||
EntitySubscriberInterface,
|
||||
EventSubscriber,
|
||||
InsertEvent,
|
||||
} from 'typeorm';
|
||||
import TheMovieDb from '../api/themoviedb';
|
||||
import { MediaType } from '../constants/media';
|
||||
import Issue from '../entity/Issue';
|
||||
import notificationManager, { Notification } from '../lib/notifications';
|
||||
|
||||
@EventSubscriber()
|
||||
export class IssueSubscriber implements EntitySubscriberInterface<Issue> {
|
||||
public listenTo(): typeof Issue {
|
||||
return Issue;
|
||||
}
|
||||
|
||||
private async sendIssueCreatedNotification(entity: Issue) {
|
||||
let title: string;
|
||||
let image: string;
|
||||
const tmdb = new TheMovieDb();
|
||||
if (entity.media.mediaType === MediaType.MOVIE) {
|
||||
const movie = await tmdb.getMovie({ movieId: entity.media.tmdbId });
|
||||
|
||||
title = movie.title;
|
||||
image = `https://image.tmdb.org/t/p/w600_and_h900_bestv2${movie.poster_path}`;
|
||||
} else {
|
||||
const tvshow = await tmdb.getTvShow({ tvId: entity.media.tmdbId });
|
||||
|
||||
title = tvshow.name;
|
||||
image = `https://image.tmdb.org/t/p/w600_and_h900_bestv2${tvshow.poster_path}`;
|
||||
}
|
||||
|
||||
const [firstComment] = entity.comments;
|
||||
|
||||
notificationManager.sendNotification(Notification.ISSUE_CREATED, {
|
||||
subject: title,
|
||||
message: firstComment.message,
|
||||
issue: entity,
|
||||
image,
|
||||
});
|
||||
}
|
||||
|
||||
public afterInsert(event: InsertEvent<Issue>): void {
|
||||
if (!event.entity) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.sendIssueCreatedNotification(event.entity);
|
||||
}
|
||||
}
|
||||
@@ -13,7 +13,7 @@ import Season from '../entity/Season';
|
||||
import notificationManager, { Notification } from '../lib/notifications';
|
||||
|
||||
@EventSubscriber()
|
||||
export class MediaSubscriber implements EntitySubscriberInterface {
|
||||
export class MediaSubscriber implements EntitySubscriberInterface<Media> {
|
||||
private async notifyAvailableMovie(entity: Media, dbEntity?: Media) {
|
||||
if (
|
||||
entity.status === MediaStatus.AVAILABLE &&
|
||||
@@ -169,4 +169,8 @@ export class MediaSubscriber implements EntitySubscriberInterface {
|
||||
this.updateChildRequestStatus(event.entity as Media, true);
|
||||
}
|
||||
}
|
||||
|
||||
public listenTo(): typeof Media {
|
||||
return Media;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user