Skip to content

Commit 3f7eed4

Browse files
authored
fix: redirect machine sources away from squads routes (#5866)
1 parent e843c0f commit 3f7eed4

File tree

2 files changed

+66
-2
lines changed

2 files changed

+66
-2
lines changed

packages/webapp/__tests__/SquadFeedPage.tsx

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ import {
4444
} from '@dailydotdev/shared/src/graphql/squads';
4545
import {
4646
type SourceMember,
47+
SourceType,
4748
type Squad,
4849
SourceMemberRole,
4950
SourcePermissions,
@@ -57,8 +58,9 @@ import {
5758
CONTENT_PREFERENCE_STATUS_QUERY,
5859
ContentPreferenceType,
5960
} from '@dailydotdev/shared/src/graphql/contentPreference';
61+
import { gqlClient } from '@dailydotdev/shared/src/graphql/common';
6062
import { useSquad } from '@dailydotdev/shared/src/hooks/squads/useSquad';
61-
import SquadPage from '../pages/squads/[handle]';
63+
import SquadPage, { getServerSideProps } from '../pages/squads/[handle]';
6264

6365
const defaultSquad: Squad = {
6466
...generateTestSquad(),
@@ -259,6 +261,35 @@ const renderComponent = (
259261
};
260262

261263
describe('squad page', () => {
264+
it('should redirect machine sources to the canonical sources route', async () => {
265+
jest.spyOn(gqlClient, 'request').mockResolvedValueOnce({
266+
source: {
267+
id: 'daily',
268+
name: 'daily.dev',
269+
image: 'https://daily.dev/daily.png',
270+
handle: 'daily',
271+
permalink: 'https://app.daily.dev/sources/daily',
272+
type: SourceType.Machine,
273+
public: true,
274+
},
275+
} as Awaited<ReturnType<typeof gqlClient.request>>);
276+
277+
const setHeader = jest.fn();
278+
const result = await getServerSideProps({
279+
params: { handle: 'daily' },
280+
query: {},
281+
res: { setHeader },
282+
} as never);
283+
284+
expect(setHeader).toHaveBeenCalled();
285+
expect(result).toEqual({
286+
redirect: {
287+
destination: '/sources/daily',
288+
permanent: false,
289+
},
290+
});
291+
});
292+
262293
it('should request source feed', async () => {
263294
renderComponent();
264295
await waitForNock();

packages/webapp/pages/squads/[handle]/index.tsx

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,14 @@ import {
2626
} from '@dailydotdev/shared/src/graphql/squads';
2727
import type {
2828
BasicSourceMember,
29+
SourceData,
2930
Squad,
3031
} from '@dailydotdev/shared/src/graphql/sources';
32+
import {
33+
isSourceUserSource,
34+
SOURCE_QUERY,
35+
SourceType,
36+
} from '@dailydotdev/shared/src/graphql/sources';
3137
import Unauthorized from '@dailydotdev/shared/src/components/errors/Unauthorized';
3238
import { useQuery } from '@tanstack/react-query';
3339
import {
@@ -496,6 +502,32 @@ export async function getServerSideProps({
496502
};
497503

498504
try {
505+
const sourceResult = await gqlClient.request<SourceData>(SOURCE_QUERY, {
506+
id: handle,
507+
});
508+
509+
if (isSourceUserSource(sourceResult.source)) {
510+
setCacheHeader();
511+
512+
return {
513+
redirect: {
514+
destination: `/${sourceResult.source.id}`,
515+
permanent: false,
516+
},
517+
};
518+
}
519+
520+
if (sourceResult.source?.type === SourceType.Machine) {
521+
setCacheHeader();
522+
523+
return {
524+
redirect: {
525+
destination: `/sources/${handle}`,
526+
permanent: false,
527+
},
528+
};
529+
}
530+
499531
const referringUserPromise =
500532
userId && campaign
501533
? gqlClient
@@ -553,8 +585,9 @@ export async function getServerSideProps({
553585
} catch (err) {
554586
const clientError = err as ClientError;
555587
const errors = Object.values(ApiError);
588+
const errorCode = clientError?.response?.errors?.[0]?.extensions?.code;
556589

557-
if (errors.includes(clientError?.response?.errors?.[0]?.extensions?.code)) {
590+
if (errors.includes(errorCode)) {
558591
setCacheHeader();
559592

560593
return {

0 commit comments

Comments
 (0)