diff --git a/database/messages.go b/database/messages.go index 403863f..d0133e0 100644 --- a/database/messages.go +++ b/database/messages.go @@ -107,3 +107,45 @@ func checkMembership(db *sql.DB, userID uuid.UUID, conversationID uuid.UUID) (bo } return isMember, nil } + +func DeleteMessage(db *sql.DB, userID uuid.UUID, conversationID uuid.UUID, messageID int) error { + checkMessageOwnershipQuery := ` + SELECT user_id FROM Messages WHERE message_id = $1; + ` + deleteMessageQuery := ` + DELETE FROM Messages WHERE message_id = $1; + ` + + var messageOwnerID uuid.UUID + err := db.QueryRow(checkMessageOwnershipQuery, messageID).Scan(&messageOwnerID) + if err != nil { + return helpers.NewError(helpers.ErrInternal, "Failed to delete message", fmt.Errorf("failed to check message ownership: %w", err)) + } + + var isSelfMessage bool + if messageOwnerID == userID { + isSelfMessage = true + } + + isAdmin, err := IsAdmin(db, userID, conversationID) + if err != nil { + return err + } + if !isSelfMessage && !isAdmin { + return helpers.NewError(helpers.ErrForbidden, "You don't have permissions to delete that message ", nil) + } + + row, err := db.Exec(deleteMessageQuery, messageID) + if err != nil { + return helpers.NewError(helpers.ErrInternal, "Failed to delete message", fmt.Errorf("failed to delete message: %w", err)) + } + rowsAffected, err := row.RowsAffected() + if err != nil { + return helpers.NewError(helpers.ErrInternal, "Failed to delete message", fmt.Errorf("failed to get rows affected: %w", err)) + } + if rowsAffected == 0 { + return helpers.NewError(helpers.ErrNotFound, "Message not found", nil) + } + return nil + +}