Skip to content

Instantly share code, notes, and snippets.

@tchak
Last active July 3, 2019 17:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tchak/8a8a7a020ea2529d3d93b098e5bed813 to your computer and use it in GitHub Desktop.
Save tchak/8a8a7a020ea2529d3d93b098e5bed813 to your computer and use it in GitHub Desktop.
Orbit hints with meta
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 };
}
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