Skip to content

Commit dd8502d

Browse files
Add getNotifyInsertSerialOperations
1 parent ae63aca commit dd8502d

File tree

1 file changed

+199
-0
lines changed

1 file changed

+199
-0
lines changed
+199
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,199 @@
1+
import {
2+
DeepClient,
3+
SerialOperation,
4+
} from '@deep-foundation/deeplinks/imports/client.js';
5+
import { createSerialOperation } from '@deep-foundation/deeplinks/imports/gql/index.js';
6+
import { Package } from './package.js';
7+
8+
/**
9+
* Gets serial operations to insert {@link Package.Notify}
10+
*
11+
* @example
12+
* #### Insert {@link Package.Notify}
13+
```ts
14+
const {serialOperations, linkIds} = await getNotifyInsertSerialOperations({
15+
deep
16+
});
17+
await deep.serial({
18+
operations: serialOperations
19+
})
20+
```
21+
* #### Insert {@link Package.Notify} with reserved link id
22+
```ts
23+
const reservedLinkIds = await deep.reserve(2);
24+
const notifyLinkId = reservedLinkIds.pop();
25+
const containLinkId = reservedLinkIds.pop();
26+
27+
const {serialOperations, linkIds} = await getNotifyInsertSerialOperations({
28+
deep,
29+
notify: {
30+
title,
31+
body,
32+
},
33+
reservedLinkIds: {
34+
notifyLinkId,
35+
containLinkId,
36+
}
37+
});
38+
await deep.serial({
39+
operations: serialOperations
40+
})
41+
```
42+
*/
43+
export async function getNotifyInsertSerialOperations(
44+
param: GetNotifyInsertSerialOperationsParam
45+
): Promise<GetNotifyInsertSerialOperationsResult> {
46+
const {
47+
deep,
48+
containValue,
49+
containerLinkId,
50+
pushNotificationLinkId,
51+
deviceLinkId
52+
} = param;
53+
const $package = new Package({deep});
54+
const reservedLinkIds = await getReservedLinkIds();
55+
const { containLinkId, notifyLinkId } = reservedLinkIds;
56+
const typeLinkIds = await getTypeLinkIds();
57+
const { containTypeLinkId, notifyTypeLinkId } = typeLinkIds;
58+
const serialOperations = [];
59+
const notifyInsertSerialOperation = createSerialOperation({
60+
type: 'insert',
61+
table: 'links',
62+
objects: {
63+
id: notifyLinkId,
64+
type_id: notifyTypeLinkId,
65+
from_id: pushNotificationLinkId,
66+
to_id: deviceLinkId,
67+
},
68+
});
69+
serialOperations.push(notifyInsertSerialOperation);
70+
if (containerLinkId !== null) {
71+
const containInsertSerialOperation = createSerialOperation({
72+
type: 'insert',
73+
table: 'links',
74+
objects: {
75+
type_id: containTypeLinkId,
76+
from_id: containerLinkId || deep.linkId,
77+
to_id: notifyLinkId,
78+
},
79+
});
80+
serialOperations.push(containInsertSerialOperation);
81+
const valueOfContainInsertSerialOperation = createSerialOperation({
82+
type: 'insert',
83+
table: 'strings',
84+
objects: {
85+
link_id: containLinkId,
86+
value: containValue,
87+
},
88+
});
89+
serialOperations.push(valueOfContainInsertSerialOperation);
90+
}
91+
92+
return {
93+
serialOperations,
94+
linkIds: reservedLinkIds
95+
};
96+
97+
type GetReservedLinkIdsResult = Required<
98+
Exclude<
99+
GetNotifyInsertSerialOperationsParam['reservedLinkIds'],
100+
undefined
101+
>
102+
>;
103+
104+
async function getReservedLinkIds(): Promise<GetReservedLinkIdsResult> {
105+
let result: GetReservedLinkIdsResult = {
106+
containLinkId: 0,
107+
notifyLinkId: 0,
108+
};
109+
const linksToReserveCount =
110+
Object.keys(result).length -
111+
Object.keys(param.reservedLinkIds || {}).length;
112+
const reservedLinkIds: number[] =
113+
linksToReserveCount > 0 ? await deep.reserve(linksToReserveCount) : [];
114+
result = {
115+
containLinkId:
116+
param.reservedLinkIds?.containLinkId ?? reservedLinkIds.pop()!,
117+
notifyLinkId:
118+
param.reservedLinkIds?.notifyLinkId ?? reservedLinkIds.pop()!,
119+
};
120+
return result;
121+
}
122+
123+
type GetTypeLinkIdsResult = Required<
124+
Exclude<GetNotifyInsertSerialOperationsParam['typeLinkIds'], undefined>
125+
>;
126+
127+
async function getTypeLinkIds(): Promise<GetTypeLinkIdsResult> {
128+
const result: GetTypeLinkIdsResult = {
129+
containTypeLinkId:
130+
param.typeLinkIds?.containTypeLinkId ||
131+
(await deep.id('@deep-foundation/core', 'Contain')),
132+
notifyTypeLinkId:
133+
param.typeLinkIds?.notifyTypeLinkId ||
134+
await $package.Notify.id(),
135+
};
136+
return result;
137+
}
138+
}
139+
140+
export interface GetNotifyInsertSerialOperationsParam {
141+
/**
142+
* Reserved link ids that will be used in the serial operations
143+
*/
144+
reservedLinkIds?: {
145+
/**
146+
* Reserved link id for the notify
147+
*/
148+
notifyLinkId?: number;
149+
/**
150+
* Reserved link id for the contain
151+
*/
152+
containLinkId?: number;
153+
};
154+
/**
155+
* Link ids of types that will be used in the serial operations
156+
*/
157+
typeLinkIds?: {
158+
/**
159+
* Link id of the contain type
160+
*/
161+
containTypeLinkId?: number;
162+
/**
163+
* Link id of the notify type
164+
*/
165+
notifyTypeLinkId?: number;
166+
};
167+
/**
168+
* Deep Client
169+
*/
170+
deep: DeepClient;
171+
/**
172+
* Link id of the container
173+
*
174+
* @remarks
175+
* If it is null, contain link will not be created
176+
* @defaultValue {@link GetNotifyInsertSerialOperationsParam.deep.linkId} if not provided or undefined
177+
*/
178+
containerLinkId?: number | undefined | null;
179+
/**
180+
* Value of the contain link
181+
*
182+
* @remarks
183+
* If {@link GetNotifyInsertSerialOperationsParam.containerLinkId} is null, this will be ignored
184+
*/
185+
containValue?: string | undefined;
186+
/**
187+
* Link id of the push notification
188+
*/
189+
pushNotificationLinkId: number;
190+
/**
191+
* Link id of the device
192+
*/
193+
deviceLinkId: number;
194+
}
195+
196+
export interface GetNotifyInsertSerialOperationsResult {
197+
serialOperations: Array<SerialOperation>,
198+
linkIds: Required<Exclude<GetNotifyInsertSerialOperationsParam['reservedLinkIds'], undefined>>,
199+
}

0 commit comments

Comments
 (0)