diff --git a/src/App.vue b/src/App.vue
index e6aad19..98c7dd8 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -32,13 +32,13 @@ export default {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
- color: #2c3e50;
+ color: $theme-color-grey-blue;
font-size: 1vw;
overflow: hidden;
z-index: 1;
min-height: 100%;
display: flex;
- background-color: #fcfcfc;
+ background-color: $theme-color-white;
}
@media only screen and (max-width: 1280) {
diff --git a/src/api/admin/authAPI.js b/src/api/admin/authAPI.js
index 419dd70..3d4b299 100644
--- a/src/api/admin/authAPI.js
+++ b/src/api/admin/authAPI.js
@@ -67,11 +67,12 @@ export default {
},
async resetPassword(newPassword) {
- const response = await this.resetPass(newPassword);
- if (response.status === 200) {
- return true;
+ try {
+ const response = await this.resetPass(newPassword);
+ return response;
+ } catch (error) {
+ throw error;
}
- return false;
},
getUserInfo() {
diff --git a/src/api/admin/otpAPI.js b/src/api/admin/otpAPI.js
new file mode 100644
index 0000000..b014993
--- /dev/null
+++ b/src/api/admin/otpAPI.js
@@ -0,0 +1,68 @@
+import axiosInstance from "../axiosInstance.js";
+
+export default {
+ async sendOTP(email) {
+ let bodyFormData = new FormData();
+ bodyFormData.append("email", email);
+
+ try {
+ const response = await axiosInstance({
+ method: "post",
+ url: `/auth/send-otp`,
+ data: bodyFormData
+ });
+
+ return response;
+ } catch (error) {
+ throw error;
+ }
+ },
+ async verifyOTP(email, otp) {
+ let bodyFormData = new FormData();
+ bodyFormData.append("email", email);
+ bodyFormData.append("otp", otp);
+
+ try {
+ const response = await axiosInstance({
+ method: "post",
+ url: `/auth/verify-otp`,
+ data: bodyFormData,
+ });
+
+ return response;
+ } catch (error) {
+ throw error;
+ }
+ },
+ async sendOTPForForget(email) {
+ let bodyFormData = new FormData();
+ bodyFormData.append("email", email);
+
+ try {
+ const response = await axiosInstance({
+ method: "post",
+ url: `/auth/send-otp-forget`,
+ data: bodyFormData,
+ });
+ return response;
+ } catch (error) {
+ throw error;
+ }
+ },
+ async verifyOTPForForget(email, otp) {
+ let bodyFormData = new FormData();
+ bodyFormData.append("email", email);
+ bodyFormData.append("otp", otp);
+
+ try {
+ const response = await axiosInstance({
+ method: "post",
+ url: `/auth/verify-otp-forget`,
+ data: bodyFormData,
+ });
+ return response;
+ } catch (error) {
+ throw error;
+ }
+ }
+};
diff --git a/src/api/admin/submissionsAPI.js b/src/api/admin/submissionsAPI.js
index 38e0721..d721f1a 100644
--- a/src/api/admin/submissionsAPI.js
+++ b/src/api/admin/submissionsAPI.js
@@ -13,12 +13,14 @@ export default {
});
return submissions;
},
- async getUserSubs(username) {
- const response = await this.getSubmissions();
- let data = response.filter(el => {
- return el.username === username;
+
+ // Group submissions by username for efficient processing
+ groupSubmissionsByUsers(submissions, usernames) {
+ const userSubmissions = {};
+ usernames.forEach(username => {
+ userSubmissions[username] = submissions.filter(sub => sub.username === username);
});
- return data;
+ return userSubmissions;
},
async fetchAsCSV() {
@@ -27,5 +29,12 @@ export default {
responseType: "blob",
url: `/api/info/submissions?format=csv`
});
+ },
+
+ async getUserSubs(username) {
+ const submissions = await this.getSubmissions();
+ const submission = submissions.filter(sub => sub.username === username);
+ console.log(submission);
+ return submission;
}
};
diff --git a/src/api/admin/usersAPI.js b/src/api/admin/usersAPI.js
index d985708..b2acd5e 100644
--- a/src/api/admin/usersAPI.js
+++ b/src/api/admin/usersAPI.js
@@ -42,5 +42,15 @@ export default {
responseType: "blob",
url: `/api/info/users?sort=${sortFilter}&filter=${statusFilter}&format=csv`
});
+ },
+
+ async getLeaderboard(page = 1) {
+ const response = await axiosInstance.get(`/api/info/leaderboard?page=${page}`);
+ return response.data;
+ },
+
+ async getUserCount() {
+ const response = await axiosInstance.get('/api/info/usercount');
+ return response.data;
}
};
diff --git a/src/api/axiosInstance.js b/src/api/axiosInstance.js
index 2f4362b..7cd82de 100644
--- a/src/api/axiosInstance.js
+++ b/src/api/axiosInstance.js
@@ -30,6 +30,10 @@ axiosInstance.interceptors.response.use(
let ignoreErrorPagesPath = [
"/auth/login",
"/auth/register",
+ "/auth/send-otp",
+ "/auth/reset-password",
+ "/auth/verify-otp",
+ "/auth/verify-otp-forget",
"/api/submit/challenge"
];
diff --git a/src/assets/labs-logo-dark.svg b/src/assets/labs-logo-dark.svg
new file mode 100644
index 0000000..d0e9cc7
--- /dev/null
+++ b/src/assets/labs-logo-dark.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/assets/leaderboard.svg b/src/assets/leaderboard.svg
index 4f23cb4..8ed83e0 100644
--- a/src/assets/leaderboard.svg
+++ b/src/assets/leaderboard.svg
@@ -1,4 +1,11 @@
diff --git a/src/assets/login.svg b/src/assets/login.svg
index a8ee36c..0d3fdcb 100644
--- a/src/assets/login.svg
+++ b/src/assets/login.svg
@@ -1,11 +1,9 @@
-