From cdb578c834db4e4bd1221314c62a9ecf1d516ba2 Mon Sep 17 00:00:00 2001 From: 5803024019 Date: Sun, 17 May 2026 15:55:18 +0700 Subject: [PATCH] fix(auth): add auto-init hardware shortcuts and voice commands on user register --- .../com/walkguide/service/AuthService.java | 56 ++++++++++++++++--- 1 file changed, 48 insertions(+), 8 deletions(-) diff --git a/walkguide-backend/demo/src/main/java/com/walkguide/service/AuthService.java b/walkguide-backend/demo/src/main/java/com/walkguide/service/AuthService.java index 6e99612..7c8a7f7 100644 --- a/walkguide-backend/demo/src/main/java/com/walkguide/service/AuthService.java +++ b/walkguide-backend/demo/src/main/java/com/walkguide/service/AuthService.java @@ -3,13 +3,19 @@ package com.walkguide.service; import com.walkguide.dto.request.LoginRequest; import com.walkguide.dto.request.RegisterRequest; import com.walkguide.dto.response.AuthDataResponse; +import com.walkguide.entity.HardwareShortcut; import com.walkguide.entity.RefreshToken; import com.walkguide.entity.User; import com.walkguide.entity.UserSettings; +import com.walkguide.entity.VoiceCommandConfig; import com.walkguide.enums.ActivityLogType; +import com.walkguide.enums.HardwareShortcutKey; +import com.walkguide.enums.VoiceCommandKey; +import com.walkguide.repository.HardwareShortcutRepository; import com.walkguide.repository.RefreshTokenRepository; import com.walkguide.repository.UserRepository; import com.walkguide.repository.UserSettingsRepository; +import com.walkguide.repository.VoiceCommandConfigRepository; import com.walkguide.security.JwtUtil; import lombok.RequiredArgsConstructor; import org.springframework.security.crypto.password.PasswordEncoder; @@ -18,6 +24,7 @@ import org.springframework.transaction.annotation.Transactional; import java.security.SecureRandom; import java.time.LocalDateTime; +import java.util.Map; @Service @RequiredArgsConstructor @@ -26,6 +33,8 @@ public class AuthService { private final UserRepository userRepository; private final RefreshTokenRepository refreshTokenRepository; private final UserSettingsRepository userSettingsRepository; + private final HardwareShortcutRepository hardwareShortcutRepository; + private final VoiceCommandConfigRepository voiceCommandConfigRepository; private final ActivityLogService activityLogService; private final JwtUtil jwtUtil; private final PasswordEncoder passwordEncoder; @@ -33,6 +42,23 @@ public class AuthService { private static final String CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; private static final int ID_LENGTH = 12; + private static final Map DEFAULT_PHRASES = Map.ofEntries( + Map.entry(VoiceCommandKey.OPEN_WALKGUIDE, "buka walkguide"), + Map.entry(VoiceCommandKey.START_WALKGUIDE, "mulai walkguide"), + Map.entry(VoiceCommandKey.STOP_WALKGUIDE, "hentikan walkguide"), + Map.entry(VoiceCommandKey.CALL_GUARDIAN, "telepon guardian"), + Map.entry(VoiceCommandKey.OPEN_NOTIFICATION, "buka notifikasi"), + Map.entry(VoiceCommandKey.READ_ALL_NOTIF, "baca notifikasi"), + Map.entry(VoiceCommandKey.OPEN_SOS, "buka sos"), + Map.entry(VoiceCommandKey.SEND_SOS, "kirim sos"), + Map.entry(VoiceCommandKey.WHERE_AM_I, "di mana saya"), + Map.entry(VoiceCommandKey.OPEN_ACTIVITY, "buka aktivitas"), + Map.entry(VoiceCommandKey.OPEN_NAVIGATION, "buka navigasi"), + Map.entry(VoiceCommandKey.OPEN_SETTINGS, "buka pengaturan"), + Map.entry(VoiceCommandKey.REPEAT_LAST, "ulangi"), + Map.entry(VoiceCommandKey.STOP_TTS, "berhenti") + ); + @Transactional public AuthDataResponse register(RegisterRequest req) { if (userRepository.existsByEmail(req.getEmail())) { @@ -57,11 +83,30 @@ public class AuthService { user = userRepository.save(user); - // Buat default settings untuk user baru if ("ROLE_USER".equals(role)) { + // 1. Default settings userSettingsRepository.save(UserSettings.builder() .userId(user.getId()) .build()); + + // 2. Default hardware shortcuts + for (HardwareShortcutKey key : HardwareShortcutKey.values()) { + hardwareShortcutRepository.save(HardwareShortcut.builder() + .userId(user.getId()) + .shortcutKey(key) + .enabled(true) + .build()); + } + + // 3. Default voice commands + for (VoiceCommandKey key : VoiceCommandKey.values()) { + voiceCommandConfigRepository.save(VoiceCommandConfig.builder() + .userId(user.getId()) + .commandKey(key) + .triggerPhrase(DEFAULT_PHRASES.getOrDefault(key, key.name().toLowerCase())) + .enabled(true) + .build()); + } } return buildAuthResponse(user); @@ -76,9 +121,7 @@ public class AuthService { throw new RuntimeException("Password salah"); } - // Hapus refresh token lama refreshTokenRepository.deleteByUserId(user.getId()); - activityLogService.createLog(user, ActivityLogType.LOGIN, "User login", null); return buildAuthResponse(user); @@ -102,7 +145,7 @@ public class AuthService { return AuthDataResponse.builder() .accessToken(newAccessToken) - .refreshToken(token) // refresh token tetap sama + .refreshToken(token) .role(user.getRole()) .userId(user.getId()) .displayName(user.getDisplayName()) @@ -125,14 +168,11 @@ public class AuthService { }); } - // ========== PRIVATE HELPERS ========== - private AuthDataResponse buildAuthResponse(User user) { String accessToken = jwtUtil.generateAccessToken( user.getEmail(), user.getRole(), user.getId()); String refreshTokenStr = jwtUtil.generateRefreshToken(); - // Simpan refresh token ke DB (berlaku 30 hari) refreshTokenRepository.save(RefreshToken.builder() .userId(user.getId()) .token(refreshTokenStr) @@ -162,4 +202,4 @@ public class AuthService { } while (userRepository.findByUniqueUserId(candidate).isPresent()); return candidate; } -} +} \ No newline at end of file