create-warlock 3.0.15 → 3.0.17

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.
Files changed (26) hide show
  1. package/package.json +1 -1
  2. package/templates/warlock/package.json +6 -5
  3. package/templates/warlock/src/app/users/controllers/auth/{activate-account.ts → activate-account.controller.ts} +18 -17
  4. package/templates/warlock/src/app/users/controllers/auth/admin-login.controller.ts +39 -0
  5. package/templates/warlock/src/app/users/controllers/auth/create-account.controller.ts +25 -0
  6. package/templates/warlock/src/app/users/controllers/auth/login.controller.ts +32 -0
  7. package/templates/warlock/src/app/users/routes.ts +17 -17
  8. package/templates/warlock/src/app/users/services/account.service.ts +16 -0
  9. package/templates/warlock/src/app/users/services/login.service.ts +18 -0
  10. package/templates/warlock/src/app/users/validation/activate-account.validation.ts +8 -0
  11. package/templates/warlock/src/app/users/validation/admin-login.validation.ts +8 -0
  12. package/templates/warlock/src/app/users/validation/create-account.validation.ts +10 -0
  13. package/templates/warlock/src/app/users/validation/login.validation.ts +8 -0
  14. package/templates/warlock/src/app/users/controllers/auth/admin-login.ts +0 -40
  15. package/templates/warlock/src/app/users/controllers/auth/login.request.ts +0 -28
  16. package/templates/warlock/src/app/users/controllers/auth/register.request.ts +0 -24
  17. /package/templates/warlock/src/app/users/controllers/auth/{create-account.ts → create-account-simple.controller.ts} +0 -0
  18. /package/templates/warlock/src/app/users/controllers/auth/{forget-password.ts → forget-password.controller.ts} +0 -0
  19. /package/templates/warlock/src/app/users/controllers/auth/{logout.ts → logout.controller.ts} +0 -0
  20. /package/templates/warlock/src/app/users/controllers/auth/{resend-activation-code.ts → resend-activation-code.controller.ts} +0 -0
  21. /package/templates/warlock/src/app/users/controllers/auth/{reset-password.ts → reset-password.controller.ts} +0 -0
  22. /package/templates/warlock/src/app/users/controllers/auth/{verify-forget-password-code.ts → verify-forget-password-code.controller.ts} +0 -0
  23. /package/templates/warlock/src/app/users/controllers/profile/{change-password.ts → change-password.controller.ts} +0 -0
  24. /package/templates/warlock/src/app/users/controllers/profile/{my-profile.ts → my-profile.controller.ts} +0 -0
  25. /package/templates/warlock/src/app/users/controllers/profile/{update-profile.ts → update-profile.controller.ts} +0 -0
  26. /package/templates/warlock/src/app/users/controllers/{restful-users.ts → users.restful.ts} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-warlock",
3
- "version": "3.0.15",
3
+ "version": "3.0.17",
4
4
  "main": "./esm/index.js",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -30,11 +30,12 @@
30
30
  "@mongez/dotenv": "^1.1.9",
31
31
  "@mongez/config": "^1.0.26",
32
32
  "@mongez/supportive-is": "^2.0.4",
33
- "@warlock.js/auth": "3.0.15",
34
- "@warlock.js/cache": "3.0.15",
35
- "@warlock.js/cascade": "3.0.15",
36
- "@warlock.js/core": "3.0.15",
37
- "@warlock.js/logger": "3.0.15",
33
+ "@warlock.js/auth": "3.0.17",
34
+ "@warlock.js/cache": "3.0.17",
35
+ "@warlock.js/cascade": "3.0.17",
36
+ "@warlock.js/core": "3.0.17",
37
+ "@warlock.js/logger": "3.0.17",
38
+ "@warlock.js/seal": "3.0.17",
38
39
  "@faker-js/faker": "^9.2.0",
39
40
  "dayjs": "^1.11.13"
40
41
  },
@@ -1,8 +1,13 @@
1
1
  import type { Request, Response } from "@warlock.js/core";
2
2
  import { usersRepository } from "app/users/repositories/users.repository";
3
-
4
- export default async function activateAccount(
5
- request: Request,
3
+ import { loginUserService } from "app/users/services/login.service";
4
+ import {
5
+ activateAccountSchema,
6
+ type ActivateAccountData,
7
+ } from "app/users/validation/activate-account.validation";
8
+
9
+ export default async function activateAccountController(
10
+ request: Request<ActivateAccountData>,
6
11
  response: Response,
7
12
  ) {
8
13
  const currentUser = request.user;
@@ -14,25 +19,15 @@ export default async function activateAccount(
14
19
  activatedAt: new Date(),
15
20
  });
16
21
 
17
- const accessToken = await currentUser.generateAccessToken();
22
+ const loginData = await loginUserService(currentUser);
18
23
 
19
- return response.success({
20
- user: {
21
- ...(await currentUser.toJSON()),
22
- accessToken: accessToken,
23
- userType: currentUser.userType,
24
- },
25
- });
24
+ return response.success(loginData);
26
25
  }
27
26
 
28
- activateAccount.validation = {
29
- rules: {
30
- code: ["required"],
31
- email: ["required", "email"],
32
- },
27
+ activateAccountController.validation = {
28
+ schema: activateAccountSchema,
33
29
  validate: async (request: Request, response: Response) => {
34
30
  const user = await usersRepository.first({
35
- isActive: false,
36
31
  email: request.input("email"),
37
32
  activationCode: request.int("code"),
38
33
  });
@@ -43,6 +38,12 @@ activateAccount.validation = {
43
38
  });
44
39
  }
45
40
 
41
+ if (user.isActive) {
42
+ return response.badRequest({
43
+ error: "User already activated",
44
+ });
45
+ }
46
+
46
47
  request.user = user;
47
48
  },
48
49
  };
@@ -0,0 +1,39 @@
1
+ import type { Request, Response } from "@warlock.js/core";
2
+ import { User } from "app/users/models/user";
3
+ import { loginUserService } from "app/users/services/login.service";
4
+ import {
5
+ adminLoginSchema,
6
+ type AdminLoginData,
7
+ } from "app/users/validation/admin-login.validation";
8
+
9
+ export default async function adminLoginController(
10
+ request: Request<AdminLoginData>,
11
+ response: Response,
12
+ ) {
13
+ const user = request.user;
14
+
15
+ const loginData = await loginUserService(user);
16
+
17
+ return response.success(loginData);
18
+ }
19
+
20
+ adminLoginController.validation = {
21
+ schema: adminLoginSchema,
22
+ validate: async (request: Request, response: Response) => {
23
+ const user = await User.attempt(request.validated());
24
+
25
+ if (!user) {
26
+ return response.badRequest({
27
+ error: "Invalid credentials",
28
+ });
29
+ }
30
+
31
+ if (!user.get("isActive")) {
32
+ return response.badRequest({
33
+ error: "Your account is suspended!",
34
+ });
35
+ }
36
+
37
+ request.user = user;
38
+ },
39
+ };
@@ -0,0 +1,25 @@
1
+ import type { Request, RequestHandler, Response } from "@warlock.js/core";
2
+ import { createAccountService } from "app/users/services/account.service";
3
+ import { loginUserService } from "app/users/services/login.service";
4
+ import {
5
+ createAccountSchema,
6
+ type CreateAccountData,
7
+ } from "app/users/validation/create-account.validation";
8
+
9
+ export const createAccountController: RequestHandler = async (
10
+ request: Request<CreateAccountData>,
11
+ response: Response,
12
+ ) => {
13
+ const user = await createAccountService(request.validated());
14
+
15
+ request.guest = request.user;
16
+ request.user = user;
17
+
18
+ return response.success({
19
+ user: await loginUserService(user),
20
+ });
21
+ };
22
+
23
+ createAccountController.validation = {
24
+ schema: createAccountSchema,
25
+ };
@@ -0,0 +1,32 @@
1
+ import {
2
+ type Request,
3
+ type RequestHandler,
4
+ type Response,
5
+ } from "@warlock.js/core";
6
+ import { User } from "app/users/models/user";
7
+ import { loginUserService } from "app/users/services/login.service";
8
+ import {
9
+ loginSchema,
10
+ type LoginData,
11
+ } from "app/users/validation/login.validation";
12
+
13
+ export const loginController: RequestHandler = async (
14
+ request: Request<LoginData>,
15
+ response: Response,
16
+ ) => {
17
+ const user = await User.attempt(request.validated());
18
+
19
+ if (!user) {
20
+ return response.badRequest({
21
+ error: "Invalid credentials",
22
+ });
23
+ }
24
+
25
+ const loginData = await loginUserService(user);
26
+
27
+ return response.success(loginData);
28
+ };
29
+
30
+ loginController.validation = {
31
+ schema: loginSchema,
32
+ };
@@ -5,23 +5,23 @@ import {
5
5
  guardedGuest,
6
6
  guardedGuestAdmin,
7
7
  } from "app/utils/router";
8
- import activateAccount from "./controllers/auth/activate-account";
9
- import adminLogin from "./controllers/auth/admin-login";
10
- import forgetPassword from "./controllers/auth/forget-password";
11
- import { loginRequest } from "./controllers/auth/login.request";
12
- import logout from "./controllers/auth/logout";
13
- import { registerRequest } from "./controllers/auth/register.request";
14
- import resendActivationCode from "./controllers/auth/resend-activation-code";
15
- import resetPassword from "./controllers/auth/reset-password";
16
- import verifyForgetPasswordCode from "./controllers/auth/verify-forget-password-code";
17
- import changePassword from "./controllers/profile/change-password";
18
- import myProfile from "./controllers/profile/my-profile";
19
- import updateProfile from "./controllers/profile/update-profile";
20
- import { restfulUsers } from "./controllers/restful-users";
8
+ import activateAccountController from "./controllers/auth/activate-account.controller";
9
+ import adminLoginController from "./controllers/auth/admin-login.controller";
10
+ import { createAccountController } from "./controllers/auth/create-account.controller";
11
+ import forgetPassword from "./controllers/auth/forget-password.controller";
12
+ import { loginController } from "./controllers/auth/login.controller";
13
+ import logout from "./controllers/auth/logout.controller";
14
+ import resendActivationCode from "./controllers/auth/resend-activation-code.controller";
15
+ import resetPassword from "./controllers/auth/reset-password.controller";
16
+ import verifyForgetPasswordCode from "./controllers/auth/verify-forget-password-code.controller";
17
+ import changePassword from "./controllers/profile/change-password.controller";
18
+ import myProfile from "./controllers/profile/my-profile.controller";
19
+ import updateProfile from "./controllers/profile/update-profile.controller";
20
+ import { restfulUsers } from "./controllers/users.restful";
21
21
 
22
22
  // admin auth
23
23
  guardedGuestAdmin(() => {
24
- router.post("/login", adminLogin);
24
+ router.post("/login", adminLoginController);
25
25
  router.post("/forget-password", forgetPassword);
26
26
  router.post("/reset-password", resetPassword);
27
27
  });
@@ -33,9 +33,9 @@ guardedAdmin(() => {
33
33
 
34
34
  // user auth
35
35
  guardedGuest(() => {
36
- router.post("/login", loginRequest);
37
- router.post("/register", registerRequest);
38
- router.post("/register/verify", activateAccount);
36
+ router.post("/login", loginController);
37
+ router.post("/register", createAccountController);
38
+ router.post("/register/verify", activateAccountController);
39
39
  router.post("/resend-activation-code", resendActivationCode);
40
40
  router.post("/forget-password", forgetPassword);
41
41
  router.post("/forget-password/verify-code", verifyForgetPasswordCode);
@@ -0,0 +1,16 @@
1
+ import { Random } from "@mongez/reinforcements";
2
+ import type { User } from "app/users/models/user";
3
+ import usersRepository from "app/users/repositories/users-repository";
4
+
5
+ /**
6
+ * Create a new user account
7
+ */
8
+ export async function createAccountService(
9
+ profileData: Record<string, any>,
10
+ ): Promise<User> {
11
+ return await usersRepository.create({
12
+ isCustomer: true,
13
+ ...profileData,
14
+ activationCode: Random.int(100000, 999999),
15
+ });
16
+ }
@@ -0,0 +1,18 @@
1
+ import type { User } from "app/users/models/user";
2
+
3
+ /**
4
+ * Login user and return user data with access token
5
+ */
6
+ export async function loginUserService(user: User): Promise<{
7
+ user: any;
8
+ accessToken: string;
9
+ userType: string;
10
+ }> {
11
+ const accessToken = await user.generateAccessToken();
12
+
13
+ return {
14
+ user: await user.toJSON(),
15
+ accessToken: accessToken,
16
+ userType: user.userType,
17
+ };
18
+ }
@@ -0,0 +1,8 @@
1
+ import { v, type Infer } from "@warlock.js/core";
2
+
3
+ export const activateAccountSchema = v.object({
4
+ email: v.string().email().required(),
5
+ code: v.string().required(),
6
+ });
7
+
8
+ export type ActivateAccountData = Infer<typeof activateAccountSchema>;
@@ -0,0 +1,8 @@
1
+ import { v, type Infer } from "@warlock.js/core";
2
+
3
+ export const adminLoginSchema = v.object({
4
+ email: v.string().email().required(),
5
+ password: v.string().required(),
6
+ });
7
+
8
+ export type AdminLoginData = Infer<typeof adminLoginSchema>;
@@ -0,0 +1,10 @@
1
+ import { v, type Infer } from "@warlock.js/core";
2
+
3
+ export const createAccountSchema = v.object({
4
+ name: v.string().minLength(2).required(),
5
+ email: v.string().email().required(),
6
+ password: v.string().minLength(8).required().strongPassword(),
7
+ confirmPassword: v.string().minLength(8).required().saveAs("password"),
8
+ });
9
+
10
+ export type CreateAccountData = Infer<typeof createAccountSchema>;
@@ -0,0 +1,8 @@
1
+ import { v, type Infer } from "@warlock.js/core";
2
+
3
+ export const loginSchema = v.object({
4
+ email: v.string().email().required(),
5
+ password: v.string().required(),
6
+ });
7
+
8
+ export type LoginData = Infer<typeof loginSchema>;
@@ -1,40 +0,0 @@
1
- import type { Request, Response } from "@warlock.js/core";
2
- import { User } from "app/users/models/user";
3
-
4
- export default async function adminLogin(request: Request, response: Response) {
5
- const user = request.user;
6
-
7
- const auth = await user.generateAccessToken();
8
-
9
- return response.success({
10
- user: {
11
- ...(await user.toJSON()),
12
- accessToken: auth,
13
- userType: user.userType,
14
- },
15
- });
16
- }
17
-
18
- adminLogin.validation = {
19
- rules: {
20
- password: ["required"],
21
- email: ["required", "email"],
22
- },
23
- validate: async (request: Request, response: Response) => {
24
- const user = await User.attempt(request.only(["email", "password"]));
25
-
26
- if (!user) {
27
- return response.badRequest({
28
- error: "Invalid credentials",
29
- });
30
- }
31
-
32
- if (!user.get("isActive")) {
33
- return response.badRequest({
34
- error: "Your account is suspended!",
35
- });
36
- }
37
-
38
- request.user = user;
39
- },
40
- };
@@ -1,28 +0,0 @@
1
- import {
2
- type Request,
3
- type RequestHandler,
4
- type Response,
5
- } from "@warlock.js/core";
6
- import { User } from "app/users/models/user";
7
-
8
- export const loginRequest: RequestHandler = async (
9
- request: Request,
10
- response: Response,
11
- ) => {
12
- const user = await User.attempt(request.only(["email", "password"]));
13
-
14
- if (!user) {
15
- return response.badRequest({
16
- message: "Invalid credentials",
17
- });
18
- }
19
-
20
- // generate a JWT token for the logged-in user
21
- const token = await user.generateAccessToken();
22
-
23
- return response.success({
24
- message: "User logged in successfully",
25
- user,
26
- accessToken: token,
27
- });
28
- };
@@ -1,24 +0,0 @@
1
- import { Random } from "@mongez/reinforcements";
2
- import type { RequestHandler } from "@warlock.js/core";
3
- import { v, type Request, type Response } from "@warlock.js/core";
4
- import { User } from "app/users/models/user";
5
-
6
- export const registerRequest: RequestHandler = async (
7
- request: Request,
8
- response: Response,
9
- ) => {
10
- User.create({
11
- ...request.validated(),
12
- activationCode: Random.int(100000, 999999),
13
- });
14
-
15
- return response.success();
16
- };
17
-
18
- registerRequest.validation = {
19
- schema: v.object({
20
- name: v.string().minLength(2).required(),
21
- email: v.string().email().required().unique(User),
22
- password: v.string().minLength(8).required(),
23
- }),
24
- };