Last active
July 3, 2019 17:29
-
-
Save tchak/8a8a7a020ea2529d3d93b098e5bed813 to your computer and use it in GitHub Desktop.
Orbit hints with meta
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class MyMemorySource extends MemorySource { | |
async _query(query, hints) { | |
if (hints && hints.data) { | |
let identities = hints.data.primaryData ? hints.data.primaryData : hints.data; | |
let data; | |
if (Array.isArray(identities)) { | |
data = this._cache.query(q => q.findRecords(identities)); | |
} else { | |
data = this._cache.query(q => q.findRecord(identities)); | |
} | |
if (hints.data.meta) { | |
data.__meta = hints.data.meta; | |
} | |
return data; | |
} | |
return this._cache.query(query); | |
} | |
} | |
class MyJSONAPISource extends JSONAPISource { | |
async _query(query) { | |
let { requestProcessor } = this; | |
if (query.extression.op === 'findRecords') { | |
const { primaryData, transforms, meta } = await findRecords( | |
requestProcessor, | |
query | |
); | |
await this._transformed(transforms); | |
return { primaryData, meta }; | |
} else { | |
const operator = this.getQueryOperator(query); | |
const response = await operator(requestProcessor, query); | |
await this._transformed(response.transforms); | |
return response.primaryData; | |
} | |
} | |
} | |
async function findRecords(requestProcessor, query) { | |
const expression = query.expression; | |
const { type } = expression; | |
let { urlBuilder } = requestProcessor; | |
let standardRequestOptions = {}; | |
if (expression.filter) { | |
standardRequestOptions.filter = await urlBuilder.buildFilterParam( | |
expression.filter | |
); | |
} | |
if (expression.sort) { | |
standardRequestOptions.sort = await urlBuilder.buildSortParam( | |
expression.sort | |
); | |
} | |
if (expression.page) { | |
standardRequestOptions.page = await urlBuilder.buildPageParam( | |
expression.page | |
); | |
} | |
let customOptions = requestProcessor.customRequestOptions(query); | |
let requestOptions = standardRequestOptions; | |
if (customOptions) { | |
requestOptions = mergeRequestOptions(standardRequestOptions, customOptions); | |
} | |
const settings = requestProcessor.buildFetchSettings(requestOptions); | |
const document = await requestProcessor.fetch( | |
requestProcessor.urlBuilder.resourceURL(type), | |
settings | |
); | |
requestProcessor.preprocessResponseDocument(document, query); | |
const deserialized = requestProcessor.serializer.deserialize(document); | |
const operations = requestProcessor.operationsFromDeserializedDocument( | |
deserialized | |
); | |
const transforms = [buildTransform(operations)]; | |
const primaryData = deserialized.data; | |
const meta = deserialized.meta; | |
return { transforms, primaryData, meta }; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class MyMemorySource extends MemorySource { | |
async _query(query, hints) { | |
if (hints && hints.data) { | |
let identities = hints.data.primaryData ? hints.data.primaryData : hints.data; | |
let data; | |
if (Array.isArray(identities)) { | |
data = this._cache.query(q => q.findRecords(identities)); | |
} else { | |
data = this._cache.query(q => q.findRecord(identities)); | |
} | |
if (hints.data.primaryData) { | |
return { data, meta: hints.data.meta }; | |
} else { | |
return data; | |
} | |
} | |
return this._cache.query(query); | |
} | |
} | |
class MyJSONAPISource extends JSONAPISource { | |
async _query(query) { | |
let { requestProcessor } = this; | |
if (query.extression.op === 'findRecords') { | |
const { primaryData, transforms, meta } = await findRecords( | |
requestProcessor, | |
query | |
); | |
await this._transformed(transforms); | |
return { primaryData, meta }; | |
} else { | |
const operator = this.getQueryOperator(query); | |
const response = await operator(requestProcessor, query); | |
await this._transformed(response.transforms); | |
return response.primaryData; | |
} | |
} | |
} | |
async function findRecords(requestProcessor, query) { | |
const expression = query.expression; | |
const { type } = expression; | |
let { urlBuilder } = requestProcessor; | |
let standardRequestOptions = {}; | |
if (expression.filter) { | |
standardRequestOptions.filter = await urlBuilder.buildFilterParam( | |
expression.filter | |
); | |
} | |
if (expression.sort) { | |
standardRequestOptions.sort = await urlBuilder.buildSortParam( | |
expression.sort | |
); | |
} | |
if (expression.page) { | |
standardRequestOptions.page = await urlBuilder.buildPageParam( | |
expression.page | |
); | |
} | |
let customOptions = requestProcessor.customRequestOptions(query); | |
let requestOptions = standardRequestOptions; | |
if (customOptions) { | |
requestOptions = mergeRequestOptions(standardRequestOptions, customOptions); | |
} | |
const settings = requestProcessor.buildFetchSettings(requestOptions); | |
const document = await requestProcessor.fetch( | |
requestProcessor.urlBuilder.resourceURL(type), | |
settings | |
); | |
requestProcessor.preprocessResponseDocument(document, query); | |
const deserialized = requestProcessor.serializer.deserialize(document); | |
const operations = requestProcessor.operationsFromDeserializedDocument( | |
deserialized | |
); | |
const transforms = [buildTransform(operations)]; | |
const primaryData = deserialized.data; | |
const meta = deserialized.meta; | |
return { transforms, primaryData, meta }; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment