fix: reprovision IM member identities across tenants
Deploy olons-server production / deploy (push) Successful in 2m40s

This commit is contained in:
richjohnrambo
2026-10-20 20:55:10 +08:00
parent cdebd0a404
commit 92b5656f3f
2 changed files with 41 additions and 6 deletions
+12 -2
View File
@@ -175,7 +175,13 @@ func (s *Service) OpenSession(ctx context.Context, tenantID, memberID, serviceID
func (s *Service) ensureIdentity(ctx context.Context, tenantID, memberID int64, imTenantCode string) (*store.MemberIMIdentity, error) {
identity, err := s.repository.MemberIMIdentity(ctx, tenantID, memberID)
if err == nil {
if !strings.EqualFold(identity.IMTenantCode, imTenantCode) || identity.IMUserID == "" || identity.IMUsername == "" {
if !strings.EqualFold(identity.IMTenantCode, imTenantCode) {
// A tenant switch creates a distinct IM user. Keep the old tenant's IM
// account intact, but replace this member's local mapping with a newly
// provisioned account in the active tenant.
return s.createIdentity(ctx, tenantID, memberID, imTenantCode)
}
if identity.IMUserID == "" || identity.IMUsername == "" {
return nil, ErrIMUnavailable
}
if identity.IMPasswordCipher != "" {
@@ -186,6 +192,10 @@ func (s *Service) ensureIdentity(ctx context.Context, tenantID, memberID int64,
if !errors.Is(err, store.ErrResourceNotFound) {
return nil, err
}
return s.createIdentity(ctx, tenantID, memberID, imTenantCode)
}
func (s *Service) createIdentity(ctx context.Context, tenantID, memberID int64, imTenantCode string) (*store.MemberIMIdentity, error) {
member, err := s.repository.MemberIMProfile(ctx, tenantID, memberID)
if err != nil {
return nil, err
@@ -220,7 +230,7 @@ func (s *Service) ensureIdentity(ctx context.Context, tenantID, memberID int64,
if err != nil {
return nil, err
}
identity = &store.MemberIMIdentity{TenantID: tenantID, MemberID: memberID, IMTenantCode: imTenantCode,
identity := &store.MemberIMIdentity{TenantID: tenantID, MemberID: memberID, IMTenantCode: imTenantCode,
IMUserID: issued.UserID, IMUsername: created.Username, IMPasswordCipher: ciphertext}
return s.repository.SaveMemberIMIdentity(ctx, identity)
}