diff --git a/packages/server/src/api/controllers/InviteUsers.ts b/packages/server/src/api/controllers/InviteUsers.ts index 090f33882..af0cefb42 100644 --- a/packages/server/src/api/controllers/InviteUsers.ts +++ b/packages/server/src/api/controllers/InviteUsers.ts @@ -11,10 +11,10 @@ import AcceptInviteUserService from '@/services/InviteUsers/AcceptInviteUser'; @Service() export default class InviteUsersController extends BaseController { @Inject() - inviteUsersService: InviteTenantUserService; + private inviteUsersService: InviteTenantUserService; @Inject() - acceptInviteService: AcceptInviteUserService; + private acceptInviteService: AcceptInviteUserService; /** * Routes that require authentication. @@ -68,13 +68,13 @@ export default class InviteUsersController extends BaseController { /** * Invite DTO schema validation. + * @returns {ValidationChain[]} */ - get inviteUserDTO() { + private get inviteUserDTO() { return [ check('first_name').exists().trim().escape(), check('last_name').exists().trim().escape(), - check('phone_number').exists().trim().escape(), - check('password').exists().trim().escape(), + check('password').exists().trim().escape().isLength({ min: 5 }), param('token').exists().trim().escape(), ]; } @@ -85,17 +85,13 @@ export default class InviteUsersController extends BaseController { * @param {Response} res - Response object. * @param {NextFunction} next - Next function. */ - async sendInvite(req: Request, res: Response, next: Function) { + private async sendInvite(req: Request, res: Response, next: Function) { const sendInviteDTO = this.matchedBodyData(req); const { tenantId } = req; const { user } = req; try { - const { invite } = await this.inviteUsersService.sendInvite( - tenantId, - sendInviteDTO, - user - ); + await this.inviteUsersService.sendInvite(tenantId, sendInviteDTO, user); return res.status(200).send({ type: 'success', code: 'INVITE.SENT.SUCCESSFULLY', @@ -112,7 +108,7 @@ export default class InviteUsersController extends BaseController { * @param {Response} res - Response object. * @param {NextFunction} next - Next function. */ - async resendInvite(req: Request, res: Response, next: NextFunction) { + private async resendInvite(req: Request, res: Response, next: NextFunction) { const { tenantId, user } = req; const { userId } = req.params; @@ -135,7 +131,7 @@ export default class InviteUsersController extends BaseController { * @param {Response} res - * @param {NextFunction} next - */ - async accept(req: Request, res: Response, next: Function) { + private async accept(req: Request, res: Response, next: Function) { const inviteUserInput: IInviteUserInput = this.matchedBodyData(req, { locations: ['body'], includeOptionals: true, @@ -161,7 +157,7 @@ export default class InviteUsersController extends BaseController { * @param {Response} res - * @param {NextFunction} next - */ - async invited(req: Request, res: Response, next: Function) { + private async invited(req: Request, res: Response, next: Function) { const { token } = req.params; try { @@ -181,7 +177,12 @@ export default class InviteUsersController extends BaseController { /** * Handles the service error. */ - handleServicesError(error, req: Request, res: Response, next: Function) { + private handleServicesError( + error, + req: Request, + res: Response, + next: Function + ) { if (error instanceof ServiceError) { if (error.errorType === 'EMAIL_EXISTS') { return res.status(400).send({ diff --git a/packages/server/src/api/controllers/Users.ts b/packages/server/src/api/controllers/Users.ts index 543a7080d..f888b90c0 100644 --- a/packages/server/src/api/controllers/Users.ts +++ b/packages/server/src/api/controllers/Users.ts @@ -47,7 +47,6 @@ export default class UsersController extends BaseController { check('first_name').exists(), check('last_name').exists(), check('email').exists().isEmail(), - check('phone_number').optional().isMobilePhone(), check('role_id').exists().isNumeric().toInt(), ], this.validationResult, diff --git a/packages/server/src/database/migrations/20230405232607_drop_phone_number_from_users.js b/packages/server/src/database/migrations/20230405232607_drop_phone_number_from_users.js new file mode 100644 index 000000000..9ab142779 --- /dev/null +++ b/packages/server/src/database/migrations/20230405232607_drop_phone_number_from_users.js @@ -0,0 +1,9 @@ +exports.up = function (knex) { + return knex.schema.table('users', (table) => { + table.dropColumn('phone_number'); + }); +}; + +exports.down = function (knex) { + return knex.schema.table('users', (table) => {}); +}; diff --git a/packages/server/src/interfaces/User.ts b/packages/server/src/interfaces/User.ts index 9782f1a91..25543e394 100644 --- a/packages/server/src/interfaces/User.ts +++ b/packages/server/src/interfaces/User.ts @@ -9,7 +9,6 @@ export interface ISystemUser extends Model { active: boolean; password: string; email: string; - phoneNumber: string; roleId: number; tenantId: number; @@ -26,7 +25,6 @@ export interface ISystemUserDTO { firstName: string; lastName: string; password: string; - phoneNumber: string; active: boolean; email: string; roleId?: number; @@ -35,7 +33,6 @@ export interface ISystemUserDTO { export interface IEditUserDTO { firstName: string; lastName: string; - phoneNumber: string; active: boolean; email: string; roleId: number; @@ -44,7 +41,6 @@ export interface IEditUserDTO { export interface IInviteUserInput { firstName: string; lastName: string; - phoneNumber: string; password: string; } export interface IUserInvite { @@ -111,7 +107,6 @@ export interface ITenantUser { id?: number; firstName: string; lastName: string; - phoneNumber: string; active: boolean; email: string; roleId?: number; diff --git a/packages/server/src/services/InviteUsers/AcceptInviteUser.ts b/packages/server/src/services/InviteUsers/AcceptInviteUser.ts index 628e630ac..04b99e944 100644 --- a/packages/server/src/services/InviteUsers/AcceptInviteUser.ts +++ b/packages/server/src/services/InviteUsers/AcceptInviteUser.ts @@ -3,8 +3,6 @@ import moment from 'moment'; import { ServiceError } from '@/exceptions'; import { Invite, SystemUser, Tenant } from '@/system/models'; import { hashPassword } from 'utils'; -import TenancyService from '@/services/Tenancy/TenancyService'; -import InviteUsersMailMessages from '@/services/InviteUsers/InviteUsersMailMessages'; import events from '@/subscribers/events'; import { IAcceptInviteEventPayload, @@ -12,29 +10,13 @@ import { ICheckInviteEventPayload, IUserInvite, } from '@/interfaces'; -import TenantsManagerService from '@/services/Tenancy/TenantsManager'; import { ERRORS } from './constants'; import { EventPublisher } from '@/lib/EventPublisher/EventPublisher'; @Service() export default class AcceptInviteUserService { @Inject() - eventPublisher: EventPublisher; - - @Inject() - tenancy: TenancyService; - - @Inject('logger') - logger: any; - - @Inject() - mailMessages: InviteUsersMailMessages; - - @Inject('repositories') - sysRepositories: any; - - @Inject() - tenantsManager: TenantsManagerService; + private eventPublisher: EventPublisher; /** * Accept the received invite. @@ -50,9 +32,6 @@ export default class AcceptInviteUserService { // Retrieve the invite token or throw not found error. const inviteToken = await this.getInviteTokenOrThrowError(token); - // Validates the user phone number. - await this.validateUserPhoneNumberNotExists(inviteUserDTO.phoneNumber); - // Hash the given password. const hashedPassword = await hashPassword(inviteUserDTO.password); diff --git a/packages/server/src/services/Users/UsersService.ts b/packages/server/src/services/Users/UsersService.ts index e6f15c36a..fc1f365c2 100644 --- a/packages/server/src/services/Users/UsersService.ts +++ b/packages/server/src/services/Users/UsersService.ts @@ -17,20 +17,17 @@ import { EventPublisher } from '@/lib/EventPublisher/EventPublisher'; @Service() export default class UsersService { - @Inject('logger') - logger: any; - @Inject('repositories') - repositories: any; + private repositories: any; @Inject() - rolesService: RolesService; + private rolesService: RolesService; @Inject() - tenancy: HasTenancyService; + private tenancy: HasTenancyService; @Inject() - eventPublisher: EventPublisher; + private eventPublisher: EventPublisher; /** * Creates a new user. @@ -46,7 +43,7 @@ export default class UsersService { authorizedUser: ISystemUser ): Promise { const { User } = this.tenancy.models(tenantId); - const { email, phoneNumber } = editUserDTO; + const { email } = editUserDTO; // Retrieve the tenant user or throw not found service error. const oldTenantUser = await this.getTenantUserOrThrowError( @@ -62,9 +59,6 @@ export default class UsersService { // Validate user email should be unique. await this.validateUserEmailUniquiness(tenantId, email, userId); - // Validate user phone number should be unique. - await this.validateUserPhoneNumberUniqiness(tenantId, phoneNumber, userId); - // Retrieve the given role or throw not found service error. const role = await this.rolesService.getRoleOrThrowError( tenantId, @@ -295,27 +289,6 @@ export default class UsersService { } }; - /** - * Validate user phone number should be unique. - * @param {string} phoneNumber - - * @param {number} userId - - */ - private validateUserPhoneNumberUniqiness = async ( - tenantId: number, - phoneNumber: string, - userId: number - ) => { - const { User } = this.tenancy.models(tenantId); - - const userByPhoneNumber = await User.query() - .findOne('phone_number', phoneNumber) - .whereNot('id', userId); - - if (userByPhoneNumber) { - throw new ServiceError(ERRORS.PHONE_NUMBER_ALREADY_EXIST); - } - }; - /** * Validate the authorized user cannot mutate its role. * @param {ITenantUser} oldTenantUser