@magek/adapter-event-store-nedb 0.0.1

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.
@@ -0,0 +1,15 @@
1
+ import { EntitySnapshotEnvelope, EventEnvelope, EventStoreEntryEnvelope } from '@magek/common';
2
+ export declare const eventsDatabase: string;
3
+ export declare class EventRegistry {
4
+ readonly events: any;
5
+ isLoaded: boolean;
6
+ constructor();
7
+ loadDatabaseIfNeeded(): Promise<void>;
8
+ getCursor(query: object, createdAt?: number, projections?: unknown): any;
9
+ query(query: object, createdAt?: number, limit?: number, projections?: unknown): Promise<EventStoreEntryEnvelope[]>;
10
+ replaceOrDeleteItem(id: string, newValue?: EventEnvelope | EntitySnapshotEnvelope): Promise<void>;
11
+ queryLatestSnapshot(query: object): Promise<EntitySnapshotEnvelope | undefined>;
12
+ store(storableObject: EventEnvelope | EntitySnapshotEnvelope): Promise<void>;
13
+ deleteAll(): Promise<number>;
14
+ count(query?: object): Promise<number>;
15
+ }
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EventRegistry = exports.eventsDatabase = void 0;
4
+ const path = require("path");
5
+ exports.eventsDatabase = path.normalize(path.join('.', '.magek', 'events.json'));
6
+ const DataStore = require('@seald-io/nedb');
7
+ class EventRegistry {
8
+ constructor() {
9
+ this.isLoaded = false;
10
+ this.events = new DataStore({ filename: exports.eventsDatabase });
11
+ }
12
+ async loadDatabaseIfNeeded() {
13
+ if (!this.isLoaded) {
14
+ this.isLoaded = true;
15
+ await this.events.loadDatabaseAsync();
16
+ }
17
+ }
18
+ getCursor(query, createdAt = 1, projections) {
19
+ const cursor = this.events.findAsync(query, projections);
20
+ return cursor.sort({ createdAt: createdAt });
21
+ }
22
+ async query(query, createdAt = 1, limit, projections) {
23
+ await this.loadDatabaseIfNeeded();
24
+ let cursor = this.getCursor(query, createdAt, projections);
25
+ if (limit) {
26
+ cursor = cursor.limit(Number(limit));
27
+ }
28
+ return await cursor.execAsync();
29
+ }
30
+ async replaceOrDeleteItem(id, newValue) {
31
+ if (newValue) {
32
+ await new Promise((resolve, reject) => this.events.update({ _id: id }, newValue, { multi: true }, (err, numRemoved) => {
33
+ if (err)
34
+ reject(err);
35
+ else
36
+ resolve(numRemoved);
37
+ }));
38
+ }
39
+ else {
40
+ await new Promise((resolve, reject) => this.events.remove({ _id: id }, { multi: true }, (err, numRemoved) => {
41
+ if (err)
42
+ reject(err);
43
+ else
44
+ resolve(numRemoved);
45
+ }));
46
+ }
47
+ }
48
+ async queryLatestSnapshot(query) {
49
+ await this.loadDatabaseIfNeeded();
50
+ const cursor = this.events.findAsync({ ...query, kind: 'snapshot' }).sort({ snapshottedEventCreatedAt: -1 }); // Sort in descending order (newer timestamps first)
51
+ const results = await cursor.execAsync();
52
+ if (results.length <= 0) {
53
+ return undefined;
54
+ }
55
+ return results[0];
56
+ }
57
+ async store(storableObject) {
58
+ await this.loadDatabaseIfNeeded();
59
+ await this.events.insertAsync(storableObject);
60
+ }
61
+ async deleteAll() {
62
+ await this.loadDatabaseIfNeeded();
63
+ return await this.events.removeAsync({}, { multi: true });
64
+ }
65
+ async count(query) {
66
+ await this.loadDatabaseIfNeeded();
67
+ return await this.events.countAsync(query);
68
+ }
69
+ }
70
+ exports.EventRegistry = EventRegistry;
@@ -0,0 +1,2 @@
1
+ import { EventStoreAdapter } from '@magek/common';
2
+ export declare const eventStore: EventStoreAdapter;
package/dist/index.js ADDED
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.eventStore = void 0;
4
+ const event_registry_1 = require("./event-registry");
5
+ const events_adapter_1 = require("./library/events-adapter");
6
+ const events_search_adapter_1 = require("./library/events-search-adapter");
7
+ const event_delete_adapter_1 = require("./library/event-delete-adapter");
8
+ const paths_1 = require("./paths");
9
+ const fs_1 = require("fs");
10
+ const path = require("path");
11
+ // Pre-built NeDB Event Store Adapter instance
12
+ const eventRegistry = new event_registry_1.EventRegistry();
13
+ function notImplemented() {
14
+ throw new Error('Not implemented for NeDB adapter');
15
+ }
16
+ async function countAll(database) {
17
+ await database.loadDatabaseAsync();
18
+ const count = await database.countAsync({});
19
+ return count !== null && count !== void 0 ? count : 0;
20
+ }
21
+ // Function to get userApp from config or load it from standard location
22
+ function getUserApp(config) {
23
+ // Check if userApp is attached to config
24
+ if (config.userApp) {
25
+ return config.userApp;
26
+ }
27
+ // Fallback to loading from standard location
28
+ try {
29
+ return require(path.join(process.cwd(), 'dist', 'index.js'));
30
+ }
31
+ catch (error) {
32
+ throw new Error('Could not load userApp from config or standard location');
33
+ }
34
+ }
35
+ exports.eventStore = {
36
+ rawToEnvelopes: events_adapter_1.rawEventsToEnvelopes,
37
+ rawStreamToEnvelopes: notImplemented,
38
+ dedupEventStream: notImplemented,
39
+ produce: notImplemented,
40
+ forEntitySince: (config, entityTypeName, entityID, since) => (0, events_adapter_1.readEntityEventsSince)(eventRegistry, config, entityTypeName, entityID, since),
41
+ latestEntitySnapshot: (config, entityTypeName, entityID) => (0, events_adapter_1.readEntityLatestSnapshot)(eventRegistry, config, entityTypeName, entityID),
42
+ store: (eventEnvelopes, config) => {
43
+ const userApp = getUserApp(config);
44
+ return (0, events_adapter_1.storeEvents)(userApp, eventRegistry, eventEnvelopes, config);
45
+ },
46
+ storeSnapshot: (snapshotEnvelope, config) => (0, events_adapter_1.storeSnapshot)(eventRegistry, snapshotEnvelope, config),
47
+ search: (config, parameters) => (0, events_search_adapter_1.searchEvents)(eventRegistry, config, parameters),
48
+ searchEntitiesIDs: (config, limit, afterCursor, entityTypeName) => (0, events_search_adapter_1.searchEntitiesIds)(eventRegistry, config, limit, afterCursor, entityTypeName),
49
+ storeDispatched: () => (0, events_adapter_1.storeDispatchedEvent)(),
50
+ findDeletableEvent: (config, parameters) => (0, event_delete_adapter_1.findDeletableEvent)(eventRegistry, config, parameters),
51
+ findDeletableSnapshot: (config, parameters) => (0, event_delete_adapter_1.findDeletableSnapshot)(eventRegistry, config, parameters),
52
+ deleteEvent: (config, events) => (0, event_delete_adapter_1.deleteEvent)(eventRegistry, config, events),
53
+ deleteSnapshot: (config, snapshots) => (0, event_delete_adapter_1.deleteSnapshot)(eventRegistry, config, snapshots),
54
+ healthCheck: {
55
+ isUp: async () => (0, fs_1.existsSync)(paths_1.eventsDatabase),
56
+ details: async () => {
57
+ const count = await countAll(eventRegistry.events);
58
+ return {
59
+ file: paths_1.eventsDatabase,
60
+ count: count,
61
+ };
62
+ },
63
+ urls: async () => [paths_1.eventsDatabase],
64
+ },
65
+ };
@@ -0,0 +1,18 @@
1
+ import { MagekConfig, EventDeleteParameters, SnapshotDeleteParameters, EventEnvelopeFromDatabase, EntitySnapshotEnvelopeFromDatabase } from '@magek/common';
2
+ import { EventRegistry } from '../event-registry';
3
+ export type QueryValue = number | string | boolean;
4
+ export type QueryOperation<TValue> = TValue | {
5
+ $lt?: TValue;
6
+ $lte?: TValue;
7
+ $gt?: TValue;
8
+ $gte?: TValue;
9
+ $ne?: TValue;
10
+ $in?: Array<TValue>;
11
+ $nin?: Array<TValue>;
12
+ $exists?: boolean;
13
+ $regex?: RegExp | string;
14
+ };
15
+ export declare function findDeletableEvent(eventRegistry: EventRegistry, config: MagekConfig, parameters: EventDeleteParameters): Promise<Array<EventEnvelopeFromDatabase>>;
16
+ export declare function findDeletableSnapshot(eventRegistry: EventRegistry, config: MagekConfig, parameters: SnapshotDeleteParameters): Promise<Array<EntitySnapshotEnvelopeFromDatabase>>;
17
+ export declare function deleteEvent(eventRegistry: EventRegistry, config: MagekConfig, events: Array<EventEnvelopeFromDatabase>): Promise<void>;
18
+ export declare function deleteSnapshot(eventRegistry: EventRegistry, config: MagekConfig, snapshots: Array<EntitySnapshotEnvelopeFromDatabase>): Promise<void>;
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.findDeletableEvent = findDeletableEvent;
4
+ exports.findDeletableSnapshot = findDeletableSnapshot;
5
+ exports.deleteEvent = deleteEvent;
6
+ exports.deleteSnapshot = deleteSnapshot;
7
+ const common_1 = require("@magek/common");
8
+ async function findDeletableEvent(eventRegistry, config, parameters) {
9
+ const logger = (0, common_1.getLogger)(config, 'events-delete-adapter#findDeletableEvent');
10
+ const stringifyParameters = JSON.stringify(parameters);
11
+ logger.debug(`Initiating a deletable event search for ${stringifyParameters}`);
12
+ const filter = buildDeleteEventFilter(parameters.entityTypeName, parameters.entityID, parameters.createdAt);
13
+ const events = (await eventRegistry.query(filter));
14
+ const result = events.map((event) => {
15
+ return {
16
+ ...event,
17
+ id: event._id,
18
+ };
19
+ });
20
+ logger.debug(`Finished deletable event search for ${stringifyParameters}`);
21
+ return result;
22
+ }
23
+ async function findDeletableSnapshot(eventRegistry, config, parameters) {
24
+ const logger = (0, common_1.getLogger)(config, 'events-delete-adapter#findDeletableSnapshot');
25
+ const stringifyParameters = JSON.stringify(parameters);
26
+ logger.debug(`Initiating a deletable snapshot search for ${stringifyParameters}`);
27
+ const filter = buildDeleteEntityFilter(parameters.entityTypeName, parameters.entityID, parameters.createdAt);
28
+ const snapshots = (await eventRegistry.query(filter));
29
+ const result = snapshots.map((snapshot) => {
30
+ return {
31
+ ...snapshot,
32
+ id: snapshot._id,
33
+ };
34
+ });
35
+ logger.debug(`Finished deletable snapshot search for ${stringifyParameters}`);
36
+ return result;
37
+ }
38
+ async function deleteEvent(eventRegistry, config, events) {
39
+ const logger = (0, common_1.getLogger)(config, 'events-delete-adapter#deleteEvent');
40
+ const stringifyParameters = JSON.stringify(events);
41
+ logger.debug(`Initiating an event delete for ${stringifyParameters}`);
42
+ if (!events || events.length === 0) {
43
+ logger.warn('Could not find events to delete');
44
+ return;
45
+ }
46
+ for (const event of events) {
47
+ const newEvent = buildNewEvent(event);
48
+ await eventRegistry.replaceOrDeleteItem(event.id, newEvent);
49
+ }
50
+ logger.debug(`Finished event delete for ${stringifyParameters}`);
51
+ }
52
+ async function deleteSnapshot(eventRegistry, config, snapshots) {
53
+ const logger = (0, common_1.getLogger)(config, 'events-delete-adapter#deleteSnapshot');
54
+ const stringifyParameters = JSON.stringify(snapshots);
55
+ logger.debug(`Initiating a snapshot delete for ${stringifyParameters}`);
56
+ if (!snapshots || snapshots.length === 0) {
57
+ logger.warn('Could not find snapshot to delete');
58
+ return;
59
+ }
60
+ for (const snapshot of snapshots) {
61
+ await eventRegistry.replaceOrDeleteItem(snapshot.id);
62
+ }
63
+ logger.debug(`Finished snapshot delete for ${stringifyParameters}`);
64
+ }
65
+ function buildNewEvent(existingEvent) {
66
+ return {
67
+ ...existingEvent,
68
+ deletedAt: new Date().toISOString(),
69
+ value: {},
70
+ };
71
+ }
72
+ function buildDeleteEventFilter(entityTypeName, entityId, createdAt) {
73
+ return {
74
+ entityID: entityId.toString(),
75
+ entityTypeName: entityTypeName,
76
+ createdAt: createdAt,
77
+ kind: 'event',
78
+ deletedAt: { $exists: false },
79
+ };
80
+ }
81
+ function buildDeleteEntityFilter(entityTypeName, entityId, createdAt) {
82
+ return {
83
+ entityTypeName: entityTypeName,
84
+ entityID: entityId.toString(),
85
+ kind: 'snapshot',
86
+ createdAt: createdAt,
87
+ deletedAt: { $exists: false },
88
+ };
89
+ }
@@ -0,0 +1,12 @@
1
+ import { UUID, UserApp, MagekConfig, EventEnvelope, EntitySnapshotEnvelope, NonPersistedEventEnvelope, NonPersistedEntitySnapshotEnvelope } from '@magek/common';
2
+ import { EventRegistry } from '../event-registry';
3
+ export declare function rawEventsToEnvelopes(rawEvents: Array<unknown>): Array<EventEnvelope>;
4
+ export declare function readEntityEventsSince(eventRegistry: EventRegistry, config: MagekConfig, entityTypeName: string, entityID: UUID, since?: string): Promise<Array<EventEnvelope>>;
5
+ export declare function readEntityLatestSnapshot(eventRegistry: EventRegistry, config: MagekConfig, entityTypeName: string, entityID: UUID): Promise<EntitySnapshotEnvelope | undefined>;
6
+ export declare function storeEvents(userApp: UserApp, eventRegistry: EventRegistry, nonPersistedEventEnvelopes: Array<NonPersistedEventEnvelope>, config: MagekConfig): Promise<Array<EventEnvelope>>;
7
+ export declare function storeSnapshot(eventRegistry: EventRegistry, snapshotEnvelope: NonPersistedEntitySnapshotEnvelope, config: MagekConfig): Promise<EntitySnapshotEnvelope>;
8
+ /**
9
+ * Dummy method that'll always return true, since local provider won't be tracking dispatched events
10
+ */
11
+ export declare function storeDispatchedEvent(): Promise<boolean>;
12
+ export declare function getDatabaseEventsHealthDetails(eventRegistry: EventRegistry): Promise<unknown>;
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.rawEventsToEnvelopes = rawEventsToEnvelopes;
4
+ exports.readEntityEventsSince = readEntityEventsSince;
5
+ exports.readEntityLatestSnapshot = readEntityLatestSnapshot;
6
+ exports.storeEvents = storeEvents;
7
+ exports.storeSnapshot = storeSnapshot;
8
+ exports.storeDispatchedEvent = storeDispatchedEvent;
9
+ exports.getDatabaseEventsHealthDetails = getDatabaseEventsHealthDetails;
10
+ const common_1 = require("@magek/common");
11
+ const event_registry_1 = require("../event-registry");
12
+ const originOfTime = new Date(0).toISOString();
13
+ function rawEventsToEnvelopes(rawEvents) {
14
+ return rawEvents.map((event) => event);
15
+ }
16
+ async function readEntityEventsSince(eventRegistry, config, entityTypeName, entityID, since) {
17
+ const logger = (0, common_1.getLogger)(config, 'events-adapter#readEntityEventsSince');
18
+ const fromTime = since ? since : originOfTime;
19
+ const query = {
20
+ entityID: entityID,
21
+ entityTypeName: entityTypeName,
22
+ kind: 'event',
23
+ createdAt: {
24
+ $gt: fromTime,
25
+ },
26
+ deletedAt: { $exists: false },
27
+ };
28
+ const result = await eventRegistry.query(query);
29
+ logger.debug(`Loaded events for entity ${entityTypeName} with ID ${entityID} with result:`, result);
30
+ return result;
31
+ }
32
+ async function readEntityLatestSnapshot(eventRegistry, config, entityTypeName, entityID) {
33
+ const logger = (0, common_1.getLogger)(config, 'events-adapter#readEntityLatestSnapshot');
34
+ const query = {
35
+ entityID: entityID,
36
+ entityTypeName: entityTypeName,
37
+ kind: 'snapshot',
38
+ };
39
+ const snapshot = await eventRegistry.queryLatestSnapshot(query);
40
+ if (snapshot) {
41
+ logger.debug(`Snapshot found for entity ${entityTypeName} with ID ${entityID}:`, snapshot);
42
+ return snapshot;
43
+ }
44
+ else {
45
+ logger.debug(`No snapshot found for entity ${entityTypeName} with ID ${entityID}.`);
46
+ return undefined;
47
+ }
48
+ }
49
+ async function storeEvents(userApp, eventRegistry, nonPersistedEventEnvelopes, config) {
50
+ const logger = (0, common_1.getLogger)(config, 'events-adapter#storeEvents');
51
+ logger.debug('Storing the following event envelopes:', nonPersistedEventEnvelopes);
52
+ const persistedEventEnvelopes = [];
53
+ for (const nonPersistedEventEnvelope of nonPersistedEventEnvelopes) {
54
+ const persistableEventEnvelope = {
55
+ ...nonPersistedEventEnvelope,
56
+ createdAt: new Date().toISOString(),
57
+ };
58
+ await (0, common_1.retryIfError)(async () => await persistEvent(eventRegistry, persistableEventEnvelope), common_1.OptimisticConcurrencyUnexpectedVersionError);
59
+ persistedEventEnvelopes.push(persistableEventEnvelope);
60
+ }
61
+ logger.debug('EventEnvelopes stored: ', persistedEventEnvelopes);
62
+ await userApp.eventDispatcher(persistedEventEnvelopes);
63
+ return persistedEventEnvelopes;
64
+ }
65
+ async function storeSnapshot(eventRegistry, snapshotEnvelope, config) {
66
+ const logger = (0, common_1.getLogger)(config, 'events-adapter#storeSnapshot');
67
+ logger.debug('Storing the following snapshot envelope:', snapshotEnvelope);
68
+ const persistableEntitySnapshot = {
69
+ ...snapshotEnvelope,
70
+ createdAt: snapshotEnvelope.snapshottedEventCreatedAt,
71
+ persistedAt: new Date().toISOString(),
72
+ };
73
+ await (0, common_1.retryIfError)(() => eventRegistry.store(persistableEntitySnapshot), common_1.OptimisticConcurrencyUnexpectedVersionError);
74
+ logger.debug('Snapshot stored');
75
+ return persistableEntitySnapshot;
76
+ }
77
+ /**
78
+ * Dummy method that'll always return true, since local provider won't be tracking dispatched events
79
+ */
80
+ async function storeDispatchedEvent() {
81
+ return true;
82
+ }
83
+ async function persistEvent(eventRegistry, eventEnvelope) {
84
+ await eventRegistry.store(eventEnvelope);
85
+ }
86
+ async function getDatabaseEventsHealthDetails(eventRegistry) {
87
+ const count = await eventRegistry.count();
88
+ return {
89
+ file: event_registry_1.eventsDatabase,
90
+ count: count,
91
+ };
92
+ }
@@ -0,0 +1,4 @@
1
+ import { MagekConfig, EventSearchParameters, EventSearchResponse, PaginatedEntitiesIdsResult } from '@magek/common';
2
+ import { EventRegistry } from '../event-registry';
3
+ export declare function searchEvents(eventRegistry: EventRegistry, config: MagekConfig, parameters: EventSearchParameters): Promise<Array<EventSearchResponse>>;
4
+ export declare function searchEntitiesIds(eventRegistry: EventRegistry, config: MagekConfig, limit: number, afterCursor: Record<string, string> | undefined, entityTypeName: string): Promise<PaginatedEntitiesIdsResult>;
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.searchEvents = searchEvents;
4
+ exports.searchEntitiesIds = searchEntitiesIds;
5
+ const common_1 = require("@magek/common");
6
+ const events_searcher_builder_1 = require("./events-searcher-builder");
7
+ const DEFAULT_CREATED_AT_SORT_ORDER = -1;
8
+ const DEFAULT_KIND_FILTER = { kind: 'event' };
9
+ async function searchEvents(eventRegistry, config, parameters) {
10
+ const logger = (0, common_1.getLogger)(config, 'events-searcher-adapter#searchEvents');
11
+ logger.debug('Initiating an events search. Filters: ', parameters);
12
+ const timeFilterQuery = (0, events_searcher_builder_1.buildFiltersForByTime)(parameters.from, parameters.to);
13
+ const eventFilterQuery = (0, events_searcher_builder_1.buildFiltersForByFilters)(parameters);
14
+ const filterQuery = { ...eventFilterQuery, ...timeFilterQuery, ...DEFAULT_KIND_FILTER };
15
+ const result = (await eventRegistry.query(filterQuery, DEFAULT_CREATED_AT_SORT_ORDER, parameters.limit));
16
+ const eventsSearchResponses = (0, events_searcher_builder_1.resultToEventSearchResponse)(result);
17
+ logger.debug('Events search result: ', eventsSearchResponses);
18
+ return eventsSearchResponses;
19
+ }
20
+ async function searchEntitiesIds(eventRegistry, config, limit, afterCursor, entityTypeName) {
21
+ var _a;
22
+ const logger = (0, common_1.getLogger)(config, 'events-searcher-adapter#searchEntitiesIds');
23
+ logger.debug(`Initiating a paginated events search. limit: ${limit}, afterCursor: ${JSON.stringify(afterCursor)}, entityTypeName: ${entityTypeName}`);
24
+ const filterQuery = {
25
+ ...DEFAULT_KIND_FILTER,
26
+ entityTypeName: entityTypeName,
27
+ deletedAt: { $exists: false },
28
+ };
29
+ const result = (await eventRegistry.query(filterQuery, DEFAULT_CREATED_AT_SORT_ORDER, undefined, {
30
+ entityID: 1,
31
+ }));
32
+ // Nedb doesn't support DISTINCT, so we need to paginate the results manually
33
+ const entitiesIds = result ? result === null || result === void 0 ? void 0 : result.map((v) => v.entityID) : [];
34
+ const uniqueResult = (0, common_1.unique)(entitiesIds);
35
+ const skipId = (afterCursor === null || afterCursor === void 0 ? void 0 : afterCursor.id) ? parseInt(afterCursor === null || afterCursor === void 0 ? void 0 : afterCursor.id) : 0;
36
+ const paginated = uniqueResult.slice(skipId, skipId + limit);
37
+ const paginatedResult = paginated.map((v) => ({ entityID: v }));
38
+ logger.debug('Unique events search result', paginatedResult);
39
+ return {
40
+ items: paginatedResult,
41
+ count: (_a = paginatedResult === null || paginatedResult === void 0 ? void 0 : paginatedResult.length) !== null && _a !== void 0 ? _a : 0,
42
+ cursor: { id: ((limit ? limit : 1) + skipId).toString() },
43
+ };
44
+ }
@@ -0,0 +1,11 @@
1
+ import { EventEnvelope, EventParametersFilterByEntity, EventParametersFilterByType, EventSearchResponse, UUID } from '@magek/common';
2
+ interface QueryFields {
3
+ createdAt?: unknown;
4
+ entityTypeName?: string;
5
+ entityID?: UUID;
6
+ typeName?: string;
7
+ }
8
+ export declare function buildFiltersForByTime(fromValue?: string, toValue?: string): QueryFields;
9
+ export declare function buildFiltersForByFilters(filters: EventParametersFilterByEntity | EventParametersFilterByType): QueryFields;
10
+ export declare function resultToEventSearchResponse(result: Array<EventEnvelope> | null): Array<EventSearchResponse>;
11
+ export {};
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildFiltersForByTime = buildFiltersForByTime;
4
+ exports.buildFiltersForByFilters = buildFiltersForByFilters;
5
+ exports.resultToEventSearchResponse = resultToEventSearchResponse;
6
+ function buildFiltersForByTime(fromValue, toValue) {
7
+ if (fromValue && toValue) {
8
+ return {
9
+ createdAt: { $gte: fromValue, $lte: toValue },
10
+ };
11
+ }
12
+ else if (fromValue) {
13
+ return {
14
+ createdAt: { $gte: fromValue },
15
+ };
16
+ }
17
+ else if (toValue) {
18
+ return {
19
+ createdAt: { $lte: toValue },
20
+ };
21
+ }
22
+ return {};
23
+ }
24
+ function buildFiltersForByFilters(filters) {
25
+ if ('entity' in filters) {
26
+ if (filters.entityID) {
27
+ return buildByEntityAndID(filters.entity, filters.entityID);
28
+ }
29
+ return buildByEntity(filters.entity);
30
+ }
31
+ else if ('type' in filters) {
32
+ return buildByType(filters.type);
33
+ }
34
+ else {
35
+ throw new Error('Invalid search event query. It is neither an search by "entity" nor a search by "type"');
36
+ }
37
+ }
38
+ function resultToEventSearchResponse(result) {
39
+ if (!result || result.length === 0)
40
+ return [];
41
+ const eventSearchResult = result.map((item) => {
42
+ return {
43
+ type: item.typeName,
44
+ entity: item.entityTypeName,
45
+ entityID: item.entityID,
46
+ requestID: item.requestID,
47
+ user: item.currentUser,
48
+ createdAt: item.createdAt,
49
+ value: item.value,
50
+ deletedAt: item.deletedAt,
51
+ };
52
+ });
53
+ return eventSearchResult !== null && eventSearchResult !== void 0 ? eventSearchResult : [];
54
+ }
55
+ function buildByEntityAndID(entityValue, entityIdValue) {
56
+ return {
57
+ entityTypeName: entityValue,
58
+ entityID: entityIdValue,
59
+ };
60
+ }
61
+ function buildByEntity(entityValue) {
62
+ return {
63
+ entityTypeName: entityValue,
64
+ };
65
+ }
66
+ function buildByType(typeValue) {
67
+ return {
68
+ typeName: typeValue,
69
+ };
70
+ }
@@ -0,0 +1 @@
1
+ export declare const eventsDatabase: string;
package/dist/paths.js ADDED
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.eventsDatabase = void 0;
4
+ const path = require("path");
5
+ exports.eventsDatabase = internalPath('events.json');
6
+ function internalPath(filename) {
7
+ return path.normalize(path.join('.', '.magek', filename));
8
+ }
package/package.json ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "@magek/adapter-event-store-nedb",
3
+ "version": "0.0.1",
4
+ "description": "Nedb-based event store adapter for the Magek framework",
5
+ "keywords": [
6
+ "event-store",
7
+ "nedb"
8
+ ],
9
+ "author": "Boosterin Labs SLU",
10
+ "homepage": "https://magek.ai",
11
+ "license": "Apache-2.0",
12
+ "publishConfig": {
13
+ "access": "public"
14
+ },
15
+ "main": "dist/index.js",
16
+ "files": [
17
+ "dist"
18
+ ],
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "git+https://github.com/theam/magek.git"
22
+ },
23
+ "engines": {
24
+ "node": ">=22.0.0 <23.0.0"
25
+ },
26
+ "dependencies": {
27
+ "@magek/common": "^0.0.1",
28
+ "@seald-io/nedb": "4.1.2",
29
+ "tslib": "2.8.1"
30
+ },
31
+ "bugs": {
32
+ "url": "https://github.com/theam/magek/issues"
33
+ },
34
+ "devDependencies": {
35
+ "@magek/eslint-config": "^0.0.1",
36
+ "@types/chai": "5.2.3",
37
+ "@types/chai-as-promised": "8.0.2",
38
+ "@types/mocha": "10.0.10",
39
+ "@types/node": "22.19.3",
40
+ "@types/sinon": "21.0.0",
41
+ "@types/sinon-chai": "4.0.0",
42
+ "chai": "6.2.2",
43
+ "chai-as-promised": "8.0.2",
44
+ "@faker-js/faker": "10.2.0",
45
+ "mocha": "11.7.5",
46
+ "c8": "^10.1.3",
47
+ "rimraf": "6.1.2",
48
+ "sinon": "21.0.1",
49
+ "sinon-chai": "4.0.1",
50
+ "tsx": "^4.19.2",
51
+ "typescript": "5.9.3"
52
+ },
53
+ "scripts": {
54
+ "format": "prettier --write --ext '.js,.ts' **/*.ts **/*/*.ts",
55
+ "lint:check": "eslint \"**/*.ts\"",
56
+ "lint:fix": "eslint --quiet --fix \"**/*.ts\"",
57
+ "build": "tsc -b tsconfig.json",
58
+ "clean": "rimraf ./dist tsconfig.tsbuildinfo",
59
+ "test": "tsc --noEmit -p tsconfig.test.json && c8 mocha --forbid-only \"test/**/*.test.ts\""
60
+ }
61
+ }