This PR is a followup of #6324 to add support of EMAIL and CALENDAR source for the created by composite field.
108 lines
3.2 KiB
TypeScript
108 lines
3.2 KiB
TypeScript
import { Injectable } from '@nestjs/common';
|
|
|
|
import { EntityManager } from 'typeorm';
|
|
import { v4 } from 'uuid';
|
|
|
|
import { getFirstNameAndLastNameFromHandleAndDisplayName } from 'src/modules/contact-creation-manager/utils/get-first-name-and-last-name-from-handle-and-display-name.util';
|
|
import { PersonWorkspaceEntity } from 'src/modules/person/standard-objects/person.workspace-entity';
|
|
import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager';
|
|
import { FieldActorSource } from 'src/engine/metadata-modules/field-metadata/composite-types/actor.composite-type';
|
|
import { WorkspaceMemberWorkspaceEntity } from 'src/modules/workspace-member/standard-objects/workspace-member.workspace-entity';
|
|
import { computeDisplayName } from 'src/utils/compute-display-name';
|
|
import { WorkspaceRepository } from 'src/engine/twenty-orm/repository/workspace.repository';
|
|
|
|
type ContactToCreate = {
|
|
handle: string;
|
|
displayName: string;
|
|
companyId?: string;
|
|
createdBySource: FieldActorSource;
|
|
createdByWorkspaceMember?: WorkspaceMemberWorkspaceEntity | null;
|
|
};
|
|
|
|
@Injectable()
|
|
export class CreateContactService {
|
|
constructor(
|
|
private readonly twentyORMGlobalManager: TwentyORMGlobalManager,
|
|
) {}
|
|
|
|
private formatContacts(
|
|
contactsToCreate: ContactToCreate[],
|
|
lastPersonPosition: number,
|
|
): DeepPartial<PersonWorkspaceEntity>[] {
|
|
return contactsToCreate.map((contact) => {
|
|
const id = v4();
|
|
|
|
const {
|
|
handle,
|
|
displayName,
|
|
companyId,
|
|
createdBySource,
|
|
createdByWorkspaceMember,
|
|
} = contact;
|
|
|
|
const { firstName, lastName } =
|
|
getFirstNameAndLastNameFromHandleAndDisplayName(handle, displayName);
|
|
const createdByName = computeDisplayName(createdByWorkspaceMember?.name);
|
|
|
|
return {
|
|
id,
|
|
email: handle,
|
|
name: {
|
|
firstName,
|
|
lastName,
|
|
},
|
|
companyId,
|
|
createdBy: {
|
|
source: createdBySource,
|
|
workspaceMemberId: contact.createdByWorkspaceMember?.id,
|
|
name: createdByName,
|
|
},
|
|
position: ++lastPersonPosition,
|
|
};
|
|
});
|
|
}
|
|
|
|
public async createPeople(
|
|
contactsToCreate: ContactToCreate[],
|
|
workspaceId: string,
|
|
transactionManager?: EntityManager,
|
|
): Promise<DeepPartial<PersonWorkspaceEntity>[]> {
|
|
if (contactsToCreate.length === 0) return [];
|
|
|
|
const personRepository =
|
|
await this.twentyORMGlobalManager.getRepositoryForWorkspace(
|
|
workspaceId,
|
|
PersonWorkspaceEntity,
|
|
);
|
|
|
|
const lastPersonPosition = await this.getLastPersonPosition(
|
|
personRepository,
|
|
transactionManager,
|
|
);
|
|
|
|
const formattedContacts = this.formatContacts(
|
|
contactsToCreate,
|
|
lastPersonPosition,
|
|
);
|
|
|
|
return personRepository.save(
|
|
formattedContacts,
|
|
undefined,
|
|
transactionManager,
|
|
);
|
|
}
|
|
|
|
private async getLastPersonPosition(
|
|
personRepository: WorkspaceRepository<PersonWorkspaceEntity>,
|
|
transactionManager?: EntityManager,
|
|
): Promise<number> {
|
|
const lastPersonPosition = await personRepository.maximum(
|
|
'position',
|
|
undefined,
|
|
transactionManager,
|
|
);
|
|
|
|
return lastPersonPosition ?? 0;
|
|
}
|
|
}
|