fix(labrinth): disclosure visibility (#7265)

This commit is contained in:
Sychic
2026-08-21 18:30:11 +00:00
committed by GitHub
parent 237963bb35
commit 797ec2ec3c
4 changed files with 23 additions and 14 deletions
@@ -47,7 +47,7 @@ function createLockStatuses(
) as Record<DisclosureType, DisclosureLockStatus> ) as Record<DisclosureType, DisclosureLockStatus>
for (const disclosure of disclosures) { for (const disclosure of disclosures) {
lockStatuses[disclosure.type] = disclosure.lock_status lockStatuses[disclosure.type] = disclosure.lock_status ?? 'unlocked'
} }
return lockStatuses return lockStatuses
+12 -8
View File
@@ -111,8 +111,10 @@ impl DisclosureLockStatus {
pub struct ProjectDisclosureData { pub struct ProjectDisclosureData {
#[serde(flatten)] #[serde(flatten)]
pub disclosure: ProjectDisclosure, pub disclosure: ProjectDisclosure,
pub set_by_moderator: bool, #[serde(skip_serializing_if = "Option::is_none")]
pub lock_status: DisclosureLockStatus, pub set_by_moderator: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub lock_status: Option<DisclosureLockStatus>,
pub updated_at: DateTime<Utc>, pub updated_at: DateTime<Utc>,
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
pub updated_by: Option<UserId>, pub updated_by: Option<UserId>,
@@ -124,16 +126,18 @@ impl ProjectDisclosureData {
pub fn from_db( pub fn from_db(
value: DBProjectDisclosure, value: DBProjectDisclosure,
viewer_is_moderator: bool, viewer_is_moderator: bool,
viewer_is_member: bool,
) -> Self { ) -> Self {
let updated_by = (!value.set_by_moderator || viewer_is_moderator)
.then_some(value.updated_by.into());
Self { Self {
disclosure: value.disclosure, disclosure: value.disclosure,
set_by_moderator: value.set_by_moderator, set_by_moderator: (viewer_is_member || viewer_is_moderator)
lock_status: value.lock_status, .then_some(value.set_by_moderator),
lock_status: (viewer_is_member || viewer_is_moderator)
.then_some(value.lock_status),
updated_at: value.updated_at, updated_at: value.updated_at,
updated_by, updated_by: ((!value.set_by_moderator && viewer_is_member)
|| viewer_is_moderator)
.then_some(value.updated_by.into()),
deleted_at: value.deleted_at, deleted_at: value.deleted_at,
} }
} }
+8 -3
View File
@@ -73,14 +73,15 @@ pub async fn get_project_disclosures(
let viewer_is_moderator = let viewer_is_moderator =
user_option.as_ref().is_some_and(|user| user.role.is_mod()); user_option.as_ref().is_some_and(|user| user.role.is_mod());
let include_deleted = viewer_is_moderator // Moderators can see regardless of membership, short circuit to avoid extra db call
let viewer_is_member = viewer_is_moderator
|| is_team_member_project(&project.inner, &user_option, &pool) || is_team_member_project(&project.inner, &user_option, &pool)
.await .await
.wrap_internal_err("failed to check project team membership")?; .wrap_internal_err("failed to check project team membership")?;
let disclosures = db_models::DBProjectDisclosure::get_many_for_project( let disclosures = db_models::DBProjectDisclosure::get_many_for_project(
project.inner.id, project.inner.id,
include_deleted, viewer_is_moderator || viewer_is_member,
&***ro_pool, &***ro_pool,
) )
.await .await
@@ -90,7 +91,11 @@ pub async fn get_project_disclosures(
disclosures: disclosures disclosures: disclosures
.into_iter() .into_iter()
.map(|disclosure| { .map(|disclosure| {
ProjectDisclosureData::from_db(disclosure, viewer_is_moderator) ProjectDisclosureData::from_db(
disclosure,
viewer_is_moderator,
viewer_is_member,
)
}) })
.collect(), .collect(),
})) }))
@@ -1352,8 +1352,8 @@ export namespace Labrinth {
} }
export type ProjectDisclosureData = ProjectDisclosure & { export type ProjectDisclosureData = ProjectDisclosure & {
set_by_moderator: boolean set_by_moderator?: boolean | null
lock_status: DisclosureLockStatus lock_status?: DisclosureLockStatus | null
updated_at: string updated_at: string
updated_by?: string | null updated_by?: string | null
deleted_at?: string | null deleted_at?: string | null