UNPKG

authrix

Version:

Lightweight, flexible authentication library for Node.js and TypeScript.

1 lines 4.56 kB
'use strict';var mongodb=require('mongodb');var u,o,i,m=false;function O(){m=false,u=null,o=null,i=null;}async function N(){if(!m){let r=process.env.MONGO_URI,e=process.env.DB_NAME,a=process.env.AUTH_COLLECTION,t=process.env.TWO_FACTOR_COLLECTION;if(!r||!e||!a)throw new Error("Missing required environment variables: MONGO_URI, DB_NAME, AUTH_COLLECTION");u=new mongodb.MongoClient(r),await u.connect();let d=u.db(e);if(o=d.collection(a),!t)throw new Error("Missing required environment variable: TWO_FACTOR_COLLECTION");i=d.collection(t),await o.createIndex({email:1},{unique:true}),await o.createIndex({username:1},{unique:true,sparse:true}),await i.createIndex({id:1},{unique:true}),await i.createIndex({userId:1}),await i.createIndex({expiresAt:1},{expireAfterSeconds:0}),await i.createIndex({type:1}),m=true;}}async function n(){m||await N();}var p={async findUserByEmail(r){await n();let e=await o.findOne({email:r.toLowerCase().trim()});return !e||!e.e?null:{id:e.e.toString(),email:e.email,password:e.password,createdAt:e.createdAt,emailVerified:e.emailVerified||false,emailVerifiedAt:e.emailVerifiedAt,twoFactorEnabled:e.twoFactorEnabled||false,username:e.username||void 0,firstName:e.firstName||void 0,lastName:e.lastName||void 0}},async findUserById(r){if(await n(),!mongodb.ObjectId.isValid(r))return null;let e=await o.findOne({e:new mongodb.ObjectId(r)});return !e||!e.e?null:{id:e.e.toString(),email:e.email,password:e.password,createdAt:e.createdAt,emailVerified:e.emailVerified||false,emailVerifiedAt:e.emailVerifiedAt,twoFactorEnabled:e.twoFactorEnabled||false,username:e.username||void 0,firstName:e.firstName||void 0,lastName:e.lastName||void 0}},async createUser({email:r,password:e,username:a,firstName:t,lastName:d}){await n();let f=r.toLowerCase().trim(),c=a?a.toLowerCase().trim():void 0,w=new Date;try{let s={email:f,password:e,createdAt:w,emailVerified:!1,emailVerifiedAt:void 0,twoFactorEnabled:!1};c&&(s.username=c),t&&(s.firstName=t.trim()),d&&(s.lastName=d.trim());let A=await o.insertOne(s);if(!A.insertedId)throw new Error("Failed to create user: No ID generated");return {id:A.insertedId.toString(),email:f,password:e,createdAt:w,emailVerified:!1,emailVerifiedAt:void 0,twoFactorEnabled:!1,username:c,firstName:t?t.trim():void 0,lastName:d?d.trim():void 0}}catch(s){if(s.code===11e3){if(s.message.includes("email"))throw new Error(`User with email ${r} already exists`);if(s.message.includes("username"))throw new Error(`Username ${a} is already taken`)}throw new Error(`Failed to create user: ${s.message}`)}},async updateUser(r,e){if(await n(),!mongodb.ObjectId.isValid(r))throw new Error("Invalid user ID");let a={...e};delete a.id,delete a.createdAt,a.email&&(a.email=a.email.toLowerCase().trim()),a.username!==void 0&&(a.username=a.username?a.username.toLowerCase().trim():void 0),a.firstName!==void 0&&(a.firstName=a.firstName?a.firstName.trim():void 0),a.lastName!==void 0&&(a.lastName=a.lastName?a.lastName.trim():void 0);try{let t=await o.findOneAndUpdate({e:new mongodb.ObjectId(r)},{$set:a},{returnDocument:"after"});if(!t||!t.value||!t.value.e)throw new Error("User not found");return {id:t.value.e.toString(),email:t.value.email,password:t.value.password,createdAt:t.value.createdAt,emailVerified:t.value.emailVerified||!1,emailVerifiedAt:t.value.emailVerifiedAt,twoFactorEnabled:t.value.twoFactorEnabled||!1,username:t.value.username||void 0,firstName:t.value.firstName||void 0,lastName:t.value.lastName||void 0}}catch(t){if(t.code===11e3){if(t.message.includes("email"))throw new Error(`Email ${e.email} is already in use`);if(t.message.includes("username"))throw new Error(`Username ${e.username} is already taken`)}throw t}},async findUserByUsername(r){await n();let e=r.toLowerCase().trim(),a=await o.findOne({username:e});return !a||!a.e?null:{id:a.e.toString(),email:a.email,password:a.password,createdAt:a.createdAt,emailVerified:a.emailVerified||false,emailVerifiedAt:a.emailVerifiedAt,twoFactorEnabled:a.twoFactorEnabled||false,username:a.username||void 0,firstName:a.firstName||void 0,lastName:a.lastName||void 0}},async storeTwoFactorCode(r){await n(),await i.insertOne(r);},async getTwoFactorCode(r){await n();let e=await i.findOne({id:r});return e||null},async updateTwoFactorCode(r,e){await n(),await i.updateOne({id:r},{$set:e});},async getUserTwoFactorCodes(r,e){await n();let a={userId:r,isUsed:false};return e&&(a.type=e),await i.find(a).toArray()},async cleanupExpiredTwoFactorCodes(){return await n(),(await i.deleteMany({expiresAt:{$lt:new Date}})).deletedCount||0}};exports.a=O;exports.b=p;