Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Prepare the Security domain HTTP APIs for Serverless #162087

Merged
Merged
Show file tree
Hide file tree
Changes from 8 commits
Commits
Show all changes
71 commits
Select commit Hold shift + click to select a range
f7ba619
Disables spaces public APIs in serverless
jeramysoucy Jul 17, 2023
5203a0b
Updates tests and snapshots
jeramysoucy Jul 17, 2023
08146f0
Fixes more tests
jeramysoucy Jul 18, 2023
c10abc7
Merge branch 'main' into disable-spaces-public-api-in-serverless
jeramysoucy Jul 19, 2023
dc727cd
Merge branch 'main' into disable-spaces-public-api-in-serverless
jeramysoucy Jul 20, 2023
70f06f7
Uses build flavor to determine correct API access. Adds tests for int…
jeramysoucy Jul 24, 2023
8b0c93d
Fixes unit tests for access-configurable endpoints.
jeramysoucy Jul 24, 2023
7a346b6
Merge branch 'main' into disable-spaces-public-api-in-serverless
jeramysoucy Jul 24, 2023
04f1c92
Reformatting
jeramysoucy Jul 24, 2023
6c53a54
Update to rely on default access in serverless.
jeramysoucy Jul 25, 2023
4f20016
[CI] Auto-commit changed files from 'node scripts/lint_ts_projects --…
kibanamachine Jul 25, 2023
a44549d
Merge branch 'main' into disable-spaces-public-api-in-serverless
jeramysoucy Jul 25, 2023
8f20ee0
Merge branch 'main' into disable-spaces-public-api-in-serverless
jeramysoucy Jul 26, 2023
994654c
Disables security and encrypted saved objects APIs for serverless
jeramysoucy Jul 26, 2023
aa8c78e
Adds authentication API access tests
jeramysoucy Jul 27, 2023
e4f60db
Merge branch 'main' into disable-spaces-public-api-in-serverless
jeramysoucy Jul 27, 2023
131a771
Adds API access tests for security and encrypted SOs
jeramysoucy Jul 27, 2023
e3bb1be
Merge remote-tracking branch 'upstream/main' into disable-spaces-publ…
jeramysoucy Jul 27, 2023
8bb3ca2
Merge branch 'main' into disable-spaces-public-api-in-serverless
jeramysoucy Jul 28, 2023
074c0cc
Removes unnecessary comments
jeramysoucy Aug 1, 2023
2997135
Merge remote-tracking branch 'upstream/main' into disable-spaces-publ…
jeramysoucy Aug 1, 2023
78da626
Merge branch 'main' into disable-spaces-public-api-in-serverless
jeramysoucy Aug 1, 2023
ee8a12c
Merge branch 'main' into disable-spaces-public-api-in-serverless
jeramysoucy Aug 2, 2023
a366b54
Merge branch 'main' into disable-spaces-public-api-in-serverless
jeramysoucy Aug 4, 2023
6cb21ba
Merge branch 'main' into disable-spaces-public-api-in-serverless
jeramysoucy Aug 4, 2023
252cd72
Merge branch 'main' into disable-spaces-public-api-in-serverless
jeramysoucy Aug 7, 2023
d0b2364
Update x-pack/test_serverless/api_integration/services/svl_common_api.ts
jeramysoucy Aug 7, 2023
452ad5a
Adresses initial review feedback
jeramysoucy Aug 7, 2023
d1c3bdf
Additional comments for build flavor conditions
jeramysoucy Aug 7, 2023
a63d67b
Merge branch 'main' into disable-spaces-public-api-in-serverless
jeramysoucy Aug 7, 2023
14c00ae
Update x-pack/plugins/security/server/routes/authentication/common.ts
jeramysoucy Aug 8, 2023
9f0606d
Update x-pack/plugins/security/server/routes/authentication/common.ts
jeramysoucy Aug 8, 2023
ecb595c
Update x-pack/plugins/spaces/server/routes/api/external/index.ts
jeramysoucy Aug 8, 2023
4682542
Additional comment updates
jeramysoucy Aug 8, 2023
182273f
Merge branch 'main' into disable-spaces-public-api-in-serverless
jeramysoucy Aug 8, 2023
e7eec38
Temporarilty resolves failing test issues by registering the login en…
jeramysoucy Aug 8, 2023
0e43706
Adds basic authc http scheme to test config.
jeramysoucy Aug 8, 2023
5e54975
Fixes api key failing tests
jeramysoucy Aug 8, 2023
f69ff2f
Merge branch 'main' into disable-spaces-public-api-in-serverless
jeramysoucy Aug 8, 2023
8018d63
Temporarily allows access to login and role APIs. Skips user profiles…
jeramysoucy Aug 8, 2023
cf5dae0
Reverts temporary enabling of role APIs
jeramysoucy Aug 9, 2023
100ced7
Adds the basic authc provider to the base config temporarily.
jeramysoucy Aug 9, 2023
b94cc86
Removes override of HTTP schemes
jeramysoucy Aug 9, 2023
0e291c6
Merge branch 'main' into disable-spaces-public-api-in-serverless
jeramysoucy Aug 14, 2023
3608f85
Enables user and roles APIs to temporarily unblock cypress and UI tests
jeramysoucy Aug 15, 2023
b81b484
[CI] Auto-commit changed files from 'node scripts/precommit_hook.js -…
kibanamachine Aug 15, 2023
3478460
Updates serverless authc config to be compatible with existing tests.
jeramysoucy Aug 15, 2023
24e21f4
[CI] Auto-commit changed files from 'node scripts/precommit_hook.js -…
kibanamachine Aug 15, 2023
95b2f12
Uses existing user for user profile tests
jeramysoucy Aug 15, 2023
1edb353
Uses test user for user profile tests rather than admin user
jeramysoucy Aug 15, 2023
727b393
Enables login page routes.
jeramysoucy Aug 16, 2023
6ece943
Merge branch 'main' into disable-spaces-public-api-in-serverless
jeramysoucy Aug 16, 2023
761f23b
[CI] Auto-commit changed files from 'node scripts/precommit_hook.js -…
kibanamachine Aug 16, 2023
f0fbfdf
Adds saml tools for saml login.
jeramysoucy Aug 16, 2023
65c23e4
Added ftr context for shared
jeramysoucy Aug 16, 2023
3c24c33
Update import order
jeramysoucy Aug 16, 2023
0d22303
[CI] Auto-commit changed files from 'node scripts/eslint --no-cache -…
kibanamachine Aug 16, 2023
5c535d6
[CI] Auto-commit changed files from 'node scripts/lint_ts_projects --…
kibanamachine Aug 16, 2023
a979e58
Moves saml tools to api integration
jeramysoucy Aug 16, 2023
051cf71
Removes reference to getSAMLResponse
jeramysoucy Aug 16, 2023
4ca4924
[CI] Auto-commit changed files from 'node scripts/precommit_hook.js -…
kibanamachine Aug 16, 2023
305aa70
[CI] Auto-commit changed files from 'node scripts/lint_ts_projects --…
kibanamachine Aug 16, 2023
ba78385
Moves saml tools back into shared.
jeramysoucy Aug 17, 2023
d2ee490
[CI] Auto-commit changed files from 'node scripts/precommit_hook.js -…
kibanamachine Aug 17, 2023
c552a53
[CI] Auto-commit changed files from 'node scripts/lint_ts_projects --…
kibanamachine Aug 17, 2023
084e495
Merge branch 'main' into pr-162087-apis
azasypkin Aug 21, 2023
d0292f8
Merge branch 'main' into pr-162087-apis
azasypkin Aug 22, 2023
e8b0bef
Merge branch 'main' into pr-162087-apis
azasypkin Aug 22, 2023
5e953fa
Review#1: fix typos, disable Spaces Update API, make cookie an intern…
azasypkin Aug 22, 2023
573a552
Review#1: move Saml Tools service to API integrations services as it …
azasypkin Aug 22, 2023
710ca09
Merge branch 'main' into disable-spaces-public-api-in-serverless
azasypkin Aug 22, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions config/serverless.yml
Original file line number Diff line number Diff line change
Expand Up @@ -79,3 +79,6 @@ console.autocompleteDefinitions.endpointsAvailability: serverless

# Allow authentication via the Elasticsearch JWT realm with the `shared_secret` client authentication type.
elasticsearch.requestHeadersWhitelist: ["authorization", "es-client-authentication"]

# FOR LOCAL TESTING - AWAITING MERGE OF https://github.com/elastic/kibana/pull/162149
server.restrictInternalApis: true
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This will be present once #162149 is merged to main.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Aaaand, it has been merged!

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The revert was closed and not merged.

14 changes: 12 additions & 2 deletions x-pack/plugins/spaces/server/config.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,12 @@ describe('config schema', () => {

it('should not throw error if allowFeatureVisibility is disabled in serverless offering', () => {
expect(() =>
ConfigSchema.validate({ allowFeatureVisibility: false }, { serverless: true })
ConfigSchema.validate(
{
allowFeatureVisibility: false,
},
{ serverless: true }
)
).not.toThrow();
});

Expand All @@ -73,7 +78,12 @@ describe('config schema', () => {

it('should throw error if allowFeatureVisibility is enabled in serverless offering', () => {
expect(() =>
ConfigSchema.validate({ allowFeatureVisibility: true }, { serverless: true })
ConfigSchema.validate(
{
allowFeatureVisibility: true,
},
{ serverless: true }
)
).toThrow();
});
});
26 changes: 18 additions & 8 deletions x-pack/plugins/spaces/server/plugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ import type { ConfigType } from './config';
import { DefaultSpaceService } from './default_space';
import { initSpacesRequestInterceptors } from './lib/request_interceptors';
import { createSpacesTutorialContextFactory } from './lib/spaces_tutorial_context_factory';
import { initExternalSpacesApi } from './routes/api/external';
import { initConfigurableSpacesApi, initPublicSpacesApi } from './routes/api/external';
import { initInternalSpacesApi } from './routes/api/internal';
import { initSpacesViewsRoutes } from './routes/views';
import { SpacesSavedObjectsService } from './saved_objects';
Expand Down Expand Up @@ -103,7 +103,7 @@ export class SpacesPlugin

private defaultSpaceService?: DefaultSpaceService;

constructor(initializerContext: PluginInitializerContext) {
constructor(private readonly initializerContext: PluginInitializerContext) {
this.config$ = initializerContext.config.create<ConfigType>();
this.log = initializerContext.logger.get();
this.spacesService = new SpacesService();
Expand Down Expand Up @@ -148,18 +148,28 @@ export class SpacesPlugin
logger: this.log,
});

const externalRouter = core.http.createRouter<SpacesRequestHandlerContext>();
jeramysoucy marked this conversation as resolved.
Show resolved Hide resolved
initExternalSpacesApi({
externalRouter,
const buildFlavor = this.initializerContext.env.packageInfo.buildFlavor;
const router = core.http.createRouter<SpacesRequestHandlerContext>();
if (buildFlavor !== 'serverless') {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I opted to make decisions as high-level as possible so we don't have to dig into each route to understand the impact of the build flavor.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

++, over time, if we still use buildFlavor, we might even re-organize our routes to make it easier to toggle them (e.g. common + {non-serverless-name-tbd}-routes)

initPublicSpacesApi({
router,
log: this.log,
getStartServices: core.getStartServices,
getSpacesService,
usageStatsServicePromise,
});
}
const configuredAccess = buildFlavor === 'serverless' ? 'internal' : 'public';
initConfigurableSpacesApi({
jeramysoucy marked this conversation as resolved.
Show resolved Hide resolved
router,
log: this.log,
getStartServices: core.getStartServices,
getSpacesService,
usageStatsServicePromise,
access: configuredAccess,
});

const internalRouter = core.http.createRouter<SpacesRequestHandlerContext>();
initInternalSpacesApi({
internalRouter,
router,
getSpacesService,
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ describe('copy to space', () => {
});

initCopyToSpacesApi({
externalRouter: router,
router,
getStartServices: async () => [coreStart, {}, {}],
log,
getSpacesService: () => spacesServiceStart,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,10 @@ const areObjectsUnique = (objects: SavedObjectIdentifier[]) =>
_.uniqBy(objects, (o: SavedObjectIdentifier) => `${o.type}:${o.id}`).length === objects.length;

export function initCopyToSpacesApi(deps: ExternalRouteDeps) {
const { externalRouter, getSpacesService, usageStatsServicePromise, getStartServices } = deps;
const { router, getSpacesService, usageStatsServicePromise, getStartServices } = deps;
const usageStatsClientPromise = usageStatsServicePromise.then(({ getClient }) => getClient());

externalRouter.post(
router.post(
{
path: '/api/spaces/_copy_saved_objects',
options: {
Expand Down Expand Up @@ -137,7 +137,7 @@ export function initCopyToSpacesApi(deps: ExternalRouteDeps) {
})
);

externalRouter.post(
router.post(
{
path: '/api/spaces/_resolve_copy_saved_objects_errors',
options: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ describe('Spaces Public API', () => {
});

initDeleteSpacesApi({
externalRouter: router,
router,
getStartServices: async () => [coreStart, {}, {}],
log,
getSpacesService: () => spacesServiceStart,
Expand Down
4 changes: 2 additions & 2 deletions x-pack/plugins/spaces/server/routes/api/external/delete.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@ import { wrapError } from '../../../lib/errors';
import { createLicensedRouteHandler } from '../../lib';

export function initDeleteSpacesApi(deps: ExternalRouteDeps) {
const { externalRouter, log, getSpacesService } = deps;
const { router, log, getSpacesService } = deps;

externalRouter.delete(
router.delete(
{
path: '/api/spaces/space/{id}',
validate: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ describe('_disable_legacy_url_aliases', () => {
});

initDisableLegacyUrlAliasesApi({
externalRouter: router,
router,
getStartServices: async () => [coreStart, {}, {}],
log,
getSpacesService: () => spacesServiceStart,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,10 @@ import { wrapError } from '../../../lib/errors';
import { createLicensedRouteHandler } from '../../lib';

export function initDisableLegacyUrlAliasesApi(deps: ExternalRouteDeps) {
const { externalRouter, getSpacesService, usageStatsServicePromise } = deps;
const { router, getSpacesService, usageStatsServicePromise } = deps;
const usageStatsClientPromise = usageStatsServicePromise.then(({ getClient }) => getClient());

externalRouter.post(
router.post(
{
path: '/api/spaces/_disable_legacy_url_aliases',
validate: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,11 +61,12 @@ describe('GET space', () => {
});

initGetSpaceApi({
externalRouter: router,
router,
getStartServices: async () => [coreStart, {}, {}],
log,
getSpacesService: () => spacesServiceStart,
usageStatsServicePromise,
access: 'public',
});

return {
Expand Down
9 changes: 5 additions & 4 deletions x-pack/plugins/spaces/server/routes/api/external/get.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,21 +8,22 @@
import { schema } from '@kbn/config-schema';
import { SavedObjectsErrorHelpers } from '@kbn/core/server';

import type { ExternalRouteDeps } from '.';
import type { ConfigurableRouteDeps } from '.';
import { wrapError } from '../../../lib/errors';
import { createLicensedRouteHandler } from '../../lib';

export function initGetSpaceApi(deps: ExternalRouteDeps) {
const { externalRouter, getSpacesService } = deps;
export function initGetSpaceApi(deps: ConfigurableRouteDeps) {
const { router, getSpacesService, access } = deps;

externalRouter.get(
router.get(
{
path: '/api/spaces/space/{id}',
validate: {
params: schema.object({
id: schema.string(),
}),
},
options: { access },
},
createLicensedRouteHandler(async (context, request, response) => {
const spaceId = request.params.id;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,11 +62,12 @@ describe('GET /spaces/space', () => {
});

initGetAllSpacesApi({
externalRouter: router,
router,
getStartServices: async () => [coreStart, {}, {}],
log,
getSpacesService: () => spacesServiceStart,
usageStatsServicePromise,
access: 'public',
});

return {
Expand Down
9 changes: 5 additions & 4 deletions x-pack/plugins/spaces/server/routes/api/external/get_all.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,15 @@

import { schema } from '@kbn/config-schema';

import type { ExternalRouteDeps } from '.';
import type { ConfigurableRouteDeps } from '.';
import type { Space } from '../../../../common';
import { wrapError } from '../../../lib/errors';
import { createLicensedRouteHandler } from '../../lib';

export function initGetAllSpacesApi(deps: ExternalRouteDeps) {
const { externalRouter, log, getSpacesService } = deps;
export function initGetAllSpacesApi(deps: ConfigurableRouteDeps) {
const { router, log, getSpacesService, access } = deps;

externalRouter.get(
router.get(
{
path: '/api/spaces/space',
validate: {
Expand All @@ -35,6 +35,7 @@ export function initGetAllSpacesApi(deps: ExternalRouteDeps) {
),
}),
},
options: { access },
},
createLicensedRouteHandler(async (context, request, response) => {
log.debug(`Inside GET /api/spaces/space`);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ describe('get shareable references', () => {
spacesClientService: clientServiceStart,
});
initGetShareableReferencesApi({
externalRouter: router,
router,
getStartServices: async () => [coreStart, {}, {}],
log,
getSpacesService: () => spacesServiceStart,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ import { wrapError } from '../../../lib/errors';
import { createLicensedRouteHandler } from '../../lib';

export function initGetShareableReferencesApi(deps: ExternalRouteDeps) {
const { externalRouter, getStartServices } = deps;
const { router, getStartServices } = deps;

externalRouter.post(
router.post(
{
path: '/api/spaces/_get_shareable_references',
validate: {
Expand Down
17 changes: 12 additions & 5 deletions x-pack/plugins/spaces/server/routes/api/external/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,21 +21,28 @@ import { initPutSpacesApi } from './put';
import { initUpdateObjectsSpacesApi } from './update_objects_spaces';

export interface ExternalRouteDeps {
externalRouter: SpacesRouter;
router: SpacesRouter;
getStartServices: CoreSetup['getStartServices'];
getSpacesService: () => SpacesServiceStart;
usageStatsServicePromise: Promise<UsageStatsServiceSetup>;
log: Logger;
}

export function initExternalSpacesApi(deps: ExternalRouteDeps) {
export interface ConfigurableRouteDeps extends ExternalRouteDeps {
access: 'internal' | 'public';
}

export function initPublicSpacesApi(deps: ExternalRouteDeps) {
initDeleteSpacesApi(deps);
initGetSpaceApi(deps);
initGetAllSpacesApi(deps);
initPostSpacesApi(deps);
initPutSpacesApi(deps);
initCopyToSpacesApi(deps);
initUpdateObjectsSpacesApi(deps);
initGetShareableReferencesApi(deps);
initDisableLegacyUrlAliasesApi(deps);
}

export function initConfigurableSpacesApi(deps: ConfigurableRouteDeps) {
initGetSpaceApi(deps);
initGetAllSpacesApi(deps);
initPutSpacesApi(deps);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

note: iirc, we don't need initPutSpacesApi in Serverless for now as well.

}
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ describe('Spaces Public API', () => {
});

initPostSpacesApi({
externalRouter: router,
router,
getStartServices: async () => [coreStart, {}, {}],
log,
getSpacesService: () => spacesServiceStart,
Expand Down
5 changes: 3 additions & 2 deletions x-pack/plugins/spaces/server/routes/api/external/post.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,15 @@ import { spaceSchema } from '../../../lib/space_schema';
import { createLicensedRouteHandler } from '../../lib';

export function initPostSpacesApi(deps: ExternalRouteDeps) {
const { externalRouter, log, getSpacesService } = deps;
const { router, log, getSpacesService } = deps;

externalRouter.post(
router.post(
{
path: '/api/spaces/space',
validate: {
body: spaceSchema,
},
options: { access: 'public' },
},
createLicensedRouteHandler(async (context, request, response) => {
log.debug(`Inside POST /api/spaces/space`);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,11 +62,12 @@ describe('PUT /api/spaces/space', () => {
});

initPutSpacesApi({
externalRouter: router,
router,
getStartServices: async () => [coreStart, {}, {}],
log,
getSpacesService: () => spacesServiceStart,
usageStatsServicePromise,
access: 'public',
});

const [routeDefinition, routeHandler] = router.put.mock.calls[0];
Expand Down
9 changes: 5 additions & 4 deletions x-pack/plugins/spaces/server/routes/api/external/put.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,16 @@
import { schema } from '@kbn/config-schema';
import { SavedObjectsErrorHelpers } from '@kbn/core/server';

import type { ExternalRouteDeps } from '.';
import type { ConfigurableRouteDeps } from '.';
import type { Space } from '../../../../common';
import { wrapError } from '../../../lib/errors';
import { spaceSchema } from '../../../lib/space_schema';
import { createLicensedRouteHandler } from '../../lib';

export function initPutSpacesApi(deps: ExternalRouteDeps) {
const { externalRouter, getSpacesService } = deps;
export function initPutSpacesApi(deps: ConfigurableRouteDeps) {
const { router, getSpacesService, access } = deps;

externalRouter.put(
router.put(
{
path: '/api/spaces/space/{id}',
validate: {
Expand All @@ -26,6 +26,7 @@ export function initPutSpacesApi(deps: ExternalRouteDeps) {
}),
body: spaceSchema,
},
options: { access },
},
createLicensedRouteHandler(async (context, request, response) => {
const spacesClient = getSpacesService().createSpacesClient(request);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ describe('update_objects_spaces', () => {
spacesClientService: clientServiceStart,
});
initUpdateObjectsSpacesApi({
externalRouter: router,
router,
getStartServices: async () => [coreStart, {}, {}],
log,
getSpacesService: () => spacesServiceStart,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import { SPACE_ID_REGEX } from '../../../lib/space_schema';
import { createLicensedRouteHandler } from '../../lib';

export function initUpdateObjectsSpacesApi(deps: ExternalRouteDeps) {
const { externalRouter, getStartServices } = deps;
const { router, getStartServices } = deps;

const spacesSchema = schema.arrayOf(
schema.string({
Expand All @@ -33,7 +33,7 @@ export function initUpdateObjectsSpacesApi(deps: ExternalRouteDeps) {
}
);

externalRouter.post(
router.post(
{
path: '/api/spaces/_update_objects_spaces',
validate: {
Expand Down
Loading