feat: init development branch with permanent access token and menu handlers
This commit is contained in:
@@ -8,6 +8,7 @@ import com.rit.whatsapp.util.EncryptionUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
@@ -48,7 +49,7 @@ public class SessionService {
|
||||
}
|
||||
|
||||
public boolean hasSavedCredentials(String phoneNumber) {
|
||||
return userRepository.existsById(phoneNumber);
|
||||
return userRepository.existsByPhoneNumber(phoneNumber);
|
||||
}
|
||||
|
||||
public void resetState(String phoneNumber) {
|
||||
@@ -61,15 +62,22 @@ public class SessionService {
|
||||
}
|
||||
|
||||
// Check database for persistent session
|
||||
Optional<UserEntity> userOpt = userRepository.findById(phoneNumber);
|
||||
Optional<UserEntity> userOpt = userRepository.findByPhoneNumber(phoneNumber);
|
||||
if (userOpt.isPresent()) {
|
||||
UserEntity user = userOpt.get();
|
||||
if (user.getEncryptedPasscode() == null) {
|
||||
return false;
|
||||
}
|
||||
String decryptedPasscode = encryptionUtils.decrypt(user.getEncryptedPasscode());
|
||||
|
||||
// Silent background login
|
||||
String token = imsApiService.authenticate(user.getImsId(), decryptedPasscode);
|
||||
if (token != null) {
|
||||
sessionTokens.put(phoneNumber, token);
|
||||
ImsApiService.AuthResult result = imsApiService.authenticate(user.getImsId(), decryptedPasscode);
|
||||
if (result != null) {
|
||||
sessionTokens.put(phoneNumber, result.token);
|
||||
if (user.isFaculty() != result.isFaculty) {
|
||||
user.setFaculty(result.isFaculty);
|
||||
userRepository.save(user);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -77,12 +85,21 @@ public class SessionService {
|
||||
return false;
|
||||
}
|
||||
|
||||
public void authenticateUser(String phoneNumber, String imsId, String passcode, String token) {
|
||||
sessionTokens.put(phoneNumber, token);
|
||||
public void authenticateUser(String phoneNumber, String imsId, String passcode, ImsApiService.AuthResult result) {
|
||||
sessionTokens.put(phoneNumber, result.token);
|
||||
|
||||
// Persist to database
|
||||
String encryptedPasscode = encryptionUtils.encrypt(passcode);
|
||||
UserEntity user = new UserEntity(phoneNumber, imsId, encryptedPasscode);
|
||||
// Persist to database (students table)
|
||||
Optional<UserEntity> userOpt = userRepository.findById(imsId);
|
||||
UserEntity user;
|
||||
if (userOpt.isPresent()) {
|
||||
user = userOpt.get();
|
||||
user.setPhoneNumber(phoneNumber);
|
||||
user.setEncryptedPasscode(encryptionUtils.encrypt(passcode));
|
||||
} else {
|
||||
String encryptedPasscode = encryptionUtils.encrypt(passcode);
|
||||
user = new UserEntity(imsId, phoneNumber, encryptedPasscode);
|
||||
}
|
||||
user.setFaculty(result.isFaculty);
|
||||
userRepository.save(user);
|
||||
}
|
||||
|
||||
@@ -99,7 +116,12 @@ public class SessionService {
|
||||
if (token != null) {
|
||||
imsApiService.logout(token);
|
||||
}
|
||||
userRepository.deleteById(phoneNumber);
|
||||
Optional<UserEntity> userOpt = userRepository.findByPhoneNumber(phoneNumber);
|
||||
if (userOpt.isPresent()) {
|
||||
UserEntity user = userOpt.get();
|
||||
user.setEncryptedPasscode(null);
|
||||
userRepository.save(user);
|
||||
}
|
||||
studentNames.remove(phoneNumber);
|
||||
resetState(phoneNumber);
|
||||
}
|
||||
@@ -108,11 +130,53 @@ public class SessionService {
|
||||
if (studentNames.containsKey(phoneNumber)) {
|
||||
return studentNames.get(phoneNumber);
|
||||
}
|
||||
String name = imsApiService.getStudentName(token);
|
||||
String name;
|
||||
if (isFaculty(phoneNumber)) {
|
||||
name = imsApiService.getFacultyName(token);
|
||||
} else {
|
||||
name = imsApiService.getStudentName(token);
|
||||
}
|
||||
studentNames.put(phoneNumber, name);
|
||||
return name;
|
||||
}
|
||||
|
||||
private final Map<String, List<Map<String, Object>>> attendanceSubjectParams = new ConcurrentHashMap<>();
|
||||
private final Map<String, Map<String, Object>> activeAttendanceParams = new ConcurrentHashMap<>();
|
||||
private final Map<String, List<com.rit.whatsapp.util.MessageFormatter.StudentAttendanceInfo>> activeStudentLists = new ConcurrentHashMap<>();
|
||||
|
||||
public void storeAttendanceSubjectParams(String phoneNumber, List<Map<String, Object>> paramsList) {
|
||||
attendanceSubjectParams.put(phoneNumber, paramsList);
|
||||
}
|
||||
|
||||
public Map<String, Object> getAttendanceSubjectParams(String phoneNumber, int index) {
|
||||
List<Map<String, Object>> paramsList = attendanceSubjectParams.get(phoneNumber);
|
||||
if (paramsList != null && index >= 0 && index < paramsList.size()) {
|
||||
return paramsList.get(index);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public void setActiveAttendanceParams(String phoneNumber, Map<String, Object> params) {
|
||||
activeAttendanceParams.put(phoneNumber, params);
|
||||
}
|
||||
|
||||
public Map<String, Object> getActiveAttendanceParams(String phoneNumber) {
|
||||
return activeAttendanceParams.get(phoneNumber);
|
||||
}
|
||||
|
||||
public void clearActiveAttendanceParams(String phoneNumber) {
|
||||
activeAttendanceParams.remove(phoneNumber);
|
||||
activeStudentLists.remove(phoneNumber);
|
||||
}
|
||||
|
||||
public void storeActiveStudentList(String phoneNumber, List<com.rit.whatsapp.util.MessageFormatter.StudentAttendanceInfo> list) {
|
||||
activeStudentLists.put(phoneNumber, list);
|
||||
}
|
||||
|
||||
public List<com.rit.whatsapp.util.MessageFormatter.StudentAttendanceInfo> getActiveStudentList(String phoneNumber) {
|
||||
return activeStudentLists.get(phoneNumber);
|
||||
}
|
||||
|
||||
private final Map<String, Map<String, String>> receiptIdMappings = new ConcurrentHashMap<>();
|
||||
|
||||
public void storeReceiptIdMappings(String phoneNumber, Map<String, String> mappings) {
|
||||
@@ -158,10 +222,26 @@ public class SessionService {
|
||||
}
|
||||
|
||||
public String getImsId(String phoneNumber) {
|
||||
Optional<UserEntity> userOpt = userRepository.findById(phoneNumber);
|
||||
Optional<UserEntity> userOpt = userRepository.findByPhoneNumber(phoneNumber);
|
||||
if (userOpt.isPresent()) {
|
||||
return userOpt.get().getImsId();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public boolean isFaculty(String phoneNumber) {
|
||||
Optional<UserEntity> userOpt = userRepository.findByPhoneNumber(phoneNumber);
|
||||
if (userOpt.isPresent()) {
|
||||
return userOpt.get().isFaculty();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public void deleteUser(String phoneNumber) {
|
||||
logoutUser(phoneNumber);
|
||||
Optional<UserEntity> userOpt = userRepository.findByPhoneNumber(phoneNumber);
|
||||
if (userOpt.isPresent()) {
|
||||
userRepository.delete(userOpt.get());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user