修复因表单错误导致无法正常审核的问题

Signed-off-by: gfdgd_xi <3025613752@qq.com>
This commit is contained in:
2026-06-17 17:28:27 +08:00
parent cd3e087cdf
commit 337c7b8200
+88 -45
View File
@@ -811,47 +811,42 @@ interface OssUploadMetadata {
} }
const categoryNameToIdMap: Record<string, number> = { const categoryNameToIdMap: Record<string, number> = {
"影音播放": 1, "network": 3,
"图形图像": 2, "chat": 9,
"系统工具": 3, "music": 2,
"办公学习": 4, "video": 12,
"网络通讯": 5, "image_graphics": 6,
"游戏娱乐": 6, "games": 1,
"开发工具": 7, "office": 4,
"科学计算": 8, "reading": 8,
"编程开发": 9, "development": 7,
"系统软件": 10, "tools": 11,
"桌面环境": 11, "themes": 10,
"主题美化": 12, "others": 5,
"网络工具": 13,
"办公软件": 14,
"教育学习": 15,
"影音图像": 16,
"实用工具": 17,
"游戏": 18,
"其他": 19,
}; };
function getCategoryIdByName(categoryName: string): number { function getCategoryIdByName(categoryName: string): number {
return categoryNameToIdMap[categoryName] || 1; return categoryNameToIdMap[categoryName];
} }
function generateUUID(): string { function generateUUID(): string {
return `${Date.now().toString(36)}-${Math.random().toString(36).substr(2, 9)}-${Math.random().toString(36).substr(2, 9)}`; const hexChars = "0123456789abcdef";
let uuid = "";
for (let i = 0; i < 32; i++) {
uuid += hexChars[Math.floor(Math.random() * 16)];
}
return uuid;
} }
function getUUIDFileNameSuggestIcoPic(filePath: string): string { function getUUIDFileNameSuggestIcoPic(filePath: string): string {
const ext = path.extname(filePath).toLowerCase(); const ext = path.extname(filePath).toLowerCase().replace(".", "");
const uuid = generateUUID(); const uuid = generateUUID();
return `${uuid}${ext}`; return `${uuid}.${ext}`;
} }
function getUUIDFileNameSuggestDeb(filePath: string): string { function getUUIDFileNameSuggestDeb(_filePath: string): string {
const fileName = path.basename(filePath).replace(/\s+/g, "_plus_"); const uuid = generateUUID();
const ext = path.extname(fileName).toLowerCase(); return `${uuid}.deb`;
const nameWithoutExt = path.basename(fileName, ext);
const uuid = generateUUID().substring(0, 8);
return `${nameWithoutExt}_${uuid}${ext}`;
} }
async function getOssUploadMetadata(type: "icons" | "pic" | "deb"): Promise<OssUploadMetadata> { async function getOssUploadMetadata(type: "icons" | "pic" | "deb"): Promise<OssUploadMetadata> {
@@ -1108,22 +1103,46 @@ ipcMain.handle("submit-app", async (event, formData: unknown) => {
let iconUrl = ""; let iconUrl = "";
if (iconPath) { if (iconPath) {
if (iconPath.startsWith("http://") || iconPath.startsWith("https://")) {
logger.info({ iconPath }, "[Submitter] Icon is a remote URL, skipping upload");
iconUrl = iconPath;
} else if (fs.existsSync(iconPath)) {
logger.info("[Submitter] ============== STEP 1: UPLOAD ICON =============="); logger.info("[Submitter] ============== STEP 1: UPLOAD ICON ==============");
let iconFilePath = iconPath;
if (iconPath.startsWith("http://") || iconPath.startsWith("https://")) {
logger.info({ iconPath }, "[Submitter] Icon is a remote URL, downloading first");
const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "spark-store-submitter-"));
iconFilePath = path.join(tempDir, "icon.png");
try {
const response = await fetch(iconPath);
if (!response.ok) {
throw new Error(`下载图标失败: ${response.status}`);
}
const blob = await response.blob();
const buffer = Buffer.from(await blob.arrayBuffer());
fs.writeFileSync(iconFilePath, buffer);
logger.info({ iconFilePath, size: buffer.length }, "[Submitter] Icon downloaded successfully");
} catch (err) {
logger.error({ err, iconPath }, "[Submitter] Failed to download icon from URL");
return { success: false, message: `下载图标失败: ${(err as Error).message}` };
}
}
if (fs.existsSync(iconFilePath)) {
const iconMetadata = await getOssUploadMetadata("icons"); const iconMetadata = await getOssUploadMetadata("icons");
const iconFileName = getUUIDFileNameSuggestIcoPic(iconPath); const iconFileName = getUUIDFileNameSuggestIcoPic(iconFilePath);
sendUploadProgress("icon", 0, "正在上传图标..."); sendUploadProgress("icon", 0, "正在上传图标...");
iconUrl = await uploadFileToOss(iconMetadata, iconPath, iconFileName, "image/png", "icon", (progress) => { iconUrl = await uploadFileToOss(iconMetadata, iconFilePath, iconFileName, "image/png", "icon", (progress) => {
sendUploadProgress("icon", progress, `正在上传图标... ${Math.floor(progress)}%`); sendUploadProgress("icon", progress, `正在上传图标... ${Math.floor(progress)}%`);
}); });
sendUploadProgress("icon", 100, "图标上传完成"); sendUploadProgress("icon", 100, "图标上传完成");
logger.info({ iconUrl }, "[Submitter] Icon upload completed"); logger.info({ iconUrl }, "[Submitter] Icon upload completed");
if (iconPath.startsWith("http://") || iconPath.startsWith("https://")) {
fs.unlinkSync(iconFilePath);
fs.rmdirSync(path.dirname(iconFilePath));
}
} else { } else {
logger.error({ iconPath }, "[Submitter] Icon file does not exist"); logger.error({ iconFilePath }, "[Submitter] Icon file does not exist");
return { success: false, message: `图标文件不存在: ${iconPath}` }; return { success: false, message: `图标文件不存在: ${iconFilePath}` };
} }
} }
@@ -1133,22 +1152,46 @@ ipcMain.handle("submit-app", async (event, formData: unknown) => {
logger.info({ index: i, screenshot }, "[Submitter] Processing screenshot"); logger.info({ index: i, screenshot }, "[Submitter] Processing screenshot");
if (typeof screenshot === "string") { if (typeof screenshot === "string") {
if (screenshot.startsWith("http://") || screenshot.startsWith("https://")) {
logger.info({ screenshot }, "[Submitter] Screenshot is a remote URL, skipping upload");
screenshotUrls.push(screenshot);
} else if (fs.existsSync(screenshot)) {
logger.info(`[Submitter] ============== STEP 2: UPLOAD SCREENSHOT ${i + 1} ==============`); logger.info(`[Submitter] ============== STEP 2: UPLOAD SCREENSHOT ${i + 1} ==============`);
let screenshotFilePath = screenshot;
if (screenshot.startsWith("http://") || screenshot.startsWith("https://")) {
logger.info({ screenshot }, "[Submitter] Screenshot is a remote URL, downloading first");
const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "spark-store-submitter-"));
screenshotFilePath = path.join(tempDir, `screen_${i + 1}.png`);
try {
const response = await fetch(screenshot);
if (!response.ok) {
throw new Error(`下载截图失败: ${response.status}`);
}
const blob = await response.blob();
const buffer = Buffer.from(await blob.arrayBuffer());
fs.writeFileSync(screenshotFilePath, buffer);
logger.info({ screenshotFilePath, size: buffer.length }, "[Submitter] Screenshot downloaded successfully");
} catch (err) {
logger.error({ err, screenshot }, "[Submitter] Failed to download screenshot from URL");
continue;
}
}
if (fs.existsSync(screenshotFilePath)) {
const picMetadata = await getOssUploadMetadata("pic"); const picMetadata = await getOssUploadMetadata("pic");
const picFileName = getUUIDFileNameSuggestIcoPic(screenshot); const picFileName = getUUIDFileNameSuggestIcoPic(screenshotFilePath);
sendUploadProgress(`screenshot-${i}`, 0, `正在上传截图 ${i + 1}...`); sendUploadProgress(`screenshot-${i}`, 0, `正在上传截图 ${i + 1}...`);
const picUrl = await uploadFileToOss(picMetadata, screenshot, picFileName, "image/png", `screenshot ${i + 1}`, (progress) => { const picUrl = await uploadFileToOss(picMetadata, screenshotFilePath, picFileName, "image/png", `screenshot ${i + 1}`, (progress) => {
sendUploadProgress(`screenshot-${i}`, progress, `正在上传截图 ${i + 1}... ${Math.floor(progress)}%`); sendUploadProgress(`screenshot-${i}`, progress, `正在上传截图 ${i + 1}... ${Math.floor(progress)}%`);
}); });
sendUploadProgress(`screenshot-${i}`, 100, `截图 ${i + 1} 上传完成`); sendUploadProgress(`screenshot-${i}`, 100, `截图 ${i + 1} 上传完成`);
screenshotUrls.push(picUrl); screenshotUrls.push(picUrl);
logger.info({ picUrl }, `[Submitter] Screenshot ${i + 1} upload completed`); logger.info({ picUrl }, `[Submitter] Screenshot ${i + 1} upload completed`);
if (screenshot.startsWith("http://") || screenshot.startsWith("https://")) {
fs.unlinkSync(screenshotFilePath);
fs.rmdirSync(path.dirname(screenshotFilePath));
}
} else { } else {
logger.warn({ screenshot }, "[Submitter] Screenshot file does not exist, skipping"); logger.warn({ screenshotFilePath }, "[Submitter] Screenshot file does not exist, skipping");
} }
} }
} }
@@ -1178,7 +1221,7 @@ ipcMain.handle("submit-app", async (event, formData: unknown) => {
logger.info({ tagsString, tagsArray }, "[Submitter] Tags conversion"); logger.info({ tagsString, tagsArray }, "[Submitter] Tags conversion");
const submitData = { const submitData = {
application_name: String(dataObj.name || ""), application_name: String(dataObj.pkgname || ""),
application_name_zh: String(dataObj.name || ""), application_name_zh: String(dataObj.name || ""),
contributor: String(dataObj.contributor || ""), contributor: String(dataObj.contributor || ""),
icons: iconUrl, icons: iconUrl,