Skip to content

Commit 85fe37d

Browse files
committed
fix(topbar): support teams in topbar owner links
1 parent 7c63657 commit 85fe37d

13 files changed

+110
-44
lines changed

.sqlx/query-d9fdce61d807d32b2c700c29e0b8100b5abf2d283016f48f468d823bd85da551.json renamed to .sqlx/query-24c697ed817d33dbdfb0e5126feaf3f5addfba6ed45f46afdc523b324da2cbab.json

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

.sqlx/query-5deb5bb52b993cc54f7b48714c77903829961a7b50ae4bfbdb9b34c38f374932.json

Lines changed: 0 additions & 23 deletions
This file was deleted.

.sqlx/query-87952bd450ed2c13b99bd502a73a84edd7d17e6171523ebbd57f1d9dd7c9b46c.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.

.sqlx/query-073b7016109d65c3d7907ce2b32b47018ce25577d6d9267da38edb53828ada41.json renamed to .sqlx/query-b6273727360630c958b856427cb9dacc3289dcadf82061774866fec3a62669c5.json

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

.sqlx/query-8e1cb8355b3586b849494ae1cbde9b034ca01090469a84df2d9af4446f9d9451.json renamed to .sqlx/query-ee9dddd0c37c0e89eab1feaddd27e5e9c7016a1b8b35b031cb05b4d0802b6be1.json

Lines changed: 8 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
ALTER TABLE owners
2+
DROP COLUMN IF EXISTS kind;
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
ALTER TABLE owners
2+
ADD COLUMN IF NOT EXISTS kind TEXT NOT NULL CHECK (
3+
kind IN ('user', 'team')
4+
) DEFAULT 'user';

src/db/add_package.rs

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -454,14 +454,16 @@ async fn update_owners_in_database(
454454
for owner in owners {
455455
oids.push(
456456
sqlx::query_scalar!(
457-
"INSERT INTO owners (login, avatar)
458-
VALUES ($1, $2)
457+
"INSERT INTO owners (login, avatar, kind)
458+
VALUES ($1, $2, $3)
459459
ON CONFLICT (login) DO UPDATE
460460
SET
461-
avatar = EXCLUDED.avatar
461+
avatar = EXCLUDED.avatar,
462+
kind = EXCLUDED.kind
462463
RETURNING id",
463464
owner.login,
464-
owner.avatar
465+
owner.avatar,
466+
owner.kind,
465467
)
466468
.fetch_one(&mut *conn)
467469
.await?,
@@ -647,18 +649,20 @@ mod test {
647649
let owner1 = CrateOwner {
648650
avatar: "avatar".into(),
649651
login: "login".into(),
652+
kind: "user".into(),
650653
};
651654

652655
update_owners_in_database(&mut conn, &[owner1.clone()], crate_id).await?;
653656

654657
let owner_def = sqlx::query!(
655-
"SELECT login, avatar
658+
"SELECT login, avatar, kind
656659
FROM owners"
657660
)
658661
.fetch_one(&mut *conn)
659662
.await?;
660663
assert_eq!(owner_def.login, owner1.login);
661664
assert_eq!(owner_def.avatar, owner1.avatar);
665+
assert_eq!(owner_def.kind, owner1.kind);
662666

663667
let owner_rel = sqlx::query!(
664668
"SELECT o.login
@@ -688,6 +692,7 @@ mod test {
688692
&[CrateOwner {
689693
login: "login".into(),
690694
avatar: "avatar".into(),
695+
kind: "user".into(),
691696
}],
692697
crate_id,
693698
)
@@ -696,14 +701,16 @@ mod test {
696701
let updated_owner = CrateOwner {
697702
login: "login".into(),
698703
avatar: "avatar2".into(),
704+
kind: "team".into(),
699705
};
700706
update_owners_in_database(&mut conn, &[updated_owner.clone()], crate_id).await?;
701707

702-
let owner_def = sqlx::query!("SELECT login, avatar FROM owners")
708+
let owner_def = sqlx::query!("SELECT login, avatar, kind FROM owners")
703709
.fetch_one(&mut *conn)
704710
.await?;
705711
assert_eq!(owner_def.login, updated_owner.login);
706712
assert_eq!(owner_def.avatar, updated_owner.avatar);
713+
assert_eq!(owner_def.kind, updated_owner.kind);
707714

708715
let owner_rel = sqlx::query!(
709716
"SELECT o.login
@@ -733,6 +740,7 @@ mod test {
733740
&[CrateOwner {
734741
login: "login".into(),
735742
avatar: "avatar".into(),
743+
kind: "user".into(),
736744
}],
737745
crate_id,
738746
)
@@ -742,6 +750,7 @@ mod test {
742750
.map(|i| CrateOwner {
743751
login: format!("login{i}"),
744752
avatar: format!("avatar{i}"),
753+
kind: "user".into(),
745754
})
746755
.collect();
747756

src/db/delete.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,7 @@ mod tests {
328328
.add_owner(CrateOwner {
329329
login: "malicious actor".into(),
330330
avatar: "https://example.org/malicious".into(),
331+
kind: "user".into(),
331332
})
332333
.create()?;
333334
assert!(release_exists(&mut db.conn(), v1)?);
@@ -358,6 +359,7 @@ mod tests {
358359
.add_owner(CrateOwner {
359360
login: "Peter Rabbit".into(),
360361
avatar: "https://example.org/peter".into(),
362+
kind: "user".into(),
361363
})
362364
.create()?;
363365
assert!(release_exists(&mut db.conn(), v2)?);

src/registry_api.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ impl Default for ReleaseData {
4646
pub struct CrateOwner {
4747
pub(crate) avatar: String,
4848
pub(crate) login: String,
49+
pub(crate) kind: String,
4950
}
5051

5152
impl RegistryApi {
@@ -168,6 +169,8 @@ impl RegistryApi {
168169
avatar: Option<String>,
169170
#[serde(default)]
170171
login: Option<String>,
172+
#[serde(default)]
173+
kind: Option<String>,
171174
}
172175

173176
let response: Response = retry_async(
@@ -198,6 +201,7 @@ impl RegistryApi {
198201
.map(|data| CrateOwner {
199202
avatar: data.avatar.unwrap_or_default(),
200203
login: data.login.unwrap_or_default(),
204+
kind: data.kind.unwrap_or("user".into()),
201205
})
202206
.collect();
203207

src/web/crate_details.rs

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ pub(crate) struct CrateDetails {
3535
name: String,
3636
pub version: Version,
3737
description: Option<String>,
38-
owners: Vec<(String, String)>,
38+
owners: Vec<(String, String, String)>,
3939
dependencies: Option<Value>,
4040
#[serde(serialize_with = "optional_markdown")]
4141
readme: Option<String>,
@@ -264,14 +264,14 @@ impl CrateDetails {
264264

265265
// get owners
266266
crate_details.owners = sqlx::query!(
267-
"SELECT login, avatar
267+
"SELECT login, avatar, kind
268268
FROM owners
269269
INNER JOIN owner_rels ON owner_rels.oid = owners.id
270270
WHERE cid = $1",
271271
krate.crate_id,
272272
)
273273
.fetch(&mut *conn)
274-
.map_ok(|row| (row.login, row.avatar))
274+
.map_ok(|row| (row.login, row.avatar, row.kind))
275275
.try_collect()
276276
.await?;
277277

@@ -1253,6 +1253,7 @@ mod tests {
12531253
.add_owner(CrateOwner {
12541254
login: "foobar".into(),
12551255
avatar: "https://example.org/foobar".into(),
1256+
kind: "user".into(),
12561257
})
12571258
.create()?;
12581259

@@ -1262,7 +1263,11 @@ mod tests {
12621263
});
12631264
assert_eq!(
12641265
details.owners,
1265-
vec![("foobar".into(), "https://example.org/foobar".into())]
1266+
vec![(
1267+
"foobar".into(),
1268+
"https://example.org/foobar".into(),
1269+
"user".into()
1270+
)]
12661271
);
12671272

12681273
// Adding a new owner, and changing details on an existing owner
@@ -1272,10 +1277,12 @@ mod tests {
12721277
.add_owner(CrateOwner {
12731278
login: "foobar".into(),
12741279
avatar: "https://example.org/foobarv2".into(),
1280+
kind: "user".into(),
12751281
})
12761282
.add_owner(CrateOwner {
12771283
login: "barfoo".into(),
12781284
avatar: "https://example.org/barfoo".into(),
1285+
kind: "user".into(),
12791286
})
12801287
.create()?;
12811288

@@ -1288,8 +1295,16 @@ mod tests {
12881295
assert_eq!(
12891296
owners,
12901297
vec![
1291-
("barfoo".into(), "https://example.org/barfoo".into()),
1292-
("foobar".into(), "https://example.org/foobarv2".into())
1298+
(
1299+
"barfoo".into(),
1300+
"https://example.org/barfoo".into(),
1301+
"user".into()
1302+
),
1303+
(
1304+
"foobar".into(),
1305+
"https://example.org/foobarv2".into(),
1306+
"user".into()
1307+
)
12931308
]
12941309
);
12951310

@@ -1300,6 +1315,7 @@ mod tests {
13001315
.add_owner(CrateOwner {
13011316
login: "barfoo".into(),
13021317
avatar: "https://example.org/barfoo".into(),
1318+
kind: "user".into(),
13031319
})
13041320
.create()?;
13051321

@@ -1309,7 +1325,11 @@ mod tests {
13091325
});
13101326
assert_eq!(
13111327
details.owners,
1312-
vec![("barfoo".into(), "https://example.org/barfoo".into())]
1328+
vec![(
1329+
"barfoo".into(),
1330+
"https://example.org/barfoo".into(),
1331+
"user".into()
1332+
)]
13131333
);
13141334

13151335
// Changing owner details on another of their crates applies the change to both
@@ -1319,6 +1339,7 @@ mod tests {
13191339
.add_owner(CrateOwner {
13201340
login: "barfoo".into(),
13211341
avatar: "https://example.org/barfoov2".into(),
1342+
kind: "user".into(),
13221343
})
13231344
.create()?;
13241345

@@ -1328,7 +1349,11 @@ mod tests {
13281349
});
13291350
assert_eq!(
13301351
details.owners,
1331-
vec![("barfoo".into(), "https://example.org/barfoov2".into())]
1352+
vec![(
1353+
"barfoo".into(),
1354+
"https://example.org/barfoov2".into(),
1355+
"user".into()
1356+
)]
13321357
);
13331358

13341359
Ok(())

0 commit comments

Comments
 (0)