realm-js/lib/browser/objects.js
Marius Rackwitz 9e0a9a3bd3 Add support for accessing linking objects / backlinks (#1101)
* Add support for linkingObjects

* Test linkingObjects

* Borrow names helper from list tests

* include computed properties when serializing the schema for the RN debugger

* add API docs

* review comments

* Expose admin users to JS (#1100)

The JS binding used to conflate `SyncUser::is_admin()` with the user being created by calling `Realm.Sync.User.adminToken()`, but now that we expose a user’s role on the server under `is_admin()` this supposition is no longer correct.

#1097 attempted to fix one such case, but fixing it only uncovered another: in `UserClass<T>::all_users()`.  I’ve gone through all the callsites of `SyncUser::is_admin()` to make sure they don’t assume an admin token user.

* [1.8.3] Bump version

* add linkingObjects method to Realm.Object

* changelog
2017-06-29 11:59:10 +02:00

90 lines
2.6 KiB
JavaScript

////////////////////////////////////////////////////////////////////////////
//
// Copyright 2016 Realm Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
////////////////////////////////////////////////////////////////////////////
'use strict';
import { keys, objectTypes } from './constants';
import { getterForProperty, setterForProperty, createMethods } from './util';
let registeredConstructors = {};
let registeredRealmPaths = {};
export default class RealmObject {
}
// Non-mutating methods:
createMethods(RealmObject.prototype, objectTypes.OBJECT, [
'isValid',
'objectSchema',
'linkingObjects'
]);
export function clearRegisteredConstructors() {
registeredConstructors = {};
registeredRealmPaths = {};
}
export function createObject(realmId, info) {
let schema = info.schema;
let realmPath = registeredRealmPaths[realmId];
let constructor = (registeredConstructors[realmPath] || {})[schema.name];
let object = Object.create(constructor ? constructor.prototype : RealmObject.prototype);
object[keys.realm] = realmId;
object[keys.id] = info.id;
object[keys.type] = info.type;
schema.properties.forEach((name) => {
Object.defineProperty(object, name, {
enumerable: true,
get: getterForProperty(name),
set: setterForProperty(name),
});
});
if (constructor) {
let result = constructor.call(object);
if (result != null && result != object) {
throw new Error('Realm object constructor must not return another value');
}
}
return object;
}
export function registerConstructors(realmId, realmPath, constructors) {
registeredRealmPaths[realmId] = realmPath;
if (constructors) {
registeredConstructors[realmPath] = constructors;
}
}
export function typeForConstructor(realmId, constructor) {
let realmPath = registeredRealmPaths[realmId];
let constructors = registeredConstructors[realmPath];
for (let name in constructors) {
if (constructors[name] == constructor) {
return name;
}
}
return null;
}