Added statistics endpoint

- Added onlineTime statistic
- Added lastLogin tracking and endpoint
This commit is contained in:
Max W. 2024-05-30 20:00:56 +02:00
parent 299cc565d7
commit 017ef0afca
5 changed files with 68 additions and 2 deletions

View File

@ -3,10 +3,15 @@ package de.w665.sharepulse;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import java.util.Date;
@SpringBootApplication
public class SharepulseApplication {
public static Date startTime;
public static void main(String[] args) {
startTime = new Date();
SpringApplication.run(SharepulseApplication.class, args);
}

View File

@ -1,7 +1,5 @@
package de.w665.sharepulse.db.repo;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.rethinkdb.RethinkDB;
import com.rethinkdb.net.Connection;
import de.w665.sharepulse.db.RethinkDBConfig;
@ -35,6 +33,13 @@ public class UserRepository {
}
}
public void updateLastLoginForUser(String username, Date lastLogin) {
r.db(config.getDatabase()).table("users")
.filter(r.hashMap("username", username))
.update(r.hashMap("lastLogin", lastLogin.getTime()))
.run(connection);
}
public void insertUser(User user) {
r.db(config.getDatabase()).table("users").insert(user).run(connection);
}

View File

@ -1,10 +1,13 @@
package de.w665.sharepulse.model;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.util.Date;
@Getter
@Setter
@NoArgsConstructor
@ -14,4 +17,6 @@ public class User {
private String password;
private String email;
private String role;
@JsonFormat(timezone = "ETC")
private Date lastLogin;
}

View File

@ -0,0 +1,50 @@
package de.w665.sharepulse.rest.mappings;
import de.w665.sharepulse.SharepulseApplication;
import de.w665.sharepulse.db.repo.UserRepository;
import de.w665.sharepulse.model.User;
import de.w665.sharepulse.rest.SecureApiRestController;
import de.w665.sharepulse.service.AuthenticationService;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
@Slf4j
@RestController
public class Administration extends SecureApiRestController {
private final UserRepository userRepository;
private final AuthenticationService authenticationService;
public Administration(UserRepository userRepository, AuthenticationService authenticationService) {
this.userRepository = userRepository;
this.authenticationService = authenticationService;
}
@GetMapping("/statistics")
public ResponseEntity<Object> getStatistics(HttpServletRequest request) {
String token = request.getHeader("Authorization");
token = token.substring(7);
String username = authenticationService.getClaimValue(token, "username", String.class);
Optional<User> optionalUser = userRepository.retrieveUserByUsername(username);
if(optionalUser.isEmpty()) {
return ResponseEntity.badRequest().body("User not found");
}
User user = optionalUser.get();
// If role filtering is required later, add here
Map<String, Object> response = new HashMap<>();
response.put("applicationOnlineTime", System.currentTimeMillis() - SharepulseApplication.startTime.getTime());
response.put("lastUserLogin", user.getLastLogin());
log.debug("Received statistics request");
return ResponseEntity.ok(response);
}
}

View File

@ -46,6 +46,7 @@ public class AuthenticationService {
}
Optional<User> user = userRepository.retrieveUserByUsername(username);
if (user.isPresent() && passwordEncoder.matches(password, user.get().getPassword())) {
userRepository.updateLastLoginForUser(user.get().getUsername(), new Date());
return generateToken(user.get());
}
return null;