diff --git a/packages/backend/src/controllers/api/v1/admin/saml-auth-providers/get-saml-auth-provider.ee.js b/packages/backend/src/controllers/api/v1/admin/saml-auth-providers/get-saml-auth-provider.ee.js index 611b59ef..1fdf633b 100644 --- a/packages/backend/src/controllers/api/v1/admin/saml-auth-providers/get-saml-auth-provider.ee.js +++ b/packages/backend/src/controllers/api/v1/admin/saml-auth-providers/get-saml-auth-provider.ee.js @@ -6,5 +6,7 @@ export default async (request, response) => { .findById(request.params.samlAuthProviderId) .throwIfNotFound(); - renderObject(response, samlAuthProvider); + renderObject(response, samlAuthProvider, { + serializer: 'AdminSamlAuthProvider', + }); }; diff --git a/packages/backend/src/controllers/api/v1/admin/saml-auth-providers/get-saml-auth-providers.ee.js b/packages/backend/src/controllers/api/v1/admin/saml-auth-providers/get-saml-auth-providers.ee.js index 2d39cc55..88b3d633 100644 --- a/packages/backend/src/controllers/api/v1/admin/saml-auth-providers/get-saml-auth-providers.ee.js +++ b/packages/backend/src/controllers/api/v1/admin/saml-auth-providers/get-saml-auth-providers.ee.js @@ -7,5 +7,7 @@ export default async (request, response) => { 'desc' ); - renderObject(response, samlAuthProviders); + renderObject(response, samlAuthProviders, { + serializer: 'AdminSamlAuthProvider', + }); }; diff --git a/packages/backend/src/controllers/api/v1/saml-auth-providers/get-saml-auth-providers.ee.js b/packages/backend/src/controllers/api/v1/saml-auth-providers/get-saml-auth-providers.ee.js new file mode 100644 index 00000000..3b066438 --- /dev/null +++ b/packages/backend/src/controllers/api/v1/saml-auth-providers/get-saml-auth-providers.ee.js @@ -0,0 +1,12 @@ +import { renderObject } from '../../../../helpers/renderer.js'; +import SamlAuthProvider from '../../../../models/saml-auth-provider.ee.js'; + +export default async (request, response) => { + const samlAuthProviders = await SamlAuthProvider.query() + .where({ + active: true, + }) + .orderBy('created_at', 'desc'); + + renderObject(response, samlAuthProviders); +}; diff --git a/packages/backend/src/controllers/api/v1/saml-auth-providers/get-saml-auth-providers.ee.test.js b/packages/backend/src/controllers/api/v1/saml-auth-providers/get-saml-auth-providers.ee.test.js new file mode 100644 index 00000000..f2f21b7d --- /dev/null +++ b/packages/backend/src/controllers/api/v1/saml-auth-providers/get-saml-auth-providers.ee.test.js @@ -0,0 +1,30 @@ +import { vi, describe, it, expect, beforeEach } from 'vitest'; +import request from 'supertest'; +import app from '../../../../app.js'; +import { createSamlAuthProvider } from '../../../../../test/factories/saml-auth-provider.ee.js'; +import getSamlAuthProvidersMock from '../../../../../test/mocks/rest/api/v1/saml-auth-providers/get-saml-auth-providers.js'; +import * as license from '../../../../helpers/license.ee.js'; + +describe('GET /api/v1/saml-auth-providers', () => { + let samlAuthProviderOne, samlAuthProviderTwo; + + beforeEach(async () => { + samlAuthProviderOne = await createSamlAuthProvider(); + samlAuthProviderTwo = await createSamlAuthProvider(); + }); + + it('should return saml auth providers', async () => { + vi.spyOn(license, 'hasValidLicense').mockResolvedValue(true); + + const response = await request(app) + .get('/api/v1/saml-auth-providers') + .expect(200); + + const expectedPayload = await getSamlAuthProvidersMock([ + samlAuthProviderTwo, + samlAuthProviderOne, + ]); + + expect(response.body).toEqual(expectedPayload); + }); +}); diff --git a/packages/backend/src/routes/api/v1/saml-auth-providers.ee.js b/packages/backend/src/routes/api/v1/saml-auth-providers.ee.js new file mode 100644 index 00000000..3b067481 --- /dev/null +++ b/packages/backend/src/routes/api/v1/saml-auth-providers.ee.js @@ -0,0 +1,10 @@ +import { Router } from 'express'; +import asyncHandler from 'express-async-handler'; +import { checkIsEnterprise } from '../../../helpers/check-is-enterprise.js'; +import getSamlAuthProvidersAction from '../../../controllers/api/v1/saml-auth-providers/get-saml-auth-providers.ee.js'; + +const router = Router(); + +router.get('/', checkIsEnterprise, asyncHandler(getSamlAuthProvidersAction)); + +export default router; diff --git a/packages/backend/src/routes/index.js b/packages/backend/src/routes/index.js index a542f7fc..ffe22cab 100644 --- a/packages/backend/src/routes/index.js +++ b/packages/backend/src/routes/index.js @@ -13,7 +13,8 @@ import stepsRouter from './api/v1/steps.js'; import appsRouter from './api/v1/apps.js'; import connectionsRouter from './api/v1/connections.js'; import executionsRouter from './api/v1/executions.js'; -import samlAuthProvidersRouter from './api/v1/admin/saml-auth-providers.ee.js'; +import samlAuthProvidersRouter from './api/v1/saml-auth-providers.ee.js'; +import adminSamlAuthProvidersRouter from './api/v1/admin/saml-auth-providers.ee.js'; import rolesRouter from './api/v1/admin/roles.ee.js'; import permissionsRouter from './api/v1/admin/permissions.ee.js'; import adminUsersRouter from './api/v1/admin/users.ee.js'; @@ -35,7 +36,8 @@ router.use('/api/v1/steps', stepsRouter); router.use('/api/v1/apps', appsRouter); router.use('/api/v1/connections', connectionsRouter); router.use('/api/v1/executions', executionsRouter); -router.use('/api/v1/admin/saml-auth-providers', samlAuthProvidersRouter); +router.use('/api/v1/saml-auth-providers', samlAuthProvidersRouter); +router.use('/api/v1/admin/saml-auth-providers', adminSamlAuthProvidersRouter); router.use('/api/v1/admin/roles', rolesRouter); router.use('/api/v1/admin/permissions', permissionsRouter); router.use('/api/v1/admin/users', adminUsersRouter); diff --git a/packages/backend/src/serializers/admin-saml-auth-provider.ee.js b/packages/backend/src/serializers/admin-saml-auth-provider.ee.js new file mode 100644 index 00000000..37d442a5 --- /dev/null +++ b/packages/backend/src/serializers/admin-saml-auth-provider.ee.js @@ -0,0 +1,18 @@ +const adminSamlAuthProviderSerializer = (samlAuthProvider) => { + return { + id: samlAuthProvider.id, + name: samlAuthProvider.name, + certificate: samlAuthProvider.certificate, + signatureAlgorithm: samlAuthProvider.signatureAlgorithm, + issuer: samlAuthProvider.issuer, + entryPoint: samlAuthProvider.entryPoint, + firstnameAttributeName: samlAuthProvider.firstnameAttributeName, + surnameAttributeName: samlAuthProvider.surnameAttributeName, + emailAttributeName: samlAuthProvider.emailAttributeName, + roleAttributeName: samlAuthProvider.roleAttributeName, + active: samlAuthProvider.active, + defaultRoleId: samlAuthProvider.defaultRoleId, + }; +}; + +export default adminSamlAuthProviderSerializer; diff --git a/packages/backend/src/serializers/admin-saml-auth-provider.ee.test.js b/packages/backend/src/serializers/admin-saml-auth-provider.ee.test.js new file mode 100644 index 00000000..0ad55c81 --- /dev/null +++ b/packages/backend/src/serializers/admin-saml-auth-provider.ee.test.js @@ -0,0 +1,32 @@ +import { describe, it, expect, beforeEach } from 'vitest'; +import { createSamlAuthProvider } from '../../test/factories/saml-auth-provider.ee.js'; +import adminSamlAuthProviderSerializer from './admin-saml-auth-provider.ee.js'; + +describe('adminSamlAuthProviderSerializer', () => { + let samlAuthProvider; + + beforeEach(async () => { + samlAuthProvider = await createSamlAuthProvider(); + }); + + it('should return saml auth provider data', async () => { + const expectedPayload = { + id: samlAuthProvider.id, + name: samlAuthProvider.name, + certificate: samlAuthProvider.certificate, + signatureAlgorithm: samlAuthProvider.signatureAlgorithm, + issuer: samlAuthProvider.issuer, + entryPoint: samlAuthProvider.entryPoint, + firstnameAttributeName: samlAuthProvider.firstnameAttributeName, + surnameAttributeName: samlAuthProvider.surnameAttributeName, + emailAttributeName: samlAuthProvider.emailAttributeName, + roleAttributeName: samlAuthProvider.roleAttributeName, + active: samlAuthProvider.active, + defaultRoleId: samlAuthProvider.defaultRoleId, + }; + + expect(adminSamlAuthProviderSerializer(samlAuthProvider)).toEqual( + expectedPayload + ); + }); +}); diff --git a/packages/backend/src/serializers/index.js b/packages/backend/src/serializers/index.js index e02e203f..7d6445ab 100644 --- a/packages/backend/src/serializers/index.js +++ b/packages/backend/src/serializers/index.js @@ -1,6 +1,7 @@ import userSerializer from './user.js'; import roleSerializer from './role.js'; import permissionSerializer from './permission.js'; +import adminSamlAuthProviderSerializer from './admin-saml-auth-provider.ee.js'; import samlAuthProviderSerializer from './saml-auth-provider.ee.js'; import appAuthClientSerializer from './app-auth-client.js'; import appConfigSerializer from './app-config.js'; @@ -19,6 +20,7 @@ const serializers = { User: userSerializer, Role: roleSerializer, Permission: permissionSerializer, + AdminSamlAuthProvider: adminSamlAuthProviderSerializer, SamlAuthProvider: samlAuthProviderSerializer, AppAuthClient: appAuthClientSerializer, AppConfig: appConfigSerializer, diff --git a/packages/backend/src/serializers/saml-auth-provider.ee.js b/packages/backend/src/serializers/saml-auth-provider.ee.js index 43422704..4c0bfde3 100644 --- a/packages/backend/src/serializers/saml-auth-provider.ee.js +++ b/packages/backend/src/serializers/saml-auth-provider.ee.js @@ -2,16 +2,8 @@ const samlAuthProviderSerializer = (samlAuthProvider) => { return { id: samlAuthProvider.id, name: samlAuthProvider.name, - certificate: samlAuthProvider.certificate, - signatureAlgorithm: samlAuthProvider.signatureAlgorithm, + loginUrl: samlAuthProvider.loginUrl, issuer: samlAuthProvider.issuer, - entryPoint: samlAuthProvider.entryPoint, - firstnameAttributeName: samlAuthProvider.firstnameAttributeName, - surnameAttributeName: samlAuthProvider.surnameAttributeName, - emailAttributeName: samlAuthProvider.emailAttributeName, - roleAttributeName: samlAuthProvider.roleAttributeName, - active: samlAuthProvider.active, - defaultRoleId: samlAuthProvider.defaultRoleId, }; }; diff --git a/packages/backend/src/serializers/saml-auth-provider.ee.test.js b/packages/backend/src/serializers/saml-auth-provider.ee.test.js index 86250b72..9a05c3db 100644 --- a/packages/backend/src/serializers/saml-auth-provider.ee.test.js +++ b/packages/backend/src/serializers/saml-auth-provider.ee.test.js @@ -13,16 +13,8 @@ describe('samlAuthProviderSerializer', () => { const expectedPayload = { id: samlAuthProvider.id, name: samlAuthProvider.name, - certificate: samlAuthProvider.certificate, - signatureAlgorithm: samlAuthProvider.signatureAlgorithm, + loginUrl: samlAuthProvider.loginUrl, issuer: samlAuthProvider.issuer, - entryPoint: samlAuthProvider.entryPoint, - firstnameAttributeName: samlAuthProvider.firstnameAttributeName, - surnameAttributeName: samlAuthProvider.surnameAttributeName, - emailAttributeName: samlAuthProvider.emailAttributeName, - roleAttributeName: samlAuthProvider.roleAttributeName, - active: samlAuthProvider.active, - defaultRoleId: samlAuthProvider.defaultRoleId, }; expect(samlAuthProviderSerializer(samlAuthProvider)).toEqual( diff --git a/packages/backend/test/mocks/rest/api/v1/saml-auth-providers/get-saml-auth-providers.js b/packages/backend/test/mocks/rest/api/v1/saml-auth-providers/get-saml-auth-providers.js new file mode 100644 index 00000000..3226e12e --- /dev/null +++ b/packages/backend/test/mocks/rest/api/v1/saml-auth-providers/get-saml-auth-providers.js @@ -0,0 +1,23 @@ +const getSamlAuthProvidersMock = async (samlAuthProviders) => { + const data = samlAuthProviders.map((samlAuthProvider) => { + return { + id: samlAuthProvider.id, + name: samlAuthProvider.name, + loginUrl: samlAuthProvider.loginUrl, + issuer: samlAuthProvider.issuer, + }; + }); + + return { + data: data, + meta: { + count: data.length, + currentPage: null, + isArray: true, + totalPages: null, + type: 'SamlAuthProvider', + }, + }; +}; + +export default getSamlAuthProvidersMock;