feat: Add lastUsedAt to API keys (#7082)
* feat: Add lastUsedAt to API keys * rename column to lastActiveAt * switch order
This commit is contained in:
@@ -17,4 +17,26 @@ describe("#ApiKey", () => {
|
||||
expect(ApiKey.match("1234567890")).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe("lastActiveAt", () => {
|
||||
test("should update lastActiveAt", async () => {
|
||||
const apiKey = await buildApiKey({
|
||||
name: "Dev",
|
||||
});
|
||||
await apiKey.updateActiveAt();
|
||||
expect(apiKey.lastActiveAt).toBeTruthy();
|
||||
});
|
||||
|
||||
test("should not update lastActiveAt within 5 minutes", async () => {
|
||||
const apiKey = await buildApiKey({
|
||||
name: "Dev",
|
||||
});
|
||||
await apiKey.updateActiveAt();
|
||||
expect(apiKey.lastActiveAt).toBeTruthy();
|
||||
|
||||
const lastActiveAt = apiKey.lastActiveAt;
|
||||
await apiKey.updateActiveAt();
|
||||
expect(apiKey.lastActiveAt).toEqual(lastActiveAt);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import { subMinutes } from "date-fns";
|
||||
import randomstring from "randomstring";
|
||||
import { InferAttributes, InferCreationAttributes } from "sequelize";
|
||||
import {
|
||||
@@ -39,6 +40,10 @@ class ApiKey extends ParanoidModel<
|
||||
@Column
|
||||
expiresAt: Date | null;
|
||||
|
||||
@IsDate
|
||||
@Column
|
||||
lastActiveAt: Date | null;
|
||||
|
||||
// hooks
|
||||
|
||||
@BeforeValidate
|
||||
@@ -67,6 +72,18 @@ class ApiKey extends ParanoidModel<
|
||||
@ForeignKey(() => User)
|
||||
@Column
|
||||
userId: string;
|
||||
|
||||
updateActiveAt = async () => {
|
||||
const fiveMinutesAgo = subMinutes(new Date(), 5);
|
||||
|
||||
// ensure this is updated only every few minutes otherwise
|
||||
// we'll be constantly writing to the DB as API requests happen
|
||||
if (!this.lastActiveAt || this.lastActiveAt < fiveMinutesAgo) {
|
||||
this.lastActiveAt = new Date();
|
||||
}
|
||||
|
||||
return this.save();
|
||||
};
|
||||
}
|
||||
|
||||
export default ApiKey;
|
||||
|
||||
Reference in New Issue
Block a user