Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions seerr-api.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1271,6 +1271,8 @@ components:
type: boolean
example: false
description: If true, this request will not count against the user's quota. Requires MANAGE_REQUESTS permission.
declineReason:
type: string
Comment thread
ornelasf1 marked this conversation as resolved.
required:
- id
- status
Expand Down Expand Up @@ -6518,6 +6520,9 @@ paths:
userId:
type: number
nullable: true
declineReason:
type: string
nullable: true
required:
- mediaType
responses:
Expand Down Expand Up @@ -6591,6 +6596,16 @@ paths:
schema:
type: string
enum: [approve, decline]
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
declineReason:
type: string
nullable: true
responses:
'200':
description: Request status changed
Expand Down
3 changes: 3 additions & 0 deletions server/entity/MediaRequest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -553,6 +553,9 @@ export class MediaRequest {
@Index()
public status: MediaRequestStatus;

@Column({ type: 'text', nullable: true })
public declineReason?: string;

Comment thread
ornelasf1 marked this conversation as resolved.
@ManyToOne(() => Media, (media) => media.requests, {
eager: true,
onDelete: 'CASCADE',
Expand Down
1 change: 1 addition & 0 deletions server/i18n/globalMessages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ const globalMessages = defineMessages('notifications.common', {
series: 'series',
issue: 'issue',
issueTypeName: '{type} issue',
declineReason: 'Decline Reason',
});

export default globalMessages;
4 changes: 4 additions & 0 deletions server/i18n/locale/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
"notifications.agents.email.availableRequest4k": "Your request for the following {mediaType} in 4K is now available:",
"notifications.agents.email.declinedRequest": "Your request for the following {mediaType} was declined:",
"notifications.agents.email.declinedRequest4k": "Your request for the following {mediaType} in 4K was declined:",
"notifications.agents.email.declinedRequest4kReason": "Your request for the following {mediaType} in 4K was declined because: {reason}",
"notifications.agents.email.declinedRequestReason": "Your request for the following {mediaType} was declined because: {reason}",
"notifications.agents.email.failedRequest": "A request for the following {mediaType} failed to be added to {service}:",
"notifications.agents.email.failedRequest4k": "A request for the following {mediaType} in 4K failed to be added to {service}:",
"notifications.agents.email.issue": "issue",
Expand All @@ -24,6 +26,7 @@
"notifications.agents.webpush.autoRequested": "Automatically submitted a new {quality}{mediaType} request.",
"notifications.agents.webpush.available": "Your {quality}{mediaType} request is now available!",
"notifications.agents.webpush.declined": "Your {quality}{mediaType} request was declined.",
"notifications.agents.webpush.declinedWithReason": "Your {quality}{mediaType} request was declined because: {reason}.",
"notifications.agents.webpush.failed": "Failed to process {quality}{mediaType} request.",
"notifications.agents.webpush.issueComment": "{userName} commented on the {issueType}.",
"notifications.agents.webpush.issueCreated": "A new {issueType} was reported by {userName}.",
Expand All @@ -34,6 +37,7 @@
"notifications.agents.webpush.viewMedia": "View Media",
"notifications.common.available": "Available",
"notifications.common.commentFrom": "Comment from {userName}",
"notifications.common.declineReason": "Decline Reason",
"notifications.common.declined": "Declined",
"notifications.common.failed": "Failed",
"notifications.common.issue": "issue",
Expand Down
11 changes: 11 additions & 0 deletions server/lib/notifications/agents/discord.ts
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,17 @@ class DiscordAgent
value: status,
inline: true,
});
if (
type === Notification.MEDIA_DECLINED &&
payload.request &&
payload.request.declineReason
) {
fields.push({
name: intl.formatMessage(globalMessages.declineReason),
value: payload.request.declineReason,
inline: false,
});
}
Comment thread
coderabbitai[bot] marked this conversation as resolved.
}
} else if (payload.comment) {
fields.push({
Expand Down
21 changes: 17 additions & 4 deletions server/lib/notifications/agents/email.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,10 @@ const messages = defineMessages('notifications.agents.email', {
declinedRequest: 'Your request for the following {mediaType} was declined:',
declinedRequest4k:
'Your request for the following {mediaType} in 4K was declined:',
declinedRequestReason:
'Your request for the following {mediaType} was declined because: {reason}',
declinedRequest4kReason:
'Your request for the following {mediaType} in 4K was declined because: {reason}',
failedRequest:
'A request for the following {mediaType} failed to be added to {service}:',
failedRequest4k:
Expand Down Expand Up @@ -165,10 +169,19 @@ class EmailAgent
);
break;
case Notification.MEDIA_DECLINED:
body = intl.formatMessage(
is4k ? messages.declinedRequest4k : messages.declinedRequest,
{ mediaType }
);
if (!payload.request.declineReason) {
body = intl.formatMessage(
is4k ? messages.declinedRequest4k : messages.declinedRequest,
{ mediaType }
);
} else {
body = intl.formatMessage(
is4k
? messages.declinedRequest4kReason
: messages.declinedRequestReason,
{ mediaType, reason: payload.request.declineReason }
);
}
break;
case Notification.MEDIA_FAILED:
body = intl.formatMessage(
Expand Down
7 changes: 7 additions & 0 deletions server/lib/notifications/agents/gotify.ts
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,13 @@ class GotifyAgent

if (status) {
message += `\n**${intl.formatMessage(globalMessages.requestStatus)}:** ${status} `;
if (
type === Notification.MEDIA_DECLINED &&
payload.request &&
payload.request.declineReason
) {
message += `\n**${intl.formatMessage(globalMessages.declineReason)}**\n${payload.request.declineReason}`;
}
}
} else if (payload.comment) {
message += `\n${intl.formatMessage(globalMessages.commentFrom, { userName: payload.comment.user.displayName })}:\n${payload.comment.message} `;
Expand Down
7 changes: 7 additions & 0 deletions server/lib/notifications/agents/ntfy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,13 @@ class NtfyAgent

if (status) {
message += `\n**${intl.formatMessage(globalMessages.requestStatus)}:** ${status}`;
if (
type === Notification.MEDIA_DECLINED &&
payload.request &&
payload.request.declineReason
) {
message += `\n**${intl.formatMessage(globalMessages.declineReason)}**\n${this.escapeMarkdown(payload.request.declineReason)}`;
}
Comment thread
coderabbitai[bot] marked this conversation as resolved.
}
} else if (payload.comment) {
message += `\n**${this.escapeMarkdown(
Expand Down
7 changes: 7 additions & 0 deletions server/lib/notifications/agents/pushbullet.ts
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,13 @@ class PushbulletAgent

if (status) {
body += `\n${intl.formatMessage(globalMessages.requestStatus)}: ${status}`;
if (
type === Notification.MEDIA_DECLINED &&
payload.request &&
payload.request.declineReason
) {
body += `\n${intl.formatMessage(globalMessages.declineReason)}: ${payload.request.declineReason}`;
}
}
} else if (payload.comment) {
body += `\n\n${intl.formatMessage(globalMessages.commentFrom, { userName: payload.comment.user.displayName })}:\n${payload.comment.message}`;
Expand Down
8 changes: 8 additions & 0 deletions server/lib/notifications/agents/pushover.ts
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,14 @@ class PushoverAgent

if (status) {
message += `<small>\n<b>${intl.formatMessage(globalMessages.requestStatus)}:</b> ${status}</small>`;

if (
type === Notification.MEDIA_DECLINED &&
payload.request &&
payload.request.declineReason
) {
message += `<small>\n\n<b>${intl.formatMessage(globalMessages.declineReason)}:</b> ${payload.request.declineReason}</small>`;
}
}
} else if (payload.comment) {
message += `<small>\n\n<b>${intl.formatMessage(globalMessages.commentFrom, { userName: payload.comment.user.displayName })}:</b> ${payload.comment.message}</small>`;
Expand Down
11 changes: 11 additions & 0 deletions server/lib/notifications/agents/slack.ts
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,17 @@ class SlackAgent
type: 'mrkdwn',
text: `*${intl.formatMessage(globalMessages.requestStatus)}*\n${status}`,
});

if (
type === Notification.MEDIA_DECLINED &&
payload.request &&
payload.request.declineReason
) {
fields.push({
type: 'mrkdwn',
text: `*${intl.formatMessage(globalMessages.declineReason)}*\n${payload.request.declineReason}`,
});
}
}
} else if (payload.comment) {
fields.push({
Expand Down
10 changes: 10 additions & 0 deletions server/lib/notifications/agents/telegram.ts
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,16 @@ class TelegramAgent
message += `\n\*${this.escapeText(
intl.formatMessage(globalMessages.requestStatus)
)}:\* ${this.escapeText(status)}`;

if (
type === Notification.MEDIA_DECLINED &&
payload.request &&
payload.request.declineReason
) {
message += `\n\n\*${this.escapeText(
intl.formatMessage(globalMessages.declineReason)
)}:\* ${this.escapeText(payload.request.declineReason)}`;
}
}
} else if (payload.comment) {
message += `\n\n\*${this.escapeText(
Expand Down
18 changes: 14 additions & 4 deletions server/lib/notifications/agents/webpush.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ const messages = defineMessages('notifications.agents.webpush', {
'Automatically approved a new {quality}{mediaType} request from {userName}.',
available: 'Your {quality}{mediaType} request is now available!',
declined: 'Your {quality}{mediaType} request was declined.',
declinedWithReason:
'Your {quality}{mediaType} request was declined because: {reason}.',
failed: 'Failed to process {quality}{mediaType} request.',
pending:
'Approval required for a new {quality}{mediaType} request from {userName}.',
Expand Down Expand Up @@ -123,10 +125,18 @@ class WebPushAgent
});
break;
case Notification.MEDIA_DECLINED:
message = intl.formatMessage(messages.declined, {
quality,
mediaType,
});
if (payload.request && payload.request?.declineReason) {
message = intl.formatMessage(messages.declinedWithReason, {
quality,
mediaType,
reason: payload.request.declineReason,
});
} else {
message = intl.formatMessage(messages.declined, {
quality,
mediaType,
});
}
break;
case Notification.MEDIA_FAILED:
message = intl.formatMessage(messages.failed, {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import type { MigrationInterface, QueryRunner } from 'typeorm';

export class AddRequestDeclinedMessage1781992427522 implements MigrationInterface {
name = 'AddRequestDeclinedMessage1781992427522';

public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(
`ALTER TABLE "media_request" ADD "declineReason" text`
);
}

public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(
`ALTER TABLE "media_request" DROP COLUMN "declineReason"`
);
}
}
Loading