From 662dd2069dc8590e8b54823a33726464cf10c4e7 Mon Sep 17 00:00:00 2001 From: Bobby Date: Sun, 8 Mar 2026 05:43:04 +0530 Subject: feat(domains): enhance TLD and domain management with edit and delete functionality - Added edit and delete buttons for TLDs in the TLD management interface. - Implemented a modal confirmation for delete actions across TLDs, mailboxes, users, and aliases. - Created separate edit pages for domains and TLDs with forms for updating their details. - Improved user experience by adding alerts for error messages and success notifications. feat(mail): streamline mailbox management with alias support - Introduced alias creation and deletion functionality for mailboxes. - Enhanced mailbox edit interface to include alias management. - Added dropdowns for selecting users and domains when creating aliases. fix(alerts): implement alert system for error messages - Developed a reusable alert component to display error messages. - Integrated alert dismiss functionality with automatic timeout for user notifications. refactor: general code improvements and organization - Updated error handling in the backend to support HTMX requests. - Refactored redirect functions to handle HTMX redirects appropriately. --- controllers/domain/domain.go | 54 ++++++++++++++++++++ controllers/mail/mail.go | 118 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 171 insertions(+), 1 deletion(-) (limited to 'controllers') diff --git a/controllers/domain/domain.go b/controllers/domain/domain.go index 5613ade..ac61c94 100644 --- a/controllers/domain/domain.go +++ b/controllers/domain/domain.go @@ -1,6 +1,8 @@ package domain import ( + "strconv" + domainService "dove/services/domain" "dove/utils/meta" "dove/utils/shortcuts" @@ -22,6 +24,39 @@ func CreateDomain(context *fiber.Ctx) error { return shortcuts.Redirect(context, "domains.manage") } +func UpdateDomain(context *fiber.Ctx) error { + domainID, parseError := strconv.ParseUint(meta.Request(context).Param("id"), 10, 64) + if parseError != nil { + return shortcuts.BadRequestError(context, parseError) + } + + body, bodyError := meta.Body[domainService.UpdateDomainRequest](context) + if bodyError != nil { + return shortcuts.BadRequestError(context, bodyError) + } + + serviceError := domainService.UpdateDomain(uint(domainID), body) + if serviceError != nil { + return shortcuts.HandleError(context, serviceError) + } + + return shortcuts.Redirect(context, "domains.manage") +} + +func DeleteDomain(context *fiber.Ctx) error { + domainID, parseError := strconv.ParseUint(meta.Request(context).Param("id"), 10, 64) + if parseError != nil { + return shortcuts.BadRequestError(context, parseError) + } + + serviceError := domainService.DeleteDomain(uint(domainID)) + if serviceError != nil { + return shortcuts.HandleError(context, serviceError) + } + + return shortcuts.Redirect(context, "domains.manage") +} + func CreateTLD(context *fiber.Ctx) error { body, parseError := meta.Body[domainService.CreateTLDRequest](context) if parseError != nil { @@ -36,6 +71,25 @@ func CreateTLD(context *fiber.Ctx) error { return shortcuts.Redirect(context, "domains.tlds") } +func UpdateTLD(context *fiber.Ctx) error { + tldID, parseError := strconv.ParseUint(meta.Request(context).Param("id"), 10, 64) + if parseError != nil { + return shortcuts.BadRequestError(context, parseError) + } + + body, bodyError := meta.Body[domainService.UpdateTLDRequest](context) + if bodyError != nil { + return shortcuts.BadRequestError(context, bodyError) + } + + serviceError := domainService.UpdateTLD(uint(tldID), body) + if serviceError != nil { + return shortcuts.HandleError(context, serviceError) + } + + return shortcuts.Redirect(context, "domains.tlds") +} + func DeleteTLD(context *fiber.Ctx) error { serviceError := domainService.DeleteTLD(meta.Request(context).Param("name")) if serviceError != nil { diff --git a/controllers/mail/mail.go b/controllers/mail/mail.go index 544a51b..58df08d 100644 --- a/controllers/mail/mail.go +++ b/controllers/mail/mail.go @@ -1,9 +1,14 @@ package mail import ( + "fmt" + "strconv" + "strings" + mailService "dove/services/mail" "dove/utils/meta" "dove/utils/shortcuts" + "dove/utils/urls" "github.com/gofiber/fiber/v2" ) @@ -22,6 +27,39 @@ func CreateUser(context *fiber.Ctx) error { return shortcuts.Redirect(context, "mail.users") } +func UpdateUser(context *fiber.Ctx) error { + userID, parseError := strconv.ParseUint(meta.Request(context).Param("id"), 10, 64) + if parseError != nil { + return shortcuts.BadRequestError(context, parseError) + } + + body, bodyError := meta.Body[mailService.UpdateUserRequest](context) + if bodyError != nil { + return shortcuts.BadRequestError(context, bodyError) + } + + serviceError := mailService.UpdateUser(uint(userID), body) + if serviceError != nil { + return shortcuts.HandleError(context, serviceError) + } + + return shortcuts.Redirect(context, "mail.users") +} + +func DeleteUser(context *fiber.Ctx) error { + userID, parseError := strconv.ParseUint(meta.Request(context).Param("id"), 10, 64) + if parseError != nil { + return shortcuts.BadRequestError(context, parseError) + } + + serviceError := mailService.DeleteUser(uint(userID)) + if serviceError != nil { + return shortcuts.HandleError(context, serviceError) + } + + return shortcuts.Redirect(context, "mail.users") +} + func CreateMailbox(context *fiber.Ctx) error { body, parseError := meta.Body[mailService.CreateMailboxRequest](context) if parseError != nil { @@ -34,4 +72,82 @@ func CreateMailbox(context *fiber.Ctx) error { } return shortcuts.Redirect(context, "mail.mailboxes") -} \ No newline at end of file +} + +func UpdateMailbox(context *fiber.Ctx) error { + mailboxID, parseError := strconv.ParseUint(meta.Request(context).Param("id"), 10, 64) + if parseError != nil { + return shortcuts.BadRequestError(context, parseError) + } + + body, bodyError := meta.Body[mailService.UpdateMailboxRequest](context) + if bodyError != nil { + return shortcuts.BadRequestError(context, bodyError) + } + + serviceError := mailService.UpdateMailbox(uint(mailboxID), body) + if serviceError != nil { + return shortcuts.HandleError(context, serviceError) + } + + return shortcuts.Redirect(context, "mail.mailboxes") +} + +func DeleteMailbox(context *fiber.Ctx) error { + mailboxID, parseError := strconv.ParseUint(meta.Request(context).Param("id"), 10, 64) + if parseError != nil { + return shortcuts.BadRequestError(context, parseError) + } + + serviceError := mailService.DeleteMailbox(uint(mailboxID)) + if serviceError != nil { + return shortcuts.HandleError(context, serviceError) + } + + return shortcuts.Redirect(context, "mail.mailboxes") +} + +func mailboxEditPath(mailboxID uint) string { + editPath, _ := urls.GetFullPath("mail.mailboxes.edit") + return strings.Replace(editPath, ":id", fmt.Sprintf("%d", mailboxID), 1) +} + +func CreateAlias(context *fiber.Ctx) error { + mailboxID, parseError := strconv.ParseUint(meta.Request(context).Param("id"), 10, 64) + if parseError != nil { + return shortcuts.BadRequestError(context, parseError) + } + + body, bodyError := meta.Body[mailService.CreateAliasRequest](context) + if bodyError != nil { + return shortcuts.BadRequestError(context, bodyError) + } + + body.MailboxID = uint(mailboxID) + + serviceError := mailService.CreateAlias(body) + if serviceError != nil { + return shortcuts.HandleError(context, serviceError) + } + + return shortcuts.RedirectToPath(context, mailboxEditPath(uint(mailboxID))) +} + +func DeleteAlias(context *fiber.Ctx) error { + aliasID, parseError := strconv.ParseUint(meta.Request(context).Param("alias_id"), 10, 64) + if parseError != nil { + return shortcuts.BadRequestError(context, parseError) + } + + mailboxID, mailboxParseError := strconv.ParseUint(meta.Request(context).Param("id"), 10, 64) + if mailboxParseError != nil { + return shortcuts.BadRequestError(context, mailboxParseError) + } + + serviceError := mailService.DeleteAlias(uint(aliasID)) + if serviceError != nil { + return shortcuts.HandleError(context, serviceError) + } + + return shortcuts.RedirectToPath(context, mailboxEditPath(uint(mailboxID))) +} -- cgit v1.2.3