Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions src/crates/contracts/product-domains/src/appearance_market.rs
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,9 @@ pub struct AppearanceMarketSubmissionDraftRequest {
#[serde(rename_all = "camelCase")]
pub struct AppearanceAdminSubmissionDetail {
pub submission: AppearanceMarketSubmission,
/// GitHub account that owns the submission, so reviewers can see who sent it.
#[serde(default, skip_serializing_if = "Option::is_none")]
pub submitter: Option<AppearanceMarketUserSummary>,
#[serde(skip_serializing_if = "Option::is_none")]
pub manifest: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
Expand Down
2 changes: 2 additions & 0 deletions src/crates/services/skin-market-service/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -436,6 +436,8 @@ mod tests {
assert_eq!(response.status(), StatusCode::OK);
let approved = json_body(response).await;
assert_eq!(approved["submission"]["status"], "approved");
assert_eq!(approved["submitter"]["login"], "owner");
assert_eq!(approved["submitter"]["githubId"], 41);
assert!(approved["reviewBundleHash"].as_str().is_some());

let response = app
Expand Down
21 changes: 19 additions & 2 deletions src/crates/services/skin-market-service/src/routes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1521,8 +1521,11 @@ async fn admin_submission_detail(
submission_id: &str,
) -> SkinMarketResult<AppearanceAdminSubmissionDetail> {
let row = sqlx::query(
"SELECT manifest_json, package_sha256, preview_sha256, draft_json, package_meta_json
FROM submissions WHERE id = ?",
"SELECT s.manifest_json, s.package_sha256, s.preview_sha256, s.draft_json,
s.package_meta_json, u.github_id, u.login, u.avatar_url
FROM submissions s
LEFT JOIN users u ON u.id = s.owner_user_id
WHERE s.id = ?",
)
.bind(submission_id)
.fetch_optional(state.database.pool())
Expand Down Expand Up @@ -1559,8 +1562,22 @@ async fn admin_submission_detail(
}
_ => None,
};
let submitter = row
.try_get::<Option<i64>, _>("github_id")
.map_err(SkinMarketError::internal)?
.map(|github_id| {
Ok::<_, SkinMarketError>(AppearanceMarketUserSummary {
github_id,
login: row.try_get("login").map_err(SkinMarketError::internal)?,
avatar_url: row
.try_get("avatar_url")
.map_err(SkinMarketError::internal)?,
})
})
.transpose()?;
Ok(AppearanceAdminSubmissionDetail {
submission: submission_by_id(state, submission_id, None).await?,
submitter,
manifest: manifest_json
.map(|value| parse_json(value, "appearance manifest"))
.transpose()?,
Expand Down
16 changes: 16 additions & 0 deletions src/skin-market-web/src/AdminPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,22 @@ export function AdminPage({ account, accountResolved, locale, t }: AdminPageProp
)}
</header>
<dl className="review-facts">
<div>
<dt>{t('reviewSubmitter')}</dt>
<dd>
{detail.submitter ? (
<a
className="review-submitter"
href={`https://github.com/${detail.submitter.login}`}
target="_blank"
rel="noreferrer noopener"
>
<img src={detail.submitter.avatarUrl} alt="" loading="lazy" decoding="async" />
<span>@{detail.submitter.login}</span>
</a>
) : t('reviewSubmitterUnknown')}
</dd>
</div>
<div><dt>{t('packageIdentity')}</dt><dd>{detail.submission.packageId || t('notDeclared')}</dd></div>
<div><dt>{t('version')}</dt><dd>{detail.submission.packageVersion || t('notDeclared')}</dd></div>
<div><dt>{t('compatibility')}</dt><dd>{detail.submission.minBitfunVersion}</dd></div>
Expand Down
4 changes: 4 additions & 0 deletions src/skin-market-web/src/i18n.ts
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,8 @@ const messages = {
reviewEmptyBody: 'There are no submitted appearance packages waiting for review.',
reviewQueueLabel: 'Submissions awaiting review',
reviewDetailLoading: 'Loading submission details…',
reviewSubmitter: 'Submitted by',
reviewSubmitterUnknown: 'Unknown account',
reviewPackageHash: 'Package SHA-256',
reviewPreviewHash: 'Preview SHA-256',
reviewBundleHash: 'Review bundle hash',
Expand Down Expand Up @@ -249,6 +251,8 @@ const messages = {
reviewEmptyBody: '当前没有等待审核的外观包投稿。',
reviewQueueLabel: '待审核投稿',
reviewDetailLoading: '正在加载投稿详情…',
reviewSubmitter: '投稿账号',
reviewSubmitterUnknown: '未知账号',
reviewPackageHash: '包 SHA-256',
reviewPreviewHash: '预览图 SHA-256',
reviewBundleHash: '审核包哈希',
Expand Down
28 changes: 28 additions & 0 deletions src/skin-market-web/src/styles.css
Original file line number Diff line number Diff line change
Expand Up @@ -1790,6 +1790,34 @@ img {
white-space: nowrap;
}

.review-submitter {
display: inline-flex;
align-items: center;
gap: 7px;
max-width: 100%;
color: inherit;
text-decoration: none;
}

.review-submitter:hover span {
text-decoration: underline;
}

.review-submitter img {
width: 18px;
height: 18px;
flex: 0 0 auto;
border: 1px solid var(--border);
border-radius: 50%;
object-fit: cover;
}

.review-submitter span {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}

.review-section,
.hash-list,
.manifest-panel,
Expand Down
1 change: 1 addition & 0 deletions src/skin-market-web/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ export interface AppearanceSubmission {

export interface AppearanceAdminSubmissionDetail {
submission: AppearanceSubmission;
submitter?: AppearanceMarketUser;
manifest?: unknown;
packageSha256?: string;
previewSha256?: string;
Expand Down