diff --git a/packages/backend/src/controllers/api/v1/admin/users/create-user.js b/packages/backend/src/controllers/api/v1/admin/users/create-user.js index 9eacd69a..07951bef 100644 --- a/packages/backend/src/controllers/api/v1/admin/users/create-user.js +++ b/packages/backend/src/controllers/api/v1/admin/users/create-user.js @@ -6,7 +6,7 @@ export default async (request, response) => { const user = await User.query().insertAndFetch(await userParams(request)); await user.sendInvitationEmail(); - renderObject(response, user, { status: 201 }); + renderObject(response, user, { status: 201, serializer: 'AdminUser' }); }; const userParams = async (request) => { diff --git a/packages/backend/src/controllers/api/v1/admin/users/create-user.test.js b/packages/backend/src/controllers/api/v1/admin/users/create-user.test.js index 39a85940..b199eeff 100644 --- a/packages/backend/src/controllers/api/v1/admin/users/create-user.test.js +++ b/packages/backend/src/controllers/api/v1/admin/users/create-user.test.js @@ -6,7 +6,7 @@ import User from '../../../../../models/user.js'; import Role from '../../../../../models/role.js'; import { createUser } from '../../../../../../test/factories/user.js'; import { createRole } from '../../../../../../test/factories/role.js'; -import createUserMock from '../../../../../../test/mocks/rest/api/v1/users/create-user.js'; +import createUserMock from '../../../../../../test/mocks/rest/api/v1/admin/users/create-user.js'; describe('POST /api/v1/admin/users', () => { let currentUser, adminRole, token; diff --git a/packages/backend/src/models/user.js b/packages/backend/src/models/user.js index c351fb91..38960fbd 100644 --- a/packages/backend/src/models/user.js +++ b/packages/backend/src/models/user.js @@ -180,6 +180,10 @@ class User extends Base { }, }); + static get virtualAttributes() { + return ['acceptInvitationUrl']; + } + get authorizedFlows() { const conditions = this.can('read', 'Flow'); return conditions.isCreator ? this.$relatedQuery('flows') : Flow.query(); @@ -204,6 +208,10 @@ class User extends Base { : Execution.query(); } + get acceptInvitationUrl() { + return `${appConfig.webAppUrl}/accept-invitation?token=${this.invitationToken}`; + } + static async authenticate(email, password) { const user = await User.query().findOne({ email: email?.toLowerCase() || null, @@ -362,7 +370,6 @@ class User extends Base { await this.generateInvitationToken(); const jobName = `Invitation Email - ${this.id}`; - const acceptInvitationUrl = `${appConfig.webAppUrl}/accept-invitation?token=${this.invitationToken}`; const jobPayload = { email: this.email, @@ -370,7 +377,7 @@ class User extends Base { template: 'invitation-instructions', params: { fullName: this.fullName, - acceptInvitationUrl, + acceptInvitationUrl: this.acceptInvitationUrl, }, }; diff --git a/packages/backend/src/serializers/admin/user.js b/packages/backend/src/serializers/admin/user.js new file mode 100644 index 00000000..7620c3f1 --- /dev/null +++ b/packages/backend/src/serializers/admin/user.js @@ -0,0 +1,11 @@ +import userSerializer from '../user.js'; + +const adminUserSerializer = (user) => { + const userData = userSerializer(user); + + userData.acceptInvitationUrl = user.acceptInvitationUrl; + + return userData; +}; + +export default adminUserSerializer; diff --git a/packages/backend/src/serializers/index.js b/packages/backend/src/serializers/index.js index 28b98e1e..971c4ded 100644 --- a/packages/backend/src/serializers/index.js +++ b/packages/backend/src/serializers/index.js @@ -16,8 +16,10 @@ import actionSerializer from './action.js'; import executionSerializer from './execution.js'; import executionStepSerializer from './execution-step.js'; import subscriptionSerializer from './subscription.ee.js'; +import adminUserSerializer from './admin/user.js'; const serializers = { + AdminUser: adminUserSerializer, User: userSerializer, Role: roleSerializer, Permission: permissionSerializer, diff --git a/packages/backend/test/mocks/rest/api/v1/admin/users/create-user.js b/packages/backend/test/mocks/rest/api/v1/admin/users/create-user.js new file mode 100644 index 00000000..30aaef28 --- /dev/null +++ b/packages/backend/test/mocks/rest/api/v1/admin/users/create-user.js @@ -0,0 +1,30 @@ +import appConfig from '../../../../../../../src/config/app.js'; + +const createUserMock = (user) => { + const userData = { + createdAt: user.createdAt.getTime(), + email: user.email, + fullName: user.fullName, + id: user.id, + status: user.status, + updatedAt: user.updatedAt.getTime(), + acceptInvitationUrl: user.acceptInvitationUrl, + }; + + if (appConfig.isCloud && user.trialExpiryDate) { + userData.trialExpiryDate = user.trialExpiryDate.toISOString(); + } + + return { + data: userData, + meta: { + count: 1, + currentPage: null, + isArray: false, + totalPages: null, + type: 'User', + }, + }; +}; + +export default createUserMock;