Skip to content

Commit

Permalink
back saveApiConsumer integration
Browse files Browse the repository at this point in the history
  • Loading branch information
bbohec committed Aug 25, 2023
1 parent 0bb73b1 commit 310d1f2
Show file tree
Hide file tree
Showing 3 changed files with 144 additions and 25 deletions.
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import { Pool, PoolClient } from "pg";
import { ApiConsumer, expectToEqual } from "shared";
import { getTestPgPool } from "../../../_testBuilders/getTestPgPool";
import { UuidV4Generator } from "../core/UuidGeneratorImplementations";
import { PgApiConsumerRepository } from "./PgApiConsumerRepository";

describe("PG GetApiConsumerById", () => {
describe("PgApiConsumerRepository", () => {
let pool: Pool;
let client: PoolClient;
let apiConsumerRepository: PgApiConsumerRepository;
Expand All @@ -20,36 +21,53 @@ describe("PG GetApiConsumerById", () => {
await pool.end();
});

it("gets the ApiConsumer from it's ID", async () => {
it("save & getById", async () => {
const apiConsumer: ApiConsumer = {
id: "11111111-1111-1111-1111-111111111111",
id: new UuidV4Generator().new(),
consumer: "passeEmploi",
description: "my description",
contact: {
firstName: "john",
lastName: "doe",
emails: ["email@mail.com"],
job: "job",
phone: "0644889977",
},
createdAt: new Date(),
expirationDate: new Date(),
isAuthorized: true,
};

await insertInTable(apiConsumer);
expectToEqual(
await apiConsumerRepository.getById(apiConsumer.id),
undefined,
);

const apiConsumerFetched = await apiConsumerRepository.getById(
apiConsumer.id,
await apiConsumerRepository.save(apiConsumer);
expectToEqual(
await apiConsumerRepository.getById(apiConsumer.id),
apiConsumer,
);

expectToEqual(apiConsumerFetched, apiConsumer);
});
const updatedApiConsumer: ApiConsumer = {
id: apiConsumer.id,
consumer: "passeEmploiupdated",
contact: {
firstName: "john 5",
lastName: "manson",
emails: ["john-v@mail.com"],
job: "guitariste",
phone: "0606660666",
},
createdAt: new Date(),
expirationDate: new Date(),
isAuthorized: false,
};

const insertInTable = async ({
id,
consumer,
description,
isAuthorized,
createdAt,
expirationDate,
}: ApiConsumer) => {
await client.query(
`INSERT INTO api_consumers (id, consumer, description, is_authorized, created_at, expiration_date)
VALUES ('${id}', '${consumer}', '${description}', ${isAuthorized}, '${createdAt.toISOString()}', '${expirationDate.toISOString()}');`,
await apiConsumerRepository.save(updatedApiConsumer);
expectToEqual(
await apiConsumerRepository.getById(apiConsumer.id),
updatedApiConsumer,
);
};
});
});
62 changes: 57 additions & 5 deletions back/src/adapters/secondary/pg/PgApiConsumerRepository.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { PoolClient } from "pg";
import { ApiConsumer, ApiConsumerId } from "shared";
import { ApiConsumer, ApiConsumerId, apiConsumerSchema } from "shared";
import { ApiConsumerRepository } from "../../../domain/auth/ports/ApiConsumerRepository";
import { optional } from "./pgUtils";

Expand All @@ -13,17 +13,69 @@ export class PgApiConsumerRepository implements ApiConsumerRepository {
);

const rawPg = result.rows[0];
return rawPg ? this.rawPgToApiConsumer(rawPg) : undefined;
return rawPg ? this.#rawPgToApiConsumer(rawPg) : undefined;
}

private rawPgToApiConsumer(raw: any): ApiConsumer {
return {
public async save(apiConsumer: ApiConsumer): Promise<void> {
await this.client.query(
`
INSERT INTO api_consumers (
id, consumer, description, is_authorized, created_at,
expiration_date, contact_emails, contact_first_name, contact_last_name, contact_job,
contact_phone
) VALUES(
$1, $2, $3, $4, $5,
$6, $7, $8, $9, $10,
$11
)
ON CONFLICT (id) DO UPDATE
SET (
id, consumer, description, is_authorized, created_at,
expiration_date, contact_emails, contact_first_name, contact_last_name, contact_job,
contact_phone
) = (
$1, $2, $3, $4, $5,
$6, $7, $8, $9, $10,
$11
)`,
//prettier-ignore
[
apiConsumer.id, apiConsumer.consumer, apiConsumer.description, apiConsumer.isAuthorized, apiConsumer.createdAt.toISOString(),
apiConsumer.expirationDate.toISOString(), apiConsumer.contact.emails, apiConsumer.contact.firstName, apiConsumer.contact.lastName, apiConsumer.contact.job,
apiConsumer.contact.phone,
],
);
}

#rawPgToApiConsumer(raw: PgApiConsumer): ApiConsumer {
return apiConsumerSchema.parse({
id: raw.id,
consumer: raw.consumer,
description: optional(raw.description),
isAuthorized: raw.is_authorized,
createdAt: raw.created_at,
expirationDate: raw.expiration_date,
};
contact: {
firstName: raw.contact_first_name,
lastName: raw.contact_last_name,
job: raw.contact_job,
emails: raw.contact_emails,
phone: raw.contact_phone,
},
} satisfies ApiConsumer);
}
}

type PgApiConsumer = {
id: string;
consumer: string;
description?: string;
is_authorized: boolean;
created_at: Date;
expiration_date: Date;
contact_first_name: string;
contact_last_name: string;
contact_job: string;
contact_emails: string[];
contact_phone: string;
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import { ColumnDefinitions, MigrationBuilder } from "node-pg-migrate";

const tableName = "api_consumers";
const columnNames = [
"contact_first_name",
"contact_last_name",
"contact_job",
"contact_phone",
] as const;
const contactEmailsColumnName = "contact_emails";
const defaultValuesByColumnNames: Record<(typeof columnNames)[number], string> =
{
contact_first_name: "inconnu",
contact_job: "inconnu",
contact_last_name: "inconnu",
contact_phone: "0000000000",
};

export async function up(pgm: MigrationBuilder): Promise<void> {
pgm.addColumns(
tableName,
columnNames.reduce<ColumnDefinitions>(
(agg, columnName) => ({
...agg,
[columnName]: {
type: "text",
notNull: true,
default: defaultValuesByColumnNames[columnName],
},
}),
{},
),
);

columnNames.forEach((columnName) =>
pgm.sql(
`ALTER TABLE ${tableName} ALTER COLUMN ${columnName} DROP DEFAULT;`,
),
);

pgm.sql(
`ALTER TABLE ${tableName} ALTER COLUMN ${contactEmailsColumnName} DROP DEFAULT;`,
);
}

export async function down(pgm: MigrationBuilder): Promise<void> {
pgm.dropColumns(tableName, [...columnNames]);
pgm.alterColumn(tableName, contactEmailsColumnName, { default: "{}" });
}

0 comments on commit 310d1f2

Please sign in to comment.