diff --git a/firebase-data/firebase-export-metadata.json b/firebase-data/firebase-export-metadata.json index 0f5ae0c6..475630b8 100644 --- a/firebase-data/firebase-export-metadata.json +++ b/firebase-data/firebase-export-metadata.json @@ -1,12 +1,12 @@ { - "version": "13.7.4", + "version": "13.13.0", "firestore": { - "version": "1.19.5", + "version": "1.19.7", "path": "firestore_export", "metadata_file": "firestore_export/firestore_export.overall_export_metadata" }, "auth": { - "version": "13.7.4", + "version": "13.13.0", "path": "auth_export" } } \ No newline at end of file diff --git a/firebase-data/firestore_export/all_namespaces/all_kinds/all_namespaces_all_kinds.export_metadata b/firebase-data/firestore_export/all_namespaces/all_kinds/all_namespaces_all_kinds.export_metadata index 3d601e36..8afa682c 100644 Binary files a/firebase-data/firestore_export/all_namespaces/all_kinds/all_namespaces_all_kinds.export_metadata and b/firebase-data/firestore_export/all_namespaces/all_kinds/all_namespaces_all_kinds.export_metadata differ diff --git a/firebase-data/firestore_export/all_namespaces/all_kinds/output-0 b/firebase-data/firestore_export/all_namespaces/all_kinds/output-0 index 246d9d87..31f70c4e 100644 Binary files a/firebase-data/firestore_export/all_namespaces/all_kinds/output-0 and b/firebase-data/firestore_export/all_namespaces/all_kinds/output-0 differ diff --git a/firebase-data/firestore_export/firestore_export.overall_export_metadata b/firebase-data/firestore_export/firestore_export.overall_export_metadata index 89b52a28..9bbd009a 100644 Binary files a/firebase-data/firestore_export/firestore_export.overall_export_metadata and b/firebase-data/firestore_export/firestore_export.overall_export_metadata differ diff --git a/src/data/firestore/partenership/get-partnership-paginated.ts b/src/data/firestore/partenership/get-partnership-paginated.ts new file mode 100644 index 00000000..4e8770db --- /dev/null +++ b/src/data/firestore/partenership/get-partnership-paginated.ts @@ -0,0 +1,32 @@ +import type { PaginationParams } from "~/models/pagination/pagination.type"; +import type { Partnership } from "~/models/partnership/partnership.type"; +import getDocsPaginated from "../common/get-docs-paginated"; +import { partnerDataConverter, partnershipDataConverter } from "./models"; +import { getFirestore } from "firebase-admin/firestore"; +import { firestoreInstance } from "~/firebase/server"; + +const collection = "partnerships" as const; + + +const getPartnershipsPaginated = async (params: PaginationParams) => { + const result = await getDocsPaginated(collection, partnershipDataConverter, params); + + if (result.status == "success") { + result.data.data = await Promise.all( + result.data.data.map(async (p) => { + const snapshot = await firestoreInstance.collection(`${collection}/${p.id}/partners`) + .withConverter(partnerDataConverter) + .orderBy("position", "asc") + .get(); + + p.partners = snapshot.docs.map((partnerDoc) => partnerDoc.data()); + + return p; + }) + ); + } + + return result; +} + +export { getPartnershipsPaginated }; \ No newline at end of file diff --git a/src/data/firestore/partenership/models.ts b/src/data/firestore/partenership/models.ts new file mode 100644 index 00000000..b9240ea4 --- /dev/null +++ b/src/data/firestore/partenership/models.ts @@ -0,0 +1,38 @@ +import type { FirestoreDataConverter, QueryDocumentSnapshot } from "firebase-admin/firestore"; +import type { FirestoreDocument } from "~/data/model-document-mapper"; +import type { Partner, Partnership } from "~/models/partnership/partnership.type"; + +type PartnershipDoc = FirestoreDocument; +type PartnerDoc = FirestoreDocument; + +const partnerDataConverter: FirestoreDataConverter = { + toFirestore: (model: Partner) => { + delete model.id; + return { ...model }; + }, + + fromFirestore: (snapshot: QueryDocumentSnapshot) => { + const data = snapshot.data() as PartnerDoc; + data.id = snapshot.id; + + return { ...data }; + } +} + +const partnershipDataConverter: FirestoreDataConverter = { + toFirestore: (model: Partnership): PartnershipDoc => { + delete model.id + delete model.partners + + return { ...model }; + }, + fromFirestore: (snapshot: QueryDocumentSnapshot): Partnership => { + const data = snapshot.data(); + return { + id: snapshot.id, + ...data, + } as Partnership; + }, +}; + +export { partnerDataConverter, partnershipDataConverter } \ No newline at end of file diff --git a/src/models/partnership/partnership.schema.ts b/src/models/partnership/partnership.schema.ts new file mode 100644 index 00000000..7628cf41 --- /dev/null +++ b/src/models/partnership/partnership.schema.ts @@ -0,0 +1,18 @@ +import { z } from "astro/zod"; + +const PartnerSchema = z.object({ + id: z.string(), + name: z.string(), + logo: z.string(), + position: z.number(), + link: z.string(), +}); + +const PartnershipSchema = z.object({ + id: z.string(), + name: z.string(), + position: z.number(), + partners: z.array(PartnerSchema), +}); + +export { PartnerSchema, PartnershipSchema }; \ No newline at end of file diff --git a/src/models/partnership/partnership.type.ts b/src/models/partnership/partnership.type.ts new file mode 100644 index 00000000..600839be --- /dev/null +++ b/src/models/partnership/partnership.type.ts @@ -0,0 +1,17 @@ +type Partner = { + id?: string; + name: string; + logo: string; + position: number; + link: string; +}; + +type Partnership = { + id?: string; + name: string; + position: number; + partners?: Partner[]; +}; + + +export type { Partner, Partnership} diff --git a/tests/partnership.test.ts b/tests/partnership.test.ts new file mode 100644 index 00000000..9ea1768a --- /dev/null +++ b/tests/partnership.test.ts @@ -0,0 +1,49 @@ +import { test, expect, } from "@playwright/test"; +import { getPartnershipsPaginated } from "~/data/firestore/partenership/get-partnership-paginated"; +import { partnerDataConverter, partnershipDataConverter } from "~/data/firestore/partenership/models"; +import { firestoreInstance } from "~/firebase/server"; +import type { PaginatedResponse } from "~/models/pagination/pagination.type"; +import type { Partnership } from "~/models/partnership/partnership.type"; + +test("get partnership after creating it", async ({ page }) => { + const partnership: Partnership = { + id: "test-partnership", + name: "test partnership", + position: 1, + partners: [{ + id: "test-partner", + name: "test partner", + logo: "test logo", + link: "test url", + position: 1, + }], + }; + + await firestoreInstance + .doc("partnerships/test-partnership") + .withConverter(partnershipDataConverter) + .set(partnership); + + await firestoreInstance.doc("partnerships/test-partnership/partners/test-partner") + .withConverter(partnerDataConverter) + .set(partnership.partners![0]); + + + const result = await getPartnershipsPaginated({ + offset: 0, + limit: 10, + orderBy: "position", + orderDirection: "asc" + }); + + const equivalentResultData : PaginatedResponse = { + data: [partnership], + total: 1, + limit: 10, + offset: 0, + totalPages: 1, + }; + + await expect(result.status).toEqual("success"); + await expect(result.data).toEqual(equivalentResultData); +}); \ No newline at end of file