diff --git a/database.go b/database.go index 6e0cab9..3229985 100644 --- a/database.go +++ b/database.go @@ -90,6 +90,14 @@ func DbSetClientByIdWithoutGroups(ctx context.Context, client *Client) error { return err } +func DbSetClientById(ctx context.Context, client *Client) error { + err := DbSetClientByIdWithoutGroups(ctx, client) + if err != nil { + return err + } + return DbSetClientGroups(ctx, client) +} + func DbSaveGroupWithoutClients(ctx context.Context, group *Group) error { err := dbConn.QueryRow(ctx, ` INSERT INTO chat_groups (name, creator_id, owner_id, enable_client_colors, color_red, color_green, color_blue, created_at) diff --git a/http.go b/http.go index 52cd5f0..c3a4efb 100644 --- a/http.go +++ b/http.go @@ -299,8 +299,12 @@ func HttpHandleNewMessage(response http.ResponseWriter, request *http.Request) { http.Error(response, "invalid token", http.StatusUnauthorized) } - subject := request.FormValue("subject") - if subject == "" { + targetStr := request.FormValue("subject") + if targetStr == "" { + http.Error(response, "invalid subject", http.StatusBadRequest) + } + targetId, err := ConvertStringUint32(targetStr) + if err != nil { http.Error(response, "invalid subject", http.StatusBadRequest) } @@ -313,6 +317,6 @@ func HttpHandleNewMessage(response http.ResponseWriter, request *http.Request) { if err != nil { http.Error(response, "invalid token", http.StatusUnauthorized) } - - + ctx := request.Context() + WsSendToGroup(ctx, targetId, clientId, content) } diff --git a/wsServer.go b/wsServer.go index a4c6e9a..20b68b3 100644 --- a/wsServer.go +++ b/wsServer.go @@ -77,36 +77,18 @@ func sendToAllMessageCloseIfTimeout(message *map[string]any) { } } -func handleAuthenticatedMessage(client *Client, clientMessage *map[string]any) bool { - subjectFlt, ok := (*clientMessage)["subject"].(float64) - subject := uint32(subjectFlt) - if !ok { - var msg = map[string]any{ - "from": "server", - "error": "subject invalid", - } - sendMessageCloseIfTimeout(client, &msg) - return true - } - - content, ok := (*clientMessage)["content"].(string) - if !ok { - var msg = map[string]any{ - "from": "server", - "error": "content invalid", - } - sendMessageCloseIfTimeout(client, &msg) - return true - } - - group, err := CacheGetGroup(subject) +func WsSendToGroup(ctx context.Context, groupId uint32, senderId uint32, message string) error { + group, err := CacheGetGroup(groupId) if err != nil { - var msg = map[string]any{ - "from": "server", - "error": "subject invalid", + return errors.New("group invalid") + } + + client, err := CacheGetClientById(senderId) + if err == nil { + err = DbSetClientById(ctx, client) + if err != nil { + return errors.New("non existing sender") } - sendMessageCloseIfTimeout(client, &msg) - return true } for groupClientId := range group.Clients { @@ -119,16 +101,15 @@ func handleAuthenticatedMessage(client *Client, clientMessage *map[string]any) b "from": "group", "group": group.Id, "sender": client.Name, - "content": content, + "content": message, } sendMessageCloseIfTimeout(groupClient, &msg) } + return nil +} - var msg = map[string]any{ - "from": "server", - } - sendMessageCloseIfTimeout(client) - +func handleAuthenticatedMessage(client *Client, clientMessage *map[string]any) bool { + sendMessageCloseIfTimeout(client, clientMessage) return true }