Skip to content
This repository was archived by the owner on Oct 25, 2023. It is now read-only.

Commit 65d7085

Browse files
committed
implement user activity
1 parent 494c625 commit 65d7085

File tree

1 file changed

+65
-4
lines changed

1 file changed

+65
-4
lines changed

archaeologist/src/storage_api_local.ts

Lines changed: 65 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
import {
1111
Ack,
12+
AddUserActivityRequest,
1213
CreateNodeArgs,
1314
Eid,
1415
GetNodeSliceArgs,
@@ -25,6 +26,7 @@ import {
2526
TNode,
2627
TNodeJson,
2728
TNodeSliceIterator,
29+
TotalUserActivity,
2830
} from 'smuggler-api'
2931
import { NodeType } from 'smuggler-api'
3032
import { v4 as uuidv4 } from 'uuid'
@@ -62,8 +64,11 @@ type OriginToNidLav = GenericLav<'origin->nid', Nid[]>
6264
type NidToEdgeYek = GenericYek<'nid->edge', Nid>
6365
type NidToEdgeLav = GenericLav<'nid->edge', TEdgeJson[]>
6466

65-
type Yek = NidYek | OriginToNidYek | NidToEdgeYek
66-
type Lav = NidLav | OriginToNidLav | NidToEdgeLav
67+
type OriginToActivityYek = GenericYek<'origin->activity', OriginId>
68+
type OriginToActivityLav = GenericLav<'origin->activity', TotalUserActivity>
69+
70+
type Yek = NidYek | OriginToNidYek | NidToEdgeYek | OriginToActivityYek
71+
type Lav = NidLav | OriginToNidLav | NidToEdgeLav | OriginToActivityLav
6772

6873
// TODO[snikitin@outlook.com] Describe that the purpose of this wrapper is to
6974
// add a bit of ORM-like typesafety to browser.Storage.StorageArea.
@@ -99,6 +104,7 @@ class YekLavStore {
99104
get(yek: OriginToNidYek): Promise<OriginToNidLav | undefined>
100105
get(yek: NidToEdgeYek): Promise<NidToEdgeLav | undefined>
101106
get(yek: NidYek[]): Promise<NidLav[]>
107+
get(yek: OriginToActivityYek): Promise<OriginToActivityLav | undefined>
102108
get(yek: Yek | Yek[]): Promise<Lav | Lav[] | undefined> {
103109
if (Array.isArray(yek)) {
104110
const keys: string[] = yek.map((value: Yek) => this.stringify(value))
@@ -132,6 +138,8 @@ class YekLavStore {
132138
return 'origin->nid:' + yek.yek.key
133139
case 'nid->edge':
134140
return 'nid->edge:' + yek.yek.key
141+
case 'origin->activity':
142+
return 'origin->activity:' + yek.yek.key
135143
}
136144
}
137145
}
@@ -286,6 +294,58 @@ async function updateNode(
286294
return { ack: true }
287295
}
288296

297+
async function addExternalUserActivity(
298+
store: YekLavStore,
299+
origin: OriginId,
300+
activity: AddUserActivityRequest
301+
): Promise<TotalUserActivity> {
302+
const total: TotalUserActivity = await getExternalUserActivity(store, origin)
303+
if ('visit' in activity) {
304+
if (activity.visit == null) {
305+
return total
306+
}
307+
total.visits = total.visits.concat(activity.visit.visits)
308+
if (activity.visit.reported_by != null) {
309+
throw new Error(
310+
`activity.external.add does not implement support for visit.reported_by yet`
311+
)
312+
}
313+
} else if ('attention' in activity) {
314+
if (activity.attention == null) {
315+
return total
316+
}
317+
// TODO[snikitin@outlook.com] What to do with activity.attention.timestamp here?
318+
total.seconds_of_attention += activity.attention.seconds
319+
}
320+
321+
const yek: OriginToActivityYek = {
322+
yek: { kind: 'origin->activity', key: origin },
323+
}
324+
const lav: OriginToActivityLav = {
325+
lav: { kind: 'origin->activity', value: total },
326+
}
327+
await store.set([{ yek, lav }])
328+
return total
329+
}
330+
331+
async function getExternalUserActivity(
332+
store: YekLavStore,
333+
origin: OriginId
334+
): Promise<TotalUserActivity> {
335+
const yek: OriginToActivityYek = {
336+
yek: { kind: 'origin->activity', key: origin },
337+
}
338+
const lav: OriginToActivityLav | undefined = await store.get(yek)
339+
if (lav == null) {
340+
return {
341+
visits: [],
342+
seconds_of_attention: 0,
343+
}
344+
}
345+
const value: TotalUserActivity = lav.lav.value
346+
return value
347+
}
348+
289349
export function makeLocalStorageApi(
290350
browserStore: browser.Storage.StorageArea
291351
): StorageApi {
@@ -346,8 +406,9 @@ export function makeLocalStorageApi(
346406
},
347407
activity: {
348408
external: {
349-
// add: addExternalUserActivity,
350-
// get: getExternalUserActivity,
409+
add: () => addExternalUserActivity,
410+
get: (origin: OriginId, _signal?: AbortSignal) =>
411+
getExternalUserActivity(store, origin),
351412
},
352413
association: {
353414
// record: recordExternalAssociation,

0 commit comments

Comments
 (0)