Files
outline/app/models/ApiKey.ts
T
Tom Moor 69e8aac4f1 Move "Api Keys" listing to filterable table (#12117)
* Move 'Api Keys' listing to filterable table

* Add context menu
Allow copying new keys
2026-04-19 18:12:32 -04:00

70 lines
1.6 KiB
TypeScript

import { isPast } from "date-fns";
import { computed, observable } from "mobx";
import Model from "./base/Model";
import Field from "./decorators/Field";
import User from "./User";
import Relation from "./decorators/Relation";
import type { Searchable } from "./interfaces/Searchable";
class ApiKey extends Model implements Searchable {
static modelName = "ApiKey";
/** The human-readable name of this API key */
@Field
@observable
name: string;
/** A list of scopes that this API key has access to. If empty, the key has full access. */
@Field
@observable
scope?: string[];
/** An optional datetime that the API key expires. */
@Field
@observable
expiresAt?: string;
/** Timestamp that the API key was last used. */
@observable
lastActiveAt?: string;
/** The user who this API key belongs to. */
@Relation(() => User)
user: User;
/** The user ID that the API key belongs to. */
userId: string;
/** The plain text value of the API key, only available on creation. */
value: string;
/** A preview of the last 4 characters of the API key. */
last4: string;
/** Whether the API key has an expiry in the past. */
@computed
get isExpired() {
return this.expiresAt ? isPast(new Date(this.expiresAt)) : false;
}
@computed
get obfuscatedValue() {
if (this.createdAt < new Date("2022-12-03").toISOString()) {
return `...${this.last4}`;
}
return `ol...${this.last4}`;
}
@computed
get searchContent(): string[] {
return [this.name, this.obfuscatedValue].filter(Boolean);
}
@computed
get searchSuppressed(): boolean {
return false;
}
}
export default ApiKey;