@tmscloud/tbt-knex 0.0.1 → 0.0.3
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/.github/workflows/build-and-push.yml +118 -0
- package/Dockerfile +36 -0
- package/build-image.sh +16 -0
- package/dist/dao/driver-tracking/driver-tracking.dao.d.ts +17 -12
- package/dist/dao/driver-tracking/driver-tracking.dao.js +107 -123
- package/dist/dao/driver-tracking/driver-tracking.dao.js.map +1 -1
- package/dist/dao/event/event.dao.d.ts +38 -0
- package/dist/dao/event/event.dao.js +156 -0
- package/dist/dao/event/event.dao.js.map +1 -0
- package/dist/dao/route/route.dao.d.ts +10 -2
- package/dist/dao/route/route.dao.js +94 -9
- package/dist/dao/route/route.dao.js.map +1 -1
- package/dist/dao/trip/trip.dao.d.ts +5 -0
- package/dist/dao/trip/trip.dao.js +10 -0
- package/dist/dao/trip/trip.dao.js.map +1 -1
- package/dist/dao/trip-track/trip-track.dao.d.ts +49 -0
- package/dist/dao/trip-track/trip-track.dao.js +252 -0
- package/dist/dao/trip-track/trip-track.dao.js.map +1 -0
- package/dist/index.d.ts +12 -10
- package/dist/index.js +13 -11
- package/dist/index.js.map +1 -1
- package/dist/interfaces/driver-tracking/driver-tracking.interfaces.d.ts +23 -44
- package/dist/interfaces/event/event.interfaces.d.ts +22 -0
- package/dist/interfaces/{gps-location/gps-location.interfaces.js → event/event.interfaces.js} +1 -1
- package/dist/interfaces/event/event.interfaces.js.map +1 -0
- package/dist/interfaces/route/route.interfaces.d.ts +3 -0
- package/dist/interfaces/trip/trip.interfaces.d.ts +2 -0
- package/dist/interfaces/trip-track/trip-track.interfaces.d.ts +82 -0
- package/dist/interfaces/trip-track/trip-track.interfaces.js +3 -0
- package/dist/interfaces/trip-track/trip-track.interfaces.js.map +1 -0
- package/package.json +1 -1
- package/dist/dao/gps-location/gps-location.dao.d.ts +0 -76
- package/dist/dao/gps-location/gps-location.dao.js +0 -364
- package/dist/dao/gps-location/gps-location.dao.js.map +0 -1
- package/dist/interfaces/gps-location/gps-location.interfaces.d.ts +0 -30
- package/dist/interfaces/gps-location/gps-location.interfaces.js.map +0 -1
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
name: Build and Push to ECR
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches:
|
|
6
|
+
- main
|
|
7
|
+
|
|
8
|
+
# Shared constants
|
|
9
|
+
env:
|
|
10
|
+
AWS_REGION: us-east-1
|
|
11
|
+
ECR_REPOSITORY: tms-tbt-migration
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
build_and_push:
|
|
15
|
+
name: Build and Push Migrations Image
|
|
16
|
+
runs-on: ubuntu-latest
|
|
17
|
+
environment: development
|
|
18
|
+
concurrency: build-push
|
|
19
|
+
|
|
20
|
+
permissions:
|
|
21
|
+
id-token: write
|
|
22
|
+
contents: read
|
|
23
|
+
|
|
24
|
+
steps:
|
|
25
|
+
- name: Checkout
|
|
26
|
+
uses: actions/checkout@v4
|
|
27
|
+
|
|
28
|
+
- name: Compute image tags
|
|
29
|
+
id: tags
|
|
30
|
+
run: |
|
|
31
|
+
# Compute timestamp in UTC (YYYYmmdd-HHMM format)
|
|
32
|
+
TIMESTAMP=$(date -u +'%Y.%m.%d-%H%M')
|
|
33
|
+
echo "timestamp=$TIMESTAMP" >> $GITHUB_OUTPUT
|
|
34
|
+
|
|
35
|
+
# Compute short and full SHA
|
|
36
|
+
SHORT_SHA=$(git rev-parse --short HEAD)
|
|
37
|
+
FULL_SHA=$(git rev-parse HEAD)
|
|
38
|
+
echo "short_sha=$SHORT_SHA" >> $GITHUB_OUTPUT
|
|
39
|
+
echo "full_sha=$FULL_SHA" >> $GITHUB_OUTPUT
|
|
40
|
+
|
|
41
|
+
# Compute immutable image tags
|
|
42
|
+
CI_TAG="ci-${TIMESTAMP}-${SHORT_SHA}"
|
|
43
|
+
SHA_TAG="sha-${FULL_SHA}"
|
|
44
|
+
echo "ci_tag=$CI_TAG" >> $GITHUB_OUTPUT
|
|
45
|
+
echo "sha_tag=$SHA_TAG" >> $GITHUB_OUTPUT
|
|
46
|
+
|
|
47
|
+
echo "## Image Tags" >> $GITHUB_STEP_SUMMARY
|
|
48
|
+
echo "- CI Tag: \`$CI_TAG\`" >> $GITHUB_STEP_SUMMARY
|
|
49
|
+
echo "- SHA Tag: \`$SHA_TAG\`" >> $GITHUB_STEP_SUMMARY
|
|
50
|
+
echo "- Commit: \`$FULL_SHA\`" >> $GITHUB_STEP_SUMMARY
|
|
51
|
+
|
|
52
|
+
- name: Configure AWS credentials
|
|
53
|
+
uses: aws-actions/configure-aws-credentials@v4
|
|
54
|
+
with:
|
|
55
|
+
# SOURCE OF TRUTH: GitHub Environment Secret (global)
|
|
56
|
+
role-to-assume: ${{ secrets.DEVELOPMENT_AWS_ROLE_TO_ASUME_OIDC }}
|
|
57
|
+
aws-region: ${{ env.AWS_REGION }}
|
|
58
|
+
|
|
59
|
+
- name: Login to Amazon ECR
|
|
60
|
+
id: login-ecr
|
|
61
|
+
uses: aws-actions/amazon-ecr-login@v2
|
|
62
|
+
|
|
63
|
+
- name: Build Docker image
|
|
64
|
+
id: build-image
|
|
65
|
+
env:
|
|
66
|
+
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
|
|
67
|
+
CI_TAG: ${{ steps.tags.outputs.ci_tag }}
|
|
68
|
+
SHA_TAG: ${{ steps.tags.outputs.sha_tag }}
|
|
69
|
+
run: |
|
|
70
|
+
echo "Building image for linux/amd64..."
|
|
71
|
+
docker buildx build \
|
|
72
|
+
--platform linux/amd64 \
|
|
73
|
+
-t $ECR_REGISTRY/$ECR_REPOSITORY:$CI_TAG \
|
|
74
|
+
-t $ECR_REGISTRY/$ECR_REPOSITORY:$SHA_TAG \
|
|
75
|
+
--load \
|
|
76
|
+
.
|
|
77
|
+
|
|
78
|
+
# Output the canonical deployment tag
|
|
79
|
+
echo "image=$ECR_REGISTRY/$ECR_REPOSITORY:$SHA_TAG" >> $GITHUB_OUTPUT
|
|
80
|
+
|
|
81
|
+
- name: Push image tags to Amazon ECR
|
|
82
|
+
env:
|
|
83
|
+
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
|
|
84
|
+
CI_TAG: ${{ steps.tags.outputs.ci_tag }}
|
|
85
|
+
SHA_TAG: ${{ steps.tags.outputs.sha_tag }}
|
|
86
|
+
run: |
|
|
87
|
+
echo "Pushing immutable tags to ECR..."
|
|
88
|
+
docker push $ECR_REGISTRY/$ECR_REPOSITORY:$CI_TAG
|
|
89
|
+
docker push $ECR_REGISTRY/$ECR_REPOSITORY:$SHA_TAG
|
|
90
|
+
|
|
91
|
+
echo "## Pushed Images" >> $GITHUB_STEP_SUMMARY
|
|
92
|
+
echo "- \`$ECR_REGISTRY/$ECR_REPOSITORY:$CI_TAG\`" >> $GITHUB_STEP_SUMMARY
|
|
93
|
+
echo "- \`$ECR_REGISTRY/$ECR_REPOSITORY:$SHA_TAG\`" >> $GITHUB_STEP_SUMMARY
|
|
94
|
+
|
|
95
|
+
- name: Build Summary
|
|
96
|
+
env:
|
|
97
|
+
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
|
|
98
|
+
CI_TAG: ${{ steps.tags.outputs.ci_tag }}
|
|
99
|
+
SHA_TAG: ${{ steps.tags.outputs.sha_tag }}
|
|
100
|
+
FULL_SHA: ${{ steps.tags.outputs.full_sha }}
|
|
101
|
+
run: |
|
|
102
|
+
echo "## ✅ Build and Push Complete" >> $GITHUB_STEP_SUMMARY
|
|
103
|
+
echo "" >> $GITHUB_STEP_SUMMARY
|
|
104
|
+
echo "### Build Details" >> $GITHUB_STEP_SUMMARY
|
|
105
|
+
echo "- **Commit SHA**: \`$FULL_SHA\`" >> $GITHUB_STEP_SUMMARY
|
|
106
|
+
echo "- **ECR Repository**: \`$ECR_REPOSITORY\`" >> $GITHUB_STEP_SUMMARY
|
|
107
|
+
echo "" >> $GITHUB_STEP_SUMMARY
|
|
108
|
+
echo "### Immutable Image Tags" >> $GITHUB_STEP_SUMMARY
|
|
109
|
+
echo "" >> $GITHUB_STEP_SUMMARY
|
|
110
|
+
echo "**SHA Tag (recommended for deployment):**" >> $GITHUB_STEP_SUMMARY
|
|
111
|
+
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
|
|
112
|
+
echo "$ECR_REGISTRY/$ECR_REPOSITORY:$SHA_TAG" >> $GITHUB_STEP_SUMMARY
|
|
113
|
+
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
|
|
114
|
+
echo "" >> $GITHUB_STEP_SUMMARY
|
|
115
|
+
echo "**CI Tag (with timestamp):**" >> $GITHUB_STEP_SUMMARY
|
|
116
|
+
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
|
|
117
|
+
echo "$ECR_REGISTRY/$ECR_REPOSITORY:$CI_TAG" >> $GITHUB_STEP_SUMMARY
|
|
118
|
+
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
|
package/Dockerfile
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# ==============================================
|
|
2
|
+
# Knex Migrations Container (Optimized)
|
|
3
|
+
# ==============================================
|
|
4
|
+
# Note: This container needs TypeScript support since migrations are in TS
|
|
5
|
+
# It's a short-lived container, so optimization focus is on build speed
|
|
6
|
+
FROM node:22-alpine
|
|
7
|
+
|
|
8
|
+
WORKDIR /app
|
|
9
|
+
|
|
10
|
+
# Install only needed dependencies
|
|
11
|
+
COPY package*.json ./
|
|
12
|
+
RUN npm ci && \
|
|
13
|
+
npm cache clean --force
|
|
14
|
+
|
|
15
|
+
# Copy TypeScript configuration
|
|
16
|
+
COPY tsconfig.json ./
|
|
17
|
+
|
|
18
|
+
# Copy knexfile and migrations
|
|
19
|
+
COPY knexfile.ts ./
|
|
20
|
+
COPY migrations ./migrations
|
|
21
|
+
|
|
22
|
+
# Copy source code (needed for imports in migrations)
|
|
23
|
+
COPY src ./src
|
|
24
|
+
|
|
25
|
+
# Set environment to production
|
|
26
|
+
ENV NODE_ENV=production
|
|
27
|
+
|
|
28
|
+
# Create non-root user
|
|
29
|
+
RUN addgroup -g 1001 -S nodejs && \
|
|
30
|
+
adduser -S nodejs -u 1001 && \
|
|
31
|
+
chown -R nodejs:nodejs /app
|
|
32
|
+
|
|
33
|
+
USER nodejs
|
|
34
|
+
|
|
35
|
+
# Default command runs migrations
|
|
36
|
+
CMD ["npx", "knex", "migrate:latest"]
|
package/build-image.sh
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
# Build the Docker image for local development
|
|
4
|
+
# Use --platform to ensure linux/amd64 compatibility for AWS ECS/Fargate
|
|
5
|
+
IMAGE_NAME='tms-tbt-knex'
|
|
6
|
+
TAG='first'
|
|
7
|
+
docker buildx build --platform linux/amd64 -t $IMAGE_NAME:$TAG --load .
|
|
8
|
+
|
|
9
|
+
echo "✓ Image built successfully: $IMAGE_NAME:$TAG"
|
|
10
|
+
echo ""
|
|
11
|
+
echo "To use this image in another docker-compose.yml:"
|
|
12
|
+
echo " services:"
|
|
13
|
+
echo " migrations:"
|
|
14
|
+
echo " image: $IMAGE_NAME:$TAG"
|
|
15
|
+
|
|
16
|
+
# docker tag tms-tbt-knex:first 937623187882.dkr.ecr.us-east-1.amazonaws.com/tms-tbt-migration:first
|
|
@@ -1,24 +1,21 @@
|
|
|
1
|
-
import { IDriverTracking,
|
|
1
|
+
import { IDriverTracking, IDriverTrackingBatchCreate, IActiveDriver, ITrackingSession, ITrackingFilters } from "../../interfaces/driver-tracking/driver-tracking.interfaces";
|
|
2
|
+
import { ITrackPoint } from "../../interfaces/trip-track/trip-track.interfaces";
|
|
2
3
|
import { IDataPaginator } from "../../d.types";
|
|
3
4
|
export declare class DriverTrackingDAO {
|
|
4
5
|
private _knex?;
|
|
5
6
|
private get knex();
|
|
6
7
|
/**
|
|
7
|
-
*
|
|
8
|
+
* Batch create tracking points (for mobile uploads)
|
|
8
9
|
*/
|
|
9
|
-
|
|
10
|
+
createBatch(batch: IDriverTrackingBatchCreate): Promise<number>;
|
|
10
11
|
/**
|
|
11
|
-
*
|
|
12
|
+
* Get all tracking points for a trip (for consolidation)
|
|
12
13
|
*/
|
|
13
|
-
|
|
14
|
+
getByTripId(tripId: number): Promise<IDriverTracking[]>;
|
|
14
15
|
/**
|
|
15
16
|
* Get tracking points by session ID (for playback)
|
|
16
17
|
*/
|
|
17
18
|
getBySessionId(sessionId: string, page?: number, limit?: number): Promise<IDataPaginator<IDriverTracking>>;
|
|
18
|
-
/**
|
|
19
|
-
* Get tracking points with filters
|
|
20
|
-
*/
|
|
21
|
-
getWithFilters(filters: ITrackingFilters, page?: number, limit?: number): Promise<IDataPaginator<IDriverTracking>>;
|
|
22
19
|
/**
|
|
23
20
|
* Get all active drivers (currently navigating)
|
|
24
21
|
*/
|
|
@@ -27,6 +24,10 @@ export declare class DriverTrackingDAO {
|
|
|
27
24
|
* Get tracking sessions list
|
|
28
25
|
*/
|
|
29
26
|
getSessions(filters: ITrackingFilters, page?: number, limit?: number): Promise<IDataPaginator<ITrackingSession>>;
|
|
27
|
+
/**
|
|
28
|
+
* Get tracking points with filters
|
|
29
|
+
*/
|
|
30
|
+
getWithFilters(filters: ITrackingFilters, page?: number, limit?: number): Promise<IDataPaginator<IDriverTracking>>;
|
|
30
31
|
/**
|
|
31
32
|
* End a tracking session (mark points as not navigating)
|
|
32
33
|
*/
|
|
@@ -34,9 +35,13 @@ export declare class DriverTrackingDAO {
|
|
|
34
35
|
/**
|
|
35
36
|
* Get latest location for a user
|
|
36
37
|
*/
|
|
37
|
-
|
|
38
|
+
getLatestByUserId(userId: number): Promise<IDriverTracking | null>;
|
|
39
|
+
/**
|
|
40
|
+
* Delete all tracking points for a trip (after consolidation)
|
|
41
|
+
*/
|
|
42
|
+
deleteByTripId(tripId: number): Promise<number>;
|
|
38
43
|
/**
|
|
39
|
-
*
|
|
44
|
+
* Convert driver tracking records to ITrackPoint array (for consolidation)
|
|
40
45
|
*/
|
|
41
|
-
|
|
46
|
+
toTrackPoints(points: IDriverTracking[]): ITrackPoint[];
|
|
42
47
|
}
|
|
@@ -22,41 +22,15 @@ class DriverTrackingDAO {
|
|
|
22
22
|
}
|
|
23
23
|
return this._knex;
|
|
24
24
|
}
|
|
25
|
-
/**
|
|
26
|
-
* Create a single tracking point
|
|
27
|
-
*/
|
|
28
|
-
create(data) {
|
|
29
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
30
|
-
var _a;
|
|
31
|
-
const [result] = yield this.knex("driver_tracking")
|
|
32
|
-
.insert({
|
|
33
|
-
uuid: (0, uuid_1.v4)(),
|
|
34
|
-
user_id: data.user_id,
|
|
35
|
-
assignment_id: data.assignment_id || null,
|
|
36
|
-
route_id: data.route_id || null,
|
|
37
|
-
session_id: data.session_id,
|
|
38
|
-
latitude: data.latitude,
|
|
39
|
-
longitude: data.longitude,
|
|
40
|
-
accuracy: data.accuracy || null,
|
|
41
|
-
altitude: data.altitude || null,
|
|
42
|
-
speed: data.speed || null,
|
|
43
|
-
heading: data.heading || null,
|
|
44
|
-
recorded_at: data.recorded_at,
|
|
45
|
-
is_navigating: (_a = data.is_navigating) !== null && _a !== void 0 ? _a : true,
|
|
46
|
-
metadata: data.metadata ? JSON.stringify(data.metadata) : null,
|
|
47
|
-
})
|
|
48
|
-
.returning("*");
|
|
49
|
-
return result;
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
25
|
/**
|
|
53
26
|
* Batch create tracking points (for mobile uploads)
|
|
54
27
|
*/
|
|
55
|
-
createBatch(
|
|
28
|
+
createBatch(batch) {
|
|
56
29
|
return __awaiter(this, void 0, void 0, function* () {
|
|
57
30
|
const records = batch.points.map((point) => ({
|
|
58
31
|
uuid: (0, uuid_1.v4)(),
|
|
59
|
-
user_id:
|
|
32
|
+
user_id: batch.user_id,
|
|
33
|
+
trip_id: batch.trip_id,
|
|
60
34
|
assignment_id: batch.assignment_id || null,
|
|
61
35
|
route_id: batch.route_id || null,
|
|
62
36
|
session_id: batch.session_id,
|
|
@@ -70,15 +44,25 @@ class DriverTrackingDAO {
|
|
|
70
44
|
is_navigating: true,
|
|
71
45
|
metadata: point.metadata ? JSON.stringify(point.metadata) : null,
|
|
72
46
|
}));
|
|
73
|
-
|
|
47
|
+
yield this.knex("driver_tracking").insert(records);
|
|
74
48
|
return records.length;
|
|
75
49
|
});
|
|
76
50
|
}
|
|
51
|
+
/**
|
|
52
|
+
* Get all tracking points for a trip (for consolidation)
|
|
53
|
+
*/
|
|
54
|
+
getByTripId(tripId) {
|
|
55
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
56
|
+
return this.knex("driver_tracking")
|
|
57
|
+
.where("trip_id", tripId)
|
|
58
|
+
.orderBy("recorded_at", "asc");
|
|
59
|
+
});
|
|
60
|
+
}
|
|
77
61
|
/**
|
|
78
62
|
* Get tracking points by session ID (for playback)
|
|
79
63
|
*/
|
|
80
64
|
getBySessionId(sessionId_1) {
|
|
81
|
-
return __awaiter(this, arguments, void 0, function* (sessionId, page = 1, limit =
|
|
65
|
+
return __awaiter(this, arguments, void 0, function* (sessionId, page = 1, limit = 5000) {
|
|
82
66
|
const offset = (page - 1) * limit;
|
|
83
67
|
const data = yield this.knex("driver_tracking")
|
|
84
68
|
.where("session_id", sessionId)
|
|
@@ -102,74 +86,11 @@ class DriverTrackingDAO {
|
|
|
102
86
|
};
|
|
103
87
|
});
|
|
104
88
|
}
|
|
105
|
-
/**
|
|
106
|
-
* Get tracking points with filters
|
|
107
|
-
*/
|
|
108
|
-
getWithFilters(filters_1) {
|
|
109
|
-
return __awaiter(this, arguments, void 0, function* (filters, page = 1, limit = 100) {
|
|
110
|
-
const offset = (page - 1) * limit;
|
|
111
|
-
let query = this.knex("driver_tracking as dt")
|
|
112
|
-
.leftJoin("users as u", "dt.user_id", "u.id")
|
|
113
|
-
.select("dt.*", this.knex.raw(`jsonb_build_object(
|
|
114
|
-
'id', u.id,
|
|
115
|
-
'uuid', u.uuid,
|
|
116
|
-
'email', u.email,
|
|
117
|
-
'username', u.username,
|
|
118
|
-
'first_name', u.first_name,
|
|
119
|
-
'last_name', u.last_name
|
|
120
|
-
) as user`));
|
|
121
|
-
// Apply filters
|
|
122
|
-
if (filters.user_id) {
|
|
123
|
-
query = query.where("dt.user_id", filters.user_id);
|
|
124
|
-
}
|
|
125
|
-
if (filters.assignment_id) {
|
|
126
|
-
query = query.where("dt.assignment_id", filters.assignment_id);
|
|
127
|
-
}
|
|
128
|
-
if (filters.route_id) {
|
|
129
|
-
query = query.where("dt.route_id", filters.route_id);
|
|
130
|
-
}
|
|
131
|
-
if (filters.session_id) {
|
|
132
|
-
query = query.where("dt.session_id", filters.session_id);
|
|
133
|
-
}
|
|
134
|
-
if (filters.from_date) {
|
|
135
|
-
query = query.where("dt.recorded_at", ">=", filters.from_date);
|
|
136
|
-
}
|
|
137
|
-
if (filters.to_date) {
|
|
138
|
-
query = query.where("dt.recorded_at", "<=", filters.to_date);
|
|
139
|
-
}
|
|
140
|
-
if (filters.is_navigating !== undefined) {
|
|
141
|
-
query = query.where("dt.is_navigating", filters.is_navigating);
|
|
142
|
-
}
|
|
143
|
-
// Get count before pagination
|
|
144
|
-
const countQuery = query.clone();
|
|
145
|
-
const totalCountResult = yield countQuery
|
|
146
|
-
.clearSelect()
|
|
147
|
-
.count("dt.id as count")
|
|
148
|
-
.first();
|
|
149
|
-
const totalCount = Number((totalCountResult === null || totalCountResult === void 0 ? void 0 : totalCountResult.count) || 0);
|
|
150
|
-
// Get paginated data
|
|
151
|
-
const data = yield query
|
|
152
|
-
.orderBy("dt.recorded_at", "desc")
|
|
153
|
-
.limit(limit)
|
|
154
|
-
.offset(offset);
|
|
155
|
-
const totalPages = Math.ceil(totalCount / limit);
|
|
156
|
-
return {
|
|
157
|
-
success: true,
|
|
158
|
-
data,
|
|
159
|
-
page,
|
|
160
|
-
limit,
|
|
161
|
-
count: data.length,
|
|
162
|
-
totalCount,
|
|
163
|
-
totalPages,
|
|
164
|
-
};
|
|
165
|
-
});
|
|
166
|
-
}
|
|
167
89
|
/**
|
|
168
90
|
* Get all active drivers (currently navigating)
|
|
169
91
|
*/
|
|
170
92
|
getActiveDrivers() {
|
|
171
93
|
return __awaiter(this, void 0, void 0, function* () {
|
|
172
|
-
// Get the latest tracking point for each user who is currently navigating
|
|
173
94
|
const subquery = this.knex("driver_tracking")
|
|
174
95
|
.select("user_id")
|
|
175
96
|
.max("recorded_at as max_recorded_at")
|
|
@@ -181,27 +102,22 @@ class DriverTrackingDAO {
|
|
|
181
102
|
this.on("dt.user_id", "=", "latest.user_id").andOn("dt.recorded_at", "=", "latest.max_recorded_at");
|
|
182
103
|
})
|
|
183
104
|
.leftJoin("users as u", "dt.user_id", "u.id")
|
|
105
|
+
.leftJoin("trips as t", "dt.trip_id", "t.id")
|
|
184
106
|
.leftJoin("route_assignments as ra", "dt.assignment_id", "ra.id")
|
|
185
|
-
.leftJoin("routes as r", "
|
|
186
|
-
.select("dt.
|
|
187
|
-
'id', u.id,
|
|
107
|
+
.leftJoin("routes as r", "dt.route_id", "r.id")
|
|
108
|
+
.select("dt.session_id", "dt.latitude", "dt.longitude", "dt.heading", "dt.speed", "dt.recorded_at", this.knex.raw("t.uuid as trip_uuid"), this.knex.raw("ra.uuid as assignment_uuid"), this.knex.raw("r.uuid as route_uuid"), this.knex.raw(`jsonb_build_object(
|
|
188
109
|
'uuid', u.uuid,
|
|
189
110
|
'email', u.email,
|
|
190
111
|
'username', u.username,
|
|
191
112
|
'first_name', u.first_name,
|
|
192
113
|
'last_name', u.last_name
|
|
193
|
-
) as user`)
|
|
194
|
-
'id', ra.id,
|
|
195
|
-
'uuid', ra.uuid,
|
|
196
|
-
'status', ra.status,
|
|
197
|
-
'route', jsonb_build_object('id', r.id, 'uuid', r.uuid, 'name', r.name)
|
|
198
|
-
) ELSE NULL END as assignment`));
|
|
114
|
+
) as user`));
|
|
199
115
|
return results.map((row) => ({
|
|
200
|
-
user_id: row.user_id,
|
|
201
116
|
user: row.user,
|
|
202
117
|
session_id: row.session_id,
|
|
203
|
-
|
|
204
|
-
|
|
118
|
+
trip_uuid: row.trip_uuid,
|
|
119
|
+
assignment_uuid: row.assignment_uuid || null,
|
|
120
|
+
route_uuid: row.route_uuid || null,
|
|
205
121
|
current_location: {
|
|
206
122
|
latitude: parseFloat(row.latitude),
|
|
207
123
|
longitude: parseFloat(row.longitude),
|
|
@@ -209,7 +125,6 @@ class DriverTrackingDAO {
|
|
|
209
125
|
speed: row.speed ? parseFloat(row.speed) : null,
|
|
210
126
|
recorded_at: row.recorded_at,
|
|
211
127
|
},
|
|
212
|
-
is_navigating: row.is_navigating,
|
|
213
128
|
}));
|
|
214
129
|
});
|
|
215
130
|
}
|
|
@@ -220,13 +135,16 @@ class DriverTrackingDAO {
|
|
|
220
135
|
return __awaiter(this, arguments, void 0, function* (filters, page = 1, limit = 20) {
|
|
221
136
|
const offset = (page - 1) * limit;
|
|
222
137
|
let query = this.knex("driver_tracking as dt")
|
|
223
|
-
.select("dt.session_id", "dt.user_id", "dt.assignment_id", "dt.route_id")
|
|
138
|
+
.select("dt.session_id", "dt.user_id", "dt.trip_id", "dt.assignment_id", "dt.route_id")
|
|
224
139
|
.select(this.knex.raw("MIN(dt.recorded_at) as started_at"), this.knex.raw("MAX(dt.recorded_at) as ended_at"), this.knex.raw("COUNT(*) as total_points"))
|
|
225
|
-
.groupBy("dt.session_id", "dt.user_id", "dt.assignment_id", "dt.route_id");
|
|
140
|
+
.groupBy("dt.session_id", "dt.user_id", "dt.trip_id", "dt.assignment_id", "dt.route_id");
|
|
226
141
|
// Apply filters
|
|
227
142
|
if (filters.user_id) {
|
|
228
143
|
query = query.where("dt.user_id", filters.user_id);
|
|
229
144
|
}
|
|
145
|
+
if (filters.trip_id) {
|
|
146
|
+
query = query.where("dt.trip_id", filters.trip_id);
|
|
147
|
+
}
|
|
230
148
|
if (filters.assignment_id) {
|
|
231
149
|
query = query.where("dt.assignment_id", filters.assignment_id);
|
|
232
150
|
}
|
|
@@ -243,8 +161,10 @@ class DriverTrackingDAO {
|
|
|
243
161
|
const sessionsQuery = this.knex
|
|
244
162
|
.from(query.as("sessions"))
|
|
245
163
|
.leftJoin("users as u", "sessions.user_id", "u.id")
|
|
246
|
-
.
|
|
247
|
-
|
|
164
|
+
.leftJoin("trips as t", "sessions.trip_id", "t.id")
|
|
165
|
+
.leftJoin("route_assignments as ra", "sessions.assignment_id", "ra.id")
|
|
166
|
+
.leftJoin("routes as r", "sessions.route_id", "r.id")
|
|
167
|
+
.select("sessions.*", this.knex.raw("t.uuid as trip_uuid"), this.knex.raw("ra.uuid as assignment_uuid"), this.knex.raw("r.uuid as route_uuid"), this.knex.raw(`jsonb_build_object(
|
|
248
168
|
'uuid', u.uuid,
|
|
249
169
|
'email', u.email,
|
|
250
170
|
'username', u.username,
|
|
@@ -267,10 +187,10 @@ class DriverTrackingDAO {
|
|
|
267
187
|
success: true,
|
|
268
188
|
data: data.map((row) => ({
|
|
269
189
|
session_id: row.session_id,
|
|
270
|
-
user_id: row.user_id,
|
|
271
190
|
user: row.user,
|
|
272
|
-
|
|
273
|
-
|
|
191
|
+
trip_uuid: row.trip_uuid,
|
|
192
|
+
assignment_uuid: row.assignment_uuid || null,
|
|
193
|
+
route_uuid: row.route_uuid || null,
|
|
274
194
|
started_at: row.started_at,
|
|
275
195
|
ended_at: row.ended_at,
|
|
276
196
|
total_points: parseInt(row.total_points),
|
|
@@ -283,6 +203,59 @@ class DriverTrackingDAO {
|
|
|
283
203
|
};
|
|
284
204
|
});
|
|
285
205
|
}
|
|
206
|
+
/**
|
|
207
|
+
* Get tracking points with filters
|
|
208
|
+
*/
|
|
209
|
+
getWithFilters(filters_1) {
|
|
210
|
+
return __awaiter(this, arguments, void 0, function* (filters, page = 1, limit = 100) {
|
|
211
|
+
const offset = (page - 1) * limit;
|
|
212
|
+
let query = this.knex("driver_tracking as dt")
|
|
213
|
+
.leftJoin("users as u", "dt.user_id", "u.id")
|
|
214
|
+
.select("dt.*", this.knex.raw(`jsonb_build_object(
|
|
215
|
+
'uuid', u.uuid,
|
|
216
|
+
'email', u.email,
|
|
217
|
+
'username', u.username,
|
|
218
|
+
'first_name', u.first_name,
|
|
219
|
+
'last_name', u.last_name
|
|
220
|
+
) as user`));
|
|
221
|
+
if (filters.user_id)
|
|
222
|
+
query = query.where("dt.user_id", filters.user_id);
|
|
223
|
+
if (filters.trip_id)
|
|
224
|
+
query = query.where("dt.trip_id", filters.trip_id);
|
|
225
|
+
if (filters.assignment_id)
|
|
226
|
+
query = query.where("dt.assignment_id", filters.assignment_id);
|
|
227
|
+
if (filters.route_id)
|
|
228
|
+
query = query.where("dt.route_id", filters.route_id);
|
|
229
|
+
if (filters.session_id)
|
|
230
|
+
query = query.where("dt.session_id", filters.session_id);
|
|
231
|
+
if (filters.from_date)
|
|
232
|
+
query = query.where("dt.recorded_at", ">=", filters.from_date);
|
|
233
|
+
if (filters.to_date)
|
|
234
|
+
query = query.where("dt.recorded_at", "<=", filters.to_date);
|
|
235
|
+
if (filters.is_navigating !== undefined)
|
|
236
|
+
query = query.where("dt.is_navigating", filters.is_navigating);
|
|
237
|
+
const countQuery = query.clone();
|
|
238
|
+
const totalCountResult = yield countQuery
|
|
239
|
+
.clearSelect()
|
|
240
|
+
.count("dt.id as count")
|
|
241
|
+
.first();
|
|
242
|
+
const totalCount = Number((totalCountResult === null || totalCountResult === void 0 ? void 0 : totalCountResult.count) || 0);
|
|
243
|
+
const data = yield query
|
|
244
|
+
.orderBy("dt.recorded_at", "desc")
|
|
245
|
+
.limit(limit)
|
|
246
|
+
.offset(offset);
|
|
247
|
+
const totalPages = Math.ceil(totalCount / limit);
|
|
248
|
+
return {
|
|
249
|
+
success: true,
|
|
250
|
+
data,
|
|
251
|
+
page,
|
|
252
|
+
limit,
|
|
253
|
+
count: data.length,
|
|
254
|
+
totalCount,
|
|
255
|
+
totalPages,
|
|
256
|
+
};
|
|
257
|
+
});
|
|
258
|
+
}
|
|
286
259
|
/**
|
|
287
260
|
* End a tracking session (mark points as not navigating)
|
|
288
261
|
*/
|
|
@@ -302,7 +275,7 @@ class DriverTrackingDAO {
|
|
|
302
275
|
/**
|
|
303
276
|
* Get latest location for a user
|
|
304
277
|
*/
|
|
305
|
-
|
|
278
|
+
getLatestByUserId(userId) {
|
|
306
279
|
return __awaiter(this, void 0, void 0, function* () {
|
|
307
280
|
const result = yield this.knex("driver_tracking")
|
|
308
281
|
.where("user_id", userId)
|
|
@@ -312,18 +285,29 @@ class DriverTrackingDAO {
|
|
|
312
285
|
});
|
|
313
286
|
}
|
|
314
287
|
/**
|
|
315
|
-
* Delete
|
|
288
|
+
* Delete all tracking points for a trip (after consolidation)
|
|
316
289
|
*/
|
|
317
|
-
|
|
290
|
+
deleteByTripId(tripId) {
|
|
318
291
|
return __awaiter(this, void 0, void 0, function* () {
|
|
319
|
-
|
|
320
|
-
cutoffDate.setDate(cutoffDate.getDate() - days);
|
|
321
|
-
const result = yield this.knex("driver_tracking")
|
|
322
|
-
.where("recorded_at", "<", cutoffDate)
|
|
323
|
-
.delete();
|
|
324
|
-
return result;
|
|
292
|
+
return this.knex("driver_tracking").where("trip_id", tripId).delete();
|
|
325
293
|
});
|
|
326
294
|
}
|
|
295
|
+
/**
|
|
296
|
+
* Convert driver tracking records to ITrackPoint array (for consolidation)
|
|
297
|
+
*/
|
|
298
|
+
toTrackPoints(points) {
|
|
299
|
+
return points.map((p) => ({
|
|
300
|
+
lat: Number(p.latitude),
|
|
301
|
+
lng: Number(p.longitude),
|
|
302
|
+
altitude: p.altitude ? Number(p.altitude) : null,
|
|
303
|
+
speed: p.speed ? Number(p.speed) : null,
|
|
304
|
+
heading: p.heading ? Number(p.heading) : null,
|
|
305
|
+
accuracy: p.accuracy ? Number(p.accuracy) : null,
|
|
306
|
+
recorded_at: typeof p.recorded_at === "string"
|
|
307
|
+
? p.recorded_at
|
|
308
|
+
: p.recorded_at.toISOString(),
|
|
309
|
+
}));
|
|
310
|
+
}
|
|
327
311
|
}
|
|
328
312
|
exports.DriverTrackingDAO = DriverTrackingDAO;
|
|
329
313
|
//# sourceMappingURL=driver-tracking.dao.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"driver-tracking.dao.js","sourceRoot":"","sources":["../../../src/dao/driver-tracking/driver-tracking.dao.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,+BAAoC;AACpC,0EAA+C;AAW/C,MAAa,iBAAiB;IAG5B,IAAY,IAAI;QACd,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,KAAK,GAAG,wBAAW,CAAC,aAAa,EAAE,CAAC;QAC3C,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED;;OAEG;IACG,
|
|
1
|
+
{"version":3,"file":"driver-tracking.dao.js","sourceRoot":"","sources":["../../../src/dao/driver-tracking/driver-tracking.dao.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { IEvent, IEventCreate, IEventUpdate } from "../../interfaces/event/event.interfaces";
|
|
2
|
+
import { IBaseDAO, IDataPaginator } from "../../d.types";
|
|
3
|
+
export declare class EventDAO implements IBaseDAO<IEvent> {
|
|
4
|
+
private _knex?;
|
|
5
|
+
private get knex();
|
|
6
|
+
/**
|
|
7
|
+
* Get all events with pagination
|
|
8
|
+
*/
|
|
9
|
+
getAll(page?: number, limit?: number): Promise<IDataPaginator<IEvent>>;
|
|
10
|
+
/**
|
|
11
|
+
* Get event by ID (only active events by default)
|
|
12
|
+
*/
|
|
13
|
+
getById(id: number, includeInactive?: boolean): Promise<IEvent | null>;
|
|
14
|
+
/**
|
|
15
|
+
* Get event by UUID (only active events by default)
|
|
16
|
+
*/
|
|
17
|
+
getByUuid(uuid: string, includeInactive?: boolean): Promise<IEvent | null>;
|
|
18
|
+
/**
|
|
19
|
+
* Get event by name (only active events by default)
|
|
20
|
+
*/
|
|
21
|
+
getByName(name: string, includeInactive?: boolean): Promise<IEvent | null>;
|
|
22
|
+
/**
|
|
23
|
+
* Create a new event
|
|
24
|
+
*/
|
|
25
|
+
create(data: IEventCreate): Promise<IEvent>;
|
|
26
|
+
/**
|
|
27
|
+
* Update an event by ID
|
|
28
|
+
*/
|
|
29
|
+
update(id: number, data: IEventUpdate): Promise<IEvent | null>;
|
|
30
|
+
/**
|
|
31
|
+
* Delete an event by ID (soft delete by setting is_active to false)
|
|
32
|
+
*/
|
|
33
|
+
delete(id: number): Promise<boolean>;
|
|
34
|
+
/**
|
|
35
|
+
* Hard delete an event by ID
|
|
36
|
+
*/
|
|
37
|
+
hardDelete(id: number): Promise<boolean>;
|
|
38
|
+
}
|