feat: add admin user serializer with accept invitation url
This commit is contained in:
@@ -6,7 +6,7 @@ export default async (request, response) => {
|
|||||||
const user = await User.query().insertAndFetch(await userParams(request));
|
const user = await User.query().insertAndFetch(await userParams(request));
|
||||||
await user.sendInvitationEmail();
|
await user.sendInvitationEmail();
|
||||||
|
|
||||||
renderObject(response, user, { status: 201 });
|
renderObject(response, user, { status: 201, serializer: 'AdminUser' });
|
||||||
};
|
};
|
||||||
|
|
||||||
const userParams = async (request) => {
|
const userParams = async (request) => {
|
||||||
|
@@ -6,7 +6,7 @@ import User from '../../../../../models/user.js';
|
|||||||
import Role from '../../../../../models/role.js';
|
import Role from '../../../../../models/role.js';
|
||||||
import { createUser } from '../../../../../../test/factories/user.js';
|
import { createUser } from '../../../../../../test/factories/user.js';
|
||||||
import { createRole } from '../../../../../../test/factories/role.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', () => {
|
describe('POST /api/v1/admin/users', () => {
|
||||||
let currentUser, adminRole, token;
|
let currentUser, adminRole, token;
|
||||||
|
@@ -180,6 +180,10 @@ class User extends Base {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
static get virtualAttributes() {
|
||||||
|
return ['acceptInvitationUrl'];
|
||||||
|
}
|
||||||
|
|
||||||
get authorizedFlows() {
|
get authorizedFlows() {
|
||||||
const conditions = this.can('read', 'Flow');
|
const conditions = this.can('read', 'Flow');
|
||||||
return conditions.isCreator ? this.$relatedQuery('flows') : Flow.query();
|
return conditions.isCreator ? this.$relatedQuery('flows') : Flow.query();
|
||||||
@@ -204,6 +208,10 @@ class User extends Base {
|
|||||||
: Execution.query();
|
: Execution.query();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get acceptInvitationUrl() {
|
||||||
|
return `${appConfig.webAppUrl}/accept-invitation?token=${this.invitationToken}`;
|
||||||
|
}
|
||||||
|
|
||||||
static async authenticate(email, password) {
|
static async authenticate(email, password) {
|
||||||
const user = await User.query().findOne({
|
const user = await User.query().findOne({
|
||||||
email: email?.toLowerCase() || null,
|
email: email?.toLowerCase() || null,
|
||||||
@@ -362,7 +370,6 @@ class User extends Base {
|
|||||||
await this.generateInvitationToken();
|
await this.generateInvitationToken();
|
||||||
|
|
||||||
const jobName = `Invitation Email - ${this.id}`;
|
const jobName = `Invitation Email - ${this.id}`;
|
||||||
const acceptInvitationUrl = `${appConfig.webAppUrl}/accept-invitation?token=${this.invitationToken}`;
|
|
||||||
|
|
||||||
const jobPayload = {
|
const jobPayload = {
|
||||||
email: this.email,
|
email: this.email,
|
||||||
@@ -370,7 +377,7 @@ class User extends Base {
|
|||||||
template: 'invitation-instructions',
|
template: 'invitation-instructions',
|
||||||
params: {
|
params: {
|
||||||
fullName: this.fullName,
|
fullName: this.fullName,
|
||||||
acceptInvitationUrl,
|
acceptInvitationUrl: this.acceptInvitationUrl,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
11
packages/backend/src/serializers/admin/user.js
Normal file
11
packages/backend/src/serializers/admin/user.js
Normal file
@@ -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;
|
@@ -16,8 +16,10 @@ import actionSerializer from './action.js';
|
|||||||
import executionSerializer from './execution.js';
|
import executionSerializer from './execution.js';
|
||||||
import executionStepSerializer from './execution-step.js';
|
import executionStepSerializer from './execution-step.js';
|
||||||
import subscriptionSerializer from './subscription.ee.js';
|
import subscriptionSerializer from './subscription.ee.js';
|
||||||
|
import adminUserSerializer from './admin/user.js';
|
||||||
|
|
||||||
const serializers = {
|
const serializers = {
|
||||||
|
AdminUser: adminUserSerializer,
|
||||||
User: userSerializer,
|
User: userSerializer,
|
||||||
Role: roleSerializer,
|
Role: roleSerializer,
|
||||||
Permission: permissionSerializer,
|
Permission: permissionSerializer,
|
||||||
|
@@ -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;
|
Reference in New Issue
Block a user