remult
Advanced tools
Comparing version 0.25.7-exp.1 to 0.25.7-exp.2
@@ -33,2 +33,6 @@ import { doTransaction } from './context.js'; | ||
return this.count(res, req, body); | ||
case 'deleteMany': | ||
return this.deleteMany(res, req, body); | ||
case 'updateMany': | ||
return this.updateMany(res, req, body); | ||
case 'endLiveQuery': | ||
@@ -64,2 +68,20 @@ await this.remult.liveQueryStorage.remove(body.id); | ||
} | ||
async deleteMany(response, request, filterBody) { | ||
try { | ||
return await doTransaction(this.remult, async () => { | ||
let deleted = 0; | ||
for await (const x of this.repository.query({ | ||
where: await this.buildWhere(request, filterBody), | ||
include: this.includeNone(), | ||
})) { | ||
await this.actualDelete(x); | ||
deleted++; | ||
} | ||
response.success({ deleted }); | ||
}); | ||
} | ||
catch (err) { | ||
response.error(err); | ||
} | ||
} | ||
async getArrayImpl(response, request, filterBody) { | ||
@@ -224,21 +246,44 @@ let findOptions = { | ||
} | ||
async updateMany(response, request, body) { | ||
try { | ||
return await doTransaction(this.remult, async () => { | ||
let updated = 0; | ||
for await (const x of this.repository.query({ | ||
where: await this.buildWhere(request, body.where), | ||
include: this.includeNone(), | ||
})) { | ||
await this.actualUpdate(x, body.set); | ||
updated++; | ||
} | ||
response.success({ updated }); | ||
}); | ||
} | ||
catch (err) { | ||
response.error(err); | ||
} | ||
} | ||
async actualUpdate(row, body) { | ||
let ref = this.repository.getEntityRef(row); | ||
await ref._updateEntityBasedOnApi(body); | ||
if (!ref.apiUpdateAllowed) { | ||
throw new ForbiddenError(); | ||
} | ||
await ref.save(); | ||
return ref; | ||
} | ||
async put(response, id, body) { | ||
await this.doOnId(response, id, async (row) => { | ||
let ref = this.repository.getEntityRef(row); | ||
await ref._updateEntityBasedOnApi(body); | ||
if (!ref.apiUpdateAllowed) { | ||
response.forbidden(); | ||
return; | ||
} | ||
await ref.save(); | ||
const ref = await this.actualUpdate(row, body); | ||
response.success(ref.toApiJson()); | ||
}); | ||
} | ||
async actualDelete(row) { | ||
if (!this.repository.getEntityRef(row).apiDeleteAllowed) { | ||
throw new ForbiddenError(); | ||
} | ||
await this.repository.getEntityRef(row).delete(); | ||
} | ||
async delete(response, id) { | ||
await this.doOnId(response, id, async (row) => { | ||
if (!this.repository.getEntityRef(row).apiDeleteAllowed) { | ||
response.forbidden(); | ||
return; | ||
} | ||
await this.repository.getEntityRef(row).delete(); | ||
await this.actualDelete(row); | ||
response.deleted(); | ||
@@ -245,0 +290,0 @@ }); |
@@ -6,2 +6,3 @@ import { CompoundIdField } from '../CompoundIdField.js'; | ||
entity; | ||
rows; | ||
static rawFilter(filter) { | ||
@@ -14,10 +15,5 @@ return { | ||
} | ||
//@internal | ||
rows; | ||
constructor(entity, rows) { | ||
this.entity = entity; | ||
if (rows === undefined) | ||
this.rows = []; | ||
else | ||
this.rows = rows; | ||
this.rows = rows; | ||
} | ||
@@ -31,3 +27,3 @@ //@internal | ||
this.__names = await dbNamesOf(this.entity, (x) => x); | ||
for (const r of this.rows) { | ||
for (const r of this.rows()) { | ||
this.verifyThatRowHasAllNotNullColumns(r, this.__names); | ||
@@ -59,3 +55,3 @@ } | ||
async count(where) { | ||
let rows = this.rows; | ||
let rows = this.rows(); | ||
const names = await this.init(); | ||
@@ -77,3 +73,3 @@ let j = 0; | ||
async find(options) { | ||
let rows = this.rows; | ||
let rows = this.rows(); | ||
const dbNames = await this.init(); | ||
@@ -130,4 +126,4 @@ if (options) { | ||
let keys = Object.keys(data); | ||
for (let i = 0; i < this.rows.length; i++) { | ||
let r = this.rows[i]; | ||
for (let i = 0; i < this.rows().length; i++) { | ||
let r = this.rows()[i]; | ||
if (idMatches(r)) { | ||
@@ -143,4 +139,4 @@ let newR = { ...r }; | ||
this.verifyThatRowHasAllNotNullColumns(newR, names); | ||
this.rows[i] = newR; | ||
return Promise.resolve(this.translateFromJson(this.rows[i], names)); | ||
this.rows()[i] = newR; | ||
return Promise.resolve(this.translateFromJson(this.rows()[i], names)); | ||
} | ||
@@ -153,5 +149,5 @@ } | ||
let idMatches = this.idMatches(id, names); | ||
for (let i = 0; i < this.rows.length; i++) { | ||
if (idMatches(this.rows[i])) { | ||
this.rows.splice(i, 1); | ||
for (let i = 0; i < this.rows().length; i++) { | ||
if (idMatches(this.rows()[i])) { | ||
this.rows().splice(i, 1); | ||
return Promise.resolve(); | ||
@@ -169,3 +165,3 @@ } | ||
j[idf.key] = 1; | ||
for (const row of this.rows) { | ||
for (const row of this.rows()) { | ||
if (row[idf.key] >= j[idf.key]) | ||
@@ -176,3 +172,3 @@ j[idf.key] = row[idf.key] + 1; | ||
if (j[idf.key]) | ||
this.rows.forEach((i) => { | ||
this.rows().forEach((i) => { | ||
if (j[idf.key] == i[idf.key]) | ||
@@ -183,3 +179,3 @@ throw Error('id already exists'); | ||
this.verifyThatRowHasAllNotNullColumns(j, names); | ||
this.rows.push(j); | ||
this.rows().push(j); | ||
return Promise.resolve(this.translateFromJson(j, names)); | ||
@@ -186,0 +182,0 @@ } |
import { ArrayEntityDataProvider } from './array-entity-data-provider.js'; | ||
export class InMemoryDataProvider { | ||
async transaction(action) { | ||
await action(this); | ||
let before = JSON.stringify(this.rows); | ||
try { | ||
await action(this); | ||
} | ||
catch (e) { | ||
this.rows = JSON.parse(before); | ||
throw e; | ||
} | ||
} | ||
@@ -11,3 +18,3 @@ rows = {}; | ||
this.rows[name] = []; | ||
return new ArrayEntityDataProvider(entity, this.rows[name]); | ||
return new ArrayEntityDataProvider(entity, () => this.rows[name]); | ||
} | ||
@@ -14,0 +21,0 @@ toString() { |
@@ -27,3 +27,3 @@ import { ArrayEntityDataProvider } from './array-entity-data-provider.js'; | ||
data = JSON.parse(s); | ||
let dp = new ArrayEntityDataProvider(this.entity, data); | ||
let dp = new ArrayEntityDataProvider(this.entity, () => data); | ||
return what(dp, async () => await this.helper.setItem(dbName, JSON.stringify(data, undefined, 2))); | ||
@@ -30,0 +30,0 @@ } |
@@ -122,2 +122,10 @@ import { UrlBuilder } from '../../urlBuilder.js'; | ||
} | ||
async deleteMany(where) { | ||
const { run } = this.buildFindRequest({ where }, true); | ||
return run('deleteMany').then((r) => +r.deleted); | ||
} | ||
async updateMany(where, data) { | ||
const { run } = this.buildFindRequest({ where }, true); | ||
return run('updateMany', { set: this.toJsonOfIncludedKeys(data) }).then((r) => +r.updated); | ||
} | ||
find(options) { | ||
@@ -128,3 +136,3 @@ let { run } = this.buildFindRequest(options); | ||
//@internal | ||
buildFindRequest(options) { | ||
buildFindRequest(options, forcePost = false) { | ||
let url = new UrlBuilder(this.url()); | ||
@@ -135,3 +143,4 @@ let filterObject; | ||
filterObject = options.where.toJson(); // options.where.__applyToConsumer(new FilterConsumnerBridgeToUrlBuilder(url)); | ||
if (addFilterToUrlAndReturnTrueIfSuccessful(filterObject, url)) | ||
if (!forcePost && | ||
addFilterToUrlAndReturnTrueIfSuccessful(filterObject, url)) | ||
filterObject = undefined; | ||
@@ -163,3 +172,3 @@ } | ||
} | ||
const run = (action) => { | ||
const run = (action, body) => { | ||
let u = new UrlBuilder(url.url); | ||
@@ -171,4 +180,8 @@ if (!action && filterObject) { | ||
u.add('__action', action); | ||
if (filterObject) { | ||
return this.http().post(u.url, filterObject); | ||
if (filterObject || forcePost) { | ||
if (!body) | ||
body = filterObject; | ||
else | ||
body = { ...body, where: filterObject }; | ||
return this.http().post(u.url, body); | ||
} | ||
@@ -195,2 +208,7 @@ else | ||
update(id, data) { | ||
return this.http() | ||
.put(this.url() + '/' + encodeURIComponent(id), this.toJsonOfIncludedKeys(data)) | ||
.then((y) => this.translateFromJson(y)); | ||
} | ||
toJsonOfIncludedKeys(data) { | ||
let result = {}; | ||
@@ -202,5 +220,3 @@ let keys = Object.keys(data); | ||
} | ||
return this.http() | ||
.put(this.url() + '/' + encodeURIComponent(id), result) | ||
.then((y) => this.translateFromJson(y)); | ||
return result; | ||
} | ||
@@ -215,2 +231,7 @@ delete(id) { | ||
} | ||
insertMany(data) { | ||
return this.http() | ||
.post(this.url(), data.map((data) => this.translateToJson(data))) | ||
.then((y) => y.map((y) => this.translateFromJson(y))); | ||
} | ||
} | ||
@@ -217,0 +238,0 @@ export class RestDataProviderHttpProviderUsingFetch { |
@@ -16,8 +16,2 @@ export {}; | ||
//p1 - add section to Fields doc, explaining field type in db | ||
/*p1 - JYC - Delete many, update many, insert many | ||
//p1 - @jycouet regarding required - are you ok with leaving '' as not a good value? (0 will be a good value) | ||
- post + __action=delet | ||
*/ | ||
//p1 - JYC - there should be a required that says not null or undefined, but space, 0 etc... should be ok - NOAM- check if removing zero is good enough | ||
/*y1 - Talk JYC - JYC - add some integrity checks on delete | ||
@@ -28,2 +22,3 @@ - soft delete | ||
*/ | ||
//y1 תגיד - updateMany צריך להחזיר את השורות שעודכנו (כמו update או insert) או כמה שורות עודכנו (כמו deleteMany) | ||
/*y1 currency.ts:10 Uncaught TypeError: Currency_1 is not a constructor | ||
@@ -30,0 +25,0 @@ |
{ | ||
"name": "remult", | ||
"version": "0.25.7-exp.1", | ||
"version": "0.25.7-exp.2", | ||
"description": "A CRUD framework for full-stack TypeScript", | ||
@@ -5,0 +5,0 @@ "homepage": "https://remult.dev", |
import type { Remult } from './context.js'; | ||
import type { ErrorInfo } from './data-interfaces.js'; | ||
import type { FindOptions, Repository } from './remult3/remult3.js'; | ||
import type { rowHelperImplementation } from './remult3/RepositoryImplementation.js'; | ||
export declare class DataApi<T = any> { | ||
@@ -13,2 +14,3 @@ private repository; | ||
count(response: DataApiResponse, request: DataApiRequest, filterBody?: any): Promise<void>; | ||
deleteMany(response: DataApiResponse, request: DataApiRequest, filterBody?: any): Promise<void>; | ||
getArrayImpl(response: DataApiResponse, request: DataApiRequest, filterBody: any): Promise<{ | ||
@@ -23,3 +25,6 @@ r: any[]; | ||
private doOnId; | ||
updateMany(response: DataApiResponse, request: DataApiRequest, body?: any): Promise<void>; | ||
actualUpdate(row: any, body: any): Promise<rowHelperImplementation<T>>; | ||
put(response: DataApiResponse, id: any, body: any): Promise<void>; | ||
actualDelete(row: any): Promise<void>; | ||
delete(response: DataApiResponse, id: any): Promise<void>; | ||
@@ -26,0 +31,0 @@ post(response: DataApiResponse, body: any): Promise<void>; |
@@ -39,13 +39,17 @@ "use strict"; | ||
case 'count': return [3 /*break*/, 2]; | ||
case 'endLiveQuery': return [3 /*break*/, 3]; | ||
case 'deleteMany': return [3 /*break*/, 3]; | ||
case 'updateMany': return [3 /*break*/, 4]; | ||
case 'endLiveQuery': return [3 /*break*/, 5]; | ||
} | ||
return [3 /*break*/, 5]; | ||
return [3 /*break*/, 7]; | ||
case 1: return [2 /*return*/, this.getArray(res, req, body)]; | ||
case 2: return [2 /*return*/, this.count(res, req, body)]; | ||
case 3: return [4 /*yield*/, this.remult.liveQueryStorage.remove(body.id)]; | ||
case 4: | ||
case 3: return [2 /*return*/, this.deleteMany(res, req, body)]; | ||
case 4: return [2 /*return*/, this.updateMany(res, req, body)]; | ||
case 5: return [4 /*yield*/, this.remult.liveQueryStorage.remove(body.id)]; | ||
case 6: | ||
_b.sent(); | ||
res.success('ok'); | ||
return [2 /*return*/]; | ||
case 5: return [2 /*return*/, this.post(res, body)]; | ||
case 7: return [2 /*return*/, this.post(res, body)]; | ||
} | ||
@@ -107,2 +111,77 @@ }); | ||
}; | ||
DataApi.prototype.deleteMany = function (response, request, filterBody) { | ||
return tslib_1.__awaiter(this, void 0, void 0, function () { | ||
var err_2; | ||
var _this = this; | ||
return tslib_1.__generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: | ||
_a.trys.push([0, 2, , 3]); | ||
return [4 /*yield*/, (0, context_js_1.doTransaction)(this.remult, function () { return tslib_1.__awaiter(_this, void 0, void 0, function () { | ||
var deleted, _a, _b, _c, _d, _e, x, e_1_1; | ||
var _f; | ||
var _g, e_1, _h, _j; | ||
return tslib_1.__generator(this, function (_k) { | ||
switch (_k.label) { | ||
case 0: | ||
deleted = 0; | ||
_k.label = 1; | ||
case 1: | ||
_k.trys.push([1, 8, 9, 14]); | ||
_a = true; | ||
_e = (_d = this.repository).query; | ||
_f = {}; | ||
return [4 /*yield*/, this.buildWhere(request, filterBody)]; | ||
case 2: | ||
_b = tslib_1.__asyncValues.apply(void 0, [_e.apply(_d, [(_f.where = _k.sent(), | ||
_f.include = this.includeNone(), | ||
_f)])]); | ||
_k.label = 3; | ||
case 3: return [4 /*yield*/, _b.next()]; | ||
case 4: | ||
if (!(_c = _k.sent(), _g = _c.done, !_g)) return [3 /*break*/, 7]; | ||
_j = _c.value; | ||
_a = false; | ||
x = _j; | ||
return [4 /*yield*/, this.actualDelete(x)]; | ||
case 5: | ||
_k.sent(); | ||
deleted++; | ||
_k.label = 6; | ||
case 6: | ||
_a = true; | ||
return [3 /*break*/, 3]; | ||
case 7: return [3 /*break*/, 14]; | ||
case 8: | ||
e_1_1 = _k.sent(); | ||
e_1 = { error: e_1_1 }; | ||
return [3 /*break*/, 14]; | ||
case 9: | ||
_k.trys.push([9, , 12, 13]); | ||
if (!(!_a && !_g && (_h = _b.return))) return [3 /*break*/, 11]; | ||
return [4 /*yield*/, _h.call(_b)]; | ||
case 10: | ||
_k.sent(); | ||
_k.label = 11; | ||
case 11: return [3 /*break*/, 13]; | ||
case 12: | ||
if (e_1) throw e_1.error; | ||
return [7 /*endfinally*/]; | ||
case 13: return [7 /*endfinally*/]; | ||
case 14: | ||
response.success({ deleted: deleted }); | ||
return [2 /*return*/]; | ||
} | ||
}); | ||
}); })]; | ||
case 1: return [2 /*return*/, _a.sent()]; | ||
case 2: | ||
err_2 = _a.sent(); | ||
response.error(err_2); | ||
return [3 /*break*/, 3]; | ||
case 3: return [2 /*return*/]; | ||
} | ||
}); | ||
}); | ||
}; | ||
DataApi.prototype.getArrayImpl = function (response, request, filterBody) { | ||
@@ -188,3 +267,3 @@ return tslib_1.__awaiter(this, void 0, void 0, function () { | ||
DataApi.prototype.includeNone = function () { | ||
var e_1, _a; | ||
var e_2, _a; | ||
var include = {}; | ||
@@ -199,3 +278,3 @@ try { | ||
} | ||
catch (e_1_1) { e_1 = { error: e_1_1 }; } | ||
catch (e_2_1) { e_2 = { error: e_2_1 }; } | ||
finally { | ||
@@ -205,3 +284,3 @@ try { | ||
} | ||
finally { if (e_1) throw e_1.error; } | ||
finally { if (e_2) throw e_2.error; } | ||
} | ||
@@ -212,3 +291,3 @@ return include; | ||
return tslib_1.__awaiter(this, void 0, void 0, function () { | ||
var r, err_2; | ||
var r, err_3; | ||
return tslib_1.__generator(this, function (_a) { | ||
@@ -230,7 +309,7 @@ switch (_a.label) { | ||
case 3: | ||
err_2 = _a.sent(); | ||
if (err_2.isForbiddenError) | ||
err_3 = _a.sent(); | ||
if (err_3.isForbiddenError) | ||
response.forbidden(); | ||
else | ||
response.error(err_2); | ||
response.error(err_3); | ||
return [3 /*break*/, 4]; | ||
@@ -244,3 +323,3 @@ case 4: return [2 /*return*/]; | ||
return tslib_1.__awaiter(this, void 0, void 0, function () { | ||
var r, data, err_3; | ||
var r, data, err_4; | ||
var _a; | ||
@@ -278,7 +357,7 @@ var _this = this; | ||
case 5: | ||
err_3 = _b.sent(); | ||
if (err_3.isForbiddenError) | ||
err_4 = _b.sent(); | ||
if (err_4.isForbiddenError) | ||
response.forbidden(); | ||
else | ||
response.error(err_3); | ||
response.error(err_4); | ||
return [3 /*break*/, 6]; | ||
@@ -329,3 +408,3 @@ case 6: return [2 /*return*/]; | ||
return tslib_1.__awaiter(this, void 0, void 0, function () { | ||
var where, _a, _b, err_4; | ||
var where, _a, _b, err_5; | ||
var _this = this; | ||
@@ -377,4 +456,4 @@ return tslib_1.__generator(this, function (_c) { | ||
case 5: | ||
err_4 = _c.sent(); | ||
response.error(err_4); | ||
err_5 = _c.sent(); | ||
response.error(err_5); | ||
return [3 /*break*/, 6]; | ||
@@ -386,2 +465,98 @@ case 6: return [2 /*return*/]; | ||
}; | ||
DataApi.prototype.updateMany = function (response, request, body) { | ||
return tslib_1.__awaiter(this, void 0, void 0, function () { | ||
var err_6; | ||
var _this = this; | ||
return tslib_1.__generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: | ||
_a.trys.push([0, 2, , 3]); | ||
return [4 /*yield*/, (0, context_js_1.doTransaction)(this.remult, function () { return tslib_1.__awaiter(_this, void 0, void 0, function () { | ||
var updated, _a, _b, _c, _d, _e, x, e_3_1; | ||
var _f; | ||
var _g, e_3, _h, _j; | ||
return tslib_1.__generator(this, function (_k) { | ||
switch (_k.label) { | ||
case 0: | ||
updated = 0; | ||
_k.label = 1; | ||
case 1: | ||
_k.trys.push([1, 8, 9, 14]); | ||
_a = true; | ||
_e = (_d = this.repository).query; | ||
_f = {}; | ||
return [4 /*yield*/, this.buildWhere(request, body.where)]; | ||
case 2: | ||
_b = tslib_1.__asyncValues.apply(void 0, [_e.apply(_d, [(_f.where = _k.sent(), | ||
_f.include = this.includeNone(), | ||
_f)])]); | ||
_k.label = 3; | ||
case 3: return [4 /*yield*/, _b.next()]; | ||
case 4: | ||
if (!(_c = _k.sent(), _g = _c.done, !_g)) return [3 /*break*/, 7]; | ||
_j = _c.value; | ||
_a = false; | ||
x = _j; | ||
return [4 /*yield*/, this.actualUpdate(x, body.set)]; | ||
case 5: | ||
_k.sent(); | ||
updated++; | ||
_k.label = 6; | ||
case 6: | ||
_a = true; | ||
return [3 /*break*/, 3]; | ||
case 7: return [3 /*break*/, 14]; | ||
case 8: | ||
e_3_1 = _k.sent(); | ||
e_3 = { error: e_3_1 }; | ||
return [3 /*break*/, 14]; | ||
case 9: | ||
_k.trys.push([9, , 12, 13]); | ||
if (!(!_a && !_g && (_h = _b.return))) return [3 /*break*/, 11]; | ||
return [4 /*yield*/, _h.call(_b)]; | ||
case 10: | ||
_k.sent(); | ||
_k.label = 11; | ||
case 11: return [3 /*break*/, 13]; | ||
case 12: | ||
if (e_3) throw e_3.error; | ||
return [7 /*endfinally*/]; | ||
case 13: return [7 /*endfinally*/]; | ||
case 14: | ||
response.success({ updated: updated }); | ||
return [2 /*return*/]; | ||
} | ||
}); | ||
}); })]; | ||
case 1: return [2 /*return*/, _a.sent()]; | ||
case 2: | ||
err_6 = _a.sent(); | ||
response.error(err_6); | ||
return [3 /*break*/, 3]; | ||
case 3: return [2 /*return*/]; | ||
} | ||
}); | ||
}); | ||
}; | ||
DataApi.prototype.actualUpdate = function (row, body) { | ||
return tslib_1.__awaiter(this, void 0, void 0, function () { | ||
var ref; | ||
return tslib_1.__generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: | ||
ref = this.repository.getEntityRef(row); | ||
return [4 /*yield*/, ref._updateEntityBasedOnApi(body)]; | ||
case 1: | ||
_a.sent(); | ||
if (!ref.apiUpdateAllowed) { | ||
throw new server_action_js_1.ForbiddenError(); | ||
} | ||
return [4 /*yield*/, ref.save()]; | ||
case 2: | ||
_a.sent(); | ||
return [2 /*return*/, ref]; | ||
} | ||
}); | ||
}); | ||
}; | ||
DataApi.prototype.put = function (response, id, body) { | ||
@@ -396,14 +571,5 @@ return tslib_1.__awaiter(this, void 0, void 0, function () { | ||
switch (_a.label) { | ||
case 0: | ||
ref = this.repository.getEntityRef(row); | ||
return [4 /*yield*/, ref._updateEntityBasedOnApi(body)]; | ||
case 0: return [4 /*yield*/, this.actualUpdate(row, body)]; | ||
case 1: | ||
_a.sent(); | ||
if (!ref.apiUpdateAllowed) { | ||
response.forbidden(); | ||
return [2 /*return*/]; | ||
} | ||
return [4 /*yield*/, ref.save()]; | ||
case 2: | ||
_a.sent(); | ||
ref = _a.sent(); | ||
response.success(ref.toApiJson()); | ||
@@ -421,2 +587,18 @@ return [2 /*return*/]; | ||
}; | ||
DataApi.prototype.actualDelete = function (row) { | ||
return tslib_1.__awaiter(this, void 0, void 0, function () { | ||
return tslib_1.__generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: | ||
if (!this.repository.getEntityRef(row).apiDeleteAllowed) { | ||
throw new server_action_js_1.ForbiddenError(); | ||
} | ||
return [4 /*yield*/, this.repository.getEntityRef(row).delete()]; | ||
case 1: | ||
_a.sent(); | ||
return [2 /*return*/]; | ||
} | ||
}); | ||
}); | ||
}; | ||
DataApi.prototype.delete = function (response, id) { | ||
@@ -430,8 +612,3 @@ return tslib_1.__awaiter(this, void 0, void 0, function () { | ||
switch (_a.label) { | ||
case 0: | ||
if (!this.repository.getEntityRef(row).apiDeleteAllowed) { | ||
response.forbidden(); | ||
return [2 /*return*/]; | ||
} | ||
return [4 /*yield*/, this.repository.getEntityRef(row).delete()]; | ||
case 0: return [4 /*yield*/, this.actualDelete(row)]; | ||
case 1: | ||
@@ -453,3 +630,3 @@ _a.sent(); | ||
return tslib_1.__awaiter(this, void 0, void 0, function () { | ||
var insert_1, result_1, _a, _b, err_5; | ||
var insert_1, result_1, _a, _b, err_7; | ||
var _this = this; | ||
@@ -482,4 +659,4 @@ return tslib_1.__generator(this, function (_c) { | ||
return [4 /*yield*/, (0, context_js_1.doTransaction)(this.remult, function () { return tslib_1.__awaiter(_this, void 0, void 0, function () { | ||
var body_1, body_1_1, item, _a, _b, e_2_1; | ||
var e_2, _c; | ||
var body_1, body_1_1, item, _a, _b, e_4_1; | ||
var e_4, _c; | ||
return tslib_1.__generator(this, function (_d) { | ||
@@ -504,4 +681,4 @@ switch (_d.label) { | ||
case 5: | ||
e_2_1 = _d.sent(); | ||
e_2 = { error: e_2_1 }; | ||
e_4_1 = _d.sent(); | ||
e_4 = { error: e_4_1 }; | ||
return [3 /*break*/, 7]; | ||
@@ -512,3 +689,3 @@ case 6: | ||
} | ||
finally { if (e_2) throw e_2.error; } | ||
finally { if (e_4) throw e_4.error; } | ||
return [7 /*endfinally*/]; | ||
@@ -531,7 +708,7 @@ case 7: return [2 /*return*/]; | ||
case 5: | ||
err_5 = _c.sent(); | ||
if (err_5.isForbiddenError) | ||
err_7 = _c.sent(); | ||
if (err_7.isForbiddenError) | ||
response.forbidden(); | ||
else | ||
response.error(err_5); | ||
response.error(err_7); | ||
return [3 /*break*/, 6]; | ||
@@ -538,0 +715,0 @@ case 6: return [2 /*return*/]; |
@@ -20,2 +20,7 @@ import type { Filter } from './filter/filter-interfaces.js'; | ||
} | ||
export interface ProxyEntityDataProvider { | ||
insertMany(data: any[]): Promise<any[]>; | ||
deleteMany(where: Filter): Promise<number>; | ||
updateMany(where: Filter, data: any): Promise<number>; | ||
} | ||
export interface EntityDataProviderFindOptions { | ||
@@ -22,0 +27,0 @@ where?: Filter; |
@@ -6,4 +6,5 @@ import type { EntityDataProvider, EntityDataProviderFindOptions } from '../data-interfaces.js'; | ||
private entity; | ||
private rows; | ||
static rawFilter(filter: CustomArrayFilter): EntityFilter<any>; | ||
constructor(entity: EntityMetadata, rows?: any[]); | ||
constructor(entity: EntityMetadata, rows: () => any[]); | ||
count(where?: Filter): Promise<number>; | ||
@@ -10,0 +11,0 @@ find(options?: EntityDataProviderFindOptions): Promise<any[]>; |
@@ -11,6 +11,3 @@ "use strict"; | ||
this.entity = entity; | ||
if (rows === undefined) | ||
this.rows = []; | ||
else | ||
this.rows = rows; | ||
this.rows = rows; | ||
} | ||
@@ -40,3 +37,3 @@ ArrayEntityDataProvider.rawFilter = function (filter) { | ||
try { | ||
for (_b = tslib_1.__values(this.rows), _c = _b.next(); !_c.done; _c = _b.next()) { | ||
for (_b = tslib_1.__values(this.rows()), _c = _b.next(); !_c.done; _c = _b.next()) { | ||
r = _c.value; | ||
@@ -96,3 +93,3 @@ this.verifyThatRowHasAllNotNullColumns(r, this.__names); | ||
case 0: | ||
rows = this.rows; | ||
rows = this.rows(); | ||
return [4 /*yield*/, this.init()]; | ||
@@ -125,3 +122,3 @@ case 1: | ||
case 0: | ||
rows = this.rows; | ||
rows = this.rows(); | ||
return [4 /*yield*/, this.init()]; | ||
@@ -213,4 +210,4 @@ case 1: | ||
keys = Object.keys(data); | ||
for (i = 0; i < this.rows.length; i++) { | ||
r = this.rows[i]; | ||
for (i = 0; i < this.rows().length; i++) { | ||
r = this.rows()[i]; | ||
if (idMatches(r)) { | ||
@@ -236,4 +233,4 @@ newR = tslib_1.__assign({}, r); | ||
this.verifyThatRowHasAllNotNullColumns(newR, names); | ||
this.rows[i] = newR; | ||
return [2 /*return*/, Promise.resolve(this.translateFromJson(this.rows[i], names))]; | ||
this.rows()[i] = newR; | ||
return [2 /*return*/, Promise.resolve(this.translateFromJson(this.rows()[i], names))]; | ||
} | ||
@@ -255,5 +252,5 @@ } | ||
idMatches = this.idMatches(id, names); | ||
for (i = 0; i < this.rows.length; i++) { | ||
if (idMatches(this.rows[i])) { | ||
this.rows.splice(i, 1); | ||
for (i = 0; i < this.rows().length; i++) { | ||
if (idMatches(this.rows()[i])) { | ||
this.rows().splice(i, 1); | ||
return [2 /*return*/, Promise.resolve()]; | ||
@@ -282,3 +279,3 @@ } | ||
try { | ||
for (_a = tslib_1.__values(this.rows), _b = _a.next(); !_b.done; _b = _a.next()) { | ||
for (_a = tslib_1.__values(this.rows()), _b = _a.next(); !_b.done; _b = _a.next()) { | ||
row = _b.value; | ||
@@ -298,3 +295,3 @@ if (row[idf.key] >= j[idf.key]) | ||
if (j[idf.key]) | ||
this.rows.forEach(function (i) { | ||
this.rows().forEach(function (i) { | ||
if (j[idf.key] == i[idf.key]) | ||
@@ -305,3 +302,3 @@ throw Error('id already exists'); | ||
this.verifyThatRowHasAllNotNullColumns(j, names); | ||
this.rows.push(j); | ||
this.rows().push(j); | ||
return [2 /*return*/, Promise.resolve(this.translateFromJson(j, names))]; | ||
@@ -308,0 +305,0 @@ } |
@@ -12,8 +12,19 @@ "use strict"; | ||
return tslib_1.__awaiter(this, void 0, void 0, function () { | ||
var before, e_1; | ||
return tslib_1.__generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: return [4 /*yield*/, action(this)]; | ||
case 0: | ||
before = JSON.stringify(this.rows); | ||
_a.label = 1; | ||
case 1: | ||
_a.trys.push([1, 3, , 4]); | ||
return [4 /*yield*/, action(this)]; | ||
case 2: | ||
_a.sent(); | ||
return [2 /*return*/]; | ||
return [3 /*break*/, 4]; | ||
case 3: | ||
e_1 = _a.sent(); | ||
this.rows = JSON.parse(before); | ||
throw e_1; | ||
case 4: return [2 /*return*/]; | ||
} | ||
@@ -24,6 +35,7 @@ }); | ||
InMemoryDataProvider.prototype.getEntityDataProvider = function (entity) { | ||
var _this = this; | ||
var name = entity.key; | ||
if (!this.rows[name]) | ||
this.rows[name] = []; | ||
return new array_entity_data_provider_js_1.ArrayEntityDataProvider(entity, this.rows[name]); | ||
return new array_entity_data_provider_js_1.ArrayEntityDataProvider(entity, function () { return _this.rows[name]; }); | ||
}; | ||
@@ -30,0 +42,0 @@ InMemoryDataProvider.prototype.toString = function () { |
@@ -50,3 +50,3 @@ "use strict"; | ||
data = JSON.parse(s); | ||
dp = new array_entity_data_provider_js_1.ArrayEntityDataProvider(this.entity, data); | ||
dp = new array_entity_data_provider_js_1.ArrayEntityDataProvider(this.entity, function () { return data; }); | ||
return [2 /*return*/, what(dp, function () { return tslib_1.__awaiter(_this, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) { | ||
@@ -53,0 +53,0 @@ switch (_a.label) { |
@@ -1,2 +0,2 @@ | ||
import type { DataProvider, EntityDataProvider, EntityDataProviderFindOptions, RestDataProviderHttpProvider } from '../data-interfaces.js'; | ||
import type { DataProvider, EntityDataProvider, EntityDataProviderFindOptions, ProxyEntityDataProvider, RestDataProviderHttpProvider } from '../data-interfaces.js'; | ||
import { UrlBuilder } from '../../urlBuilder.js'; | ||
@@ -13,3 +13,3 @@ import type { ApiClient } from '../context.js'; | ||
} | ||
export declare class RestEntityDataProvider implements EntityDataProvider { | ||
export declare class RestEntityDataProvider implements EntityDataProvider, ProxyEntityDataProvider { | ||
private url; | ||
@@ -22,6 +22,10 @@ private http; | ||
count(where: Filter): Promise<number>; | ||
deleteMany(where: Filter): Promise<number>; | ||
updateMany(where: Filter, data: any): Promise<number>; | ||
find(options?: EntityDataProviderFindOptions): Promise<Array<any>>; | ||
update(id: any, data: any): Promise<any>; | ||
private toJsonOfIncludedKeys; | ||
delete(id: any): Promise<void>; | ||
insert(data: any): Promise<any>; | ||
insertMany(data: any[]): Promise<any[]>; | ||
} | ||
@@ -28,0 +32,0 @@ export declare class RestDataProviderHttpProviderUsingFetch implements RestDataProviderHttpProvider { |
@@ -164,2 +164,20 @@ "use strict"; | ||
}; | ||
RestEntityDataProvider.prototype.deleteMany = function (where) { | ||
return tslib_1.__awaiter(this, void 0, void 0, function () { | ||
var run; | ||
return tslib_1.__generator(this, function (_a) { | ||
run = this.buildFindRequest({ where: where }, true).run; | ||
return [2 /*return*/, run('deleteMany').then(function (r) { return +r.deleted; })]; | ||
}); | ||
}); | ||
}; | ||
RestEntityDataProvider.prototype.updateMany = function (where, data) { | ||
return tslib_1.__awaiter(this, void 0, void 0, function () { | ||
var run; | ||
return tslib_1.__generator(this, function (_a) { | ||
run = this.buildFindRequest({ where: where }, true).run; | ||
return [2 /*return*/, run('updateMany', { set: this.toJsonOfIncludedKeys(data) }).then(function (r) { return +r.updated; })]; | ||
}); | ||
}); | ||
}; | ||
RestEntityDataProvider.prototype.find = function (options) { | ||
@@ -171,4 +189,5 @@ var _this = this; | ||
//@internal | ||
RestEntityDataProvider.prototype.buildFindRequest = function (options) { | ||
RestEntityDataProvider.prototype.buildFindRequest = function (options, forcePost) { | ||
var _this = this; | ||
if (forcePost === void 0) { forcePost = false; } | ||
var url = new urlBuilder_js_1.UrlBuilder(this.url()); | ||
@@ -179,3 +198,4 @@ var filterObject; | ||
filterObject = options.where.toJson(); // options.where.__applyToConsumer(new FilterConsumnerBridgeToUrlBuilder(url)); | ||
if (addFilterToUrlAndReturnTrueIfSuccessful(filterObject, url)) | ||
if (!forcePost && | ||
addFilterToUrlAndReturnTrueIfSuccessful(filterObject, url)) | ||
filterObject = undefined; | ||
@@ -207,3 +227,3 @@ } | ||
} | ||
var run = function (action) { | ||
var run = function (action, body) { | ||
var u = new urlBuilder_js_1.UrlBuilder(url.url); | ||
@@ -215,4 +235,8 @@ if (!action && filterObject) { | ||
u.add('__action', action); | ||
if (filterObject) { | ||
return _this.http().post(u.url, filterObject); | ||
if (filterObject || forcePost) { | ||
if (!body) | ||
body = filterObject; | ||
else | ||
body = tslib_1.__assign(tslib_1.__assign({}, body), { where: filterObject }); | ||
return _this.http().post(u.url, body); | ||
} | ||
@@ -252,4 +276,9 @@ else | ||
RestEntityDataProvider.prototype.update = function (id, data) { | ||
var _this = this; | ||
return this.http() | ||
.put(this.url() + '/' + encodeURIComponent(id), this.toJsonOfIncludedKeys(data)) | ||
.then(function (y) { return _this.translateFromJson(y); }); | ||
}; | ||
RestEntityDataProvider.prototype.toJsonOfIncludedKeys = function (data) { | ||
var e_4, _a; | ||
var _this = this; | ||
var result = {}; | ||
@@ -271,5 +300,3 @@ var keys = Object.keys(data); | ||
} | ||
return this.http() | ||
.put(this.url() + '/' + encodeURIComponent(id), result) | ||
.then(function (y) { return _this.translateFromJson(y); }); | ||
return result; | ||
}; | ||
@@ -285,2 +312,8 @@ RestEntityDataProvider.prototype.delete = function (id) { | ||
}; | ||
RestEntityDataProvider.prototype.insertMany = function (data) { | ||
var _this = this; | ||
return this.http() | ||
.post(this.url(), data.map(function (data) { return _this.translateToJson(data); })) | ||
.then(function (y) { return y.map(function (y) { return _this.translateFromJson(y); }); }); | ||
}; | ||
return RestEntityDataProvider; | ||
@@ -287,0 +320,0 @@ }()); |
@@ -321,2 +321,6 @@ import type { ErrorInfo, FieldOptions } from '../../index.js'; | ||
update(id: Partial<MembersOnly<entityType>>, item: Partial<MembersOnly<entityType>>): Promise<entityType>; | ||
/** | ||
* Updates all items that match the `where` condition. | ||
*/ | ||
updateMany(where: EntityFilter<entityType>, item: Partial<MembersOnly<entityType>>): Promise<number>; | ||
/** Deletes an Item*/ | ||
@@ -329,2 +333,6 @@ delete(id: entityType extends { | ||
delete(item: Partial<MembersOnly<entityType>>): Promise<void>; | ||
/** | ||
* Deletes all items that match the `where` condition. | ||
*/ | ||
deleteMany(where: EntityFilter<entityType>): Promise<number>; | ||
/** Creates an instance of an item. It'll not be saved to the data source unless `save` or `insert` will be called for that item */ | ||
@@ -331,0 +339,0 @@ create(item?: Partial<MembersOnly<entityType>>): entityType; |
@@ -17,8 +17,2 @@ "use strict"; | ||
//p1 - add section to Fields doc, explaining field type in db | ||
/*p1 - JYC - Delete many, update many, insert many | ||
//p1 - @jycouet regarding required - are you ok with leaving '' as not a good value? (0 will be a good value) | ||
- post + __action=delet | ||
*/ | ||
//p1 - JYC - there should be a required that says not null or undefined, but space, 0 etc... should be ok - NOAM- check if removing zero is good enough | ||
/*y1 - Talk JYC - JYC - add some integrity checks on delete | ||
@@ -29,2 +23,3 @@ - soft delete | ||
*/ | ||
//y1 תגיד - updateMany צריך להחזיר את השורות שעודכנו (כמו update או insert) או כמה שורות עודכנו (כמו deleteMany) | ||
/*y1 currency.ts:10 Uncaught TypeError: Currency_1 is not a constructor | ||
@@ -31,0 +26,0 @@ |
@@ -54,2 +54,3 @@ import type { ClassType } from '../../classType.js'; | ||
validate(entity: Partial<MembersOnly<entityType>>, ...fields: Extract<keyof MembersOnly<entityType>, string>[]): Promise<ErrorInfo<entityType> | undefined>; | ||
updateMany(where: EntityFilter<entityType>, set: Partial<MembersOnly<entityType>>): Promise<number>; | ||
update(id: entityType extends { | ||
@@ -74,2 +75,3 @@ id?: number; | ||
count(where?: EntityFilter<entityType>): Promise<number>; | ||
deleteMany(where: EntityFilter<entityType>): Promise<number>; | ||
private cache; | ||
@@ -145,2 +147,4 @@ findOne(options?: FindFirstOptions<entityType>, skipOrderByAndLimit?: boolean): Promise<entityType>; | ||
save(onlyTheseFieldsSentOnlyInTheCaseOfProxySaveWithPartialObject?: string[]): Promise<T>; | ||
processInsertResponseDto(updatedRow: any): Promise<T>; | ||
buildDtoForInsert(): Promise<any>; | ||
private buildLifeCycleEvent; | ||
@@ -147,0 +151,0 @@ private getIdFilter; |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
4847209
47524