@ja-platform/db 0.0.0-dev-20261113193343 → 0.0.0-stage

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/README.md +3 -0
  2. package/package.json +3 -52
  3. package/LICENSE +0 -521
  4. package/dist/@types/Schema.d.ts +0 -1
  5. package/dist/@types/app.d.ts +0 -12
  6. package/dist/@types/browser.d.ts +0 -31
  7. package/dist/@types/credentials/ApiCredentials.d.ts +0 -18
  8. package/dist/@types/credentials/MobileCredentials.d.ts +0 -22
  9. package/dist/@types/credentials/index.d.ts +0 -2
  10. package/dist/@types/database/Batch.d.ts +0 -61
  11. package/dist/@types/database/Collection.d.ts +0 -85
  12. package/dist/@types/database/Database.d.ts +0 -22
  13. package/dist/@types/database/DatabaseObject.d.ts +0 -51
  14. package/dist/@types/database/GenericDatabase.d.ts +0 -4
  15. package/dist/@types/database/JourneyAPIAdapter.d.ts +0 -45
  16. package/dist/@types/database/ObjectDisplayScope.d.ts +0 -22
  17. package/dist/@types/database/OnlineDB.d.ts +0 -8
  18. package/dist/@types/database/adapters/BaseAdapter.d.ts +0 -26
  19. package/dist/@types/database/adapters/DatabaseAdapter.d.ts +0 -22
  20. package/dist/@types/database/adapters/WebSQLAdapter.d.ts +0 -50
  21. package/dist/@types/index.d.ts +0 -2
  22. package/dist/@types/query/InternalQuery.d.ts +0 -17
  23. package/dist/@types/query/Query.d.ts +0 -133
  24. package/dist/@types/query/getPreloadRelationships.d.ts +0 -9
  25. package/dist/@types/query/queryOperations.d.ts +0 -87
  26. package/dist/@types/types/Attachment.d.ts +0 -104
  27. package/dist/@types/types/Location.d.ts +0 -18
  28. package/dist/@types/types/ObjectData.d.ts +0 -12
  29. package/dist/@types/types/TypeOperations.d.ts +0 -42
  30. package/dist/@types/utils/FunctionQueue.d.ts +0 -32
  31. package/dist/@types/utils/JourneyPromise.d.ts +0 -2
  32. package/dist/@types/utils/base64.d.ts +0 -4
  33. package/dist/@types/utils/retryableFetch.d.ts +0 -3
  34. package/dist/Schema.js +0 -6
  35. package/dist/Schema.js.map +0 -1
  36. package/dist/app.js +0 -30
  37. package/dist/app.js.map +0 -1
  38. package/dist/browser.js +0 -77
  39. package/dist/browser.js.map +0 -1
  40. package/dist/credentials/ApiCredentials.js +0 -61
  41. package/dist/credentials/ApiCredentials.js.map +0 -1
  42. package/dist/credentials/MobileCredentials.js +0 -73
  43. package/dist/credentials/MobileCredentials.js.map +0 -1
  44. package/dist/credentials/index.js +0 -19
  45. package/dist/credentials/index.js.map +0 -1
  46. package/dist/database/Batch.js +0 -189
  47. package/dist/database/Batch.js.map +0 -1
  48. package/dist/database/Collection.js +0 -69
  49. package/dist/database/Collection.js.map +0 -1
  50. package/dist/database/Database.js +0 -47
  51. package/dist/database/Database.js.map +0 -1
  52. package/dist/database/DatabaseObject.js +0 -646
  53. package/dist/database/DatabaseObject.js.map +0 -1
  54. package/dist/database/GenericDatabase.js +0 -3
  55. package/dist/database/GenericDatabase.js.map +0 -1
  56. package/dist/database/JourneyAPIAdapter.js +0 -357
  57. package/dist/database/JourneyAPIAdapter.js.map +0 -1
  58. package/dist/database/ObjectDisplayScope.js +0 -117
  59. package/dist/database/ObjectDisplayScope.js.map +0 -1
  60. package/dist/database/OnlineDB.js +0 -16
  61. package/dist/database/OnlineDB.js.map +0 -1
  62. package/dist/database/adapters/BaseAdapter.js +0 -66
  63. package/dist/database/adapters/BaseAdapter.js.map +0 -1
  64. package/dist/database/adapters/DatabaseAdapter.js +0 -3
  65. package/dist/database/adapters/DatabaseAdapter.js.map +0 -1
  66. package/dist/database/adapters/WebSQLAdapter.js +0 -343
  67. package/dist/database/adapters/WebSQLAdapter.js.map +0 -1
  68. package/dist/index.js +0 -20
  69. package/dist/index.js.map +0 -1
  70. package/dist/query/InternalQuery.js +0 -3
  71. package/dist/query/InternalQuery.js.map +0 -1
  72. package/dist/query/Query.js +0 -414
  73. package/dist/query/Query.js.map +0 -1
  74. package/dist/query/getPreloadRelationships.js +0 -45
  75. package/dist/query/getPreloadRelationships.js.map +0 -1
  76. package/dist/query/queryOperations.js +0 -678
  77. package/dist/query/queryOperations.js.map +0 -1
  78. package/dist/tsconfig.tsbuildinfo +0 -1
  79. package/dist/types/Attachment.js +0 -198
  80. package/dist/types/Attachment.js.map +0 -1
  81. package/dist/types/Location.js +0 -38
  82. package/dist/types/Location.js.map +0 -1
  83. package/dist/types/ObjectData.js +0 -3
  84. package/dist/types/ObjectData.js.map +0 -1
  85. package/dist/types/TypeOperations.js +0 -267
  86. package/dist/types/TypeOperations.js.map +0 -1
  87. package/dist/utils/FunctionQueue.js +0 -91
  88. package/dist/utils/FunctionQueue.js.map +0 -1
  89. package/dist/utils/JourneyPromise.js +0 -3
  90. package/dist/utils/JourneyPromise.js.map +0 -1
  91. package/dist/utils/base64.js +0 -40
  92. package/dist/utils/base64.js.map +0 -1
  93. package/dist/utils/retryableFetch.js +0 -57
  94. package/dist/utils/retryableFetch.js.map +0 -1
  95. package/readme.md +0 -37
@@ -1 +0,0 @@
1
- {"version":3,"file":"DatabaseObject.js","sourceRoot":"","sources":["../../src/database/DatabaseObject.ts"],"names":[],"mappings":"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","sourcesContent":["import { operationsFor as databaseOperationsFor } from '../types/TypeOperations';\nimport { formatValueAsync } from '@ja-platform/parser-expressions';\nimport { ObjectDisplayScope } from './ObjectDisplayScope';\nimport * as uuid from 'uuid';\nimport { Query } from '../query/Query';\nimport { RelationMatch } from '../query/queryOperations';\nimport { ObjectData } from '../types/ObjectData';\nimport { SchemaModelType } from '@ja-platform/parser-schema';\nimport * as j from '../utils/JourneyPromise';\nimport { DatabaseAdapter } from './adapters/DatabaseAdapter';\nimport { Batch, CrudError } from './Batch';\n\n// type is the type object, not the name\nexport class DatabaseObject {\n // id is optional. If not specified, a new one will be assigned automatically.\n /** @internal */\n static build<T = {}>(adapter: DatabaseAdapter, type: SchemaModelType, id?: string, data?: any): DatabaseObject & T {\n var obj = new DatabaseObject(adapter, type, id);\n if (data != null) {\n obj.resolve(data);\n }\n return obj as DatabaseObject & T;\n }\n\n /**\n * ID of the object, generated when the object is first created.\n */\n readonly id: string;\n readonly type: SchemaModelType;\n /** @internal */\n _adapter: DatabaseAdapter;\n\n /**\n * true if this object has ben saved to the database.\n */\n persisted: boolean;\n\n // functions set in the constructor\n /**\n * Read a field or resolve a relationship.\n */\n _get: (name: string) => Promise<any>;\n /**\n * Read a field or cached relationship, returning undefined while it loads.\n */\n _cached: (name: string) => any;\n /**\n * Set a declared field or belongs-to relationship.\n */\n _set: (name: string, value: any) => void;\n /** @internal */\n resolve: (data: ObjectData) => void;\n\n /**\n * Set all values provided in an enumerable object.\n *\n * @param values - the values to set\n */\n setAll: (values?: any) => void;\n\n /** @internal */\n toData: (patch: boolean) => ObjectData;\n\n /** @internal */\n _getDirtyList: (into?: any[]) => DatabaseObject[];\n private _reload: () => Promise<void>;\n private _save: () => Promise<void>;\n private _destroy: () => Promise<void>;\n /** @internal */\n _cache: (name: string, value: DatabaseObject) => void;\n /** @internal */\n _persisted: () => boolean;\n /** @internal */\n _destroyed: () => boolean;\n\n constructor(adapter: DatabaseAdapter, type: SchemaModelType, id: string) {\n if (adapter == null || typeof adapter.get != 'function') {\n throw new Error('adapter is required');\n }\n if (type == null || typeof type.attributes != 'object') {\n throw new Error('type is required');\n }\n const objself = this;\n const operationsFor = adapter.operationsFor?.bind(adapter) ?? databaseOperationsFor;\n\n // This is where all the attributes are stored\n const attributes: { [index: string]: any } = {};\n\n // Attributes that have been set by the user.\n let attributesDirty: { [index: string]: boolean } = {};\n\n // belongsToIds is only used when there is no corresponding object in belongsToCache.\n const belongsToIds: { [index: string]: string } = {};\n\n // belongsToCache serves as a cache for relationships. The id in belongsToIds should always correspond to\n // the id here, if the object is present.\n // `null` means that we looked for the object but it doesn't exist (on the client), while `undefined` / not present\n // means that we haven't queried yet.\n let belongsToCache: { [index: string]: DatabaseObject } = {};\n\n // Relationships that have been set by the user.\n // true means set by user, false or not present means not set\n let belongsToDirty: { [index: string]: boolean } = {};\n\n // We keep track of what we are currently loading, so that we don't execute the same query many times\n // in succession.\n const belongsToLoading: { [index: string]: Promise<DatabaseObject> } = {};\n\n // Caching the queries prevents them from being re-executed all the time.\n let hasManyCache: { [index: string]: Query } = {};\n\n let persisted: boolean;\n let destroyed = false;\n\n if (id == null) {\n // New object\n id = uuid.v4();\n persisted = false;\n } else {\n // Existing object that is already loaded\n persisted = true;\n }\n\n // id is read-only in public, but may change internally\n Object.defineProperty(this, 'id', {\n enumerable: false,\n configurable: false,\n get: function () {\n return id;\n }\n });\n\n // persisted is read-only in public, but may change internally\n Object.defineProperty(this, 'persisted', {\n enumerable: false,\n configurable: false,\n get: function () {\n return persisted;\n }\n });\n\n defineHiddenConstant(this, 'type', type);\n\n // Reload an object.\n // Returns a promise that is resolved with the same object when it is loaded.\n // If the object does not exist anymore, the promise is resolved with `null`.\n // If the object is not loaded yet, this returns its original promise.\n function _reload() {\n if (id == null) {\n throw new Error('Object is not saved yet - cannot reload');\n }\n return adapter.get(type.name, id).then(function (data) {\n resolve(data);\n });\n }\n\n function resolve(data: ObjectData): void {\n if (data != null) {\n const resolveAttributes = data.attributes || {};\n Object.keys(type.attributes).forEach(function (key) {\n const attribute = type.attributes[key];\n const value = resolveAttributes[key];\n\n // We don't override any attributes that have already been set.\n if (!attributesDirty[key]) {\n const realValue = value == null ? null : operationsFor(attribute.type).valueFromJSON(value);\n\n // We use the setter so that type checking occurs...\n try {\n setAttribute(key, realValue);\n } catch (err) {\n // ... but we ignore invalid attributes\n }\n // ... and we don't want the attribute to be marked as dirty.\n attributesDirty[key] = false;\n }\n });\n\n const loadedBelongsToIds = data.belongs_to || {};\n\n // Loop through all relationships, not just the ones in the data.\n // This is to ensure that cleared relationships are handled\n // correctly.\n Object.keys(type.belongsTo).forEach(function (key) {\n const belongsToId = loadedBelongsToIds[key];\n // We don't override any relationships that have already been set.\n if (!belongsToDirty[key]) {\n // Save the id\n belongsToIds[key] = belongsToId;\n\n // Clear any cached object\n delete belongsToCache[key];\n\n // Cancel the loading of any previous relationships\n delete belongsToLoading[key];\n }\n });\n\n id = data.id;\n if (id != null) {\n persisted = true;\n }\n\n hasManyCache = {};\n }\n }\n\n function setAll(values: any) {\n if (values != null) {\n for (let key in values) {\n if (values.hasOwnProperty(key)) {\n _set(key, values[key]);\n }\n }\n }\n }\n\n let saving = false;\n\n // Returns a promise that is resolved when this object is saved.\n async function _save() {\n if (destroyed) {\n // Don't save an object that has been destroyed.\n return;\n }\n\n // Create a batch with this object.\n // Note that other objects may implicitly be added to the batch via\n // belongs-to relationships.\n let batch = new Batch(adapter);\n batch.save(this);\n return batch._execute().catch(function (error: any) {\n if (error instanceof CrudError) {\n return Promise.reject(error.firstError());\n } else {\n return Promise.reject(error);\n }\n });\n }\n\n /**\n * Mark the object as persisted.\n */\n function _persisted() {\n persisted = true;\n\n // Clear the \"dirty\" state\n attributesDirty = {};\n belongsToDirty = {};\n }\n\n /**\n * Mark the object as destroyed.\n */\n function _destroyed() {\n persisted = false;\n destroyed = true;\n }\n\n /**\n * Returns an array of this object and any related objects that should be saved.\n *\n * @param [into] - array to populate\n */\n function _getDirtyList(into?: any[]): any[] {\n if (into == null) {\n into = [];\n }\n if (destroyed) {\n // Don't save a destroyed object\n return into;\n }\n if (saving) {\n // Prevent recursion into self\n return into;\n }\n saving = true;\n into.push(objself);\n try {\n Object.keys(belongsToCache).forEach(function (key) {\n const related = belongsToCache[key];\n if (related != null) {\n if (related._adapter === adapter) {\n related._getDirtyList(into);\n } else {\n // Different adapter - can't add to the same batch.\n // Don't save the related object in this case.\n }\n }\n });\n return into;\n } finally {\n saving = false;\n }\n }\n\n // Delete this object.\n // Returns a promise that is resolved when this object is deleted.\n async function _destroy() {\n if (id != null) {\n const batch = new Batch(adapter);\n batch.destroy(this);\n try {\n await batch._execute();\n } catch (error) {\n if (error instanceof CrudError) {\n throw error.firstError();\n } else {\n throw error;\n }\n }\n } else {\n destroyed = true;\n }\n }\n\n // Return a string representation of this object, according to the display format.\n // Only returns the correct value if the object is already loaded.\n function toString() {\n var displayFormat = type.displayFormat;\n return new ObjectDisplayScope(objself, operationsFor).evaluate(displayFormat);\n }\n\n function toData(patch?: boolean) {\n // We don't modify belongToIds here - this must be a read-only method.\n let jsonBelongsTo: { [index: string]: string } = {};\n\n Object.keys(type.belongsTo).forEach(function (name) {\n let belongsToId = belongsToIds[name];\n if (patch) {\n if (belongsToDirty[name]) {\n jsonBelongsTo[name] = belongsToId;\n }\n } else {\n if (belongsToId != null) {\n jsonBelongsTo[name] = belongsToId;\n }\n }\n });\n\n let jsonAttributes: { [key: string]: any } = {};\n Object.keys(type.attributes).forEach(function (name) {\n const attribute = type.attributes[name];\n const value = attributes[name];\n if (patch) {\n if (attributesDirty[name]) {\n if (value == null) {\n jsonAttributes[name] = null;\n } else {\n jsonAttributes[name] = operationsFor(attribute.type).valueToJSON(value, adapter.serializeOptions);\n }\n }\n } else {\n if (value != null) {\n jsonAttributes[name] = operationsFor(attribute.type).valueToJSON(value, adapter.serializeOptions);\n }\n }\n });\n\n return {\n id: objself.id,\n type: type.name,\n attributes: jsonAttributes,\n belongs_to: jsonBelongsTo\n };\n }\n\n // Getters and setters for attributes\n const blacklist = ['save', 'id', '_database', 'reload'];\n\n function setAttribute(name: string, value: any) {\n const attribute = type.attributes[name];\n if (attribute == null) {\n return;\n }\n // Convert it to the correct type, or throw an exception if it is of invalid type.\n if (value == null) {\n // Includes undefined.\n value = null;\n } else {\n value = operationsFor(attribute.type).parse(value);\n }\n\n // We specifically don't want to set the value to null if the object is not loaded yet.\n // This causes the value to be cleared by the view before the object is loaded.\n if (attributes[name] != value) {\n attributes[name] = value;\n attributesDirty[name] = true;\n }\n }\n\n Object.keys(type.attributes).forEach((name) => {\n if (blacklist.indexOf(name) != -1) {\n return;\n }\n\n Object.defineProperty(objself, name, {\n get() {\n return attributes[name];\n },\n set(value: any) {\n setAttribute(name, value);\n },\n enumerable: true,\n configurable: true\n });\n\n attributes[name] = null;\n });\n\n function setBelongsTo(name: string, value: DatabaseObject) {\n // setter\n if (value == null) {\n belongsToCache[name] = null;\n belongsToIds[name] = null;\n belongsToDirty[name] = true;\n } else if (value instanceof DatabaseObject) {\n belongsToCache[name] = value;\n belongsToIds[name] = value.id;\n belongsToDirty[name] = true;\n } else {\n if (typeof value == 'function') {\n // This seems to be the return value of a relationship lookup without parenthesis.\n throw new Error('Use `.relationship()` instead of `.relationship` when looking up a relationship.');\n } else {\n throw new Error(value + ' is not a valid object');\n }\n }\n }\n\n function triggerLoad(name: string) {\n const rel = type.belongsTo[name];\n if (rel == null) {\n return 'nothing to load';\n }\n\n // undefined means not looked up yet.\n // null means we looked it up, but didn't find anything.\n if (belongsToCache[name] === undefined) {\n if (belongsToLoading[name]) {\n // An query have already been made for this relationship - return the same promise.\n return 'already loading';\n } else {\n const _ignorePromise = getBelongsTo(name);\n return 'loading';\n }\n } else {\n return 'already loaded';\n }\n }\n\n async function getBelongsTo(name: string): Promise<DatabaseObject> {\n const rel = type.belongsTo[name];\n if (rel == null) {\n return undefined;\n }\n\n // undefined means not looked up yet.\n // null means we looked it up, but didn't find anything.\n if (belongsToCache[name] === undefined) {\n if (belongsToLoading[name]) {\n // An query have already been made for this relationship - return the same promise.\n return belongsToLoading[name];\n } else {\n const foreignType = rel.foreignType;\n const relatedId = belongsToIds[name];\n const promise = adapter.get(foreignType.name, relatedId);\n const promise2 = promise.then(function (data: ObjectData) {\n let obj: DatabaseObject = null;\n if (data) {\n obj = DatabaseObject.build(adapter, foreignType, relatedId, data);\n }\n\n if (belongsToLoading[name] == promise2) {\n delete belongsToLoading[name];\n belongsToCache[name] = obj;\n } else {\n // This promise has been canceled.\n // We still return the same result, but don't update the cache.\n }\n return obj;\n });\n belongsToLoading[name] = promise2;\n return promise2;\n }\n } else {\n return belongsToCache[name];\n }\n }\n\n Object.keys(type.belongsTo).forEach(function (name) {\n if (blacklist.indexOf(name) != -1) {\n return;\n }\n\n var accessor = createAccessor(name, setBelongsTo, getBelongsTo);\n\n if (accessor != null) {\n Object.defineProperty(objself, name, {\n get: function () {\n // There's no robust way to test that the accessor is being used as a function.\n return accessor;\n },\n set: function () {\n // Technically we can set the value here. However, it will be inconsistent with the getter.\n throw new Error('Use `.' + name + '(value)` instead of `.' + name + ' = value` to set a relationship.');\n },\n enumerable: false,\n configurable: false\n });\n }\n\n // Getter and setter for belongs-to ids.\n Object.defineProperty(objself, name + '_id', {\n get: function () {\n return belongsToIds[name] || null; // `|| null` so we return null instead of undefined\n },\n set: function (relatedId: string) {\n // Save the id\n belongsToIds[name] = relatedId;\n belongsToDirty[name] = true;\n\n // Clear any cached object\n delete belongsToCache[name];\n\n // Cancel the loading of any previous relationships\n delete belongsToLoading[name];\n },\n enumerable: false,\n configurable: false\n });\n });\n\n Object.keys(type.hasMany).forEach(function (name) {\n const rel = type.hasMany[name];\n if (blacklist.indexOf(name) != -1) {\n return;\n }\n\n // We return a query\n Object.defineProperty(objself, name, {\n get: function () {\n if (hasManyCache[name] == null) {\n // We cache the Query object, along with its _freshness value.\n // This does not cache the results - widgets are responsible for that.\n const expr = new RelationMatch(rel.name, objself.id);\n hasManyCache[name] = new Query(adapter, rel.objectType, expr);\n }\n return hasManyCache[name];\n },\n enumerable: false,\n configurable: false\n });\n });\n\n // Return an attribute or relationship as a promise.\n async function _get(name: string): Promise<any> {\n // TODO: belongs_to ids\n if (name === 'id') {\n return id;\n }\n\n if (type.attributes[name]) {\n return (objself as Record<string, any>)[name];\n }\n\n if (type.belongsTo[name]) {\n return getBelongsTo(name);\n }\n\n if (type.hasMany[name]) {\n return (objself as Record<string, any>)[name];\n }\n\n return null;\n }\n\n // Return an attribute or cached relationship immediately.\n // If `name` is not a valid attribute or relationship, null is returned.\n // If `name` is a relationship or attribute that is not set, null is returned.\n // If `name` is a relationship that we're still loading, undefined is returned.\n // TODO: perhaps we should use a constant other than `undefined`?\n function _cached(name: string) {\n if (type.attributes[name]) {\n return (objself as Record<string, any>)[name];\n } else if (type.belongsTo[name]) {\n // Trigger a lookup (only has an effect if we haven't cached the relationship yet).\n triggerLoad(name);\n return belongsToCache[name];\n } else if (type.hasMany[name]) {\n return (objself as Record<string, any>)[name];\n } else {\n return null;\n }\n }\n\n function _cache(name: string, value: DatabaseObject) {\n // Cache a relationship\n // It is assumed that the id matches value.id\n belongsToCache[name] = value;\n }\n\n // Set an attribute or relationship.\n function _set(name: string, value: any) {\n if (type.attributes[name]) {\n (objself as Record<string, any>)[name] = value;\n } else if (type.belongsTo[name]) {\n setBelongsTo(name, value);\n } else {\n // Ignore\n // This behaviour is intentionally different from normal attribute assignment.\n // This makes it simpler to assign data from an external JSON source.\n }\n }\n\n function _clone(newType: SchemaModelType) {\n if (newType == null) {\n newType = type;\n }\n const data = toData(false); // TODO: should we convert to JSON and back?\n // If the object is not persisted, we generate a create an object\n // without an id. Otherwise the clone thinks it is persisted.\n const newId = persisted ? id : null;\n let clone = new DatabaseObject(adapter, newType, newId);\n clone.resolve(data);\n return clone;\n }\n\n async function _display(): Promise<string> {\n const expression = type.displayFormat;\n const scope = new ObjectDisplayScope(objself, operationsFor);\n const values = await Promise.all(\n expression.parameters.map(async (parameter) => {\n const value = await scope.getValuePromise(parameter.path);\n const formatter = scope.getExpressionFormatter(parameter.path);\n return formatValueAsync(value, formatter, parameter.format);\n })\n );\n return expression.render(values);\n }\n\n // public functions, but not enumerable\n defineHiddenConstant(this, '_reload', _reload);\n defineHiddenConstant(this, 'set_all', setAll);\n defineHiddenConstant(this, 'setAll', setAll);\n defineHiddenConstant(this, '_save', _save);\n defineHiddenConstant(this, '_destroy', _destroy);\n defineHiddenConstant(this, 'toString', toString);\n defineHiddenConstant(this, 'resolve', resolve);\n defineHiddenConstant(this, '_get', _get);\n defineHiddenConstant(this, '_cached', _cached);\n defineHiddenConstant(this, '_cache', _cache);\n defineHiddenConstant(this, '_set', _set);\n defineHiddenConstant(this, '_adapter', adapter);\n defineHiddenConstant(this, '_clone', _clone);\n defineHiddenConstant(this, '_display', _display);\n defineHiddenConstant(this, '_getDirtyList', _getDirtyList);\n defineHiddenConstant(this, '_persisted', _persisted);\n defineHiddenConstant(this, '_destroyed', _destroyed);\n\n defineHiddenConstant(this, 'toData', toData);\n\n // Sealing the object prevents new properties from being added.\n Object.seal(this);\n }\n\n // Aliases\n\n /**\n * Reload this object from the database.\n */\n reload(): j.Promise<void> {\n return this._reload();\n }\n\n /**\n * Save this object to the database.\n */\n save(): j.Promise<void> {\n return this._save();\n }\n\n /**\n * Delete this object from the database.\n */\n destroy(): j.Promise<void> {\n return this._destroy();\n }\n}\n\nfunction defineHiddenConstant(object: any, name: string, value: any) {\n Object.defineProperty(object, name, {\n enumerable: false,\n configurable: false,\n writable: false,\n value: value\n });\n}\n\nexport type CreateAccessor = (\n name: string,\n set: (name: string, value: any) => void,\n get: (name: string) => any\n) => void;\n\nexport var createAccessor: CreateAccessor = (name, set, get) => {\n return (value?: any) => {\n if (typeof value != 'undefined') {\n return set(name, value);\n } else {\n return get(name);\n }\n };\n};\n\n// For internal use only\nexport function setCreateAccessor(fn: CreateAccessor) {\n createAccessor = fn;\n}\n"]}
@@ -1,3 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=GenericDatabase.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"GenericDatabase.js","sourceRoot":"","sources":["../../src/database/GenericDatabase.ts"],"names":[],"mappings":"","sourcesContent":["import { Collection } from './Collection';\n\nexport interface GenericDatabase {\n [key: string]: Collection;\n}\n"]}
@@ -1,357 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.JourneyAPIAdapter = void 0;
4
- const parser_schema_xml_1 = require("@ja-platform/parser-schema-xml");
5
- require("isomorphic-fetch");
6
- const retryableFetch_1 = require("../utils/retryableFetch");
7
- const BaseAdapter_1 = require("./adapters/BaseAdapter");
8
- const parser_schema_1 = require("@ja-platform/parser-schema");
9
- const Query_1 = require("../query/Query");
10
- const queryOperations_1 = require("../query/queryOperations");
11
- const forEach = require('lodash/each');
12
- const tail = require('lodash/tail');
13
- class JourneyAPIAdapter extends BaseAdapter_1.BaseAdapter {
14
- static apiToInternalFormat(type, apiObj) {
15
- const dbObj = {
16
- id: apiObj.id,
17
- type: type.name,
18
- _updated_at: apiObj.updated_at,
19
- display: apiObj.display,
20
- attributes: {},
21
- belongs_to: {}
22
- };
23
- forEach(type.attributes, function (attr) {
24
- const name = attr.name;
25
- if (attr.type.name == 'attachment') {
26
- if (apiObj[name + '_id']) {
27
- const attachment = {
28
- id: apiObj[name + '_id'],
29
- state: 'pending',
30
- urls: {}
31
- };
32
- if (apiObj[name]) {
33
- // The URL here is only present if state == 'uploaded', so the following
34
- // two are equivalent:
35
- // { photo_id: '...', photo: {state: 'pending' } }
36
- // { photo_id: '...' }
37
- // In the Attachment class, the present() function checks `url != null`,
38
- // which is false in both the above cases.
39
- attachment.state = apiObj[name].state;
40
- // Possible keys at time of writing: original, fullscreen, thumbnail
41
- // To account for future additions, we accept any url-like value.
42
- forEach(apiObj[name], function (attributeValue, key) {
43
- const isUrl = attributeValue != null && /https?\:\/\//.test(attributeValue);
44
- if (key != 'state' && isUrl) {
45
- attachment.urls[key] = attributeValue;
46
- }
47
- });
48
- }
49
- dbObj.attributes[name] = attachment;
50
- }
51
- }
52
- else if (parser_schema_1.ChoiceType.isInstanceOf(attr.type) && attr.type.hasOptions) {
53
- const value = apiObj[name];
54
- if (attr.type.multipleOptions) {
55
- const array = [];
56
- if (value) {
57
- value.forEach(function (val) {
58
- array.push(val.key);
59
- });
60
- }
61
- dbObj.attributes[name] = array;
62
- }
63
- else {
64
- dbObj.attributes[name] = value ? value.key : null;
65
- }
66
- }
67
- else {
68
- dbObj.attributes[name] = apiObj[name];
69
- }
70
- });
71
- forEach(type.belongsTo, function (rel) {
72
- const name = rel.name;
73
- dbObj.belongs_to[name] = apiObj[name + '_id'];
74
- });
75
- return dbObj;
76
- }
77
- constructor(credentials, schema, options = {}) {
78
- super();
79
- this.name = 'api';
80
- this.serializeOptions = {
81
- inlineAttachments: true
82
- };
83
- this.schema = schema;
84
- this.options = options;
85
- this.credentials = credentials;
86
- }
87
- description() {
88
- return 'JourneyAPI';
89
- }
90
- async executeQuery(query) {
91
- let results = [];
92
- const userSpecifiedLimit = query.limitNumber;
93
- const allResults = await this.executeQueryGetMore(query, results, userSpecifiedLimit);
94
- return allResults;
95
- }
96
- async get(type, id) {
97
- if (id == null) {
98
- return null;
99
- }
100
- const url = this.credentials.api4Url() + 'objects/' + type + '/' + id + '.json';
101
- try {
102
- const result = await this.apiGet(url);
103
- return JourneyAPIAdapter.apiToInternalFormat(this.schema.objects[type], result);
104
- }
105
- catch (error) {
106
- if (error.type == 'OBJECT_NOT_FOUND') {
107
- return null;
108
- }
109
- else {
110
- throw error;
111
- }
112
- }
113
- }
114
- async getAll(type, ids) {
115
- const model = this.schema.getType(type);
116
- let result = [];
117
- // This is more efficient batching than relying on limit and skip.
118
- for (let i = 0; i < ids.length; i += this.batchLimit) {
119
- const idBatch = ids.slice(i, i + this.batchLimit);
120
- result = result.concat(await this.getIdBatch(model, idBatch));
121
- }
122
- return result;
123
- }
124
- async getIdBatch(model, ids) {
125
- const idAttr = model.getAttribute('id');
126
- const query = new Query_1.Query(this, model, new queryOperations_1.Operation(idAttr, 'in', ids.filter((id) => id != null)));
127
- const results = await this.executeQuery(query);
128
- const resultMap = {};
129
- for (let result of results) {
130
- resultMap[result.id] = result;
131
- }
132
- return ids.map((id) => {
133
- var _a;
134
- return (_a = resultMap[id]) !== null && _a !== void 0 ? _a : null;
135
- });
136
- }
137
- async applyBatch(crud) {
138
- const actions = [];
139
- for (let i = 0; i < crud.length; i++) {
140
- const operation = crud[i];
141
- const action = operation.op;
142
- if (action == 'put') {
143
- actions.push({
144
- method: 'put',
145
- object: dbToApiObject(this.schema.getType(operation.type), operation.id, operation.data)
146
- });
147
- }
148
- else if (action == 'patch') {
149
- actions.push({
150
- method: 'patch',
151
- object: dbToApiObject(this.schema.getType(operation.type), operation.id, operation.patch)
152
- });
153
- }
154
- else if (action == 'delete') {
155
- actions.push({
156
- method: 'delete',
157
- object: {
158
- type: operation.type,
159
- id: operation.id
160
- }
161
- });
162
- }
163
- else {
164
- throw new Error('Unknown action: ' + action);
165
- }
166
- }
167
- // 4xx / 5xx errors are passed through
168
- const response = await this.postCrud(actions);
169
- if (response.operations.length != crud.length) {
170
- throw new Error('Internal error - invalid results received from server. Expected ' +
171
- crud.length +
172
- ' results, got ' +
173
- response.operations.length);
174
- }
175
- let results = [];
176
- for (let j = 0; j < crud.length; j++) {
177
- let error = response.operations[j].error;
178
- if (crud[j].op == 'delete' && error != null && error.type == 'OBJECT_NOT_FOUND') {
179
- // For idempotency, we ignore these.
180
- error = null;
181
- }
182
- let result = {
183
- error: error
184
- };
185
- results.push(result);
186
- }
187
- return results;
188
- }
189
- async loadDataModel() {
190
- const response = await (0, retryableFetch_1.retryableFetch)(this.credentials.api4Url() + 'datamodel.xml', {
191
- headers: Object.assign({ Accept: 'application/xml' }, this.credentials.apiAuthHeaders())
192
- });
193
- if (!response.ok) {
194
- throw new Error(response.statusText);
195
- }
196
- const xml = await response.text();
197
- this.schema = (0, parser_schema_xml_1.loadSchemaXml)({ source: xml });
198
- }
199
- apiGet(url) {
200
- const getOptions = {
201
- method: 'GET',
202
- headers: Object.assign({
203
- Accept: 'application/json'
204
- }, this.credentials.apiAuthHeaders())
205
- };
206
- return (0, retryableFetch_1.retryableFetch)(url, Object.assign(Object.assign({}, this.options.fetch), getOptions)).then(responseHandler);
207
- }
208
- apiPost(url, data) {
209
- const postOptions = {
210
- method: 'POST',
211
- headers: Object.assign({
212
- Accept: 'application/json',
213
- 'Content-Type': 'application/json'
214
- }, this.credentials.apiAuthHeaders()),
215
- body: JSON.stringify(data)
216
- };
217
- return (0, retryableFetch_1.retryableFetch)(url, Object.assign(Object.assign({}, this.options.fetch), postOptions)).then(responseHandler);
218
- }
219
- /**
220
- * Post crud actions.
221
- *
222
- * @param {*} actions - array of actions
223
- */
224
- postCrud(actions) {
225
- // TODO: make this work for mobile credentials as well
226
- const url = this.credentials.api4Url() + 'batch.json';
227
- const body = {
228
- operations: actions
229
- };
230
- return this.apiPost(url, body);
231
- }
232
- // FIXME: DB.user.all().orderBy("-name").limit(1).toArray() is a Retrieve All Objects query, which returns "more: true" despite the limit.
233
- doApiQuery(query) {
234
- const typeName = query.type.name;
235
- const original = query.expression.toOriginalExpression();
236
- const queryExpression = original[0];
237
- const queryArguments = tail(original);
238
- let url;
239
- // empty query expressions - eg. DB.user.all() - must use the standard API 'retrieve all objects' method.
240
- if (typeof queryExpression == 'undefined' || queryExpression == '') {
241
- url = this.credentials.api4Url() + 'objects/' + typeName + '.json';
242
- const limitUrl = 'limit=' + (query.limitNumber && query.limitNumber > 0 ? query.limitNumber : '');
243
- const skipUrl = 'skip=' + (query.skipNumber && query.skipNumber > 0 ? query.skipNumber : '');
244
- const sortUrl = serializeSortCriteriaToUriEncoding(sortingCriteria(query.ordering), 'sort');
245
- url += '?' + [limitUrl, skipUrl, sortUrl].join('&');
246
- return this.apiGet(url);
247
- }
248
- else {
249
- url = this.credentials.api4Url() + 'objects/' + typeName + '/query.json';
250
- const queryBody = {
251
- expression: queryExpression,
252
- arguments: queryArguments,
253
- limit: query.limitNumber && query.limitNumber > 0 ? query.limitNumber : null,
254
- skip: query.skipNumber && query.skipNumber > 0 ? query.skipNumber : null,
255
- sort: query.ordering
256
- };
257
- return this.apiPost(url, queryBody);
258
- }
259
- }
260
- async executeQueryGetMore(query, results, originalLimit) {
261
- const data = await this.doApiQuery(query);
262
- forEach(data.objects, function (obj) {
263
- results.push(JourneyAPIAdapter.apiToInternalFormat(query.type, obj));
264
- });
265
- // If the user specified a limit (originalLimit), the result length should never be > originalLimit, but
266
- // just in case something weird happens, use >= to terminate the loop.
267
- if (!data.more || (originalLimit && results.length >= originalLimit)) {
268
- return results;
269
- }
270
- else {
271
- // Always use the number of returned objects as the limit for the next batch. This handles server-side default/max limits.
272
- let limit = data.objects.length;
273
- // For the last batch, fetch only the remainder. ie. don't over-run the originalLimit.
274
- if (originalLimit && results.length + limit > originalLimit) {
275
- limit = originalLimit % limit;
276
- }
277
- // Do not modify original query
278
- query = query.limit(limit).skip((query.skipNumber || 0) + limit);
279
- return this.executeQueryGetMore(query, results, originalLimit);
280
- }
281
- }
282
- }
283
- exports.JourneyAPIAdapter = JourneyAPIAdapter;
284
- function responseHandler(response) {
285
- if (response.ok) {
286
- return response.json();
287
- }
288
- else {
289
- return response.text().then(function (text) {
290
- let error = new Error('HTTP Error ' + response.status + ': ' + response.statusText + '\n' + text);
291
- Object.defineProperty(error, 'body', { value: text });
292
- Object.defineProperty(error, 'status', { value: response.status });
293
- try {
294
- let body = JSON.parse(text);
295
- Object.defineProperty(error, 'type', { value: body.type });
296
- }
297
- catch (err) {
298
- // Not JSON - Ignore
299
- }
300
- return Promise.reject(error);
301
- });
302
- }
303
- }
304
- // Returns a hash with sort keys and directions. Adapted from Journey Runtime's database._sort
305
- function sortingCriteria(ordering) {
306
- let criteria = {};
307
- criteria.__orderedProperties = [];
308
- for (let attribute of ordering) {
309
- let ascending = 1;
310
- if (attribute[0] == '-') {
311
- ascending = -1;
312
- attribute = attribute.substring(1);
313
- }
314
- criteria[attribute] = ascending;
315
- criteria.__orderedProperties.push(attribute);
316
- }
317
- return criteria;
318
- }
319
- // Expects sortingCriteria.__orderedProperties to be an array.
320
- function serializeSortCriteriaToUriEncoding(criteria, prefix) {
321
- let str = [];
322
- forEach(criteria.__orderedProperties, function (p) {
323
- if (criteria.hasOwnProperty(p)) {
324
- const k = prefix ? prefix + '[' + p + ']' : p;
325
- const v = criteria[p];
326
- str.push(encodeURIComponent(k) + '=' + encodeURIComponent(v));
327
- }
328
- });
329
- return str.join('&');
330
- }
331
- function dbToApiObject(type, id, dbObj) {
332
- var _a;
333
- let apiObj = {
334
- type: type.name,
335
- id: id
336
- };
337
- for (let key of Object.keys(dbObj.attributes)) {
338
- const value = dbObj.attributes[key];
339
- const attrType = (_a = type.getAttribute(key)) === null || _a === void 0 ? void 0 : _a.type;
340
- if ((attrType === null || attrType === void 0 ? void 0 : attrType.name) == 'attachment') {
341
- if (value === null || value === void 0 ? void 0 : value.id) {
342
- apiObj[`${key}_id`] = value.id;
343
- }
344
- else {
345
- apiObj[key] = value;
346
- }
347
- }
348
- else {
349
- apiObj[key] = value;
350
- }
351
- }
352
- for (let key of Object.keys(dbObj.belongs_to)) {
353
- apiObj[`${key}_id`] = dbObj.belongs_to[key];
354
- }
355
- return apiObj;
356
- }
357
- //# sourceMappingURL=JourneyAPIAdapter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"JourneyAPIAdapter.js","sourceRoot":"","sources":["../../src/database/JourneyAPIAdapter.ts"],"names":[],"mappings":"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","sourcesContent":["import { loadSchemaXml } from '@ja-platform/parser-schema-xml';\nimport 'isomorphic-fetch';\nimport { retryableFetch } from '../utils/retryableFetch';\nimport type { Response, RequestInit } from 'node-fetch';\nimport { BaseAdapter } from './adapters/BaseAdapter';\nimport { SchemaModelType, Field, Relationship, ChoiceType } from '@ja-platform/parser-schema';\nimport { Query } from '../query/Query';\nimport { ExecuteBatchOperation } from './Batch';\nimport { ObjectData, PersistedObjectData } from '../types/ObjectData';\nimport { ApiCredentials } from '../credentials';\nimport { Operation } from '../query/queryOperations';\nimport { DBSchema } from '../Schema';\n\nexport type { Response, RequestInit } from 'node-fetch';\n\nconst forEach = require('lodash/each');\nconst tail = require('lodash/tail');\n\ninterface CrudAction {\n method: 'put' | 'patch' | 'delete';\n object: {\n type: string;\n id: string;\n };\n}\n\ninterface CrudOperationResponse {\n error: any;\n}\n\ninterface CrudResponse {\n operations: CrudOperationResponse[];\n}\n\nexport interface ApiObjectData extends ObjectData {\n _updated_at?: string;\n display?: string;\n}\n\nexport interface ApiAdapterOptions {\n fetch?: RequestInit;\n}\n\nexport class JourneyAPIAdapter extends BaseAdapter {\n static apiToInternalFormat(type: SchemaModelType, apiObj: any) {\n const dbObj: ApiObjectData = {\n id: apiObj.id,\n type: type.name,\n _updated_at: apiObj.updated_at,\n display: apiObj.display,\n attributes: {},\n belongs_to: {}\n };\n\n forEach(type.attributes, function (attr: Field) {\n const name = attr.name;\n if (attr.type.name == 'attachment') {\n if (apiObj[name + '_id']) {\n const attachment = {\n id: apiObj[name + '_id'],\n state: 'pending',\n urls: {} as { [key: string]: string }\n };\n if (apiObj[name]) {\n // The URL here is only present if state == 'uploaded', so the following\n // two are equivalent:\n // { photo_id: '...', photo: {state: 'pending' } }\n // { photo_id: '...' }\n // In the Attachment class, the present() function checks `url != null`,\n // which is false in both the above cases.\n attachment.state = apiObj[name].state;\n // Possible keys at time of writing: original, fullscreen, thumbnail\n // To account for future additions, we accept any url-like value.\n forEach(apiObj[name], function (attributeValue: any, key: string) {\n const isUrl = attributeValue != null && /https?\\:\\/\\//.test(attributeValue);\n if (key != 'state' && isUrl) {\n attachment.urls[key] = attributeValue;\n }\n });\n }\n dbObj.attributes[name] = attachment;\n }\n } else if (ChoiceType.isInstanceOf(attr.type) && attr.type.hasOptions) {\n const value = apiObj[name];\n if (attr.type.multipleOptions) {\n const array: any[] = [];\n if (value) {\n value.forEach(function (val: any) {\n array.push(val.key);\n });\n }\n dbObj.attributes[name] = array;\n } else {\n dbObj.attributes[name] = value ? value.key : null;\n }\n } else {\n dbObj.attributes[name] = apiObj[name];\n }\n });\n\n forEach(type.belongsTo, function (rel: Relationship) {\n const name = rel.name;\n dbObj.belongs_to[name] = apiObj[name + '_id'];\n });\n\n return dbObj;\n }\n\n name: string = 'api';\n serializeOptions = {\n inlineAttachments: true\n };\n\n schema: DBSchema;\n options: ApiAdapterOptions;\n credentials: ApiCredentials;\n\n constructor(credentials: ApiCredentials, schema: DBSchema, options: ApiAdapterOptions = {}) {\n super();\n\n this.schema = schema;\n\n this.options = options;\n this.credentials = credentials;\n }\n\n description() {\n return 'JourneyAPI';\n }\n\n async executeQuery(query: Query): Promise<ObjectData[]> {\n let results: ObjectData[] = [];\n const userSpecifiedLimit = query.limitNumber;\n const allResults = await this.executeQueryGetMore(query, results, userSpecifiedLimit);\n return allResults;\n }\n\n async get(type: string, id: string): Promise<ObjectData> {\n if (id == null) {\n return null;\n }\n const url = this.credentials.api4Url() + 'objects/' + type + '/' + id + '.json';\n try {\n const result = await this.apiGet(url);\n return JourneyAPIAdapter.apiToInternalFormat(this.schema.objects[type], result);\n } catch (error) {\n if (error.type == 'OBJECT_NOT_FOUND') {\n return null;\n } else {\n throw error;\n }\n }\n }\n\n async getAll(type: string, ids: string[]): Promise<ObjectData[]> {\n const model = this.schema.getType(type);\n let result: ObjectData[] = [];\n // This is more efficient batching than relying on limit and skip.\n for (let i = 0; i < ids.length; i += this.batchLimit) {\n const idBatch = ids.slice(i, i + this.batchLimit);\n result = result.concat(await this.getIdBatch(model, idBatch));\n }\n return result;\n }\n\n private async getIdBatch(model: SchemaModelType, ids: string[]) {\n const idAttr = model.getAttribute('id');\n const query = new Query(\n this,\n model,\n new Operation(\n idAttr,\n 'in',\n ids.filter((id) => id != null)\n )\n );\n const results = await this.executeQuery(query);\n const resultMap: Record<string, ObjectData> = {};\n for (let result of results) {\n resultMap[result.id] = result;\n }\n return ids.map((id) => {\n return resultMap[id] ?? null;\n });\n }\n\n async applyBatch(crud: ExecuteBatchOperation[]) {\n const actions: CrudAction[] = [];\n for (let i = 0; i < crud.length; i++) {\n const operation = crud[i];\n const action = operation.op;\n if (action == 'put') {\n actions.push({\n method: 'put',\n object: dbToApiObject(this.schema.getType(operation.type), operation.id, operation.data)\n });\n } else if (action == 'patch') {\n actions.push({\n method: 'patch',\n object: dbToApiObject(this.schema.getType(operation.type), operation.id, operation.patch)\n });\n } else if (action == 'delete') {\n actions.push({\n method: 'delete',\n object: {\n type: operation.type,\n id: operation.id\n }\n });\n } else {\n throw new Error('Unknown action: ' + action);\n }\n }\n\n // 4xx / 5xx errors are passed through\n const response = await this.postCrud(actions);\n if (response.operations.length != crud.length) {\n throw new Error(\n 'Internal error - invalid results received from server. Expected ' +\n crud.length +\n ' results, got ' +\n response.operations.length\n );\n }\n let results = [];\n for (let j = 0; j < crud.length; j++) {\n let error = response.operations[j].error;\n if (crud[j].op == 'delete' && error != null && error.type == 'OBJECT_NOT_FOUND') {\n // For idempotency, we ignore these.\n error = null;\n }\n let result = {\n error: error\n };\n results.push(result);\n }\n return results;\n }\n\n public async loadDataModel(): Promise<void> {\n const response = await retryableFetch(this.credentials.api4Url() + 'datamodel.xml', {\n headers: {\n Accept: 'application/xml',\n ...this.credentials.apiAuthHeaders()\n }\n });\n if (!response.ok) {\n throw new Error(response.statusText);\n }\n const xml = await response.text();\n\n this.schema = loadSchemaXml({ source: xml });\n }\n\n public apiGet(url: string): Promise<any> {\n const getOptions = {\n method: 'GET',\n headers: Object.assign(\n {\n Accept: 'application/json'\n },\n this.credentials.apiAuthHeaders()\n )\n };\n return retryableFetch(url, {\n ...this.options.fetch,\n ...getOptions\n }).then(responseHandler);\n }\n\n private apiPost(url: string, data: any): Promise<any> {\n const postOptions = {\n method: 'POST',\n headers: Object.assign(\n {\n Accept: 'application/json',\n 'Content-Type': 'application/json'\n },\n this.credentials.apiAuthHeaders()\n ),\n body: JSON.stringify(data)\n };\n return retryableFetch(url, {\n ...this.options.fetch,\n ...postOptions\n }).then(responseHandler);\n }\n\n /**\n * Post crud actions.\n *\n * @param {*} actions - array of actions\n */\n private postCrud(actions: CrudAction[]): Promise<CrudResponse> {\n // TODO: make this work for mobile credentials as well\n const url = this.credentials.api4Url() + 'batch.json';\n const body = {\n operations: actions\n };\n return this.apiPost(url, body);\n }\n\n // FIXME: DB.user.all().orderBy(\"-name\").limit(1).toArray() is a Retrieve All Objects query, which returns \"more: true\" despite the limit.\n private doApiQuery(query: Query) {\n const typeName = query.type.name;\n const original = query.expression.toOriginalExpression();\n const queryExpression = original[0];\n const queryArguments = tail(original);\n let url;\n\n // empty query expressions - eg. DB.user.all() - must use the standard API 'retrieve all objects' method.\n if (typeof queryExpression == 'undefined' || queryExpression == '') {\n url = this.credentials.api4Url() + 'objects/' + typeName + '.json';\n const limitUrl = 'limit=' + (query.limitNumber && query.limitNumber > 0 ? query.limitNumber : '');\n const skipUrl = 'skip=' + (query.skipNumber && query.skipNumber > 0 ? query.skipNumber : '');\n const sortUrl = serializeSortCriteriaToUriEncoding(sortingCriteria(query.ordering), 'sort');\n url += '?' + [limitUrl, skipUrl, sortUrl].join('&');\n return this.apiGet(url);\n } else {\n url = this.credentials.api4Url() + 'objects/' + typeName + '/query.json';\n const queryBody = {\n expression: queryExpression,\n arguments: queryArguments,\n limit: query.limitNumber && query.limitNumber > 0 ? query.limitNumber : null,\n skip: query.skipNumber && query.skipNumber > 0 ? query.skipNumber : null,\n sort: query.ordering\n };\n return this.apiPost(url, queryBody);\n }\n }\n\n private async executeQueryGetMore(\n query: Query,\n results?: ObjectData[],\n originalLimit?: number\n ): Promise<ObjectData[]> {\n const data = await this.doApiQuery(query);\n forEach(data.objects, function (obj: any) {\n results.push(JourneyAPIAdapter.apiToInternalFormat(query.type, obj));\n });\n // If the user specified a limit (originalLimit), the result length should never be > originalLimit, but\n // just in case something weird happens, use >= to terminate the loop.\n if (!data.more || (originalLimit && results.length >= originalLimit)) {\n return results;\n } else {\n // Always use the number of returned objects as the limit for the next batch. This handles server-side default/max limits.\n let limit = data.objects.length;\n\n // For the last batch, fetch only the remainder. ie. don't over-run the originalLimit.\n if (originalLimit && results.length + limit > originalLimit) {\n limit = originalLimit % limit;\n }\n\n // Do not modify original query\n query = query.limit(limit).skip((query.skipNumber || 0) + limit);\n\n return this.executeQueryGetMore(query, results, originalLimit);\n }\n }\n}\n\nfunction responseHandler(response: Response): Promise<any> {\n if (response.ok) {\n return response.json();\n } else {\n return response.text().then(function (text) {\n let error = new Error('HTTP Error ' + response.status + ': ' + response.statusText + '\\n' + text);\n Object.defineProperty(error, 'body', { value: text });\n Object.defineProperty(error, 'status', { value: response.status });\n\n try {\n let body = JSON.parse(text);\n Object.defineProperty(error, 'type', { value: body.type });\n } catch (err) {\n // Not JSON - Ignore\n }\n\n return Promise.reject(error);\n });\n }\n}\n\n// Returns a hash with sort keys and directions. Adapted from Journey Runtime's database._sort\nfunction sortingCriteria(ordering: string[]) {\n let criteria: any = {};\n criteria.__orderedProperties = [];\n for (let attribute of ordering) {\n let ascending = 1;\n if (attribute[0] == '-') {\n ascending = -1;\n attribute = attribute.substring(1);\n }\n criteria[attribute] = ascending;\n criteria.__orderedProperties.push(attribute);\n }\n return criteria;\n}\n\n// Expects sortingCriteria.__orderedProperties to be an array.\nfunction serializeSortCriteriaToUriEncoding(criteria: any, prefix?: string) {\n let str: string[] = [];\n forEach(criteria.__orderedProperties, function (p: string) {\n if (criteria.hasOwnProperty(p)) {\n const k = prefix ? prefix + '[' + p + ']' : p;\n const v = criteria[p];\n str.push(encodeURIComponent(k) + '=' + encodeURIComponent(v));\n }\n });\n return str.join('&');\n}\n\nfunction dbToApiObject(type: SchemaModelType, id: string, dbObj: PersistedObjectData) {\n let apiObj: any = {\n type: type.name,\n id: id\n };\n\n for (let key of Object.keys(dbObj.attributes)) {\n const value = dbObj.attributes[key];\n const attrType = type.getAttribute(key)?.type;\n if (attrType?.name == 'attachment') {\n if (value?.id) {\n apiObj[`${key}_id`] = value.id;\n } else {\n apiObj[key] = value;\n }\n } else {\n apiObj[key] = value;\n }\n }\n\n for (let key of Object.keys(dbObj.belongs_to)) {\n apiObj[`${key}_id`] = dbObj.belongs_to[key];\n }\n\n return apiObj;\n}\n"]}
@@ -1,117 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ObjectDisplayScope = void 0;
4
- const parser_expressions_1 = require("@ja-platform/parser-expressions");
5
- const DatabaseObject_1 = require("./DatabaseObject");
6
- class ObjectDisplayScope {
7
- static getValue(object, expression, depth) {
8
- return ObjectDisplayScope.retrieveValue(object, expression, depth, false);
9
- }
10
- static async getValuePromise(object, expression, depth = 0) {
11
- return ObjectDisplayScope.retrieveValue(object, expression, depth, true);
12
- }
13
- static retrieveValue(object, expression, depth, isPromise) {
14
- if (expression == 'null' || expression == null) {
15
- return null;
16
- }
17
- if (expression == 'true') {
18
- return true;
19
- }
20
- if (expression == 'false') {
21
- return false;
22
- }
23
- if (object == null) {
24
- return null;
25
- }
26
- if (typeof expression !== 'string') {
27
- const [head, ...tail] = expression;
28
- const key = String(head);
29
- if (isPromise) {
30
- return ObjectDisplayScope.promise(object, key).then((child) => tail.length === 0 ? child : ObjectDisplayScope.retrieveValue(child, tail, depth + 1, true));
31
- }
32
- const child = ObjectDisplayScope.cached(object, key);
33
- return tail.length === 0 || child === undefined
34
- ? child
35
- : ObjectDisplayScope.retrieveValue(child, tail, depth + 1, false);
36
- }
37
- const dot = expression.indexOf('.');
38
- if (dot < 0) {
39
- return isPromise ? ObjectDisplayScope.promise(object, expression) : ObjectDisplayScope.cached(object, expression);
40
- }
41
- const head = expression.substring(0, dot); // The first part of the expression
42
- const tail = expression.substring(dot + 1); // The rest of the expression
43
- if (isPromise) {
44
- return ObjectDisplayScope.promise(object, head).then((child) => {
45
- return ObjectDisplayScope.retrieveValue(child, tail, depth + 1, isPromise);
46
- });
47
- }
48
- const child = ObjectDisplayScope.cached(object, head);
49
- if (child === undefined) {
50
- return undefined;
51
- }
52
- return ObjectDisplayScope.retrieveValue(child, tail, depth + 1, isPromise);
53
- }
54
- static async promise(object, name) {
55
- if (object instanceof DatabaseObject_1.DatabaseObject) {
56
- return object._get(name);
57
- }
58
- return object[name];
59
- }
60
- static cached(object, name) {
61
- if (object instanceof DatabaseObject_1.DatabaseObject) {
62
- return object._cached(name);
63
- }
64
- else {
65
- const val = object[name];
66
- if (val === undefined) {
67
- return null;
68
- }
69
- else {
70
- return val;
71
- }
72
- }
73
- }
74
- constructor(object, formatterFor) {
75
- this.object = object;
76
- this.formatterFor = formatterFor;
77
- }
78
- /**
79
- * Render available fields, returning null while a referenced value is loading.
80
- */
81
- evaluate(expression) {
82
- const values = [];
83
- for (const parameter of expression.parameters) {
84
- const value = this.getValue(parameter.path);
85
- if (value === undefined)
86
- return null;
87
- values.push((0, parser_expressions_1.formatValue)(value, this.getExpressionFormatter(parameter.path), parameter.format));
88
- }
89
- return expression.render(values);
90
- }
91
- getExpressionFormatter(path) {
92
- var _a;
93
- var _b;
94
- const type = this.getExpressionType(path);
95
- return type == null ? null : ((_b = (_a = this.formatterFor) === null || _a === void 0 ? void 0 : _a.call(this, type)) !== null && _b !== void 0 ? _b : type);
96
- }
97
- getExpressionType(path) {
98
- let object = this.object;
99
- for (const property of path.slice(0, -1)) {
100
- if (object == null)
101
- return null;
102
- object = ObjectDisplayScope.cached(object, String(property));
103
- }
104
- return object instanceof DatabaseObject_1.DatabaseObject ? object.type.getField(String(path[path.length - 1])) : null;
105
- }
106
- getValue(expression) {
107
- if (typeof expression === 'string' && expression.length > 0 && expression[0] == '?') {
108
- expression = expression.substring(1);
109
- }
110
- return ObjectDisplayScope.getValue(this.object, expression);
111
- }
112
- getValuePromise(expression) {
113
- return ObjectDisplayScope.getValuePromise(this.object, expression);
114
- }
115
- }
116
- exports.ObjectDisplayScope = ObjectDisplayScope;
117
- //# sourceMappingURL=ObjectDisplayScope.js.map