diff --git a/keyserver/src/responders/link-responders.js b/keyserver/src/responders/link-responders.js --- a/keyserver/src/responders/link-responders.js +++ b/keyserver/src/responders/link-responders.js @@ -2,10 +2,11 @@ import t, { type TUnion, type TInterface } from 'tcomb'; -import type { - InviteLinkVerificationRequest, - InviteLinkVerificationResponse, - FetchInviteLinksResponse, +import { + type InviteLinkVerificationRequest, + type InviteLinkVerificationResponse, + type FetchInviteLinksResponse, + inviteLinkValidator, } from 'lib/types/link-types.js'; import { tShape, tID } from 'lib/utils/validation-utils.js'; @@ -52,13 +53,22 @@ ); } +export const fetchInviteLinksResponseValidator: TInterface = + tShape({ + links: t.list(inviteLinkValidator), + }); + async function fetchPrimaryInviteLinksResponder( viewer: Viewer, ): Promise { const primaryLinks = await fetchPrimaryInviteLinks(viewer); - return { - links: primaryLinks, - }; + return validateOutput( + viewer.platformDetails, + fetchInviteLinksResponseValidator, + { + links: primaryLinks, + }, + ); } export { inviteLinkVerificationResponder, fetchPrimaryInviteLinksResponder }; diff --git a/keyserver/src/responders/responder-validators.test.js b/keyserver/src/responders/responder-validators.test.js --- a/keyserver/src/responders/responder-validators.test.js +++ b/keyserver/src/responders/responder-validators.test.js @@ -14,7 +14,10 @@ restoreEntryResponseValidator, } from './entry-responders.js'; import { getSessionPublicKeysResponseValidator } from './keys-responders.js'; -import { inviteLinkVerificationResponseValidator } from './link-responders.js'; +import { + inviteLinkVerificationResponseValidator, + fetchInviteLinksResponseValidator, +} from './link-responders.js'; import { messageReportCreationResultValidator } from './message-report-responder.js'; import { fetchMessageInfosResponseValidator, @@ -952,4 +955,22 @@ expect(inviteLinkVerificationResponseValidator.is(response)).toBe(true); expect(inviteLinkVerificationResponseValidator.is({})).toBe(false); }); + + it('should validate invite link verification response', () => { + const response = { + links: [ + { + name: 'name', + primary: true, + role: '123', + communityID: '123', + expirationTime: 123, + limitOfUses: 123, + numberOfUses: 123, + }, + ], + }; + expect(fetchInviteLinksResponseValidator.is(response)).toBe(true); + expect(fetchInviteLinksResponseValidator.is({ links: {} })).toBe(false); + }); }); diff --git a/lib/types/link-types.js b/lib/types/link-types.js --- a/lib/types/link-types.js +++ b/lib/types/link-types.js @@ -1,5 +1,9 @@ // @flow +import t, { type TInterface } from 'tcomb'; + +import { tID, tShape } from '../utils/validation-utils.js'; + export type InviteLinkVerificationRequest = { +secret: string, }; @@ -26,6 +30,16 @@ +numberOfUses: number, }; +export const inviteLinkValidator: TInterface = tShape({ + name: t.String, + primary: t.Boolean, + role: tID, + communityID: tID, + expirationTime: t.Number, + limitOfUses: t.Number, + numberOfUses: t.Number, +}); + export type FetchInviteLinksResponse = { +links: $ReadOnlyArray, };