fix: CLI client types mismatched server response format
- SessionResponse: use 'id' (int64) not 'session_id'/'client_id' - StateResponse: match actual server response shape - GetMembers: strip '#' from channel name for URL path - These bugs prevented the CLI from working correctly with the server
This commit is contained in:
@@ -7,6 +7,7 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -167,7 +168,9 @@ func (c *Client) ListChannels() ([]Channel, error) {
|
|||||||
|
|
||||||
// GetMembers returns members of a channel.
|
// GetMembers returns members of a channel.
|
||||||
func (c *Client) GetMembers(channel string) ([]string, error) {
|
func (c *Client) GetMembers(channel string) ([]string, error) {
|
||||||
data, err := c.do("GET", "/api/v1/channels/"+url.PathEscape(channel)+"/members", nil)
|
// Server route is /channels/{channel}/members where channel is without '#'
|
||||||
|
name := strings.TrimPrefix(channel, "#")
|
||||||
|
data, err := c.do("GET", "/api/v1/channels/"+url.PathEscape(name)+"/members", nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package chatapi
|
package api
|
||||||
|
|
||||||
import "time"
|
import "time"
|
||||||
|
|
||||||
@@ -9,16 +9,14 @@ type SessionRequest struct {
|
|||||||
|
|
||||||
// SessionResponse is the response from POST /api/v1/session.
|
// SessionResponse is the response from POST /api/v1/session.
|
||||||
type SessionResponse struct {
|
type SessionResponse struct {
|
||||||
SessionID string `json:"sessionId"`
|
ID int64 `json:"id"`
|
||||||
ClientID string `json:"clientId"`
|
|
||||||
Nick string `json:"nick"`
|
Nick string `json:"nick"`
|
||||||
Token string `json:"token"`
|
Token string `json:"token"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// StateResponse is the response from GET /api/v1/state.
|
// StateResponse is the response from GET /api/v1/state.
|
||||||
type StateResponse struct {
|
type StateResponse struct {
|
||||||
SessionID string `json:"sessionId"`
|
ID int64 `json:"id"`
|
||||||
ClientID string `json:"clientId"`
|
|
||||||
Nick string `json:"nick"`
|
Nick string `json:"nick"`
|
||||||
Channels []string `json:"channels"`
|
Channels []string `json:"channels"`
|
||||||
}
|
}
|
||||||
@@ -29,25 +27,22 @@ type Message struct {
|
|||||||
From string `json:"from,omitempty"`
|
From string `json:"from,omitempty"`
|
||||||
To string `json:"to,omitempty"`
|
To string `json:"to,omitempty"`
|
||||||
Params []string `json:"params,omitempty"`
|
Params []string `json:"params,omitempty"`
|
||||||
Body any `json:"body,omitempty"`
|
Body interface{} `json:"body,omitempty"`
|
||||||
ID string `json:"id,omitempty"`
|
ID string `json:"id,omitempty"`
|
||||||
TS string `json:"ts,omitempty"`
|
TS string `json:"ts,omitempty"`
|
||||||
Meta any `json:"meta,omitempty"`
|
Meta interface{} `json:"meta,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// BodyLines returns the body as a slice of strings (for text
|
// BodyLines returns the body as a slice of strings (for text messages).
|
||||||
// messages).
|
|
||||||
func (m *Message) BodyLines() []string {
|
func (m *Message) BodyLines() []string {
|
||||||
switch v := m.Body.(type) {
|
switch v := m.Body.(type) {
|
||||||
case []any:
|
case []interface{}:
|
||||||
lines := make([]string, 0, len(v))
|
lines := make([]string, 0, len(v))
|
||||||
|
|
||||||
for _, item := range v {
|
for _, item := range v {
|
||||||
if s, ok := item.(string); ok {
|
if s, ok := item.(string); ok {
|
||||||
lines = append(lines, s)
|
lines = append(lines, s)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return lines
|
return lines
|
||||||
case []string:
|
case []string:
|
||||||
return v
|
return v
|
||||||
@@ -61,7 +56,7 @@ type Channel struct {
|
|||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
Topic string `json:"topic"`
|
Topic string `json:"topic"`
|
||||||
Members int `json:"members"`
|
Members int `json:"members"`
|
||||||
CreatedAt string `json:"createdAt"`
|
CreatedAt string `json:"created_at"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// ServerInfo is the response from GET /api/v1/server.
|
// ServerInfo is the response from GET /api/v1/server.
|
||||||
@@ -89,6 +84,5 @@ func (m *Message) ParseTS() time.Time {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return time.Now()
|
return time.Now()
|
||||||
}
|
}
|
||||||
|
|
||||||
return t
|
return t
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -145,7 +145,7 @@ func (a *App) cmdConnect(serverURL string) {
|
|||||||
a.lastQID = 0
|
a.lastQID = 0
|
||||||
a.mu.Unlock()
|
a.mu.Unlock()
|
||||||
|
|
||||||
a.ui.AddStatus(fmt.Sprintf("[green]Connected! Nick: %s, Session: %s", resp.Nick, resp.SessionID))
|
a.ui.AddStatus(fmt.Sprintf("[green]Connected! Nick: %s, Session: %d", resp.Nick, resp.ID))
|
||||||
a.ui.SetStatus(resp.Nick, "", "connected")
|
a.ui.SetStatus(resp.Nick, "", "connected")
|
||||||
|
|
||||||
// Start polling.
|
// Start polling.
|
||||||
|
|||||||
Reference in New Issue
Block a user