Compare commits
79 Commits
AUT-734
...
hubspot-do
Author | SHA1 | Date | |
---|---|---|---|
![]() |
1893d9ea56 | ||
![]() |
636870a075 | ||
![]() |
8981174302 | ||
![]() |
dd5f05334b | ||
![]() |
929b626b51 | ||
![]() |
7d5b2ec81e | ||
![]() |
f0e2d36c34 | ||
![]() |
94f171d757 | ||
![]() |
04e06db430 | ||
![]() |
d74b215169 | ||
![]() |
404ea94dd2 | ||
![]() |
4afe7c6b46 | ||
![]() |
60b20c4d01 | ||
![]() |
58658c6b1a | ||
![]() |
ec444317b3 | ||
![]() |
8b4aee1afa | ||
![]() |
51abd74304 | ||
![]() |
b93b465f09 | ||
![]() |
5aad68ec62 | ||
![]() |
74fbc937a1 | ||
![]() |
7e35f544eb | ||
![]() |
ed1c3cffc1 | ||
![]() |
c4983a9f9b | ||
![]() |
5b43262e7a | ||
![]() |
dad4408679 | ||
![]() |
a78c4d12b4 | ||
![]() |
74664a9df8 | ||
![]() |
fce5281a03 | ||
![]() |
de0bd2f486 | ||
![]() |
079fb5d108 | ||
![]() |
1c7435a32b | ||
![]() |
1afd374cf6 | ||
![]() |
3adf549915 | ||
![]() |
e94d669eca | ||
![]() |
5fac0b4689 | ||
![]() |
832d323a6e | ||
![]() |
03f1dbd5b2 | ||
![]() |
c0a216f109 | ||
![]() |
ad67b13270 | ||
![]() |
5d420c08c6 | ||
![]() |
3d8235c670 | ||
![]() |
5a209f81d1 | ||
![]() |
d17d8e2805 | ||
![]() |
ca7636e7bc | ||
![]() |
532cfc10d0 | ||
![]() |
72d68c4377 | ||
![]() |
00f5964aa4 | ||
![]() |
fcf345abab | ||
![]() |
24ad43d3e4 | ||
![]() |
9a7cdf42e1 | ||
![]() |
c36b652d5b | ||
![]() |
553070fc23 | ||
![]() |
5d69f7e24f | ||
![]() |
bc0e2bada0 | ||
![]() |
80b6cc1d94 | ||
![]() |
bce3273e64 | ||
![]() |
3abf61152a | ||
![]() |
14923d4cd6 | ||
![]() |
6fdc4bf900 | ||
![]() |
d21e1f75b5 | ||
![]() |
84a0b37fcc | ||
![]() |
f135a0f09e | ||
![]() |
0f24c99456 | ||
![]() |
9eae0ab947 | ||
![]() |
3bf1f79c79 | ||
![]() |
b21074c871 | ||
![]() |
d7893d9a32 | ||
![]() |
9cbdda330c | ||
![]() |
42a9bfd099 | ||
![]() |
eb15bd01ca | ||
![]() |
9e98aebeb3 | ||
![]() |
1361cbc826 | ||
![]() |
679d0808a9 | ||
![]() |
6fe9a548ad | ||
![]() |
2d6d2430d2 | ||
![]() |
a445538e81 | ||
![]() |
50d38ffbd8 | ||
![]() |
93bcdfd9c9 | ||
![]() |
5be3b101a5 |
@@ -38,6 +38,7 @@
|
||||
"debug": "~2.6.9",
|
||||
"dotenv": "^10.0.0",
|
||||
"express": "~4.18.2",
|
||||
"express-async-handler": "^1.2.0",
|
||||
"express-basic-auth": "^1.2.1",
|
||||
"express-graphql": "^0.12.0",
|
||||
"fast-xml-parser": "^4.0.11",
|
||||
@@ -94,6 +95,7 @@
|
||||
"url": "https://github.com/automatisch/automatisch/issues"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@typescript-eslint/utils": "^7.0.2",
|
||||
"nodemon": "^2.0.13",
|
||||
"supertest": "^6.3.3",
|
||||
"vitest": "^1.1.3"
|
||||
|
@@ -0,0 +1,10 @@
|
||||
import { renderObject } from '../../../../../helpers/renderer.js';
|
||||
import AppAuthClient from '../../../../../models/app-auth-client.js';
|
||||
|
||||
export default async (request, response) => {
|
||||
const appAuthClient = await AppAuthClient.query()
|
||||
.findById(request.params.appAuthClientId)
|
||||
.throwIfNotFound();
|
||||
|
||||
renderObject(response, appAuthClient);
|
||||
};
|
@@ -0,0 +1,52 @@
|
||||
import { vi, describe, it, expect, beforeEach } from 'vitest';
|
||||
import request from 'supertest';
|
||||
import Crypto from 'crypto';
|
||||
import app from '../../../../../app.js';
|
||||
import createAuthTokenByUserId from '../../../../../helpers/create-auth-token-by-user-id.js';
|
||||
import { createUser } from '../../../../../../test/factories/user.js';
|
||||
import getAdminAppAuthClientMock from '../../../../../../test/mocks/rest/api/v1/admin/get-app-auth-client.js';
|
||||
import { createAppAuthClient } from '../../../../../../test/factories/app-auth-client.js';
|
||||
import { createRole } from '../../../../../../test/factories/role.js';
|
||||
import * as license from '../../../../../helpers/license.ee.js';
|
||||
|
||||
describe('GET /api/v1/admin/app-auth-clients/:appAuthClientId', () => {
|
||||
let currentUser, currentUserRole, currentAppAuthClient, token;
|
||||
|
||||
describe('with valid license key', () => {
|
||||
beforeEach(async () => {
|
||||
vi.spyOn(license, 'hasValidLicense').mockResolvedValue(true);
|
||||
|
||||
currentUserRole = await createRole({ key: 'admin' });
|
||||
currentUser = await createUser({ roleId: currentUserRole.id });
|
||||
currentAppAuthClient = await createAppAuthClient();
|
||||
|
||||
token = createAuthTokenByUserId(currentUser.id);
|
||||
});
|
||||
|
||||
it('should return specified app auth client info', async () => {
|
||||
const response = await request(app)
|
||||
.get(`/api/v1/admin/app-auth-clients/${currentAppAuthClient.id}`)
|
||||
.set('Authorization', token)
|
||||
.expect(200);
|
||||
|
||||
const expectedPayload = getAdminAppAuthClientMock(currentAppAuthClient);
|
||||
expect(response.body).toEqual(expectedPayload);
|
||||
});
|
||||
|
||||
it('should return not found response for not existing app auth client UUID', async () => {
|
||||
const notExistingAppAuthClientUUID = Crypto.randomUUID();
|
||||
|
||||
await request(app)
|
||||
.get(`/api/v1/admin/app-auth-clients/${notExistingAppAuthClientUUID}`)
|
||||
.set('Authorization', token)
|
||||
.expect(404);
|
||||
});
|
||||
|
||||
it('should return bad request response for invalid UUID', async () => {
|
||||
await request(app)
|
||||
.get('/api/v1/admin/app-auth-clients/invalidAppAuthClientUUID')
|
||||
.set('Authorization', token)
|
||||
.expect(400);
|
||||
});
|
||||
});
|
||||
});
|
@@ -0,0 +1,6 @@
|
||||
import { renderObject } from '../../../../../helpers/renderer.js';
|
||||
import permissionCatalog from '../../../../../helpers/permission-catalog.ee.js';
|
||||
|
||||
export default async (request, response) => {
|
||||
renderObject(response, permissionCatalog);
|
||||
};
|
@@ -0,0 +1,32 @@
|
||||
import { vi, describe, it, expect, beforeEach } from 'vitest';
|
||||
import request from 'supertest';
|
||||
import app from '../../../../../app.js';
|
||||
import createAuthTokenByUserId from '../../../../../helpers/create-auth-token-by-user-id.js';
|
||||
import { createRole } from '../../../../../../test/factories/role.js';
|
||||
import { createUser } from '../../../../../../test/factories/user.js';
|
||||
import getPermissionsCatalogMock from '../../../../../../test/mocks/rest/api/v1/admin/permissions/get-permissions-catalog.ee.js';
|
||||
import * as license from '../../../../../helpers/license.ee.js';
|
||||
|
||||
describe('GET /api/v1/admin/permissions/catalog', () => {
|
||||
let role, currentUser, token;
|
||||
|
||||
beforeEach(async () => {
|
||||
role = await createRole({ key: 'admin' });
|
||||
currentUser = await createUser({ roleId: role.id });
|
||||
|
||||
token = createAuthTokenByUserId(currentUser.id);
|
||||
});
|
||||
|
||||
it('should return roles', async () => {
|
||||
vi.spyOn(license, 'hasValidLicense').mockResolvedValue(true);
|
||||
|
||||
const response = await request(app)
|
||||
.get('/api/v1/admin/permissions/catalog')
|
||||
.set('Authorization', token)
|
||||
.expect(200);
|
||||
|
||||
const expectedPayload = await getPermissionsCatalogMock();
|
||||
|
||||
expect(response.body).toEqual(expectedPayload);
|
||||
});
|
||||
});
|
@@ -0,0 +1,16 @@
|
||||
import { renderObject } from '../../../../../helpers/renderer.js';
|
||||
import Role from '../../../../../models/role.js';
|
||||
|
||||
export default async (request, response) => {
|
||||
const role = await Role.query()
|
||||
.leftJoinRelated({
|
||||
permissions: true,
|
||||
})
|
||||
.withGraphFetched({
|
||||
permissions: true,
|
||||
})
|
||||
.findById(request.params.roleId)
|
||||
.throwIfNotFound();
|
||||
|
||||
renderObject(response, role);
|
||||
};
|
@@ -0,0 +1,59 @@
|
||||
import { vi, describe, it, expect, beforeEach } from 'vitest';
|
||||
import request from 'supertest';
|
||||
import Crypto from 'crypto';
|
||||
import app from '../../../../../app.js';
|
||||
import createAuthTokenByUserId from '../../../../../helpers/create-auth-token-by-user-id.js';
|
||||
import { createRole } from '../../../../../../test/factories/role.js';
|
||||
import { createUser } from '../../../../../../test/factories/user.js';
|
||||
import { createPermission } from '../../../../../../test/factories/permission.js';
|
||||
import getRoleMock from '../../../../../../test/mocks/rest/api/v1/admin/roles/get-role.ee.js';
|
||||
import * as license from '../../../../../helpers/license.ee.js';
|
||||
|
||||
describe('GET /api/v1/admin/roles/:roleId', () => {
|
||||
let role, currentUser, token, permissionOne, permissionTwo;
|
||||
|
||||
beforeEach(async () => {
|
||||
role = await createRole({ key: 'admin' });
|
||||
permissionOne = await createPermission({ roleId: role.id });
|
||||
permissionTwo = await createPermission({ roleId: role.id });
|
||||
currentUser = await createUser({ roleId: role.id });
|
||||
|
||||
token = createAuthTokenByUserId(currentUser.id);
|
||||
});
|
||||
|
||||
it('should return role', async () => {
|
||||
vi.spyOn(license, 'hasValidLicense').mockResolvedValue(true);
|
||||
|
||||
const response = await request(app)
|
||||
.get(`/api/v1/admin/roles/${role.id}`)
|
||||
.set('Authorization', token)
|
||||
.expect(200);
|
||||
|
||||
const expectedPayload = await getRoleMock(role, [
|
||||
permissionOne,
|
||||
permissionTwo,
|
||||
]);
|
||||
|
||||
expect(response.body).toEqual(expectedPayload);
|
||||
});
|
||||
|
||||
it('should return not found response for not existing role UUID', async () => {
|
||||
vi.spyOn(license, 'hasValidLicense').mockResolvedValue(true);
|
||||
|
||||
const notExistingRoleUUID = Crypto.randomUUID();
|
||||
|
||||
await request(app)
|
||||
.get(`/api/v1/admin/roles/${notExistingRoleUUID}`)
|
||||
.set('Authorization', token)
|
||||
.expect(404);
|
||||
});
|
||||
|
||||
it('should return bad request response for invalid UUID', async () => {
|
||||
vi.spyOn(license, 'hasValidLicense').mockResolvedValue(true);
|
||||
|
||||
await request(app)
|
||||
.get('/api/v1/admin/roles/invalidRoleUUID')
|
||||
.set('Authorization', token)
|
||||
.expect(400);
|
||||
});
|
||||
});
|
@@ -0,0 +1,8 @@
|
||||
import { renderObject } from '../../../../../helpers/renderer.js';
|
||||
import Role from '../../../../../models/role.js';
|
||||
|
||||
export default async (request, response) => {
|
||||
const roles = await Role.query().orderBy('name');
|
||||
|
||||
renderObject(response, roles);
|
||||
};
|
@@ -0,0 +1,33 @@
|
||||
import { vi, describe, it, expect, beforeEach } from 'vitest';
|
||||
import request from 'supertest';
|
||||
import app from '../../../../../app.js';
|
||||
import createAuthTokenByUserId from '../../../../../helpers/create-auth-token-by-user-id.js';
|
||||
import { createRole } from '../../../../../../test/factories/role.js';
|
||||
import { createUser } from '../../../../../../test/factories/user.js';
|
||||
import getRolesMock from '../../../../../../test/mocks/rest/api/v1/admin/roles/get-roles.ee.js';
|
||||
import * as license from '../../../../../helpers/license.ee.js';
|
||||
|
||||
describe('GET /api/v1/admin/roles', () => {
|
||||
let roleOne, roleTwo, currentUser, token;
|
||||
|
||||
beforeEach(async () => {
|
||||
roleOne = await createRole({ key: 'admin' });
|
||||
roleTwo = await createRole({ key: 'user' });
|
||||
currentUser = await createUser({ roleId: roleOne.id });
|
||||
|
||||
token = createAuthTokenByUserId(currentUser.id);
|
||||
});
|
||||
|
||||
it('should return roles', async () => {
|
||||
vi.spyOn(license, 'hasValidLicense').mockResolvedValue(true);
|
||||
|
||||
const response = await request(app)
|
||||
.get('/api/v1/admin/roles')
|
||||
.set('Authorization', token)
|
||||
.expect(200);
|
||||
|
||||
const expectedPayload = await getRolesMock([roleOne, roleTwo]);
|
||||
|
||||
expect(response.body).toEqual(expectedPayload);
|
||||
});
|
||||
});
|
@@ -0,0 +1,10 @@
|
||||
import { renderObject } from '../../../../../helpers/renderer.js';
|
||||
import SamlAuthProvider from '../../../../../models/saml-auth-provider.ee.js';
|
||||
|
||||
export default async (request, response) => {
|
||||
const samlAuthProvider = await SamlAuthProvider.query()
|
||||
.findById(request.params.samlAuthProviderId)
|
||||
.throwIfNotFound();
|
||||
|
||||
renderObject(response, samlAuthProvider);
|
||||
};
|
@@ -0,0 +1,57 @@
|
||||
import { vi, describe, it, expect, beforeEach } from 'vitest';
|
||||
import request from 'supertest';
|
||||
import Crypto from 'crypto';
|
||||
import app from '../../../../../app.js';
|
||||
import createAuthTokenByUserId from '../../../../../helpers/create-auth-token-by-user-id.js';
|
||||
import { createRole } from '../../../../../../test/factories/role.js';
|
||||
import { createUser } from '../../../../../../test/factories/user.js';
|
||||
import { createSamlAuthProvider } from '../../../../../../test/factories/saml-auth-provider.ee.js';
|
||||
import getSamlAuthProviderMock from '../../../../../../test/mocks/rest/api/v1/admin/saml-auth-providers/get-saml-auth-provider.ee.js';
|
||||
import * as license from '../../../../../helpers/license.ee.js';
|
||||
|
||||
describe('GET /api/v1/admin/saml-auth-provider/:samlAuthProviderId', () => {
|
||||
let samlAuthProvider, currentUser, token;
|
||||
|
||||
beforeEach(async () => {
|
||||
const role = await createRole({ key: 'admin' });
|
||||
currentUser = await createUser({ roleId: role.id });
|
||||
samlAuthProvider = await createSamlAuthProvider();
|
||||
|
||||
token = createAuthTokenByUserId(currentUser.id);
|
||||
});
|
||||
|
||||
it('should return saml auth provider with specified id', async () => {
|
||||
vi.spyOn(license, 'hasValidLicense').mockResolvedValue(true);
|
||||
|
||||
const response = await request(app)
|
||||
.get(`/api/v1/admin/saml-auth-providers/${samlAuthProvider.id}`)
|
||||
.set('Authorization', token)
|
||||
.expect(200);
|
||||
|
||||
const expectedPayload = await getSamlAuthProviderMock(samlAuthProvider);
|
||||
|
||||
expect(response.body).toEqual(expectedPayload);
|
||||
});
|
||||
|
||||
it('should return not found response for not existing saml auth provider UUID', async () => {
|
||||
vi.spyOn(license, 'hasValidLicense').mockResolvedValue(true);
|
||||
|
||||
const notExistingSamlAuthProviderUUID = Crypto.randomUUID();
|
||||
|
||||
await request(app)
|
||||
.get(
|
||||
`/api/v1/admin/saml-auth-providers/${notExistingSamlAuthProviderUUID}`
|
||||
)
|
||||
.set('Authorization', token)
|
||||
.expect(404);
|
||||
});
|
||||
|
||||
it('should return bad request response for invalid UUID', async () => {
|
||||
vi.spyOn(license, 'hasValidLicense').mockResolvedValue(true);
|
||||
|
||||
await request(app)
|
||||
.get('/api/v1/admin/saml-auth-providers/invalidSamlAuthProviderUUID')
|
||||
.set('Authorization', token)
|
||||
.expect(400);
|
||||
});
|
||||
});
|
@@ -0,0 +1,11 @@
|
||||
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().orderBy(
|
||||
'created_at',
|
||||
'desc'
|
||||
);
|
||||
|
||||
renderObject(response, samlAuthProviders);
|
||||
};
|
@@ -0,0 +1,39 @@
|
||||
import { vi, describe, it, expect, beforeEach } from 'vitest';
|
||||
import request from 'supertest';
|
||||
import app from '../../../../../app.js';
|
||||
import createAuthTokenByUserId from '../../../../../helpers/create-auth-token-by-user-id.js';
|
||||
import { createRole } from '../../../../../../test/factories/role.js';
|
||||
import { createUser } from '../../../../../../test/factories/user.js';
|
||||
import { createSamlAuthProvider } from '../../../../../../test/factories/saml-auth-provider.ee.js';
|
||||
import getSamlAuthProvidersMock from '../../../../../../test/mocks/rest/api/v1/admin/saml-auth-providers/get-saml-auth-providers.ee.js';
|
||||
import * as license from '../../../../../helpers/license.ee.js';
|
||||
|
||||
describe('GET /api/v1/admin/saml-auth-providers', () => {
|
||||
let samlAuthProviderOne, samlAuthProviderTwo, currentUser, token;
|
||||
|
||||
beforeEach(async () => {
|
||||
const role = await createRole({ key: 'admin' });
|
||||
currentUser = await createUser({ roleId: role.id });
|
||||
|
||||
samlAuthProviderOne = await createSamlAuthProvider();
|
||||
samlAuthProviderTwo = await createSamlAuthProvider();
|
||||
|
||||
token = createAuthTokenByUserId(currentUser.id);
|
||||
});
|
||||
|
||||
it('should return saml auth providers', async () => {
|
||||
vi.spyOn(license, 'hasValidLicense').mockResolvedValue(true);
|
||||
|
||||
const response = await request(app)
|
||||
.get('/api/v1/admin/saml-auth-providers')
|
||||
.set('Authorization', token)
|
||||
.expect(200);
|
||||
|
||||
const expectedPayload = await getSamlAuthProvidersMock([
|
||||
samlAuthProviderTwo,
|
||||
samlAuthProviderOne,
|
||||
]);
|
||||
|
||||
expect(response.body).toEqual(expectedPayload);
|
||||
});
|
||||
});
|
@@ -1,11 +1,8 @@
|
||||
import { renderObject } from '../../../../helpers/renderer.js';
|
||||
import User from '../../../../models/user.js';
|
||||
import { renderObject } from '../../../../../helpers/renderer.js';
|
||||
import User from '../../../../../models/user.js';
|
||||
|
||||
export default async (request, response) => {
|
||||
const user = await User.query()
|
||||
.leftJoinRelated({
|
||||
role: true,
|
||||
})
|
||||
.withGraphFetched({
|
||||
role: true,
|
||||
})
|
@@ -0,0 +1,55 @@
|
||||
import { vi, describe, it, expect, beforeEach } from 'vitest';
|
||||
import request from 'supertest';
|
||||
import Crypto from 'crypto';
|
||||
import app from '../../../../../app.js';
|
||||
import createAuthTokenByUserId from '../../../../../helpers/create-auth-token-by-user-id';
|
||||
import { createUser } from '../../../../../../test/factories/user';
|
||||
import { createRole } from '../../../../../../test/factories/role';
|
||||
import getUserMock from '../../../../../../test/mocks/rest/api/v1/admin/users/get-user.js';
|
||||
import * as license from '../../../../../helpers/license.ee.js';
|
||||
|
||||
describe('GET /api/v1/admin/users/:userId', () => {
|
||||
let currentUser, currentUserRole, anotherUser, anotherUserRole, token;
|
||||
|
||||
beforeEach(async () => {
|
||||
currentUserRole = await createRole({ key: 'admin' });
|
||||
currentUser = await createUser({ roleId: currentUserRole.id });
|
||||
|
||||
anotherUser = await createUser();
|
||||
anotherUserRole = await anotherUser.$relatedQuery('role');
|
||||
|
||||
token = createAuthTokenByUserId(currentUser.id);
|
||||
});
|
||||
|
||||
it('should return specified user info', async () => {
|
||||
vi.spyOn(license, 'hasValidLicense').mockResolvedValue(true);
|
||||
|
||||
const response = await request(app)
|
||||
.get(`/api/v1/admin/users/${anotherUser.id}`)
|
||||
.set('Authorization', token)
|
||||
.expect(200);
|
||||
|
||||
const expectedPayload = getUserMock(anotherUser, anotherUserRole);
|
||||
expect(response.body).toEqual(expectedPayload);
|
||||
});
|
||||
|
||||
it('should return not found response for not existing user UUID', async () => {
|
||||
vi.spyOn(license, 'hasValidLicense').mockResolvedValue(true);
|
||||
|
||||
const notExistingUserUUID = Crypto.randomUUID();
|
||||
|
||||
await request(app)
|
||||
.get(`/api/v1/admin/users/${notExistingUserUUID}`)
|
||||
.set('Authorization', token)
|
||||
.expect(404);
|
||||
});
|
||||
|
||||
it('should return bad request response for invalid UUID', async () => {
|
||||
vi.spyOn(license, 'hasValidLicense').mockResolvedValue(true);
|
||||
|
||||
await request(app)
|
||||
.get('/api/v1/admin/users/invalidUserUUID')
|
||||
.set('Authorization', token)
|
||||
.expect(400);
|
||||
});
|
||||
});
|
@@ -1,12 +1,9 @@
|
||||
import { renderObject } from '../../../../helpers/renderer.js';
|
||||
import User from '../../../../models/user.js';
|
||||
import paginateRest from '../../../../helpers/pagination-rest.js';
|
||||
import { renderObject } from '../../../../../helpers/renderer.js';
|
||||
import User from '../../../../../models/user.js';
|
||||
import paginateRest from '../../../../../helpers/pagination-rest.js';
|
||||
|
||||
export default async (request, response) => {
|
||||
const usersQuery = User.query()
|
||||
.leftJoinRelated({
|
||||
role: true,
|
||||
})
|
||||
.withGraphFetched({
|
||||
role: true,
|
||||
})
|
@@ -1,26 +1,17 @@
|
||||
import { describe, it, expect, beforeEach } from 'vitest';
|
||||
import { vi, describe, it, expect, beforeEach } from 'vitest';
|
||||
import request from 'supertest';
|
||||
import app from '../../../../app';
|
||||
import createAuthTokenByUserId from '../../../../helpers/create-auth-token-by-user-id';
|
||||
import { createRole } from '../../../../../test/factories/role';
|
||||
import { createPermission } from '../../../../../test/factories/permission';
|
||||
import { createUser } from '../../../../../test/factories/user';
|
||||
import getUsersMock from '../../../../../test/mocks/rest/api/v1/users/get-users';
|
||||
import app from '../../../../../app';
|
||||
import createAuthTokenByUserId from '../../../../../helpers/create-auth-token-by-user-id';
|
||||
import { createRole } from '../../../../../../test/factories/role';
|
||||
import { createUser } from '../../../../../../test/factories/user';
|
||||
import getUsersMock from '../../../../../../test/mocks/rest/api/v1/admin/users/get-users.js';
|
||||
import * as license from '../../../../../helpers/license.ee.js';
|
||||
|
||||
describe('GET /api/v1/users', () => {
|
||||
describe('GET /api/v1/admin/users', () => {
|
||||
let currentUser, currentUserRole, anotherUser, anotherUserRole, token;
|
||||
|
||||
beforeEach(async () => {
|
||||
currentUserRole = await createRole({
|
||||
key: 'currentUser',
|
||||
name: 'Current user role',
|
||||
});
|
||||
|
||||
await createPermission({
|
||||
action: 'read',
|
||||
subject: 'User',
|
||||
roleId: currentUserRole.id,
|
||||
});
|
||||
currentUserRole = await createRole({ key: 'admin' });
|
||||
|
||||
currentUser = await createUser({
|
||||
roleId: currentUserRole.id,
|
||||
@@ -41,8 +32,10 @@ describe('GET /api/v1/users', () => {
|
||||
});
|
||||
|
||||
it('should return users data', async () => {
|
||||
vi.spyOn(license, 'hasValidLicense').mockResolvedValue(true);
|
||||
|
||||
const response = await request(app)
|
||||
.get('/api/v1/users')
|
||||
.get('/api/v1/admin/users')
|
||||
.set('Authorization', token)
|
||||
.expect(200);
|
||||
|
@@ -0,0 +1,11 @@
|
||||
import { renderObject } from '../../../../helpers/renderer.js';
|
||||
import AppAuthClient from '../../../../models/app-auth-client.js';
|
||||
|
||||
export default async (request, response) => {
|
||||
const appAuthClient = await AppAuthClient.query()
|
||||
.findById(request.params.appAuthClientId)
|
||||
.where({ active: true })
|
||||
.throwIfNotFound();
|
||||
|
||||
renderObject(response, appAuthClient);
|
||||
};
|
@@ -0,0 +1,48 @@
|
||||
import { vi, describe, it, expect, beforeEach } from 'vitest';
|
||||
import request from 'supertest';
|
||||
import Crypto from 'crypto';
|
||||
import app from '../../../../app.js';
|
||||
import createAuthTokenByUserId from '../../../../helpers/create-auth-token-by-user-id.js';
|
||||
import { createUser } from '../../../../../test/factories/user.js';
|
||||
import getAppAuthClientMock from '../../../../../test/mocks/rest/api/v1/admin/get-app-auth-client.js';
|
||||
import { createAppAuthClient } from '../../../../../test/factories/app-auth-client.js';
|
||||
import * as license from '../../../../helpers/license.ee.js';
|
||||
|
||||
describe('GET /api/v1/app-auth-clients/:id', () => {
|
||||
let currentUser, currentAppAuthClient, token;
|
||||
|
||||
beforeEach(async () => {
|
||||
vi.spyOn(license, 'hasValidLicense').mockResolvedValue(true);
|
||||
|
||||
currentUser = await createUser();
|
||||
currentAppAuthClient = await createAppAuthClient();
|
||||
|
||||
token = createAuthTokenByUserId(currentUser.id);
|
||||
});
|
||||
|
||||
it('should return specified app auth client info', async () => {
|
||||
const response = await request(app)
|
||||
.get(`/api/v1/app-auth-clients/${currentAppAuthClient.id}`)
|
||||
.set('Authorization', token)
|
||||
.expect(200);
|
||||
|
||||
const expectedPayload = getAppAuthClientMock(currentAppAuthClient);
|
||||
expect(response.body).toEqual(expectedPayload);
|
||||
});
|
||||
|
||||
it('should return not found response for not existing app auth client ID', async () => {
|
||||
const notExistingAppAuthClientUUID = Crypto.randomUUID();
|
||||
|
||||
await request(app)
|
||||
.get(`/api/v1/app-auth-clients/${notExistingAppAuthClientUUID}`)
|
||||
.set('Authorization', token)
|
||||
.expect(404);
|
||||
});
|
||||
|
||||
it('should return bad request response for invalid UUID', async () => {
|
||||
await request(app)
|
||||
.get('/api/v1/app-auth-clients/invalidAppAuthClientUUID')
|
||||
.set('Authorization', token)
|
||||
.expect(400);
|
||||
});
|
||||
});
|
8
packages/backend/src/controllers/api/v1/apps/get-app.js
Normal file
8
packages/backend/src/controllers/api/v1/apps/get-app.js
Normal file
@@ -0,0 +1,8 @@
|
||||
import App from '../../../../models/app.js';
|
||||
import { renderObject } from '../../../../helpers/renderer.js';
|
||||
|
||||
export default async (request, response) => {
|
||||
const app = await App.findOneByKey(request.params.appKey);
|
||||
|
||||
renderObject(response, app, { serializer: 'App' });
|
||||
};
|
35
packages/backend/src/controllers/api/v1/apps/get-app.test.js
Normal file
35
packages/backend/src/controllers/api/v1/apps/get-app.test.js
Normal file
@@ -0,0 +1,35 @@
|
||||
import { describe, it, expect, beforeEach } from 'vitest';
|
||||
import request from 'supertest';
|
||||
import App from '../../../../models/app';
|
||||
import app from '../../../../app.js';
|
||||
import createAuthTokenByUserId from '../../../../helpers/create-auth-token-by-user-id';
|
||||
import { createUser } from '../../../../../test/factories/user';
|
||||
import getAppMock from '../../../../../test/mocks/rest/api/v1/apps/get-app.js';
|
||||
|
||||
describe('GET /api/v1/apps/:appKey', () => {
|
||||
let currentUser, token;
|
||||
|
||||
beforeEach(async () => {
|
||||
currentUser = await createUser();
|
||||
token = createAuthTokenByUserId(currentUser.id);
|
||||
});
|
||||
|
||||
it('should return the app info', async () => {
|
||||
const exampleApp = await App.findOneByKey('github');
|
||||
|
||||
const response = await request(app)
|
||||
.get(`/api/v1/apps/${exampleApp.key}`)
|
||||
.set('Authorization', token)
|
||||
.expect(200);
|
||||
|
||||
const expectedPayload = getAppMock(exampleApp);
|
||||
expect(response.body).toEqual(expectedPayload);
|
||||
});
|
||||
|
||||
it('should return not found response for invalid app key', async () => {
|
||||
await request(app)
|
||||
.get('/api/v1/apps/invalid-app-key')
|
||||
.set('Authorization', token)
|
||||
.expect(404);
|
||||
});
|
||||
});
|
13
packages/backend/src/controllers/api/v1/automatisch/info.js
Normal file
13
packages/backend/src/controllers/api/v1/automatisch/info.js
Normal file
@@ -0,0 +1,13 @@
|
||||
import appConfig from '../../../../config/app.js';
|
||||
import { hasValidLicense } from '../../../../helpers/license.ee.js';
|
||||
import { renderObject } from '../../../../helpers/renderer.js';
|
||||
|
||||
export default async (request, response) => {
|
||||
const info = {
|
||||
isCloud: appConfig.isCloud,
|
||||
isMation: appConfig.isMation,
|
||||
isEnterprise: await hasValidLicense(),
|
||||
};
|
||||
|
||||
renderObject(response, info);
|
||||
};
|
@@ -0,0 +1,22 @@
|
||||
import { vi, expect, describe, it } from 'vitest';
|
||||
import request from 'supertest';
|
||||
import appConfig from '../../../../config/app.js';
|
||||
import app from '../../../../app.js';
|
||||
import infoMock from '../../../../../test/mocks/rest/api/v1/automatisch/info.js';
|
||||
import * as license from '../../../../helpers/license.ee.js';
|
||||
|
||||
describe('GET /api/v1/automatisch/info', () => {
|
||||
it('should return Automatisch info', async () => {
|
||||
vi.spyOn(appConfig, 'isCloud', 'get').mockReturnValue(false);
|
||||
vi.spyOn(appConfig, 'isMation', 'get').mockReturnValue(false);
|
||||
vi.spyOn(license, 'hasValidLicense').mockResolvedValue(true);
|
||||
|
||||
const response = await request(app)
|
||||
.get('/api/v1/automatisch/info')
|
||||
.expect(200);
|
||||
|
||||
const expectedPayload = infoMock();
|
||||
|
||||
expect(response.body).toEqual(expectedPayload);
|
||||
});
|
||||
});
|
@@ -0,0 +1,15 @@
|
||||
import { getLicense } from '../../../../helpers/license.ee.js';
|
||||
import { renderObject } from '../../../../helpers/renderer.js';
|
||||
|
||||
export default async (request, response) => {
|
||||
const license = await getLicense();
|
||||
|
||||
const computedLicense = {
|
||||
id: license ? license.id : null,
|
||||
name: license ? license.name : null,
|
||||
expireAt: license ? license.expireAt : null,
|
||||
verified: license ? true : false,
|
||||
};
|
||||
|
||||
renderObject(response, computedLicense);
|
||||
};
|
@@ -0,0 +1,23 @@
|
||||
import { vi, expect, describe, it } from 'vitest';
|
||||
import request from 'supertest';
|
||||
import app from '../../../../app.js';
|
||||
import licenseMock from '../../../../../test/mocks/rest/api/v1/automatisch/license.js';
|
||||
import * as license from '../../../../helpers/license.ee.js';
|
||||
|
||||
describe('GET /api/v1/automatisch/license', () => {
|
||||
it('should return Automatisch license info', async () => {
|
||||
vi.spyOn(license, 'getLicense').mockResolvedValue({
|
||||
id: '123',
|
||||
name: 'license-name',
|
||||
expireAt: '2025-12-31T23:59:59Z',
|
||||
});
|
||||
|
||||
const response = await request(app)
|
||||
.get('/api/v1/automatisch/license')
|
||||
.expect(200);
|
||||
|
||||
const expectedPayload = licenseMock();
|
||||
|
||||
expect(response.body).toEqual(expectedPayload);
|
||||
});
|
||||
});
|
@@ -0,0 +1,19 @@
|
||||
import { renderObject } from '../../../../helpers/renderer.js';
|
||||
import axios from '../../../../helpers/axios-with-proxy.js';
|
||||
import logger from '../../../../helpers/logger.js';
|
||||
|
||||
const NOTIFICATIONS_URL =
|
||||
'https://notifications.automatisch.io/notifications.json';
|
||||
|
||||
export default async (request, response) => {
|
||||
let notifications = [];
|
||||
|
||||
try {
|
||||
const response = await axios.get(NOTIFICATIONS_URL);
|
||||
notifications = response.data;
|
||||
} catch (error) {
|
||||
logger.error('Error fetching notifications API endpoint!', error);
|
||||
}
|
||||
|
||||
renderObject(response, notifications);
|
||||
};
|
@@ -0,0 +1,9 @@
|
||||
import { describe, it } from 'vitest';
|
||||
import request from 'supertest';
|
||||
import app from '../../../../app.js';
|
||||
|
||||
describe('GET /api/v1/automatisch/notifications', () => {
|
||||
it('should return Automatisch notifications', async () => {
|
||||
await request(app).get('/api/v1/automatisch/notifications').expect(200);
|
||||
});
|
||||
});
|
11
packages/backend/src/controllers/api/v1/flows/get-flow.js
Normal file
11
packages/backend/src/controllers/api/v1/flows/get-flow.js
Normal file
@@ -0,0 +1,11 @@
|
||||
import { renderObject } from '../../../../helpers/renderer.js';
|
||||
|
||||
export default async (request, response) => {
|
||||
const flow = await request.currentUser.authorizedFlows
|
||||
.withGraphJoined({ steps: true })
|
||||
.orderBy('steps.position', 'asc')
|
||||
.findOne({ 'flows.id': request.params.flowId })
|
||||
.throwIfNotFound();
|
||||
|
||||
renderObject(response, flow);
|
||||
};
|
102
packages/backend/src/controllers/api/v1/flows/get-flow.test.js
Normal file
102
packages/backend/src/controllers/api/v1/flows/get-flow.test.js
Normal file
@@ -0,0 +1,102 @@
|
||||
import { describe, it, expect, beforeEach } from 'vitest';
|
||||
import request from 'supertest';
|
||||
import Crypto from 'crypto';
|
||||
import app from '../../../../app.js';
|
||||
import createAuthTokenByUserId from '../../../../helpers/create-auth-token-by-user-id';
|
||||
import { createUser } from '../../../../../test/factories/user';
|
||||
import { createFlow } from '../../../../../test/factories/flow';
|
||||
import { createStep } from '../../../../../test/factories/step';
|
||||
import { createPermission } from '../../../../../test/factories/permission';
|
||||
import getFlowMock from '../../../../../test/mocks/rest/api/v1/flows/get-flow';
|
||||
|
||||
describe('GET /api/v1/flows/:flowId', () => {
|
||||
let currentUser, currentUserRole, token;
|
||||
|
||||
beforeEach(async () => {
|
||||
currentUser = await createUser();
|
||||
currentUserRole = await currentUser.$relatedQuery('role');
|
||||
|
||||
token = createAuthTokenByUserId(currentUser.id);
|
||||
});
|
||||
|
||||
it('should return the flow data of current user', async () => {
|
||||
const currentUserflow = await createFlow({ userId: currentUser.id });
|
||||
const triggerStep = await createStep({ flowId: currentUserflow.id });
|
||||
const actionStep = await createStep({ flowId: currentUserflow.id });
|
||||
|
||||
await createPermission({
|
||||
action: 'read',
|
||||
subject: 'Flow',
|
||||
roleId: currentUserRole.id,
|
||||
conditions: ['isCreator'],
|
||||
});
|
||||
|
||||
const response = await request(app)
|
||||
.get(`/api/v1/flows/${currentUserflow.id}`)
|
||||
.set('Authorization', token)
|
||||
.expect(200);
|
||||
|
||||
const expectedPayload = await getFlowMock(currentUserflow, [
|
||||
triggerStep,
|
||||
actionStep,
|
||||
]);
|
||||
|
||||
expect(response.body).toEqual(expectedPayload);
|
||||
});
|
||||
|
||||
it('should return the flow data of another user', async () => {
|
||||
const anotherUser = await createUser();
|
||||
const anotherUserFlow = await createFlow({ userId: anotherUser.id });
|
||||
const triggerStep = await createStep({ flowId: anotherUserFlow.id });
|
||||
const actionStep = await createStep({ flowId: anotherUserFlow.id });
|
||||
|
||||
await createPermission({
|
||||
action: 'read',
|
||||
subject: 'Flow',
|
||||
roleId: currentUserRole.id,
|
||||
conditions: [],
|
||||
});
|
||||
|
||||
const response = await request(app)
|
||||
.get(`/api/v1/flows/${anotherUserFlow.id}`)
|
||||
.set('Authorization', token)
|
||||
.expect(200);
|
||||
|
||||
const expectedPayload = await getFlowMock(anotherUserFlow, [
|
||||
triggerStep,
|
||||
actionStep,
|
||||
]);
|
||||
|
||||
expect(response.body).toEqual(expectedPayload);
|
||||
});
|
||||
|
||||
it('should return not found response for not existing flow UUID', async () => {
|
||||
await createPermission({
|
||||
action: 'read',
|
||||
subject: 'Flow',
|
||||
roleId: currentUserRole.id,
|
||||
conditions: [],
|
||||
});
|
||||
|
||||
const notExistingFlowUUID = Crypto.randomUUID();
|
||||
|
||||
await request(app)
|
||||
.get(`/api/v1/flows/${notExistingFlowUUID}`)
|
||||
.set('Authorization', token)
|
||||
.expect(404);
|
||||
});
|
||||
|
||||
it('should return bad request response for invalid UUID', async () => {
|
||||
await createPermission({
|
||||
action: 'read',
|
||||
subject: 'Flow',
|
||||
roleId: currentUserRole.id,
|
||||
conditions: [],
|
||||
});
|
||||
|
||||
await request(app)
|
||||
.get('/api/v1/flows/invalidFlowUUID')
|
||||
.set('Authorization', token)
|
||||
.expect(400);
|
||||
});
|
||||
});
|
@@ -0,0 +1,8 @@
|
||||
import { renderObject } from '../../../../helpers/renderer.js';
|
||||
import Billing from '../../../../helpers/billing/index.ee.js';
|
||||
|
||||
export default async (request, response) => {
|
||||
const paddleInfo = Billing.paddleInfo;
|
||||
|
||||
renderObject(response, paddleInfo);
|
||||
};
|
@@ -0,0 +1,33 @@
|
||||
import { vi, describe, it, expect, beforeEach } from 'vitest';
|
||||
import request from 'supertest';
|
||||
import app from '../../../../app.js';
|
||||
import createAuthTokenByUserId from '../../../../helpers/create-auth-token-by-user-id.js';
|
||||
import { createUser } from '../../../../../test/factories/user.js';
|
||||
import getPaddleInfoMock from '../../../../../test/mocks/rest/api/v1/payment/get-paddle-info.js';
|
||||
import appConfig from '../../../../config/app.js';
|
||||
import billing from '../../../../helpers/billing/index.ee.js';
|
||||
|
||||
describe('GET /api/v1/payment/paddle-info', () => {
|
||||
let user, token;
|
||||
|
||||
beforeEach(async () => {
|
||||
user = await createUser();
|
||||
token = createAuthTokenByUserId(user.id);
|
||||
|
||||
vi.spyOn(appConfig, 'isCloud', 'get').mockReturnValue(true);
|
||||
vi.spyOn(billing.paddleInfo, 'vendorId', 'get').mockReturnValue(
|
||||
'sampleVendorId'
|
||||
);
|
||||
});
|
||||
|
||||
it('should return payment plans', async () => {
|
||||
const response = await request(app)
|
||||
.get('/api/v1/payment/paddle-info')
|
||||
.set('Authorization', token)
|
||||
.expect(200);
|
||||
|
||||
const expectedResponsePayload = await getPaddleInfoMock();
|
||||
|
||||
expect(response.body).toEqual(expectedResponsePayload);
|
||||
});
|
||||
});
|
@@ -0,0 +1,8 @@
|
||||
import { renderObject } from '../../../../helpers/renderer.js';
|
||||
import Billing from '../../../../helpers/billing/index.ee.js';
|
||||
|
||||
export default async (request, response) => {
|
||||
const paymentPlans = Billing.paddlePlans;
|
||||
|
||||
renderObject(response, paymentPlans);
|
||||
};
|
@@ -0,0 +1,29 @@
|
||||
import { vi, describe, it, expect, beforeEach } from 'vitest';
|
||||
import request from 'supertest';
|
||||
import app from '../../../../app.js';
|
||||
import createAuthTokenByUserId from '../../../../helpers/create-auth-token-by-user-id.js';
|
||||
import { createUser } from '../../../../../test/factories/user.js';
|
||||
import getPaymentPlansMock from '../../../../../test/mocks/rest/api/v1/payment/get-plans.js';
|
||||
import appConfig from '../../../../config/app.js';
|
||||
|
||||
describe('GET /api/v1/payment/plans', () => {
|
||||
let user, token;
|
||||
|
||||
beforeEach(async () => {
|
||||
user = await createUser();
|
||||
token = createAuthTokenByUserId(user.id);
|
||||
|
||||
vi.spyOn(appConfig, 'isCloud', 'get').mockReturnValue(true);
|
||||
});
|
||||
|
||||
it('should return payment plans', async () => {
|
||||
const response = await request(app)
|
||||
.get('/api/v1/payment/plans')
|
||||
.set('Authorization', token)
|
||||
.expect(200);
|
||||
|
||||
const expectedResponsePayload = await getPaymentPlansMock();
|
||||
|
||||
expect(response.body).toEqual(expectedResponsePayload);
|
||||
});
|
||||
});
|
@@ -0,0 +1,7 @@
|
||||
import { renderObject } from '../../../../helpers/renderer.js';
|
||||
|
||||
export default async (request, response) => {
|
||||
const invoices = await request.currentUser.getInvoices();
|
||||
|
||||
renderObject(response, invoices);
|
||||
};
|
@@ -0,0 +1,34 @@
|
||||
import { describe, it, expect, beforeEach, vi } from 'vitest';
|
||||
import request from 'supertest';
|
||||
import app from '../../../../app.js';
|
||||
import createAuthTokenByUserId from '../../../../helpers/create-auth-token-by-user-id';
|
||||
import { createUser } from '../../../../../test/factories/user';
|
||||
import User from '../../../../models/user';
|
||||
import getInvoicesMock from '../../../../../test/mocks/rest/api/v1/users/get-invoices.ee';
|
||||
|
||||
describe('GET /api/v1/user/invoices', () => {
|
||||
let currentUser, token;
|
||||
|
||||
beforeEach(async () => {
|
||||
currentUser = await createUser();
|
||||
token = createAuthTokenByUserId(currentUser.id);
|
||||
});
|
||||
|
||||
it('should return current user invoices', async () => {
|
||||
const invoices = [
|
||||
{ id: 1, amount: 100, description: 'Invoice 1' },
|
||||
{ id: 2, amount: 200, description: 'Invoice 2' },
|
||||
];
|
||||
|
||||
vi.spyOn(User.prototype, 'getInvoices').mockResolvedValue(invoices);
|
||||
|
||||
const response = await request(app)
|
||||
.get('/api/v1/users/invoices')
|
||||
.set('Authorization', token)
|
||||
.expect(200);
|
||||
|
||||
const expectedPayload = await getInvoicesMock(invoices);
|
||||
|
||||
expect(response.body).toEqual(expectedPayload);
|
||||
});
|
||||
});
|
@@ -1,36 +0,0 @@
|
||||
import { describe, it, expect, beforeEach } from 'vitest';
|
||||
import request from 'supertest';
|
||||
import app from '../../../../app.js';
|
||||
import createAuthTokenByUserId from '../../../../helpers/create-auth-token-by-user-id';
|
||||
import { createUser } from '../../../../../test/factories/user';
|
||||
import { createPermission } from '../../../../../test/factories/permission';
|
||||
import getUserMock from '../../../../../test/mocks/rest/api/v1/users/get-user';
|
||||
|
||||
describe('GET /api/v1/users/:userId', () => {
|
||||
let currentUser, currentUserRole, anotherUser, anotherUserRole, token;
|
||||
|
||||
beforeEach(async () => {
|
||||
currentUser = await createUser();
|
||||
anotherUser = await createUser();
|
||||
currentUserRole = await currentUser.$relatedQuery('role');
|
||||
anotherUserRole = await anotherUser.$relatedQuery('role');
|
||||
|
||||
await createPermission({
|
||||
roleId: currentUserRole.id,
|
||||
action: 'read',
|
||||
subject: 'User',
|
||||
});
|
||||
|
||||
token = createAuthTokenByUserId(currentUser.id);
|
||||
});
|
||||
|
||||
it('should return specified user info', async () => {
|
||||
const response = await request(app)
|
||||
.get(`/api/v1/users/${anotherUser.id}`)
|
||||
.set('Authorization', token)
|
||||
.expect(200);
|
||||
|
||||
const expectedPayload = getUserMock(anotherUser, anotherUserRole);
|
||||
expect(response.body).toEqual(expectedPayload);
|
||||
});
|
||||
});
|
@@ -1,8 +1,13 @@
|
||||
const deleteStep = async (_parent, params, context) => {
|
||||
context.currentUser.can('update', 'Flow');
|
||||
import Step from '../../models/flow.js';
|
||||
|
||||
const step = await context.currentUser
|
||||
.$relatedQuery('steps')
|
||||
const deleteStep = async (_parent, params, context) => {
|
||||
const conditions = context.currentUser.can('update', 'Flow');
|
||||
const isCreator = conditions.isCreator;
|
||||
const allSteps = Step.query();
|
||||
const userSteps = context.currentUser.$relatedQuery('steps');
|
||||
const baseQuery = isCreator ? userSteps : allSteps;
|
||||
|
||||
const step = await baseQuery
|
||||
.withGraphFetched('flow')
|
||||
.findOne({
|
||||
'steps.id': params.input.id,
|
||||
|
@@ -1,16 +1,21 @@
|
||||
const authorizationList = {
|
||||
'/api/v1/users/:userId': {
|
||||
'GET /api/v1/users/:userId': {
|
||||
action: 'read',
|
||||
subject: 'User',
|
||||
},
|
||||
'/api/v1/users/': {
|
||||
'GET /api/v1/users/': {
|
||||
action: 'read',
|
||||
subject: 'User',
|
||||
},
|
||||
'GET /api/v1/flows/:flowId': {
|
||||
action: 'read',
|
||||
subject: 'Flow',
|
||||
},
|
||||
};
|
||||
|
||||
export const authorizeUser = async (request, response, next) => {
|
||||
const currentRoute = request.baseUrl + request.route.path;
|
||||
const currentRoute =
|
||||
request.method + ' ' + request.baseUrl + request.route.path;
|
||||
const currentRouteRule = authorizationList[currentRoute];
|
||||
|
||||
try {
|
||||
@@ -20,3 +25,13 @@ export const authorizeUser = async (request, response, next) => {
|
||||
return response.status(403).end();
|
||||
}
|
||||
};
|
||||
|
||||
export const authorizeAdmin = async (request, response, next) => {
|
||||
const role = await request.currentUser.$relatedQuery('role');
|
||||
|
||||
if (role?.isAdmin) {
|
||||
next();
|
||||
} else {
|
||||
return response.status(403).end();
|
||||
}
|
||||
};
|
||||
|
9
packages/backend/src/helpers/check-is-enterprise.js
Normal file
9
packages/backend/src/helpers/check-is-enterprise.js
Normal file
@@ -0,0 +1,9 @@
|
||||
import { hasValidLicense } from './license.ee.js';
|
||||
|
||||
export const checkIsEnterprise = async (request, response, next) => {
|
||||
if (await hasValidLicense()) {
|
||||
next();
|
||||
} else {
|
||||
return response.status(404).end();
|
||||
}
|
||||
};
|
@@ -1,14 +1,31 @@
|
||||
import logger from './logger.js';
|
||||
import objection from 'objection';
|
||||
const { NotFoundError, DataError } = objection;
|
||||
|
||||
// Do not remove `next` argument as the function signature will not fit for an error handler middleware
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
const errorHandler = (err, req, res, next) => {
|
||||
if (err.message === 'Not Found') {
|
||||
res.status(404).end();
|
||||
} else {
|
||||
logger.error(err.message + '\n' + err.stack);
|
||||
res.status(err.statusCode || 500).send(err.message);
|
||||
const errorHandler = (error, request, response, next) => {
|
||||
if (error.message === 'Not Found' || error instanceof NotFoundError) {
|
||||
response.status(404).end();
|
||||
}
|
||||
|
||||
if (notFoundAppError(error)) {
|
||||
response.status(404).end();
|
||||
}
|
||||
|
||||
if (error instanceof DataError) {
|
||||
response.status(400).end();
|
||||
}
|
||||
|
||||
logger.error(error.message + '\n' + error.stack);
|
||||
response.status(error.statusCode || 500).end();
|
||||
};
|
||||
|
||||
const notFoundAppError = (error) => {
|
||||
return (
|
||||
error.message.includes('An application with the') ||
|
||||
error.message.includes("key couldn't be found.")
|
||||
);
|
||||
};
|
||||
|
||||
export default errorHandler;
|
||||
|
@@ -4,8 +4,8 @@ import appConfig from '../config/app.js';
|
||||
const levels = {
|
||||
error: 0,
|
||||
warn: 1,
|
||||
info: 2,
|
||||
http: 3,
|
||||
http: 2,
|
||||
info: 3,
|
||||
debug: 4,
|
||||
};
|
||||
|
||||
|
@@ -11,13 +11,18 @@ const isArray = (object) =>
|
||||
const totalCount = (object) =>
|
||||
isPaginated(object) ? object.totalCount : isArray(object) ? object.length : 1;
|
||||
|
||||
const renderObject = (response, object) => {
|
||||
const renderObject = (response, object, options) => {
|
||||
let data = isPaginated(object) ? object.records : object;
|
||||
|
||||
const type = isPaginated(object)
|
||||
? object.records[0].constructor.name
|
||||
: Array.isArray(object)
|
||||
? object?.[0]?.constructor?.name || 'Object'
|
||||
: object.constructor.name;
|
||||
|
||||
const serializer = serializers[type];
|
||||
const serializer = options?.serializer
|
||||
? serializers[options.serializer]
|
||||
: serializers[type];
|
||||
|
||||
if (serializer) {
|
||||
data = Array.isArray(data)
|
||||
|
@@ -15,6 +15,7 @@ import Role from './role.js';
|
||||
import Step from './step.js';
|
||||
import Subscription from './subscription.ee.js';
|
||||
import UsageData from './usage-data.ee.js';
|
||||
import Billing from '../helpers/billing/index.ee.js';
|
||||
|
||||
class User extends Base {
|
||||
static tableName = 'users';
|
||||
@@ -143,6 +144,11 @@ class User extends Base {
|
||||
},
|
||||
});
|
||||
|
||||
get authorizedFlows() {
|
||||
const conditions = this.can('read', 'Flow');
|
||||
return conditions.isCreator ? this.$relatedQuery('flows') : Flow.query();
|
||||
}
|
||||
|
||||
login(password) {
|
||||
return bcrypt.compare(password, this.password);
|
||||
}
|
||||
@@ -237,6 +243,20 @@ class User extends Base {
|
||||
return currentUsageData.consumedTaskCount < plan.quota;
|
||||
}
|
||||
|
||||
async getInvoices() {
|
||||
const subscription = await this.$relatedQuery('currentSubscription');
|
||||
|
||||
if (!subscription) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const invoices = await Billing.paddleClient.getInvoices(
|
||||
Number(subscription.paddleSubscriptionId)
|
||||
);
|
||||
|
||||
return invoices;
|
||||
}
|
||||
|
||||
async $beforeInsert(queryContext) {
|
||||
await super.$beforeInsert(queryContext);
|
||||
|
||||
|
@@ -15,11 +15,17 @@ process.on('SIGTERM', async () => {
|
||||
await actionQueue.close();
|
||||
});
|
||||
|
||||
actionQueue.on('error', (err) => {
|
||||
if (err.code === CONNECTION_REFUSED) {
|
||||
logger.error('Make sure you have installed Redis and it is running.', err);
|
||||
actionQueue.on('error', (error) => {
|
||||
if (error.code === CONNECTION_REFUSED) {
|
||||
logger.error(
|
||||
'Make sure you have installed Redis and it is running.',
|
||||
error
|
||||
);
|
||||
|
||||
process.exit();
|
||||
}
|
||||
|
||||
logger.error('Error happened in action queue!', error);
|
||||
});
|
||||
|
||||
export default actionQueue;
|
||||
|
@@ -15,11 +15,17 @@ process.on('SIGTERM', async () => {
|
||||
await deleteUserQueue.close();
|
||||
});
|
||||
|
||||
deleteUserQueue.on('error', (err) => {
|
||||
if (err.code === CONNECTION_REFUSED) {
|
||||
logger.error('Make sure you have installed Redis and it is running.', err);
|
||||
deleteUserQueue.on('error', (error) => {
|
||||
if (error.code === CONNECTION_REFUSED) {
|
||||
logger.error(
|
||||
'Make sure you have installed Redis and it is running.',
|
||||
error
|
||||
);
|
||||
|
||||
process.exit();
|
||||
}
|
||||
|
||||
logger.error('Error happened in delete user queue!', error);
|
||||
});
|
||||
|
||||
export default deleteUserQueue;
|
||||
|
@@ -15,11 +15,17 @@ process.on('SIGTERM', async () => {
|
||||
await emailQueue.close();
|
||||
});
|
||||
|
||||
emailQueue.on('error', (err) => {
|
||||
if (err.code === CONNECTION_REFUSED) {
|
||||
logger.error('Make sure you have installed Redis and it is running.', err);
|
||||
emailQueue.on('error', (error) => {
|
||||
if (error.code === CONNECTION_REFUSED) {
|
||||
logger.error(
|
||||
'Make sure you have installed Redis and it is running.',
|
||||
error
|
||||
);
|
||||
|
||||
process.exit();
|
||||
}
|
||||
|
||||
logger.error('Error happened in email queue!', error);
|
||||
});
|
||||
|
||||
export default emailQueue;
|
||||
|
@@ -15,11 +15,17 @@ process.on('SIGTERM', async () => {
|
||||
await flowQueue.close();
|
||||
});
|
||||
|
||||
flowQueue.on('error', (err) => {
|
||||
if (err.code === CONNECTION_REFUSED) {
|
||||
logger.error('Make sure you have installed Redis and it is running.', err);
|
||||
flowQueue.on('error', (error) => {
|
||||
if (error.code === CONNECTION_REFUSED) {
|
||||
logger.error(
|
||||
'Make sure you have installed Redis and it is running.',
|
||||
error
|
||||
);
|
||||
|
||||
process.exit();
|
||||
}
|
||||
|
||||
logger.error('Error happened in flow queue!', error);
|
||||
});
|
||||
|
||||
export default flowQueue;
|
||||
|
@@ -18,11 +18,20 @@ process.on('SIGTERM', async () => {
|
||||
await removeCancelledSubscriptionsQueue.close();
|
||||
});
|
||||
|
||||
removeCancelledSubscriptionsQueue.on('error', (err) => {
|
||||
if (err.code === CONNECTION_REFUSED) {
|
||||
logger.error('Make sure you have installed Redis and it is running.', err);
|
||||
removeCancelledSubscriptionsQueue.on('error', (error) => {
|
||||
if (error.code === CONNECTION_REFUSED) {
|
||||
logger.error(
|
||||
'Make sure you have installed Redis and it is running.',
|
||||
error
|
||||
);
|
||||
|
||||
process.exit();
|
||||
}
|
||||
|
||||
logger.error(
|
||||
'Error happened in remove cancelled subscriptions queue!',
|
||||
error
|
||||
);
|
||||
});
|
||||
|
||||
removeCancelledSubscriptionsQueue.add('remove-cancelled-subscriptions', null, {
|
||||
|
@@ -15,11 +15,17 @@ process.on('SIGTERM', async () => {
|
||||
await triggerQueue.close();
|
||||
});
|
||||
|
||||
triggerQueue.on('error', (err) => {
|
||||
if (err.code === CONNECTION_REFUSED) {
|
||||
logger.error('Make sure you have installed Redis and it is running.', err);
|
||||
triggerQueue.on('error', (error) => {
|
||||
if (error.code === CONNECTION_REFUSED) {
|
||||
logger.error(
|
||||
'Make sure you have installed Redis and it is running.',
|
||||
error
|
||||
);
|
||||
|
||||
process.exit();
|
||||
}
|
||||
|
||||
logger.error('Error happened in trigger queue!', error);
|
||||
});
|
||||
|
||||
export default triggerQueue;
|
||||
|
18
packages/backend/src/routes/api/v1/admin/app-auth-clients.js
Normal file
18
packages/backend/src/routes/api/v1/admin/app-auth-clients.js
Normal file
@@ -0,0 +1,18 @@
|
||||
import { Router } from 'express';
|
||||
import asyncHandler from 'express-async-handler';
|
||||
import { authenticateUser } from '../../../../helpers/authentication.js';
|
||||
import { authorizeAdmin } from '../../../../helpers/authorization.js';
|
||||
import { checkIsEnterprise } from '../../../../helpers/check-is-enterprise.js';
|
||||
import getAdminAppAuthClientsAction from '../../../../controllers/api/v1/admin/app-auth-clients/get-app-auth-client.js';
|
||||
|
||||
const router = Router();
|
||||
|
||||
router.get(
|
||||
'/:appAuthClientId',
|
||||
authenticateUser,
|
||||
authorizeAdmin,
|
||||
checkIsEnterprise,
|
||||
asyncHandler(getAdminAppAuthClientsAction)
|
||||
);
|
||||
|
||||
export default router;
|
18
packages/backend/src/routes/api/v1/admin/permissions.ee.js
Normal file
18
packages/backend/src/routes/api/v1/admin/permissions.ee.js
Normal file
@@ -0,0 +1,18 @@
|
||||
import { Router } from 'express';
|
||||
import asyncHandler from 'express-async-handler';
|
||||
import { authenticateUser } from '../../../../helpers/authentication.js';
|
||||
import { authorizeAdmin } from '../../../../helpers/authorization.js';
|
||||
import { checkIsEnterprise } from '../../../../helpers/check-is-enterprise.js';
|
||||
import getPermissionsCatalogAction from '../../../../controllers/api/v1/admin/permissions/get-permissions-catalog.ee.js';
|
||||
|
||||
const router = Router();
|
||||
|
||||
router.get(
|
||||
'/catalog',
|
||||
authenticateUser,
|
||||
authorizeAdmin,
|
||||
checkIsEnterprise,
|
||||
asyncHandler(getPermissionsCatalogAction)
|
||||
);
|
||||
|
||||
export default router;
|
27
packages/backend/src/routes/api/v1/admin/roles.ee.js
Normal file
27
packages/backend/src/routes/api/v1/admin/roles.ee.js
Normal file
@@ -0,0 +1,27 @@
|
||||
import { Router } from 'express';
|
||||
import asyncHandler from 'express-async-handler';
|
||||
import { authenticateUser } from '../../../../helpers/authentication.js';
|
||||
import { authorizeAdmin } from '../../../../helpers/authorization.js';
|
||||
import { checkIsEnterprise } from '../../../../helpers/check-is-enterprise.js';
|
||||
import getRolesAction from '../../../../controllers/api/v1/admin/roles/get-roles.ee.js';
|
||||
import getRoleAction from '../../../../controllers/api/v1/admin/roles/get-role.ee.js';
|
||||
|
||||
const router = Router();
|
||||
|
||||
router.get(
|
||||
'/',
|
||||
authenticateUser,
|
||||
authorizeAdmin,
|
||||
checkIsEnterprise,
|
||||
asyncHandler(getRolesAction)
|
||||
);
|
||||
|
||||
router.get(
|
||||
'/:roleId',
|
||||
authenticateUser,
|
||||
authorizeAdmin,
|
||||
checkIsEnterprise,
|
||||
asyncHandler(getRoleAction)
|
||||
);
|
||||
|
||||
export default router;
|
@@ -0,0 +1,27 @@
|
||||
import { Router } from 'express';
|
||||
import asyncHandler from 'express-async-handler';
|
||||
import { authenticateUser } from '../../../../helpers/authentication.js';
|
||||
import { authorizeAdmin } from '../../../../helpers/authorization.js';
|
||||
import { checkIsEnterprise } from '../../../../helpers/check-is-enterprise.js';
|
||||
import getSamlAuthProvidersAction from '../../../../controllers/api/v1/admin/saml-auth-providers/get-saml-auth-providers.ee.js';
|
||||
import getSamlAuthProviderAction from '../../../../controllers/api/v1/admin/saml-auth-providers/get-saml-auth-provider.ee.js';
|
||||
|
||||
const router = Router();
|
||||
|
||||
router.get(
|
||||
'/',
|
||||
authenticateUser,
|
||||
authorizeAdmin,
|
||||
checkIsEnterprise,
|
||||
asyncHandler(getSamlAuthProvidersAction)
|
||||
);
|
||||
|
||||
router.get(
|
||||
'/:samlAuthProviderId',
|
||||
authenticateUser,
|
||||
authorizeAdmin,
|
||||
checkIsEnterprise,
|
||||
asyncHandler(getSamlAuthProviderAction)
|
||||
);
|
||||
|
||||
export default router;
|
27
packages/backend/src/routes/api/v1/admin/users.ee.js
Normal file
27
packages/backend/src/routes/api/v1/admin/users.ee.js
Normal file
@@ -0,0 +1,27 @@
|
||||
import { Router } from 'express';
|
||||
import asyncHandler from 'express-async-handler';
|
||||
import { authenticateUser } from '../../../../helpers/authentication.js';
|
||||
import { authorizeAdmin } from '../../../../helpers/authorization.js';
|
||||
import { checkIsEnterprise } from '../../../../helpers/check-is-enterprise.js';
|
||||
import getUsersAction from '../../../../controllers/api/v1/admin/users/get-users.ee.js';
|
||||
import getUserAction from '../../../../controllers/api/v1/admin/users/get-user.ee.js';
|
||||
|
||||
const router = Router();
|
||||
|
||||
router.get(
|
||||
'/',
|
||||
authenticateUser,
|
||||
authorizeAdmin,
|
||||
checkIsEnterprise,
|
||||
asyncHandler(getUsersAction)
|
||||
);
|
||||
|
||||
router.get(
|
||||
'/:userId',
|
||||
authenticateUser,
|
||||
authorizeAdmin,
|
||||
checkIsEnterprise,
|
||||
asyncHandler(getUserAction)
|
||||
);
|
||||
|
||||
export default router;
|
16
packages/backend/src/routes/api/v1/app-auth-clients.js
Normal file
16
packages/backend/src/routes/api/v1/app-auth-clients.js
Normal file
@@ -0,0 +1,16 @@
|
||||
import { Router } from 'express';
|
||||
import asyncHandler from 'express-async-handler';
|
||||
import { authenticateUser } from '../../../helpers/authentication.js';
|
||||
import { checkIsEnterprise } from '../../../helpers/check-is-enterprise.js';
|
||||
import getAppAuthClientAction from '../../../controllers/api/v1/app-auth-clients/get-app-auth-client.js';
|
||||
|
||||
const router = Router();
|
||||
|
||||
router.get(
|
||||
'/:appAuthClientId',
|
||||
authenticateUser,
|
||||
checkIsEnterprise,
|
||||
asyncHandler(getAppAuthClientAction)
|
||||
);
|
||||
|
||||
export default router;
|
10
packages/backend/src/routes/api/v1/apps.js
Normal file
10
packages/backend/src/routes/api/v1/apps.js
Normal file
@@ -0,0 +1,10 @@
|
||||
import { Router } from 'express';
|
||||
import asyncHandler from 'express-async-handler';
|
||||
import { authenticateUser } from '../../../helpers/authentication.js';
|
||||
import getAppAction from '../../../controllers/api/v1/apps/get-app.js';
|
||||
|
||||
const router = Router();
|
||||
|
||||
router.get('/:appKey', authenticateUser, asyncHandler(getAppAction));
|
||||
|
||||
export default router;
|
@@ -1,8 +1,15 @@
|
||||
import { Router } from 'express';
|
||||
import asyncHandler from 'express-async-handler';
|
||||
import versionAction from '../../../controllers/api/v1/automatisch/version.js';
|
||||
import notificationsAction from '../../../controllers/api/v1/automatisch/notifications.js';
|
||||
import infoAction from '../../../controllers/api/v1/automatisch/info.js';
|
||||
import licenseAction from '../../../controllers/api/v1/automatisch/license.js';
|
||||
|
||||
const router = Router();
|
||||
|
||||
router.get('/version', versionAction);
|
||||
router.get('/version', asyncHandler(versionAction));
|
||||
router.get('/notifications', asyncHandler(notificationsAction));
|
||||
router.get('/info', asyncHandler(infoAction));
|
||||
router.get('/license', asyncHandler(licenseAction));
|
||||
|
||||
export default router;
|
||||
|
16
packages/backend/src/routes/api/v1/flows.js
Normal file
16
packages/backend/src/routes/api/v1/flows.js
Normal file
@@ -0,0 +1,16 @@
|
||||
import { Router } from 'express';
|
||||
import asyncHandler from 'express-async-handler';
|
||||
import { authenticateUser } from '../../../helpers/authentication.js';
|
||||
import { authorizeUser } from '../../../helpers/authorization.js';
|
||||
import getFlowAction from '../../../controllers/api/v1/flows/get-flow.js';
|
||||
|
||||
const router = Router();
|
||||
|
||||
router.get(
|
||||
'/:flowId',
|
||||
authenticateUser,
|
||||
authorizeUser,
|
||||
asyncHandler(getFlowAction)
|
||||
);
|
||||
|
||||
export default router;
|
24
packages/backend/src/routes/api/v1/payment.ee.js
Normal file
24
packages/backend/src/routes/api/v1/payment.ee.js
Normal file
@@ -0,0 +1,24 @@
|
||||
import { Router } from 'express';
|
||||
import asyncHandler from 'express-async-handler';
|
||||
import { authenticateUser } from '../../../helpers/authentication.js';
|
||||
import checkIsCloud from '../../../helpers/check-is-cloud.js';
|
||||
import getPlansAction from '../../../controllers/api/v1/payment/get-plans.ee.js';
|
||||
import getPaddleInfoAction from '../../../controllers/api/v1/payment/get-paddle-info.ee.js';
|
||||
|
||||
const router = Router();
|
||||
|
||||
router.get(
|
||||
'/plans',
|
||||
authenticateUser,
|
||||
checkIsCloud,
|
||||
asyncHandler(getPlansAction)
|
||||
);
|
||||
|
||||
router.get(
|
||||
'/paddle-info',
|
||||
authenticateUser,
|
||||
checkIsCloud,
|
||||
asyncHandler(getPaddleInfoAction)
|
||||
);
|
||||
|
||||
export default router;
|
@@ -1,22 +1,26 @@
|
||||
import { Router } from 'express';
|
||||
import asyncHandler from 'express-async-handler';
|
||||
import { authenticateUser } from '../../../helpers/authentication.js';
|
||||
import { authorizeUser } from '../../../helpers/authorization.js';
|
||||
import checkIsCloud from '../../../helpers/check-is-cloud.js';
|
||||
import getCurrentUserAction from '../../../controllers/api/v1/users/get-current-user.js';
|
||||
import getUserAction from '../../../controllers/api/v1/users/get-user.js';
|
||||
import getUsersAction from '../../../controllers/api/v1/users/get-users.js';
|
||||
import getUserTrialAction from '../../../controllers/api/v1/users/get-user-trial.ee.js';
|
||||
import getInvoicesAction from '../../../controllers/api/v1/users/get-invoices.ee.js';
|
||||
|
||||
const router = Router();
|
||||
|
||||
router.get('/', authenticateUser, authorizeUser, getUsersAction);
|
||||
router.get('/me', authenticateUser, getCurrentUserAction);
|
||||
router.get('/:userId', authenticateUser, authorizeUser, getUserAction);
|
||||
router.get('/me', authenticateUser, asyncHandler(getCurrentUserAction));
|
||||
router.get(
|
||||
'/invoices',
|
||||
authenticateUser,
|
||||
checkIsCloud,
|
||||
asyncHandler(getInvoicesAction)
|
||||
);
|
||||
|
||||
router.get(
|
||||
'/:userId/trial',
|
||||
authenticateUser,
|
||||
checkIsCloud,
|
||||
getUserTrialAction
|
||||
asyncHandler(getUserTrialAction)
|
||||
);
|
||||
|
||||
export default router;
|
||||
|
@@ -1,8 +1,9 @@
|
||||
import { Router } from 'express';
|
||||
import asyncHandler from 'express-async-handler';
|
||||
import indexAction from '../controllers/healthcheck/index.js';
|
||||
|
||||
const router = Router();
|
||||
|
||||
router.get('/', indexAction);
|
||||
router.get('/', asyncHandler(indexAction));
|
||||
|
||||
export default router;
|
||||
|
@@ -5,6 +5,15 @@ import paddleRouter from './paddle.ee.js';
|
||||
import healthcheckRouter from './healthcheck.js';
|
||||
import automatischRouter from './api/v1/automatisch.js';
|
||||
import usersRouter from './api/v1/users.js';
|
||||
import paymentRouter from './api/v1/payment.ee.js';
|
||||
import appAuthClientsRouter from './api/v1/app-auth-clients.js';
|
||||
import flowsRouter from './api/v1/flows.js';
|
||||
import appsRouter from './api/v1/apps.js';
|
||||
import samlAuthProvidersRouter 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';
|
||||
import adminAppAuthClientsRouter from './api/v1/admin/app-auth-clients.js';
|
||||
|
||||
const router = Router();
|
||||
|
||||
@@ -14,5 +23,14 @@ router.use('/paddle', paddleRouter);
|
||||
router.use('/healthcheck', healthcheckRouter);
|
||||
router.use('/api/v1/automatisch', automatischRouter);
|
||||
router.use('/api/v1/users', usersRouter);
|
||||
router.use('/api/v1/payment', paymentRouter);
|
||||
router.use('/api/v1/app-auth-clients', appAuthClientsRouter);
|
||||
router.use('/api/v1/flows', flowsRouter);
|
||||
router.use('/api/v1/apps', appsRouter);
|
||||
router.use('/api/v1/admin/saml-auth-providers', samlAuthProvidersRouter);
|
||||
router.use('/api/v1/admin/roles', rolesRouter);
|
||||
router.use('/api/v1/admin/permissions', permissionsRouter);
|
||||
router.use('/api/v1/admin/users', adminUsersRouter);
|
||||
router.use('/api/v1/admin/app-auth-clients', adminAppAuthClientsRouter);
|
||||
|
||||
export default router;
|
||||
|
@@ -1,16 +1,9 @@
|
||||
import { Router } from 'express';
|
||||
import asyncHandler from 'express-async-handler';
|
||||
import webhooksHandler from '../controllers/paddle/webhooks.ee.js';
|
||||
|
||||
const router = Router();
|
||||
|
||||
const exposeError = (handler) => async (req, res, next) => {
|
||||
try {
|
||||
await handler(req, res, next);
|
||||
} catch (err) {
|
||||
next(err);
|
||||
}
|
||||
};
|
||||
|
||||
router.post('/webhooks', exposeError(webhooksHandler));
|
||||
router.post('/webhooks', asyncHandler(webhooksHandler));
|
||||
|
||||
export default router;
|
||||
|
10
packages/backend/src/serializers/app-auth-client.js
Normal file
10
packages/backend/src/serializers/app-auth-client.js
Normal file
@@ -0,0 +1,10 @@
|
||||
const appAuthClientSerializer = (appAuthClient) => {
|
||||
return {
|
||||
id: appAuthClient.id,
|
||||
appConfigId: appAuthClient.appConfigId,
|
||||
name: appAuthClient.name,
|
||||
active: appAuthClient.active,
|
||||
};
|
||||
};
|
||||
|
||||
export default appAuthClientSerializer;
|
22
packages/backend/src/serializers/app-auth-client.test.js
Normal file
22
packages/backend/src/serializers/app-auth-client.test.js
Normal file
@@ -0,0 +1,22 @@
|
||||
import { describe, it, expect, beforeEach } from 'vitest';
|
||||
import { createAppAuthClient } from '../../test/factories/app-auth-client';
|
||||
import appAuthClientSerializer from './app-auth-client';
|
||||
|
||||
describe('appAuthClient serializer', () => {
|
||||
let appAuthClient;
|
||||
|
||||
beforeEach(async () => {
|
||||
appAuthClient = await createAppAuthClient();
|
||||
});
|
||||
|
||||
it('should return app auth client data', async () => {
|
||||
const expectedPayload = {
|
||||
id: appAuthClient.id,
|
||||
appConfigId: appAuthClient.appConfigId,
|
||||
name: appAuthClient.name,
|
||||
active: appAuthClient.active,
|
||||
};
|
||||
|
||||
expect(appAuthClientSerializer(appAuthClient)).toEqual(expectedPayload);
|
||||
});
|
||||
});
|
12
packages/backend/src/serializers/app.js
Normal file
12
packages/backend/src/serializers/app.js
Normal file
@@ -0,0 +1,12 @@
|
||||
const appSerializer = (app) => {
|
||||
return {
|
||||
name: app.name,
|
||||
key: app.key,
|
||||
iconUrl: app.iconUrl,
|
||||
authDocUrl: app.authDocUrl,
|
||||
supportsConnections: app.supportsConnections,
|
||||
primaryColor: app.primaryColor,
|
||||
};
|
||||
};
|
||||
|
||||
export default appSerializer;
|
20
packages/backend/src/serializers/app.test.js
Normal file
20
packages/backend/src/serializers/app.test.js
Normal file
@@ -0,0 +1,20 @@
|
||||
import { describe, it, expect } from 'vitest';
|
||||
import App from '../models/app';
|
||||
import appSerializer from './app';
|
||||
|
||||
describe('appSerializer', () => {
|
||||
it('should return permission data', async () => {
|
||||
const app = await App.findOneByKey('deepl');
|
||||
|
||||
const expectedPayload = {
|
||||
name: app.name,
|
||||
key: app.key,
|
||||
iconUrl: app.iconUrl,
|
||||
authDocUrl: app.authDocUrl,
|
||||
supportsConnections: app.supportsConnections,
|
||||
primaryColor: app.primaryColor,
|
||||
};
|
||||
|
||||
expect(appSerializer(app)).toEqual(expectedPayload);
|
||||
});
|
||||
});
|
18
packages/backend/src/serializers/flow.js
Normal file
18
packages/backend/src/serializers/flow.js
Normal file
@@ -0,0 +1,18 @@
|
||||
import stepSerializer from './step.js';
|
||||
|
||||
const flowSerializer = (flow) => {
|
||||
let flowData = {
|
||||
id: flow.id,
|
||||
name: flow.name,
|
||||
active: flow.active,
|
||||
status: flow.status,
|
||||
};
|
||||
|
||||
if (flow.steps) {
|
||||
flowData.steps = flow.steps.map((step) => stepSerializer(step));
|
||||
}
|
||||
|
||||
return flowData;
|
||||
};
|
||||
|
||||
export default flowSerializer;
|
44
packages/backend/src/serializers/flow.test.js
Normal file
44
packages/backend/src/serializers/flow.test.js
Normal file
@@ -0,0 +1,44 @@
|
||||
import { describe, it, expect, beforeEach } from 'vitest';
|
||||
import { createFlow } from '../../test/factories/flow';
|
||||
import flowSerializer from './flow';
|
||||
import stepSerializer from './step';
|
||||
import { createStep } from '../../test/factories/step';
|
||||
|
||||
describe('flowSerializer', () => {
|
||||
let flow, stepOne, stepTwo;
|
||||
|
||||
beforeEach(async () => {
|
||||
flow = await createFlow();
|
||||
|
||||
stepOne = await createStep({
|
||||
flowId: flow.id,
|
||||
type: 'trigger',
|
||||
});
|
||||
|
||||
stepTwo = await createStep({
|
||||
flowId: flow.id,
|
||||
type: 'action',
|
||||
});
|
||||
});
|
||||
|
||||
it('should return flow data', async () => {
|
||||
const expectedPayload = {
|
||||
id: flow.id,
|
||||
name: flow.name,
|
||||
active: flow.active,
|
||||
status: flow.status,
|
||||
};
|
||||
|
||||
expect(flowSerializer(flow)).toEqual(expectedPayload);
|
||||
});
|
||||
|
||||
it('should return flow data with the steps', async () => {
|
||||
flow.steps = [stepOne, stepTwo];
|
||||
|
||||
const expectedPayload = {
|
||||
steps: [stepSerializer(stepOne), stepSerializer(stepTwo)],
|
||||
};
|
||||
|
||||
expect(flowSerializer(flow)).toMatchObject(expectedPayload);
|
||||
});
|
||||
});
|
@@ -1,11 +1,21 @@
|
||||
import userSerializer from './user.js';
|
||||
import roleSerializer from './role.js';
|
||||
import permissionSerializer from './permission.js';
|
||||
import samlAuthProviderSerializer from './saml-auth-provider.ee.js';
|
||||
import appAuthClientSerializer from './app-auth-client.js';
|
||||
import flowSerializer from './flow.js';
|
||||
import stepSerializer from './step.js';
|
||||
import appSerializer from './app.js';
|
||||
|
||||
const serializers = {
|
||||
User: userSerializer,
|
||||
Role: roleSerializer,
|
||||
Permission: permissionSerializer,
|
||||
SamlAuthProvider: samlAuthProviderSerializer,
|
||||
AppAuthClient: appAuthClientSerializer,
|
||||
Flow: flowSerializer,
|
||||
Step: stepSerializer,
|
||||
App: appSerializer,
|
||||
};
|
||||
|
||||
export default serializers;
|
||||
|
@@ -5,8 +5,8 @@ const permissionSerializer = (permission) => {
|
||||
action: permission.action,
|
||||
subject: permission.subject,
|
||||
conditions: permission.conditions,
|
||||
createdAt: permission.createdAt,
|
||||
updatedAt: permission.updatedAt,
|
||||
createdAt: permission.createdAt.getTime(),
|
||||
updatedAt: permission.updatedAt.getTime(),
|
||||
};
|
||||
};
|
||||
|
||||
|
@@ -16,8 +16,8 @@ describe('permissionSerializer', () => {
|
||||
action: permission.action,
|
||||
subject: permission.subject,
|
||||
conditions: permission.conditions,
|
||||
createdAt: permission.createdAt,
|
||||
updatedAt: permission.updatedAt,
|
||||
createdAt: permission.createdAt.getTime(),
|
||||
updatedAt: permission.updatedAt.getTime(),
|
||||
};
|
||||
|
||||
expect(permissionSerializer(permission)).toEqual(expectedPayload);
|
||||
|
@@ -1,13 +1,23 @@
|
||||
import permissionSerializer from './permission.js';
|
||||
|
||||
const roleSerializer = (role) => {
|
||||
return {
|
||||
let roleData = {
|
||||
id: role.id,
|
||||
name: role.name,
|
||||
key: role.key,
|
||||
description: role.description,
|
||||
createdAt: role.createdAt,
|
||||
updatedAt: role.updatedAt,
|
||||
createdAt: role.createdAt.getTime(),
|
||||
updatedAt: role.updatedAt.getTime(),
|
||||
isAdmin: role.isAdmin,
|
||||
};
|
||||
|
||||
if (role.permissions) {
|
||||
roleData.permissions = role.permissions.map((permission) =>
|
||||
permissionSerializer(permission)
|
||||
);
|
||||
}
|
||||
|
||||
return roleData;
|
||||
};
|
||||
|
||||
export default roleSerializer;
|
||||
|
@@ -1,12 +1,26 @@
|
||||
import { describe, it, expect, beforeEach } from 'vitest';
|
||||
import { createRole } from '../../test/factories/role';
|
||||
import roleSerializer from './role';
|
||||
import permissionSerializer from './permission';
|
||||
import { createPermission } from '../../test/factories/permission';
|
||||
|
||||
describe('roleSerializer', () => {
|
||||
let role;
|
||||
let role, permissionOne, permissionTwo;
|
||||
|
||||
beforeEach(async () => {
|
||||
role = await createRole();
|
||||
|
||||
permissionOne = await createPermission({
|
||||
roleId: role.id,
|
||||
action: 'read',
|
||||
subject: 'User',
|
||||
});
|
||||
|
||||
permissionTwo = await createPermission({
|
||||
roleId: role.id,
|
||||
action: 'read',
|
||||
subject: 'Role',
|
||||
});
|
||||
});
|
||||
|
||||
it('should return role data', async () => {
|
||||
@@ -15,11 +29,24 @@ describe('roleSerializer', () => {
|
||||
name: role.name,
|
||||
key: role.key,
|
||||
description: role.description,
|
||||
createdAt: role.createdAt,
|
||||
updatedAt: role.updatedAt,
|
||||
createdAt: role.createdAt.getTime(),
|
||||
updatedAt: role.updatedAt.getTime(),
|
||||
isAdmin: role.isAdmin,
|
||||
};
|
||||
|
||||
expect(roleSerializer(role)).toEqual(expectedPayload);
|
||||
});
|
||||
|
||||
it('should return role data with the permissions', async () => {
|
||||
role.permissions = [permissionOne, permissionTwo];
|
||||
|
||||
const expectedPayload = {
|
||||
permissions: [
|
||||
permissionSerializer(permissionOne),
|
||||
permissionSerializer(permissionTwo),
|
||||
],
|
||||
};
|
||||
|
||||
expect(roleSerializer(role)).toMatchObject(expectedPayload);
|
||||
});
|
||||
});
|
||||
|
18
packages/backend/src/serializers/saml-auth-provider.ee.js
Normal file
18
packages/backend/src/serializers/saml-auth-provider.ee.js
Normal file
@@ -0,0 +1,18 @@
|
||||
const samlAuthProviderSerializer = (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 samlAuthProviderSerializer;
|
@@ -0,0 +1,32 @@
|
||||
import { describe, it, expect, beforeEach } from 'vitest';
|
||||
import { createSamlAuthProvider } from '../../test/factories/saml-auth-provider.ee.js';
|
||||
import samlAuthProviderSerializer from './saml-auth-provider.ee.js';
|
||||
|
||||
describe('samlAuthProviderSerializer', () => {
|
||||
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(samlAuthProviderSerializer(samlAuthProvider)).toEqual(
|
||||
expectedPayload
|
||||
);
|
||||
});
|
||||
});
|
15
packages/backend/src/serializers/step.js
Normal file
15
packages/backend/src/serializers/step.js
Normal file
@@ -0,0 +1,15 @@
|
||||
const stepSerializer = (step) => {
|
||||
return {
|
||||
id: step.id,
|
||||
type: step.type,
|
||||
key: step.key,
|
||||
appKey: step.appKey,
|
||||
iconUrl: step.iconUrl,
|
||||
webhookUrl: step.webhookUrl,
|
||||
status: step.status,
|
||||
position: step.position,
|
||||
parameters: step.parameters,
|
||||
};
|
||||
};
|
||||
|
||||
export default stepSerializer;
|
27
packages/backend/src/serializers/step.test.js
Normal file
27
packages/backend/src/serializers/step.test.js
Normal file
@@ -0,0 +1,27 @@
|
||||
import { describe, it, expect, beforeEach } from 'vitest';
|
||||
import { createStep } from '../../test/factories/step';
|
||||
import stepSerializer from './step';
|
||||
|
||||
describe('stepSerializer', () => {
|
||||
let step;
|
||||
|
||||
beforeEach(async () => {
|
||||
step = await createStep();
|
||||
});
|
||||
|
||||
it('should return step data', async () => {
|
||||
const expectedPayload = {
|
||||
id: step.id,
|
||||
type: step.type,
|
||||
key: step.key,
|
||||
appKey: step.appKey,
|
||||
iconUrl: step.iconUrl,
|
||||
webhookUrl: step.webhookUrl,
|
||||
status: step.status,
|
||||
position: step.position,
|
||||
parameters: step.parameters,
|
||||
};
|
||||
|
||||
expect(stepSerializer(step)).toEqual(expectedPayload);
|
||||
});
|
||||
});
|
@@ -6,10 +6,9 @@ const userSerializer = (user) => {
|
||||
let userData = {
|
||||
id: user.id,
|
||||
email: user.email,
|
||||
createdAt: user.createdAt,
|
||||
updatedAt: user.updatedAt,
|
||||
createdAt: user.createdAt.getTime(),
|
||||
updatedAt: user.updatedAt.getTime(),
|
||||
fullName: user.fullName,
|
||||
roleId: user.roleId,
|
||||
};
|
||||
|
||||
if (user.role) {
|
||||
|
@@ -4,6 +4,8 @@ import appConfig from '../config/app';
|
||||
import { createUser } from '../../test/factories/user';
|
||||
import { createPermission } from '../../test/factories/permission';
|
||||
import userSerializer from './user';
|
||||
import roleSerializer from './role';
|
||||
import permissionSerializer from './permission';
|
||||
|
||||
describe('userSerializer', () => {
|
||||
let user, role, permissionOne, permissionTwo;
|
||||
@@ -29,12 +31,11 @@ describe('userSerializer', () => {
|
||||
vi.spyOn(appConfig, 'isCloud', 'get').mockReturnValue(false);
|
||||
|
||||
const expectedPayload = {
|
||||
createdAt: user.createdAt,
|
||||
createdAt: user.createdAt.getTime(),
|
||||
email: user.email,
|
||||
fullName: user.fullName,
|
||||
id: user.id,
|
||||
roleId: user.roleId,
|
||||
updatedAt: user.updatedAt,
|
||||
updatedAt: user.updatedAt.getTime(),
|
||||
};
|
||||
|
||||
expect(userSerializer(user)).toEqual(expectedPayload);
|
||||
@@ -44,7 +45,7 @@ describe('userSerializer', () => {
|
||||
user.role = role;
|
||||
|
||||
const expectedPayload = {
|
||||
role,
|
||||
role: roleSerializer(role),
|
||||
};
|
||||
|
||||
expect(userSerializer(user)).toMatchObject(expectedPayload);
|
||||
@@ -54,7 +55,10 @@ describe('userSerializer', () => {
|
||||
user.permissions = [permissionOne, permissionTwo];
|
||||
|
||||
const expectedPayload = {
|
||||
permissions: [permissionOne, permissionTwo],
|
||||
permissions: [
|
||||
permissionSerializer(permissionOne),
|
||||
permissionSerializer(permissionTwo),
|
||||
],
|
||||
};
|
||||
|
||||
expect(userSerializer(user)).toMatchObject(expectedPayload);
|
||||
@@ -63,7 +67,7 @@ describe('userSerializer', () => {
|
||||
it('should return user data with trial expiry date', async () => {
|
||||
vi.spyOn(appConfig, 'isCloud', 'get').mockReturnValue(true);
|
||||
|
||||
await user.$query().patch({
|
||||
await user.$query().patchAndFetch({
|
||||
trialExpiryDate: DateTime.now().plus({ days: 30 }).toISODate(),
|
||||
});
|
||||
|
||||
|
25
packages/backend/test/factories/app-auth-client.js
Normal file
25
packages/backend/test/factories/app-auth-client.js
Normal file
@@ -0,0 +1,25 @@
|
||||
import { faker } from '@faker-js/faker';
|
||||
import { createAppConfig } from './app-config.js';
|
||||
import AppAuthClient from '../../src/models/app-auth-client';
|
||||
|
||||
const formattedAuthDefaults = {
|
||||
oAuthRedirectUrl: faker.internet.url(),
|
||||
instanceUrl: faker.internet.url(),
|
||||
clientId: faker.string.uuid(),
|
||||
clientSecret: faker.string.uuid(),
|
||||
};
|
||||
|
||||
export const createAppAuthClient = async (params = {}) => {
|
||||
params.name = params?.name || faker.person.fullName();
|
||||
params.id = params?.id || faker.string.uuid();
|
||||
params.appConfigId = params?.appConfigId || (await createAppConfig()).id;
|
||||
params.active = params?.active ?? true;
|
||||
params.formattedAuthDefaults =
|
||||
params?.formattedAuthDefaults || formattedAuthDefaults;
|
||||
|
||||
const appAuthClient = await AppAuthClient.query()
|
||||
.insert(params)
|
||||
.returning('*');
|
||||
|
||||
return appAuthClient;
|
||||
};
|
13
packages/backend/test/factories/app-config.js
Normal file
13
packages/backend/test/factories/app-config.js
Normal file
@@ -0,0 +1,13 @@
|
||||
import AppConfig from '../../src/models/app-config.js';
|
||||
|
||||
export const createAppConfig = async (params = {}) => {
|
||||
const appConfigData = {
|
||||
key: params?.key || 'gitlab',
|
||||
};
|
||||
|
||||
const appConfig = await AppConfig.query()
|
||||
.insert(appConfigData)
|
||||
.returning('*');
|
||||
|
||||
return appConfig;
|
||||
};
|
33
packages/backend/test/factories/saml-auth-provider.ee.js
Normal file
33
packages/backend/test/factories/saml-auth-provider.ee.js
Normal file
@@ -0,0 +1,33 @@
|
||||
import { createRole } from './role';
|
||||
import SamlAuthProvider from '../../src/models/saml-auth-provider.ee.js';
|
||||
|
||||
export const createSamlAuthProvider = async (params = {}) => {
|
||||
params.name = params?.name || 'Keycloak SAML';
|
||||
params.certificate = params?.certificate || 'certificate';
|
||||
params.signatureAlgorithm = params?.signatureAlgorithm || 'sha512';
|
||||
|
||||
params.entryPoint =
|
||||
params?.entryPoint ||
|
||||
'https://example.com/auth/realms/automatisch/protocol/saml';
|
||||
|
||||
params.issuer = params?.issuer || 'automatisch-client';
|
||||
|
||||
params.firstnameAttributeName =
|
||||
params?.firstnameAttributeName || 'urn:oid:2.1.1.42';
|
||||
|
||||
params.surnameAttributeName =
|
||||
params?.surnameAttributeName || 'urn:oid:2.1.1.4';
|
||||
|
||||
params.emailAttributeName =
|
||||
params?.emailAttributeName || 'urn:oid:1.1.2342.19200300.100.1.1';
|
||||
|
||||
params.roleAttributeName = params?.roleAttributeName || 'Role';
|
||||
params.defaultRoleId = params?.defaultRoleId || (await createRole()).id;
|
||||
params.active = params?.active || true;
|
||||
|
||||
const samlAuthProvider = await SamlAuthProvider.query()
|
||||
.insert(params)
|
||||
.returning('*');
|
||||
|
||||
return samlAuthProvider;
|
||||
};
|
@@ -0,0 +1,19 @@
|
||||
const getAdminAppAuthClientMock = (appAuthClient) => {
|
||||
return {
|
||||
data: {
|
||||
appConfigId: appAuthClient.appConfigId,
|
||||
name: appAuthClient.name,
|
||||
id: appAuthClient.id,
|
||||
active: appAuthClient.active,
|
||||
},
|
||||
meta: {
|
||||
count: 1,
|
||||
currentPage: null,
|
||||
isArray: false,
|
||||
totalPages: null,
|
||||
type: 'AppAuthClient',
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
export default getAdminAppAuthClientMock;
|
@@ -0,0 +1,64 @@
|
||||
const getPermissionsCatalogMock = async () => {
|
||||
const data = {
|
||||
actions: [
|
||||
{
|
||||
key: 'create',
|
||||
label: 'Create',
|
||||
subjects: ['Connection', 'Flow'],
|
||||
},
|
||||
{
|
||||
key: 'read',
|
||||
label: 'Read',
|
||||
subjects: ['Connection', 'Execution', 'Flow'],
|
||||
},
|
||||
{
|
||||
key: 'update',
|
||||
label: 'Update',
|
||||
subjects: ['Connection', 'Flow'],
|
||||
},
|
||||
{
|
||||
key: 'delete',
|
||||
label: 'Delete',
|
||||
subjects: ['Connection', 'Flow'],
|
||||
},
|
||||
{
|
||||
key: 'publish',
|
||||
label: 'Publish',
|
||||
subjects: ['Flow'],
|
||||
},
|
||||
],
|
||||
conditions: [
|
||||
{
|
||||
key: 'isCreator',
|
||||
label: 'Is creator',
|
||||
},
|
||||
],
|
||||
subjects: [
|
||||
{
|
||||
key: 'Connection',
|
||||
label: 'Connection',
|
||||
},
|
||||
{
|
||||
key: 'Flow',
|
||||
label: 'Flow',
|
||||
},
|
||||
{
|
||||
key: 'Execution',
|
||||
label: 'Execution',
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
return {
|
||||
data: data,
|
||||
meta: {
|
||||
count: 1,
|
||||
currentPage: null,
|
||||
isArray: false,
|
||||
totalPages: null,
|
||||
type: 'Object',
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
export default getPermissionsCatalogMock;
|
@@ -0,0 +1,33 @@
|
||||
const getRoleMock = async (role, permissions) => {
|
||||
const data = {
|
||||
id: role.id,
|
||||
key: role.key,
|
||||
name: role.name,
|
||||
isAdmin: role.isAdmin,
|
||||
description: role.description,
|
||||
createdAt: role.createdAt.getTime(),
|
||||
updatedAt: role.updatedAt.getTime(),
|
||||
permissions: permissions.map((permission) => ({
|
||||
id: permission.id,
|
||||
action: permission.action,
|
||||
conditions: permission.conditions,
|
||||
roleId: permission.roleId,
|
||||
subject: permission.subject,
|
||||
createdAt: permission.createdAt.getTime(),
|
||||
updatedAt: permission.updatedAt.getTime(),
|
||||
})),
|
||||
};
|
||||
|
||||
return {
|
||||
data: data,
|
||||
meta: {
|
||||
count: 1,
|
||||
currentPage: null,
|
||||
isArray: false,
|
||||
totalPages: null,
|
||||
type: 'Role',
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
export default getRoleMock;
|
@@ -0,0 +1,26 @@
|
||||
const getRolesMock = async (roles) => {
|
||||
const data = roles.map((role) => {
|
||||
return {
|
||||
id: role.id,
|
||||
key: role.key,
|
||||
name: role.name,
|
||||
isAdmin: role.isAdmin,
|
||||
description: role.description,
|
||||
createdAt: role.createdAt.getTime(),
|
||||
updatedAt: role.updatedAt.getTime(),
|
||||
};
|
||||
});
|
||||
|
||||
return {
|
||||
data: data,
|
||||
meta: {
|
||||
count: data.length,
|
||||
currentPage: null,
|
||||
isArray: true,
|
||||
totalPages: null,
|
||||
type: 'Role',
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
export default getRolesMock;
|
@@ -0,0 +1,29 @@
|
||||
const getSamlAuthProviderMock = async (samlAuthProvider) => {
|
||||
const data = {
|
||||
active: samlAuthProvider.active,
|
||||
certificate: samlAuthProvider.certificate,
|
||||
defaultRoleId: samlAuthProvider.defaultRoleId,
|
||||
emailAttributeName: samlAuthProvider.emailAttributeName,
|
||||
entryPoint: samlAuthProvider.entryPoint,
|
||||
firstnameAttributeName: samlAuthProvider.firstnameAttributeName,
|
||||
id: samlAuthProvider.id,
|
||||
issuer: samlAuthProvider.issuer,
|
||||
name: samlAuthProvider.name,
|
||||
roleAttributeName: samlAuthProvider.roleAttributeName,
|
||||
signatureAlgorithm: samlAuthProvider.signatureAlgorithm,
|
||||
surnameAttributeName: samlAuthProvider.surnameAttributeName,
|
||||
};
|
||||
|
||||
return {
|
||||
data: data,
|
||||
meta: {
|
||||
count: 1,
|
||||
currentPage: null,
|
||||
isArray: false,
|
||||
totalPages: null,
|
||||
type: 'SamlAuthProvider',
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
export default getSamlAuthProviderMock;
|
@@ -0,0 +1,31 @@
|
||||
const getSamlAuthProvidersMock = async (samlAuthProviders) => {
|
||||
const data = samlAuthProviders.map((samlAuthProvider) => {
|
||||
return {
|
||||
active: samlAuthProvider.active,
|
||||
certificate: samlAuthProvider.certificate,
|
||||
defaultRoleId: samlAuthProvider.defaultRoleId,
|
||||
emailAttributeName: samlAuthProvider.emailAttributeName,
|
||||
entryPoint: samlAuthProvider.entryPoint,
|
||||
firstnameAttributeName: samlAuthProvider.firstnameAttributeName,
|
||||
id: samlAuthProvider.id,
|
||||
issuer: samlAuthProvider.issuer,
|
||||
name: samlAuthProvider.name,
|
||||
roleAttributeName: samlAuthProvider.roleAttributeName,
|
||||
signatureAlgorithm: samlAuthProvider.signatureAlgorithm,
|
||||
surnameAttributeName: samlAuthProvider.surnameAttributeName,
|
||||
};
|
||||
});
|
||||
|
||||
return {
|
||||
data: data,
|
||||
meta: {
|
||||
count: data.length,
|
||||
currentPage: null,
|
||||
isArray: true,
|
||||
totalPages: null,
|
||||
type: 'SamlAuthProvider',
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
export default getSamlAuthProvidersMock;
|
@@ -1,22 +1,21 @@
|
||||
const getUserMock = (currentUser, role) => {
|
||||
return {
|
||||
data: {
|
||||
createdAt: currentUser.createdAt.toISOString(),
|
||||
createdAt: currentUser.createdAt.getTime(),
|
||||
email: currentUser.email,
|
||||
fullName: currentUser.fullName,
|
||||
id: currentUser.id,
|
||||
role: {
|
||||
createdAt: role.createdAt.toISOString(),
|
||||
createdAt: role.createdAt.getTime(),
|
||||
description: null,
|
||||
id: role.id,
|
||||
isAdmin: role.isAdmin,
|
||||
key: role.key,
|
||||
name: role.name,
|
||||
updatedAt: role.updatedAt.toISOString(),
|
||||
updatedAt: role.updatedAt.getTime(),
|
||||
},
|
||||
roleId: role.id,
|
||||
trialExpiryDate: currentUser.trialExpiryDate.toISOString(),
|
||||
updatedAt: currentUser.updatedAt.toISOString(),
|
||||
updatedAt: currentUser.updatedAt.getTime(),
|
||||
},
|
||||
meta: {
|
||||
count: 1,
|
@@ -1,25 +1,25 @@
|
||||
const getUsersMock = async (users, roles) => {
|
||||
const data = users.map((user) => {
|
||||
const role = roles.find((r) => r.id === user.roleId);
|
||||
|
||||
return {
|
||||
createdAt: user.createdAt.toISOString(),
|
||||
createdAt: user.createdAt.getTime(),
|
||||
email: user.email,
|
||||
fullName: user.fullName,
|
||||
id: user.id,
|
||||
role: role
|
||||
? {
|
||||
createdAt: role.createdAt.toISOString(),
|
||||
createdAt: role.createdAt.getTime(),
|
||||
description: role.description,
|
||||
id: role.id,
|
||||
isAdmin: role.isAdmin,
|
||||
key: role.key,
|
||||
name: role.name,
|
||||
updatedAt: role.updatedAt.toISOString(),
|
||||
updatedAt: role.updatedAt.getTime(),
|
||||
}
|
||||
: null, // Fallback to null if role not found
|
||||
roleId: user.roleId,
|
||||
: null,
|
||||
trialExpiryDate: user.trialExpiryDate.toISOString(),
|
||||
updatedAt: user.updatedAt.toISOString(),
|
||||
updatedAt: user.updatedAt.getTime(),
|
||||
};
|
||||
});
|
||||
|
21
packages/backend/test/mocks/rest/api/v1/apps/get-app.js
Normal file
21
packages/backend/test/mocks/rest/api/v1/apps/get-app.js
Normal file
@@ -0,0 +1,21 @@
|
||||
const getAppMock = (app) => {
|
||||
return {
|
||||
data: {
|
||||
authDocUrl: app.authDocUrl,
|
||||
iconUrl: app.iconUrl,
|
||||
key: app.key,
|
||||
name: app.name,
|
||||
primaryColor: app.primaryColor,
|
||||
supportsConnections: app.supportsConnections,
|
||||
},
|
||||
meta: {
|
||||
count: 1,
|
||||
currentPage: null,
|
||||
isArray: false,
|
||||
totalPages: null,
|
||||
type: 'Object',
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
export default getAppMock;
|
18
packages/backend/test/mocks/rest/api/v1/automatisch/info.js
Normal file
18
packages/backend/test/mocks/rest/api/v1/automatisch/info.js
Normal file
@@ -0,0 +1,18 @@
|
||||
const infoMock = () => {
|
||||
return {
|
||||
data: {
|
||||
isCloud: false,
|
||||
isMation: false,
|
||||
isEnterprise: true,
|
||||
},
|
||||
meta: {
|
||||
count: 1,
|
||||
currentPage: null,
|
||||
isArray: false,
|
||||
totalPages: null,
|
||||
type: 'Object',
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
export default infoMock;
|
@@ -0,0 +1,19 @@
|
||||
const licenseMock = () => {
|
||||
return {
|
||||
data: {
|
||||
expireAt: '2025-12-31T23:59:59Z',
|
||||
id: '123',
|
||||
name: 'license-name',
|
||||
verified: true,
|
||||
},
|
||||
meta: {
|
||||
count: 1,
|
||||
currentPage: null,
|
||||
isArray: false,
|
||||
totalPages: null,
|
||||
type: 'Object',
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
export default licenseMock;
|
32
packages/backend/test/mocks/rest/api/v1/flows/get-flow.js
Normal file
32
packages/backend/test/mocks/rest/api/v1/flows/get-flow.js
Normal file
@@ -0,0 +1,32 @@
|
||||
const getFlowMock = async (flow, steps) => {
|
||||
const data = {
|
||||
active: flow.active,
|
||||
id: flow.id,
|
||||
name: flow.name,
|
||||
status: flow.active ? 'published' : 'draft',
|
||||
steps: steps.map((step) => ({
|
||||
appKey: step.appKey,
|
||||
iconUrl: step.iconUrl,
|
||||
id: step.id,
|
||||
key: step.key,
|
||||
parameters: step.parameters,
|
||||
position: step.position,
|
||||
status: step.status,
|
||||
type: step.type,
|
||||
webhookUrl: step.webhookUrl,
|
||||
})),
|
||||
};
|
||||
|
||||
return {
|
||||
data: data,
|
||||
meta: {
|
||||
count: 1,
|
||||
currentPage: null,
|
||||
isArray: false,
|
||||
totalPages: null,
|
||||
type: 'Flow',
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
export default getFlowMock;
|
@@ -0,0 +1,19 @@
|
||||
const getAppAuthClientMock = (appAuthClient) => {
|
||||
return {
|
||||
data: {
|
||||
name: appAuthClient.name,
|
||||
id: appAuthClient.id,
|
||||
appConfigId: appAuthClient.appConfigId,
|
||||
active: appAuthClient.active,
|
||||
},
|
||||
meta: {
|
||||
count: 1,
|
||||
currentPage: null,
|
||||
isArray: false,
|
||||
totalPages: null,
|
||||
type: 'AppAuthClient',
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
export default getAppAuthClientMock;
|
@@ -0,0 +1,17 @@
|
||||
const getPaddleInfoMock = async () => {
|
||||
return {
|
||||
data: {
|
||||
sandbox: true,
|
||||
vendorId: 'sampleVendorId',
|
||||
},
|
||||
meta: {
|
||||
count: 1,
|
||||
currentPage: null,
|
||||
isArray: false,
|
||||
totalPages: null,
|
||||
type: 'Object',
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
export default getPaddleInfoMock;
|
22
packages/backend/test/mocks/rest/api/v1/payment/get-plans.js
Normal file
22
packages/backend/test/mocks/rest/api/v1/payment/get-plans.js
Normal file
@@ -0,0 +1,22 @@
|
||||
const getPaymentPlansMock = async () => {
|
||||
return {
|
||||
data: [
|
||||
{
|
||||
limit: '10,000',
|
||||
name: '10k - monthly',
|
||||
price: '€20',
|
||||
productId: '47384',
|
||||
quota: 10000,
|
||||
},
|
||||
],
|
||||
meta: {
|
||||
count: 1,
|
||||
currentPage: null,
|
||||
isArray: true,
|
||||
totalPages: null,
|
||||
type: 'Object',
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
export default getPaymentPlansMock;
|
@@ -1,23 +1,22 @@
|
||||
const getCurrentUserMock = (currentUser, role) => {
|
||||
return {
|
||||
data: {
|
||||
createdAt: currentUser.createdAt.toISOString(),
|
||||
createdAt: currentUser.createdAt.getTime(),
|
||||
email: currentUser.email,
|
||||
fullName: currentUser.fullName,
|
||||
id: currentUser.id,
|
||||
permissions: [],
|
||||
role: {
|
||||
createdAt: role.createdAt.toISOString(),
|
||||
createdAt: role.createdAt.getTime(),
|
||||
description: null,
|
||||
id: role.id,
|
||||
isAdmin: role.isAdmin,
|
||||
key: role.key,
|
||||
name: role.name,
|
||||
updatedAt: role.updatedAt.toISOString(),
|
||||
updatedAt: role.updatedAt.getTime(),
|
||||
},
|
||||
roleId: role.id,
|
||||
trialExpiryDate: currentUser.trialExpiryDate.toISOString(),
|
||||
updatedAt: currentUser.updatedAt.toISOString(),
|
||||
updatedAt: currentUser.updatedAt.getTime(),
|
||||
},
|
||||
meta: {
|
||||
count: 1,
|
||||
|
@@ -0,0 +1,14 @@
|
||||
const getInvoicesMock = async (invoices) => {
|
||||
return {
|
||||
data: invoices,
|
||||
meta: {
|
||||
count: invoices.length,
|
||||
currentPage: null,
|
||||
isArray: true,
|
||||
totalPages: null,
|
||||
type: 'Object',
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
export default getInvoicesMock;
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user