diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml
deleted file mode 100644
index c09dd19..0000000
--- a/.gitea/workflows/ci.yml
+++ /dev/null
@@ -1,31 +0,0 @@
-name: Deploy to Dokku
-
-on:
- push:
- branches: ["master"]
- paths-ignore:
- - .gitignore
- - README.md
- - LICENSE
-
-jobs:
- docker:
- strategy:
- matrix:
- arch: ["ubuntu-latest"]
- runs-on: ${{ matrix.arch }}
-
- # Steps to run
- steps:
- # Checkout the repo
- - name: Checkout
- uses: actions/checkout@v4
- with:
- fetch-depth: 0
-
- # Deploy to Dokku
- - name: Push to dokku
- uses: dokku/github-action@master
- with:
- git_remote_url: "ssh://dokku@10.0.50.136:22/bs-tracker"
- ssh_private_key: ${{ secrets.SSH_PRIVATE_KEY }}
\ No newline at end of file
diff --git a/.idea/.gitignore b/.idea/.gitignore
deleted file mode 100644
index 26d3352..0000000
--- a/.idea/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-# Default ignored files
-/shelf/
-/workspace.xml
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
deleted file mode 100644
index aa00ffa..0000000
--- a/.idea/encodings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/git_toolbox_blame.xml b/.idea/git_toolbox_blame.xml
deleted file mode 100644
index 7dc1249..0000000
--- a/.idea/git_toolbox_blame.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
deleted file mode 100644
index 010b430..0000000
--- a/.idea/misc.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
deleted file mode 100644
index b1aaf14..0000000
--- a/.idea/vcs.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.gitignore b/API/.gitignore
similarity index 100%
rename from .gitignore
rename to API/.gitignore
diff --git a/Dockerfile b/API/Dockerfile
similarity index 100%
rename from Dockerfile
rename to API/Dockerfile
diff --git a/pom.xml b/API/pom.xml
similarity index 100%
rename from pom.xml
rename to API/pom.xml
diff --git a/src/main/java/cc/fascinated/Main.java b/API/src/main/java/cc/fascinated/Main.java
similarity index 100%
rename from src/main/java/cc/fascinated/Main.java
rename to API/src/main/java/cc/fascinated/Main.java
diff --git a/src/main/java/cc/fascinated/common/MathUtils.java b/API/src/main/java/cc/fascinated/common/MathUtils.java
similarity index 100%
rename from src/main/java/cc/fascinated/common/MathUtils.java
rename to API/src/main/java/cc/fascinated/common/MathUtils.java
diff --git a/src/main/java/cc/fascinated/common/Request.java b/API/src/main/java/cc/fascinated/common/Request.java
similarity index 100%
rename from src/main/java/cc/fascinated/common/Request.java
rename to API/src/main/java/cc/fascinated/common/Request.java
diff --git a/src/main/java/cc/fascinated/common/ScoreSaberUtils.java b/API/src/main/java/cc/fascinated/common/ScoreSaberUtils.java
similarity index 100%
rename from src/main/java/cc/fascinated/common/ScoreSaberUtils.java
rename to API/src/main/java/cc/fascinated/common/ScoreSaberUtils.java
diff --git a/src/main/java/cc/fascinated/common/UUIDUtils.java b/API/src/main/java/cc/fascinated/common/UUIDUtils.java
similarity index 100%
rename from src/main/java/cc/fascinated/common/UUIDUtils.java
rename to API/src/main/java/cc/fascinated/common/UUIDUtils.java
diff --git a/src/main/java/cc/fascinated/config/Config.java b/API/src/main/java/cc/fascinated/config/Config.java
similarity index 100%
rename from src/main/java/cc/fascinated/config/Config.java
rename to API/src/main/java/cc/fascinated/config/Config.java
diff --git a/src/main/java/cc/fascinated/controller/ScoresController.java b/API/src/main/java/cc/fascinated/controller/ScoresController.java
similarity index 100%
rename from src/main/java/cc/fascinated/controller/ScoresController.java
rename to API/src/main/java/cc/fascinated/controller/ScoresController.java
diff --git a/src/main/java/cc/fascinated/controller/UserController.java b/API/src/main/java/cc/fascinated/controller/UserController.java
similarity index 100%
rename from src/main/java/cc/fascinated/controller/UserController.java
rename to API/src/main/java/cc/fascinated/controller/UserController.java
diff --git a/src/main/java/cc/fascinated/exception/ExceptionControllerAdvice.java b/API/src/main/java/cc/fascinated/exception/ExceptionControllerAdvice.java
similarity index 100%
rename from src/main/java/cc/fascinated/exception/ExceptionControllerAdvice.java
rename to API/src/main/java/cc/fascinated/exception/ExceptionControllerAdvice.java
diff --git a/src/main/java/cc/fascinated/exception/impl/BadRequestException.java b/API/src/main/java/cc/fascinated/exception/impl/BadRequestException.java
similarity index 100%
rename from src/main/java/cc/fascinated/exception/impl/BadRequestException.java
rename to API/src/main/java/cc/fascinated/exception/impl/BadRequestException.java
diff --git a/src/main/java/cc/fascinated/exception/impl/InternalServerErrorException.java b/API/src/main/java/cc/fascinated/exception/impl/InternalServerErrorException.java
similarity index 100%
rename from src/main/java/cc/fascinated/exception/impl/InternalServerErrorException.java
rename to API/src/main/java/cc/fascinated/exception/impl/InternalServerErrorException.java
diff --git a/src/main/java/cc/fascinated/exception/impl/RateLimitException.java b/API/src/main/java/cc/fascinated/exception/impl/RateLimitException.java
similarity index 100%
rename from src/main/java/cc/fascinated/exception/impl/RateLimitException.java
rename to API/src/main/java/cc/fascinated/exception/impl/RateLimitException.java
diff --git a/src/main/java/cc/fascinated/exception/impl/ResourceNotFoundException.java b/API/src/main/java/cc/fascinated/exception/impl/ResourceNotFoundException.java
similarity index 100%
rename from src/main/java/cc/fascinated/exception/impl/ResourceNotFoundException.java
rename to API/src/main/java/cc/fascinated/exception/impl/ResourceNotFoundException.java
diff --git a/API/src/main/java/cc/fascinated/model/platform/DailyScoresSet.java b/API/src/main/java/cc/fascinated/model/platform/DailyScoresSet.java
new file mode 100644
index 0000000..c0eb358
--- /dev/null
+++ b/API/src/main/java/cc/fascinated/model/platform/DailyScoresSet.java
@@ -0,0 +1,29 @@
+package cc.fascinated.model.platform;
+
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.Table;
+
+import java.util.Date;
+
+/**
+ * @author Fascinated (fascinated7)
+ */
+@Entity
+@Table(name = "metrics")
+public class DailyScoresSet {
+ /**
+ * The platform for the metric.
+ */
+ @Id private String platform;
+
+ /**
+ * The amount of scores set for the day.
+ */
+ private long scoresSet;
+
+ /**
+ * The day the scores were set.
+ */
+ private Date timestamp;
+}
diff --git a/API/src/main/java/cc/fascinated/model/platform/TrackedPlatformMetric.java b/API/src/main/java/cc/fascinated/model/platform/TrackedPlatformMetric.java
new file mode 100644
index 0000000..4ab563b
--- /dev/null
+++ b/API/src/main/java/cc/fascinated/model/platform/TrackedPlatformMetric.java
@@ -0,0 +1,31 @@
+package cc.fascinated.model.platform;
+
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.Table;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author Fascinated (fascinated7)
+ */
+@Entity
+@Getter
+@Setter
+@Table(name = "metric")
+public class TrackedPlatformMetric {
+ /**
+ * The platform for the metric.
+ */
+ @Id private String platform;
+
+ /**
+ * The total amount of scores.
+ */
+ private long totalScores;
+
+ /**
+ * The total amount of ranked scores.
+ */
+ private long totalRankedScores;
+}
diff --git a/src/main/java/cc/fascinated/model/response/ErrorResponse.java b/API/src/main/java/cc/fascinated/model/response/ErrorResponse.java
similarity index 100%
rename from src/main/java/cc/fascinated/model/response/ErrorResponse.java
rename to API/src/main/java/cc/fascinated/model/response/ErrorResponse.java
diff --git a/src/main/java/cc/fascinated/model/score/ScoresOverResponse.java b/API/src/main/java/cc/fascinated/model/score/ScoresOverResponse.java
similarity index 100%
rename from src/main/java/cc/fascinated/model/score/ScoresOverResponse.java
rename to API/src/main/java/cc/fascinated/model/score/ScoresOverResponse.java
diff --git a/src/main/java/cc/fascinated/model/score/TotalScoresResponse.java b/API/src/main/java/cc/fascinated/model/score/TotalScoresResponse.java
similarity index 100%
rename from src/main/java/cc/fascinated/model/score/TotalScoresResponse.java
rename to API/src/main/java/cc/fascinated/model/score/TotalScoresResponse.java
diff --git a/src/main/java/cc/fascinated/model/score/TrackedScore.java b/API/src/main/java/cc/fascinated/model/score/TrackedScore.java
similarity index 100%
rename from src/main/java/cc/fascinated/model/score/TrackedScore.java
rename to API/src/main/java/cc/fascinated/model/score/TrackedScore.java
diff --git a/src/main/java/cc/fascinated/model/token/ScoreSaberAccountToken.java b/API/src/main/java/cc/fascinated/model/token/ScoreSaberAccountToken.java
similarity index 100%
rename from src/main/java/cc/fascinated/model/token/ScoreSaberAccountToken.java
rename to API/src/main/java/cc/fascinated/model/token/ScoreSaberAccountToken.java
diff --git a/src/main/java/cc/fascinated/model/token/ScoreSaberLeaderboardPageToken.java b/API/src/main/java/cc/fascinated/model/token/ScoreSaberLeaderboardPageToken.java
similarity index 100%
rename from src/main/java/cc/fascinated/model/token/ScoreSaberLeaderboardPageToken.java
rename to API/src/main/java/cc/fascinated/model/token/ScoreSaberLeaderboardPageToken.java
diff --git a/src/main/java/cc/fascinated/model/token/ScoreSaberLeaderboardToken.java b/API/src/main/java/cc/fascinated/model/token/ScoreSaberLeaderboardToken.java
similarity index 100%
rename from src/main/java/cc/fascinated/model/token/ScoreSaberLeaderboardToken.java
rename to API/src/main/java/cc/fascinated/model/token/ScoreSaberLeaderboardToken.java
diff --git a/src/main/java/cc/fascinated/model/token/ScoreSaberPageMetadataToken.java b/API/src/main/java/cc/fascinated/model/token/ScoreSaberPageMetadataToken.java
similarity index 100%
rename from src/main/java/cc/fascinated/model/token/ScoreSaberPageMetadataToken.java
rename to API/src/main/java/cc/fascinated/model/token/ScoreSaberPageMetadataToken.java
diff --git a/src/main/java/cc/fascinated/model/token/ScoreSaberPlayerScoreToken.java b/API/src/main/java/cc/fascinated/model/token/ScoreSaberPlayerScoreToken.java
similarity index 100%
rename from src/main/java/cc/fascinated/model/token/ScoreSaberPlayerScoreToken.java
rename to API/src/main/java/cc/fascinated/model/token/ScoreSaberPlayerScoreToken.java
diff --git a/src/main/java/cc/fascinated/model/token/ScoreSaberScoreToken.java b/API/src/main/java/cc/fascinated/model/token/ScoreSaberScoreToken.java
similarity index 100%
rename from src/main/java/cc/fascinated/model/token/ScoreSaberScoreToken.java
rename to API/src/main/java/cc/fascinated/model/token/ScoreSaberScoreToken.java
diff --git a/src/main/java/cc/fascinated/model/token/ScoreSaberScoresPageToken.java b/API/src/main/java/cc/fascinated/model/token/ScoreSaberScoresPageToken.java
similarity index 100%
rename from src/main/java/cc/fascinated/model/token/ScoreSaberScoresPageToken.java
rename to API/src/main/java/cc/fascinated/model/token/ScoreSaberScoresPageToken.java
diff --git a/src/main/java/cc/fascinated/model/token/ScoreSaberWebsocketDataToken.java b/API/src/main/java/cc/fascinated/model/token/ScoreSaberWebsocketDataToken.java
similarity index 100%
rename from src/main/java/cc/fascinated/model/token/ScoreSaberWebsocketDataToken.java
rename to API/src/main/java/cc/fascinated/model/token/ScoreSaberWebsocketDataToken.java
diff --git a/src/main/java/cc/fascinated/model/user/User.java b/API/src/main/java/cc/fascinated/model/user/User.java
similarity index 100%
rename from src/main/java/cc/fascinated/model/user/User.java
rename to API/src/main/java/cc/fascinated/model/user/User.java
diff --git a/src/main/java/cc/fascinated/platform/CurvePoint.java b/API/src/main/java/cc/fascinated/platform/CurvePoint.java
similarity index 100%
rename from src/main/java/cc/fascinated/platform/CurvePoint.java
rename to API/src/main/java/cc/fascinated/platform/CurvePoint.java
diff --git a/src/main/java/cc/fascinated/platform/Platform.java b/API/src/main/java/cc/fascinated/platform/Platform.java
similarity index 100%
rename from src/main/java/cc/fascinated/platform/Platform.java
rename to API/src/main/java/cc/fascinated/platform/Platform.java
diff --git a/src/main/java/cc/fascinated/platform/impl/ScoreSaberPlatform.java b/API/src/main/java/cc/fascinated/platform/impl/ScoreSaberPlatform.java
similarity index 100%
rename from src/main/java/cc/fascinated/platform/impl/ScoreSaberPlatform.java
rename to API/src/main/java/cc/fascinated/platform/impl/ScoreSaberPlatform.java
diff --git a/API/src/main/java/cc/fascinated/repository/couchdb/MetricsRepository.java b/API/src/main/java/cc/fascinated/repository/couchdb/MetricsRepository.java
new file mode 100644
index 0000000..62d94ee
--- /dev/null
+++ b/API/src/main/java/cc/fascinated/repository/couchdb/MetricsRepository.java
@@ -0,0 +1,21 @@
+package cc.fascinated.repository.couchdb;
+
+import cc.fascinated.model.platform.TrackedPlatformMetric;
+import org.springframework.data.repository.CrudRepository;
+
+/**
+ * @author Fascinated (fascinated7)
+ */
+public interface MetricsRepository extends CrudRepository {
+
+ /**
+ * SELECT
+ * platform,
+ * last(total_scores) - first(total_scores) AS scores_set,
+ * timestamp
+ * FROM metrics
+ * TIMESTAMP(timestamp)
+ * SAMPLE BY 1d
+ * ORDER BY timestamp DESC;
+ */
+}
diff --git a/src/main/java/cc/fascinated/repository/couchdb/TrackedScoreRepository.java b/API/src/main/java/cc/fascinated/repository/couchdb/TrackedScoreRepository.java
similarity index 100%
rename from src/main/java/cc/fascinated/repository/couchdb/TrackedScoreRepository.java
rename to API/src/main/java/cc/fascinated/repository/couchdb/TrackedScoreRepository.java
diff --git a/src/main/java/cc/fascinated/repository/mongo/ScoreSaberLeaderboardRepository.java b/API/src/main/java/cc/fascinated/repository/mongo/ScoreSaberLeaderboardRepository.java
similarity index 100%
rename from src/main/java/cc/fascinated/repository/mongo/ScoreSaberLeaderboardRepository.java
rename to API/src/main/java/cc/fascinated/repository/mongo/ScoreSaberLeaderboardRepository.java
diff --git a/src/main/java/cc/fascinated/repository/mongo/UserRepository.java b/API/src/main/java/cc/fascinated/repository/mongo/UserRepository.java
similarity index 100%
rename from src/main/java/cc/fascinated/repository/mongo/UserRepository.java
rename to API/src/main/java/cc/fascinated/repository/mongo/UserRepository.java
diff --git a/src/main/java/cc/fascinated/services/MongoService.java b/API/src/main/java/cc/fascinated/services/MongoService.java
similarity index 100%
rename from src/main/java/cc/fascinated/services/MongoService.java
rename to API/src/main/java/cc/fascinated/services/MongoService.java
diff --git a/API/src/main/java/cc/fascinated/services/PlatformMetricsService.java b/API/src/main/java/cc/fascinated/services/PlatformMetricsService.java
new file mode 100644
index 0000000..8d1b3b1
--- /dev/null
+++ b/API/src/main/java/cc/fascinated/services/PlatformMetricsService.java
@@ -0,0 +1,10 @@
+package cc.fascinated.services;
+
+import org.springframework.stereotype.Service;
+
+/**
+ * @author Fascinated (fascinated7)
+ */
+@Service
+public class PlatformMetricsService {
+}
diff --git a/src/main/java/cc/fascinated/services/PlatformService.java b/API/src/main/java/cc/fascinated/services/PlatformService.java
similarity index 100%
rename from src/main/java/cc/fascinated/services/PlatformService.java
rename to API/src/main/java/cc/fascinated/services/PlatformService.java
diff --git a/src/main/java/cc/fascinated/services/QuestDBService.java b/API/src/main/java/cc/fascinated/services/QuestDBService.java
similarity index 100%
rename from src/main/java/cc/fascinated/services/QuestDBService.java
rename to API/src/main/java/cc/fascinated/services/QuestDBService.java
diff --git a/src/main/java/cc/fascinated/services/ScoreSaberService.java b/API/src/main/java/cc/fascinated/services/ScoreSaberService.java
similarity index 100%
rename from src/main/java/cc/fascinated/services/ScoreSaberService.java
rename to API/src/main/java/cc/fascinated/services/ScoreSaberService.java
diff --git a/src/main/java/cc/fascinated/services/TrackedScoreService.java b/API/src/main/java/cc/fascinated/services/TrackedScoreService.java
similarity index 100%
rename from src/main/java/cc/fascinated/services/TrackedScoreService.java
rename to API/src/main/java/cc/fascinated/services/TrackedScoreService.java
diff --git a/src/main/java/cc/fascinated/services/UserService.java b/API/src/main/java/cc/fascinated/services/UserService.java
similarity index 100%
rename from src/main/java/cc/fascinated/services/UserService.java
rename to API/src/main/java/cc/fascinated/services/UserService.java
diff --git a/src/main/java/cc/fascinated/websocket/Websocket.java b/API/src/main/java/cc/fascinated/websocket/Websocket.java
similarity index 100%
rename from src/main/java/cc/fascinated/websocket/Websocket.java
rename to API/src/main/java/cc/fascinated/websocket/Websocket.java
diff --git a/src/main/java/cc/fascinated/websocket/impl/ScoreSaberWebsocket.java b/API/src/main/java/cc/fascinated/websocket/impl/ScoreSaberWebsocket.java
similarity index 100%
rename from src/main/java/cc/fascinated/websocket/impl/ScoreSaberWebsocket.java
rename to API/src/main/java/cc/fascinated/websocket/impl/ScoreSaberWebsocket.java
diff --git a/src/main/resources/application.yml b/API/src/main/resources/application.yml
similarity index 100%
rename from src/main/resources/application.yml
rename to API/src/main/resources/application.yml