Files
sct-overseerr/server/subscriber/MediaSubscriber.ts
Brandon Cohen 605f187b27 fix: availability sync requests (#3460)
* fix: modified media status handling when media has been deleted

fix: requests will now be updated to completed on scan

fix: modified components to display deleted as a status

fix: corrected media status switching away from deleted

fix: modified components to display deleted as a status

fix: corrected media status switching away from deleted

fix: base scanner will set requests to completed correctly

fix: mark available button correctly sets requests as completed

fix: status will now stay deleted after declined request

refactor: request completion handling moved to entity

fix: prevented notifications from sending to old deleted requests

refactor: cleaned up code and added more detail to logs

refactor: updated to reflect latest availability sync changes

* fix: fetch requests only if necessary in db and remove unneeded code

* fix: update request button logic to accomodate specials

fix: remove completed filtering in tv details

* fix: correctly set seasons status when using the manual button

* refactor: improve reliability of season request completion

refactor: remove seasonrequest code

* fix: send notification for 4k movies

fix: same for shows

* feat: add completed filter to requests list

refactor: correct label
2025-04-15 11:48:07 +09:00

52 lines
1.5 KiB
TypeScript

import { MediaRequestStatus, MediaStatus } from '@server/constants/media';
import { getRepository } from '@server/datasource';
import Media from '@server/entity/Media';
import { MediaRequest } from '@server/entity/MediaRequest';
import type { EntitySubscriberInterface, UpdateEvent } from 'typeorm';
import { EventSubscriber } from 'typeorm';
@EventSubscriber()
export class MediaSubscriber implements EntitySubscriberInterface<Media> {
private async updateChildRequestStatus(event: Media, is4k: boolean) {
const requestRepository = getRepository(MediaRequest);
const requests = await requestRepository.find({
where: { media: { id: event.id } },
});
for (const request of requests) {
if (
request.is4k === is4k &&
request.status === MediaRequestStatus.PENDING
) {
request.status = MediaRequestStatus.APPROVED;
await requestRepository.save(request);
}
}
}
public beforeUpdate(event: UpdateEvent<Media>): void {
if (!event.entity) {
return;
}
if (
event.entity.status === MediaStatus.AVAILABLE &&
event.databaseEntity.status === MediaStatus.PENDING
) {
this.updateChildRequestStatus(event.entity as Media, false);
}
if (
event.entity.status4k === MediaStatus.AVAILABLE &&
event.databaseEntity.status4k === MediaStatus.PENDING
) {
this.updateChildRequestStatus(event.entity as Media, true);
}
}
public listenTo(): typeof Media {
return Media;
}
}