@things-factory/attachment-base 10.0.0-beta.67 → 10.0.0-beta.69
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -100,7 +100,7 @@ async function resolveContents(att) {
|
|
|
100
100
|
const readFile = attachment_const_1.STORAGE.readFile;
|
|
101
101
|
if (typeof readFile !== 'function')
|
|
102
102
|
return;
|
|
103
|
-
const result = readFile(att.path);
|
|
103
|
+
const result = await readFile(att.path);
|
|
104
104
|
if (typeof result === 'string')
|
|
105
105
|
return Buffer.from(result);
|
|
106
106
|
if (Buffer.isBuffer(result))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thumbnail-backfill.js","sourceRoot":"","sources":["../../../server/service/attachment/thumbnail-backfill.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"thumbnail-backfill.js","sourceRoot":"","sources":["../../../server/service/attachment/thumbnail-backfill.ts"],"names":[],"mappings":"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","sourcesContent":["import { Field, Int, ObjectType } from 'type-graphql'\nimport { IsNull } from 'typeorm'\n\nimport { logger } from '@things-factory/env'\nimport { getRepository } from '@things-factory/shell'\n\nimport { STORAGE } from '../../attachment-const'\nimport { Attachment } from './attachment'\nimport { generateThumbnail } from './thumbnail'\n\n@ObjectType({ description: '썸네일 백필 결과' })\nexport class ThumbnailBackfillResult {\n @Field(() => Int, { description: '이번 호출에서 처리 시도한 첨부 개수' })\n attempted!: number\n\n @Field(() => Int, { description: '썸네일 생성·저장 성공 개수' })\n succeeded!: number\n\n @Field(() => Int, { description: '실패(생성 실패/콘텐츠 없음 등) 개수' })\n failed!: number\n\n @Field(() => Int, {\n description: '이번 처리 후에도 남아있는 썸네일 미생성 후보 개수 (대략치). 0 이면 완료'\n })\n remaining!: number\n}\n\n/**\n * 썸네일이 없는 첨부파일을 조회해서 서버에서 썸네일을 생성·저장한다.\n * 하나의 호출당 최대 `limit` 개까지만 처리 — 장시간 점유 방지.\n * 결과의 `remaining > 0` 이면 동일 호출을 반복해 배치 완료시킴.\n *\n * 대상 mimetype 만 시도 (현재 image/*, model/gltf-*).\n * contents 컬럼이 비어 있고 STORAGE.readFile 로도 못 읽으면 skip.\n */\nexport async function backfillAttachmentThumbnails(\n { limit = 20 }: { limit?: number },\n context: ResolverContext\n): Promise<ThumbnailBackfillResult> {\n // ResolverContext 은 things-factory 런타임 전역 타입\n const { domain, tx } = context.state\n const repository = tx ? tx.getRepository(Attachment) : getRepository(Attachment)\n\n // 지원 mimetype 중 썸네일 미생성 대상만 조회\n const qb = repository.createQueryBuilder('att')\n .where('att.domain_id = :domainId', { domainId: domain.id })\n .andWhere('att.thumbnail IS NULL')\n .andWhere('(att.mimetype LIKE :imagePrefix OR att.mimetype IN (:...gltfTypes))', {\n imagePrefix: 'image/%',\n gltfTypes: ['model/gltf-binary', 'model/gltf+json']\n })\n\n const candidates = await qb.take(limit).getMany()\n\n let succeeded = 0\n let failed = 0\n\n for (const att of candidates) {\n try {\n const contents = await resolveContents(att)\n if (!contents) {\n failed++\n continue\n }\n\n const thumbnail = await generateThumbnail(contents, att.mimetype)\n if (!thumbnail) {\n failed++\n continue\n }\n\n await repository.update({ id: att.id }, { thumbnail })\n succeeded++\n } catch (e) {\n failed++\n logger.warn(`[thumbnail-backfill] ${att.id} failed: ${(e as Error).message}`)\n }\n }\n\n // 남은 후보 개수 — 다음 호출 필요 여부 판단용\n const remaining = await qb.getCount()\n\n return {\n attempted: candidates.length,\n succeeded,\n failed,\n remaining\n }\n}\n\n/**\n * contents 획득: DB 저장 모드는 att.contents Buffer 직접, 파일/S3/Azure 모드는\n * STORAGE.readFile 로 경로에서 읽는다. 읽기 실패 시 undefined.\n */\nasync function resolveContents(att: Attachment): Promise<Buffer | undefined> {\n // @ts-ignore — TypeORM 이 contents 를 Buffer 로 반환 (타입 시그니처는 any)\n const fromDb: Buffer | null | undefined = (att as any).contents\n if (fromDb && fromDb.length > 0) return fromDb\n\n if (!att.path) return\n\n try {\n const readFile = (STORAGE as any).readFile as\n | ((path: string, encoding?: string) => Buffer | string)\n | undefined\n if (typeof readFile !== 'function') return\n const result = await readFile(att.path)\n if (typeof result === 'string') return Buffer.from(result)\n if (Buffer.isBuffer(result)) return result\n return\n } catch (e) {\n logger.warn(`[thumbnail-backfill] readFile failed for ${att.path}: ${(e as Error).message}`)\n return\n }\n}\n"]}
|