fix(auth): add auto-init hardware shortcuts and voice commands on user register

This commit is contained in:
5803024019 2026-05-17 15:55:18 +07:00
parent 2617ccacb2
commit cdb578c834

View File

@ -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<VoiceCommandKey, String> 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;
}
}
}