@devmoods/express-extras 0.22.1 → 0.22.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/auth.d.ts CHANGED
@@ -10,9 +10,10 @@ export interface AuthOptions<UserModel extends Record<string, any>> {
10
10
  redis: RedisClient;
11
11
  filterUser(user: UserModel): Partial<UserModel>;
12
12
  tokenExpiry?: number;
13
- onResetRequested?(user: UserModel, temporaryToken: string): void | Promise<void>;
13
+ onPasswordResetRequested?(user: UserModel, temporaryToken: string): void | Promise<void>;
14
14
  onPasswordChanged?(user: UserModel, newPassword: string): Promise<void>;
15
- onUserVerified?(user: UserModel): Promise<void>;
15
+ onEmailVerified?(user: UserModel): Promise<void>;
16
+ onEmailVerificationRequest?(email: string): Promise<void>;
16
17
  }
17
18
  export interface CreateAuth<UserModel extends Record<string, any>> {
18
19
  createRouter: () => Router;
@@ -20,7 +21,7 @@ export interface CreateAuth<UserModel extends Record<string, any>> {
20
21
  middleware: (authorize?: boolean) => RequestHandler;
21
22
  createVerificationToken(email: string): Promise<string>;
22
23
  }
23
- export declare function createAuth<UserModel extends Record<string, any>>({ getUserByToken, methods: { emailAndPassword }, filterUser, redis, tokenExpiry, onResetRequested, onPasswordChanged, onUserVerified, }: AuthOptions<UserModel>): CreateAuth<UserModel>;
24
+ export declare function createAuth<UserModel extends Record<string, any>>({ getUserByToken, methods: { emailAndPassword }, filterUser, redis, tokenExpiry, onPasswordResetRequested, onPasswordChanged, onEmailVerified, onEmailVerificationRequest, }: AuthOptions<UserModel>): CreateAuth<UserModel>;
24
25
  /**
25
26
  * Extract a Bearer token from the HTTP Authorization header
26
27
  * of `req`.
package/dist/auth.js CHANGED
@@ -14,7 +14,7 @@ const TEMP_TOKEN_EXIRES_IN = 3600;
14
14
  export function createAuthToken(payload, secret = process.env.APP_JWT_SECRET) {
15
15
  return jwt.sign(payload, secret, { expiresIn: TOKEN_EXPIRES_IN });
16
16
  }
17
- export function createAuth({ getUserByToken, methods: { emailAndPassword }, filterUser = (x) => x, redis, tokenExpiry = TOKEN_EXPIRES_IN, onResetRequested, onPasswordChanged, onUserVerified, }) {
17
+ export function createAuth({ getUserByToken, methods: { emailAndPassword }, filterUser = (x) => x, redis, tokenExpiry = TOKEN_EXPIRES_IN, onPasswordResetRequested, onPasswordChanged, onEmailVerified, onEmailVerificationRequest, }) {
18
18
  const useCurrentUser = () => useContext('currentUser');
19
19
  const setCurrentUser = (user) => setContext('currentUser', user);
20
20
  const skipPasswordCheck = async () => true;
@@ -59,7 +59,7 @@ export function createAuth({ getUserByToken, methods: { emailAndPassword }, filt
59
59
  const tokenSchema = {
60
60
  type: 'string',
61
61
  minLength: 50,
62
- maxLength: 64,
62
+ maxLength: 256,
63
63
  };
64
64
  const passwordSchema = { type: 'string', minLength: 8 };
65
65
  const emailSchema = { type: 'string', minLength: 4 };
@@ -82,6 +82,15 @@ export function createAuth({ getUserByToken, methods: { emailAndPassword }, filt
82
82
  logger.info('user changed password');
83
83
  return 200;
84
84
  }));
85
+ router.post('/verify-email-request', validateBody({
86
+ type: 'object',
87
+ properties: { email: emailSchema },
88
+ required: ['email'],
89
+ }), route(async (req) => {
90
+ const { email } = req.body;
91
+ await onEmailVerificationRequest?.(email);
92
+ return 202;
93
+ }));
85
94
  router.post('/verify-email', validateBody({
86
95
  type: 'object',
87
96
  properties: { token: tokenSchema, email: emailSchema },
@@ -102,7 +111,7 @@ export function createAuth({ getUserByToken, methods: { emailAndPassword }, filt
102
111
  }
103
112
  const user = await emailAndPassword(email, skipPasswordCheck);
104
113
  setCurrentUser(user);
105
- await onUserVerified?.(user);
114
+ await onEmailVerified?.(user);
106
115
  await redis.del(token);
107
116
  logger.info('user verified');
108
117
  return 200;
@@ -142,7 +151,7 @@ export function createAuth({ getUserByToken, methods: { emailAndPassword }, filt
142
151
  await redis.set(temporaryToken, user.email, {
143
152
  EX: TEMP_TOKEN_EXIRES_IN,
144
153
  });
145
- await onResetRequested?.(user, temporaryToken);
154
+ await onPasswordResetRequested?.(user, temporaryToken);
146
155
  logger.info('password reset request', { email });
147
156
  }
148
157
  catch (error) {
@@ -19,6 +19,7 @@ export function before({ cookies = false, helmet: useHelmet = true, json: useJso
19
19
  logRequestDuration(),
20
20
  Sentry.Handlers.requestHandler(),
21
21
  Sentry.Handlers.tracingHandler(),
22
+ analyticsProxy(),
22
23
  useHelmet &&
23
24
  helmet({
24
25
  contentSecurityPolicy: {
@@ -102,7 +103,7 @@ function analyticsProxy() {
102
103
  * Register middlewares that must come after the app routes.
103
104
  */
104
105
  export function after() {
105
- return compose([analyticsProxy(), notFound()]);
106
+ return compose([notFound()]);
106
107
  }
107
108
  /**
108
109
  * Alias of `route()`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@devmoods/express-extras",
3
- "version": "0.22.1",
3
+ "version": "0.22.3",
4
4
  "description": "Kubernetes-ready utilities for rapid Node.js application development",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",