code refactor, implementing sockets

This commit is contained in:
slawk0
2025-02-11 16:34:59 +01:00
parent bbae0e8fbb
commit 248966d63f
18 changed files with 595 additions and 122 deletions

View File

@@ -9,7 +9,7 @@ import (
"os"
"relay-server/config"
"relay-server/database"
"relay-server/helpers"
"relay-server/utils"
"time"
)
@@ -21,21 +21,21 @@ func Signup(c *fiber.Ctx) error {
u := new(SignupStruct)
if err := c.BodyParser(u); err != nil {
return helpers.NewError(helpers.ErrInvalidInput, "Invalid request body", err)
return utils.NewError(utils.ErrInvalidInput, "Invalid request body", err)
}
// Validate input
if u.Username == "" {
return helpers.NewError(helpers.ErrInvalidInput, "Username is empty", nil)
return utils.NewError(utils.ErrInvalidInput, "Username is empty", nil)
}
if u.Password == "" {
return helpers.NewError(helpers.ErrInvalidInput, "Password is empty", nil)
return utils.NewError(utils.ErrInvalidInput, "Password is empty", nil)
}
if !helpers.IsValidPassword(u.Password) {
return helpers.NewError(helpers.ErrInvalidInput, "Invalid password", nil)
if !utils.IsValidPassword(u.Password) {
return utils.NewError(utils.ErrInvalidInput, "Invalid password", nil)
}
if !helpers.IsValidUsername(u.Username) {
return helpers.NewError(helpers.ErrInvalidInput, "Invalid username", nil)
if !utils.IsValidUsername(u.Username) {
return utils.NewError(utils.ErrInvalidInput, "Invalid username", nil)
}
// Check if user exists
@@ -44,13 +44,13 @@ func Signup(c *fiber.Ctx) error {
return err
}
if exist {
return helpers.NewError(helpers.ErrInvalidInput, "User already exists", nil)
return utils.NewError(utils.ErrInvalidInput, "User already exists", nil)
}
// Create password hash
passwordHash, err := bcrypt.GenerateFromPassword([]byte(u.Password), config.BCRYPT_COST)
if err != nil {
return helpers.NewError(helpers.ErrInternal, "internal server error", fmt.Errorf("failed to generate password hash: %w", err))
return utils.NewError(utils.ErrInternal, "internal server error", fmt.Errorf("failed to generate password hash: %w", err))
}
// Insert user
@@ -66,7 +66,7 @@ func Signup(c *fiber.Ctx) error {
})
signedToken, err := token.SignedString([]byte(os.Getenv("JWT_SECRET")))
if err != nil {
return helpers.NewError(helpers.ErrInternal, "Failed to generate auth token", err)
return utils.NewError(utils.ErrInternal, "Failed to generate auth token", err)
}
// Set token cookie
@@ -91,21 +91,21 @@ func Login(c *fiber.Ctx) error {
u := new(loginStruct)
if err := c.BodyParser(u); err != nil {
return helpers.NewError(helpers.ErrInvalidInput, "Invalid request body", err)
return utils.NewError(utils.ErrInvalidInput, "Invalid request body", err)
}
// Validate input
if u.Username == "" {
return helpers.NewError(helpers.ErrInvalidInput, "Username is empty", nil)
return utils.NewError(utils.ErrInvalidInput, "Username is empty", nil)
}
if u.Password == "" {
return helpers.NewError(helpers.ErrInvalidInput, "Password is empty", nil)
return utils.NewError(utils.ErrInvalidInput, "Password is empty", nil)
}
if !helpers.IsValidUsername(u.Username) {
return helpers.NewError(helpers.ErrInvalidInput, "Invalid username", nil)
if !utils.IsValidUsername(u.Username) {
return utils.NewError(utils.ErrInvalidInput, "Invalid username", nil)
}
if !helpers.IsValidPassword(u.Password) {
return helpers.NewError(helpers.ErrInvalidInput, "Invalid password", nil)
if !utils.IsValidPassword(u.Password) {
return utils.NewError(utils.ErrInvalidInput, "Invalid password", nil)
}
// Check if user exists
@@ -114,7 +114,7 @@ func Login(c *fiber.Ctx) error {
return err
}
if !exist {
return helpers.NewError(helpers.ErrNotFound, "User does not exist", nil)
return utils.NewError(utils.ErrNotFound, "User does not exist", nil)
}
// Verify password
@@ -123,7 +123,7 @@ func Login(c *fiber.Ctx) error {
return err
}
if err := bcrypt.CompareHashAndPassword([]byte(passwordHash), []byte(u.Password)); err != nil {
return helpers.NewError(helpers.ErrInvalidInput, "Invalid password", nil)
return utils.NewError(utils.ErrInvalidInput, "Invalid password", nil)
}
// Get user ID
@@ -139,7 +139,7 @@ func Login(c *fiber.Ctx) error {
})
signedToken, err := token.SignedString([]byte(os.Getenv("JWT_SECRET")))
if err != nil {
return helpers.NewError(helpers.ErrInternal, "Failed to generate token", err)
return utils.NewError(utils.ErrInternal, "Failed to generate token", err)
}
// Set token cookie
@@ -159,13 +159,13 @@ func Login(c *fiber.Ctx) error {
func ValidateToken(c *fiber.Ctx) error {
username, ok := c.Locals("username").(string)
if !ok {
return helpers.NewError(helpers.ErrInvalidInput, "Invalid token: missing username", fmt.Errorf("missing username: %v", c.Locals("username")))
return utils.NewError(utils.ErrInvalidInput, "Invalid token: missing username", fmt.Errorf("missing username: %v", c.Locals("username")))
}
userIDVal := c.Locals("userID")
userID, ok := userIDVal.(uuid.UUID)
if !ok {
return helpers.NewError(helpers.ErrUnauthorized, "unauthorized", fmt.Errorf("missing/invalid userID type: %T, value: %v\n", userIDVal, userIDVal))
return utils.NewError(utils.ErrUnauthorized, "unauthorized", fmt.Errorf("missing/invalid userID type: %T, value: %v\n", userIDVal, userIDVal))
}
return c.Status(fiber.StatusOK).JSON(fiber.Map{

View File

@@ -4,7 +4,7 @@ import (
"github.com/gofiber/fiber/v2"
"github.com/google/uuid"
"relay-server/database"
"relay-server/helpers"
"relay-server/utils"
)
func DeleteContact(c *fiber.Ctx) error {
@@ -15,14 +15,14 @@ func DeleteContact(c *fiber.Ctx) error {
p := new(params)
if err := c.ParamsParser(p); err != nil {
return helpers.NewError(helpers.ErrInvalidInput, "Invalid params", err)
return utils.NewError(utils.ErrInvalidInput, "Invalid params", err)
}
if p.ContactID == uuid.Nil {
return helpers.NewError(helpers.ErrInvalidInput, "contact ID is empty", nil)
return utils.NewError(utils.ErrInvalidInput, "contact ID is empty", nil)
}
if p.ConversationID == uuid.Nil {
return helpers.NewError(helpers.ErrInvalidInput, "conversation ID is empty", nil)
return utils.NewError(utils.ErrInvalidInput, "conversation ID is empty", nil)
}
err := database.DeleteContact(database.DB, p.ContactID, p.ConversationID)
@@ -42,15 +42,15 @@ func InsertContact(c *fiber.Ctx) error {
p := new(params)
if err := c.ParamsParser(p); err != nil {
return helpers.NewError(helpers.ErrInvalidInput, "Invalid params", err)
return utils.NewError(utils.ErrInvalidInput, "Invalid params", err)
}
if p.ContactUsername == "" {
return helpers.NewError(helpers.ErrInvalidInput, "contact username is empty", nil)
return utils.NewError(utils.ErrInvalidInput, "contact username is empty", nil)
}
if !helpers.IsValidUsername(p.ContactUsername) {
return helpers.NewError(helpers.ErrInvalidInput, "invalid username", nil)
if !utils.IsValidUsername(p.ContactUsername) {
return utils.NewError(utils.ErrInvalidInput, "invalid username", nil)
}
contactID, err := database.GetUserID(database.DB, p.ContactUsername)
@@ -84,10 +84,10 @@ func GetContactSuggestions(c *fiber.Ctx) error {
p := new(params)
if err := c.ParamsParser(p); err != nil {
return helpers.NewError(helpers.ErrInvalidInput, "Invalid params", err)
return utils.NewError(utils.ErrInvalidInput, "Invalid params", err)
}
if p.ContactUsername == "" {
return helpers.NewError(helpers.ErrInvalidInput, "contact username is empty", nil)
return utils.NewError(utils.ErrInvalidInput, "contact username is empty", nil)
}
suggestions, err := database.ContactSuggestion(database.DB, p.ContactUsername)

View File

@@ -6,7 +6,7 @@ import (
"github.com/google/uuid"
"log"
"relay-server/database"
"relay-server/helpers"
"relay-server/utils"
)
func CreateGroup(c *fiber.Ctx) error {
@@ -18,11 +18,11 @@ func CreateGroup(c *fiber.Ctx) error {
var req createGroupRequest
if err := c.BodyParser(&req); err != nil {
return helpers.NewError(helpers.ErrInvalidInput, "Invalid request body", err)
return utils.NewError(utils.ErrInvalidInput, "Invalid request body", err)
}
if req.GroupName == "" {
return helpers.NewError(helpers.ErrInvalidInput, "Group name is empty", nil)
return utils.NewError(utils.ErrInvalidInput, "Group name is empty", nil)
}
groupID, err := database.CreateGroup(database.DB, req.GroupName, userID)
@@ -41,13 +41,13 @@ func AddMemberToGroup(c *fiber.Ctx) error {
}
var req addMemberToGroupRequest
if err := c.BodyParser(&req); err != nil {
return helpers.NewError(helpers.ErrInvalidInput, "Invalid request body", err)
return utils.NewError(utils.ErrInvalidInput, "Invalid request body", err)
}
if req.GroupID == uuid.Nil {
return helpers.NewError(helpers.ErrInvalidInput, "Group ID is empty", nil)
return utils.NewError(utils.ErrInvalidInput, "Group ID is empty", nil)
}
if req.UserID == uuid.Nil {
return helpers.NewError(helpers.ErrInvalidInput, "User ID is empty", nil)
return utils.NewError(utils.ErrInvalidInput, "User ID is empty", nil)
}
isAdmin, err := database.IsAdmin(database.DB, req.UserID, req.GroupID)
@@ -55,7 +55,7 @@ func AddMemberToGroup(c *fiber.Ctx) error {
return err
}
if !isAdmin {
return helpers.NewError(helpers.ErrUnauthorized, "You are not a group administrator", nil)
return utils.NewError(utils.ErrUnauthorized, "You are not a group administrator", nil)
}
_, err = database.AddMemberToGroup(database.DB, req.GroupID, req.UserID)
@@ -75,15 +75,15 @@ func GetMembers(c *fiber.Ctx) error {
var p params
if err := c.ParamsParser(&p); err != nil {
return helpers.NewError(helpers.ErrInvalidInput, "Invalid params", err)
return utils.NewError(utils.ErrInvalidInput, "Invalid params", err)
}
isMember, err := database.IsMember(database.DB, p.GroupID, c.Locals("userID").(uuid.UUID))
isMember, err := database.IsMember(database.DB, c.Locals("userID").(uuid.UUID), p.GroupID)
if err != nil {
return helpers.NewError(helpers.ErrInternal, "Failed to get members", fmt.Errorf("failed to check if user is a member: %w", err))
return utils.NewError(utils.ErrInternal, "Failed to get members", fmt.Errorf("failed to check if user is a member: %w", err))
}
if !isMember {
return helpers.NewError(helpers.ErrForbidden, "You are not a member of this group", nil)
return utils.NewError(utils.ErrForbidden, "You are not a member of this group", nil)
}
members, err := database.GetMembers(database.DB, p.GroupID)
@@ -91,5 +91,5 @@ func GetMembers(c *fiber.Ctx) error {
return err
}
return c.Status(fiber.StatusOK).JSON(fiber.Map{"members": members})
return c.Status(fiber.StatusOK).JSON(members)
}

View File

@@ -4,7 +4,7 @@ import (
"github.com/gofiber/fiber/v2"
"github.com/google/uuid"
"relay-server/database"
"relay-server/helpers"
"relay-server/utils"
)
func GetMessages(c *fiber.Ctx) error {
@@ -20,13 +20,13 @@ func GetMessages(c *fiber.Ctx) error {
p := new(params)
q := new(query)
if err := c.ParamsParser(p); err != nil {
return helpers.NewError(helpers.ErrInvalidInput, "Invalid params", err)
return utils.NewError(utils.ErrInvalidInput, "Invalid params", err)
}
if err := c.QueryParser(q); err != nil {
return helpers.NewError(helpers.ErrInvalidInput, "Invalid query", err)
return utils.NewError(utils.ErrInvalidInput, "Invalid query", err)
}
if p.conversationID == uuid.Nil {
return helpers.NewError(helpers.ErrInvalidInput, "conversation ID is empty", nil)
return utils.NewError(utils.ErrInvalidInput, "conversation ID is empty", nil)
}
messages, err := database.GetMessages(database.DB, userID, p.conversationID, q.limit, q.cursor)