Skip to content

Commit 8cd11fe

Browse files
authored
feat : Show dependencies dependents count #342 (#857)
Fixes #342. I think a should export some code to improve visibility in of the `get_handler` function in `package.rs` into an other file but where ? `utils.rs` ? Ready to read suggestions and make changes if needed !
1 parent 5aa45a6 commit 8cd11fe

20 files changed

+130
-2
lines changed

api/.sqlx/query-8433bacb42d0833b723781eff2467ab27542e94691c1a5626c3f3d8c090caa54.json

Lines changed: 24 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/src/api/package.rs

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ use crate::iam::ReqIamExt;
7171
use crate::ids::PackageName;
7272
use crate::ids::PackagePath;
7373
use crate::ids::ScopeName;
74+
use crate::ids::Version;
7475
use crate::metadata::PackageMetadata;
7576
use crate::metadata::VersionMetadata;
7677
use crate::npm::generate_npm_version_manifest;
@@ -333,12 +334,30 @@ pub async fn get_handler(req: Request<Body>) -> ApiResult<ApiPackage> {
333334
Span::current().record("package", field::display(&package));
334335

335336
let db = req.data::<Database>().unwrap();
336-
let package = db
337+
let res_package = db
337338
.get_package(&scope, &package)
338339
.await?
339340
.ok_or(ApiError::PackageNotFound)?;
340341

341-
Ok(ApiPackage::from(package))
342+
let mut api_package = ApiPackage::from(res_package);
343+
344+
if let Some(latest_v) = &api_package.latest_version {
345+
let latest_version = Version::new(latest_v).unwrap();
346+
let dependency_count = db
347+
.count_package_dependencies(&scope, &package, &latest_version)
348+
.await?;
349+
api_package.dependency_count = dependency_count as u64;
350+
}
351+
352+
let dependent_count = db
353+
.count_package_dependents(
354+
crate::db::DependencyKind::Jsr,
355+
&format!("@{}/{}", scope, package),
356+
)
357+
.await?;
358+
api_package.dependent_count = dependent_count as u64;
359+
360+
Ok(api_package)
342361
}
343362

344363
#[instrument(

api/src/api/types.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,8 @@ pub struct ApiPackage {
470470
pub updated_at: DateTime<Utc>,
471471
pub created_at: DateTime<Utc>,
472472
pub version_count: u64,
473+
pub dependency_count: u64,
474+
pub dependent_count: u64,
473475
pub score: Option<u32>,
474476
pub latest_version: Option<String>,
475477
pub when_featured: Option<DateTime<Utc>>,
@@ -491,6 +493,8 @@ impl From<PackageWithGitHubRepoAndMeta> for ApiPackage {
491493
updated_at: package.updated_at,
492494
created_at: package.created_at,
493495
version_count: package.version_count as u64,
496+
dependency_count: 0,
497+
dependent_count: 0,
494498
score: package
495499
.latest_version
496500
.as_ref()

api/src/db/database.rs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2858,6 +2858,48 @@ impl Database {
28582858
Ok((total_unique_package_dependents as usize, dependents))
28592859
}
28602860

2861+
#[instrument(name = "Database::count_package_dependents", skip(self), err)]
2862+
pub async fn count_package_dependents(
2863+
&self,
2864+
kind: DependencyKind,
2865+
name: &str,
2866+
) -> Result<usize> {
2867+
let total_unique_package_dependents = sqlx::query!(
2868+
r#"SELECT COUNT(DISTINCT (package_scope, package_name)) FROM package_version_dependencies
2869+
WHERE dependency_kind = $1 AND dependency_name = $2;"#,
2870+
kind as _,
2871+
name,
2872+
)
2873+
.map(|r| r.count.unwrap())
2874+
.fetch_one(&self.pool)
2875+
.await?;
2876+
2877+
Ok(total_unique_package_dependents as usize)
2878+
}
2879+
2880+
#[instrument(name = "Database::count_package_dependencies", skip(self), err)]
2881+
pub async fn count_package_dependencies(
2882+
&self,
2883+
scope: &ScopeName,
2884+
name: &PackageName,
2885+
version: &Version,
2886+
) -> Result<usize> {
2887+
let total_package_dependencies = sqlx::query!(
2888+
r#"SELECT COUNT(DISTINCT dependency_name)
2889+
FROM package_version_dependencies
2890+
WHERE package_scope = $1 AND package_name = $2 AND package_version = $3"#,
2891+
scope as _,
2892+
name as _,
2893+
version as _
2894+
)
2895+
.fetch_one(&self.pool)
2896+
.await?
2897+
.count
2898+
.unwrap();
2899+
2900+
Ok(total_package_dependencies as usize)
2901+
}
2902+
28612903
#[instrument(name = "Database::check_bad_word", skip(self), err)]
28622904
pub async fn check_is_bad_word(&self, word: &str) -> Result<bool> {
28632905
let res = sqlx::query!("SELECT * FROM bad_words WHERE word = $1", word)

frontend/routes/package/(_components)/PackageNav.tsx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ interface PackageNavProps {
2323
currentTab: Tab;
2424
params: Params;
2525
versionCount: number;
26+
dependencyCount: number;
27+
dependentCount: number;
2628
iam: ScopeIAM;
2729
latestVersion: string | null;
2830
}
@@ -32,6 +34,8 @@ export function PackageNav({
3234
params,
3335
iam,
3436
versionCount,
37+
dependencyCount,
38+
dependentCount,
3539
latestVersion,
3640
}: PackageNavProps) {
3741
const base = `/@${params.scope}/${params.package}`;
@@ -74,6 +78,9 @@ export function PackageNav({
7478
active={currentTab === "Dependencies"}
7579
>
7680
Dependencies
81+
<span class="chip tabular-nums border-1 border-white bg-jsr-cyan-100 ml-2 flex items-center justify-center">
82+
{dependencyCount}
83+
</span>
7784
</NavItem>
7885
)}
7986
{versionCount > 0 && (
@@ -82,6 +89,9 @@ export function PackageNav({
8289
active={currentTab === "Dependents"}
8390
>
8491
Dependents
92+
<span class="chip tabular-nums border-1 border-white bg-jsr-cyan-100 ml-2 flex items-center justify-center">
93+
{dependentCount}
94+
</span>
8595
</NavItem>
8696
)}
8797
{versionCount > 0 && (

frontend/routes/package/all_symbols.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ export default define.page<typeof handler>(function AllSymbols(
2222
<PackageNav
2323
currentTab="Docs"
2424
versionCount={data.package.versionCount}
25+
dependencyCount={data.package.dependencyCount}
26+
dependentCount={data.package.dependentCount}
2527
iam={iam}
2628
params={params as unknown as Params}
2729
latestVersion={data.package.latestVersion}

frontend/routes/package/dependencies/graph.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ export default define.page<typeof handler>(
2323
<PackageNav
2424
currentTab="Dependencies"
2525
versionCount={data.package.versionCount}
26+
dependencyCount={data.package.dependencyCount}
27+
dependentCount={data.package.dependentCount}
2628
iam={iam}
2729
params={params as unknown as Params}
2830
latestVersion={data.package.latestVersion}

frontend/routes/package/dependencies/index.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ export default define.page<typeof handler>(function Deps(
6868
<PackageNav
6969
currentTab="Dependencies"
7070
versionCount={data.package.versionCount}
71+
dependencyCount={data.package.dependencyCount}
72+
dependentCount={data.package.dependentCount}
7173
iam={iam}
7274
params={params as unknown as Params}
7375
latestVersion={data.package.latestVersion}

frontend/routes/package/dependents.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ export default define.page<typeof handler>(function Dep(
2121
<PackageNav
2222
currentTab="Dependents"
2323
versionCount={data.package.versionCount}
24+
dependencyCount={data.package.dependencyCount}
25+
dependentCount={data.package.dependentCount}
2426
iam={iam}
2527
params={params as unknown as Params}
2628
latestVersion={data.package.latestVersion}

frontend/routes/package/doc/[file].tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ export default define.page<typeof handler>(function File({
2424
<PackageNav
2525
currentTab="Docs"
2626
versionCount={data.package.versionCount}
27+
dependencyCount={data.package.dependencyCount}
28+
dependentCount={data.package.dependentCount}
2729
iam={iam}
2830
params={params as unknown as Params}
2931
latestVersion={data.package.latestVersion}

0 commit comments

Comments
 (0)