feat: unify sharing UI, redesign lists header, fix team sharing, and add user autocomplete
MindSift CI & Docker Release / Build, Test in Container & Push (push) Failing after 18s
MindSift CI & Docker Release / Build, Test in Container & Push (push) Failing after 18s
This commit is contained in:
1 parent
6d07352e80
commit
354129b2d4
10 files changed
+1049
-393
No files matched your search
+29
-34
@@ -129,6 +129,7 @@ func (s *Server) Router() http.Handler {
|
||||
r.Get("/api/v1/spaces", s.handleGetSpaces)
|
||||
r.Post("/api/v1/spaces", s.handleCreateSpace)
|
||||
r.Post("/api/v1/spaces/join", s.handleJoinSpace)
|
||||
r.Get("/api/v1/spaces/{id}/shares", s.handleGetSpaceShares)
|
||||
r.Post("/api/v1/spaces/{id}/members", s.handleAddSpaceMember)
|
||||
r.Delete("/api/v1/spaces/{id}/members/{userId}", s.handleRemoveSpaceMember)
|
||||
r.Get("/api/v1/spaces/{id}/lists", s.handleGetSpaceLists)
|
||||
@@ -953,28 +954,17 @@ func (s *Server) handleCreateDocShare(w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
|
||||
if req.TeamID != "" {
|
||||
members, err := s.store.GetTeamMembers(req.TeamID)
|
||||
share, err := s.store.CreateDocTeamShare(userID, docID, req.TeamID, req.Permission)
|
||||
if err != nil {
|
||||
writeError(w, http.StatusBadRequest, "Team nicht gefunden")
|
||||
writeError(w, http.StatusBadRequest, err.Error())
|
||||
return
|
||||
}
|
||||
var lastShare *domain.DocShare
|
||||
members, _ := s.store.GetTeamMembers(req.TeamID)
|
||||
for _, tm := range members {
|
||||
if tm.UserID == userID {
|
||||
continue
|
||||
}
|
||||
share, err := s.store.CreateDocShare(userID, docID, tm.UserID, req.Permission)
|
||||
if err == nil && share != nil {
|
||||
lastShare = share
|
||||
s.wsHub.BroadcastToUser(share.UserID, "DOC_SHARED", share)
|
||||
s.wsHub.BroadcastDocEvent(docID, "DOC_SHARED", share)
|
||||
}
|
||||
}
|
||||
if lastShare != nil {
|
||||
writeJSON(w, http.StatusCreated, lastShare)
|
||||
} else {
|
||||
writeJSON(w, http.StatusOK, map[string]bool{"success": true})
|
||||
s.wsHub.BroadcastToUser(tm.UserID, "DOC_SHARED", share)
|
||||
}
|
||||
s.wsHub.BroadcastDocEvent(docID, "DOC_SHARED", share)
|
||||
writeJSON(w, http.StatusCreated, share)
|
||||
return
|
||||
}
|
||||
|
||||
@@ -1153,25 +1143,17 @@ func (s *Server) handleAddSpaceMember(w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
|
||||
if req.TeamID != "" {
|
||||
members, err := s.store.GetTeamMembers(req.TeamID)
|
||||
share, err := s.store.CreateSpaceTeamShare(currentUserID, spaceID, req.TeamID, req.Role)
|
||||
if err != nil {
|
||||
writeError(w, http.StatusBadRequest, "Team nicht gefunden")
|
||||
writeError(w, http.StatusBadRequest, err.Error())
|
||||
return
|
||||
}
|
||||
var lastMember *domain.SpaceMember
|
||||
members, _ := s.store.GetTeamMembers(req.TeamID)
|
||||
for _, tm := range members {
|
||||
member, err := s.store.AddSpaceMember(currentUserID, spaceID, tm.UserID, req.Role)
|
||||
if err == nil && member != nil {
|
||||
lastMember = member
|
||||
s.wsHub.BroadcastToUser(member.UserID, "SPACE_JOINED", map[string]interface{}{"spaceId": spaceID})
|
||||
s.wsHub.Broadcast(spaceID, "", "MEMBER_ADDED", member)
|
||||
}
|
||||
}
|
||||
if lastMember != nil {
|
||||
writeJSON(w, http.StatusCreated, lastMember)
|
||||
} else {
|
||||
writeJSON(w, http.StatusOK, map[string]bool{"success": true})
|
||||
s.wsHub.BroadcastToUser(tm.UserID, "SPACE_JOINED", map[string]interface{}{"spaceId": spaceID})
|
||||
}
|
||||
s.wsHub.Broadcast(spaceID, "", "SPACE_SHARED", share)
|
||||
writeJSON(w, http.StatusCreated, share)
|
||||
return
|
||||
}
|
||||
|
||||
@@ -1196,18 +1178,31 @@ func (s *Server) handleAddSpaceMember(w http.ResponseWriter, r *http.Request) {
|
||||
writeJSON(w, http.StatusCreated, member)
|
||||
}
|
||||
|
||||
func (s *Server) handleGetSpaceShares(w http.ResponseWriter, r *http.Request) {
|
||||
spaceID := chi.URLParam(r, "id")
|
||||
shares, err := s.store.GetSpaceShares(spaceID)
|
||||
if err != nil {
|
||||
writeError(w, http.StatusInternalServerError, err.Error())
|
||||
return
|
||||
}
|
||||
writeJSON(w, http.StatusOK, shares)
|
||||
}
|
||||
|
||||
func (s *Server) handleRemoveSpaceMember(w http.ResponseWriter, r *http.Request) {
|
||||
currentUserID := auth.GetUserID(r.Context())
|
||||
spaceID := chi.URLParam(r, "id")
|
||||
targetUserID := chi.URLParam(r, "userId")
|
||||
|
||||
if err := s.store.RemoveSpaceMember(currentUserID, spaceID, targetUserID); err != nil {
|
||||
// If prefixed with sm_, strip it for individual space member removal
|
||||
cleanTargetID := strings.TrimPrefix(targetUserID, "sm_")
|
||||
|
||||
if err := s.store.RemoveSpaceMember(currentUserID, spaceID, cleanTargetID); err != nil {
|
||||
writeError(w, http.StatusBadRequest, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
s.wsHub.BroadcastToUser(targetUserID, "SPACE_LEFT", map[string]interface{}{"spaceId": spaceID})
|
||||
s.wsHub.Broadcast(spaceID, "", "MEMBER_REMOVED", map[string]interface{}{"spaceId": spaceID, "userId": targetUserID})
|
||||
s.wsHub.BroadcastToUser(cleanTargetID, "SPACE_LEFT", map[string]interface{}{"spaceId": spaceID})
|
||||
s.wsHub.Broadcast(spaceID, "", "MEMBER_REMOVED", map[string]interface{}{"spaceId": spaceID, "userId": cleanTargetID})
|
||||
|
||||
writeJSON(w, http.StatusOK, map[string]bool{"success": true})
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user