refactor: remove legacy spaces and migrate lists to standalone resources with direct sharing
MindSift CI & Docker Release / Build, Test in Container & Push (push) Successful in 59s

This commit is contained in:
sandrodach committed 2026-10-25 18:17:17 +01:00
1 parent 177b69234c
commit 0d6c603e9c
9 files changed
+616 -950

No files matched your search

+29 -23
View File
@@ -22,7 +22,7 @@ var upgrader = websocket.Upgrader{
type Client struct {
hub *Hub
conn *websocket.Conn
spaceID string
roomID string
userID string
send chan []byte
}
@@ -37,7 +37,7 @@ type docLockItem struct {
type Hub struct {
mu sync.RWMutex
spaceRooms map[string]map[*Client]bool
rooms map[string]map[*Client]bool
userRooms map[string]map[*Client]bool
allClients map[*Client]bool
locks map[string]*docLockItem
@@ -45,7 +45,7 @@ type Hub struct {
func NewHub() *Hub {
h := &Hub{
spaceRooms: make(map[string]map[*Client]bool),
rooms: make(map[string]map[*Client]bool),
userRooms: make(map[string]map[*Client]bool),
allClients: make(map[*Client]bool),
locks: make(map[string]*docLockItem),
@@ -57,11 +57,11 @@ func NewHub() *Hub {
func (h *Hub) Register(c *Client) {
h.mu.Lock()
h.allClients[c] = true
if c.spaceID != "" {
if h.spaceRooms[c.spaceID] == nil {
h.spaceRooms[c.spaceID] = make(map[*Client]bool)
if c.roomID != "" {
if h.rooms[c.roomID] == nil {
h.rooms[c.roomID] = make(map[*Client]bool)
}
h.spaceRooms[c.spaceID][c] = true
h.rooms[c.roomID][c] = true
}
if c.userID != "" && c.userID != "anonymous" {
if h.userRooms[c.userID] == nil {
@@ -72,8 +72,8 @@ func (h *Hub) Register(c *Client) {
onlineCount := len(h.allClients)
h.mu.Unlock()
if c.spaceID != "" {
h.Broadcast(c.spaceID, "", "USER_PRESENCE", map[string]interface{}{
if c.roomID != "" {
h.Broadcast(c.roomID, "", "USER_PRESENCE", map[string]interface{}{
"onlineCount": onlineCount,
})
}
@@ -82,11 +82,11 @@ func (h *Hub) Register(c *Client) {
func (h *Hub) Unregister(c *Client) {
h.mu.Lock()
delete(h.allClients, c)
if c.spaceID != "" {
if room, ok := h.spaceRooms[c.spaceID]; ok {
if c.roomID != "" {
if room, ok := h.rooms[c.roomID]; ok {
delete(room, c)
if len(room) == 0 {
delete(h.spaceRooms, c.spaceID)
delete(h.rooms, c.roomID)
}
}
}
@@ -297,7 +297,6 @@ func (h *Hub) BroadcastDocEvent(docID, event string, payload interface{}) {
func (h *Hub) Broadcast(spaceID, listID, event string, payload interface{}) {
msg := domain.WSMessage{
Event: event,
SpaceID: spaceID,
ListID: listID,
Payload: payload,
Timestamp: domain.NowISO(),
@@ -310,20 +309,27 @@ func (h *Hub) Broadcast(spaceID, listID, event string, payload interface{}) {
h.mu.RLock()
defer h.mu.RUnlock()
room, ok := h.spaceRooms[spaceID]
if !ok {
return
targetRoom := listID
if targetRoom == "" {
targetRoom = spaceID
}
for client := range room {
select {
case client.send <- data:
default:
// Slow client buffer full
if room, ok := h.rooms[targetRoom]; ok {
for client := range room {
select {
case client.send <- data:
default:
// Slow client buffer full
}
}
}
}
func (h *Hub) ServeWS(w http.ResponseWriter, r *http.Request, spaceID, userID string) {
func (h *Hub) BroadcastListEvent(listID, event string, payload interface{}) {
h.Broadcast("", listID, event, payload)
}
func (h *Hub) ServeWS(w http.ResponseWriter, r *http.Request, roomID, userID string) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Printf("[ws] upgrade error: %v", err)
@@ -333,7 +339,7 @@ func (h *Hub) ServeWS(w http.ResponseWriter, r *http.Request, spaceID, userID st
client := &Client{
hub: h,
conn: conn,
spaceID: spaceID,
roomID: roomID,
userID: userID,
send: make(chan []byte, 128),
}