create-warlock 2.6.2 → 2.7.1
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/package.json +1 -1
- package/templates/warlock/.env +39 -0
- package/templates/warlock/.env.example +35 -35
- package/templates/warlock/.gitattributes +1 -1
- package/templates/warlock/package.json +10 -7
- package/templates/warlock/src/app/main.ts +43 -12
- package/templates/warlock/src/app/posts/controllers/create-new-post.request.ts +26 -0
- package/templates/warlock/src/app/posts/controllers/get-all-posts.request.ts +17 -0
- package/templates/warlock/src/app/posts/controllers/get-post.request.ts +37 -0
- package/templates/warlock/src/app/posts/models/index.ts +1 -0
- package/templates/warlock/src/app/posts/models/post.model.ts +22 -0
- package/templates/warlock/src/app/posts/output/post.output.ts +13 -0
- package/templates/warlock/src/app/posts/routes.ts +12 -0
- package/templates/warlock/src/app/uploads/routes.ts +27 -27
- package/templates/warlock/src/app/users/controllers/auth/admin-login.ts +40 -40
- package/templates/warlock/src/app/users/controllers/auth/login.request.ts +28 -49
- package/templates/warlock/src/app/users/controllers/auth/logout.ts +10 -10
- package/templates/warlock/src/app/users/controllers/auth/register.request.ts +24 -0
- package/templates/warlock/src/app/users/controllers/auth/resend-activation-code.ts +45 -45
- package/templates/warlock/src/app/users/controllers/auth/reset-password.ts +43 -43
- package/templates/warlock/src/app/users/controllers/auth/verify-forget-password-code.ts +18 -18
- package/templates/warlock/src/app/users/controllers/profile/change-password.ts +31 -31
- package/templates/warlock/src/app/users/controllers/profile/my-profile.ts +10 -10
- package/templates/warlock/src/app/users/controllers/profile/update-profile.ts +25 -25
- package/templates/warlock/src/app/users/controllers/restful-users.ts +26 -26
- package/templates/warlock/src/app/users/events/attach-user-to-response.ts +18 -18
- package/templates/warlock/src/app/users/events/register-current-user-to-model-authors.ts +28 -28
- package/templates/warlock/src/app/users/events/update-authors.ts +19 -19
- package/templates/warlock/src/app/users/mail/send-forget-password-email.ts +20 -20
- package/templates/warlock/src/app/users/models/user/index.ts +1 -1
- package/templates/warlock/src/app/users/models/user/migrations/20-10-2024_07-59-54-user.migration.ts +15 -15
- package/templates/warlock/src/app/users/models/user/user.model.ts +59 -54
- package/templates/warlock/src/app/users/output/user.output.ts +12 -12
- package/templates/warlock/src/app/users/routes.ts +51 -51
- package/templates/warlock/src/app/users/utils/locales.ts +16 -16
- package/templates/warlock/src/app/utils/output.ts +18 -18
- package/templates/warlock/src/app/utils/router.ts +104 -104
- package/templates/warlock/src/config/database.ts +4 -0
- package/templates/warlock/tsconfig.json +1 -1
|
@@ -1,45 +1,45 @@
|
|
|
1
|
-
import { Random } from "@mongez/reinforcements";
|
|
2
|
-
import type { Request, Response } from "@warlock.js/core";
|
|
3
|
-
import { ExistsRule } from "@warlock.js/core";
|
|
4
|
-
import { User } from "app/users/models/user";
|
|
5
|
-
|
|
6
|
-
export default async function resendActivationCode(
|
|
7
|
-
request: Request,
|
|
8
|
-
response: Response,
|
|
9
|
-
) {
|
|
10
|
-
//
|
|
11
|
-
const user = await User.first({
|
|
12
|
-
email: request.input("email"),
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
if (!user) {
|
|
16
|
-
return response.badRequest({
|
|
17
|
-
error: "User not found",
|
|
18
|
-
});
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
if (user.get("isActive")) {
|
|
22
|
-
return response.badRequest({
|
|
23
|
-
error: "User already activated",
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
user
|
|
28
|
-
.save({
|
|
29
|
-
activationCode: Random.int(100000, 999999),
|
|
30
|
-
codeExpiresAt: true,
|
|
31
|
-
})
|
|
32
|
-
.then(() => {
|
|
33
|
-
// send mail
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
return response.success({
|
|
37
|
-
message: "Activation code sent",
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
resendActivationCode.validation = {
|
|
42
|
-
rules: {
|
|
43
|
-
email: ["required", "email", new ExistsRule(User, "email").insensitive()],
|
|
44
|
-
},
|
|
45
|
-
};
|
|
1
|
+
import { Random } from "@mongez/reinforcements";
|
|
2
|
+
import type { Request, Response } from "@warlock.js/core";
|
|
3
|
+
import { ExistsRule } from "@warlock.js/core";
|
|
4
|
+
import { User } from "app/users/models/user";
|
|
5
|
+
|
|
6
|
+
export default async function resendActivationCode(
|
|
7
|
+
request: Request,
|
|
8
|
+
response: Response,
|
|
9
|
+
) {
|
|
10
|
+
//
|
|
11
|
+
const user = await User.first({
|
|
12
|
+
email: request.input("email"),
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
if (!user) {
|
|
16
|
+
return response.badRequest({
|
|
17
|
+
error: "User not found",
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
if (user.get("isActive")) {
|
|
22
|
+
return response.badRequest({
|
|
23
|
+
error: "User already activated",
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
user
|
|
28
|
+
.save({
|
|
29
|
+
activationCode: Random.int(100000, 999999),
|
|
30
|
+
codeExpiresAt: true,
|
|
31
|
+
})
|
|
32
|
+
.then(() => {
|
|
33
|
+
// send mail
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
return response.success({
|
|
37
|
+
message: "Activation code sent",
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
resendActivationCode.validation = {
|
|
42
|
+
rules: {
|
|
43
|
+
email: ["required", "email", new ExistsRule(User, "email").insensitive()],
|
|
44
|
+
},
|
|
45
|
+
};
|
|
@@ -1,43 +1,43 @@
|
|
|
1
|
-
import { ExistsRule, type Request, type Response } from "@warlock.js/core";
|
|
2
|
-
import { User } from "app/users/models/user";
|
|
3
|
-
|
|
4
|
-
export default async function resetPassword(
|
|
5
|
-
request: Request<User>,
|
|
6
|
-
response: Response,
|
|
7
|
-
) {
|
|
8
|
-
const currentUser = request.user;
|
|
9
|
-
|
|
10
|
-
currentUser.unset("activationCode", "codeExpiresAt");
|
|
11
|
-
|
|
12
|
-
currentUser.save({
|
|
13
|
-
password: request.input("password"),
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
request.clearCurrentUser();
|
|
17
|
-
|
|
18
|
-
return response.success();
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
resetPassword.validation = {
|
|
22
|
-
rules: {
|
|
23
|
-
email: ["required", "email", new ExistsRule(User, "email").insensitive()],
|
|
24
|
-
password: ["required", "confirmed", "minLength:8"],
|
|
25
|
-
code: ["required", "int", "length:6"],
|
|
26
|
-
},
|
|
27
|
-
validate: async (request: Request, response: Response) => {
|
|
28
|
-
try {
|
|
29
|
-
const user = await User.first({
|
|
30
|
-
email: request.input("email"),
|
|
31
|
-
activationCode: request.int("code"),
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
if (!user) {
|
|
35
|
-
return response.notFound();
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
request.user = user;
|
|
39
|
-
} catch (error: any) {
|
|
40
|
-
return response.badRequest(error.message);
|
|
41
|
-
}
|
|
42
|
-
},
|
|
43
|
-
};
|
|
1
|
+
import { ExistsRule, type Request, type Response } from "@warlock.js/core";
|
|
2
|
+
import { User } from "app/users/models/user";
|
|
3
|
+
|
|
4
|
+
export default async function resetPassword(
|
|
5
|
+
request: Request<User>,
|
|
6
|
+
response: Response,
|
|
7
|
+
) {
|
|
8
|
+
const currentUser = request.user;
|
|
9
|
+
|
|
10
|
+
currentUser.unset("activationCode", "codeExpiresAt");
|
|
11
|
+
|
|
12
|
+
currentUser.save({
|
|
13
|
+
password: request.input("password"),
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
request.clearCurrentUser();
|
|
17
|
+
|
|
18
|
+
return response.success();
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
resetPassword.validation = {
|
|
22
|
+
rules: {
|
|
23
|
+
email: ["required", "email", new ExistsRule(User, "email").insensitive()],
|
|
24
|
+
password: ["required", "confirmed", "minLength:8"],
|
|
25
|
+
code: ["required", "int", "length:6"],
|
|
26
|
+
},
|
|
27
|
+
validate: async (request: Request, response: Response) => {
|
|
28
|
+
try {
|
|
29
|
+
const user = await User.first({
|
|
30
|
+
email: request.input("email"),
|
|
31
|
+
activationCode: request.int("code"),
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
if (!user) {
|
|
35
|
+
return response.notFound();
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
request.user = user;
|
|
39
|
+
} catch (error: any) {
|
|
40
|
+
return response.badRequest(error.message);
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
};
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import { UniqueRule, type Request, type Response } from "@warlock.js/core";
|
|
2
|
-
import { User } from "app/users/models/user";
|
|
3
|
-
|
|
4
|
-
export default async function verifyForgetPasswordCode(
|
|
5
|
-
request: Request,
|
|
6
|
-
response: Response,
|
|
7
|
-
) {
|
|
8
|
-
// your code here
|
|
9
|
-
|
|
10
|
-
return response.success({});
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
verifyForgetPasswordCode.validation = {
|
|
14
|
-
rules: {
|
|
15
|
-
email: ["required", "email", new UniqueRule(User)],
|
|
16
|
-
code: ["required", "int", "length:6"],
|
|
17
|
-
},
|
|
18
|
-
};
|
|
1
|
+
import { UniqueRule, type Request, type Response } from "@warlock.js/core";
|
|
2
|
+
import { User } from "app/users/models/user";
|
|
3
|
+
|
|
4
|
+
export default async function verifyForgetPasswordCode(
|
|
5
|
+
request: Request,
|
|
6
|
+
response: Response,
|
|
7
|
+
) {
|
|
8
|
+
// your code here
|
|
9
|
+
|
|
10
|
+
return response.success({});
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
verifyForgetPasswordCode.validation = {
|
|
14
|
+
rules: {
|
|
15
|
+
email: ["required", "email", new UniqueRule(User)],
|
|
16
|
+
code: ["required", "int", "length:6"],
|
|
17
|
+
},
|
|
18
|
+
};
|
|
@@ -1,31 +1,31 @@
|
|
|
1
|
-
import { v, type Request, type Response } from "@warlock.js/core";
|
|
2
|
-
import type { User } from "app/users/models/user";
|
|
3
|
-
|
|
4
|
-
export default async function changePassword(
|
|
5
|
-
request: Request,
|
|
6
|
-
response: Response,
|
|
7
|
-
) {
|
|
8
|
-
const user = request.user;
|
|
9
|
-
|
|
10
|
-
await user.save({
|
|
11
|
-
password: request.input("password"),
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
return response.success();
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
changePassword.validation = {
|
|
18
|
-
schema: v.object({
|
|
19
|
-
password: v.string().minLength(8).required(),
|
|
20
|
-
confirmPassword: v.string().required().matches("password"),
|
|
21
|
-
}),
|
|
22
|
-
validate: (request: Request<User>, response: Response) => {
|
|
23
|
-
const user = request.user;
|
|
24
|
-
|
|
25
|
-
if (!user.confirmPassword(request.input("currentPassword"))) {
|
|
26
|
-
return response.badRequest({
|
|
27
|
-
error: "Invalid current password",
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
},
|
|
31
|
-
};
|
|
1
|
+
import { v, type Request, type Response } from "@warlock.js/core";
|
|
2
|
+
import type { User } from "app/users/models/user";
|
|
3
|
+
|
|
4
|
+
export default async function changePassword(
|
|
5
|
+
request: Request,
|
|
6
|
+
response: Response,
|
|
7
|
+
) {
|
|
8
|
+
const user = request.user;
|
|
9
|
+
|
|
10
|
+
await user.save({
|
|
11
|
+
password: request.input("password"),
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
return response.success();
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
changePassword.validation = {
|
|
18
|
+
schema: v.object({
|
|
19
|
+
password: v.string().minLength(8).required(),
|
|
20
|
+
confirmPassword: v.string().required().matches("password"),
|
|
21
|
+
}),
|
|
22
|
+
validate: (request: Request<User>, response: Response) => {
|
|
23
|
+
const user = request.user;
|
|
24
|
+
|
|
25
|
+
if (!user.confirmPassword(request.input("currentPassword"))) {
|
|
26
|
+
return response.badRequest({
|
|
27
|
+
error: "Invalid current password",
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
};
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import type { Request, Response } from "@warlock.js/core";
|
|
2
|
-
import type { User } from "app/users/models/user";
|
|
3
|
-
|
|
4
|
-
export default function myProfile(request: Request<User>, response: Response) {
|
|
5
|
-
const currentUser = request.user;
|
|
6
|
-
|
|
7
|
-
return response.success({
|
|
8
|
-
user: currentUser,
|
|
9
|
-
});
|
|
10
|
-
}
|
|
1
|
+
import type { Request, Response } from "@warlock.js/core";
|
|
2
|
+
import type { User } from "app/users/models/user";
|
|
3
|
+
|
|
4
|
+
export default function myProfile(request: Request<User>, response: Response) {
|
|
5
|
+
const currentUser = request.user;
|
|
6
|
+
|
|
7
|
+
return response.success({
|
|
8
|
+
user: currentUser,
|
|
9
|
+
});
|
|
10
|
+
}
|
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
import type { Request, Response } from "@warlock.js/core";
|
|
2
|
-
import { UniqueRule } from "@warlock.js/core";
|
|
3
|
-
import { User } from "app/users/models/user";
|
|
4
|
-
|
|
5
|
-
export default async function updateProfile(
|
|
6
|
-
request: Request<User>,
|
|
7
|
-
response: Response,
|
|
8
|
-
) {
|
|
9
|
-
await request.user.save(request.validated());
|
|
10
|
-
|
|
11
|
-
return response.success();
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
updateProfile.validation = {
|
|
15
|
-
rules: {
|
|
16
|
-
name: ["required", "minLength:2"],
|
|
17
|
-
gender: ["in:male,female"],
|
|
18
|
-
phoneNumber: ["required", new UniqueRule(User).exceptCurrentUser()],
|
|
19
|
-
email: [
|
|
20
|
-
"required",
|
|
21
|
-
"email",
|
|
22
|
-
new UniqueRule(User).insensitive().exceptCurrentUser(),
|
|
23
|
-
],
|
|
24
|
-
},
|
|
25
|
-
};
|
|
1
|
+
import type { Request, Response } from "@warlock.js/core";
|
|
2
|
+
import { UniqueRule } from "@warlock.js/core";
|
|
3
|
+
import { User } from "app/users/models/user";
|
|
4
|
+
|
|
5
|
+
export default async function updateProfile(
|
|
6
|
+
request: Request<User>,
|
|
7
|
+
response: Response,
|
|
8
|
+
) {
|
|
9
|
+
await request.user.save(request.validated());
|
|
10
|
+
|
|
11
|
+
return response.success();
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
updateProfile.validation = {
|
|
15
|
+
rules: {
|
|
16
|
+
name: ["required", "minLength:2"],
|
|
17
|
+
gender: ["in:male,female"],
|
|
18
|
+
phoneNumber: ["required", new UniqueRule(User).exceptCurrentUser()],
|
|
19
|
+
email: [
|
|
20
|
+
"required",
|
|
21
|
+
"email",
|
|
22
|
+
new UniqueRule(User).insensitive().exceptCurrentUser(),
|
|
23
|
+
],
|
|
24
|
+
},
|
|
25
|
+
};
|
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
import { Restful, type RouteResource,
|
|
2
|
-
import { User } from "../models/user";
|
|
3
|
-
import { usersRepository } from "../repositories/users.repository";
|
|
4
|
-
|
|
5
|
-
class RestfulUsers extends Restful<User> implements RouteResource {
|
|
6
|
-
/**
|
|
7
|
-
* {@inheritDoc}
|
|
8
|
-
*/
|
|
9
|
-
protected repository = usersRepository;
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* {@inheritDoc}
|
|
13
|
-
*/
|
|
14
|
-
public validation: RouteResource["validation"] = {
|
|
15
|
-
create: {
|
|
16
|
-
|
|
17
|
-
name:
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
},
|
|
22
|
-
},
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export const restfulUsers = new RestfulUsers();
|
|
1
|
+
import { Restful, type RouteResource, v } from "@warlock.js/core";
|
|
2
|
+
import { User } from "../models/user";
|
|
3
|
+
import { usersRepository } from "../repositories/users.repository";
|
|
4
|
+
|
|
5
|
+
class RestfulUsers extends Restful<User> implements RouteResource {
|
|
6
|
+
/**
|
|
7
|
+
* {@inheritDoc}
|
|
8
|
+
*/
|
|
9
|
+
protected repository = usersRepository;
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* {@inheritDoc}
|
|
13
|
+
*/
|
|
14
|
+
public validation: RouteResource["validation"] = {
|
|
15
|
+
create: {
|
|
16
|
+
schema: v.object({
|
|
17
|
+
name: v.string().minLength(2).required(),
|
|
18
|
+
email: v.string().email().required().unique(User, {
|
|
19
|
+
except: "id",
|
|
20
|
+
}),
|
|
21
|
+
}),
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export const restfulUsers = new RestfulUsers();
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import { Response } from "@warlock.js/core";
|
|
2
|
-
|
|
3
|
-
export function attachCurrentUserToResponse(response: Response) {
|
|
4
|
-
if (!response.isJson) return;
|
|
5
|
-
|
|
6
|
-
const responseData = response.body;
|
|
7
|
-
|
|
8
|
-
if (!responseData || responseData.user) return;
|
|
9
|
-
|
|
10
|
-
const currentUser = response.request.user;
|
|
11
|
-
|
|
12
|
-
if (!currentUser) return;
|
|
13
|
-
|
|
14
|
-
responseData.user = currentUser;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
// add current user to response
|
|
18
|
-
Response.on("sending", attachCurrentUserToResponse);
|
|
1
|
+
import { Response } from "@warlock.js/core";
|
|
2
|
+
|
|
3
|
+
export function attachCurrentUserToResponse(response: Response) {
|
|
4
|
+
if (!response.isJson) return;
|
|
5
|
+
|
|
6
|
+
const responseData = response.body;
|
|
7
|
+
|
|
8
|
+
if (!responseData || responseData.user) return;
|
|
9
|
+
|
|
10
|
+
const currentUser = response.request.user;
|
|
11
|
+
|
|
12
|
+
if (!currentUser) return;
|
|
13
|
+
|
|
14
|
+
responseData.user = currentUser;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// add current user to response
|
|
18
|
+
Response.on("sending", attachCurrentUserToResponse);
|
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* This event is responsible for adding the current user to any model that is being saved
|
|
3
|
-
* Such as createdBy and updatedBy so you don't need to add it manually.
|
|
4
|
-
*/
|
|
5
|
-
import { isEmpty } from "@mongez/supportive-is";
|
|
6
|
-
import { Model } from "@warlock.js/cascade";
|
|
7
|
-
import { useRequestStore } from "@warlock.js/core";
|
|
8
|
-
import type { User } from "../models/user";
|
|
9
|
-
|
|
10
|
-
Model.events()
|
|
11
|
-
.onSaving((model: Model, oldModel?: Model) => {
|
|
12
|
-
const { user } = useRequestStore<User>();
|
|
13
|
-
|
|
14
|
-
if (!user) return;
|
|
15
|
-
|
|
16
|
-
if (!oldModel && isEmpty(model.get("createdBy"))) {
|
|
17
|
-
model.set("createdBy", user.embeddedData);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
model.set("updatedBy", user.embeddedData);
|
|
21
|
-
})
|
|
22
|
-
.onDeleting((model: Model) => {
|
|
23
|
-
const { user } = useRequestStore<User>();
|
|
24
|
-
|
|
25
|
-
if (!user || user.userType === "guest") return;
|
|
26
|
-
|
|
27
|
-
model.set("deletedBy", user.embeddedData);
|
|
28
|
-
});
|
|
1
|
+
/**
|
|
2
|
+
* This event is responsible for adding the current user to any model that is being saved
|
|
3
|
+
* Such as createdBy and updatedBy so you don't need to add it manually.
|
|
4
|
+
*/
|
|
5
|
+
import { isEmpty } from "@mongez/supportive-is";
|
|
6
|
+
import { Model } from "@warlock.js/cascade";
|
|
7
|
+
import { useRequestStore } from "@warlock.js/core";
|
|
8
|
+
import type { User } from "../models/user";
|
|
9
|
+
|
|
10
|
+
Model.events()
|
|
11
|
+
.onSaving((model: Model, oldModel?: Model) => {
|
|
12
|
+
const { user } = useRequestStore<User>();
|
|
13
|
+
|
|
14
|
+
if (!user) return;
|
|
15
|
+
|
|
16
|
+
if (!oldModel && isEmpty(model.get("createdBy"))) {
|
|
17
|
+
model.set("createdBy", user.embeddedData);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
model.set("updatedBy", user.embeddedData);
|
|
21
|
+
})
|
|
22
|
+
.onDeleting((model: Model) => {
|
|
23
|
+
const { user } = useRequestStore<User>();
|
|
24
|
+
|
|
25
|
+
if (!user || user.userType === "guest") return;
|
|
26
|
+
|
|
27
|
+
model.set("deletedBy", user.embeddedData);
|
|
28
|
+
});
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import { Aggregate, database } from "@warlock.js/cascade";
|
|
2
|
-
import { User } from "../models/user";
|
|
3
|
-
|
|
4
|
-
User.events().onSaved(async (user: User) => {
|
|
5
|
-
// list all collections in the database
|
|
6
|
-
const collections = await database.listCollectionNames();
|
|
7
|
-
|
|
8
|
-
// this will update the createdBy and updatedBy fields in all collections
|
|
9
|
-
// it may take some time if you have a lot of collections or documents but it's the best way to do it
|
|
10
|
-
for (const collection of collections) {
|
|
11
|
-
new Aggregate(collection).where("createdBy.id", user.id).update({
|
|
12
|
-
createdBy: user.embeddedData,
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
new Aggregate(collection).where("updatedBy.id", user.id).update({
|
|
16
|
-
updatedBy: user.embeddedData,
|
|
17
|
-
});
|
|
18
|
-
}
|
|
19
|
-
});
|
|
1
|
+
import { Aggregate, database } from "@warlock.js/cascade";
|
|
2
|
+
import { User } from "../models/user";
|
|
3
|
+
|
|
4
|
+
User.events().onSaved(async (user: User) => {
|
|
5
|
+
// list all collections in the database
|
|
6
|
+
const collections = await database.listCollectionNames();
|
|
7
|
+
|
|
8
|
+
// this will update the createdBy and updatedBy fields in all collections
|
|
9
|
+
// it may take some time if you have a lot of collections or documents but it's the best way to do it
|
|
10
|
+
for (const collection of collections) {
|
|
11
|
+
new Aggregate(collection).where("createdBy.id", user.id).update({
|
|
12
|
+
createdBy: user.embeddedData,
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
new Aggregate(collection).where("updatedBy.id", user.id).update({
|
|
16
|
+
updatedBy: user.embeddedData,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
});
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import { sendMail } from "@warlock.js/core";
|
|
2
|
-
import type { User } from "../models/user";
|
|
3
|
-
|
|
4
|
-
export default async function sendForgetPasswordEmail(user: User) {
|
|
5
|
-
await sendMail({
|
|
6
|
-
to: user.get("email"),
|
|
7
|
-
subject: "Reset Password",
|
|
8
|
-
html: `
|
|
9
|
-
<h3>Hello, ${user.get("name")}</h3>
|
|
10
|
-
|
|
11
|
-
<p>Use the following code to reset your password:</p>
|
|
12
|
-
|
|
13
|
-
<p>Please note that this code will expire in 10 minutes.</p>
|
|
14
|
-
|
|
15
|
-
<p>Your reset password code is: <strong>${user.get(
|
|
16
|
-
"activationCode",
|
|
17
|
-
)}</strong></p>
|
|
18
|
-
`,
|
|
19
|
-
});
|
|
20
|
-
}
|
|
1
|
+
import { sendMail } from "@warlock.js/core";
|
|
2
|
+
import type { User } from "../models/user";
|
|
3
|
+
|
|
4
|
+
export default async function sendForgetPasswordEmail(user: User) {
|
|
5
|
+
await sendMail({
|
|
6
|
+
to: user.get("email"),
|
|
7
|
+
subject: "Reset Password",
|
|
8
|
+
html: `
|
|
9
|
+
<h3>Hello, ${user.get("name")}</h3>
|
|
10
|
+
|
|
11
|
+
<p>Use the following code to reset your password:</p>
|
|
12
|
+
|
|
13
|
+
<p>Please note that this code will expire in 10 minutes.</p>
|
|
14
|
+
|
|
15
|
+
<p>Your reset password code is: <strong>${user.get(
|
|
16
|
+
"activationCode",
|
|
17
|
+
)}</strong></p>
|
|
18
|
+
`,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from "./user.model";
|
|
1
|
+
export * from "./user.model";
|
package/templates/warlock/src/app/users/models/user/migrations/20-10-2024_07-59-54-user.migration.ts
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { migrationOffice } from "@warlock.js/cascade";
|
|
2
|
-
import { User } from "../user.model";
|
|
3
|
-
|
|
4
|
-
export default migrationOffice.register({
|
|
5
|
-
name: "users",
|
|
6
|
-
blueprint: User.blueprint(),
|
|
7
|
-
up: blueprint => {
|
|
8
|
-
blueprint.unique("id");
|
|
9
|
-
blueprint.unique("email");
|
|
10
|
-
},
|
|
11
|
-
down(blueprint) {
|
|
12
|
-
blueprint.dropUniqueIndex("id");
|
|
13
|
-
blueprint.dropUniqueIndex("email");
|
|
14
|
-
},
|
|
15
|
-
});
|
|
1
|
+
import { migrationOffice } from "@warlock.js/cascade";
|
|
2
|
+
import { User } from "../user.model";
|
|
3
|
+
|
|
4
|
+
export default migrationOffice.register({
|
|
5
|
+
name: "users",
|
|
6
|
+
blueprint: User.blueprint(),
|
|
7
|
+
up: blueprint => {
|
|
8
|
+
blueprint.unique("id");
|
|
9
|
+
blueprint.unique("email");
|
|
10
|
+
},
|
|
11
|
+
down(blueprint) {
|
|
12
|
+
blueprint.dropUniqueIndex("id");
|
|
13
|
+
blueprint.dropUniqueIndex("email");
|
|
14
|
+
},
|
|
15
|
+
});
|