@spytecgps/nova-orm 1.0.12 → 1.0.13

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,5 @@
1
+ import { DeviceStatus } from '../../entities/deviceStatus';
2
+ import { NovaDataSource } from '../../novaDataSource';
3
+ import { GetDeviceStatusesParams } from '../../types/deviceStatus';
4
+ import { Logger } from '../../types/logger';
5
+ export declare const getDeviceStatuses: (novaDataSource: NovaDataSource, params: GetDeviceStatusesParams, logger: Logger) => Promise<DeviceStatus[]>;
@@ -0,0 +1,74 @@
1
+ import { ClientDeviceSetting, Device } from '../../entities';
2
+ import { DeviceStatus } from '../../entities/deviceStatus';
3
+ export const getDeviceStatuses = async (novaDataSource, params, logger) => {
4
+ if (!params?.filters?.imeiList?.length && !params?.filters?.clientId) {
5
+ logger.warn({ params }, 'DeviceStatusRepository::getDevice missing required parameters');
6
+ return [];
7
+ }
8
+ const dsResult = await novaDataSource.safeQuery(async (dataSource) => {
9
+ const deviceStatusRepository = dataSource.getRepository(DeviceStatus);
10
+ let queryBuilder = deviceStatusRepository.createQueryBuilder('deviceStatus');
11
+ if (params.filters.imeiList?.length) {
12
+ queryBuilder = queryBuilder.andWhere('deviceStatus.imei IN (:...imeis)', {
13
+ imeis: params.filters.imeiList,
14
+ });
15
+ }
16
+ if (params.filters.clientId) {
17
+ queryBuilder = queryBuilder.andWhere('deviceStatus.clientId = :clientId', {
18
+ clientId: params.filters.clientId,
19
+ });
20
+ }
21
+ if (params.filters.minSendTime) {
22
+ queryBuilder = queryBuilder.andWhere('deviceStatus.sendTime > :sendTimeMin', {
23
+ sendTimeMin: params.filters.minSendTime,
24
+ });
25
+ }
26
+ if (params.filters.deviceStatus || params.projectionOptions?.withDevice) {
27
+ queryBuilder = queryBuilder.leftJoinAndMapOne('deviceStatus.device', Device, 'device', 'deviceStatus.imei = device.imei and deviceStatus.clientId = device.clientId');
28
+ if (params.filters.deviceStatus) {
29
+ queryBuilder = queryBuilder.andWhere('device.status = :status', {
30
+ status: params.filters.deviceStatus,
31
+ });
32
+ }
33
+ }
34
+ if (params.projectionOptions?.withClient) {
35
+ queryBuilder = queryBuilder.leftJoinAndSelect('deviceStatus.client', 'client');
36
+ }
37
+ if (params.projectionOptions?.withClientDeviceSettings) {
38
+ queryBuilder = queryBuilder.leftJoinAndMapOne('deviceStatus.clientDeviceSetting', ClientDeviceSetting, 'clientDeviceSetting', 'deviceStatus.imei = clientDeviceSetting.imei and deviceStatus.clientId = clientDeviceSetting.clientId');
39
+ }
40
+ const deviceStatuses = await queryBuilder.getMany();
41
+ return deviceStatuses;
42
+ }, 'DeviceStatusRepository::getDevice');
43
+ dsResult.forEach(ds => {
44
+ if (params.projectionOptions?.deviceStatusProperties?.length) {
45
+ for (const key in ds.data) {
46
+ if (!params.projectionOptions?.deviceStatusProperties?.some(p => p == key)) {
47
+ delete ds.data[key];
48
+ }
49
+ }
50
+ }
51
+ if (params.projectionOptions?.deviceProperties?.length) {
52
+ for (const key in ds.device) {
53
+ if (!params.projectionOptions?.deviceProperties?.some(p => p == key)) {
54
+ delete ds.device[key];
55
+ }
56
+ }
57
+ }
58
+ if (params.projectionOptions?.clientProperties?.length) {
59
+ for (const key in ds.client) {
60
+ if (!params.projectionOptions?.clientProperties?.some(p => p == key)) {
61
+ delete ds.client[key];
62
+ }
63
+ }
64
+ }
65
+ if (params.projectionOptions?.clientDeviceSettingsProperties?.length) {
66
+ for (const key in ds.clientDeviceSetting) {
67
+ if (!params.projectionOptions?.clientDeviceSettingsProperties?.some(p => p == key)) {
68
+ delete ds.clientDeviceSetting[key];
69
+ }
70
+ }
71
+ }
72
+ });
73
+ return dsResult;
74
+ };
@@ -0,0 +1,27 @@
1
+ import { DeviceStatus } from '../../entities/deviceStatus';
2
+ import { GetDeviceStatusesParams, UpsertDeviceStatusesParams } from '../../types/deviceStatus';
3
+ import { BaseRepository } from './../baseRepository';
4
+ export declare class DeviceStatusRepository extends BaseRepository {
5
+ /**
6
+ * Get device statuses
7
+ * @param {GetDeviceStatusesParams} params containing information to get device statuses
8
+ * - filters.deviceStatus: The device status
9
+ * - filters.clientId: The client id
10
+ * - filters.imeiList: The imei list
11
+ * - filters.minSendTime: The min send time
12
+ * - projectionOptions.deviceStatusProperties: The device status properties to get
13
+ * - projectionOptions.withDevice: Whether to get the device object
14
+ * - projectionOptions.deviceProperties: The device properties to get
15
+ * - projectionOptions.withClient: Whether to get the client object
16
+ * - projectionOptions.clientProperties: The client properties to get
17
+ * - projectionOptions.withClientDeviceSettings: Whether to get the client device settings
18
+ * - projectionOptions.clientDeviceSettingsProperties: The client device settings properties to get
19
+ */
20
+ getDeviceStatuses(params: GetDeviceStatusesParams): Promise<DeviceStatus[]>;
21
+ /**
22
+ * Upsert the device status information
23
+ * @param {UpsertDeviceStatusesParams} params containing device statuses information
24
+ * - items: The device statuses entities to upsert
25
+ */
26
+ upsertDeviceStatuses(params: UpsertDeviceStatusesParams): Promise<boolean>;
27
+ }
@@ -0,0 +1,40 @@
1
+ import { NovaDataSource } from '../../novaDataSource';
2
+ import { BaseRepository } from './../baseRepository';
3
+ import { getDeviceStatuses } from './getDeviceStatuses';
4
+ import { upsertDeviceStatuses } from './upsertDeviceStatuses';
5
+ export class DeviceStatusRepository extends BaseRepository {
6
+ /**
7
+ * Get device statuses
8
+ * @param {GetDeviceStatusesParams} params containing information to get device statuses
9
+ * - filters.deviceStatus: The device status
10
+ * - filters.clientId: The client id
11
+ * - filters.imeiList: The imei list
12
+ * - filters.minSendTime: The min send time
13
+ * - projectionOptions.deviceStatusProperties: The device status properties to get
14
+ * - projectionOptions.withDevice: Whether to get the device object
15
+ * - projectionOptions.deviceProperties: The device properties to get
16
+ * - projectionOptions.withClient: Whether to get the client object
17
+ * - projectionOptions.clientProperties: The client properties to get
18
+ * - projectionOptions.withClientDeviceSettings: Whether to get the client device settings
19
+ * - projectionOptions.clientDeviceSettingsProperties: The client device settings properties to get
20
+ */
21
+ async getDeviceStatuses(params) {
22
+ this.logger.trace(params, 'DeviceStatusRepository::getDeviceStatus started with params');
23
+ const novaDataSource = new NovaDataSource(this.novaDataSourceConfig, this.logger);
24
+ const result = await getDeviceStatuses(novaDataSource, params, this.logger);
25
+ this.logger.trace(result, 'DeviceStatusRepository::getDeviceStatus result');
26
+ return result;
27
+ }
28
+ /**
29
+ * Upsert the device status information
30
+ * @param {UpsertDeviceStatusesParams} params containing device statuses information
31
+ * - items: The device statuses entities to upsert
32
+ */
33
+ async upsertDeviceStatuses(params) {
34
+ this.logger.trace(params, 'DeviceStatusRepository::upsertDeviceStatus started with params');
35
+ const novaDataSource = new NovaDataSource(this.novaDataSourceConfig, this.logger);
36
+ const result = await upsertDeviceStatuses(novaDataSource, params, this.logger);
37
+ this.logger.trace({ result }, 'DeviceStatusRepository::upsertDeviceStatus result');
38
+ return result;
39
+ }
40
+ }
@@ -0,0 +1,4 @@
1
+ import { NovaDataSource } from '../../novaDataSource';
2
+ import { UpsertDeviceStatusesParams } from '../../types/deviceStatus';
3
+ import { Logger } from '../../types/logger';
4
+ export declare const upsertDeviceStatuses: (novaDataSource: NovaDataSource, params: UpsertDeviceStatusesParams, logger: Logger) => Promise<boolean>;
@@ -0,0 +1,40 @@
1
+ import { DeviceStatus } from '../../entities/deviceStatus';
2
+ export const upsertDeviceStatuses = async (novaDataSource, params, logger) => {
3
+ if (!params?.items?.length) {
4
+ logger.warn({ params }, 'DeviceStatusRepository::upsertDeviceStatus missing required parameters');
5
+ return false;
6
+ }
7
+ return novaDataSource.safeQuery(async (dataSource) => {
8
+ const deviceStatusRepository = dataSource.getRepository(DeviceStatus);
9
+ const deviceStatuses = params.items.map(item => {
10
+ return {
11
+ clientId: item.clientId,
12
+ imei: item.imei,
13
+ created: new Date(item.created),
14
+ sendTime: new Date(item.sendTime),
15
+ data: item,
16
+ };
17
+ });
18
+ const result = await deviceStatusRepository.upsert(deviceStatuses, {
19
+ conflictPaths: ['imei'],
20
+ });
21
+ // const values = deviceStatuses
22
+ // .map(
23
+ // d =>
24
+ // `(${d.imei}, '${d.clientId}', '${d.created}', '${d.sendTime}', '${JSON.stringify(
25
+ // d.data,
26
+ // )}')`,
27
+ // )
28
+ // .join(', ')
29
+ // const query = `
30
+ // INSERT INTO deviceStatus (imei, clientId, created, sendTime, data)
31
+ // VALUES ${values}
32
+ // ON DUPLICATE KEY UPDATE
33
+ // created = IF(VALUES(sendTime) > sendTime, VALUES(created), created),
34
+ // sendTime = IF(VALUES(sendTime) > sendTime, VALUES(sendTime), sendTime),
35
+ // data = IF(VALUES(sendTime) > sendTime, VALUES(data), data);
36
+ // `
37
+ // const result = await deviceStatusRepository.query(query)
38
+ return result?.raw?.affectedRows > 0;
39
+ }, 'DeviceStatusRepository::upsertDeviceStatus');
40
+ };
@@ -14,6 +14,7 @@ import { DeactivationsRepository } from './deactivations';
14
14
  import { DeviceBehaviorsRepository } from './deviceBehaviors';
15
15
  import { DevicePairingsRepository } from './devicePairings';
16
16
  import { DevicesRepository } from './devices';
17
+ import { DeviceStatusRepository } from './deviceStatus';
17
18
  import { FirmwaresRepository } from './firmwares';
18
19
  import { NotificationRecipientsRepository } from './notificationRecipients';
19
20
  import { PositionRepository } from './positions';
@@ -29,4 +30,4 @@ import { UserInvitationsRepository } from './userInvitations';
29
30
  import { UserRatingRequestsRepository } from './userRatingRequests';
30
31
  import { UserRegistrationAttemptsRepository } from './userRegistrationAttempts';
31
32
  import { UsersRepository } from './users';
32
- export { AcumaticaRepository, AempTokenRepository, AlertRepository, AlertTypesRepository, AppFeaturesRepository, AssetCategoriesRepository, BillingRepository, BlacklistRepository, BLEMeshConfigurationRepository, BoundariesRepository, ClientsRepository, CountriesRepository, DeactivationsRepository, DeviceBehaviorsRepository, DevicePairingsRepository, DevicesRepository, FirmwaresRepository, NotificationRecipientsRepository, PositionRepository, SecurityRepository, TasksRepository, TripRepository, UserActivationsRepository, UserAppFeedbackRepository, UserAppIncidentsRepository, UserConfigurationsRepository, UserDataDeletionRequestsRepository, UserInvitationsRepository, UserRatingRequestsRepository, UserRegistrationAttemptsRepository, UsersRepository, };
33
+ export { AcumaticaRepository, AempTokenRepository, AlertRepository, AlertTypesRepository, AppFeaturesRepository, AssetCategoriesRepository, BillingRepository, BlacklistRepository, BLEMeshConfigurationRepository, BoundariesRepository, ClientsRepository, CountriesRepository, DeactivationsRepository, DeviceStatusRepository, DeviceBehaviorsRepository, DevicePairingsRepository, DevicesRepository, FirmwaresRepository, NotificationRecipientsRepository, PositionRepository, SecurityRepository, TasksRepository, TripRepository, UserActivationsRepository, UserAppFeedbackRepository, UserAppIncidentsRepository, UserConfigurationsRepository, UserDataDeletionRequestsRepository, UserInvitationsRepository, UserRatingRequestsRepository, UserRegistrationAttemptsRepository, UsersRepository, };
@@ -14,6 +14,7 @@ import { DeactivationsRepository } from './deactivations';
14
14
  import { DeviceBehaviorsRepository } from './deviceBehaviors';
15
15
  import { DevicePairingsRepository } from './devicePairings';
16
16
  import { DevicesRepository } from './devices';
17
+ import { DeviceStatusRepository } from './deviceStatus';
17
18
  import { FirmwaresRepository } from './firmwares';
18
19
  import { NotificationRecipientsRepository } from './notificationRecipients';
19
20
  import { PositionRepository } from './positions';
@@ -29,4 +30,4 @@ import { UserInvitationsRepository } from './userInvitations';
29
30
  import { UserRatingRequestsRepository } from './userRatingRequests';
30
31
  import { UserRegistrationAttemptsRepository } from './userRegistrationAttempts';
31
32
  import { UsersRepository } from './users';
32
- export { AcumaticaRepository, AempTokenRepository, AlertRepository, AlertTypesRepository, AppFeaturesRepository, AssetCategoriesRepository, BillingRepository, BlacklistRepository, BLEMeshConfigurationRepository, BoundariesRepository, ClientsRepository, CountriesRepository, DeactivationsRepository, DeviceBehaviorsRepository, DevicePairingsRepository, DevicesRepository, FirmwaresRepository, NotificationRecipientsRepository, PositionRepository, SecurityRepository, TasksRepository, TripRepository, UserActivationsRepository, UserAppFeedbackRepository, UserAppIncidentsRepository, UserConfigurationsRepository, UserDataDeletionRequestsRepository, UserInvitationsRepository, UserRatingRequestsRepository, UserRegistrationAttemptsRepository, UsersRepository, };
33
+ export { AcumaticaRepository, AempTokenRepository, AlertRepository, AlertTypesRepository, AppFeaturesRepository, AssetCategoriesRepository, BillingRepository, BlacklistRepository, BLEMeshConfigurationRepository, BoundariesRepository, ClientsRepository, CountriesRepository, DeactivationsRepository, DeviceStatusRepository, DeviceBehaviorsRepository, DevicePairingsRepository, DevicesRepository, FirmwaresRepository, NotificationRecipientsRepository, PositionRepository, SecurityRepository, TasksRepository, TripRepository, UserActivationsRepository, UserAppFeedbackRepository, UserAppIncidentsRepository, UserConfigurationsRepository, UserDataDeletionRequestsRepository, UserInvitationsRepository, UserRatingRequestsRepository, UserRegistrationAttemptsRepository, UsersRepository, };
@@ -0,0 +1,29 @@
1
+ import { Client, ClientDeviceSetting, Device } from '../entities';
2
+ import { Enums } from '.';
3
+ interface DeviceStatusEntity {
4
+ imei: string;
5
+ clientId: number;
6
+ created: string;
7
+ sendTime: string;
8
+ }
9
+ export interface GetDeviceStatusesParams {
10
+ filters: {
11
+ imeiList?: string[];
12
+ clientId?: number;
13
+ minSendTime?: Date;
14
+ deviceStatus?: Enums.DeviceStatus;
15
+ };
16
+ projectionOptions?: {
17
+ deviceStatusProperties?: string[];
18
+ withClient?: boolean;
19
+ clientProperties?: (keyof Client)[];
20
+ withDevice?: boolean;
21
+ deviceProperties?: (keyof Device)[];
22
+ withClientDeviceSettings?: boolean;
23
+ clientDeviceSettingsProperties?: (keyof ClientDeviceSetting)[];
24
+ };
25
+ }
26
+ export interface UpsertDeviceStatusesParams {
27
+ items: DeviceStatusEntity[];
28
+ }
29
+ export {};
@@ -0,0 +1 @@
1
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spytecgps/nova-orm",
3
- "version": "1.0.12",
3
+ "version": "1.0.13",
4
4
  "description": "ORM with PlanetScale",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",