@@ -215,6 +215,80 @@ export const initDatabase = async (): Promise<void> => {
215215 CREATE INDEX IF NOT EXISTS idx_calibration_corners_session ON calibration_corners(session_id);
216216 ` ) ;
217217
218+ // Navigation sessions for tracking user routes and GPS data
219+ await client . query ( `
220+ CREATE TABLE IF NOT EXISTS navigation_sessions (
221+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
222+ floor_id UUID REFERENCES floors(id) ON DELETE CASCADE,
223+ building_id UUID REFERENCES buildings(id) ON DELETE CASCADE,
224+ start_room_id TEXT NOT NULL,
225+ start_room_name TEXT,
226+ end_room_id TEXT NOT NULL,
227+ end_room_name TEXT,
228+ planned_path JSONB NOT NULL,
229+ planned_directions JSONB NOT NULL,
230+ planned_door_sequence JSONB,
231+ total_distance DOUBLE PRECISION,
232+ device_info JSONB,
233+ status TEXT DEFAULT 'preview',
234+ started_at TIMESTAMP,
235+ completed_at TIMESTAMP,
236+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
237+ updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
238+ );
239+ ` ) ;
240+
241+ // Add new columns if they don't exist (for existing databases)
242+ await client . query ( `
243+ DO $$
244+ BEGIN
245+ IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'navigation_sessions' AND column_name = 'building_id') THEN
246+ ALTER TABLE navigation_sessions ADD COLUMN building_id UUID REFERENCES buildings(id) ON DELETE CASCADE;
247+ END IF;
248+ IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'navigation_sessions' AND column_name = 'planned_door_sequence') THEN
249+ ALTER TABLE navigation_sessions ADD COLUMN planned_door_sequence JSONB;
250+ END IF;
251+ IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'navigation_sessions' AND column_name = 'total_distance') THEN
252+ ALTER TABLE navigation_sessions ADD COLUMN total_distance DOUBLE PRECISION;
253+ END IF;
254+ IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'navigation_sessions' AND column_name = 'device_info') THEN
255+ ALTER TABLE navigation_sessions ADD COLUMN device_info JSONB;
256+ END IF;
257+ END $$;
258+ ` ) ;
259+
260+ await client . query ( `
261+ CREATE INDEX IF NOT EXISTS idx_navigation_sessions_floor ON navigation_sessions(floor_id);
262+ ` ) ;
263+
264+ await client . query ( `
265+ CREATE INDEX IF NOT EXISTS idx_navigation_sessions_status ON navigation_sessions(status);
266+ ` ) ;
267+
268+ // GPS tracking points during navigation
269+ await client . query ( `
270+ CREATE TABLE IF NOT EXISTS navigation_gps_points (
271+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
272+ session_id UUID NOT NULL REFERENCES navigation_sessions(id) ON DELETE CASCADE,
273+ latitude DOUBLE PRECISION NOT NULL,
274+ longitude DOUBLE PRECISION NOT NULL,
275+ accuracy DOUBLE PRECISION,
276+ altitude DOUBLE PRECISION,
277+ heading DOUBLE PRECISION,
278+ speed DOUBLE PRECISION,
279+ timestamp BIGINT NOT NULL,
280+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
281+ );
282+ ` ) ;
283+
284+ await client . query ( `
285+ CREATE INDEX IF NOT EXISTS idx_navigation_gps_session ON navigation_gps_points(session_id);
286+ ` ) ;
287+
288+ await client . query ( `
289+ CREATE INDEX IF NOT EXISTS idx_navigation_gps_timestamp ON navigation_gps_points(timestamp);
290+ ` ) ;
291+
218292 console . log ( 'Database initialized successfully' ) ;
219293 } catch ( error ) {
220294 console . error ( 'Error initializing database:' , error ) ;
0 commit comments