diff --git a/.changeset/add-editor-member-ids.md b/.changeset/add-editor-member-ids.md new file mode 100644 index 00000000..b9977c30 --- /dev/null +++ b/.changeset/add-editor-member-ids.md @@ -0,0 +1,5 @@ +--- +"@graphprotocol/hypergraph": minor +--- + +Add `editorIds` and `memberIds` arrays to the `PublicSpace` type returned by `Space.findManyPublic()` and `usePublicSpaces()`. diff --git a/packages/hypergraph/src/space/find-many-public.ts b/packages/hypergraph/src/space/find-many-public.ts index 1d1c74cc..1acb7315 100644 --- a/packages/hypergraph/src/space/find-many-public.ts +++ b/packages/hypergraph/src/space/find-many-public.ts @@ -21,6 +21,12 @@ const spaceFields = ` } } } + editorsList { + memberSpaceId + } + membersList { + memberSpaceId + } `; const spacesQueryDocument = ` @@ -51,6 +57,8 @@ export const PublicSpaceSchema = EffectSchema.Struct({ id: EffectSchema.String, name: EffectSchema.String, avatar: EffectSchema.optional(EffectSchema.String), + editorIds: EffectSchema.Array(EffectSchema.String), + memberIds: EffectSchema.Array(EffectSchema.String), }); export type PublicSpace = typeof PublicSpaceSchema.Type; @@ -69,6 +77,12 @@ type SpacesQueryResult = { } | null; }[]; } | null; + editorsList?: { + memberSpaceId: string; + }[]; + membersList?: { + memberSpaceId: string; + }[]; }[]; }; @@ -90,6 +104,14 @@ const getAvatarFromSpace = (space: SpaceQueryEntry) => { return undefined; }; +const getEditorIdsFromSpace = (space: SpaceQueryEntry): string[] => { + return (space.editorsList ?? []).map((e) => e.memberSpaceId).filter((id): id is string => typeof id === 'string'); +}; + +const getMemberIdsFromSpace = (space: SpaceQueryEntry): string[] => { + return (space.membersList ?? []).map((m) => m.memberSpaceId).filter((id): id is string => typeof id === 'string'); +}; + export const parseSpacesQueryResult = (queryResult: SpacesQueryResult) => { const data: PublicSpace[] = []; const invalidSpaces: Record[] = []; @@ -100,6 +122,8 @@ export const parseSpacesQueryResult = (queryResult: SpacesQueryResult) => { id: space.id, name: space.page?.name ?? undefined, avatar: getAvatarFromSpace(space), + editorIds: getEditorIdsFromSpace(space), + memberIds: getMemberIdsFromSpace(space), }; const decodedSpace = decodeSpace(rawSpace); diff --git a/packages/hypergraph/test/space/find-many-public.test.ts b/packages/hypergraph/test/space/find-many-public.test.ts index 79a571a3..72173012 100644 --- a/packages/hypergraph/test/space/find-many-public.test.ts +++ b/packages/hypergraph/test/space/find-many-public.test.ts @@ -5,10 +5,14 @@ const buildQuerySpace = ({ id = 'space-id', name = 'Space name', avatar, + editorsList = [], + membersList = [], }: { id?: string; name?: string | null; avatar?: string | null; + editorsList?: { memberSpaceId: string }[]; + membersList?: { memberSpaceId: string }[]; } = {}) => { return { id, @@ -33,6 +37,8 @@ const buildQuerySpace = ({ }, ], }, + editorsList, + membersList, }; }; @@ -47,6 +53,8 @@ describe('parseSpacesQueryResult', () => { id: 'space-1', name: 'Space 1', avatar: 'https://example.com/avatar.png', + editorIds: [], + memberIds: [], }, ]); expect(invalidSpaces).toHaveLength(0); @@ -61,6 +69,8 @@ describe('parseSpacesQueryResult', () => { { id: 'space-2', name: 'Space 2', + editorIds: [], + memberIds: [], }, ]); }); @@ -78,9 +88,33 @@ describe('parseSpacesQueryResult', () => { id: 'space-valid', name: 'Space valid', avatar: 'https://example.com/a.png', + editorIds: [], + memberIds: [], }, ]); expect(invalidSpaces).toHaveLength(1); expect(invalidSpaces[0]).toMatchObject({ id: 'space-invalid' }); }); + + it('parses editorIds and memberIds', () => { + const { data } = parseSpacesQueryResult({ + spaces: [ + buildQuerySpace({ + id: 'space-with-members', + name: 'Space with members', + editorsList: [{ memberSpaceId: 'editor-1' }, { memberSpaceId: 'editor-2' }], + membersList: [{ memberSpaceId: 'member-1' }], + }), + ], + }); + + expect(data).toEqual([ + { + id: 'space-with-members', + name: 'Space with members', + editorIds: ['editor-1', 'editor-2'], + memberIds: ['member-1'], + }, + ]); + }); });