Skip to content
This repository has been archived by the owner on Sep 4, 2024. It is now read-only.

Commit

Permalink
fix(repository): preserve error context
Browse files Browse the repository at this point in the history
removes remapping of thrown errors from sequelize model

GH-0
  • Loading branch information
shubhamp-sf committed Jun 12, 2023
1 parent 1de33ea commit aa0ad39
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 39 deletions.
26 changes: 24 additions & 2 deletions src/__tests__/integration/repository.integration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import {
TestSandbox,
} from '@loopback/testlab';
import {resolve} from 'path';
import {UniqueConstraintError} from 'sequelize';
import {SequelizeCrudRepository, SequelizeDataSource} from '../../sequelize';
import {SequelizeSandboxApplication} from '../fixtures/application';
import {config as primaryDataSourceConfig} from '../fixtures/datasources/primary.datasource';
Expand Down Expand Up @@ -44,6 +45,27 @@ describe('Sequelize CRUD Repository (integration)', function () {
(app as unknown) = undefined;
});

describe('General', () => {
beforeEach(async () => {
await client.get('/users/sync-sequelize-model').send();
});

it('throws original error context from sequelize', async () => {
const userWithId = {
id: 1,
name: 'Joe',
active: true,
};
const firstUser = await userRepo.create(userWithId);
expect(firstUser).to.have.property('id', userWithId.id);
try {
throw await userRepo.create(userWithId);
} catch (err) {
expect(err).to.be.instanceOf(UniqueConstraintError);
}
});
});

describe('Without Relations', () => {
beforeEach(async () => {
await client.get('/users/sync-sequelize-model').send();
Expand Down Expand Up @@ -515,8 +537,8 @@ describe('Sequelize CRUD Repository (integration)', function () {
describe('Transactions', () => {
const DB_ERROR_MESSAGES = {
invalidTransaction: [
`SequelizeDatabaseError: relation "${TableInSecondaryDB}" does not exist`,
`SequelizeDatabaseError: SQLITE_ERROR: no such table: ${TableInSecondaryDB}`,
`relation "${TableInSecondaryDB}" does not exist`,
`SQLITE_ERROR: no such table: ${TableInSecondaryDB}`,
],
};
async function migrateSchema(entities: Array<Entities>) {
Expand Down
58 changes: 21 additions & 37 deletions src/sequelize/sequelize.repository.base.ts
Original file line number Diff line number Diff line change
Expand Up @@ -119,16 +119,10 @@ export class SequelizeCrudRepository<
public sequelizeModel: ModelStatic<Model<T>>;

async create(entity: DataObject<T>, options?: AnyObject): Promise<T> {
let err = null;
const data = await this.sequelizeModel
.create(entity as MakeNullishOptional<T>, options)
.catch(error => {
err = error;
});

if (!data) {
throw new Error(err ?? 'Something went wrong');
}
const data = await this.sequelizeModel.create(
entity as MakeNullishOptional<T>,
options,
);
return new this.entityClass(this.excludeHiddenProps(data.toJSON())) as T;
}

Expand Down Expand Up @@ -211,20 +205,15 @@ export class SequelizeCrudRepository<
filter?: Filter<T>,
options?: AnyObject,
): Promise<(T & Relations)[]> {
const data = await this.sequelizeModel
.findAll({
include: this.buildSequelizeIncludeFilter(filter?.include),
where: this.buildSequelizeWhere(filter?.where),
attributes: this.buildSequelizeAttributeFilter(filter?.fields),
order: this.buildSequelizeOrder(filter?.order),
limit: filter?.limit,
offset: filter?.offset ?? filter?.skip,
...options,
})
.catch(err => {
debug('findAll() error:', err);
throw new Error(err);
});
const data = await this.sequelizeModel.findAll({
include: this.buildSequelizeIncludeFilter(filter?.include),
where: this.buildSequelizeWhere(filter?.where),
attributes: this.buildSequelizeAttributeFilter(filter?.fields),
order: this.buildSequelizeOrder(filter?.order),
limit: filter?.limit,
offset: filter?.offset ?? filter?.skip,
...options,
});

return this.includeReferencesIfRequested(
data,
Expand All @@ -237,19 +226,14 @@ export class SequelizeCrudRepository<
filter?: Filter<T>,
options?: AnyObject,
): Promise<(T & Relations) | null> {
const data = await this.sequelizeModel
.findOne({
include: this.buildSequelizeIncludeFilter(filter?.include),
where: this.buildSequelizeWhere(filter?.where),
attributes: this.buildSequelizeAttributeFilter(filter?.fields),
order: this.buildSequelizeOrder(filter?.order),
offset: filter?.offset ?? filter?.skip,
...options,
})
.catch(err => {
debug('findOne() error:', err);
throw new Error(err);
});
const data = await this.sequelizeModel.findOne({
include: this.buildSequelizeIncludeFilter(filter?.include),
where: this.buildSequelizeWhere(filter?.where),
attributes: this.buildSequelizeAttributeFilter(filter?.fields),
order: this.buildSequelizeOrder(filter?.order),
offset: filter?.offset ?? filter?.skip,
...options,
});

if (data === null) {
return Promise.resolve(null);
Expand Down

0 comments on commit aa0ad39

Please sign in to comment.