diff --git a/backend/services/mining-admin-service/prisma/migrations/20260129_add_app_versions/migration.sql b/backend/services/mining-admin-service/prisma/migrations/20260129_add_app_versions/migration.sql new file mode 100644 index 00000000..bb2cd0cc --- /dev/null +++ b/backend/services/mining-admin-service/prisma/migrations/20260129_add_app_versions/migration.sql @@ -0,0 +1,31 @@ +-- CreateEnum +CREATE TYPE "Platform" AS ENUM ('ANDROID', 'IOS'); + +-- CreateTable +CREATE TABLE "app_versions" ( + "id" TEXT NOT NULL, + "platform" "Platform" NOT NULL, + "version_code" INTEGER NOT NULL, + "version_name" TEXT NOT NULL, + "build_number" TEXT NOT NULL, + "download_url" TEXT NOT NULL, + "file_size" BIGINT NOT NULL, + "file_sha256" TEXT NOT NULL, + "min_os_version" TEXT, + "changelog" TEXT NOT NULL, + "is_force_update" BOOLEAN NOT NULL DEFAULT false, + "is_enabled" BOOLEAN NOT NULL DEFAULT true, + "release_date" TIMESTAMP(3), + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + "created_by" TEXT NOT NULL, + "updated_by" TEXT, + + CONSTRAINT "app_versions_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE INDEX "app_versions_platform_is_enabled_idx" ON "app_versions"("platform", "is_enabled"); + +-- CreateIndex +CREATE INDEX "app_versions_platform_version_code_idx" ON "app_versions"("platform", "version_code"); diff --git a/backend/services/mining-admin-service/src/infrastructure/parsers/package-parser.service.ts b/backend/services/mining-admin-service/src/infrastructure/parsers/package-parser.service.ts index 53bbc16c..b719c30d 100644 --- a/backend/services/mining-admin-service/src/infrastructure/parsers/package-parser.service.ts +++ b/backend/services/mining-admin-service/src/infrastructure/parsers/package-parser.service.ts @@ -1,5 +1,8 @@ import { Injectable, Logger } from '@nestjs/common' import { Platform } from '../../domain/version-management' +import * as fs from 'fs' +import * as path from 'path' +import * as os from 'os' export interface ParsedPackageInfo { packageName: string @@ -28,10 +31,17 @@ export class PackageParserService { } private async parseApk(buffer: Buffer): Promise { + // ApkReader 需要文件路径,所以先保存到临时文件 + const tempDir = os.tmpdir() + const tempFile = path.join(tempDir, `apk_${Date.now()}_${Math.random().toString(36).slice(2)}.apk`) + try { + // 写入临时文件 + fs.writeFileSync(tempFile, buffer) + // 动态导入 adbkit-apkreader const ApkReader = await import('adbkit-apkreader') - const reader = await ApkReader.default.open(buffer) + const reader = await ApkReader.default.open(tempFile) const manifest = await reader.readManifest() return { @@ -44,6 +54,15 @@ export class PackageParserService { } catch (error) { this.logger.error('Failed to parse APK:', error) return null + } finally { + // 清理临时文件 + try { + if (fs.existsSync(tempFile)) { + fs.unlinkSync(tempFile) + } + } catch (e) { + this.logger.warn('Failed to cleanup temp APK file:', e) + } } }