Exemplo n.º 1
0
        private IndexForAdminOutputModel CraeteIndexOutputModel(User user)
        {
            var userModel = new IndexForAdminOutputModel(user);

            //ユーザのテナント情報(ロール含む)を取得
            var info = userRepository.GetUserInfo(user);
            userModel.Tenants = info.TenantDic.Select(x => new TenantInfo(x.Key, x.Value, user.DefaultTenantId)).ToList();

            //このユーザのシステムロールを取得
            userModel.SystemRoles = roleRepository.GetSystemRoles(user.Id).Select(r => new RoleInfo(r));

            return userModel;
        }
Exemplo n.º 2
0
        public async Task <IActionResult> EditUser(long?id, [FromBody] EditInputModel model, [FromServices] ITenantRepository tenantRepository)
        {
            //データの入力チェック
            if (!ModelState.IsValid || !id.HasValue)
            {
                return(JsonBadRequest("Invalid inputs."));
            }
            //データの存在チェック
            var user = await userRepository.GetByIdAsync(id.Value);

            if (user == null)
            {
                return(JsonNotFound($"User ID {id} is not found."));
            }
            //デフォルトがあるかチェック(必然的にテナントが一つ以上あるかのチェックにもなる)
            var defaultTenant = model.Tenants.FirstOrDefault(x => x.Default);

            if (defaultTenant == null)
            {
                return(JsonNotFound($"Invalid default tenant exists."));
            }

            //とりあえずすべてのシステムロールを一度外す
            roleRepository.DetachSystemRole(user.Id);
            var addSystemRoleErrorResult = await AddSystemRolesAsync(user, model.SystemRoles, false);

            if (addSystemRoleErrorResult != null)
            {
                return(addSystemRoleErrorResult);
            }

            //現在登録されているテナントを抽出
            var info           = userRepository.GetUserInfo(user);
            var currentTenants = info.TenantDic.Keys.ToList();

            // テナントの登録
            foreach (var tenantInput in model.Tenants)
            {
                // テナントの存在確認
                Tenant tenant = tenantRepository.Get(tenantInput.Id.Value);
                if (tenant == null)
                {
                    //指定したテナントが存在しなかったら失敗
                    return(JsonNotFound($"Tenant ID {tenantInput.Id} is not found."));
                }

                // このテナントが既に紐づけられているか確認
                Tenant currentTenant = currentTenants.FirstOrDefault(t => t.Id == tenantInput.Id);
                if (currentTenant != null)
                {
                    //ロールが変更されている可能性があるので、更新処理を行う
                    //一度テナントから外す(Registryとの紐づけは消さずに残す)
                    userRepository.DetachTenant(id.Value, tenantInput.Id.Value, true);
                    //候補から外す
                    currentTenants.Remove(currentTenant);
                }

                var addTenantErrorResult = await AddTenantAsync(user, tenant, tenantInput.Roles, false);

                if (addTenantErrorResult != null)
                {
                    //ロールバックされるので、不整合は起こらない
                    return(addTenantErrorResult);
                }
            }
            //残っているのは削除対象
            foreach (var removedTenant in currentTenants)
            {
                //自分自身を接続中のテナントから外そうとしていたらエラー(処理が継続できない)
                if (CurrentUserInfo.Id == user.Id && CurrentUserInfo.SelectedTenant.Id == removedTenant.Id)
                {
                    return(JsonConflict($"You are NOT allowed removing yourself from the currently connected tenant."));
                }

                userRepository.DetachTenant(id.Value, removedTenant.Id, false);
            }

            // デフォルトテナントの変更
            user.DefaultTenantId = defaultTenant.Id.Value;

            unitOfWork.Commit();

            var userModel = new IndexForAdminOutputModel(user);

            userModel.SystemRoles = roleRepository.GetSystemRoles(user.Id).Select(r => new RoleInfo(r));
            return(JsonOK(userModel));
        }