Explorar el Código

feat(asset-server-plugin): Implement asset binary deletion

Closes #306
Michael Bromley hace 5 años
padre
commit
571ee552b5

+ 27 - 2
packages/asset-server-plugin/e2e/asset-server-plugin.e2e-spec.ts

@@ -6,10 +6,10 @@ import fetch from 'node-fetch';
 import path from 'path';
 
 import { initialData } from '../../../e2e-common/e2e-initial-data';
-import { TEST_SETUP_TIMEOUT_MS, testConfig } from '../../../e2e-common/test-config';
+import { testConfig, TEST_SETUP_TIMEOUT_MS } from '../../../e2e-common/test-config';
 import { AssetServerPlugin } from '../src/plugin';
 
-import { CreateAssets } from './graphql/generated-e2e-asset-server-plugin-types';
+import { CreateAssets, DeleteAsset, DeletionResult } from './graphql/generated-e2e-asset-server-plugin-types';
 
 const TEST_ASSET_DIR = 'test-assets';
 const IMAGE_BASENAME = 'derick-david-409858-unsplash';
@@ -163,6 +163,23 @@ describe('AssetServerPlugin', () => {
             return fetch(`${asset.preview}?h=10.5`);
         });
     });
+
+    describe('deletion', () => {
+        it('deleting Asset deletes binary file', async () => {
+            const { deleteAsset } = await adminClient.query<DeleteAsset.Mutation, DeleteAsset.Variables>(
+                DELETE_ASSET,
+                {
+                    id: asset.id,
+                    force: true,
+                },
+            );
+
+            expect(deleteAsset.result).toBe(DeletionResult.DELETED);
+
+            expect(fs.existsSync(sourceFilePath)).toBe(false);
+            expect(fs.existsSync(previewFilePath)).toBe(false);
+        });
+    });
 });
 
 export const CREATE_ASSETS = gql`
@@ -179,3 +196,11 @@ export const CREATE_ASSETS = gql`
         }
     }
 `;
+
+export const DELETE_ASSET = gql`
+    mutation DeleteAsset($id: ID!, $force: Boolean!) {
+        deleteAsset(id: $id, force: $force) {
+            result
+        }
+    }
+`;

+ 15 - 0
packages/asset-server-plugin/e2e/graphql/generated-e2e-asset-server-plugin-types.ts

@@ -3539,9 +3539,24 @@ export type CreateAssetsMutation = { __typename?: 'Mutation' } & {
     >;
 };
 
+export type DeleteAssetMutationVariables = {
+    id: Scalars['ID'];
+    force: Scalars['Boolean'];
+};
+
+export type DeleteAssetMutation = { __typename?: 'Mutation' } & {
+    deleteAsset: { __typename?: 'DeletionResponse' } & Pick<DeletionResponse, 'result'>;
+};
+
 export namespace CreateAssets {
     export type Variables = CreateAssetsMutationVariables;
     export type Mutation = CreateAssetsMutation;
     export type CreateAssets = NonNullable<CreateAssetsMutation['createAssets'][0]>;
     export type FocalPoint = NonNullable<NonNullable<CreateAssetsMutation['createAssets'][0]>['focalPoint']>;
 }
+
+export namespace DeleteAsset {
+    export type Variables = DeleteAssetMutationVariables;
+    export type Mutation = DeleteAssetMutation;
+    export type DeleteAsset = DeleteAssetMutation['deleteAsset'];
+}

+ 4 - 0
packages/asset-server-plugin/src/local-asset-storage-strategy.ts

@@ -60,6 +60,10 @@ export class LocalAssetStorageStrategy implements AssetStorageStrategy {
         return Promise.resolve(readStream);
     }
 
+    deleteFile(identifier: string): Promise<void> {
+        return fs.unlink(this.identifierToFilePath(identifier));
+    }
+
     private filePathToIdentifier(filePath: string): string {
         const filePathDirname = path.dirname(filePath);
         const deltaDirname = filePathDirname.replace(this.uploadPath, '');