1
0
Fork 0
mirror of https://github.com/anyproto/anytype-heart.git synced 2025-06-07 21:37:04 +09:00
anytype-heart/space/join.go
2025-05-13 15:36:40 +02:00

98 lines
2.2 KiB
Go

package space
import (
"context"
"github.com/anyproto/anytype-heart/space/internal/spaceprocess/mode"
"github.com/anyproto/anytype-heart/space/spaceinfo"
)
func (s *service) Join(ctx context.Context, id, aclHeadId string) error {
s.mu.Lock()
waiter, exists := s.waiting[id]
if exists {
s.mu.Unlock()
<-waiter.wait
if waiter.err != nil {
return waiter.err
}
s.mu.Lock()
ctrl := s.spaceControllers[id]
s.mu.Unlock()
if ctrl.Mode() != mode.ModeJoining {
info := spaceinfo.NewSpacePersistentInfo(id)
info.SetAclHeadId(aclHeadId).SetAccountStatus(spaceinfo.AccountStatusJoining)
return ctrl.SetPersistentInfo(ctx, info)
}
return nil
}
wait := make(chan struct{})
s.waiting[id] = controllerWaiter{
wait: wait,
}
s.mu.Unlock()
ctrl, err := s.factory.CreateInvitingSpace(ctx, id, aclHeadId)
if err != nil {
s.mu.Lock()
close(wait)
s.waiting[id] = controllerWaiter{
wait: wait,
err: err,
}
s.mu.Unlock()
return err
}
s.mu.Lock()
close(wait)
s.spaceControllers[ctrl.SpaceId()] = ctrl
s.mu.Unlock()
return nil
}
func (s *service) InviteJoin(ctx context.Context, id, aclHeadId string) error {
s.mu.Lock()
waiter, exists := s.waiting[id]
if exists {
s.mu.Unlock()
<-waiter.wait
if waiter.err != nil {
return waiter.err
}
s.mu.Lock()
ctrl := s.spaceControllers[id]
s.mu.Unlock()
if ctrl.Mode() != mode.ModeLoading {
info := spaceinfo.NewSpacePersistentInfo(id)
info.SetAclHeadId(aclHeadId).SetAccountStatus(spaceinfo.AccountStatusActive)
return ctrl.SetPersistentInfo(ctx, info)
}
return nil
}
wait := make(chan struct{})
s.waiting[id] = controllerWaiter{
wait: wait,
}
s.mu.Unlock()
ctrl, err := s.factory.CreateActiveSpace(ctx, id, aclHeadId)
if err != nil {
s.mu.Lock()
close(wait)
s.waiting[id] = controllerWaiter{
wait: wait,
err: err,
}
s.mu.Unlock()
return err
}
s.mu.Lock()
close(wait)
s.spaceControllers[ctrl.SpaceId()] = ctrl
s.mu.Unlock()
return nil
}
func (s *service) CancelLeave(ctx context.Context, id string) error {
info := spaceinfo.NewSpacePersistentInfo(id)
info.SetAccountStatus(spaceinfo.AccountStatusActive)
return s.techSpace.SetPersistentInfo(ctx, info)
}