mirror of
https://github.com/modrinth/code.git
synced 2026-08-25 00:55:25 +00:00
fix(labrinth): disclosure visibility (#7265)
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user