Skip to content

Commit

Permalink
Merge pull request #4 from hapinessjs/next
Browse files Browse the repository at this point in the history
Next into master
  • Loading branch information
juneil committed Jan 30, 2018
2 parents 1f20055 + 6b52eb6 commit a59ea0d
Show file tree
Hide file tree
Showing 10 changed files with 166 additions and 138 deletions.
3 changes: 3 additions & 0 deletions README.md
Expand Up @@ -63,6 +63,9 @@ class MyService {

## Change History

* v1.1.0 (2018-01-30)
* Update mingo model
* Minor code updates
* v1.0.0 (2018-01-18)
* First release

Expand Down
198 changes: 99 additions & 99 deletions package-lock.json

Large diffs are not rendered by default.

10 changes: 5 additions & 5 deletions package.json
@@ -1,6 +1,6 @@
{
"name": "@hapiness/mingo",
"version": "1.0.0",
"version": "1.1.0",
"description": "Manage files using minio as file storage and mongodb for metadata",
"main": "commonjs/index.js",
"types": "index.d.ts",
Expand Down Expand Up @@ -77,18 +77,18 @@
"homepage": "https://github.com/hapinessjs/mingo-module#readme",
"dependencies": {
"@hapiness/biim": "^1.4.0",
"@types/node": "^9.3.0"
"@types/node": "^9.4.0"
},
"devDependencies": {
"@hapiness/core": "^1.3.0",
"@hapiness/minio": "^1.0.0",
"@hapiness/mongo": "^1.1.3",
"@hapiness/mongo": "^1.1.5",
"@types/fs-extra": "^5.0.0",
"coveralls": "^3.0.0",
"debug": "^3.1.0",
"fs-extra": "^5.0.0",
"istanbul": "^1.1.0-alpha.1",
"mocha": "^4.1.0",
"mocha": "^5.0.0",
"mocha-prepare": "^0.1.0",
"mocha-typescript": "^1.1.12",
"rimraf": "^2.6.2",
Expand All @@ -101,7 +101,7 @@
"peerDependencies": {
"@hapiness/core": "^1.3.0",
"@hapiness/minio": "^1.0.0",
"@hapiness/mongo": "^1.1.3",
"@hapiness/mongo": "^1.1.5",
"rxjs": "^5.5.6"
},
"engines": {
Expand Down
1 change: 1 addition & 0 deletions src/module/index.ts
@@ -1,3 +1,4 @@
export * from './services';
export * from './mingo.module';
export * from './interfaces';
export * from './managers';
2 changes: 1 addition & 1 deletion src/module/interfaces/mingo-file.interface.ts
@@ -1,6 +1,6 @@
export interface MingoFileInterface {
filename: string;
content_type: string;
contentType: string;
created_at: Date;
updated_at: Date;
size: number;
Expand Down
41 changes: 24 additions & 17 deletions src/module/managers/files.manager.ts
Expand Up @@ -37,18 +37,18 @@ export class FilesManager {
* @param content_type Mime type
* @param metadata Custom object to store information about the file
*/
upload(input: UploadFileType, filename, content_type?: string, metadata?: Object): Observable<MingoFileInterface> {
upload(input: UploadFileType, filename: string, content_type?: string, metadata?: Object): Observable<MingoFileInterface> {
return this._bucketService
.createFile(input, filename, null, content_type)
.switchMap((result): Observable<MingoFileInterface> =>
Observable.of({
filename: filename,
size: result.size,
content_type: result.contentType,
contentType: result.contentType,
created_at: new Date(result.lastModified),
updated_at: new Date(result.lastModified),
md5: result.etag,
metadata: metadata
metadata: metadata || {}
})
)
.flatMap(_ => Observable.fromPromise(
Expand All @@ -73,7 +73,7 @@ export class FilesManager {
Observable.throw(Biim.conflict(`File ${filename} already exists`)) :
Observable.of(_)
)
.flatMap(_ => this.upload(input, filename, content_type, metadata || {}));
.flatMap(_ => this.upload(input, filename, content_type, metadata));
}

/**
Expand All @@ -82,8 +82,9 @@ export class FilesManager {
* @param filename Filename
*/
exists(filename: string): Observable<boolean> {
return this._bucketService
.fileStat(filename)
return Observable.of(filename)
.flatMap(_ => _ ? Observable.of(filename) : Observable.throw(Biim.badRequest(`No filename provided`)))
.flatMap(_ => this._bucketService.fileStat(filename))
.catch(err => {
if (err.code === 'NotFound') {
return Observable.of(false);
Expand All @@ -108,13 +109,13 @@ export class FilesManager {
* @param projection Fields to return
* @param options Mongo find options
*/
find(query?: Object, projection?: string | string[], options?: Object): Observable<MingoFileDocumentInterface[]> {
find(
query?: { [key: string]: any }, projection?: string | string[], options?: { [key: string]: any }
): Observable<MingoFileDocumentInterface[]> {
const _options = Object.assign({ limit: 10000 }, options);
const projectionStr = projection && projection instanceof Array ? projection.join(' ') : projection;
return Observable
.fromPromise(this._getDocument()
.find(query, projectionStr, _options)
);

return Observable.fromPromise(this._getDocument().find(query, projectionStr, _options));
}

/**
Expand All @@ -124,7 +125,9 @@ export class FilesManager {
* @param projection Fields to return
* @param options Mongo find options
*/
findByFilename(filename: string, projection?: string | string[], options?: Object): Observable<MingoFileDocumentInterface> {
findByFilename(
filename: string, projection?: string | string[], options?: { [key: string]: any }
): Observable<MingoFileDocumentInterface> {
const projectionStr = projection && projection instanceof Array ? projection.join(' ') : projection;
return Observable.fromPromise(this._getDocument().findOne({ filename }, projectionStr, options));
}
Expand All @@ -149,10 +152,12 @@ export class FilesManager {
* @param update Metadata update object
* @param options Mongo update options
*/
/* istanbul ignore next */
update(query: Object, update: { [key: string]: any }, options: ModelUpdateOptions): Observable<any> {
return Observable.fromPromise(this._getDocument()
.update(query, { $set: this._prepareUpdateObject(update) }, options));
update(
query: { [key: string]: any }, update: { [key: string]: any }, options?: ModelUpdateOptions
): Observable<MingoFileDocumentInterface[]> {
return Observable
.fromPromise(this._getDocument().update(query, { $set: this._prepareUpdateObject(update) }, options))
.flatMap(_ => this.find(query, null, options));
}

/**
Expand Down Expand Up @@ -204,7 +209,9 @@ export class FilesManager {
}

removeByFilename(filename: string): Observable<MingoFileDocumentInterface> {
return this.exists(filename)
return Observable.of(filename)
.flatMap(_ => _ ? Observable.of(filename) : Observable.throw(Biim.badRequest(`No filename provided`)))
.flatMap(_ => this.exists(filename))
.flatMap(_ => !_ ?
Observable.throw(Biim.notFound(`Cannot remove ${filename}. File does not exist.`)) :
Observable.fromPromise(this._getDocument().findOneAndRemove({ filename }))
Expand Down
1 change: 1 addition & 0 deletions src/module/managers/index.ts
@@ -0,0 +1 @@
export * from './files.manager';
2 changes: 1 addition & 1 deletion src/module/models/mingo-file.model.ts
Expand Up @@ -27,7 +27,7 @@ export class MingoFileModel extends Model {
type: String,
required: true
},
content_type: {
contentType: {
type: String,
default: 'application/octet-stream'
},
Expand Down
20 changes: 18 additions & 2 deletions test/functional/mingo.module.test.ts
Expand Up @@ -16,15 +16,16 @@ import { MinioModule, MinioExt } from '@hapiness/minio';

import { MingoModule, MingoService } from '../../src';
import { FilesManager } from '../../src/module/managers/files.manager';

import { Biim } from '@hapiness/biim';
import { Observable } from 'rxjs/Observable';

@suite('- MingoModule functional test file')
export class MingoModuleFunctionalTest {
@test('Mingo module load successfuly and run several commands')
mingoRunSuccess(done) {
const fileProperties = [
{ filename: 'package.json' },
{ content_type: 'json' },
{ contentType: 'json' },
{ size: fs.lstatSync('./package.json').size },
{ md5: crypto.createHash('md5').update(fs.readFileSync('./package.json', { encoding: 'utf8'})).digest('hex') }
];
Expand Down Expand Up @@ -74,6 +75,21 @@ export class MingoModuleFunctionalTest {
.bool(_)
.isTrue()
)
.flatMap(_ => fb().update({ contentType: 'json' }, { meta2: 'json' }))
.do(_ => unit
.array(_)
.contains([{ metadata: { meta1 : 'metadata', meta2: 'json' } }])
)
.flatMap(_ => fb().exists(null))
.catch(_ => {
unit.object(_).isInstanceOf(Error).is(Biim.badRequest(`No filename provided`));
return Observable.of(null);
})
.flatMap(_ => fb().removeByFilename(null))
.catch(_ => {
unit.object(_).isInstanceOf(Error).is(Biim.badRequest(`No filename provided`));
return Observable.of(null);
})
.flatMap(_ => fb().removeByFilename('package.json'))
.do(_ => unit.object(_))
.flatMap(_ => fb().exists('package.json'))
Expand Down
26 changes: 13 additions & 13 deletions test/unit/managers/file.manager.test.ts
Expand Up @@ -112,17 +112,17 @@ export class FilesManagerUnitTest {
upload(done) {
const input = Buffer.from('helloworld');
const filename = 'helloworld.txt';
const content_type = 'text/plain';
const contentType = 'text/plain';
const metadata = { lupulus: { stock: 99, empty: 10 } };
unit.stub(this._bucketManager, 'createFile').returns(Observable.of({
size: input.length,
contentType: content_type,
contentType: contentType,
etag: new Date().getTime(),
lastModified: new Date(),
}));
const file = {
filename,
content_type,
contentType,
metadata,
size: input.length,
created_at: new Date(),
Expand All @@ -133,7 +133,7 @@ export class FilesManagerUnitTest {
toJSON: () => file
}));
unit.function(this._filesManager.upload);
const obs = this._filesManager.upload(input, filename, content_type, metadata);
const obs = this._filesManager.upload(input, filename, contentType, metadata);
obs.subscribe(_ => {
unit.object(_).is(file);
done();
Expand All @@ -147,7 +147,7 @@ export class FilesManagerUnitTest {
const filename = 'helloworld.txt';
const file = {
filename,
content_type: 'application/octet-stream',
contentType: 'application/octet-stream',
metadata: {},
size: input.length,
created_at: new Date(),
Expand Down Expand Up @@ -185,7 +185,7 @@ export class FilesManagerUnitTest {
const filename = 'helloworld.txt';
const file = {
filename,
content_type: 'application/octet-stream',
contentType: 'application/octet-stream',
metadata: {},
size: input.length,
created_at: new Date(),
Expand All @@ -207,14 +207,14 @@ export class FilesManagerUnitTest {
const filename = 'helloworld.txt';
const file = {
filename,
content_type: 'application/octet-stream',
contentType: 'application/octet-stream',
size: input.length,
created_at: new Date(),
updated_at: new Date()
};
this._modelMock.find.returns(Promise.resolve([file]));
unit.function(this._filesManager.find);
const obs = this._filesManager.find(null, ['filename', 'content_type', 'size', 'created_at', 'updated_at']);
const obs = this._filesManager.find(null, ['filename', 'contentType', 'size', 'created_at', 'updated_at']);
obs.subscribe(_ => {
unit.array(_).is([file]);
done();
Expand All @@ -227,7 +227,7 @@ export class FilesManagerUnitTest {
const filename = 'helloworld.txt';
const file = {
filename,
content_type: 'application/octet-stream',
contentType: 'application/octet-stream',
metadata: {},
size: input.length,
created_at: new Date(),
Expand All @@ -249,12 +249,12 @@ export class FilesManagerUnitTest {
const filename = 'helloworld.txt';
const file = {
filename,
content_type: 'application/octet-stream',
contentType: 'application/octet-stream',
size: input.length
};
this._modelMock.findOne.returns(Promise.resolve(file));
unit.function(this._filesManager.findByFilename);
const obs = this._filesManager.findByFilename(filename, ['filename', 'content_type', 'size']);
const obs = this._filesManager.findByFilename(filename, ['filename', 'contentType', 'size']);
obs.subscribe(_ => {
unit.object(_).is(file);
done();
Expand Down Expand Up @@ -303,7 +303,7 @@ export class FilesManagerUnitTest {
const filename = 'helloworld.txt';
const updatedFile = {
filename,
content_type: 'application/octet-stream',
contentType: 'application/octet-stream',
metadata: { 'metadata.meta1': 'meta1' },
size: 42,
created_at: new Date(),
Expand Down Expand Up @@ -336,7 +336,7 @@ export class FilesManagerUnitTest {
const filename = 'helloworld.txt';
const removedFile = {
filename,
content_type: 'application/octet-stream',
contentType: 'application/octet-stream',
metadata: { 'metadata.meta1': 'meta1' },
size: 42,
created_at: new Date(),
Expand Down

0 comments on commit a59ea0d

Please sign in to comment.