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