Skip to content

Commit 5688b18

Browse files
committed
- BKNDLSS-31377 Allow using Number as ObjectId in the JS-SDK
1 parent 47942cd commit 5688b18

File tree

10 files changed

+269
-84
lines changed

10 files changed

+269
-84
lines changed

backendless.d.ts

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -680,9 +680,9 @@ declare module Backendless {
680680

681681
function createEmailConfirmationURL(identity: string | number): Promise<object>;
682682

683-
function enableUser(userId: string): Promise<void>;
683+
function enableUser(userId: string | number): Promise<void>;
684684

685-
function disableUser(userId: string): Promise<void>;
685+
function disableUser(userId: string | number): Promise<void>;
686686

687687
function getAuthorizationUrlLink(providerCode: string, fieldsMapping?: object, scope?: string, redirect?: boolean, redirectAfterLoginUrl?: string, callbackUrlDomain?: string): Promise<string>;
688688
}
@@ -1433,41 +1433,41 @@ declare module Backendless {
14331433

14341434
deepSave<T = object>(obj: T | object): Promise<T>;
14351435

1436-
remove(id: object | string): Promise<object>;
1436+
remove(id: object | string | number): Promise<object>;
14371437

14381438
find<T = object>(obj?: Backendless.DataQueryBuilder | DataQueryI): Promise<Array<T>>;
14391439

14401440
group<T = object>(obj?: Backendless.GroupQueryBuilder | GroupQueryI): Promise<Array<T>>;
14411441

14421442
countInGroup(obj?: Backendless.GroupQueryBuilder | GroupQueryI): Promise<number>;
14431443

1444-
findById<T = object>(objectId: string, query?: Backendless.DataQueryBuilder | DataQueryI): Promise<T>;
1444+
findById<T = object>(objectId: string | number, query?: Backendless.DataQueryBuilder | DataQueryI): Promise<T>;
14451445
findById<T = object>(primaryKeys: object, query?: Backendless.DataQueryBuilder | DataQueryI): Promise<T>;
14461446

14471447
findFirst<T = object>(query?: Backendless.DataQueryBuilder | DataQueryI): Promise<T>;
14481448

14491449
findLast<T = object>(query?: Backendless.DataQueryBuilder | DataQueryI): Promise<T>;
14501450

1451-
loadRelations<T = object>(parent: string | object, query: Backendless.LoadRelationsQueryBuilder | RelationsQueryI): Promise<Array<T>>;
1451+
loadRelations<T = object>(parent: string | number | object, query: Backendless.LoadRelationsQueryBuilder | RelationsQueryI): Promise<Array<T>>;
14521452

14531453
getObjectCount(query?: Backendless.DataQueryBuilder | string): Promise<number>
14541454

1455-
setRelation(parent: object, columnName: string, children: Array<object | string>): Promise<string>;
1456-
setRelation(parent: object, columnName: string, whereClause: string): Promise<string>;
1455+
setRelation(parent: object | string | number, columnName: string, children: Array<object | string | number>): Promise<string>;
1456+
setRelation(parent: object | string | number, columnName: string, whereClause: string): Promise<string>;
14571457

1458-
addRelation(parent: object, columnName: string, children: Array<object | string>): Promise<string>;
1459-
addRelation(parent: object, columnName: string, whereClause: string): Promise<string>;
1458+
addRelation(parent: object | string | number, columnName: string, children: Array<object | string | number>): Promise<string>;
1459+
addRelation(parent: object | string | number, columnName: string, whereClause: string): Promise<string>;
14601460

1461-
deleteRelation(parent: object, columnName: string, children: Array<object | string>): Promise<string>;
1462-
deleteRelation(parent: object, columnName: string, whereClause: string): Promise<string>;
1461+
deleteRelation(parent: object | string | number, columnName: string, children: Array<object | string | number>): Promise<string>;
1462+
deleteRelation(parent: object | string | number, columnName: string, whereClause: string): Promise<string>;
14631463

14641464
bulkCreate(objects: Array<object>): Promise<Array<string>>;
14651465

14661466
bulkUpsert(objects: Array<object>): Promise<Array<string>>;
14671467

14681468
bulkUpdate(whereClause: string, changes: object): Promise<string>;
14691469

1470-
bulkDelete(where: string | Array<string> | Array<{ objectId: string, [key: string]: any }>): Promise<string>;
1470+
bulkDelete(where: string | Array<string | number | { objectId: string | number, [key: string]: any }>): Promise<string>;
14711471

14721472
rt(): EventHandler;
14731473
}

src/data/store.js

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,8 @@ export default class DataStore {
7373
async remove(object) {
7474
const objectId = object && object.objectId || object
7575

76-
if (!objectId || typeof objectId !== 'string') {
77-
throw new Error('Object Id must be provided and must be a string.')
76+
if (!objectId || (typeof objectId !== 'string' && typeof objectId !== 'number')) {
77+
throw new Error('Object Id must be provided and must be a string or number.')
7878
}
7979

8080
return this.app.request.delete({
@@ -127,8 +127,8 @@ export default class DataStore {
127127
})
128128

129129
} else {
130-
if (!objectId || typeof objectId !== 'string') {
131-
throw new Error('Object Id must be provided and must be a string or an object of primary keys.')
130+
if (!objectId || (typeof objectId !== 'string' && typeof objectId !== 'number')) {
131+
throw new Error('Object Id must be provided and must be a string or number or an object of primary keys.')
132132
}
133133

134134
if (query) {
@@ -185,8 +185,8 @@ export default class DataStore {
185185
async loadRelations(parent, queryBuilder) {
186186
const parentObjectId = parent && parent.objectId || parent
187187

188-
if (!parentObjectId || typeof parentObjectId !== 'string') {
189-
throw new Error('Parent Object Id must be provided and must be a string.')
188+
if (!parentObjectId || (typeof parentObjectId !== 'string' && typeof parentObjectId !== 'number')) {
189+
throw new Error('Parent Object Id must be provided and must be a string or number.')
190190
}
191191

192192
const { relationName, relationModel, ...query } = queryBuilder instanceof LoadRelationsQueryBuilder
@@ -289,10 +289,10 @@ export default class DataStore {
289289
const objectIds = condition.map(object => {
290290
const objectId = object && object.objectId || object
291291

292-
if (!objectId || typeof objectId !== 'string') {
292+
if (!objectId || (typeof objectId !== 'string' && typeof objectId !== 'number')) {
293293
throw new Error(
294294
'Can not transform "objects" to "whereClause". ' +
295-
'Item must be a string or an object with property "objectId" as string.'
295+
'Item must be a string or number or an object with property "objectId" as string.'
296296
)
297297
}
298298

@@ -328,8 +328,10 @@ export default class DataStore {
328328
changeRelation(method, parent, columnName, children) {
329329
const parentId = parent && parent.objectId || parent
330330

331-
if (!parentId || typeof parentId !== 'string') {
332-
throw new Error('Relation Parent must be provided and must be a string or an object with objectId property.')
331+
if (!parentId || (typeof parentId !== 'string' && typeof parentId !== 'number')) {
332+
throw new Error(
333+
'Relation Parent must be provided and must be a string or number or an object with objectId property.'
334+
)
333335
}
334336

335337
if (!columnName || typeof columnName !== 'string') {
@@ -349,8 +351,8 @@ export default class DataStore {
349351
condition.childrenIds = children.map(child => {
350352
const childId = child && child.objectId || child
351353

352-
if (!childId || typeof childId !== 'string') {
353-
throw new Error('Child Id must be provided and must be a string.')
354+
if (!childId || (typeof childId !== 'string' && typeof childId !== 'number')) {
355+
throw new Error('Child Id must be provided and must be a string or number.')
354356
}
355357

356358
return childId

src/users/index.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -295,8 +295,8 @@ export default class Users {
295295
}
296296

297297
async updateUserStatus(userId, userStatus) {
298-
if (!userId || typeof userId !== 'string') {
299-
throw new Error('User objectId must be non empty string')
298+
if (!userId || (typeof userId !== 'string' && typeof userId !== 'number')) {
299+
throw new Error('User objectId must be non empty string/number')
300300
}
301301

302302
if (!userStatus || typeof userStatus !== 'string') {

test/tsd.ts

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,7 @@ function testDataStoreClass() {
440440
let promisePersons: Promise<Person[]>;
441441
let promiseObject: Promise<object>;
442442
let promiseNum: Promise<number>;
443+
let promiseString: Promise<string>;
443444

444445
const dataQueryObject = {
445446
pageSize: 123,
@@ -472,6 +473,7 @@ function testDataStoreClass() {
472473
promiseObject = dataStore.deepSave(item);
473474
promisePerson = dataStore.deepSave<Person>(person);
474475

476+
promiseObject = dataStore.remove(123);
475477
promiseObject = dataStore.remove('str');
476478
promiseObject = dataStore.remove(item);
477479

@@ -485,6 +487,7 @@ function testDataStoreClass() {
485487
promisePersons = dataStore.find<Person>(dataQueryObject);
486488
promisePersons = dataStore.find<Person>({pageSize: 123, offset: 0});
487489

490+
promiseObject = dataStore.findById(123);
488491
promiseObject = dataStore.findById('myId');
489492
promiseObject = dataStore.findById('myId', dataQueryBuilder);
490493
promiseObject = dataStore.findById('myId', dataQueryObject);
@@ -493,6 +496,7 @@ function testDataStoreClass() {
493496
promiseObject = dataStore.findById({foo: 'myId'}, dataQueryBuilder);
494497
promiseObject = dataStore.findById({foo: 'myId'}, {properties: ['foo']});
495498

499+
promisePerson = dataStore.findById<Person>(123);
496500
promisePerson = dataStore.findById<Person>('myId');
497501
promisePerson = dataStore.findById<Person>('myId', dataQueryBuilder);
498502
promisePerson = dataStore.findById<Person>('myId', dataQueryObject);
@@ -522,20 +526,48 @@ function testDataStoreClass() {
522526
promisePerson = dataStore.findLast<Person>(dataQueryObject);
523527
promisePerson = dataStore.findLast<Person>({pageSize: 123});
524528

529+
promiseObject = dataStore.loadRelations(123, loadRelationsQueryBuilder);
525530
promiseObject = dataStore.loadRelations(parentTableName, loadRelationsQueryBuilder);
526531
promiseObject = dataStore.loadRelations(parentTableName, relationsDataQueryObject);
527532
promiseObject = dataStore.loadRelations(parentTableName, {relationName: 'rel1'});
528533
promiseObject = dataStore.loadRelations(parentTableName, {relationName: 'rel1', relationModel: Person});
529534

535+
promisePersons = dataStore.loadRelations<Person>(123, loadRelationsQueryBuilder);
530536
promisePersons = dataStore.loadRelations<Person>(parentTableName, loadRelationsQueryBuilder);
531537
promisePersons = dataStore.loadRelations<Person>(parentTableName, relationsDataQueryObject);
532538
promisePersons = dataStore.loadRelations<Person>(parentTableName, {relationName: 'rel1'});
533539
promisePersons = dataStore.loadRelations<Person>(parentTableName, {relationName: 'rel1', relationModel: Person});
534540

541+
promiseString = dataStore.setRelation('parentId', 'columnName', ['abc', 123, {objectId: 'abc'}, {objectId: 123}]);
542+
promiseString = dataStore.setRelation(123, 'columnName', ['abc', 123, {objectId: 'abc'}, {objectId: 123}]);
543+
promiseString = dataStore.setRelation({objectId: 'abc'}, 'columnName', ['abc', 123, {objectId: 'abc'}, {objectId: 123}]);
544+
promiseString = dataStore.setRelation({objectId: 123}, 'columnName', ['abc', 123, {objectId: 'abc'}, {objectId: 123}]);
545+
promiseString = dataStore.setRelation('parentId', 'columnName', 'where-str');
546+
promiseString = dataStore.setRelation(123, 'columnName', 'where-str');
547+
promiseString = dataStore.setRelation({objectId: 'abc'}, 'columnName', 'where-str');
548+
promiseString = dataStore.setRelation({objectId: 123}, 'columnName', 'where-str');
549+
550+
promiseString = dataStore.addRelation('parentId', 'columnName', ['abc', 123, {objectId: 'abc'}, {objectId: 123}]);
551+
promiseString = dataStore.addRelation(123, 'columnName', ['abc', 123, {objectId: 'abc'}, {objectId: 123}]);
552+
promiseString = dataStore.addRelation({objectId: 'abc'}, 'columnName', ['abc', 123, {objectId: 'abc'}, {objectId: 123}]);
553+
promiseString = dataStore.addRelation({objectId: 123}, 'columnName', ['abc', 123, {objectId: 'abc'}, {objectId: 123}]);
554+
promiseString = dataStore.addRelation('parentId', 'columnName', 'where-str');
555+
promiseString = dataStore.addRelation(123, 'columnName', 'where-str');
556+
promiseString = dataStore.addRelation({objectId: 'abc'}, 'columnName', 'where-str');
557+
promiseString = dataStore.addRelation({objectId: 123}, 'columnName', 'where-str');
558+
559+
promiseString = dataStore.deleteRelation('parentId', 'columnName', ['abc', 123, {objectId: 'abc'}, {objectId: 123}]);
560+
promiseString = dataStore.deleteRelation(123, 'columnName', ['abc', 123, {objectId: 'abc'}, {objectId: 123}]);
561+
promiseString = dataStore.deleteRelation({objectId: 'abc'}, 'columnName', ['abc', 123, {objectId: 'abc'}, {objectId: 123}]);
562+
promiseString = dataStore.deleteRelation({objectId: 123}, 'columnName', ['abc', 123, {objectId: 'abc'}, {objectId: 123}]);
563+
promiseString = dataStore.deleteRelation('parentId', 'columnName', 'where-str');
564+
promiseString = dataStore.deleteRelation(123, 'columnName', 'where-str');
565+
promiseString = dataStore.deleteRelation({objectId: 'abc'}, 'columnName', 'where-str');
566+
promiseString = dataStore.deleteRelation({objectId: 123}, 'columnName', 'where-str');
567+
535568
promiseNum = dataStore.getObjectCount();
536569
promiseNum = dataStore.getObjectCount('foo=123');
537570
promiseNum = dataStore.getObjectCount(dataQueryBuilder);
538-
539571
}
540572

541573
function testPersistence() {
@@ -1191,7 +1223,8 @@ function testBulkOperations() {
11911223
resultPromiseString = dataStore.bulkUpdate('where clause string', {foo: 'bar'});
11921224

11931225
resultPromiseString = dataStore.bulkDelete('where clause string');
1194-
resultPromiseString = dataStore.bulkDelete(['objectId1', 'objectId2', 'objectId3']);
1226+
resultPromiseString = dataStore.bulkDelete(['objectId1', {objectId: 'objectId1'}, 123]);
1227+
resultPromiseString = dataStore.bulkDelete([{objectId: 123}, 123]);
11951228
resultPromiseString = dataStore.bulkDelete([{objectId: 'objectId1'}]);
11961229
resultPromiseString = dataStore.bulkDelete([{objectId: 'objectId1', foo: 'bar'}]);
11971230
}
@@ -1417,8 +1450,10 @@ function testUserService() {
14171450
promiseObject = Backendless.UserService.createEmailConfirmationURL('email');
14181451
promiseObject = Backendless.UserService.createEmailConfirmationURL(1234);
14191452

1453+
promiseVoid = Backendless.UserService.enableUser(123);
14201454
promiseVoid = Backendless.UserService.enableUser(userId);
14211455

1456+
promiseVoid = Backendless.UserService.disableUser(123);
14221457
promiseVoid = Backendless.UserService.disableUser(userId);
14231458

14241459
promiseString = Backendless.UserService.getAuthorizationUrlLink('google', {email: 'userEmail'}, 'email;photo', false, 'https://foo', 'foo.bar');

test/unit/specs/data/bulk.js

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -187,14 +187,14 @@ describe('<Data> Bulk Operations', function() {
187187
it('deletes objects with object ids', async () => {
188188
const req1 = prepareMockRequest(fakeResult)
189189

190-
const result1 = await dataStore.bulkDelete([{ objectId: 'object-1' }, 'object-2', { objectId: 'object-3' }])
190+
const result1 = await dataStore.bulkDelete([{ objectId: 'object-1' }, 'object-2', { objectId: 111 }, 222])
191191

192192
expect(req1).to.deep.include({
193193
method : 'POST',
194194
path : `${APP_PATH}/data/bulk/${tableName}/delete`,
195195
headers: { 'Content-Type': 'application/json' },
196196
body : {
197-
where: 'objectId in (\'object-1\',\'object-2\',\'object-3\')'
197+
where: 'objectId in (\'object-1\',\'object-2\',\'111\',\'222\')'
198198
}
199199
})
200200

@@ -219,16 +219,14 @@ describe('<Data> Bulk Operations', function() {
219219
it('fails when at least on objectId is invalid', async () => {
220220
const errorMsg = (
221221
'Can not transform "objects" to "whereClause". ' +
222-
'Item must be a string or an object with property "objectId" as string.'
222+
'Item must be a string or number or an object with property "objectId" as string.'
223223
)
224224

225225
await expect(dataStore.bulkDelete(['object-id', ''])).to.eventually.be.rejectedWith(errorMsg)
226226
await expect(dataStore.bulkDelete(['object-id', false])).to.eventually.be.rejectedWith(errorMsg)
227227
await expect(dataStore.bulkDelete(['object-id', true])).to.eventually.be.rejectedWith(errorMsg)
228228
await expect(dataStore.bulkDelete(['object-id', null])).to.eventually.be.rejectedWith(errorMsg)
229229
await expect(dataStore.bulkDelete(['object-id', undefined])).to.eventually.be.rejectedWith(errorMsg)
230-
await expect(dataStore.bulkDelete(['object-id', 0])).to.eventually.be.rejectedWith(errorMsg)
231-
await expect(dataStore.bulkDelete(['object-id', 123])).to.eventually.be.rejectedWith(errorMsg)
232230
await expect(dataStore.bulkDelete(['object-id', {}])).to.eventually.be.rejectedWith(errorMsg)
233231
await expect(dataStore.bulkDelete(['object-id', []])).to.eventually.be.rejectedWith(errorMsg)
234232
await expect(dataStore.bulkDelete(['object-id', () => ({})])).to.eventually.be.rejectedWith(errorMsg)
@@ -238,8 +236,6 @@ describe('<Data> Bulk Operations', function() {
238236
await expect(dataStore.bulkDelete(['object-id', { objectId: true }])).to.eventually.be.rejectedWith(errorMsg)
239237
await expect(dataStore.bulkDelete(['object-id', { objectId: null }])).to.eventually.be.rejectedWith(errorMsg)
240238
await expect(dataStore.bulkDelete(['object-id', { objectId: undefined }])).to.eventually.be.rejectedWith(errorMsg)
241-
await expect(dataStore.bulkDelete(['object-id', { objectId: 0 }])).to.eventually.be.rejectedWith(errorMsg)
242-
await expect(dataStore.bulkDelete(['object-id', { objectId: 123 }])).to.eventually.be.rejectedWith(errorMsg)
243239
await expect(dataStore.bulkDelete(['object-id', { objectId: {} }])).to.eventually.be.rejectedWith(errorMsg)
244240
await expect(dataStore.bulkDelete(['object-id', { objectId: [] }])).to.eventually.be.rejectedWith(errorMsg)
245241
await expect(dataStore.bulkDelete(['object-id', { objectId: () => ({}) }])).to.eventually.be.rejectedWith(errorMsg)

test/unit/specs/data/crud.js

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -408,8 +408,23 @@ describe('<Data> CRUD', function() {
408408
expect(result1).to.be.equal(fakeResult)
409409
})
410410

411+
it('removes object by its id (number)', async () => {
412+
const req1 = prepareMockRequest(fakeResult)
413+
414+
const result1 = await Backendless.Data.of(tableName).remove(123)
415+
416+
expect(req1).to.deep.include({
417+
method : 'DELETE',
418+
path : `${APP_PATH}/data/${tableName}/123`,
419+
headers: {},
420+
body : undefined
421+
})
422+
423+
expect(result1).to.be.equal(fakeResult)
424+
})
425+
411426
it('fails when objectId is invalid', async () => {
412-
const errorMsg = 'Object Id must be provided and must be a string.'
427+
const errorMsg = 'Object Id must be provided and must be a string or number.'
413428

414429
const dataStore = Backendless.Data.of(tableName)
415430

@@ -419,8 +434,6 @@ describe('<Data> CRUD', function() {
419434
await expect(dataStore.remove(true)).to.eventually.be.rejectedWith(errorMsg)
420435
await expect(dataStore.remove(null)).to.eventually.be.rejectedWith(errorMsg)
421436
await expect(dataStore.remove(undefined)).to.eventually.be.rejectedWith(errorMsg)
422-
await expect(dataStore.remove(0)).to.eventually.be.rejectedWith(errorMsg)
423-
await expect(dataStore.remove(123)).to.eventually.be.rejectedWith(errorMsg)
424437
await expect(dataStore.remove({})).to.eventually.be.rejectedWith(errorMsg)
425438
await expect(dataStore.remove([])).to.eventually.be.rejectedWith(errorMsg)
426439
await expect(dataStore.remove(() => ({}))).to.eventually.be.rejectedWith(errorMsg)

0 commit comments

Comments
 (0)