diff options
| author | Bobby <[email protected]> | 2026-03-07 08:52:35 +0530 |
|---|---|---|
| committer | Bobby <[email protected]> | 2026-03-07 08:52:35 +0530 |
| commit | 82409d6b83de1baab69c166af8f04c6e9fe9069f (patch) | |
| tree | 678b3ee2242b20da49c8cf1ff0ec509d0c8ef1e1 /shrine/controllers/letter.go | |
| parent | a97d1ad37463107b462958d92f596ebb80254b77 (diff) | |
| download | pagoda-82409d6b83de1baab69c166af8f04c6e9fe9069f.tar.xz pagoda-82409d6b83de1baab69c166af8f04c6e9fe9069f.zip | |
feat: Implement letter service with CRUD operations and message handling
- Added letter service to manage letters, including listing, creating, and editing letters and messages.
- Implemented functionality for sending and receiving messages within letters.
- Introduced pagination for letter listings and message retrieval.
- Added attachment upload capabilities for letters.
- Created detailed responses for letter and message retrieval.
feat: Introduce stats service for user statistics
- Added a service to retrieve user statistics, including newest and online citizens.
feat: Create ticket service for user support tickets
- Implemented ticket management service with functionalities to create, reply, and update tickets.
- Added support for ticket categories and their management.
feat: Add verification service for user account verification
- Implemented functionality to send verification emails for account activation.
feat: Develop warning service for user warnings
- Added service to issue warnings to users, deactivate warnings, and list user warnings.
feat: Create email templates for account status notifications
- Added HTML templates for account ban and disable notifications.
feat: Define request and response types for account, ticket, letter, and warning services
- Created structured request and response types for various services to ensure consistent data handling.
feat: Implement utility functions for authentication and sanitization
- Added functions for validating user hierarchy and sanitizing HTML input.
- Implemented token generation and hashing utilities for secure operations.
Diffstat (limited to 'shrine/controllers/letter.go')
| -rw-r--r-- | shrine/controllers/letter.go | 165 |
1 files changed, 165 insertions, 0 deletions
diff --git a/shrine/controllers/letter.go b/shrine/controllers/letter.go new file mode 100644 index 0000000..10696f1 --- /dev/null +++ b/shrine/controllers/letter.go @@ -0,0 +1,165 @@ +package controllers + +import ( + "shrine/messages" + "shrine/services" + "shrine/types/letter" + "shrine/utils/auth" + "shrine/utils/meta" + "shrine/utils/shortcuts" + + "github.com/gofiber/fiber/v2" +) + +func ListLettersController(context *fiber.Ctx) error { + citizen := auth.GetUser(context) + pagination := meta.Paginate(context) + + items, total := services.ListLetters(citizen.ID, pagination) + return shortcuts.Success(context, pagination.Response(items, total)) +} + +func GetLetterController(context *fiber.Ctx) error { + citizen := auth.GetUser(context) + ref := meta.Request(context).MustHave().Param("ref") + pagination := meta.Paginate(context) + + result, serviceErr := services.GetLetter(ref, citizen.ID, pagination) + if serviceErr != nil { + return shortcuts.HandleError(context, serviceErr) + } + + return shortcuts.Success(context, result) +} + +func CreateLetterController(context *fiber.Ctx) error { + citizen := auth.GetUser(context) + + body, err := meta.Body[letter.CreateRequest](context) + if err != nil { + return shortcuts.BadRequest(context, err) + } + + result, serviceErr := services.CreateLetter(citizen.ID, body) + if serviceErr != nil { + return shortcuts.HandleError(context, serviceErr) + } + + return shortcuts.Created(context, result) +} + +func SendMessageController(context *fiber.Ctx) error { + citizen := auth.GetUser(context) + ref := meta.Request(context).MustHave().Param("ref") + + body, err := meta.Body[letter.SendMessageRequest](context) + if err != nil { + return shortcuts.BadRequest(context, err) + } + + result, serviceErr := services.SendLetterMessage(ref, citizen.ID, body) + if serviceErr != nil { + return shortcuts.HandleError(context, serviceErr) + } + + return shortcuts.Created(context, result) +} + +func EditMessageController(context *fiber.Ctx) error { + citizen := auth.GetUser(context) + ref := meta.Request(context).MustHave().Param("ref") + messageRef := meta.Request(context).MustHave().Param("messageRef") + + body, err := meta.Body[letter.EditMessageRequest](context) + if err != nil { + return shortcuts.BadRequest(context, err) + } + + result, serviceErr := services.EditLetterMessage(ref, messageRef, citizen.ID, body) + if serviceErr != nil { + return shortcuts.HandleError(context, serviceErr) + } + + return shortcuts.Success(context, result) +} + +func DeleteMessageController(context *fiber.Ctx) error { + citizen := auth.GetUser(context) + ref := meta.Request(context).MustHave().Param("ref") + messageRef := meta.Request(context).MustHave().Param("messageRef") + + serviceErr := services.DeleteLetterMessage(ref, messageRef, citizen.ID) + if serviceErr != nil { + return shortcuts.HandleError(context, serviceErr) + } + + return shortcuts.NoContent(context) +} + +func RenameLetterController(context *fiber.Ctx) error { + citizen := auth.GetUser(context) + ref := meta.Request(context).MustHave().Param("ref") + + body, err := meta.Body[letter.RenameRequest](context) + if err != nil { + return shortcuts.BadRequest(context, err) + } + + result, serviceErr := services.RenameLetter(ref, citizen.ID, body) + if serviceErr != nil { + return shortcuts.HandleError(context, serviceErr) + } + + return shortcuts.Success(context, result) +} + +func LeaveLetterController(context *fiber.Ctx) error { + citizen := auth.GetUser(context) + ref := meta.Request(context).MustHave().Param("ref") + + result, serviceErr := services.LeaveLetter(ref, citizen.ID) + if serviceErr != nil { + return shortcuts.HandleError(context, serviceErr) + } + + return shortcuts.Success(context, result) +} + +func RemoveParticipantController(context *fiber.Ctx) error { + citizen := auth.GetUser(context) + ref := meta.Request(context).MustHave().Param("ref") + + body, err := meta.Body[letter.RemoveParticipantRequest](context) + if err != nil { + return shortcuts.BadRequest(context, err) + } + + result, serviceErr := services.RemoveLetterParticipant(ref, citizen.ID, body) + if serviceErr != nil { + return shortcuts.HandleError(context, serviceErr) + } + + return shortcuts.Success(context, result) +} + +func UploadAttachmentController(context *fiber.Ctx) error { + citizen := auth.GetUser(context) + + file, err := context.FormFile("file") + if err != nil { + return shortcuts.BadRequest(context, fiber.NewError(fiber.StatusBadRequest, messages.FileRequired)) + } + + source, err := file.Open() + if err != nil { + return shortcuts.InternalServerError(context, err) + } + defer source.Close() + + result, serviceErr := services.UploadLetterAttachment(citizen.ID, file.Filename, file.Size, file.Header.Get("Content-Type"), source) + if serviceErr != nil { + return shortcuts.HandleError(context, serviceErr) + } + + return shortcuts.Created(context, result) +}
\ No newline at end of file |
