electrodb 1.4.3 → 1.4.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +24 -1
- package/README.md +94 -0
- package/package.json +4 -2
- package/src/entity.js +24 -1
- package/src/filters.js +1 -1
- package/src/operations.js +38 -31
- package/src/update.js +1 -1
- package/.idea/aws.xml +0 -17
- package/.idea/electrodb.iml +0 -12
- package/.idea/google-java-format.xml +0 -6
- package/.idea/misc.xml +0 -6
- package/.idea/modules.xml +0 -8
- package/.idea/vcs.xml +0 -6
- package/browser.js +0 -53
- package/bundle.js +0 -9962
- package/localtestgrep.sh +0 -3
- package/notes +0 -937
- package/tslocaltestgrep.sh +0 -3
package/notes
DELETED
|
@@ -1,937 +0,0 @@
|
|
|
1
|
-
import { Entity, Service, CollectionItem } from "electrodb";
|
|
2
|
-
|
|
3
|
-
const StatusTypes = ["Open", "Closed", ""] as const;
|
|
4
|
-
const IsNotTicket = "";
|
|
5
|
-
const NotYetViewed = "#";
|
|
6
|
-
const IssueTicket = "Issue";
|
|
7
|
-
const PullRequestTicket = "PullRequest";
|
|
8
|
-
const TicketTypes = [IssueTicket, PullRequestTicket, IsNotTicket] as const
|
|
9
|
-
|
|
10
|
-
type Status = typeof StatusTypes[number];
|
|
11
|
-
|
|
12
|
-
function toStatusCode(status: unknown): Status | undefined {
|
|
13
|
-
for (let index in StatusTypes) {
|
|
14
|
-
if (StatusTypes[index] === status) {
|
|
15
|
-
return index as Status;
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
return undefined;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
function toStatusString(code: unknown): Status | undefined {
|
|
22
|
-
for (let index in StatusTypes) {
|
|
23
|
-
if (index === code) {
|
|
24
|
-
return StatusTypes[index];
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
return undefined;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
const issues = new Entity({
|
|
32
|
-
model: {
|
|
33
|
-
entity: "issues",
|
|
34
|
-
service: "versioncontrol",
|
|
35
|
-
version: "1"
|
|
36
|
-
},
|
|
37
|
-
attributes: {
|
|
38
|
-
issueNumber: {
|
|
39
|
-
type: "string",
|
|
40
|
-
},
|
|
41
|
-
repoName: {
|
|
42
|
-
type: "string"
|
|
43
|
-
},
|
|
44
|
-
repoOwner: {
|
|
45
|
-
type: "string"
|
|
46
|
-
},
|
|
47
|
-
username: {
|
|
48
|
-
type: "string",
|
|
49
|
-
},
|
|
50
|
-
ticketType: {
|
|
51
|
-
type: TicketTypes,
|
|
52
|
-
set: () => IssueTicket,
|
|
53
|
-
readOnly: true
|
|
54
|
-
},
|
|
55
|
-
ticketNumber: {
|
|
56
|
-
type: "string",
|
|
57
|
-
readOnly: true,
|
|
58
|
-
watch: ["issueNumber"],
|
|
59
|
-
set: (_, {issueNumber}) => issueNumber
|
|
60
|
-
},
|
|
61
|
-
status: {
|
|
62
|
-
type: StatusTypes,
|
|
63
|
-
default: "Open",
|
|
64
|
-
set: (val) => toStatusCode(val),
|
|
65
|
-
get: (val) => toStatusString(val),
|
|
66
|
-
},
|
|
67
|
-
subject: {
|
|
68
|
-
type: "string"
|
|
69
|
-
},
|
|
70
|
-
body: {
|
|
71
|
-
type: "string"
|
|
72
|
-
},
|
|
73
|
-
createdAt: {
|
|
74
|
-
type: "string",
|
|
75
|
-
set: () => new Date().toISOString().split('T')[0],
|
|
76
|
-
readOnly: true,
|
|
77
|
-
},
|
|
78
|
-
updatedAt: {
|
|
79
|
-
type: "string",
|
|
80
|
-
watch: "*",
|
|
81
|
-
set: () => new Date().toISOString().split('T')[0],
|
|
82
|
-
readOnly: true,
|
|
83
|
-
},
|
|
84
|
-
},
|
|
85
|
-
indexes: {
|
|
86
|
-
issue: {
|
|
87
|
-
collection: "issueReview",
|
|
88
|
-
pk: {
|
|
89
|
-
composite: ["repoOwner", "repoName", "issueNumber"],
|
|
90
|
-
field: "pk"
|
|
91
|
-
},
|
|
92
|
-
sk: {
|
|
93
|
-
composite: [],
|
|
94
|
-
field: "sk"
|
|
95
|
-
}
|
|
96
|
-
},
|
|
97
|
-
created: {
|
|
98
|
-
collection: ["owned", "managed"],
|
|
99
|
-
index: "gsi1pk-gsi1sk-index",
|
|
100
|
-
pk: {
|
|
101
|
-
field: "gsi1pk",
|
|
102
|
-
composite: ["username"]
|
|
103
|
-
},
|
|
104
|
-
sk: {
|
|
105
|
-
field: "gsi1sk",
|
|
106
|
-
composite: ["createdAt"]
|
|
107
|
-
}
|
|
108
|
-
},
|
|
109
|
-
todos: {
|
|
110
|
-
collection: "activity",
|
|
111
|
-
index: "gsi2pk-gsi2sk-index",
|
|
112
|
-
pk: {
|
|
113
|
-
composite: ["repoOwner", "repoName"],
|
|
114
|
-
field: "gsi2pk"
|
|
115
|
-
},
|
|
116
|
-
sk: {
|
|
117
|
-
composite: ["createdAt"],
|
|
118
|
-
field: "gsi2sk"
|
|
119
|
-
}
|
|
120
|
-
},
|
|
121
|
-
_: {
|
|
122
|
-
collection: "subscribers",
|
|
123
|
-
index: "gsi4pk-gsi4sk-index",
|
|
124
|
-
pk: {
|
|
125
|
-
composite: ["repoOwner", "repoName", "ticketNumber"],
|
|
126
|
-
field: "gsi4pk"
|
|
127
|
-
},
|
|
128
|
-
sk: {
|
|
129
|
-
composite: [],
|
|
130
|
-
field: "gsi4sk"
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
});
|
|
135
|
-
|
|
136
|
-
const issueComments = new Entity({
|
|
137
|
-
model: {
|
|
138
|
-
entity: "issueComment",
|
|
139
|
-
service: "versioncontrol",
|
|
140
|
-
version: "1"
|
|
141
|
-
},
|
|
142
|
-
attributes: {
|
|
143
|
-
issueNumber: {
|
|
144
|
-
type: "string",
|
|
145
|
-
},
|
|
146
|
-
commentId: {
|
|
147
|
-
type: "string"
|
|
148
|
-
},
|
|
149
|
-
username: {
|
|
150
|
-
type: "string"
|
|
151
|
-
},
|
|
152
|
-
replyTo: {
|
|
153
|
-
type: "string"
|
|
154
|
-
},
|
|
155
|
-
replyViewed: {
|
|
156
|
-
type: "string",
|
|
157
|
-
default: NotYetViewed,
|
|
158
|
-
get: (replyViewed): string | void => {
|
|
159
|
-
if (replyViewed !== NotYetViewed) {
|
|
160
|
-
return replyViewed
|
|
161
|
-
}
|
|
162
|
-
},
|
|
163
|
-
set: (replyViewed) => {
|
|
164
|
-
if (replyViewed === undefined) {
|
|
165
|
-
return NotYetViewed;
|
|
166
|
-
}
|
|
167
|
-
return replyViewed;
|
|
168
|
-
}
|
|
169
|
-
},
|
|
170
|
-
repoName: {
|
|
171
|
-
type: "string"
|
|
172
|
-
},
|
|
173
|
-
repoOwner: {
|
|
174
|
-
type: "string"
|
|
175
|
-
},
|
|
176
|
-
body: {
|
|
177
|
-
type: "string"
|
|
178
|
-
},
|
|
179
|
-
createdAt: {
|
|
180
|
-
type: "string",
|
|
181
|
-
set: () => new Date().toISOString().split('T')[0],
|
|
182
|
-
readOnly: true,
|
|
183
|
-
},
|
|
184
|
-
updatedAt: {
|
|
185
|
-
type: "string",
|
|
186
|
-
watch: "*",
|
|
187
|
-
set: () => new Date().toISOString().split('T')[0],
|
|
188
|
-
readOnly: true,
|
|
189
|
-
},
|
|
190
|
-
},
|
|
191
|
-
indexes: {
|
|
192
|
-
comments: {
|
|
193
|
-
collection: "issueReview",
|
|
194
|
-
pk: {
|
|
195
|
-
composite: ["repoOwner", "repoName", "issueNumber"],
|
|
196
|
-
field: "pk"
|
|
197
|
-
},
|
|
198
|
-
sk: {
|
|
199
|
-
composite: ["commentId"],
|
|
200
|
-
field: "sk"
|
|
201
|
-
}
|
|
202
|
-
},
|
|
203
|
-
created: {
|
|
204
|
-
collection: "conversations",
|
|
205
|
-
index: "gsi1pk-gsi1sk-index",
|
|
206
|
-
pk: {
|
|
207
|
-
field: "gsi1pk",
|
|
208
|
-
composite: ["username"]
|
|
209
|
-
},
|
|
210
|
-
sk: {
|
|
211
|
-
field: "gsi1sk",
|
|
212
|
-
composite: ["repoOwner", "repoName", "issueNumber"]
|
|
213
|
-
}
|
|
214
|
-
},
|
|
215
|
-
replies: {
|
|
216
|
-
collection: "inbox",
|
|
217
|
-
index: "gsi2pk-gsi2sk-index",
|
|
218
|
-
pk: {
|
|
219
|
-
composite: ["replyTo"],
|
|
220
|
-
field: "gsi2pk"
|
|
221
|
-
},
|
|
222
|
-
sk: {
|
|
223
|
-
composite: ["createdAt", "replyViewed"],
|
|
224
|
-
field: "gsi2sk"
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
});
|
|
229
|
-
|
|
230
|
-
const pullRequests = new Entity({
|
|
231
|
-
model: {
|
|
232
|
-
entity: "pullRequest",
|
|
233
|
-
service: "versioncontrol",
|
|
234
|
-
version: "1"
|
|
235
|
-
},
|
|
236
|
-
attributes: {
|
|
237
|
-
pullRequestNumber: {
|
|
238
|
-
type: "string",
|
|
239
|
-
required: true,
|
|
240
|
-
},
|
|
241
|
-
repoName: {
|
|
242
|
-
type: "string",
|
|
243
|
-
required: true,
|
|
244
|
-
},
|
|
245
|
-
repoOwner: {
|
|
246
|
-
type: "string",
|
|
247
|
-
required: true,
|
|
248
|
-
},
|
|
249
|
-
username: {
|
|
250
|
-
type: "string",
|
|
251
|
-
required: true,
|
|
252
|
-
},
|
|
253
|
-
ticketType: {
|
|
254
|
-
type: TicketTypes,
|
|
255
|
-
default: () => PullRequestTicket,
|
|
256
|
-
set: () => PullRequestTicket,
|
|
257
|
-
readOnly: true
|
|
258
|
-
},
|
|
259
|
-
ticketNumber: {
|
|
260
|
-
type: "string",
|
|
261
|
-
readOnly: true,
|
|
262
|
-
watch: ["pullRequestNumber"],
|
|
263
|
-
set: (_, {issueNumber}) => issueNumber
|
|
264
|
-
},
|
|
265
|
-
status: {
|
|
266
|
-
type: StatusTypes,
|
|
267
|
-
default: "Open",
|
|
268
|
-
set: (val) => toStatusCode(val),
|
|
269
|
-
get: (val) => toStatusString(val)
|
|
270
|
-
},
|
|
271
|
-
reviewers: {
|
|
272
|
-
type: "list",
|
|
273
|
-
items: {
|
|
274
|
-
type: "map",
|
|
275
|
-
properties: {
|
|
276
|
-
username: {
|
|
277
|
-
type: "string",
|
|
278
|
-
required: true,
|
|
279
|
-
},
|
|
280
|
-
approved: {
|
|
281
|
-
type: "boolean",
|
|
282
|
-
required: true,
|
|
283
|
-
},
|
|
284
|
-
createdAt: {
|
|
285
|
-
type: "string",
|
|
286
|
-
default: () => new Date().toISOString().split('T')[0],
|
|
287
|
-
readOnly: true,
|
|
288
|
-
},
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
},
|
|
292
|
-
createdAt: {
|
|
293
|
-
type: "string",
|
|
294
|
-
set: () => new Date().toISOString().split('T')[0],
|
|
295
|
-
readOnly: true,
|
|
296
|
-
},
|
|
297
|
-
updatedAt: {
|
|
298
|
-
type: "string",
|
|
299
|
-
watch: "*",
|
|
300
|
-
set: () => new Date().toISOString().split('T')[0],
|
|
301
|
-
readOnly: true,
|
|
302
|
-
},
|
|
303
|
-
},
|
|
304
|
-
indexes: {
|
|
305
|
-
pullRequest: {
|
|
306
|
-
collection: "PRReview",
|
|
307
|
-
pk: {
|
|
308
|
-
composite: ["repoOwner", "repoName", "pullRequestNumber"],
|
|
309
|
-
field: "pk"
|
|
310
|
-
},
|
|
311
|
-
sk: {
|
|
312
|
-
composite: [],
|
|
313
|
-
field: "sk"
|
|
314
|
-
}
|
|
315
|
-
},
|
|
316
|
-
created: {
|
|
317
|
-
collection: ["owned", "managed"],
|
|
318
|
-
index: "gsi1pk-gsi1sk-index",
|
|
319
|
-
pk: {
|
|
320
|
-
field: "gsi1pk",
|
|
321
|
-
composite: ["username"]
|
|
322
|
-
},
|
|
323
|
-
sk: {
|
|
324
|
-
field: "gsi1sk",
|
|
325
|
-
composite: ["createdAt"]
|
|
326
|
-
}
|
|
327
|
-
},
|
|
328
|
-
enhancements: {
|
|
329
|
-
collection: "activity",
|
|
330
|
-
index: "gsi2pk-gsi2sk-index",
|
|
331
|
-
pk: {
|
|
332
|
-
field: "gsi2pk",
|
|
333
|
-
composite: ["repoOwner", "repoName"],
|
|
334
|
-
},
|
|
335
|
-
sk: {
|
|
336
|
-
field: "gsi2sk",
|
|
337
|
-
composite: ["createdAt"],
|
|
338
|
-
|
|
339
|
-
}
|
|
340
|
-
},
|
|
341
|
-
_: {
|
|
342
|
-
collection: "subscribers",
|
|
343
|
-
index: "gsi4pk-gsi4sk-index",
|
|
344
|
-
pk: {
|
|
345
|
-
composite: ["repoOwner", "repoName", "ticketNumber"],
|
|
346
|
-
field: "gsi4pk"
|
|
347
|
-
},
|
|
348
|
-
sk: {
|
|
349
|
-
composite: [],
|
|
350
|
-
field: "gsi4sk"
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
});
|
|
355
|
-
|
|
356
|
-
const pullRequestComments = new Entity({
|
|
357
|
-
model: {
|
|
358
|
-
entity: "pullRequestComment",
|
|
359
|
-
service: "versioncontrol",
|
|
360
|
-
version: "1"
|
|
361
|
-
},
|
|
362
|
-
attributes: {
|
|
363
|
-
repoName: {
|
|
364
|
-
type: "string"
|
|
365
|
-
},
|
|
366
|
-
username: {
|
|
367
|
-
type: "string"
|
|
368
|
-
},
|
|
369
|
-
repoOwner: {
|
|
370
|
-
type: "string"
|
|
371
|
-
},
|
|
372
|
-
pullRequestNumber: {
|
|
373
|
-
type: "string"
|
|
374
|
-
},
|
|
375
|
-
commentId: {
|
|
376
|
-
type: "string"
|
|
377
|
-
},
|
|
378
|
-
replyTo: {
|
|
379
|
-
type: "string"
|
|
380
|
-
},
|
|
381
|
-
replyViewed: {
|
|
382
|
-
type: "string",
|
|
383
|
-
default: NotYetViewed,
|
|
384
|
-
get: (replyViewed) => {
|
|
385
|
-
return replyViewed !== NotYetViewed
|
|
386
|
-
? replyViewed
|
|
387
|
-
: undefined;
|
|
388
|
-
},
|
|
389
|
-
set: (replyViewed) => {
|
|
390
|
-
if (replyViewed === undefined) {
|
|
391
|
-
return NotYetViewed;
|
|
392
|
-
}
|
|
393
|
-
return replyViewed;
|
|
394
|
-
}
|
|
395
|
-
},
|
|
396
|
-
createdAt: {
|
|
397
|
-
type: "string",
|
|
398
|
-
set: () => new Date().toISOString().split('T')[0],
|
|
399
|
-
readOnly: true,
|
|
400
|
-
},
|
|
401
|
-
updatedAt: {
|
|
402
|
-
type: "string",
|
|
403
|
-
watch: "*",
|
|
404
|
-
set: () => new Date().toISOString().split('T')[0],
|
|
405
|
-
readOnly: true,
|
|
406
|
-
},
|
|
407
|
-
},
|
|
408
|
-
indexes: {
|
|
409
|
-
comments: {
|
|
410
|
-
collection: "PRReview",
|
|
411
|
-
pk: {
|
|
412
|
-
composite: ["repoOwner", "repoName", "pullRequestNumber"],
|
|
413
|
-
field: "pk"
|
|
414
|
-
},
|
|
415
|
-
sk: {
|
|
416
|
-
composite: ["commentId"],
|
|
417
|
-
field: "sk"
|
|
418
|
-
}
|
|
419
|
-
},
|
|
420
|
-
created: {
|
|
421
|
-
collection: "conversations",
|
|
422
|
-
index: "gsi1pk-gsi1sk-index",
|
|
423
|
-
pk: {
|
|
424
|
-
field: "gsi1pk",
|
|
425
|
-
composite: ["username"]
|
|
426
|
-
},
|
|
427
|
-
sk: {
|
|
428
|
-
field: "gsi1sk",
|
|
429
|
-
composite: ["repoOwner", "repoName"]
|
|
430
|
-
}
|
|
431
|
-
},
|
|
432
|
-
replies: {
|
|
433
|
-
collection: "inbox",
|
|
434
|
-
index: "gsi2pk-gsi2sk-index",
|
|
435
|
-
pk: {
|
|
436
|
-
composite: ["replyTo"],
|
|
437
|
-
field: "gsi2pk"
|
|
438
|
-
},
|
|
439
|
-
sk: {
|
|
440
|
-
composite: ["updatedAt", "replyViewed"],
|
|
441
|
-
field: "gsi2sk"
|
|
442
|
-
}
|
|
443
|
-
},
|
|
444
|
-
}
|
|
445
|
-
});
|
|
446
|
-
|
|
447
|
-
const repositories = new Entity({
|
|
448
|
-
model: {
|
|
449
|
-
entity: "repositories",
|
|
450
|
-
service: "versioncontrol",
|
|
451
|
-
version: "1"
|
|
452
|
-
},
|
|
453
|
-
attributes: {
|
|
454
|
-
repoName: {
|
|
455
|
-
type: "string"
|
|
456
|
-
},
|
|
457
|
-
repoOwner: {
|
|
458
|
-
type: "string"
|
|
459
|
-
},
|
|
460
|
-
about: {
|
|
461
|
-
type: "string"
|
|
462
|
-
},
|
|
463
|
-
username: {
|
|
464
|
-
type: "string",
|
|
465
|
-
readOnly: true,
|
|
466
|
-
watch: ["repoOwner"],
|
|
467
|
-
set: (_, {repoOwner}) => repoOwner
|
|
468
|
-
},
|
|
469
|
-
description: {
|
|
470
|
-
type: "string"
|
|
471
|
-
},
|
|
472
|
-
isPrivate: {
|
|
473
|
-
type: "boolean"
|
|
474
|
-
},
|
|
475
|
-
license: {
|
|
476
|
-
type: ["apache-2.0", "mit", "none"] as const,
|
|
477
|
-
default: "none"
|
|
478
|
-
},
|
|
479
|
-
defaultBranch: {
|
|
480
|
-
type: "string",
|
|
481
|
-
default: "main"
|
|
482
|
-
},
|
|
483
|
-
topics: {
|
|
484
|
-
type: "set",
|
|
485
|
-
items: "string"
|
|
486
|
-
},
|
|
487
|
-
followers: {
|
|
488
|
-
type: "set",
|
|
489
|
-
items: "string"
|
|
490
|
-
},
|
|
491
|
-
stars: {
|
|
492
|
-
type: "set",
|
|
493
|
-
items: "string"
|
|
494
|
-
},
|
|
495
|
-
createdAt: {
|
|
496
|
-
type: "string",
|
|
497
|
-
set: () => new Date().toISOString().split('T')[0],
|
|
498
|
-
readOnly: true,
|
|
499
|
-
},
|
|
500
|
-
updatedAt: {
|
|
501
|
-
type: "string",
|
|
502
|
-
watch: "*",
|
|
503
|
-
set: () => new Date().toISOString().split('T')[0],
|
|
504
|
-
readOnly: true,
|
|
505
|
-
},
|
|
506
|
-
},
|
|
507
|
-
indexes: {
|
|
508
|
-
repositories: {
|
|
509
|
-
collection: "alerts",
|
|
510
|
-
pk: {
|
|
511
|
-
composite: ["repoOwner"],
|
|
512
|
-
field: "pk"
|
|
513
|
-
},
|
|
514
|
-
sk: {
|
|
515
|
-
composite: ["repoName"],
|
|
516
|
-
field: "sk"
|
|
517
|
-
}
|
|
518
|
-
},
|
|
519
|
-
created: {
|
|
520
|
-
collection: "owned",
|
|
521
|
-
index: "gsi1pk-gsi1sk-index",
|
|
522
|
-
pk: {
|
|
523
|
-
composite: ["username"],
|
|
524
|
-
field: "gsi1pk"
|
|
525
|
-
},
|
|
526
|
-
sk: {
|
|
527
|
-
composite: ["isPrivate", "createdAt"],
|
|
528
|
-
field: "gsi1sk"
|
|
529
|
-
}
|
|
530
|
-
},
|
|
531
|
-
}
|
|
532
|
-
});
|
|
533
|
-
|
|
534
|
-
const subscriptions = new Entity({
|
|
535
|
-
model: {
|
|
536
|
-
entity: "subscription",
|
|
537
|
-
service: "versioncontrol",
|
|
538
|
-
version: "1"
|
|
539
|
-
},
|
|
540
|
-
attributes: {
|
|
541
|
-
repoName: {
|
|
542
|
-
type: "string",
|
|
543
|
-
required: true,
|
|
544
|
-
},
|
|
545
|
-
repoOwner: {
|
|
546
|
-
type: "string",
|
|
547
|
-
required: true,
|
|
548
|
-
},
|
|
549
|
-
username: {
|
|
550
|
-
type: "string",
|
|
551
|
-
required: true,
|
|
552
|
-
},
|
|
553
|
-
ticketNumber: {
|
|
554
|
-
type: "string",
|
|
555
|
-
default: () => IsNotTicket,
|
|
556
|
-
set: (ticketNumber) => {
|
|
557
|
-
if (ticketNumber === IsNotTicket) {
|
|
558
|
-
return "";
|
|
559
|
-
} else {
|
|
560
|
-
return ticketNumber;
|
|
561
|
-
}
|
|
562
|
-
},
|
|
563
|
-
get: (ticketNumber) => {
|
|
564
|
-
if (ticketNumber === "") {
|
|
565
|
-
return IsNotTicket;
|
|
566
|
-
} else {
|
|
567
|
-
return ticketNumber;
|
|
568
|
-
}
|
|
569
|
-
}
|
|
570
|
-
},
|
|
571
|
-
ticketType: {
|
|
572
|
-
type: TicketTypes,
|
|
573
|
-
default: () => IsNotTicket,
|
|
574
|
-
set: (ticketType) => {
|
|
575
|
-
return ticketType === IsNotTicket
|
|
576
|
-
? "#"
|
|
577
|
-
: ticketType;
|
|
578
|
-
},
|
|
579
|
-
get: (ticketType) => {
|
|
580
|
-
if (ticketType === "") {
|
|
581
|
-
return IsNotTicket;
|
|
582
|
-
} else {
|
|
583
|
-
return ticketType;
|
|
584
|
-
}
|
|
585
|
-
}
|
|
586
|
-
},
|
|
587
|
-
createdAt: {
|
|
588
|
-
type: "string",
|
|
589
|
-
set: () => new Date().toISOString().split('T')[0],
|
|
590
|
-
readOnly: true,
|
|
591
|
-
},
|
|
592
|
-
updatedAt: {
|
|
593
|
-
type: "string",
|
|
594
|
-
watch: "*",
|
|
595
|
-
set: () => new Date().toISOString().split('T')[0],
|
|
596
|
-
readOnly: true,
|
|
597
|
-
},
|
|
598
|
-
},
|
|
599
|
-
indexes: {
|
|
600
|
-
repository: {
|
|
601
|
-
pk: {
|
|
602
|
-
composite: ["repoOwner", "repoName"],
|
|
603
|
-
field: "pk"
|
|
604
|
-
},
|
|
605
|
-
sk: {
|
|
606
|
-
composite: ["username", "ticketType", "ticketNumber"],
|
|
607
|
-
field: "sk"
|
|
608
|
-
}
|
|
609
|
-
},
|
|
610
|
-
user: {
|
|
611
|
-
collection: "watching",
|
|
612
|
-
index: "gsi3pk-gsi3sk-index",
|
|
613
|
-
pk: {
|
|
614
|
-
composite: ["username"],
|
|
615
|
-
field: "gsi3pk"
|
|
616
|
-
},
|
|
617
|
-
sk: {
|
|
618
|
-
composite: ["ticketType", "ticketNumber"],
|
|
619
|
-
field: "gsi3sk"
|
|
620
|
-
}
|
|
621
|
-
},
|
|
622
|
-
tickets: {
|
|
623
|
-
collection: "subscribers",
|
|
624
|
-
index: "gsi4pk-gsi4sk-index",
|
|
625
|
-
pk: {
|
|
626
|
-
composite: ["repoOwner", "repoName", "ticketNumber"],
|
|
627
|
-
field: "gsi4pk"
|
|
628
|
-
},
|
|
629
|
-
sk: {
|
|
630
|
-
composite: ["ticketType", "username"],
|
|
631
|
-
field: "gsi4sk"
|
|
632
|
-
}
|
|
633
|
-
}
|
|
634
|
-
}
|
|
635
|
-
});
|
|
636
|
-
|
|
637
|
-
const users = new Entity({
|
|
638
|
-
model: {
|
|
639
|
-
entity: "user",
|
|
640
|
-
service: "versioncontrol",
|
|
641
|
-
version: "1"
|
|
642
|
-
},
|
|
643
|
-
attributes: {
|
|
644
|
-
username: {
|
|
645
|
-
type: "string"
|
|
646
|
-
},
|
|
647
|
-
fullName: {
|
|
648
|
-
type: "string"
|
|
649
|
-
},
|
|
650
|
-
photo: {
|
|
651
|
-
type: "string"
|
|
652
|
-
},
|
|
653
|
-
bio: {
|
|
654
|
-
type: "string"
|
|
655
|
-
},
|
|
656
|
-
location: {
|
|
657
|
-
type: "string"
|
|
658
|
-
},
|
|
659
|
-
pinned: {
|
|
660
|
-
type: "any"
|
|
661
|
-
},
|
|
662
|
-
following: {
|
|
663
|
-
type: "set",
|
|
664
|
-
items: "string"
|
|
665
|
-
},
|
|
666
|
-
followers: {
|
|
667
|
-
type: "set",
|
|
668
|
-
items: "string"
|
|
669
|
-
},
|
|
670
|
-
createdAt: {
|
|
671
|
-
type: "string",
|
|
672
|
-
set: () => new Date().toISOString().split('T')[0],
|
|
673
|
-
readOnly: true,
|
|
674
|
-
},
|
|
675
|
-
updatedAt: {
|
|
676
|
-
type: "string",
|
|
677
|
-
watch: "*",
|
|
678
|
-
set: () => new Date().toISOString().split('T')[0],
|
|
679
|
-
readOnly: true,
|
|
680
|
-
},
|
|
681
|
-
},
|
|
682
|
-
indexes: {
|
|
683
|
-
user: {
|
|
684
|
-
collection: "overview",
|
|
685
|
-
pk: {
|
|
686
|
-
composite: ["username"],
|
|
687
|
-
field: "pk"
|
|
688
|
-
},
|
|
689
|
-
sk: {
|
|
690
|
-
composite: [],
|
|
691
|
-
field: "sk"
|
|
692
|
-
}
|
|
693
|
-
},
|
|
694
|
-
_: {
|
|
695
|
-
collection: "owned",
|
|
696
|
-
index: "gsi1pk-gsi1sk-index",
|
|
697
|
-
pk: {
|
|
698
|
-
composite: ["username"],
|
|
699
|
-
field: "gsi1pk"
|
|
700
|
-
},
|
|
701
|
-
sk: {
|
|
702
|
-
field: "gsi1sk",
|
|
703
|
-
composite: []
|
|
704
|
-
}
|
|
705
|
-
},
|
|
706
|
-
subscriptions: {
|
|
707
|
-
collection: "watching",
|
|
708
|
-
index: "gsi3pk-gsi3sk-index",
|
|
709
|
-
pk: {
|
|
710
|
-
composite: ["username"],
|
|
711
|
-
field: "gsi3pk"
|
|
712
|
-
},
|
|
713
|
-
sk: {
|
|
714
|
-
composite: [],
|
|
715
|
-
field: "gsi3sk"
|
|
716
|
-
}
|
|
717
|
-
}
|
|
718
|
-
}
|
|
719
|
-
});
|
|
720
|
-
|
|
721
|
-
const versioncontrol = new Service({
|
|
722
|
-
users,
|
|
723
|
-
issues,
|
|
724
|
-
repositories,
|
|
725
|
-
pullRequests,
|
|
726
|
-
subscriptions,
|
|
727
|
-
issueComments,
|
|
728
|
-
pullRequestComments,
|
|
729
|
-
}, {table: "your_table_name"});
|
|
730
|
-
|
|
731
|
-
type IssueIds = Parameters<typeof issues.get>[0][0];
|
|
732
|
-
type IssueCommentIds = Parameters<typeof issueComments.get>[0][0];
|
|
733
|
-
type PullRequestIds = Parameters<typeof pullRequests.get>[0][0];
|
|
734
|
-
type PullRequestCommentIds = Parameters<typeof pullRequestComments.get>[0][0];
|
|
735
|
-
type OwnedItems = CollectionItem<typeof versioncontrol, "owned">;
|
|
736
|
-
|
|
737
|
-
function isIssueCommentIds(comment: any): comment is IssueCommentIds {
|
|
738
|
-
return comment.issueNumber !== undefined && comment.username !== undefined;
|
|
739
|
-
}
|
|
740
|
-
|
|
741
|
-
function isPullRequestCommentIds(comment: any): comment is PullRequestCommentIds {
|
|
742
|
-
return comment.pullRequestNumber !== undefined && comment.username !== undefined;
|
|
743
|
-
}
|
|
744
|
-
|
|
745
|
-
// Get Public Repositories By Username
|
|
746
|
-
async function getPublicRepository(username: string) {
|
|
747
|
-
return versioncontrol.entities.repositories.query.created({username, isPrivate: false});
|
|
748
|
-
}
|
|
749
|
-
|
|
750
|
-
// Get PullRequest and Associated Comments -- newest comments first
|
|
751
|
-
async function reviewPullRequest(pr: PullRequestIds) {
|
|
752
|
-
return versioncontrol.collections.PRReview(pr)
|
|
753
|
-
.page(null, {params: {ScanIndexForward: false}})
|
|
754
|
-
}
|
|
755
|
-
|
|
756
|
-
// Get Issue and Associated Comments -- newest comments first
|
|
757
|
-
async function reviewIssue(issue: IssueIds) {
|
|
758
|
-
return versioncontrol.collections.issueReview(issue).go({params: {ScanIndexForward: false}});
|
|
759
|
-
}
|
|
760
|
-
|
|
761
|
-
// Get PullRequests Created By User
|
|
762
|
-
async function getUserPullRequests(username: string, status: Status = "") {
|
|
763
|
-
return versioncontrol.entities.pullRequests
|
|
764
|
-
.query.created({username, status})
|
|
765
|
-
.go({params: {ScanIndexForward: false}});
|
|
766
|
-
}
|
|
767
|
-
|
|
768
|
-
// Close pull request -- guards: can only be performed by user who opened PR or the repo owner
|
|
769
|
-
async function closePullRequest(user: string, pr: PullRequestIds) {
|
|
770
|
-
return versioncontrol.entities.pullRequests
|
|
771
|
-
.update(pr)
|
|
772
|
-
.set({status: "Closed"})
|
|
773
|
-
.where(({username, repoOwner}, {eq}) => `
|
|
774
|
-
${eq(username, user)} OR ${eq(repoOwner, user)}
|
|
775
|
-
`)
|
|
776
|
-
.go()
|
|
777
|
-
}
|
|
778
|
-
|
|
779
|
-
// Get all user info, repos, pull requests, and issues in one query
|
|
780
|
-
async function getFirstPageLoad(username: string) {
|
|
781
|
-
const results: OwnedItems = {
|
|
782
|
-
issues: [],
|
|
783
|
-
pullRequests: [],
|
|
784
|
-
repositories: [],
|
|
785
|
-
users: [],
|
|
786
|
-
};
|
|
787
|
-
|
|
788
|
-
let page = null;
|
|
789
|
-
|
|
790
|
-
do {
|
|
791
|
-
const [next, data] = await versioncontrol.collections.owned({username}).page();
|
|
792
|
-
results.issues = results.issues.concat(data.issues);
|
|
793
|
-
results.pullRequests = results.pullRequests.concat(data.pullRequests);
|
|
794
|
-
results.repositories = results.repositories.concat(data.repositories);
|
|
795
|
-
results.users = results.users.concat(data.users);
|
|
796
|
-
page = next;
|
|
797
|
-
} while (page !== null);
|
|
798
|
-
|
|
799
|
-
return results;
|
|
800
|
-
}
|
|
801
|
-
|
|
802
|
-
// Get Subscriptions for a given Repository, PullRequest, or Issue.
|
|
803
|
-
async function getSubscribed(repoOwner: string, repoName: string, ticketNumber: string = IsNotTicket) {
|
|
804
|
-
return versioncontrol.collections.subscribers({repoOwner, repoName, ticketNumber}).go();
|
|
805
|
-
}
|
|
806
|
-
|
|
807
|
-
const MinDate = "0000-00-00";
|
|
808
|
-
const MaxDate = "9999-99-99";
|
|
809
|
-
|
|
810
|
-
// Get unread comment replies
|
|
811
|
-
async function getUnreadComments(user: string) {
|
|
812
|
-
const start = {
|
|
813
|
-
createdAt: MinDate,
|
|
814
|
-
replyViewed: NotYetViewed
|
|
815
|
-
};
|
|
816
|
-
const end = {
|
|
817
|
-
createdAt: MaxDate,
|
|
818
|
-
replyViewed: NotYetViewed
|
|
819
|
-
};
|
|
820
|
-
let [issues, pullRequests] = await Promise.all([
|
|
821
|
-
versioncontrol.entities
|
|
822
|
-
.issueComments.query
|
|
823
|
-
.replies({replyTo: user})
|
|
824
|
-
.between(start, end)
|
|
825
|
-
.go(),
|
|
826
|
-
|
|
827
|
-
versioncontrol.entities
|
|
828
|
-
.pullRequestComments.query
|
|
829
|
-
.replies({replyTo: user})
|
|
830
|
-
.between(start, end)
|
|
831
|
-
.go()
|
|
832
|
-
]);
|
|
833
|
-
|
|
834
|
-
return {
|
|
835
|
-
issues,
|
|
836
|
-
pullRequests
|
|
837
|
-
};
|
|
838
|
-
}
|
|
839
|
-
|
|
840
|
-
// Mark comment reply as read -- guards: can only be done by the user who was being replied to
|
|
841
|
-
async function readReply(user: string, comment: IssueCommentIds): Promise<boolean>;
|
|
842
|
-
async function readReply(user: string, comment: PullRequestCommentIds): Promise<boolean>;
|
|
843
|
-
async function readReply(user: string, comment: any): Promise<boolean> {
|
|
844
|
-
const replyViewed = new Date().toISOString().split('T')[0];
|
|
845
|
-
if (isIssueCommentIds(comment)) {
|
|
846
|
-
return await versioncontrol.entities.issueComments
|
|
847
|
-
.patch(comment)
|
|
848
|
-
.set({replyViewed})
|
|
849
|
-
.where(({replyTo}, {eq}) => eq(replyTo, user))
|
|
850
|
-
.go()
|
|
851
|
-
.then(() => true)
|
|
852
|
-
.catch(() => false);
|
|
853
|
-
} else if (isPullRequestCommentIds(comment)) {
|
|
854
|
-
return await versioncontrol.entities.pullRequestComments
|
|
855
|
-
.patch(comment)
|
|
856
|
-
.set({replyViewed})
|
|
857
|
-
.where(({replyTo}, {eq}) => eq(replyTo, user))
|
|
858
|
-
.go()
|
|
859
|
-
.then(() => true)
|
|
860
|
-
.catch(() => false);
|
|
861
|
-
} else {
|
|
862
|
-
return false;
|
|
863
|
-
}
|
|
864
|
-
}
|
|
865
|
-
|
|
866
|
-
async function approvePullRequest(repoOwner: string, repoName: string, pullRequestNumber: string, username: string) {
|
|
867
|
-
const pullRequest = await versioncontrol.entities.pullRequests
|
|
868
|
-
.get({repoOwner, repoName, pullRequestNumber})
|
|
869
|
-
.go();
|
|
870
|
-
|
|
871
|
-
if (!pullRequest || !pullRequest.reviewers) {
|
|
872
|
-
return false;
|
|
873
|
-
}
|
|
874
|
-
|
|
875
|
-
let index: number = -1;
|
|
876
|
-
|
|
877
|
-
for (let i = 0; i < pullRequest.reviewers.length; i++) {
|
|
878
|
-
const reviewer = pullRequest.reviewers[i];
|
|
879
|
-
if (reviewer.username === username) {
|
|
880
|
-
index = i;
|
|
881
|
-
}
|
|
882
|
-
}
|
|
883
|
-
|
|
884
|
-
if (index === -1) {
|
|
885
|
-
return false;
|
|
886
|
-
}
|
|
887
|
-
|
|
888
|
-
return versioncontrol.entities.pullRequests
|
|
889
|
-
.update({repoOwner, repoName, pullRequestNumber})
|
|
890
|
-
.data(({reviewers}, {set}) => {
|
|
891
|
-
set(reviewers[index].approved, true);
|
|
892
|
-
})
|
|
893
|
-
.where(({reviewers}, {eq}) => `
|
|
894
|
-
${eq(reviewers[index].username, username)};
|
|
895
|
-
`)
|
|
896
|
-
.go()
|
|
897
|
-
.then(() => true)
|
|
898
|
-
.catch(() => false);
|
|
899
|
-
}
|
|
900
|
-
|
|
901
|
-
async function followRepository(repoOwner: string, repoName: string, follower: string) {
|
|
902
|
-
await versioncontrol.entities
|
|
903
|
-
.repositories.update({repoOwner, repoName})
|
|
904
|
-
.add({followers: [follower]})
|
|
905
|
-
.go()
|
|
906
|
-
}
|
|
907
|
-
|
|
908
|
-
// getPublicRepository("abc");
|
|
909
|
-
reviewPullRequest({
|
|
910
|
-
pullRequestNumber: "110",
|
|
911
|
-
repoName: "electrodb",
|
|
912
|
-
repoOwner: "tywalch"
|
|
913
|
-
});
|
|
914
|
-
|
|
915
|
-
reviewIssue({
|
|
916
|
-
issueNumber: "281",
|
|
917
|
-
repoName: "electrodb",
|
|
918
|
-
repoOwner: "tywalch"
|
|
919
|
-
});
|
|
920
|
-
|
|
921
|
-
getUserPullRequests("tywalch");
|
|
922
|
-
getUserPullRequests("tywalch", "Closed");
|
|
923
|
-
|
|
924
|
-
closePullRequest("tywalch", {
|
|
925
|
-
pullRequestNumber: "301",
|
|
926
|
-
repoName: "electrodb",
|
|
927
|
-
repoOwner: "tywalch",
|
|
928
|
-
});
|
|
929
|
-
|
|
930
|
-
getFirstPageLoad("tywalch");
|
|
931
|
-
getSubscribed
|
|
932
|
-
getUnreadComments
|
|
933
|
-
readReply
|
|
934
|
-
readReply
|
|
935
|
-
readReply
|
|
936
|
-
approvePullRequest
|
|
937
|
-
followRepository
|