Skip to content

Commit

Permalink
[TRA-15007] - Accepter une demande de rattachement lorsque l'utilisat…
Browse files Browse the repository at this point in the history
…eur ayant fait la demande est invité dans l'entreprise (#3526)

* fix(inviteUser,membershipRequest): accept membership request if a user is invited to a company

* docs(Changelog): update Changelog

* test(inviteUser): fix test using hardcoded value
  • Loading branch information
silto authored Aug 23, 2024
1 parent 506a870 commit 4af34ca
Show file tree
Hide file tree
Showing 5 changed files with 64 additions and 14 deletions.
1 change: 1 addition & 0 deletions Changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ et le projet suit un schéma de versionning inspiré de [Calendar Versioning](ht
#### :bug: Corrections de bugs

- Résolution d'un problème de resolver BsdaRevisionRequest qui empêchait l'ouverture de la modale de révision [PR 3513](https:/MTES-MCT/trackdechets/pull/3513)
- Une demande de rattachement est automatiquement acceptée si l'utilisateur est invité dans un établissement [PR 3526](https:/MTES-MCT/trackdechets/pull/3526)

#### :house: Interne

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ describe("mutation inviteUserToCompany", () => {
vars: {
API_URL: "http://api.trackdechets.local",
UI_URL: "http://trackdechets.local",
companyName: "company_2",
companyName: company.name,
companyOrgId: company.siret,
hash: encodeURIComponent(hashValue)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,19 @@
import { inviteUserToJoin, notifyUserOfInvite, renderMail } from "@td/mail";
import { siretify } from "../../../../__tests__/factories";
import { inviteUserToCompanyFn as inviteUserToCompany } from "../inviteUserToCompanyService";
import { User } from "@prisma/client";

const userMock = jest.fn();
const companyMock = jest.fn();
const membershipRequestMock = jest.fn();

jest.mock("@td/prisma", () => ({
prisma: {
user: { findUnique: jest.fn((...args) => userMock(...args)) },
company: { findUnique: jest.fn((...args) => companyMock(...args)) }
company: { findUnique: jest.fn((...args) => companyMock(...args)) },
membershipRequest: {
updateMany: jest.fn((...args) => membershipRequestMock(...args))
}
}
}));

Expand All @@ -33,26 +38,49 @@ describe("inviteUserToCompany", () => {
beforeEach(() => {
userMock.mockReset();
companyMock.mockReset();
membershipRequestMock.mockReset();
sendMailMock.mockReset();
associateUserToCompanyMock.mockReset();
createUserAccountHashMock.mockReset();
});

it("should associate existing user to company if user exists", async () => {
const admin = {
id: "id",
name: "Sansa Stark",
email: "[email protected]"
};

const user = { id: "id", name: "Arya Stark" };
userMock.mockResolvedValueOnce(user);
const siret = siretify(1);
const company = { siret, name: "Code en Stock" };
const company = { id: "companyId", siret, name: "Code en Stock" };
companyMock.mockResolvedValueOnce(company);

await inviteUserToCompany({
await inviteUserToCompany(admin as User, {
email: "[email protected]",
siret,
role: "MEMBER"
});

expect(associateUserToCompanyMock).toBeCalledWith("id", siret, "MEMBER", {
automaticallyAccepted: true
expect(associateUserToCompanyMock).toHaveBeenCalledWith(
"id",
siret,
"MEMBER",
{
automaticallyAccepted: true
}
);

expect(membershipRequestMock).toHaveBeenCalledWith({
where: {
userId: "id",
companyId: "companyId"
},
data: {
status: "ACCEPTED",
statusUpdatedBy: "[email protected]"
}
});

expect(sendMailMock).toHaveBeenCalledWith(
Expand All @@ -64,6 +92,11 @@ describe("inviteUserToCompany", () => {
});

it("should create a temporary association if user does not exist", async () => {
const admin = {
id: "id",
name: "Sansa Stark",
email: "[email protected]"
};
userMock.mockResolvedValueOnce(null);
const userAccountHash = {
email: "[email protected]",
Expand All @@ -75,7 +108,7 @@ describe("inviteUserToCompany", () => {
const company = { siret, name: "Code en Stock" };
companyMock.mockResolvedValueOnce(company);

await inviteUserToCompany({
await inviteUserToCompany(admin as User, {
email: "[email protected]",
siret,
role: "MEMBER"
Expand Down Expand Up @@ -105,6 +138,11 @@ describe("inviteUserToCompany", () => {
});

it("should sanitize email", async () => {
const admin = {
id: "id",
name: "Sansa Stark",
email: "[email protected]"
};
userMock.mockResolvedValueOnce(null);
const userAccountHash = {
email: "[email protected]",
Expand All @@ -116,7 +154,7 @@ describe("inviteUserToCompany", () => {
const company = { siret, name: "Code en Stock" };
companyMock.mockResolvedValueOnce(company);

await inviteUserToCompany({
await inviteUserToCompany(admin as User, {
email: "[email protected]",
siret,
role: "MEMBER"
Expand Down
2 changes: 1 addition & 1 deletion back/src/users/resolvers/mutations/inviteUserToCompany.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ const inviteUserToCompanyResolver: MutationResolvers["inviteUserToCompany"] =
Permission.CompanyCanManageMembers,
NotCompanyAdminErrorMsg(company.orgId)
);
return inviteUserToCompanyFn(args);
return inviteUserToCompanyFn(user, args);
};

export default inviteUserToCompanyResolver;
21 changes: 16 additions & 5 deletions back/src/users/resolvers/mutations/inviteUserToCompanyService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,12 @@ import { sanitizeEmail } from "../../../utils";
import { associateUserToCompany, createUserAccountHash } from "../../database";

import { inviteUserToJoin, notifyUserOfInvite, renderMail } from "@td/mail";
import { User } from "@prisma/client";

export async function inviteUserToCompanyFn({
email: unsafeEmail,
siret,
role
}: MutationInviteUserToCompanyArgs): Promise<CompanyPrivate> {
export async function inviteUserToCompanyFn(
user: User,
{ email: unsafeEmail, siret, role }: MutationInviteUserToCompanyArgs
): Promise<CompanyPrivate> {
const email = sanitizeEmail(unsafeEmail);

const existingUser = await prisma.user.findUnique({ where: { email } });
Expand All @@ -34,6 +34,17 @@ export async function inviteUserToCompanyFn({
automaticallyAccepted: true
});

await prisma.membershipRequest.updateMany({
where: {
userId: existingUser.id,
companyId: company.id
},
data: {
status: "ACCEPTED",
statusUpdatedBy: user.email
}
});

const mail = renderMail(notifyUserOfInvite, {
to: [{ email, name: existingUser.name }],
variables: { companyName: company.name, companyOrgId: siret }
Expand Down

0 comments on commit 4af34ca

Please sign in to comment.