This commit enhances type safety and fixes type-related issues throughout the project including: - Updated type definitions in entities, repositories, and models - Improved type annotations in services and controllers - Fixed type issues in adapters and utilities - Enhanced test file type definitions - Added typings/index.d.ts for global type declarations 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude <noreply@anthropic.com>
92 lines
2.4 KiB
TypeScript
92 lines
2.4 KiB
TypeScript
import dayjs from 'dayjs';
|
|
|
|
import { Entity, type EntityData } from './Entity.ts';
|
|
import { EntityUtil, type EasyData } from '../util/EntityUtil.ts';
|
|
|
|
export enum TokenType {
|
|
granular = 'granular',
|
|
classic = 'classic',
|
|
}
|
|
interface BaseTokenData extends EntityData {
|
|
tokenId: string;
|
|
tokenMark: string;
|
|
tokenKey: string;
|
|
cidrWhitelist?: string[];
|
|
userId: string;
|
|
isReadonly?: boolean;
|
|
type?: TokenType | string;
|
|
lastUsedAt?: Date;
|
|
}
|
|
|
|
interface ClassicTokenData extends BaseTokenData {
|
|
isAutomation?: boolean;
|
|
}
|
|
interface GranularTokenData extends BaseTokenData {
|
|
name: string;
|
|
description?: string;
|
|
allowedScopes?: string[];
|
|
allowedPackages?: string[];
|
|
expires: number;
|
|
expiredAt: Date;
|
|
}
|
|
|
|
type TokenData = ClassicTokenData | GranularTokenData;
|
|
|
|
export function isGranularToken(
|
|
data: TokenData | Token
|
|
): data is GranularTokenData {
|
|
return data.type === TokenType.granular;
|
|
}
|
|
|
|
export class Token extends Entity {
|
|
readonly tokenId: string;
|
|
readonly tokenMark: string;
|
|
readonly tokenKey: string;
|
|
readonly cidrWhitelist: string[];
|
|
readonly userId: string;
|
|
readonly isReadonly: boolean;
|
|
readonly isAutomation: boolean;
|
|
readonly type?: TokenType;
|
|
readonly name?: string;
|
|
readonly description?: string;
|
|
readonly allowedScopes?: string[];
|
|
readonly expiredAt?: Date;
|
|
readonly expires?: number;
|
|
lastUsedAt: Date | null;
|
|
allowedPackages?: string[];
|
|
token: string;
|
|
|
|
constructor(data: TokenData) {
|
|
super(data);
|
|
this.userId = data.userId;
|
|
this.tokenId = data.tokenId;
|
|
this.tokenMark = data.tokenMark;
|
|
this.tokenKey = data.tokenKey;
|
|
this.cidrWhitelist = data.cidrWhitelist || [];
|
|
this.isReadonly = data.isReadonly || false;
|
|
this.type = (data.type as TokenType) || TokenType.classic;
|
|
this.lastUsedAt = data.lastUsedAt || null;
|
|
|
|
if (isGranularToken(data)) {
|
|
this.name = data.name;
|
|
this.description = data.description;
|
|
this.allowedScopes = data.allowedScopes;
|
|
this.expiredAt = data.expiredAt;
|
|
this.allowedPackages = data.allowedPackages;
|
|
this.isAutomation = false;
|
|
} else {
|
|
this.isAutomation = data.isAutomation || false;
|
|
}
|
|
}
|
|
|
|
static create(data: EasyData<TokenData, 'tokenId'>): Token {
|
|
const newData = EntityUtil.defaultData(data, 'tokenId');
|
|
if (isGranularToken(newData) && !newData.expiredAt) {
|
|
newData.expiredAt = dayjs(newData.createdAt)
|
|
.add(newData.expires, 'days')
|
|
.toDate();
|
|
}
|
|
return new Token(newData);
|
|
}
|
|
}
|