feat(old-items): complete reuse workflow and refine miniapp home

This commit is contained in:
2026-08-15 16:38:30 +08:00
parent 65d23eab4a
commit f3737c80be
94 changed files with 7880 additions and 215 deletions
+10 -4
View File
@@ -5,6 +5,7 @@ import {
API_ERROR_CODES,
type ConfirmUploadResponse,
type CreateUploadIntentResponse,
type CreateMediaUploadIntentRequest,
type ServiceRecordAttachment,
} from '@lehuo/contracts';
@@ -14,7 +15,6 @@ import { FilesRepository } from '../files/files.repository';
import { OBJECT_STORAGE_ADAPTER, type ObjectStorageAdapter } from '../files/object-storage.adapter';
import type { File, FileBusinessType } from '../generated/prisma/client';
import { SensitiveDataService } from '../security/sensitive-data.service';
import type { CreateMediaUploadIntentDto } from './dto/participation.dto';
const EXTENSIONS: Record<string, string> = {
'image/jpeg': 'jpg',
@@ -31,7 +31,7 @@ export class MediaService {
) {}
async createIntent(
input: CreateMediaUploadIntentDto,
input: CreateMediaUploadIntentRequest,
actor: AuthContext,
request: RequestContext,
): Promise<CreateUploadIntentResponse> {
@@ -56,7 +56,9 @@ export class MediaService {
return this.uploadResponse(previous, true);
}
const now = new Date();
const objectKey = `public-covers/${now.getUTCFullYear()}/${String(now.getUTCMonth() + 1).padStart(2, '0')}/${randomUUID()}.${extension}`;
const prefix =
input.businessType === 'OLD_ITEM_DONATION_IMAGE' ? 'private-old-items' : 'public-covers';
const objectKey = `${prefix}/${now.getUTCFullYear()}/${String(now.getUTCMonth() + 1).padStart(2, '0')}/${randomUUID()}.${extension}`;
const file = await this.files.createPending(
{
publicId: randomUUID(),
@@ -86,7 +88,11 @@ export class MediaService {
const file = await this.files.findByPublicId(publicId);
if (!file || file.caseId !== null || file.uploaderUserId !== actor.userId)
throw this.notFound();
if (file.businessType !== 'PROJECT_COVER' && file.businessType !== 'ACTIVITY_COVER') {
if (
file.businessType !== 'PROJECT_COVER' &&
file.businessType !== 'ACTIVITY_COVER' &&
file.businessType !== 'OLD_ITEM_DONATION_IMAGE'
) {
throw this.notFound();
}
if (file.status === 'AVAILABLE') return { file: this.attachment(file) };