location update with separate data structure for geofence events
This commit is contained in:
@@ -98,3 +98,51 @@ export const getAssignmentByVenueHandler = async (req, res) => {
|
|||||||
res.status(500).json({ message: "Error getting assignment", error });
|
res.status(500).json({ message: "Error getting assignment", error });
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const getAssignmentByIdHandler = async (req, res) => {
|
||||||
|
try {
|
||||||
|
const { id } = req.params;
|
||||||
|
|
||||||
|
const pipeline = [
|
||||||
|
{
|
||||||
|
$match: {
|
||||||
|
_id: ObjectId.createFromHexString(id),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
$lookup: {
|
||||||
|
from: "venues",
|
||||||
|
localField: "venue",
|
||||||
|
foreignField: "_id",
|
||||||
|
as: "venue",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
$unwind: {
|
||||||
|
path: "$venue",
|
||||||
|
preserveNullAndEmptyArrays: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
$lookup: {
|
||||||
|
from: "partners",
|
||||||
|
localField: "venue.entity",
|
||||||
|
foreignField: "_id",
|
||||||
|
as: "partner",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
$unwind: {
|
||||||
|
path: "$partner",
|
||||||
|
preserveNullAndEmptyArrays: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const assignment = await aggregateAssignment(pipeline)[0];
|
||||||
|
|
||||||
|
res.status(200).json({ result: assignment });
|
||||||
|
} catch (error) {
|
||||||
|
res.status(500).json({ message: "Error getting assignment", error });
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|||||||
@@ -40,12 +40,49 @@ Sample Location Payload
|
|||||||
"odometer_error": 0,
|
"odometer_error": 0,
|
||||||
"odometer": 0
|
"odometer": 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Geofence Event {
|
||||||
|
event: 'geofence',
|
||||||
|
is_moving: true,
|
||||||
|
uuid: 'dfa0f17d-017f-4fd1-beca-67e62f0087d9',
|
||||||
|
timestamp: '2026-06-15T18:15:08.430Z',
|
||||||
|
recorded_at: '2026-06-15T18:15:08.607Z',
|
||||||
|
age: 0.179,
|
||||||
|
odometer: 345.61,
|
||||||
|
odometer_error: 16.68,
|
||||||
|
coords: {
|
||||||
|
latitude: 13.1243472,
|
||||||
|
longitude: 80.1428553,
|
||||||
|
accuracy: 3.45,
|
||||||
|
speed: 1.01,
|
||||||
|
speed_accuracy: 0.19,
|
||||||
|
heading: 280.72,
|
||||||
|
heading_accuracy: 12.79,
|
||||||
|
altitude: -51.9,
|
||||||
|
ellipsoidal_altitude: -51.9,
|
||||||
|
altitude_accuracy: 1.11
|
||||||
|
},
|
||||||
|
activity: { type: 'walking', confidence: 100 },
|
||||||
|
battery: { is_charging: false, level: 0.69 },
|
||||||
|
geofence: {
|
||||||
|
identifier: '6a2e128af72b4c6184fd53ea-6a1f658f8fc61da8a1809091-6a2e126bf72b4c6184fd5310',
|
||||||
|
action: 'EXIT',
|
||||||
|
timestamp: '2026-06-15T18:15:08.612Z',
|
||||||
|
extras: {
|
||||||
|
venue: '6a2e126bf72b4c6184fd5310',
|
||||||
|
partner: '6a1f658f8fc61da8a1809091'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
extras: {}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
export const createLocationController = async (req, res) => {
|
export const createLocationController = async (req, res) => {
|
||||||
try {
|
try {
|
||||||
const { user } = res.locals;
|
const { user } = res.locals;
|
||||||
const { location } = req.body;
|
const { location } = req.body;
|
||||||
|
if (location.event === "geofence") {
|
||||||
|
console.log("Geofence Event", location);
|
||||||
|
}
|
||||||
const dbPayload = {
|
const dbPayload = {
|
||||||
battery: location.battery.level,
|
battery: location.battery.level,
|
||||||
coordinates: location.coords,
|
coordinates: location.coords,
|
||||||
@@ -54,8 +91,20 @@ export const createLocationController = async (req, res) => {
|
|||||||
activity: location?.activity?.type,
|
activity: location?.activity?.type,
|
||||||
recorded_at: location.recorded_at,
|
recorded_at: location.recorded_at,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if (location.event === "geofence") {
|
||||||
|
const [assignment, partner, venue] =
|
||||||
|
location?.geofence?.identifier?.split("-");
|
||||||
|
const geofencePayload = {
|
||||||
|
assignment,
|
||||||
|
partner,
|
||||||
|
venue,
|
||||||
|
action: location?.geofence?.action,
|
||||||
|
};
|
||||||
|
|
||||||
|
dbPayload.geofence = geofencePayload;
|
||||||
|
}
|
||||||
const uploaded = await createLocation({ ...dbPayload, user: user?.id });
|
const uploaded = await createLocation({ ...dbPayload, user: user?.id });
|
||||||
console.log("BG LOCATION DB DOC", uploaded, user);
|
|
||||||
res.status(200).json({ result: uploaded });
|
res.status(200).json({ result: uploaded });
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log("createLocationController Error", error);
|
console.log("createLocationController Error", error);
|
||||||
|
|||||||
@@ -78,6 +78,26 @@ export default {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
get: {
|
||||||
|
tags: ["Assignment"],
|
||||||
|
summary: "Update an assignment",
|
||||||
|
parameters: [
|
||||||
|
{
|
||||||
|
in: "path",
|
||||||
|
name: "id",
|
||||||
|
required: true,
|
||||||
|
schema: {
|
||||||
|
type: "string",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
responses: {
|
||||||
|
200: {
|
||||||
|
description: "OK",
|
||||||
|
content: {},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
delete: {
|
delete: {
|
||||||
tags: ["Assignment"],
|
tags: ["Assignment"],
|
||||||
summary: "Delete an assignment",
|
summary: "Delete an assignment",
|
||||||
|
|||||||
@@ -710,6 +710,28 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"get": {
|
||||||
|
"tags": [
|
||||||
|
"Assignment"
|
||||||
|
],
|
||||||
|
"summary": "Update an assignment",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"in": "path",
|
||||||
|
"name": "id",
|
||||||
|
"required": true,
|
||||||
|
"schema": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "OK",
|
||||||
|
"content": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"delete": {
|
"delete": {
|
||||||
"tags": [
|
"tags": [
|
||||||
"Assignment"
|
"Assignment"
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import {
|
|||||||
getAssignmentsByUserHandler,
|
getAssignmentsByUserHandler,
|
||||||
deactivateAssignmentHandler,
|
deactivateAssignmentHandler,
|
||||||
getAssignmentByVenueHandler,
|
getAssignmentByVenueHandler,
|
||||||
|
getAssignmentByIdHandler,
|
||||||
} from "../controllers/assignment.controller";
|
} from "../controllers/assignment.controller";
|
||||||
import { authorize } from "../middlewares/jwt.middleware";
|
import { authorize } from "../middlewares/jwt.middleware";
|
||||||
|
|
||||||
@@ -12,8 +13,21 @@ const router = new Router();
|
|||||||
|
|
||||||
router.post("/", authorize("assignment", "write"), createAssignmentHandler);
|
router.post("/", authorize("assignment", "write"), createAssignmentHandler);
|
||||||
router.patch("/:id", authorize("assignment", "write"), updateAssignmentHandler);
|
router.patch("/:id", authorize("assignment", "write"), updateAssignmentHandler);
|
||||||
router.get("/user/:id", authorize("assignment", "read"), getAssignmentsByUserHandler);
|
router.patch("/:id", authorize("assignment", "read"), getAssignmentByIdHandler);
|
||||||
router.delete("/:id", authorize("assignment", "write"), deactivateAssignmentHandler);
|
router.get(
|
||||||
router.get("/venue/:id", authorize("assignment", "read"), getAssignmentByVenueHandler);
|
"/user/:id",
|
||||||
|
authorize("assignment", "read"),
|
||||||
|
getAssignmentsByUserHandler,
|
||||||
|
);
|
||||||
|
router.delete(
|
||||||
|
"/:id",
|
||||||
|
authorize("assignment", "write"),
|
||||||
|
deactivateAssignmentHandler,
|
||||||
|
);
|
||||||
|
router.get(
|
||||||
|
"/venue/:id",
|
||||||
|
authorize("assignment", "read"),
|
||||||
|
getAssignmentByVenueHandler,
|
||||||
|
);
|
||||||
|
|
||||||
export default router;
|
export default router;
|
||||||
|
|||||||
Reference in New Issue
Block a user