From bb670018397c37ecce339d499417cb503f1cf394 Mon Sep 17 00:00:00 2001 From: slawk0 Date: Sat, 8 Feb 2025 00:13:31 +0100 Subject: [PATCH] added create group route --- database/groups.go | 53 ++++++++++++++++++++++++++++++++++++++++++++++ handlers/groups.go | 33 +++++++++++++++++++++++++++++ model/model.go | 4 ++++ router/router.go | 4 ++++ 4 files changed, 94 insertions(+) create mode 100644 database/groups.go create mode 100644 handlers/groups.go diff --git a/database/groups.go b/database/groups.go new file mode 100644 index 0000000..000f7cf --- /dev/null +++ b/database/groups.go @@ -0,0 +1,53 @@ +package database + +import ( + "database/sql" + "fmt" + "github.com/google/uuid" + "relay-server/helpers" +) + +func CreateGroup(db *sql.DB, groupName string, userID uuid.UUID) (uuid.UUID, error) { + createConversationQuery := ` + INSERT INTO Conversations (conversation_type, name) + VALUES ('group', $1) + RETURNING conversation_id AS group_id; + ` + + insertGroupAdminQuery := ` + INSERT INTO GroupAdmins (conversation_id, user_id, granted_by, is_owner) + VALUES ($1, $2, $3, true) + RETURNING granted_at; + ` + + addMemberToGroupQuery := ` + INSERT INTO Memberships (conversation_id, user_id) + VALUES ($1, $2) + ON CONFLICT DO NOTHING + RETURNING user_id; + ` + + var groupID uuid.UUID + err := db.QueryRow(createConversationQuery, groupName).Scan(&groupID) + if err != nil { + return uuid.Nil, helpers.NewError(helpers.ErrInternal, "Failed to create group", fmt.Errorf("failed to create group: %w", err)) + } + + var grantedAt string + err = db.QueryRow(insertGroupAdminQuery, groupID, userID, userID).Scan(&grantedAt) + if err != nil { + return uuid.Nil, helpers.NewError(helpers.ErrInternal, "Failed to create group", fmt.Errorf("failed to insert group admin: %w", err)) + } + + var memberID uuid.UUID + err = db.QueryRow(addMemberToGroupQuery, groupID, userID).Scan(&memberID) + if err != nil { + return uuid.Nil, helpers.NewError(helpers.ErrInternal, "Failed to create group", fmt.Errorf("failed to add member to group: %w", err)) + } + + _, err = InsertContactByID(db, userID, groupID) + if err != nil { + return groupID, helpers.NewError(helpers.ErrInternal, "Failed to create group contact", fmt.Errorf("failed to insert group contact: %w", err)) + } + return groupID, nil +} diff --git a/handlers/groups.go b/handlers/groups.go new file mode 100644 index 0000000..076a797 --- /dev/null +++ b/handlers/groups.go @@ -0,0 +1,33 @@ +package handlers + +import ( + "github.com/gofiber/fiber/v2" + "github.com/google/uuid" + "relay-server/database" + "relay-server/helpers" +) + +func CreateGroup(c *fiber.Ctx) error { + type createGroupRequest struct { + GroupName string `json:"groupName"` + } + + userID := c.Locals("userID").(uuid.UUID) + + var req createGroupRequest + if err := c.BodyParser(&req); err != nil { + return helpers.NewError(helpers.ErrInvalidInput, "Invalid request body", err) + } + + if req.GroupName == "" { + return helpers.NewError(helpers.ErrInvalidInput, "Group name is empty", nil) + } + + groupID, err := database.CreateGroup(database.DB, req.GroupName, userID) + if err != nil { + return err + } + //TODO zrobic io.to(groupID).emit("added to group", {groupID, username: req.GroupName}) + return c.Status(fiber.StatusOK).JSON(fiber.Map{"groupID": groupID}) + +} diff --git a/model/model.go b/model/model.go index 351db84..6ff2f98 100644 --- a/model/model.go +++ b/model/model.go @@ -36,3 +36,7 @@ type Message struct { Sender string `json:"sender"` AttachmentUrl *string `json:"attachment_url"` } + +type CreateGroupResponse struct { + GroupID uuid.UUID `json:"group_id"` +} diff --git a/router/router.go b/router/router.go index 3af0110..2d4b403 100644 --- a/router/router.go +++ b/router/router.go @@ -30,4 +30,8 @@ func SetupRoutes(app *fiber.App) { // Messages group messages := chat.Group("/messages", middleware.Protected(), logger.New()) messages.Get("/:conversationID", handlers.GetMessages) + + // Groups group + groups := chat.Group("/groups", middleware.Protected(), logger.New()) + groups.Post("/create", handlers.CreateGroup) }