2022-03-02 00:11:01 +08:00
|
|
|
import _ from "lodash";
|
2022-03-08 07:41:04 +08:00
|
|
|
import db from "../init/db";
|
|
|
|
import { Filter, ObjectId, MatchKeysAndValues } from "mongodb";
|
2022-03-10 02:40:35 +08:00
|
|
|
import MonkeyError from "../utils/error";
|
2022-03-02 00:11:01 +08:00
|
|
|
|
2022-03-08 07:41:04 +08:00
|
|
|
const COLLECTION_NAME = "ape-keys";
|
|
|
|
|
|
|
|
function getApeKeyFilter(
|
|
|
|
uid: string,
|
2022-03-02 00:11:01 +08:00
|
|
|
keyId: string
|
2022-03-08 07:41:04 +08:00
|
|
|
): Filter<MonkeyTypes.ApeKey> {
|
|
|
|
return {
|
|
|
|
_id: new ObjectId(keyId),
|
|
|
|
uid,
|
|
|
|
};
|
2022-03-02 00:11:01 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
class ApeKeysDAO {
|
2022-03-08 07:41:04 +08:00
|
|
|
static async getApeKeys(uid: string): Promise<MonkeyTypes.ApeKey[]> {
|
|
|
|
return await db
|
|
|
|
.collection<MonkeyTypes.ApeKey>(COLLECTION_NAME)
|
|
|
|
.find({ uid })
|
|
|
|
.toArray();
|
2022-03-02 00:11:01 +08:00
|
|
|
}
|
|
|
|
|
2022-03-10 02:40:35 +08:00
|
|
|
static async getApeKey(keyId: string): Promise<MonkeyTypes.ApeKey | null> {
|
2022-03-08 07:41:04 +08:00
|
|
|
return await db
|
|
|
|
.collection<MonkeyTypes.ApeKey>(COLLECTION_NAME)
|
2022-03-10 02:40:35 +08:00
|
|
|
.findOne({ _id: new ObjectId(keyId) });
|
2022-03-08 07:41:04 +08:00
|
|
|
}
|
2022-03-02 00:11:01 +08:00
|
|
|
|
2022-03-08 07:41:04 +08:00
|
|
|
static async countApeKeysForUser(uid: string): Promise<number> {
|
|
|
|
const apeKeys = await this.getApeKeys(uid);
|
|
|
|
return _.size(apeKeys);
|
|
|
|
}
|
2022-03-02 00:11:01 +08:00
|
|
|
|
2022-03-08 07:41:04 +08:00
|
|
|
static async addApeKey(apeKey: MonkeyTypes.ApeKey): Promise<string> {
|
2022-03-10 02:40:35 +08:00
|
|
|
const insertionResult = await db
|
|
|
|
.collection<MonkeyTypes.ApeKey>(COLLECTION_NAME)
|
|
|
|
.insertOne(apeKey);
|
|
|
|
return insertionResult.insertedId.toHexString();
|
2022-03-02 00:11:01 +08:00
|
|
|
}
|
|
|
|
|
2022-03-08 07:41:04 +08:00
|
|
|
private static async updateApeKey(
|
2022-03-02 00:11:01 +08:00
|
|
|
uid: string,
|
|
|
|
keyId: string,
|
2022-03-08 07:41:04 +08:00
|
|
|
updates: MatchKeysAndValues<MonkeyTypes.ApeKey>
|
2022-03-02 00:11:01 +08:00
|
|
|
): Promise<void> {
|
2022-03-10 02:40:35 +08:00
|
|
|
const updateResult = await db
|
2022-03-08 07:41:04 +08:00
|
|
|
.collection<MonkeyTypes.ApeKey>(COLLECTION_NAME)
|
|
|
|
.updateOne(getApeKeyFilter(uid, keyId), {
|
|
|
|
$inc: { useCount: _.has(updates, "lastUsedOn") ? 1 : 0 },
|
|
|
|
$set: _.pickBy(updates, (value) => !_.isNil(value)),
|
|
|
|
});
|
2022-03-10 02:40:35 +08:00
|
|
|
|
|
|
|
if (updateResult.modifiedCount === 0) {
|
|
|
|
throw new MonkeyError(404, "ApeKey not found");
|
|
|
|
}
|
2022-03-08 07:41:04 +08:00
|
|
|
}
|
2022-03-02 00:11:01 +08:00
|
|
|
|
2022-03-08 07:41:04 +08:00
|
|
|
static async editApeKey(
|
|
|
|
uid: string,
|
|
|
|
keyId: string,
|
|
|
|
name: string,
|
|
|
|
enabled: boolean
|
|
|
|
): Promise<void> {
|
|
|
|
const apeKeyUpdates = {
|
|
|
|
name,
|
|
|
|
enabled,
|
2022-03-02 00:11:01 +08:00
|
|
|
modifiedOn: Date.now(),
|
|
|
|
};
|
|
|
|
|
2022-03-08 07:41:04 +08:00
|
|
|
await this.updateApeKey(uid, keyId, apeKeyUpdates);
|
2022-03-02 00:11:01 +08:00
|
|
|
}
|
|
|
|
|
2022-03-08 07:41:04 +08:00
|
|
|
static async updateLastUsedOn(uid: string, keyId: string): Promise<void> {
|
|
|
|
const apeKeyUpdates = {
|
|
|
|
lastUsedOn: Date.now(),
|
|
|
|
};
|
2022-03-02 00:11:01 +08:00
|
|
|
|
2022-03-08 07:41:04 +08:00
|
|
|
await this.updateApeKey(uid, keyId, apeKeyUpdates);
|
2022-03-02 00:11:01 +08:00
|
|
|
}
|
2022-03-06 10:25:30 +08:00
|
|
|
|
2022-03-08 07:41:04 +08:00
|
|
|
static async deleteApeKey(uid: string, keyId: string): Promise<void> {
|
2022-03-10 02:40:35 +08:00
|
|
|
const deletionResult = await db
|
2022-03-08 07:41:04 +08:00
|
|
|
.collection<MonkeyTypes.ApeKey>(COLLECTION_NAME)
|
|
|
|
.deleteOne(getApeKeyFilter(uid, keyId));
|
2022-03-10 02:40:35 +08:00
|
|
|
|
|
|
|
if (deletionResult.deletedCount === 0) {
|
|
|
|
throw new MonkeyError(404, "ApeKey not found");
|
|
|
|
}
|
2022-03-06 10:25:30 +08:00
|
|
|
}
|
2022-03-02 00:11:01 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
export default ApeKeysDAO;
|