diff --git a/src/services/minio.ts b/src/services/minio.ts index 36d2d11..1204c72 100644 --- a/src/services/minio.ts +++ b/src/services/minio.ts @@ -10,6 +10,43 @@ const minio = new Client({ export default minio; +// minio typescript does not support include version +type BucketItemWithVersion = { + name: string; + lastModified: string; + etag: string; + size: number; + versionId: string; + isLatest: boolean; + isDeleteMarker: boolean; +}; + +export async function listObjectVersion(bucket: string, obj: string) { + return await new Promise((resolve, reject) => { + const data: BucketItemWithVersion[] = []; + // @ts-ignore + let stream = minio.listObjects(bucket, obj, true, { + IncludeVersion: true, // type error (ts not support) - expected 3 args but got 4 + }); + stream.on("data", (obj) => data.push(obj as unknown as BucketItemWithVersion)); + stream.on("error", (err) => reject(err)); + stream.on("end", () => resolve(data)); + }); +} + +export async function deleteObjectAllVersion(bucket: string, obj: string) { + const item = await listObjectVersion(bucket, obj); + + return await new Promise((resolve, reject) => { + minio.removeObjects( + bucket, + // @ts-ignore + item.map(({ name, versionId }) => ({ name, versionId })), // type error (ts not support) - expected "string[]" + (e) => (e && reject(e)) || resolve(true), + ); + }); +} + export async function presignedGetObjectIfExist(bucket: string, obj: string, exp?: number) { if ( await minio.statObject(bucket, obj).catch((e) => {