summaryrefslogtreecommitdiff
path: root/shrine/controllers/letter.go
diff options
context:
space:
mode:
authorBobby <[email protected]>2026-03-07 08:52:35 +0530
committerBobby <[email protected]>2026-03-07 08:52:35 +0530
commit82409d6b83de1baab69c166af8f04c6e9fe9069f (patch)
tree678b3ee2242b20da49c8cf1ff0ec509d0c8ef1e1 /shrine/controllers/letter.go
parenta97d1ad37463107b462958d92f596ebb80254b77 (diff)
downloadpagoda-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.go165
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