Implementation design for Location Capture: Device and User
Introduction:
This documents describes the design for capturing Device and User location. This design requires following changes
- Get Device Profile API - To return back the IP resolved location for the device.
- Device Register API Enhancements - API to save User confirmed location to device_profile Cassandra table as derived location.
- Telemetry Location Updater Samza Job Changes - To stamp derived location in the telemetry.
Get Device Profile API:
This API returns back IP resolved location details from MaxMind DB.
Request Details:
End point: GET /v3/device/profile/<deviceId>
IP details is sent as X-FORWARDED-FOR in the header.
Response Details:
{ "id": "analytics.device-profile", "ver": "1.0", "ts": "2019-07-30T18:54:10.627+00:00", "params": { "resmsgid": "e045d484-eedb-4fa9-a9d8-9c3e489e664f", "status": "successful", "client_key": null }, "responseCode": "OK", "result": { "userDeclaredLocation": { "state": "Karnataka", "district": "Bengaluru" }, "ipLocation": { "state": "Karnataka", "district": "Bengaluru" }, "deviceProfile": { } } }
Device Register API Enhancements:
- For signed in users - Saves location details as derived location in device_profile cassandra table.
- For anonymous users - Resolves the IP address from the x-forwarded-for header and writes to cassandra.
Request Details:
End point: POST /v3/device/register/<deviceId>
IP details is sent as X-FORWARDED-FOR in the header.
Object:
{ "id": "dev.sunbird.portal", "ver": "1.15.0", "ts": "2019-04-23T19:23:02+05:30", "params": { "msgid": "4f92a44f-127f-0c82-b2ad-715faa558a8d" }, "request": { "uaspec": { "agent": "Chrome", "ver": "72.0.3626.121", "system": "mac-os-x-14", "platform": "Mac", "raw": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36" }, "channel": "b00bc992ef25f1a9a8d63291e20efc8d", "fcmToken": "asda", "producer": "app12", "dspec": {"id": "oppo"}, "ext": { "userid": "user1" }, "userDeclaredLocation": { "state": "Karnataka", "district": "Bengaluru" } } }
Response Details:
{ "id": "analytics.device-register", "ver": "1.0", "ts": "2019-07-30T18:54:10.627+00:00", "params": { "resmsgid": "e045d484-eedb-4fa9-a9d8-9c3e489e664f", "status": "successful", "client_key": null }, "responseCode": "OK", "result": { "message": "Device registered successfully", "actions": [ { "type": "experiment", "data": { "experimentName": "first-exp", "key": "/page1/4", "experimentId": "exp1", "title": "experiment" } } ] } }
Cassandra schema:
CREATE TABLE IF NOT EXISTS {{ cassandra.keyspace_prefix }}device_db.device_profile ( device_id text, first_access timestamp, last_access timestamp, total_ts double, total_launches bigint, avg_ts double, device_spec Map<text,text>, updated_date timestamp, state text, state_code text, country text, country_code text, state_custom text, state_code_custom text, district_custom text, city text, uaspec Map<text,text>, fcm_token text, producer_id text, user_declared_state text, user_declared_district text, PRIMARY KEY (device_id) );
Queries:
- Derived and device location details needs to be stored separately? and derived location should have only state and district or all other fields? -
- Current Device Register API writes device location to cassandra via kafka and which of the above API should have this logic?
- User derived location has only state & district, telemetry stamping requires other details - state code, state custom details, city details, etc
- Can derived location be the new columns in same device_profile cassandra table.?
- Will derived location details in telemetry stamped as new fields or same current device location fields?