Skip to content

Commit b3c1cb3

Browse files
committed
Enhance error handling in all package required routes
1 parent cd40580 commit b3c1cb3

File tree

3 files changed

+214
-135
lines changed

3 files changed

+214
-135
lines changed
Lines changed: 61 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,70 +1,87 @@
11
import { Suspense } from "react";
2-
import { type LoaderFunctionArgs } from "react-router";
3-
import { useLoaderData, Await } from "react-router";
4-
import { DapperTs } from "@thunderstore/dapper-ts";
5-
import { SkeletonBox } from "@thunderstore/cyberstorm";
2+
import { Await, type LoaderFunctionArgs } from "react-router";
3+
import { useLoaderData } from "react-router";
64
import { PaginatedDependencies } from "~/commonComponents/PaginatedDependencies/PaginatedDependencies";
7-
import {
8-
getPublicEnvVariables,
9-
getSessionTools,
10-
} from "cyberstorm/security/publicEnvVariables";
5+
import { throwUserFacingPayloadResponse } from "cyberstorm/utils/errors/userFacingErrorResponse";
6+
import { handleLoaderError } from "cyberstorm/utils/errors/handleLoaderError";
7+
import { packageDependenciesErrorMappings } from "./Required";
8+
import { NimbusDefaultRouteErrorBoundary } from "cyberstorm/utils/errors/NimbusErrorBoundary";
9+
import { getLoaderTools } from "cyberstorm/utils/getLoaderTools";
10+
import { SkeletonBox } from "@thunderstore/cyberstorm";
11+
import { parseIntegerSearchParam } from "cyberstorm/utils/searchParamsUtils";
1112

1213
export async function loader({ params, request }: LoaderFunctionArgs) {
1314
if (params.namespaceId && params.packageId && params.packageVersion) {
14-
const publicEnvVariables = getPublicEnvVariables(["VITE_API_URL"]);
15-
const dapper = new DapperTs(() => {
16-
return {
17-
apiHost: publicEnvVariables.VITE_API_URL,
18-
sessionId: undefined,
19-
};
20-
});
15+
const { dapper } = getLoaderTools();
2116
const searchParams = new URL(request.url).searchParams;
22-
const page = searchParams.get("page");
17+
const page = parseIntegerSearchParam(searchParams.get("page"));
2318

24-
return {
25-
version: await dapper.getPackageVersionDetails(
19+
try {
20+
const version = await dapper.getPackageVersionDetails(
2621
params.namespaceId,
2722
params.packageId,
2823
params.packageVersion
29-
),
30-
dependencies: await dapper.getPackageVersionDependencies(
24+
);
25+
const dependencies = await dapper.getPackageVersionDependencies(
3126
params.namespaceId,
3227
params.packageId,
3328
params.packageVersion,
34-
page === null ? undefined : Number(page)
35-
),
36-
};
29+
page
30+
);
31+
32+
return {
33+
version,
34+
dependencies,
35+
};
36+
} catch (error) {
37+
handleLoaderError(error, { mappings: packageDependenciesErrorMappings });
38+
}
3739
}
38-
throw new Response("Package version dependencies not found", { status: 404 });
40+
throwUserFacingPayloadResponse({
41+
headline: "Dependencies not found.",
42+
description: "We could not find the requested version dependencies.",
43+
category: "not_found",
44+
status: 404,
45+
});
3946
}
4047

41-
export async function clientLoader({ params, request }: LoaderFunctionArgs) {
48+
export function clientLoader({ params, request }: LoaderFunctionArgs) {
4249
if (params.namespaceId && params.packageId && params.packageVersion) {
43-
const tools = getSessionTools();
44-
const dapper = new DapperTs(() => {
45-
return {
46-
apiHost: tools?.getConfig().apiHost,
47-
sessionId: tools?.getConfig().sessionId,
48-
};
49-
});
50+
const { dapper } = getLoaderTools();
5051
const searchParams = new URL(request.url).searchParams;
51-
const page = searchParams.get("page");
52+
const page = parseIntegerSearchParam(searchParams.get("page"));
5253

53-
return {
54-
version: dapper.getPackageVersionDetails(
54+
const version = dapper
55+
.getPackageVersionDetails(
5556
params.namespaceId,
5657
params.packageId,
5758
params.packageVersion
58-
),
59-
dependencies: dapper.getPackageVersionDependencies(
59+
)
60+
.catch((error) =>
61+
handleLoaderError(error, { mappings: packageDependenciesErrorMappings })
62+
);
63+
const dependencies = dapper
64+
.getPackageVersionDependencies(
6065
params.namespaceId,
6166
params.packageId,
6267
params.packageVersion,
63-
page === null ? undefined : Number(page)
64-
),
68+
page
69+
)
70+
.catch((error) =>
71+
handleLoaderError(error, { mappings: packageDependenciesErrorMappings })
72+
);
73+
74+
return {
75+
version,
76+
dependencies,
6577
};
6678
}
67-
throw new Response("Package version dependencies not found", { status: 404 });
79+
throwUserFacingPayloadResponse({
80+
headline: "Dependencies not found.",
81+
description: "We could not find the requested version dependencies.",
82+
category: "not_found",
83+
status: 404,
84+
});
6885
}
6986

7087
export default function PackageVersionRequired() {
@@ -87,3 +104,7 @@ export default function PackageVersionRequired() {
87104
</Suspense>
88105
);
89106
}
107+
108+
export function ErrorBoundary() {
109+
return <NimbusDefaultRouteErrorBoundary />;
110+
}
Lines changed: 61 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,70 +1,87 @@
11
import { Suspense } from "react";
2-
import { type LoaderFunctionArgs } from "react-router";
3-
import { useLoaderData, Await } from "react-router";
4-
import { DapperTs } from "@thunderstore/dapper-ts";
5-
import { SkeletonBox } from "@thunderstore/cyberstorm";
2+
import { Await, type LoaderFunctionArgs } from "react-router";
3+
import { useLoaderData } from "react-router";
64
import { PaginatedDependencies } from "~/commonComponents/PaginatedDependencies/PaginatedDependencies";
7-
import {
8-
getPublicEnvVariables,
9-
getSessionTools,
10-
} from "cyberstorm/security/publicEnvVariables";
5+
import { throwUserFacingPayloadResponse } from "cyberstorm/utils/errors/userFacingErrorResponse";
6+
import { handleLoaderError } from "cyberstorm/utils/errors/handleLoaderError";
7+
import { packageDependenciesErrorMappings } from "./Required";
8+
import { NimbusDefaultRouteErrorBoundary } from "cyberstorm/utils/errors/NimbusErrorBoundary";
9+
import { getLoaderTools } from "cyberstorm/utils/getLoaderTools";
10+
import { SkeletonBox } from "@thunderstore/cyberstorm";
11+
import { parseIntegerSearchParam } from "cyberstorm/utils/searchParamsUtils";
1112

1213
export async function loader({ params, request }: LoaderFunctionArgs) {
1314
if (params.namespaceId && params.packageId && params.packageVersion) {
14-
const publicEnvVariables = getPublicEnvVariables(["VITE_API_URL"]);
15-
const dapper = new DapperTs(() => {
16-
return {
17-
apiHost: publicEnvVariables.VITE_API_URL,
18-
sessionId: undefined,
19-
};
20-
});
15+
const { dapper } = getLoaderTools();
2116
const searchParams = new URL(request.url).searchParams;
22-
const page = searchParams.get("page");
17+
const page = parseIntegerSearchParam(searchParams.get("page"));
2318

24-
return {
25-
version: await dapper.getPackageVersionDetails(
19+
try {
20+
const version = await dapper.getPackageVersionDetails(
2621
params.namespaceId,
2722
params.packageId,
2823
params.packageVersion
29-
),
30-
dependencies: await dapper.getPackageVersionDependencies(
24+
);
25+
const dependencies = await dapper.getPackageVersionDependencies(
3126
params.namespaceId,
3227
params.packageId,
3328
params.packageVersion,
34-
page === null ? undefined : Number(page)
35-
),
36-
};
29+
page
30+
);
31+
32+
return {
33+
version,
34+
dependencies,
35+
};
36+
} catch (error) {
37+
handleLoaderError(error, { mappings: packageDependenciesErrorMappings });
38+
}
3739
}
38-
throw new Response("Package version dependencies not found", { status: 404 });
40+
throwUserFacingPayloadResponse({
41+
headline: "Dependencies not found.",
42+
description: "We could not find the requested version dependencies.",
43+
category: "not_found",
44+
status: 404,
45+
});
3946
}
4047

41-
export async function clientLoader({ params, request }: LoaderFunctionArgs) {
48+
export function clientLoader({ params, request }: LoaderFunctionArgs) {
4249
if (params.namespaceId && params.packageId && params.packageVersion) {
43-
const tools = getSessionTools();
44-
const dapper = new DapperTs(() => {
45-
return {
46-
apiHost: tools?.getConfig().apiHost,
47-
sessionId: tools?.getConfig().sessionId,
48-
};
49-
});
50+
const { dapper } = getLoaderTools();
5051
const searchParams = new URL(request.url).searchParams;
51-
const page = searchParams.get("page");
52+
const page = parseIntegerSearchParam(searchParams.get("page"));
5253

53-
return {
54-
version: dapper.getPackageVersionDetails(
54+
const version = dapper
55+
.getPackageVersionDetails(
5556
params.namespaceId,
5657
params.packageId,
5758
params.packageVersion
58-
),
59-
dependencies: dapper.getPackageVersionDependencies(
59+
)
60+
.catch((error) =>
61+
handleLoaderError(error, { mappings: packageDependenciesErrorMappings })
62+
);
63+
const dependencies = dapper
64+
.getPackageVersionDependencies(
6065
params.namespaceId,
6166
params.packageId,
6267
params.packageVersion,
63-
page === null ? undefined : Number(page)
64-
),
68+
page
69+
)
70+
.catch((error) =>
71+
handleLoaderError(error, { mappings: packageDependenciesErrorMappings })
72+
);
73+
74+
return {
75+
version,
76+
dependencies,
6577
};
6678
}
67-
throw new Response("Package version dependencies not found", { status: 404 });
79+
throwUserFacingPayloadResponse({
80+
headline: "Dependencies not found.",
81+
description: "We could not find the requested version dependencies.",
82+
category: "not_found",
83+
status: 404,
84+
});
6885
}
6986

7087
export default function PackageVersionWithoutCommunityRequired() {
@@ -87,3 +104,7 @@ export default function PackageVersionWithoutCommunityRequired() {
87104
</Suspense>
88105
);
89106
}
107+
108+
export function ErrorBoundary() {
109+
return <NimbusDefaultRouteErrorBoundary />;
110+
}

0 commit comments

Comments
 (0)