mirror of
https://github.com/Sonny93/my-links.git
synced 2025-12-10 15:35:35 +00:00
feat: add user token management
This commit is contained in:
54
app/user/services/api_token_service.ts
Normal file
54
app/user/services/api_token_service.ts
Normal file
@@ -0,0 +1,54 @@
|
||||
import ApiToken from '#user/models/api_token';
|
||||
import User from '#user/models/user';
|
||||
import { DateTime } from 'luxon';
|
||||
|
||||
type CreateApiTokenPayload = {
|
||||
user: User;
|
||||
name: string;
|
||||
expiresAt?: DateTime;
|
||||
};
|
||||
|
||||
export class ApiTokenService {
|
||||
async createToken({
|
||||
user,
|
||||
name,
|
||||
expiresAt,
|
||||
}: CreateApiTokenPayload): Promise<ApiToken> {
|
||||
return await ApiToken.create({
|
||||
userId: user.id,
|
||||
name,
|
||||
expiresAt,
|
||||
isActive: true,
|
||||
});
|
||||
}
|
||||
|
||||
async getUserTokens(userId: number): Promise<ApiToken[]> {
|
||||
return await ApiToken.query()
|
||||
.where('userId', userId)
|
||||
.orderBy('created_at', 'desc');
|
||||
}
|
||||
|
||||
async revokeToken(tokenId: number, userId: number): Promise<void> {
|
||||
const token = await ApiToken.query()
|
||||
.where('id', tokenId)
|
||||
.where('userId', userId)
|
||||
.firstOrFail();
|
||||
|
||||
token.isActive = false;
|
||||
await token.save();
|
||||
}
|
||||
|
||||
async validateToken(tokenString: string): Promise<ApiToken | null> {
|
||||
const token = await ApiToken.query()
|
||||
.where('token', tokenString)
|
||||
.where('isActive', true)
|
||||
.first();
|
||||
|
||||
if (!token || !token.isValid()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
await token.markAsUsed();
|
||||
return token;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user