fix(admin-web): route parse/register through use-cases to satisfy no-restricted-imports

- ParsePackageUseCase.execute now accepts onProgress callback
- RegisterVersionUseCase added for the new /register endpoint
- use-upload.ts now imports only from application layer (no direct infra import)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
hailin 2026-03-07 07:34:34 -08:00
parent 7c8b79161a
commit 5bce676903
2 changed files with 15 additions and 6 deletions

View File

@ -1,4 +1,4 @@
import type { IVersionRepository, UploadVersionInput, UpdateVersionInput } from '@/domain/repositories/version.repository.interface'; import type { IVersionRepository, UploadVersionInput, RegisterVersionInput, UpdateVersionInput } from '@/domain/repositories/version.repository.interface';
import type { AppType, AppPlatform } from '@/domain/entities'; import type { AppType, AppPlatform } from '@/domain/entities';
import { versionRepository } from '@/infrastructure/repositories/version.repository'; import { versionRepository } from '@/infrastructure/repositories/version.repository';
@ -13,8 +13,16 @@ export class ListVersionsUseCase {
export class ParsePackageUseCase { export class ParsePackageUseCase {
constructor(private readonly repo: IVersionRepository = versionRepository) {} constructor(private readonly repo: IVersionRepository = versionRepository) {}
execute(file: File) { // onProgress: 0-100 upload progress callback (for progress bar)
return this.repo.parse(file); execute(file: File, onProgress?: (pct: number) => void) {
return this.repo.parse(file, onProgress);
}
}
export class RegisterVersionUseCase {
constructor(private readonly repo: IVersionRepository = versionRepository) {}
execute(input: RegisterVersionInput) {
return this.repo.register(input);
} }
} }
@ -49,6 +57,7 @@ export class DeleteVersionUseCase {
// ── Singleton instances (frontend DI) ─────────────────────── // ── Singleton instances (frontend DI) ───────────────────────
export const listVersionsUseCase = new ListVersionsUseCase(); export const listVersionsUseCase = new ListVersionsUseCase();
export const parsePackageUseCase = new ParsePackageUseCase(); export const parsePackageUseCase = new ParsePackageUseCase();
export const registerVersionUseCase = new RegisterVersionUseCase();
export const uploadVersionUseCase = new UploadVersionUseCase(); export const uploadVersionUseCase = new UploadVersionUseCase();
export const updateVersionUseCase = new UpdateVersionUseCase(); export const updateVersionUseCase = new UpdateVersionUseCase();
export const toggleVersionUseCase = new ToggleVersionUseCase(); export const toggleVersionUseCase = new ToggleVersionUseCase();

View File

@ -3,7 +3,7 @@
import type { ChangeEvent } from 'react'; import type { ChangeEvent } from 'react';
import type { AppType } from '@/domain/entities'; import type { AppType } from '@/domain/entities';
import { useUploadStore } from '@/store/zustand/upload.store'; import { useUploadStore } from '@/store/zustand/upload.store';
import { versionRepository } from '@/infrastructure/repositories/version.repository'; import { parsePackageUseCase, registerVersionUseCase } from '@/application/use-cases/version.use-cases';
export function useUpload(appType: AppType, onSuccess: () => void) { export function useUpload(appType: AppType, onSuccess: () => void) {
const store = useUploadStore(); const store = useUploadStore();
@ -31,7 +31,7 @@ export function useUpload(appType: AppType, onSuccess: () => void) {
store.setIsParsing(true); store.setIsParsing(true);
try { try {
const parsed = await versionRepository.parse(f, (pct) => { const parsed = await parsePackageUseCase.execute(f, (pct) => {
store.setParseProgress(pct); store.setParseProgress(pct);
console.log(`[useUpload] parse upload progress: ${pct}%`); console.log(`[useUpload] parse upload progress: ${pct}%`);
}); });
@ -75,7 +75,7 @@ export function useUpload(appType: AppType, onSuccess: () => void) {
console.log(`[useUpload] registering version: storageKey=${storageKey} ver=${versionName} build=${buildNumber}`); console.log(`[useUpload] registering version: storageKey=${storageKey} ver=${versionName} build=${buildNumber}`);
try { try {
const result = await versionRepository.register({ const result = await registerVersionUseCase.execute({
storageKey, fileSize, fileSha256, storageKey, fileSize, fileSha256,
appType, platform, versionCode, appType, platform, versionCode,
versionName, buildNumber, changelog, minOsVersion, isForceUpdate, versionName, buildNumber, changelog, minOsVersion, isForceUpdate,