From ddb888222dbc206aba9357f594b167fd88679381 Mon Sep 17 00:00:00 2001 From: Hage Yaapa Date: Mon, 20 Aug 2018 20:35:20 +0530 Subject: [PATCH] feat: default 404 for request to non-existent resource send 404 for requests to non-existent resoure by default. --- docs/site/Model.md | 8 +++++ .../src/repositories/legacy-juggler-bridge.ts | 2 +- .../test/acceptance/repository.acceptance.ts | 30 +++++++++++++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/docs/site/Model.md b/docs/site/Model.md index 3a8b5dff6b0f..172cf82933aa 100644 --- a/docs/site/Model.md +++ b/docs/site/Model.md @@ -147,6 +147,14 @@ class MyFlexibleModel extends Entity { } ``` +The default response for a delete request to a non-existent resource is a `404`. +You can change this behavior to `200` by setting `strictDelete` to `false`. + +```ts +@model({settings: {strictDelete: false}}) +class Todo extends Entity { ... } +``` + ### Model Decorator The model decorator can be used without any additional parameters, or can be diff --git a/packages/repository/src/repositories/legacy-juggler-bridge.ts b/packages/repository/src/repositories/legacy-juggler-bridge.ts index c862cbcb4e48..61e551346370 100644 --- a/packages/repository/src/repositories/legacy-juggler-bridge.ts +++ b/packages/repository/src/repositories/legacy-juggler-bridge.ts @@ -125,7 +125,7 @@ export class DefaultCrudRepository this.modelClass = dataSource.createModel( definition.name, properties, - Object.assign({strict: true}, definition.settings), + Object.assign({strict: true, strictDelete: true}, definition.settings), ); this.modelClass.attachTo(dataSource); } diff --git a/packages/repository/test/acceptance/repository.acceptance.ts b/packages/repository/test/acceptance/repository.acceptance.ts index 8dd64452e548..50647333d5e1 100644 --- a/packages/repository/test/acceptance/repository.acceptance.ts +++ b/packages/repository/test/acceptance/repository.acceptance.ts @@ -71,6 +71,36 @@ describe('Repository in Thinking in LoopBack', () => { expect(stored).to.containDeep({extra: 'additional data'}); }); + it('enables strict delete by default', async () => { + await repo.create({slug: 'pencil'}); + await expect(repo.deleteById(10000)).to.be.rejectedWith( + /No instance with id/, + ); + }); + + it('disables strict delete via configuration', async () => { + @model({settings: {strictDelete: false}}) + class Pencil extends Entity { + @property({id: true}) + id: number; + @property({type: 'string'}) + name: string; + } + + const pencilRepo = new DefaultCrudRepository< + Pencil, + typeof Pencil.prototype.id + >(Pencil, new DataSource({connector: 'memory'})); + + await pencilRepo.create({ + name: 'Green Pencil', + }); + + // When `strictDelete` is set to `false`, `deleteById()` on a non-existing + // resource is resolved with `false`, instead of being rejected. + await expect(pencilRepo.deleteById(10000)).to.be.fulfilledWith(false); + }); + function givenProductRepository() { const db = new DataSource({ connector: 'memory',