update backend

This commit is contained in:
Wowieee4
2026-05-04 11:20:53 +07:00
parent c8d9eefa74
commit feb8e78b0c
103 changed files with 3107 additions and 304 deletions
@@ -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);
@@ -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);
@@ -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);
@@ -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);
@@ -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);
@@ -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);
@@ -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);
@@ -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);