fix(auth): add auto-init hardware shortcuts and voice commands on user register
This commit is contained in:
parent
2617ccacb2
commit
cdb578c834
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user