update backend
This commit is contained in:
@@ -0,0 +1,14 @@
|
||||
-- V10: SOS events
|
||||
CREATE TABLE IF NOT EXISTS sos_events (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
trigger_type VARCHAR(50) NOT NULL DEFAULT 'MANUAL',
|
||||
lat DOUBLE PRECISION,
|
||||
lng DOUBLE PRECISION,
|
||||
status VARCHAR(20) NOT NULL DEFAULT 'TRIGGERED',
|
||||
acknowledged_at TIMESTAMP,
|
||||
created_at TIMESTAMP NOT NULL DEFAULT NOW()
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS idx_sos_user_id ON sos_events(user_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_sos_status ON sos_events(status);
|
||||
CREATE INDEX IF NOT EXISTS idx_sos_created_at ON sos_events(created_at DESC);
|
||||
@@ -0,0 +1,12 @@
|
||||
-- V11: User settings - preferensi personal user (TTS, haptic, dll)
|
||||
CREATE TABLE IF NOT EXISTS user_settings (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
user_id BIGINT NOT NULL UNIQUE REFERENCES users(id) ON DELETE CASCADE,
|
||||
tts_language VARCHAR(10) NOT NULL DEFAULT 'id-ID',
|
||||
tts_pitch DOUBLE PRECISION NOT NULL DEFAULT 1.0,
|
||||
tts_speed DOUBLE PRECISION NOT NULL DEFAULT 0.9,
|
||||
warn_no_guardian BOOLEAN NOT NULL DEFAULT TRUE,
|
||||
haptic_enabled BOOLEAN NOT NULL DEFAULT TRUE,
|
||||
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS idx_user_settings_user_id ON user_settings(user_id);
|
||||
@@ -0,0 +1,13 @@
|
||||
-- V12: AI configs - konfigurasi YOLO detection untuk setiap user (diatur Guardian)
|
||||
CREATE TABLE IF NOT EXISTS ai_configs (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
guardian_id BIGINT REFERENCES users(id) ON DELETE SET NULL,
|
||||
user_id BIGINT NOT NULL UNIQUE REFERENCES users(id) ON DELETE CASCADE,
|
||||
confidence_threshold DOUBLE PRECISION NOT NULL DEFAULT 0.5,
|
||||
alert_distance_close DOUBLE PRECISION NOT NULL DEFAULT 1.5,
|
||||
alert_distance_medium DOUBLE PRECISION NOT NULL DEFAULT 3.0,
|
||||
max_inference_fps INT NOT NULL DEFAULT 5,
|
||||
enabled_labels TEXT NOT NULL DEFAULT 'ALL',
|
||||
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS idx_ai_config_user_id ON ai_configs(user_id);
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
-- V13: Voice command configs - phrase yang diucapkan user untuk trigger aksi
|
||||
CREATE TABLE IF NOT EXISTS voice_command_configs (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
guardian_id BIGINT REFERENCES users(id) ON DELETE SET NULL,
|
||||
user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
command_key VARCHAR(50) NOT NULL,
|
||||
trigger_phrase VARCHAR(200) NOT NULL,
|
||||
enabled BOOLEAN NOT NULL DEFAULT TRUE,
|
||||
updated_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
||||
CONSTRAINT uq_voice_cmd_user_key UNIQUE (user_id, command_key)
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS idx_voice_cmd_user_id ON voice_command_configs(user_id);
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
-- V14: Hardware shortcuts - tombol fisik HP yang diassign ke aksi tertentu
|
||||
CREATE TABLE IF NOT EXISTS hardware_shortcuts (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
guardian_id BIGINT REFERENCES users(id) ON DELETE SET NULL,
|
||||
user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
shortcut_key VARCHAR(50) NOT NULL,
|
||||
button_name VARCHAR(100),
|
||||
button_code INT,
|
||||
enabled BOOLEAN NOT NULL DEFAULT TRUE,
|
||||
updated_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
||||
CONSTRAINT uq_shortcut_user_key UNIQUE (user_id, shortcut_key)
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS idx_shortcut_user_id ON hardware_shortcuts(user_id);
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
-- V15: Geofence configs - area aman yang dipantau Guardian
|
||||
CREATE TABLE IF NOT EXISTS geofence_configs (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
guardian_id BIGINT REFERENCES users(id) ON DELETE SET NULL,
|
||||
user_id BIGINT NOT NULL UNIQUE REFERENCES users(id) ON DELETE CASCADE,
|
||||
center_lat DOUBLE PRECISION,
|
||||
center_lng DOUBLE PRECISION,
|
||||
radius_meters DOUBLE PRECISION NOT NULL DEFAULT 500.0,
|
||||
enabled BOOLEAN NOT NULL DEFAULT FALSE,
|
||||
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
|
||||
);
|
||||
@@ -0,0 +1,10 @@
|
||||
-- V16: Refresh tokens - untuk perpanjang session tanpa login ulang
|
||||
CREATE TABLE IF NOT EXISTS refresh_tokens (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
token VARCHAR(500) NOT NULL UNIQUE,
|
||||
expires_at TIMESTAMP NOT NULL,
|
||||
created_at TIMESTAMP NOT NULL DEFAULT NOW()
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS idx_refresh_token_user_id ON refresh_tokens(user_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_refresh_token_token ON refresh_tokens(token);
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
-- V4: Tambah kolom baru ke tabel users untuk fitur lengkap WalkGuide
|
||||
-- Kolom unique_user_id: hanya untuk ROLE_USER, 12 karakter alphanumeric (seperti Discord ID)
|
||||
-- Kolom display_name: nama tampilan user
|
||||
-- Kolom fcm_token: Firebase Cloud Messaging token untuk push notification
|
||||
|
||||
ALTER TABLE users
|
||||
ADD COLUMN IF NOT EXISTS unique_user_id VARCHAR(12) UNIQUE,
|
||||
ADD COLUMN IF NOT EXISTS display_name VARCHAR(100),
|
||||
ADD COLUMN IF NOT EXISTS fcm_token VARCHAR(500);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_users_unique_user_id ON users(unique_user_id);
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
-- V5: Tabel pairing_relations
|
||||
-- Menyimpan hubungan Guardian <-> User (1:1)
|
||||
-- Status: PENDING (menunggu User accept), ACTIVE (sudah pair), REJECTED (ditolak/unpair)
|
||||
|
||||
CREATE TABLE IF NOT EXISTS pairing_relations (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
guardian_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
status VARCHAR(20) NOT NULL DEFAULT 'PENDING',
|
||||
invited_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
||||
responded_at TIMESTAMP,
|
||||
CONSTRAINT uq_guardian_active UNIQUE (guardian_id),
|
||||
CONSTRAINT uq_user_active UNIQUE (user_id)
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_pairing_guardian ON pairing_relations(guardian_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_pairing_user ON pairing_relations(user_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_pairing_status ON pairing_relations(status);
|
||||
@@ -0,0 +1,12 @@
|
||||
-- V6: Activity logs - semua aktivitas user dicatat di sini
|
||||
CREATE TABLE IF NOT EXISTS activity_logs (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
log_type VARCHAR(50) NOT NULL,
|
||||
description TEXT,
|
||||
metadata TEXT,
|
||||
created_at TIMESTAMP NOT NULL DEFAULT NOW()
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS idx_activity_user_id ON activity_logs(user_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_activity_created_at ON activity_logs(created_at DESC);
|
||||
CREATE INDEX IF NOT EXISTS idx_activity_log_type ON activity_logs(log_type);
|
||||
@@ -0,0 +1,14 @@
|
||||
-- V7: Obstacle logs - setiap deteksi YOLO yang signifikan dicatat
|
||||
CREATE TABLE IF NOT EXISTS obstacle_logs (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
label VARCHAR(100) NOT NULL,
|
||||
confidence DOUBLE PRECISION NOT NULL,
|
||||
direction VARCHAR(20) NOT NULL,
|
||||
estimated_dist VARCHAR(50) NOT NULL,
|
||||
lat DOUBLE PRECISION,
|
||||
lng DOUBLE PRECISION,
|
||||
created_at TIMESTAMP NOT NULL DEFAULT NOW()
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS idx_obstacle_user_id ON obstacle_logs(user_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_obstacle_created_at ON obstacle_logs(created_at DESC);
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
-- V8: Location history - GPS user dicatat setiap interval
|
||||
CREATE TABLE IF NOT EXISTS location_history (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
lat DOUBLE PRECISION NOT NULL,
|
||||
lng DOUBLE PRECISION NOT NULL,
|
||||
accuracy DOUBLE PRECISION,
|
||||
speed DOUBLE PRECISION,
|
||||
heading DOUBLE PRECISION,
|
||||
created_at TIMESTAMP NOT NULL DEFAULT NOW()
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS idx_location_user_id ON location_history(user_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_location_created_at ON location_history(created_at DESC);
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
-- V9: Guardian notifications - pesan dari Guardian ke User (text atau voice note)
|
||||
CREATE TABLE IF NOT EXISTS guardian_notifications (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
guardian_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
notif_type VARCHAR(20) NOT NULL DEFAULT 'TEXT',
|
||||
content TEXT,
|
||||
voice_note_url VARCHAR(500),
|
||||
voice_note_duration INT,
|
||||
is_read BOOLEAN NOT NULL DEFAULT FALSE,
|
||||
read_at TIMESTAMP,
|
||||
created_at TIMESTAMP NOT NULL DEFAULT NOW()
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS idx_notif_user_id ON guardian_notifications(user_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_notif_is_read ON guardian_notifications(is_read);
|
||||
CREATE INDEX IF NOT EXISTS idx_notif_created_at ON guardian_notifications(created_at DESC);
|
||||
Reference in New Issue
Block a user