diff --git a/src/main/java/org/olat/basesecurity/BaseSecurity.java b/src/main/java/org/olat/basesecurity/BaseSecurity.java index c8125dabf1a91b674b1628f25d0a1df577544e49..a6fcc6ce2d629b63e15f1f412c69d1bbcaf77873 100644 --- a/src/main/java/org/olat/basesecurity/BaseSecurity.java +++ b/src/main/java/org/olat/basesecurity/BaseSecurity.java @@ -523,6 +523,8 @@ public interface BaseSecurity { */ public boolean isIdentityInvited(Identity identity); + public long countInvitations(); + /** * Delete an invitation * @param invitation diff --git a/src/main/java/org/olat/basesecurity/BaseSecurityManager.java b/src/main/java/org/olat/basesecurity/BaseSecurityManager.java index 5fa92fbe2695b245983dfb69abb344cf35cb17bc..efedb48ebaa41bb7fde1421821507f33aa9ede40 100644 --- a/src/main/java/org/olat/basesecurity/BaseSecurityManager.java +++ b/src/main/java/org/olat/basesecurity/BaseSecurityManager.java @@ -890,6 +890,18 @@ public class BaseSecurityManager extends BasicManager implements BaseSecurity { return invitations.intValue() > 0; } + /** + * @see org.olat.basesecurity.BaseSecurity#isIdentityInvited(org.olat.core.id.Identity) + */ + @Override + public long countInvitations() { + StringBuilder sb = new StringBuilder(); + sb.append("select count(invitation) from ").append(InvitationImpl.class.getName()).append(" as invitation"); + + Number invitations = (Number)DBFactory.getInstance().createQuery(sb.toString()).uniqueResult(); + return invitations.longValue(); + } + /** * @see org.olat.basesecurity.BaseSecurity#deleteInvitation(org.olat.basesecurity.Invitation) */ diff --git a/src/main/java/org/olat/restapi/system/OpenOLATStatisticsWebService.java b/src/main/java/org/olat/restapi/system/OpenOLATStatisticsWebService.java index aca62556c7eb2ab1513a27667a2a48d4161388a1..4bfa2b84d33d787151de9f88970fce7e2c10c057 100644 --- a/src/main/java/org/olat/restapi/system/OpenOLATStatisticsWebService.java +++ b/src/main/java/org/olat/restapi/system/OpenOLATStatisticsWebService.java @@ -19,6 +19,7 @@ */ package org.olat.restapi.system; +import java.util.Calendar; import java.util.List; import java.util.Set; @@ -35,6 +36,7 @@ import org.olat.admin.sysinfo.model.SessionsStats; import org.olat.basesecurity.BaseSecurity; import org.olat.basesecurity.Constants; import org.olat.core.CoreSpringFactory; +import org.olat.core.id.Identity; import org.olat.core.util.SessionInfo; import org.olat.core.util.UserSession; import org.olat.core.util.WorkThreadInformations; @@ -167,13 +169,51 @@ public class OpenOLATStatisticsWebService implements Sampler { private UserStatisticsVO getUserStatistics() { UserStatisticsVO stats = new UserStatisticsVO(); - BaseSecurity securityManager = CoreSpringFactory.getImpl(BaseSecurity.class); - long countUsers = securityManager.countIdentitiesByPowerSearch(null, null, false, null, null, null, null, null, null, null, null); - stats.setTotalUserCount(countUsers); + + // activeUserCount="88" // registered and activated identities, same as in GUI long countActiveUsers = securityManager.countIdentitiesByPowerSearch(null, null, false, null, null, null, null, null, null, null, Constants.USERSTATUS_ACTIVE); stats.setActiveUserCount(countActiveUsers); + // active last week + Calendar lastDay = Calendar.getInstance(); + lastDay.add(Calendar.DATE, -1); + long activeUserCountDay = securityManager.countUniqueUserLoginsSince(lastDay.getTime()); + stats.setActiveUserCountLastDay(activeUserCountDay); + + // active last week + Calendar lastWeek = Calendar.getInstance(); + lastWeek.add(Calendar.DATE, -7); + long activeUserCountWeek = securityManager.countUniqueUserLoginsSince(lastWeek.getTime()); + stats.setActiveUserCountLastWeek(activeUserCountWeek); + + // active last month + Calendar lastMonth = Calendar.getInstance(); + lastMonth.add(Calendar.MONTH, -1); + long activeUserCountMonth = securityManager.countUniqueUserLoginsSince(lastMonth.getTime()); + stats.setActiveUserCountLastMonth(activeUserCountMonth); + + // active last 6 month + Calendar last6Month = Calendar.getInstance(); + last6Month.add(Calendar.MONTH, -6); + long activeUserCount6Month = securityManager.countUniqueUserLoginsSince(last6Month.getTime()); + stats.setActiveUserCountLast6Month(activeUserCount6Month); + + // externalUserCount="12" // EP invite identities, later maybe also used in courses for MOOCS, external experts etc) + long invitationsCount = securityManager.countInvitations(); + stats.setExternalUserCount(invitationsCount); + + // blockedUserCount="0" // identities in login blocked state + long blockedUserCount = securityManager.countIdentitiesByPowerSearch(null, null, true, null, null, null, null, null, null, null, Identity.STATUS_LOGIN_DENIED); + stats.setBlockedUserCount(blockedUserCount); + // deletedUserCount="943" // deleted identities + long deletedUserCount = securityManager.countIdentitiesByPowerSearch(null, null, true, null, null, null, null, null, null, null, Identity.STATUS_DELETED); + stats.setDeletedUserCount(deletedUserCount); + + // totalUserCount="1043" // Sum of all above + long countUsers = securityManager.countIdentitiesByPowerSearch(null, null, false, null, null, null, null, null, null, null, null); + stats.setTotalUserCount(countUsers); + BusinessGroupService bgs = CoreSpringFactory.getImpl(BusinessGroupService.class); long countGroups = bgs.countBusinessGroups(null, null); stats.setTotalGroupCount(countGroups); diff --git a/src/main/java/org/olat/restapi/system/vo/UserStatisticsVO.java b/src/main/java/org/olat/restapi/system/vo/UserStatisticsVO.java index 146cd683971d7257454e7b8fb00802a647b6eaab..e8eae18f28c9fe1bdce949c26d8e986669c678c2 100644 --- a/src/main/java/org/olat/restapi/system/vo/UserStatisticsVO.java +++ b/src/main/java/org/olat/restapi/system/vo/UserStatisticsVO.java @@ -34,12 +34,25 @@ public class UserStatisticsVO { @XmlAttribute(name="totalUserCount", required=true) private long totalUserCount; - @XmlAttribute(name="activeUserCount", required=true) + @XmlAttribute(name="activeUserCount", required=false) private long activeUserCount; + @XmlAttribute(name="activeUserCountLastDay", required=false) + private long activeUserCountLastDay; + @XmlAttribute(name="activeUserCountLastWeek", required=false) + private long activeUserCountLastWeek; + @XmlAttribute(name="activeUserCountLastMonth", required=false) + private long activeUserCountLastMonth; + @XmlAttribute(name="activeUserCountLast6Month", required=false) + private long activeUserCountLast6Month; + @XmlAttribute(name="externalUserCount", required=false) + private long externalUserCount; + @XmlAttribute(name="blockedUserCount", required=false) + private long blockedUserCount; + @XmlAttribute(name="deletedUserCount", required=false) + private long deletedUserCount; @XmlAttribute(name="totalGroupCount", required=true) private long totalGroupCount; - - + public long getTotalUserCount() { return totalUserCount; } @@ -55,7 +68,63 @@ public class UserStatisticsVO { public void setActiveUserCount(long activeUserCount) { this.activeUserCount = activeUserCount; } - + + public long getActiveUserCountLastDay() { + return activeUserCountLastDay; + } + + public void setActiveUserCountLastDay(long activeUserCountLastDay) { + this.activeUserCountLastDay = activeUserCountLastDay; + } + + public long getActiveUserCountLastWeek() { + return activeUserCountLastWeek; + } + + public void setActiveUserCountLastWeek(long activeUserCountLastWeek) { + this.activeUserCountLastWeek = activeUserCountLastWeek; + } + + public long getActiveUserCountLastMonth() { + return activeUserCountLastMonth; + } + + public void setActiveUserCountLastMonth(long activeUserCountLastMonth) { + this.activeUserCountLastMonth = activeUserCountLastMonth; + } + + public long getActiveUserCountLast6Month() { + return activeUserCountLast6Month; + } + + public void setActiveUserCountLast6Month(long activeUserCountLast6Month) { + this.activeUserCountLast6Month = activeUserCountLast6Month; + } + + public long getExternalUserCount() { + return externalUserCount; + } + + public void setExternalUserCount(long externalUserCount) { + this.externalUserCount = externalUserCount; + } + + public long getBlockedUserCount() { + return blockedUserCount; + } + + public void setBlockedUserCount(long blockedUserCount) { + this.blockedUserCount = blockedUserCount; + } + + public long getDeletedUserCount() { + return deletedUserCount; + } + + public void setDeletedUserCount(long deletedUserCount) { + this.deletedUserCount = deletedUserCount; + } + public long getTotalGroupCount() { return totalGroupCount; } diff --git a/src/test/java/org/olat/restapi/SystemTest.java b/src/test/java/org/olat/restapi/SystemTest.java index 9a12feb4d1bc7b9b10ad1fd04904050f84688c3b..ee40369c5bff3cb0d940b06a43b6d39502074669 100644 --- a/src/test/java/org/olat/restapi/SystemTest.java +++ b/src/test/java/org/olat/restapi/SystemTest.java @@ -153,11 +153,36 @@ public class SystemTest extends OlatJerseyTestCase { URI systemUri = conn.getContextURI().path("system").path("monitoring").path("openolat").path("users").build(); UserStatisticsVO userStats = conn.get(systemUri, UserStatisticsVO.class); - assertNotNull(userStats); - assertTrue(userStats.getTotalUserCount() > 0); - assertTrue(userStats.getTotalGroupCount() >= 0); - assertTrue(userStats.getActiveUserCount() >= 0); + + long totalUserCount = userStats.getTotalUserCount(); + assertTrue(totalUserCount > 0); + long activeUserCount = userStats.getActiveUserCount(); + assertTrue(activeUserCount >= 0); + + long activeUserCountLastDay = userStats.getActiveUserCountLastDay(); + assertTrue(activeUserCountLastDay >= 0); + + long activeUserCountLastWeek = userStats.getActiveUserCountLastWeek(); + assertTrue(activeUserCountLastWeek >= 0); + + long activeUserCountLastMonth = userStats.getActiveUserCountLastMonth(); + assertTrue(activeUserCountLastMonth >= 0); + + long activeUserCountLast6Month = userStats.getActiveUserCountLast6Month(); + assertTrue(activeUserCountLast6Month >= 0); + + long blockedUserCount = userStats.getBlockedUserCount(); + assertTrue(blockedUserCount >= 0); + + long deletedUserCount = userStats.getDeletedUserCount(); + assertTrue(deletedUserCount >= 0); + + long externalUserCount = userStats.getExternalUserCount(); + assertTrue(externalUserCount >= 0); + + long totalGroupCount = userStats.getTotalGroupCount(); + assertTrue(totalGroupCount >= 0); conn.shutdown(); }