summaryrefslogtreecommitdiffstats
path: root/server/model/api_key.js
diff options
context:
space:
mode:
Diffstat (limited to 'server/model/api_key.js')
-rw-r--r--server/model/api_key.js76
1 files changed, 76 insertions, 0 deletions
diff --git a/server/model/api_key.js b/server/model/api_key.js
new file mode 100644
index 0000000..96de984
--- /dev/null
+++ b/server/model/api_key.js
@@ -0,0 +1,76 @@
+const { BeanModel } = require("redbean-node/dist/bean-model");
+const { R } = require("redbean-node");
+const dayjs = require("dayjs");
+
+class APIKey extends BeanModel {
+ /**
+ * Get the current status of this API key
+ * @returns {string} active, inactive or expired
+ */
+ getStatus() {
+ let current = dayjs();
+ let expiry = dayjs(this.expires);
+ if (expiry.diff(current) < 0) {
+ return "expired";
+ }
+
+ return this.active ? "active" : "inactive";
+ }
+
+ /**
+ * Returns an object that ready to parse to JSON
+ * @returns {object} Object ready to parse
+ */
+ toJSON() {
+ return {
+ id: this.id,
+ key: this.key,
+ name: this.name,
+ userID: this.user_id,
+ createdDate: this.created_date,
+ active: this.active,
+ expires: this.expires,
+ status: this.getStatus(),
+ };
+ }
+
+ /**
+ * Returns an object that ready to parse to JSON with sensitive fields
+ * removed
+ * @returns {object} Object ready to parse
+ */
+ toPublicJSON() {
+ return {
+ id: this.id,
+ name: this.name,
+ userID: this.user_id,
+ createdDate: this.created_date,
+ active: this.active,
+ expires: this.expires,
+ status: this.getStatus(),
+ };
+ }
+
+ /**
+ * Create a new API Key and store it in the database
+ * @param {object} key Object sent by client
+ * @param {int} userID ID of socket user
+ * @returns {Promise<bean>} API key
+ */
+ static async save(key, userID) {
+ let bean;
+ bean = R.dispense("api_key");
+
+ bean.key = key.key;
+ bean.name = key.name;
+ bean.user_id = userID;
+ bean.active = key.active;
+ bean.expires = key.expires;
+
+ await R.store(bean);
+
+ return bean;
+ }
+}
+
+module.exports = APIKey;