Skip to content

Commit

Permalink
fix(database): database was talking to itself
Browse files Browse the repository at this point in the history
  • Loading branch information
sdimitris committed Jan 7, 2022
1 parent 34f7049 commit bb29a9e
Show file tree
Hide file tree
Showing 5 changed files with 65 additions and 47 deletions.
48 changes: 25 additions & 23 deletions modules/database/src/DatabaseProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ export class DatabaseProvider extends ConduitServiceModule {
private _admin: AdminHandlers;

constructor(protected readonly grpcSdk: ConduitGrpcSdk) {
super(grpcSdk)
super(grpcSdk);
const dbType = process.env.databaseType ?? 'mongodb';
const databaseUrl = process.env.databaseURL ?? 'mongodb://localhost:27017';

Expand Down Expand Up @@ -78,11 +78,12 @@ export class DatabaseProvider extends ConduitServiceModule {
deleteOne: this.deleteOne.bind(this),
deleteMany: this.deleteMany.bind(this),
countDocuments: this.countDocuments.bind(this),
}
},
);
await this.grpcServer.start();
}


async activate() {
const self = this;
await this.grpcSdk.initializeEventBus();
Expand All @@ -100,12 +101,13 @@ export class DatabaseProvider extends ConduitServiceModule {
receivedSchema.name,
receivedSchema.modelSchema,
receivedSchema.modelOptions,
receivedSchema.collectionName
receivedSchema.collectionName,
);
schema.ownerModule = receivedSchema.ownerModule;
self._activeAdapter
.createSchemaFromAdapter(schema)
.then(() => {})
.then(() => {
})
.catch(() => {
console.log('Failed to create/update schema');
});
Expand All @@ -115,11 +117,11 @@ export class DatabaseProvider extends ConduitServiceModule {
}
});
await this._activeAdapter.createSchemaFromAdapter(
models._DeclaredSchema.getInstance((this.grpcSdk.databaseProvider!))
models._DeclaredSchema.getInstance((this.grpcSdk.databaseProvider!)),
);
await migrateModelOptions();
await this._activeAdapter.recoverSchemasFromDatabase();
this._admin = new AdminHandlers(this.grpcServer, this.grpcSdk);
this._admin = new AdminHandlers(this.grpcServer, this.grpcSdk, this._activeAdapter);
}

/**
Expand All @@ -132,7 +134,7 @@ export class DatabaseProvider extends ConduitServiceModule {
call.request.schema.name,
JSON.parse(call.request.schema.modelSchema),
JSON.parse(call.request.schema.modelOptions),
call.request.schema.collectionName
call.request.schema.collectionName,
);
if (schema.name.indexOf('-') >= 0 || schema.name.indexOf(' ') >= 0) {
return callback({
Expand Down Expand Up @@ -215,7 +217,7 @@ export class DatabaseProvider extends ConduitServiceModule {

async deleteSchema(call: DropCollectionRequest, callback: DropCollectionResponse) {
try {
const schemas = await this._activeAdapter.deleteSchema(
const schemas = await this._activeAdapter.deleteSchema(
call.request.schemaName,
call.request.deleteData,
(call as any).metadata.get('module-name')[0],
Expand All @@ -236,7 +238,7 @@ export class DatabaseProvider extends ConduitServiceModule {
call.request.query,
call.request.select,
call.request.populate,
schemaAdapter.relations
schemaAdapter.relations,
);
callback(null, { result: JSON.stringify(doc) });
} catch (err) {
Expand Down Expand Up @@ -264,7 +266,7 @@ export class DatabaseProvider extends ConduitServiceModule {
select,
sort,
populate,
schemaAdapter.relations
schemaAdapter.relations,
);
callback(null, { result: JSON.stringify(docs) });
} catch (err) {
Expand All @@ -283,7 +285,7 @@ export class DatabaseProvider extends ConduitServiceModule {
if (!await canCreate(moduleName, schemaAdapter.model)) {
return callback({
code: status.PERMISSION_DENIED,
message: `Module ${moduleName} is not authorized to create ${schemaName} entries!`
message: `Module ${moduleName} is not authorized to create ${schemaName} entries!`,
});
}

Expand All @@ -292,7 +294,7 @@ export class DatabaseProvider extends ConduitServiceModule {

this.grpcSdk.bus?.publish(
`${MODULE_NAME}:create:${schemaName}`,
docString
docString,
);

callback(null, { result: docString });
Expand All @@ -312,7 +314,7 @@ export class DatabaseProvider extends ConduitServiceModule {
if (!await canCreate(moduleName, schemaAdapter.model)) {
return callback({
code: status.PERMISSION_DENIED,
message: `Module ${moduleName} is not authorized to create ${schemaName} entries!`
message: `Module ${moduleName} is not authorized to create ${schemaName} entries!`,
});
}

Expand All @@ -321,7 +323,7 @@ export class DatabaseProvider extends ConduitServiceModule {

this.grpcSdk.bus?.publish(
`${MODULE_NAME}:createMany:${schemaName}`,
docsString
docsString,
);

callback(null, { result: docsString });
Expand All @@ -341,7 +343,7 @@ export class DatabaseProvider extends ConduitServiceModule {
if (!await canModify(moduleName, schemaAdapter.model)) {
return callback({
code: status.PERMISSION_DENIED,
message: `Module ${moduleName} is not authorized to modify ${schemaName} entries!`
message: `Module ${moduleName} is not authorized to modify ${schemaName} entries!`,
});
}

Expand All @@ -356,7 +358,7 @@ export class DatabaseProvider extends ConduitServiceModule {

this.grpcSdk.bus?.publish(
`${MODULE_NAME}:update:${schemaName}`,
resultString
resultString,
);

callback(null, { result: resultString });
Expand All @@ -376,20 +378,20 @@ export class DatabaseProvider extends ConduitServiceModule {
if (!await canModify(moduleName, schemaAdapter.model)) {
return callback({
code: status.PERMISSION_DENIED,
message: `Module ${moduleName} is not authorized to modify ${schemaName} entries!`
message: `Module ${moduleName} is not authorized to modify ${schemaName} entries!`,
});
}

const result = await schemaAdapter.model.updateMany(
call.request.filterQuery,
call.request.query,
call.request.updateProvidedOnly
call.request.updateProvidedOnly,
);
const resultString = JSON.stringify(result);

this.grpcSdk.bus?.publish(
`${MODULE_NAME}:updateMany:${schemaName}`,
resultString
resultString,
);

callback(null, { result: resultString });
Expand All @@ -409,7 +411,7 @@ export class DatabaseProvider extends ConduitServiceModule {
if (!await canDelete(moduleName, schemaAdapter.model)) {
return callback({
code: status.PERMISSION_DENIED,
message: `Module ${moduleName} is not authorized to delete ${schemaName} entries!`
message: `Module ${moduleName} is not authorized to delete ${schemaName} entries!`,
});
}

Expand All @@ -418,7 +420,7 @@ export class DatabaseProvider extends ConduitServiceModule {

this.grpcSdk.bus?.publish(
`${MODULE_NAME}:delete:${schemaName}`,
resultString
resultString,
);

callback(null, { result: resultString });
Expand All @@ -438,7 +440,7 @@ export class DatabaseProvider extends ConduitServiceModule {
if (!await canDelete(moduleName, schemaAdapter.model)) {
return callback({
code: status.PERMISSION_DENIED,
message: `Module ${moduleName} is not authorized to delete ${schemaName} entries!`
message: `Module ${moduleName} is not authorized to delete ${schemaName} entries!`,
});
}

Expand All @@ -447,7 +449,7 @@ export class DatabaseProvider extends ConduitServiceModule {

this.grpcSdk.bus?.publish(
`${MODULE_NAME}:delete:${schemaName}`,
resultString
resultString,
);

callback(null, { result: resultString });
Expand Down
17 changes: 9 additions & 8 deletions modules/database/src/adapters/DatabaseAdapter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,13 @@ export abstract class DatabaseAdapter<T extends SchemaAdapter<any>> {
abstract async deleteSchema(schemaName: string, deleteData: boolean, callerModule: string): Promise<string>;

abstract getSchemaModel(
schemaName: string
schemaName: string,
): { model: SchemaAdapter<any>; relations: any };

async checkModelOwnership(schema: ConduitSchema) {
if (schema.name === '_DeclaredSchema') return true;
const model = await _DeclaredSchema.getInstance().findOne({ name: schema.name });

const model = await this.models!['_DeclaredSchema'].model.findOne({ name: schema.name });
if (model && ((model.ownerModule === schema.ownerModule) || (model.ownerModule === 'unknown'))) {
return true;
} else if (model) {
Expand All @@ -40,20 +41,20 @@ export abstract class DatabaseAdapter<T extends SchemaAdapter<any>> {
protected async saveSchemaToDatabase(schema: ConduitSchema) {
if (schema.name === '_DeclaredSchema') return;

const model = await _DeclaredSchema.getInstance().findOne({ name: schema.name });
const model = await this.models!['_DeclaredSchema'].findMany('{}');
if (model) {
await _DeclaredSchema.getInstance()
await this.models!['_DeclaredSchema'].model
.findByIdAndUpdate(
model._id,
{
name: schema.name,
fields: schema.fields,
modelOptions: schema.schemaOptions,
ownerModule: schema.ownerModule,
}
},
);
} else {
await _DeclaredSchema.getInstance()
await this.models!['_DeclaredSchema'].model
.create({
name: schema.name,
fields: schema.fields,
Expand All @@ -64,13 +65,13 @@ export abstract class DatabaseAdapter<T extends SchemaAdapter<any>> {
}

async recoverSchemasFromDatabase(): Promise<any> {
let models: any = await _DeclaredSchema.getInstance().findMany({});
let models: any = await this.models!['_DeclaredSchema'].findMany('{}');
models = models
.map((model: any) => {
let schema = new ConduitSchema(
model.name,
model.fields,
model.modelOptions
model.modelOptions,
);
schema.ownerModule = model.ownerModule;
return schema;
Expand Down
22 changes: 14 additions & 8 deletions modules/database/src/adapters/mongoose-adapter/MongooseSchema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { SchemaAdapter } from '../../interfaces';
import { MongooseAdapter } from './index';
import { ConduitSchema } from '@quintessential-sft/conduit-grpc-sdk';
import { createWithPopulations } from './utils';

const EJSON = require('mongodb-extended-json');

export class MongooseSchema implements SchemaAdapter<Model<any>> {
Expand All @@ -14,7 +15,7 @@ export class MongooseSchema implements SchemaAdapter<Model<any>> {
schema: ConduitSchema,
originalSchema: any,
deepPopulate: any,
private readonly adapter: MongooseAdapter
private readonly adapter: MongooseAdapter,
) {
this.originalSchema = originalSchema;
let mongooseSchema = new Schema(schema.modelSchema as any, schema.schemaOptions);
Expand Down Expand Up @@ -46,7 +47,7 @@ export class MongooseSchema implements SchemaAdapter<Model<any>> {
id: string,
query: string,
updateProvidedOnly: boolean = false,
populate?: string[]
populate?: string[],
): Promise<any> {
let parsedQuery: any = EJSON.parse(query);
parsedQuery['updatedAt'] = new Date();
Expand All @@ -56,7 +57,7 @@ export class MongooseSchema implements SchemaAdapter<Model<any>> {
$set: parsedQuery,
};
}
let finalQuery = this.model.findByIdAndUpdate(id, parsedQuery, { new: true })
let finalQuery = this.model.findByIdAndUpdate(id, parsedQuery, { new: true });
if (populate !== undefined && populate !== null) {
finalQuery = this.calculatePopulates(finalQuery, populate);
}
Expand All @@ -66,7 +67,7 @@ export class MongooseSchema implements SchemaAdapter<Model<any>> {
async updateMany(
filterQuery: string,
query: string,
updateProvidedOnly: boolean = false
updateProvidedOnly: boolean = false,
): Promise<any> {
let parsedFilter: any = EJSON.parse(filterQuery);
let parsedQuery: any = EJSON.parse(query);
Expand Down Expand Up @@ -99,7 +100,7 @@ export class MongooseSchema implements SchemaAdapter<Model<any>> {
if (this.originalSchema.modelSchema[r[0]]) {
controlBool = false;
} else if (r[0] === undefined || r[0].length === 0 || r[0] === '') {
throw new Error("Failed populating '" + final + "'");
throw new Error('Failed populating \'' + final + '\'');
} else {
r.splice(0, 1);
}
Expand All @@ -114,14 +115,19 @@ export class MongooseSchema implements SchemaAdapter<Model<any>> {
}

findMany(
query: string,
query: string | any,
skip?: number,
limit?: number,
select?: string,
sort?: string,
populate?: string[]
populate?: string[],
): Promise<any> {
let parsedQuery: any = EJSON.parse(query);
let parsedQuery;
if (typeof query === 'string'){
parsedQuery = EJSON.parse(query);
} else {
parsedQuery = query;
}
let finalQuery = this.model.find(this.parseQuery(parsedQuery), select);
if (skip !== null) {
finalQuery = finalQuery.skip(skip!);
Expand Down
4 changes: 2 additions & 2 deletions modules/database/src/adapters/mongoose-adapter/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -153,11 +153,11 @@ export class MongooseAdapter extends DatabaseAdapter<MongooseSchema> {
.drop()
.catch((e: Error) => { throw new GrpcError(status.INTERNAL, e.message); });
}
_DeclaredSchema.getInstance()
this.models!['_DeclaredSchema'].model
.findOne({ name: schemaName })
.then( model => {
if (model) {
_DeclaredSchema.getInstance()
this.models!['_DeclaredSchema'].model
.deleteOne({name: schemaName})
.catch((e: Error) => { throw new GrpcError(status.INTERNAL, e.message); })
}
Expand Down
Loading

0 comments on commit bb29a9e

Please sign in to comment.