From 9b066bcb8a25585fc63b4f5ce9a699d99109755f Mon Sep 17 00:00:00 2001 From: Rostislav Dugin Date: Sat, 8 Nov 2025 20:47:35 +0300 Subject: [PATCH] FEATURE (email): Add "from" field --- .../notifiers/models/email_notifier/model.go | 9 ++++-- ...51108173913_add_from_to_email_notifier.sql | 11 +++++++ .../notifiers/models/email/EmailNotifier.ts | 1 + .../features/backups/ui/BackupsComponent.tsx | 2 +- .../ui/edit/EditNotifierComponent.tsx | 1 + .../notifiers/EditEmailNotifierComponent.tsx | 29 +++++++++++++++++++ .../notifier/ShowEmailNotifierComponent.tsx | 5 ++++ 7 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 backend/migrations/20251108173913_add_from_to_email_notifier.sql diff --git a/backend/internal/features/notifiers/models/email_notifier/model.go b/backend/internal/features/notifiers/models/email_notifier/model.go index 689ff10..ec080b3 100644 --- a/backend/internal/features/notifiers/models/email_notifier/model.go +++ b/backend/internal/features/notifiers/models/email_notifier/model.go @@ -27,6 +27,7 @@ type EmailNotifier struct { SMTPPort int `json:"smtpPort" gorm:"not null;column:smtp_port"` SMTPUser string `json:"smtpUser" gorm:"type:varchar(255);column:smtp_user"` SMTPPassword string `json:"smtpPassword" gorm:"type:varchar(255);column:smtp_password"` + From string `json:"from" gorm:"type:varchar(255);column:from_email"` } func (e *EmailNotifier) TableName() string { @@ -56,9 +57,12 @@ func (e *EmailNotifier) Validate() error { func (e *EmailNotifier) Send(logger *slog.Logger, heading string, message string) error { // Compose email - from := e.SMTPUser + from := e.From if from == "" { - from = "noreply@" + e.SMTPHost + from = e.SMTPUser + if from == "" { + from = "noreply@" + e.SMTPHost + } } to := []string{e.TargetEmail} @@ -218,6 +222,7 @@ func (e *EmailNotifier) Update(incoming *EmailNotifier) { e.SMTPHost = incoming.SMTPHost e.SMTPPort = incoming.SMTPPort e.SMTPUser = incoming.SMTPUser + e.From = incoming.From if incoming.SMTPPassword != "" { e.SMTPPassword = incoming.SMTPPassword diff --git a/backend/migrations/20251108173913_add_from_to_email_notifier.sql b/backend/migrations/20251108173913_add_from_to_email_notifier.sql new file mode 100644 index 0000000..858951a --- /dev/null +++ b/backend/migrations/20251108173913_add_from_to_email_notifier.sql @@ -0,0 +1,11 @@ +-- +goose Up +-- +goose StatementBegin +ALTER TABLE email_notifiers + ADD COLUMN from_email VARCHAR(255); +-- +goose StatementEnd + +-- +goose Down +-- +goose StatementBegin +ALTER TABLE email_notifiers + DROP COLUMN from_email; +-- +goose StatementEnd diff --git a/frontend/src/entity/notifiers/models/email/EmailNotifier.ts b/frontend/src/entity/notifiers/models/email/EmailNotifier.ts index 5d2f732..5803973 100644 --- a/frontend/src/entity/notifiers/models/email/EmailNotifier.ts +++ b/frontend/src/entity/notifiers/models/email/EmailNotifier.ts @@ -4,4 +4,5 @@ export interface EmailNotifier { smtpPort: number; smtpUser: string; smtpPassword: string; + from: string; } diff --git a/frontend/src/features/backups/ui/BackupsComponent.tsx b/frontend/src/features/backups/ui/BackupsComponent.tsx index ff1ce06..9a35721 100644 --- a/frontend/src/features/backups/ui/BackupsComponent.tsx +++ b/frontend/src/features/backups/ui/BackupsComponent.tsx @@ -25,7 +25,7 @@ import { getUserTimeFormat } from '../../../shared/time'; import { ConfirmationComponent } from '../../../shared/ui'; import { RestoresComponent } from '../../restores'; -const BACKUPS_PAGE_SIZE = 10; +const BACKUPS_PAGE_SIZE = 50; interface Props { database: Database; diff --git a/frontend/src/features/notifiers/ui/edit/EditNotifierComponent.tsx b/frontend/src/features/notifiers/ui/edit/EditNotifierComponent.tsx index 1e80f2b..ac502f4 100644 --- a/frontend/src/features/notifiers/ui/edit/EditNotifierComponent.tsx +++ b/frontend/src/features/notifiers/ui/edit/EditNotifierComponent.tsx @@ -111,6 +111,7 @@ export function EditNotifierComponent({ smtpPort: 0, smtpUser: '', smtpPassword: '', + from: '', }; } diff --git a/frontend/src/features/notifiers/ui/edit/notifiers/EditEmailNotifierComponent.tsx b/frontend/src/features/notifiers/ui/edit/notifiers/EditEmailNotifierComponent.tsx index f2f3387..b443f2b 100644 --- a/frontend/src/features/notifiers/ui/edit/notifiers/EditEmailNotifierComponent.tsx +++ b/frontend/src/features/notifiers/ui/edit/notifiers/EditEmailNotifierComponent.tsx @@ -126,6 +126,35 @@ export function EditEmailNotifierComponent({ notifier, setNotifier, setIsUnsaved placeholder="password" /> + +
+
From
+ { + if (!notifier?.emailNotifier) return; + + setNotifier({ + ...notifier, + emailNotifier: { + ...notifier.emailNotifier, + from: e.target.value.trim(), + }, + }); + setIsUnsaved(true); + }} + size="small" + className="w-full max-w-[250px]" + placeholder="example@example.com" + /> + + + + +
); } diff --git a/frontend/src/features/notifiers/ui/show/notifier/ShowEmailNotifierComponent.tsx b/frontend/src/features/notifiers/ui/show/notifier/ShowEmailNotifierComponent.tsx index 99fb225..4b1ed23 100644 --- a/frontend/src/features/notifiers/ui/show/notifier/ShowEmailNotifierComponent.tsx +++ b/frontend/src/features/notifiers/ui/show/notifier/ShowEmailNotifierComponent.tsx @@ -31,6 +31,11 @@ export function ShowEmailNotifierComponent({ notifier }: Props) {
SMTP password
{'*************'} + +
+
From
+ {notifier?.emailNotifier?.from || '(auto)'} +
); }