Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Allow to enforce Stack link on request chain #1575

Merged
merged 2 commits into from
Dec 20, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion docs/api/cozy-client/classes/CozyClient.md
Original file line number Diff line number Diff line change
@@ -1564,13 +1564,14 @@ Contains the fetched token and the client information.

### requestMutation

▸ **requestMutation**(`definition`): `any`
▸ **requestMutation**(`definition`, `options`): `any`

*Parameters*

| Name | Type |
| :------ | :------ |
| `definition` | `any` |
| `options` | `any` |

*Returns*

9 changes: 5 additions & 4 deletions docs/api/cozy-client/classes/CozyLink.md
Original file line number Diff line number Diff line change
@@ -48,13 +48,13 @@ Persist the given data into the links storage

*Defined in*

[packages/cozy-client/src/CozyLink.js:31](https://github.com/cozy/cozy-client/blob/master/packages/cozy-client/src/CozyLink.js#L31)
[packages/cozy-client/src/CozyLink.js:32](https://github.com/cozy/cozy-client/blob/master/packages/cozy-client/src/CozyLink.js#L32)

***

### request

▸ **request**(`operation`, `result`, `forward`): `Promise`<`any`>
▸ **request**(`operation`, `options`, `result`, `forward`): `Promise`<`any`>

Request the given operation from the link

@@ -63,6 +63,7 @@ Request the given operation from the link
| Name | Type | Description |
| :------ | :------ | :------ |
| `operation` | `any` | The operation to request |
| `options` | `any` | The request options |
| `result` | `any` | The result from the previous request of the chain |
| `forward` | `any` | The next request of the chain |

@@ -72,7 +73,7 @@ Request the given operation from the link

*Defined in*

[packages/cozy-client/src/CozyLink.js:20](https://github.com/cozy/cozy-client/blob/master/packages/cozy-client/src/CozyLink.js#L20)
[packages/cozy-client/src/CozyLink.js:21](https://github.com/cozy/cozy-client/blob/master/packages/cozy-client/src/CozyLink.js#L21)

***

@@ -88,4 +89,4 @@ Reset the link data

*Defined in*

[packages/cozy-client/src/CozyLink.js:40](https://github.com/cozy/cozy-client/blob/master/packages/cozy-client/src/CozyLink.js#L40)
[packages/cozy-client/src/CozyLink.js:41](https://github.com/cozy/cozy-client/blob/master/packages/cozy-client/src/CozyLink.js#L41)
6 changes: 4 additions & 2 deletions docs/api/cozy-client/classes/StackLink.md
Original file line number Diff line number Diff line change
@@ -64,13 +64,14 @@ Transfers queries and mutations to a remote stack

### executeMutation

▸ **executeMutation**(`mutation`, `result`, `forward`): `Promise`<`any`>
▸ **executeMutation**(`mutation`, `options`, `result`, `forward`): `Promise`<`any`>

*Parameters*

| Name | Type |
| :------ | :------ |
| `mutation` | `any` |
| `options` | `any` |
| `result` | `any` |
| `forward` | `any` |

@@ -153,7 +154,7 @@ Persist the given data into the links storage

### request

▸ **request**(`operation`, `result`, `forward`): `Promise`<`any`>
▸ **request**(`operation`, `options`, `result`, `forward`): `Promise`<`any`>

Request the given operation from the link

@@ -162,6 +163,7 @@ Request the given operation from the link
| Name | Type |
| :------ | :------ |
| `operation` | `any` |
| `options` | `any` |
| `result` | `any` |
| `forward` | `any` |

3 changes: 2 additions & 1 deletion docs/api/cozy-client/classes/WebFlagshipLink.md
Original file line number Diff line number Diff line change
@@ -90,7 +90,7 @@ Persist the given data into the links storage

### request

▸ **request**(`operation`, `result`, `forward`): `Promise`<`boolean`>
▸ **request**(`operation`, `options`, `result`, `forward`): `Promise`<`boolean`>

Request the given operation from the link

@@ -99,6 +99,7 @@ Request the given operation from the link
| Name | Type |
| :------ | :------ |
| `operation` | `any` |
| `options` | `any` |
| `result` | `any` |
| `forward` | `any` |

40 changes: 21 additions & 19 deletions docs/api/cozy-pouch-link/classes/PouchLink.md
Original file line number Diff line number Diff line change
@@ -162,7 +162,7 @@ CozyLink.constructor

*Defined in*

[CozyPouchLink.js:833](https://github.com/cozy/cozy-client/blob/master/packages/cozy-pouch-link/src/CozyPouchLink.js#L833)
[CozyPouchLink.js:837](https://github.com/cozy/cozy-client/blob/master/packages/cozy-pouch-link/src/CozyPouchLink.js#L837)

***

@@ -182,7 +182,7 @@ CozyLink.constructor

*Defined in*

[CozyPouchLink.js:794](https://github.com/cozy/cozy-client/blob/master/packages/cozy-pouch-link/src/CozyPouchLink.js#L794)
[CozyPouchLink.js:798](https://github.com/cozy/cozy-client/blob/master/packages/cozy-pouch-link/src/CozyPouchLink.js#L798)

***

@@ -208,7 +208,7 @@ Create the PouchDB index if not existing

*Defined in*

[CozyPouchLink.js:599](https://github.com/cozy/cozy-client/blob/master/packages/cozy-pouch-link/src/CozyPouchLink.js#L599)
[CozyPouchLink.js:603](https://github.com/cozy/cozy-client/blob/master/packages/cozy-pouch-link/src/CozyPouchLink.js#L603)

***

@@ -229,7 +229,7 @@ Create the PouchDB index if not existing

*Defined in*

[CozyPouchLink.js:837](https://github.com/cozy/cozy-client/blob/master/packages/cozy-pouch-link/src/CozyPouchLink.js#L837)
[CozyPouchLink.js:841](https://github.com/cozy/cozy-client/blob/master/packages/cozy-pouch-link/src/CozyPouchLink.js#L841)

***

@@ -249,19 +249,20 @@ Create the PouchDB index if not existing

*Defined in*

[CozyPouchLink.js:822](https://github.com/cozy/cozy-client/blob/master/packages/cozy-pouch-link/src/CozyPouchLink.js#L822)
[CozyPouchLink.js:826](https://github.com/cozy/cozy-client/blob/master/packages/cozy-pouch-link/src/CozyPouchLink.js#L826)

***

### executeMutation

▸ **executeMutation**(`mutation`, `result`, `forward`): `Promise`<`any`>
▸ **executeMutation**(`mutation`, `options`, `result`, `forward`): `Promise`<`any`>

*Parameters*

| Name | Type |
| :------ | :------ |
| `mutation` | `any` |
| `options` | `any` |
| `result` | `any` |
| `forward` | `any` |

@@ -271,7 +272,7 @@ Create the PouchDB index if not existing

*Defined in*

[CozyPouchLink.js:756](https://github.com/cozy/cozy-client/blob/master/packages/cozy-pouch-link/src/CozyPouchLink.js#L756)
[CozyPouchLink.js:760](https://github.com/cozy/cozy-client/blob/master/packages/cozy-pouch-link/src/CozyPouchLink.js#L760)

***

@@ -291,7 +292,7 @@ Create the PouchDB index if not existing

*Defined in*

[CozyPouchLink.js:676](https://github.com/cozy/cozy-client/blob/master/packages/cozy-pouch-link/src/CozyPouchLink.js#L676)
[CozyPouchLink.js:680](https://github.com/cozy/cozy-client/blob/master/packages/cozy-pouch-link/src/CozyPouchLink.js#L680)

***

@@ -315,7 +316,7 @@ Retrieve the PouchDB index if exist, undefined otherwise

*Defined in*

[CozyPouchLink.js:623](https://github.com/cozy/cozy-client/blob/master/packages/cozy-pouch-link/src/CozyPouchLink.js#L623)
[CozyPouchLink.js:627](https://github.com/cozy/cozy-client/blob/master/packages/cozy-pouch-link/src/CozyPouchLink.js#L627)

***

@@ -341,7 +342,7 @@ The changes

*Defined in*

[CozyPouchLink.js:469](https://github.com/cozy/cozy-client/blob/master/packages/cozy-pouch-link/src/CozyPouchLink.js#L469)
[CozyPouchLink.js:473](https://github.com/cozy/cozy-client/blob/master/packages/cozy-pouch-link/src/CozyPouchLink.js#L473)

***

@@ -366,7 +367,7 @@ The db info

*Defined in*

[CozyPouchLink.js:484](https://github.com/cozy/cozy-client/blob/master/packages/cozy-pouch-link/src/CozyPouchLink.js#L484)
[CozyPouchLink.js:488](https://github.com/cozy/cozy-client/blob/master/packages/cozy-pouch-link/src/CozyPouchLink.js#L488)

***

@@ -512,7 +513,7 @@ Emits an event (pouchlink:sync:end) when the sync (all doctypes) is done

*Defined in*

[CozyPouchLink.js:585](https://github.com/cozy/cozy-client/blob/master/packages/cozy-pouch-link/src/CozyPouchLink.js#L585)
[CozyPouchLink.js:589](https://github.com/cozy/cozy-client/blob/master/packages/cozy-pouch-link/src/CozyPouchLink.js#L589)

***

@@ -567,7 +568,7 @@ the need to wait for the warmup

*Defined in*

[CozyPouchLink.js:571](https://github.com/cozy/cozy-client/blob/master/packages/cozy-pouch-link/src/CozyPouchLink.js#L571)
[CozyPouchLink.js:575](https://github.com/cozy/cozy-client/blob/master/packages/cozy-pouch-link/src/CozyPouchLink.js#L575)

***

@@ -626,7 +627,7 @@ CozyLink.persistCozyData

*Defined in*

[CozyPouchLink.js:519](https://github.com/cozy/cozy-client/blob/master/packages/cozy-pouch-link/src/CozyPouchLink.js#L519)
[CozyPouchLink.js:523](https://github.com/cozy/cozy-client/blob/master/packages/cozy-pouch-link/src/CozyPouchLink.js#L523)

***

@@ -652,13 +653,14 @@ CozyLink.persistCozyData

### request

▸ **request**(`operation`, `result?`, `forward?`): `Promise`<`any`>
▸ **request**(`operation`, `options`, `result?`, `forward?`): `Promise`<`any`>

*Parameters*

| Name | Type | Default value |
| :------ | :------ | :------ |
| `operation` | `any` | `undefined` |
| `options` | `any` | `undefined` |
| `result` | `any` | `null` |
| `forward` | (`operation`: `any`, `result`: `any`) => `void` | `doNothing` |

@@ -710,7 +712,7 @@ CozyLink.reset

*Defined in*

[CozyPouchLink.js:492](https://github.com/cozy/cozy-client/blob/master/packages/cozy-pouch-link/src/CozyPouchLink.js#L492)
[CozyPouchLink.js:496](https://github.com/cozy/cozy-client/blob/master/packages/cozy-pouch-link/src/CozyPouchLink.js#L496)

***

@@ -800,7 +802,7 @@ Emits pouchlink:sync:stop event

*Defined in*

[CozyPouchLink.js:867](https://github.com/cozy/cozy-client/blob/master/packages/cozy-pouch-link/src/CozyPouchLink.js#L867)
[CozyPouchLink.js:871](https://github.com/cozy/cozy-client/blob/master/packages/cozy-pouch-link/src/CozyPouchLink.js#L871)

***

@@ -820,7 +822,7 @@ Emits pouchlink:sync:stop event

*Defined in*

[CozyPouchLink.js:799](https://github.com/cozy/cozy-client/blob/master/packages/cozy-pouch-link/src/CozyPouchLink.js#L799)
[CozyPouchLink.js:803](https://github.com/cozy/cozy-client/blob/master/packages/cozy-pouch-link/src/CozyPouchLink.js#L803)

***

@@ -840,7 +842,7 @@ Emits pouchlink:sync:stop event

*Defined in*

[CozyPouchLink.js:804](https://github.com/cozy/cozy-client/blob/master/packages/cozy-pouch-link/src/CozyPouchLink.js#L804)
[CozyPouchLink.js:808](https://github.com/cozy/cozy-client/blob/master/packages/cozy-pouch-link/src/CozyPouchLink.js#L808)

***

8 changes: 4 additions & 4 deletions docs/link-authoring.md
Original file line number Diff line number Diff line change
@@ -20,19 +20,19 @@ In the chain example pictured above, the Dedup link would avoid re-fetching the
There are two ways of creating a new link. First, you can instantiate a `CozyLink` and pass a request handling function to its constructor:

```js
const logLink = new CozyLink((operation, result, forward) => {
const logLink = new CozyLink((operation, options, result, forward) => {
console.log(JSON.stringify(operation))
return forward(operation, result)
return forward(operation, options, result)
})
```

Or you can subclass `CozyLink`:

```js
class LogLink extends CozyLink {
request(operation, result, forward) {
request(operation, options, result, forward) {
console.log(JSON.stringify(operation))
return forward(operation, result)
return forward(operation, options, result)
}
}
```
12 changes: 6 additions & 6 deletions packages/cozy-client/src/CozyClient.js
Original file line number Diff line number Diff line change
@@ -974,7 +974,7 @@
Promise.resolve(
executeQueryFromState(this.store.getState(), queryDefinition)
)
: () => this.requestQuery(queryDefinition)
: () => this.requestQuery(queryDefinition, options)
const response = await this._promiseCache.exec(requestFn, () =>
stringify(queryDefinition)
)
@@ -1083,7 +1083,7 @@
options.as || this.queryIdGenerator.generateId(mutationDefinition)
this.dispatch(initMutation(mutationId, mutationDefinition))
try {
const response = await this.requestMutation(mutationDefinition)
const response = await this.requestMutation(mutationDefinition, options)
this.dispatch(
receiveMutationResult(
mutationId,
@@ -1109,8 +1109,8 @@
* @param {QueryDefinition} definition QueryDefinition to be executed
* @returns {Promise<import("./types").ClientResponse>}
*/
async requestQuery(definition) {
const mainResponse = await this.chain.request(definition)
async requestQuery(definition, options) {
const mainResponse = await this.chain.request(definition, options)

await this.persistVirtualDocuments(definition, mainResponse.data)

@@ -1128,7 +1128,7 @@
* Save the document or array of documents into the persisted storage (if any)
*
* @private
* @param {CozyClientDocument | Array<CozyClientDocument>} data - Document or array of documents to be saved

Check warning on line 1131 in packages/cozy-client/src/CozyClient.js

GitHub Actions / Build and publish

Expected @param names to be "definition, data". Got "data"
* @returns {Promise<void>}
*/
async persistVirtualDocuments(definition, data) {
@@ -1260,7 +1260,7 @@
}
}

async requestMutation(definition) {
async requestMutation(definition, options) {
if (Array.isArray(definition)) {
const [first, ...rest] = definition
const firstResponse = await this.requestMutation(first)
@@ -1273,7 +1273,7 @@
)
return firstResponse
}
return this.chain.request(definition)
return this.chain.request(definition, options)
}

getIncludesRelationships(queryDefinition) {
@@ -1877,8 +1877,8 @@
* @template {string} T
*
* @param {string} slug - the cozy-app's slug containing the setting (can be 'instance' for global settings)
* @param {T[]} keys - The names of the settings to retrieve

Check warning on line 1880 in packages/cozy-client/src/CozyClient.js

GitHub Actions / Build and publish

The type 'T' is undefined
* @returns {Promise<Record<T, any>>} - The value of the requested setting

Check warning on line 1881 in packages/cozy-client/src/CozyClient.js

GitHub Actions / Build and publish

The type 'T' is undefined
*/
async getSettings(slug, keys) {
return getSettings(this, slug, keys)
30 changes: 15 additions & 15 deletions packages/cozy-client/src/CozyClient.spec.js
Original file line number Diff line number Diff line change
@@ -64,13 +64,13 @@ describe('CozyClient initialization', () => {

beforeEach(() => {
links = [
new CozyLink((operation, result = '', forward) => {
return forward(operation, result + 'foo')
new CozyLink((operation, options, result = '', forward) => {
return forward(operation, options, result + 'foo')
}),
new CozyLink((operation, result, forward) => {
return forward(operation, result + 'bar')
new CozyLink((operation, options, result, forward) => {
return forward(operation, options, result + 'bar')
}),
(operation, result) => {
(operation, options, result) => {
return result + 'baz'
}
]
@@ -475,13 +475,13 @@ describe('CozyClient logout', () => {

beforeEach(() => {
links = [
new CozyLink((operation, result = '', forward) => {
return forward(operation, result + 'foo')
new CozyLink((operation, options, result = '', forward) => {
return forward(operation, options, result + 'foo')
}),
new CozyLink((operation, result, forward) => {
return forward(operation, result + 'bar')
new CozyLink((operation, options, result, forward) => {
return forward(operation, options, result + 'bar')
}),
(operation, result) => {
(operation, options, result) => {
return result + 'baz'
}
]
@@ -632,13 +632,13 @@ describe('CozyClient login', () => {

beforeEach(() => {
links = [
new CozyLink((operation, result = '', forward) => {
return forward(operation, result + 'foo')
new CozyLink((operation, options, result = '', forward) => {
return forward(operation, options, result + 'foo')
}),
new CozyLink((operation, result, forward) => {
return forward(operation, result + 'bar')
new CozyLink((operation, options, result, forward) => {
return forward(operation, options, result + 'bar')
}),
(operation, result) => {
(operation, options, result) => {
return result + 'baz'
}
]
13 changes: 7 additions & 6 deletions packages/cozy-client/src/CozyLink.js
Original file line number Diff line number Diff line change
@@ -13,11 +13,12 @@ export default class CozyLink {
* Request the given operation from the link
*
* @param {any} operation - The operation to request
* @param {any} options - The request options
* @param {any} result - The result from the previous request of the chain
* @param {any} forward - The next request of the chain
* @returns {Promise<any>}
*/
async request(operation, result, forward) {
async request(operation, options, result, forward) {
throw new Error('request is not implemented')
}

@@ -45,7 +46,7 @@ export default class CozyLink {
const toLink = handler =>
typeof handler === 'function' ? new CozyLink(handler) : handler

const defaultLinkRequestHandler = (operation, result) => {
const defaultLinkRequestHandler = (operation, options, result) => {
if (result) return result
else if (operation.execute) return operation.execute()
else
@@ -67,11 +68,11 @@ export const chain = links =>
[...links, defaultLinkHandler].map(toLink).reduce(concat)

const concat = (firstLink, nextLink) => {
const requestHandler = (operation, result, forward) => {
const nextForward = (op, res) => {
return nextLink.request(op, res, forward)
const requestHandler = (operation, options, result, forward) => {
const nextForward = (op, opts, res) => {
return nextLink.request(op, opts, res, forward)
}
return firstLink.request(operation, result, nextForward)
return firstLink.request(operation, options, result, nextForward)
}

const persistHandler = (data, forward) => {
24 changes: 12 additions & 12 deletions packages/cozy-client/src/CozyLink.spec.js
Original file line number Diff line number Diff line change
@@ -3,13 +3,13 @@ import CozyLink, { chain } from './CozyLink'
describe('CozyLink', () => {
it('should be chainable', () => {
const link = chain([
new CozyLink((operation, result = '', forward) => {
return forward(operation, result + 'foo')
new CozyLink((operation, options, result = '', forward) => {
return forward(operation, options, result + 'foo')
}),
new CozyLink((operation, result, forward) => {
return forward(operation, result + 'bar')
new CozyLink((operation, options, result, forward) => {
return forward(operation, options, result + 'bar')
}),
(operation, result) => {
(operation, options, result) => {
return result + 'baz'
}
])
@@ -19,19 +19,19 @@ describe('CozyLink', () => {
describe('default last link', () => {
it('should throw an error when called without result', () => {
const link = chain([
new CozyLink((operation, result = '', forward) => {
return forward(operation)
new CozyLink((operation, options, result = '', forward) => {
return forward(operation, options)
})
])
expect(() =>
link.request('dummyOperation')
).toThrowErrorMatchingSnapshot()
})

it('should return the final result if tehre is one', () => {
it('should return the final result if there is one', () => {
const link = chain([
new CozyLink((operation, result, forward) => {
return forward(operation, 'foo')
new CozyLink((operation, options, result, forward) => {
return forward(operation, options, 'foo')
})
])

@@ -40,8 +40,8 @@ describe('CozyLink', () => {

it('should call the custom execution function', () => {
const link = chain([
new CozyLink((operation, result = '', forward) => {
return forward(operation)
new CozyLink((operation, options, result = '', forward) => {
return forward(operation, options)
})
])
const spyFn = jest.fn(() => 'bar')
16 changes: 8 additions & 8 deletions packages/cozy-client/src/StackLink.js
Original file line number Diff line number Diff line change
@@ -89,19 +89,19 @@ export default class StackLink extends CozyLink {
this.stackClient = null
}

async request(operation, result, forward) {
if (this.isOnline && !(await this.isOnline())) {
return forward(operation)
async request(operation, options, result, forward) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No jsdoc for the options ?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed here

if (!options?.forceStack && this.isOnline && !(await this.isOnline())) {
return forward(operation, options)
}

try {
if (operation.mutationType) {
return await this.executeMutation(operation, result, forward)
return await this.executeMutation(operation, options, result, forward)
}
return await this.executeQuery(operation)
} catch (err) {
if (isReactNativeOfflineError(err)) {
return forward(operation)
if (!options?.forceStack && isReactNativeOfflineError(err)) {
return forward(operation, options)
}
throw err
}
@@ -138,7 +138,7 @@ export default class StackLink extends CozyLink {
}
}

async executeMutation(mutation, result, forward) {
async executeMutation(mutation, options, result, forward) {
const { mutationType, document: doc, documents: docs, ...props } = mutation
switch (mutationType) {
case MutationTypes.CREATE_DOCUMENT:
@@ -182,7 +182,7 @@ export default class StackLink extends CozyLink {
.collection(DOCTYPE_FILES)
.upload(props.file, props.dirPath)
default:
return forward(mutation, result)
return forward(mutation, options, result)
}
}
}
4 changes: 2 additions & 2 deletions packages/cozy-client/src/WebFlagshipLink.js
Original file line number Diff line number Diff line change
@@ -18,8 +18,8 @@ export default class WebFlagshipLink extends CozyLink {
// does nothing, we don't need any client for this kind of link
}

async request(operation, result, forward) {
return this.webviewIntent.call('flagshipLinkRequest', operation)
async request(operation, options, result, forward) {
return this.webviewIntent.call('flagshipLinkRequest', operation, options)
}

async persistCozyData(data, forward) {
1 change: 1 addition & 0 deletions packages/cozy-client/src/types.js
Original file line number Diff line number Diff line change
@@ -302,6 +302,7 @@ import { QueryDefinition } from './queries/dsl'
* a single doc instead of an array for single doc queries. Defaults to false for backward
* compatibility but will be set to true in the future.
* @property {boolean} [executeFromStore=false] - If set to true, the query will be run directly on the current store's state
* @property {boolean} [forceStack] - If set to true, the query will be executed through StackLink only even if there are other links available
*/

/**
2 changes: 1 addition & 1 deletion packages/cozy-client/types/CozyClient.d.ts
Original file line number Diff line number Diff line change
@@ -535,7 +535,7 @@ declare class CozyClient {
* @private
*/
private fetchRelationships;
requestMutation(definition: any): any;
requestMutation(definition: any, options: any): any;
getIncludesRelationships(queryDefinition: any): import("lodash").Dictionary<any>;
/**
* Returns documents with their relationships resolved according to their schema.
3 changes: 2 additions & 1 deletion packages/cozy-client/types/CozyLink.d.ts
Original file line number Diff line number Diff line change
@@ -4,11 +4,12 @@ export default class CozyLink {
* Request the given operation from the link
*
* @param {any} operation - The operation to request
* @param {any} options - The request options
* @param {any} result - The result from the previous request of the chain
* @param {any} forward - The next request of the chain
* @returns {Promise<any>}
*/
request(operation: any, result: any, forward: any): Promise<any>;
request(operation: any, options: any, result: any, forward: any): Promise<any>;
/**
* Persist the given data into the links storage
*
2 changes: 1 addition & 1 deletion packages/cozy-client/types/StackLink.d.ts
Original file line number Diff line number Diff line change
@@ -27,7 +27,7 @@ export default class StackLink extends CozyLink {
* @returns {Promise<import("./types").ClientResponse>}
*/
executeQuery(query: QueryDefinition): Promise<import("./types").ClientResponse>;
executeMutation(mutation: any, result: any, forward: any): Promise<any>;
executeMutation(mutation: any, options: any, result: any, forward: any): Promise<any>;
}
export type StackLinkOptions = {
/**
4 changes: 4 additions & 0 deletions packages/cozy-client/types/types.d.ts
Original file line number Diff line number Diff line change
@@ -553,6 +553,10 @@ export type QueryOptions = {
* - If set to true, the query will be run directly on the current store's state
*/
executeFromStore?: boolean;
/**
* - If set to true, the query will be executed through StackLink only even if there are other links available
*/
forceStack?: boolean;
};
export type Query = {
definition: QueryDefinition;
20 changes: 12 additions & 8 deletions packages/cozy-pouch-link/src/CozyPouchLink.js
Original file line number Diff line number Diff line change
@@ -410,7 +410,11 @@ class PouchLink extends CozyLink {
return !!this.getPouch(impactedDoctype)
}

async request(operation, result = null, forward = doNothing) {
async request(operation, options, result = null, forward = doNothing) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If the forceStack: true option is given here, we should forward the request

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed here

if (options?.forceStack) {
return forward(operation, options)
}

const doctype = getDoctypeFromOperation(operation)

if (!this.pouches) {
@@ -420,7 +424,7 @@ class PouchLink extends CozyLink {
)
}

return forward(operation)
return forward(operation, options)
}

if (this.pouches.getSyncStatus(doctype) === 'not_synced') {
@@ -429,7 +433,7 @@ class PouchLink extends CozyLink {
`Tried to access local ${doctype} but Cozy Pouch is not synced yet. Forwarding the operation to next link`
)
}
return forward(operation)
return forward(operation, options)
}

if (await this.needsToWaitWarmup(doctype)) {
@@ -438,7 +442,7 @@ class PouchLink extends CozyLink {
`Tried to access local ${doctype} but not warmuped yet. Forwarding the operation to next link`
)
}
return forward(operation)
return forward(operation, options)
}

// Forwards if doctype not supported
@@ -448,11 +452,11 @@ class PouchLink extends CozyLink {
`The doctype '${doctype}' is not supported. Forwarding the operation to next link`
)
}
return forward(operation)
return forward(operation, options)
}

if (operation.mutationType) {
return this.executeMutation(operation, result, forward)
return this.executeMutation(operation, options, result, forward)
} else {
return this.executeQuery(operation)
}
@@ -753,7 +757,7 @@ class PouchLink extends CozyLink {
return jsonResult
}

async executeMutation(mutation, result, forward) {
async executeMutation(mutation, options, result, forward) {
const markName = this.performanceApi.mark('executeMutation')
let pouchRes
switch (mutation.mutationType) {
@@ -773,7 +777,7 @@ class PouchLink extends CozyLink {
pouchRes = await this.addReferencesTo(mutation)
break
default:
return forward(mutation, result)
return forward(mutation, options, result)
}

const jsonResult = jsonapi.fromPouchResult({
4 changes: 2 additions & 2 deletions packages/cozy-pouch-link/src/CozyPouchLink.spec.js
Original file line number Diff line number Diff line change
@@ -98,7 +98,7 @@ describe('CozyPouchLink', () => {
await setup()
const query = Q(TODO_DOCTYPE)
expect.assertions(1)
await link.request(query, null, () => {
await link.request(query, null, null, () => {
expect(true).toBe(true)
})
})
@@ -111,7 +111,7 @@ describe('CozyPouchLink', () => {
})
const query = Q(TODO_DOCTYPE)
expect.assertions(1)
await link.request(query, null, () => {
await link.request(query, null, null, () => {
expect(true).toBe(true)
})
})
2 changes: 1 addition & 1 deletion packages/cozy-pouch-link/types/CozyPouchLink.d.ts
Original file line number Diff line number Diff line change
@@ -275,7 +275,7 @@ declare class PouchLink extends CozyLink {
skip: any;
next: boolean;
}>;
executeMutation(mutation: any, result: any, forward: any): Promise<any>;
executeMutation(mutation: any, options: any, result: any, forward: any): Promise<any>;
createDocument(mutation: any): Promise<any>;
updateDocument(mutation: any): Promise<any>;
updateDocuments(mutation: any): Promise<any[]>;

Unchanged files with check annotations Beta

*
* @param {CozyClient} client - Cozy client instance
* @param {string} slug - the cozy-app's slug containing the setting (can be 'instance' for global settings)
* @param {T[]} keys - The names of the settings to retrieve

Check warning on line 15 in packages/cozy-client/src/helpers/settings.js

GitHub Actions / Build and publish

The type 'T' is undefined
* @returns {Promise<Record<T, any>>} - The values of the requested settings

Check warning on line 16 in packages/cozy-client/src/helpers/settings.js

GitHub Actions / Build and publish

The type 'T' is undefined
*/
export const getSettings = async (client, slug, keys) => {
const query = getQuery(slug)
*
* @param {string} slug - the cozy-app's slug containing the setting (can be 'instance' for global settings)
* @param {Object} currentSettings - the Setting object (ideally from a `client.query()` or a `useQuery()` and normalized using `normalizeSettings`)
* @param {Record<string, unknown>} items - The new values for the settings

Check warning on line 101 in packages/cozy-client/src/helpers/settings.js

GitHub Actions / Build and publish

The type 'unknown' is undefined
* @returns {Object} a new Setting object containing the new value
*/
export const editSettings = (slug, currentSettings, items) => {
*
* @template {string} T
*
* @param {Record<T, any>} settings - the Setting object (ideally from a `client.query()` or a `useQuery()` and normalized using `normalizeSettings`)

Check warning on line 152 in packages/cozy-client/src/helpers/settings.js

GitHub Actions / Build and publish

The type 'T' is undefined
* @param {T[]} keys - The names of the settings to extract

Check warning on line 153 in packages/cozy-client/src/helpers/settings.js

GitHub Actions / Build and publish

The type 'T' is undefined
* @returns {Record<T, any>} - Dictionnary containing the values for the requested keys

Check warning on line 154 in packages/cozy-client/src/helpers/settings.js

GitHub Actions / Build and publish

The type 'T' is undefined
*/
export const extractKeys = (settings, keys) => {
let result = {}
* @param {object=} Options.queryDefinition custom Querydef
* @param {object=} Options.queryOptions custom QueryOpts
* @param {object=} Options.storeQueries custome StoreQueries
* @returns

Check warning on line 17 in packages/cozy-client/src/hooks/useQuery.spec.jsx

GitHub Actions / Build and publish

Missing JSDoc @returns type
*/
const setupQuery = ({
customClient,