orbitjs / orbit

Composable data framework for ambitious web applications.
https://orbitjs.com
MIT License
2.33k stars 134 forks source link

How to implement Atomic Operations in orbit #893

Open ahemed-haneen opened 2 years ago

ahemed-haneen commented 2 years ago

I've seen that atomic operations serializers have been added but couldn't find any way to generate atomic operations.

how to implement it?

im using ember-orbit with orbit v0.17 @dgeb @tchak

ahemed-haneen commented 2 years ago
async atomicAddRecord(
    requestProcessor: JSONAPIRequestProcessor,
    requests: RecordTransformRequest[]
) {
    const records = requests.map((request) => {
        return {
            op: request.op,
            record: request.record,
        };
    });

    const options = requests[0].options || {};
    const operationSerializer = requestProcessor.serializerFor(JSONAPISerializers.ResourceAtomicOperationsDocument) 
        as JSONAPIAtomicOperationsDocumentSerializer;
    const requestDoc = operationSerializer.serialize({
        operations: records,
    })
    const settings = requestProcessor.buildFetchSettings(options, {
        method: 'POST',
        json: requestDoc
    });
    const url = options.url || requestProcessor.urlBuilder.resourceURL('operation');
    const details = await requestProcessor.fetch(url, settings);
    const document = details.document as ResourceAtomicResultsDocument;

    const resultSerializer = requestProcessor.serializerFor(
        JSONAPISerializers.ResourceAtomicResultsDocument
    ) as JSONAPIAtomicResultsDocumentSerializer

    const recordDoc = resultSerializer.deserialize(document);
    return response = recordDoc['results'].map((item, index) => {
        return handleChanges(records[index].record, item, details);
    });
},

cache store is getting updated all right but i'm having trouble getting the request to return the response immediately.

image

any idea why this is? @dgeb

ahemed-haneen commented 2 years ago

before handleChanges running

    const recordDocItemSerialized = normalSerializer.deserialize(
        recordDocItem,
    { primaryRecord: records[index].record }
    );

is fixing this issue. but this also results in generating another set of mapping