Skip to content

Commit 0fd5940

Browse files
committed
Enhance error handling in all package required routes
1 parent de2572f commit 0fd5940

File tree

3 files changed

+209
-129
lines changed

3 files changed

+209
-129
lines changed
Lines changed: 59 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,71 +1,89 @@
1-
import {
2-
getPublicEnvVariables,
3-
getSessionTools,
4-
} from "cyberstorm/security/publicEnvVariables";
1+
import { NimbusDefaultRouteErrorBoundary } from "cyberstorm/utils/errors/NimbusErrorBoundary";
2+
import { handleLoaderError } from "cyberstorm/utils/errors/handleLoaderError";
3+
import { throwUserFacingPayloadResponse } from "cyberstorm/utils/errors/userFacingErrorResponse";
4+
import { getLoaderTools } from "cyberstorm/utils/getLoaderTools";
5+
import { parseIntegerSearchParam } from "cyberstorm/utils/searchParamsUtils";
56
import { Suspense } from "react";
67
import { type LoaderFunctionArgs } from "react-router";
78
import { Await, useLoaderData } from "react-router";
89
import { PaginatedDependencies } from "~/commonComponents/PaginatedDependencies/PaginatedDependencies";
910

1011
import { SkeletonBox } from "@thunderstore/cyberstorm";
11-
import { DapperTs } from "@thunderstore/dapper-ts";
12+
13+
import { packageDependenciesErrorMappings } from "./Required";
1214

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

25-
return {
26-
version: await dapper.getPackageVersionDetails(
21+
try {
22+
const version = await dapper.getPackageVersionDetails(
2723
params.namespaceId,
2824
params.packageId,
2925
params.packageVersion
30-
),
31-
dependencies: await dapper.getPackageVersionDependencies(
26+
);
27+
const dependencies = await dapper.getPackageVersionDependencies(
3228
params.namespaceId,
3329
params.packageId,
3430
params.packageVersion,
35-
page === null ? undefined : Number(page)
36-
),
37-
};
31+
page
32+
);
33+
34+
return {
35+
version,
36+
dependencies,
37+
};
38+
} catch (error) {
39+
handleLoaderError(error, { mappings: packageDependenciesErrorMappings });
40+
}
3841
}
39-
throw new Response("Package version dependencies not found", { status: 404 });
42+
throwUserFacingPayloadResponse({
43+
headline: "Dependencies not found.",
44+
description: "We could not find the requested version dependencies.",
45+
category: "not_found",
46+
status: 404,
47+
});
4048
}
4149

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

54-
return {
55-
version: dapper.getPackageVersionDetails(
56+
const version = dapper
57+
.getPackageVersionDetails(
5658
params.namespaceId,
5759
params.packageId,
5860
params.packageVersion
59-
),
60-
dependencies: dapper.getPackageVersionDependencies(
61+
)
62+
.catch((error) =>
63+
handleLoaderError(error, { mappings: packageDependenciesErrorMappings })
64+
);
65+
const dependencies = dapper
66+
.getPackageVersionDependencies(
6167
params.namespaceId,
6268
params.packageId,
6369
params.packageVersion,
64-
page === null ? undefined : Number(page)
65-
),
70+
page
71+
)
72+
.catch((error) =>
73+
handleLoaderError(error, { mappings: packageDependenciesErrorMappings })
74+
);
75+
76+
return {
77+
version,
78+
dependencies,
6679
};
6780
}
68-
throw new Response("Package version dependencies not found", { status: 404 });
81+
throwUserFacingPayloadResponse({
82+
headline: "Dependencies not found.",
83+
description: "We could not find the requested version dependencies.",
84+
category: "not_found",
85+
status: 404,
86+
});
6987
}
7088

7189
export default function PackageVersionRequired() {
@@ -88,3 +106,7 @@ export default function PackageVersionRequired() {
88106
</Suspense>
89107
);
90108
}
109+
110+
export function ErrorBoundary() {
111+
return <NimbusDefaultRouteErrorBoundary />;
112+
}
Lines changed: 59 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,71 +1,89 @@
1-
import {
2-
getPublicEnvVariables,
3-
getSessionTools,
4-
} from "cyberstorm/security/publicEnvVariables";
1+
import { NimbusDefaultRouteErrorBoundary } from "cyberstorm/utils/errors/NimbusErrorBoundary";
2+
import { handleLoaderError } from "cyberstorm/utils/errors/handleLoaderError";
3+
import { throwUserFacingPayloadResponse } from "cyberstorm/utils/errors/userFacingErrorResponse";
4+
import { getLoaderTools } from "cyberstorm/utils/getLoaderTools";
5+
import { parseIntegerSearchParam } from "cyberstorm/utils/searchParamsUtils";
56
import { Suspense } from "react";
67
import { type LoaderFunctionArgs } from "react-router";
78
import { Await, useLoaderData } from "react-router";
89
import { PaginatedDependencies } from "~/commonComponents/PaginatedDependencies/PaginatedDependencies";
910

1011
import { SkeletonBox } from "@thunderstore/cyberstorm";
11-
import { DapperTs } from "@thunderstore/dapper-ts";
12+
13+
import { packageDependenciesErrorMappings } from "./Required";
1214

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

25-
return {
26-
version: await dapper.getPackageVersionDetails(
21+
try {
22+
const version = await dapper.getPackageVersionDetails(
2723
params.namespaceId,
2824
params.packageId,
2925
params.packageVersion
30-
),
31-
dependencies: await dapper.getPackageVersionDependencies(
26+
);
27+
const dependencies = await dapper.getPackageVersionDependencies(
3228
params.namespaceId,
3329
params.packageId,
3430
params.packageVersion,
35-
page === null ? undefined : Number(page)
36-
),
37-
};
31+
page
32+
);
33+
34+
return {
35+
version,
36+
dependencies,
37+
};
38+
} catch (error) {
39+
handleLoaderError(error, { mappings: packageDependenciesErrorMappings });
40+
}
3841
}
39-
throw new Response("Package version dependencies not found", { status: 404 });
42+
throwUserFacingPayloadResponse({
43+
headline: "Dependencies not found.",
44+
description: "We could not find the requested version dependencies.",
45+
category: "not_found",
46+
status: 404,
47+
});
4048
}
4149

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

54-
return {
55-
version: dapper.getPackageVersionDetails(
56+
const version = dapper
57+
.getPackageVersionDetails(
5658
params.namespaceId,
5759
params.packageId,
5860
params.packageVersion
59-
),
60-
dependencies: dapper.getPackageVersionDependencies(
61+
)
62+
.catch((error) =>
63+
handleLoaderError(error, { mappings: packageDependenciesErrorMappings })
64+
);
65+
const dependencies = dapper
66+
.getPackageVersionDependencies(
6167
params.namespaceId,
6268
params.packageId,
6369
params.packageVersion,
64-
page === null ? undefined : Number(page)
65-
),
70+
page
71+
)
72+
.catch((error) =>
73+
handleLoaderError(error, { mappings: packageDependenciesErrorMappings })
74+
);
75+
76+
return {
77+
version,
78+
dependencies,
6679
};
6780
}
68-
throw new Response("Package version dependencies not found", { status: 404 });
81+
throwUserFacingPayloadResponse({
82+
headline: "Dependencies not found.",
83+
description: "We could not find the requested version dependencies.",
84+
category: "not_found",
85+
status: 404,
86+
});
6987
}
7088

7189
export default function PackageVersionWithoutCommunityRequired() {
@@ -88,3 +106,7 @@ export default function PackageVersionWithoutCommunityRequired() {
88106
</Suspense>
89107
);
90108
}
109+
110+
export function ErrorBoundary() {
111+
return <NimbusDefaultRouteErrorBoundary />;
112+
}

0 commit comments

Comments
 (0)