Skip to content

Commit

Permalink
Merge pull request #154 from adhocteam/cm-247-download-of-uploaded-do…
Browse files Browse the repository at this point in the history
…cuments

Add url virtual field to file upload model
  • Loading branch information
dcmcand authored Feb 10, 2021
2 parents 56bcdcc + 4e6a35f commit 16c743f
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 2 deletions.
15 changes: 15 additions & 0 deletions src/lib/s3Uploader.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,21 @@ if (process.env.VCAP_SERVICES) {
}
export const s3 = new S3(s3Config);

export const getPresignedURL = (Key, Bucket = bucketName, s3Client = s3, Expires = 360) => {
const url = { url: null, error: null };
try {
const params = {
Bucket,
Key,
Expires,
};
url.url = s3Client.getSignedUrl('getObject', params);
} catch (error) {
url.error = error;
}
return url;
};

export const verifyVersioning = async (bucket = bucketName, s3Client = s3) => {
const versioningConfiguration = {
MFADelete: 'Disabled',
Expand Down
25 changes: 24 additions & 1 deletion src/lib/s3Uploader.test.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { v4 as uuidv4 } from 'uuid';
import s3Uploader, { verifyVersioning, s3 } from './s3Uploader';
import s3Uploader, { verifyVersioning, s3, getPresignedURL } from './s3Uploader';

const mockData = {
MFADelete: 'Disabled',
Expand Down Expand Up @@ -70,3 +70,26 @@ describe('s3Uploader', () => {
await expect(got).toBe(response);
});
});

describe('s3Uploader.getPresignedUrl', () => {
const Bucket = 'fakeBucket';
const Key = 'fakeKey';
const fakeError = new Error('fake error');
const mockGetURL = jest.spyOn(s3, 'getSignedUrl').mockImplementation(() => 'https://example.com');
beforeEach(() => {
mockGetURL.mockClear();
});
it('calls getSignedUrl() with correct parameters', () => {
const url = getPresignedURL(Key, Bucket);
expect(url).toMatchObject({ url: 'https://example.com', error: null });
expect(mockGetURL).toHaveBeenCalled();
expect(mockGetURL).toHaveBeenCalledWith('getObject', { Bucket, Key, Expires: 360 });
});
it('calls getSignedUrl() witcih incorrect parameters', async () => {
mockGetURL.mockImplementationOnce(() => { throw fakeError; });
const url = getPresignedURL(Key, Bucket);
expect(url).toMatchObject({ url: null, error: fakeError });
expect(mockGetURL).toHaveBeenCalled();
expect(mockGetURL).toHaveBeenCalledWith('getObject', { Bucket, Key, Expires: 360 });
});
});
10 changes: 9 additions & 1 deletion src/models/file.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
const { Model } = require('sequelize');
import { Model } from 'sequelize';
import { getPresignedURL } from '../lib/s3Uploader';

module.exports = (sequelize, DataTypes) => {
class File extends Model {
Expand Down Expand Up @@ -37,6 +38,13 @@ module.exports = (sequelize, DataTypes) => {
type: DataTypes.INTEGER,
allowNull: false,
},
url: {
type: DataTypes.VIRTUAL,
get() {
const url = getPresignedURL(this.key);
return url;
},
},
}, {
sequelize,
modelName: 'File',
Expand Down

0 comments on commit 16c743f

Please sign in to comment.