Prettier...
Some checks failed
continuous-integration/drone/pr Build is failing

This commit is contained in:
2023-05-24 10:33:41 -04:00
parent 40645f58e3
commit 65e30ba1c7
33 changed files with 548 additions and 423 deletions

View File

@@ -1,65 +1,81 @@
import { InferSchemaType, Model, Schema, StringSchemaDefinition, Types } from 'mongoose';
import {
InferSchemaType,
Model,
Schema,
StringSchemaDefinition,
Types,
} from "mongoose";
import { TokenType } from '../constants/tokens';
import { getDefaultExpiresFor } from '../utils/getDefaultExpiresFor';
import { sign, verify } from '../utils/jwt';
import { TokenType } from "../constants/tokens";
import { getDefaultExpiresFor } from "../utils/getDefaultExpiresFor";
import { sign, verify } from "../utils/jwt";
export interface Token {
auth: StringSchemaDefinition;
expires?: number;
type: TokenType;
auth: StringSchemaDefinition;
expires?: number;
type: TokenType;
}
export interface TokenModel extends Model<Token> {
cleanupExpiredTokens(): { success: boolean; deletedCount: number };
getToken(type: TokenType, auth: Types.ObjectId, expires?: number): string;
validateResetToken(token: string): Types.ObjectId | false;
cleanupExpiredTokens(): { success: boolean; deletedCount: number };
getToken(type: TokenType, auth: Types.ObjectId, expires?: number): string;
validateResetToken(token: string): Types.ObjectId | false;
}
export const TokenSchema = new Schema<Token, TokenModel>(
{
auth: { type: Types.ObjectId, index: true },
expires: { type: Number, required: true },
type: { type: String, enum: TokenType, required: true },
},
{
minimize: true,
timestamps: true,
},
{
auth: { type: Types.ObjectId, index: true },
expires: { type: Number, required: true },
type: { type: String, enum: TokenType, required: true },
},
{
minimize: true,
timestamps: true,
}
);
TokenSchema.statics = {
async cleanupExpiredTokens() {
const { acknowledged, deletedCount } = await this.deleteMany({ expires: { $lte: Date.now() } });
return { success: acknowledged, deletedCount };
},
async cleanupExpiredTokens() {
const { acknowledged, deletedCount } = await this.deleteMany({
expires: { $lte: Date.now() },
});
return { success: acknowledged, deletedCount };
},
async getToken(type: TokenType, auth: StringSchemaDefinition, expires?: number) {
const existing = await this.findOne({ type, auth });
if (existing) {
await existing.deleteOne();
}
async getToken(
type: TokenType,
auth: StringSchemaDefinition,
expires?: number
) {
const existing = await this.findOne({ type, auth });
if (existing) {
await existing.deleteOne();
}
const doc = await this.create({ type, auth, expires: expires || getDefaultExpiresFor(type) });
return sign({
sub: `${doc._id}`,
exp: doc.expires,
});
},
const doc = await this.create({
type,
auth,
expires: expires || getDefaultExpiresFor(type),
});
return sign({
sub: `${doc._id}`,
exp: doc.expires,
});
},
async validateResetToken(token: string) {
const { sub } = verify(token);
async validateResetToken(token: string) {
const { sub } = verify(token);
if (sub) {
const record = await this.findById(sub);
if (record) {
await record.deleteOne();
return !!record?.expires && record.expires >= Date.now() && record.auth;
}
}
if (sub) {
const record = await this.findById(sub);
if (record) {
await record.deleteOne();
return !!record?.expires && record.expires >= Date.now() && record.auth;
}
}
return false;
},
return false;
},
};
export type TokenSchema = InferSchemaType<typeof TokenSchema>;