create-craftjs 1.0.4 → 1.0.5

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 (67) hide show
  1. package/README.md +137 -137
  2. package/bin/index.js +158 -158
  3. package/package.json +24 -24
  4. package/template/Dockerfile +57 -12
  5. package/template/babel.config.json +3 -3
  6. package/template/craft/commands/build.js +16 -15
  7. package/template/craft/commands/db-fresh.js +22 -22
  8. package/template/craft/commands/db-generate.js +23 -23
  9. package/template/craft/commands/db-migrate.js +22 -22
  10. package/template/craft/commands/dev.js +16 -16
  11. package/template/craft/commands/key-generate.js +41 -41
  12. package/template/craft/commands/make-apidocs.js +121 -121
  13. package/template/craft/commands/make-command.js +38 -38
  14. package/template/craft/commands/make-controller.js +95 -95
  15. package/template/craft/commands/make-dto.js +39 -39
  16. package/template/craft/commands/make-middleware.js +46 -46
  17. package/template/craft/commands/make-repository.js +36 -36
  18. package/template/craft/commands/make-route.js +92 -92
  19. package/template/craft/commands/make-service.js +39 -39
  20. package/template/craft/commands/make-test.js +48 -48
  21. package/template/craft/commands/make-utils.js +30 -30
  22. package/template/craft/commands/make-validation.js +42 -42
  23. package/template/craft/commands/make-view.js +42 -42
  24. package/template/craft/commands/start.js +29 -29
  25. package/template/craft/commands/test.js +20 -20
  26. package/template/craft.js +256 -256
  27. package/template/docker-compose.yml +8 -0
  28. package/template/nodemon.json +6 -6
  29. package/template/package-lock.json +8877 -8877
  30. package/template/package.json +84 -84
  31. package/template/prisma/schema.prisma +22 -22
  32. package/template/prisma/seed.ts +29 -29
  33. package/template/src/apidocs/auth-docs.ts +314 -314
  34. package/template/src/apidocs/users-docs.ts +240 -240
  35. package/template/src/config/cloudinary.ts +21 -21
  36. package/template/src/config/database.ts +90 -90
  37. package/template/src/config/env.ts +67 -67
  38. package/template/src/config/logger.ts +139 -139
  39. package/template/src/config/nodemailer.ts +23 -23
  40. package/template/src/config/web.ts +47 -47
  41. package/template/src/controllers/auth-controller.ts +88 -88
  42. package/template/src/controllers/user-controller.ts +79 -79
  43. package/template/src/dtos/list-dto.ts +12 -12
  44. package/template/src/dtos/user-dto.ts +57 -57
  45. package/template/src/main.ts +28 -28
  46. package/template/src/middleware/auth-middleware.ts +44 -44
  47. package/template/src/middleware/error-middleware.ts +27 -27
  48. package/template/src/middleware/http-logger-middleware.ts +31 -31
  49. package/template/src/repositories/user-repository.ts +75 -75
  50. package/template/src/routes/auth-route.ts +20 -20
  51. package/template/src/routes/main-route.ts +25 -25
  52. package/template/src/routes/user-route.ts +35 -35
  53. package/template/src/services/auth-service.ts +162 -162
  54. package/template/src/services/user-service.ts +102 -102
  55. package/template/src/types/type-request.ts +6 -6
  56. package/template/src/utils/async-handler.ts +9 -9
  57. package/template/src/utils/response-error.ts +10 -10
  58. package/template/src/utils/response.ts +60 -60
  59. package/template/src/utils/swagger.ts +135 -135
  60. package/template/src/utils/validation.ts +7 -7
  61. package/template/src/validations/user-validation.ts +127 -127
  62. package/template/src/views/index.ejs +6 -6
  63. package/template/src/views/layouts/main.ejs +14 -14
  64. package/template/src/views/partials/header.ejs +3 -3
  65. package/template/test/user.test.ts +16 -16
  66. package/template/tsconfig.json +13 -13
  67. package/template/.dockerignore +0 -4
@@ -1,47 +1,47 @@
1
- import express from "express";
2
- import fileUpload from "express-fileupload";
3
- import cors from "cors";
4
- import cookieParser from "cookie-parser";
5
- import { env } from "./env";
6
- // import expressLayouts from "express-ejs-layouts";
7
- // import path from "path";
8
-
9
- import { errorMiddleware } from "../middleware/error-middleware";
10
- import { httpLogger } from "../middleware/http-logger-middleware";
11
- import { errorResponse } from "../utils/response";
12
- import { setupSwagger } from "../utils/swagger";
13
- import { mainRouter } from "../routes/main-route";
14
-
15
- export const web = express();
16
- // EJS View Engine Setup
17
- // web.set("view engine", "ejs");
18
- // web.set("views", path.join(__dirname, "..", "views"));
19
- // web.use(expressLayouts);
20
- // web.set("layout", "layouts/main");
21
-
22
- // Middleware
23
- web.use(express.json());
24
- web.use(cookieParser());
25
- web.use(
26
- cors({
27
- origin: env.CLIENT_URLS,
28
- credentials: true,
29
- })
30
- );
31
- web.use(fileUpload({ useTempFiles: true, tempFileDir: "./temp/" }));
32
- web.use(express.static("public"));
33
- web.use(httpLogger);
34
-
35
- // Swagger Setup
36
- setupSwagger(web);
37
-
38
- // Routes
39
- web.use(mainRouter);
40
-
41
- // 404 Handler
42
- web.use((req, res) => {
43
- res.status(404).json(errorResponse("Request Tidak Ada", 404));
44
- });
45
-
46
- // Global Error Handler
47
- web.use(errorMiddleware);
1
+ import express from "express";
2
+ import fileUpload from "express-fileupload";
3
+ import cors from "cors";
4
+ import cookieParser from "cookie-parser";
5
+ import { env } from "./env";
6
+ // import expressLayouts from "express-ejs-layouts";
7
+ // import path from "path";
8
+
9
+ import { errorMiddleware } from "../middleware/error-middleware";
10
+ import { httpLogger } from "../middleware/http-logger-middleware";
11
+ import { errorResponse } from "../utils/response";
12
+ import { setupSwagger } from "../utils/swagger";
13
+ import { mainRouter } from "../routes/main-route";
14
+
15
+ export const web = express();
16
+ // EJS View Engine Setup
17
+ // web.set("view engine", "ejs");
18
+ // web.set("views", path.join(__dirname, "..", "views"));
19
+ // web.use(expressLayouts);
20
+ // web.set("layout", "layouts/main");
21
+
22
+ // Middleware
23
+ web.use(express.json());
24
+ web.use(cookieParser());
25
+ web.use(
26
+ cors({
27
+ origin: env.CLIENT_URLS,
28
+ credentials: true,
29
+ })
30
+ );
31
+ web.use(fileUpload({ useTempFiles: true, tempFileDir: "./temp/" }));
32
+ web.use(express.static("public"));
33
+ web.use(httpLogger);
34
+
35
+ // Swagger Setup
36
+ setupSwagger(web);
37
+
38
+ // Routes
39
+ web.use(mainRouter);
40
+
41
+ // 404 Handler
42
+ web.use((req, res) => {
43
+ res.status(404).json(errorResponse("Request Tidak Ada", 404));
44
+ });
45
+
46
+ // Global Error Handler
47
+ web.use(errorMiddleware);
@@ -1,88 +1,88 @@
1
- import { NextFunction, Request, Response } from "express";
2
- import {
3
- loginRequest,
4
- CreateUserRequest,
5
- UpdateUserRequest,
6
- } from "../dtos/user-dto";
7
- import { successResponse, successUpdateResponse } from "../utils/response";
8
- import { AuthService } from "../services/auth-service";
9
- import { UserRequest } from "../types/type-request";
10
- import { env } from "../config/env";
11
-
12
- export class AuthController {
13
- static async register(req: Request, res: Response, next: NextFunction) {
14
- try {
15
- const request: CreateUserRequest = req.body as CreateUserRequest;
16
- const response = await AuthService.register(request);
17
- res.status(201).json(successResponse("Register Berhasil", 201, response));
18
- } catch (error) {
19
- next(error);
20
- }
21
- }
22
-
23
- static async login(req: Request, res: Response, next: NextFunction) {
24
- try {
25
- const request: loginRequest = req.body as loginRequest;
26
- const response = await AuthService.login(request);
27
- res.cookie("refresh_token", response.refreshToken, {
28
- httpOnly: true,
29
- maxAge: 24 * 60 * 60 * 1000,
30
- secure: env.NODE_ENV === "production",
31
- sameSite: "lax",
32
- path: "/",
33
- });
34
- res.status(200).json(
35
- successResponse("Login Berhasil", 200, {
36
- user: response.user,
37
- accessToken: response.accessToken,
38
- })
39
- );
40
- } catch (error) {
41
- next(error);
42
- }
43
- }
44
-
45
- static async me(req: UserRequest, res: Response, next: NextFunction) {
46
- try {
47
- const response = await AuthService.me(req.user!);
48
- res
49
- .status(200)
50
- .json(successResponse("Get Detail User Berhasil", 200, response));
51
- } catch (error) {
52
- next(error);
53
- }
54
- }
55
-
56
- static async updateProfile(
57
- req: UserRequest,
58
- res: Response,
59
- next: NextFunction
60
- ) {
61
- try {
62
- const request: UpdateUserRequest = req.body as UpdateUserRequest;
63
- const response = await AuthService.updateProfile(req.user!, request);
64
- res.status(200).json(successUpdateResponse(response));
65
- } catch (error) {
66
- next(error);
67
- }
68
- }
69
-
70
- static async logout(req: UserRequest, res: Response, next: NextFunction) {
71
- await AuthService.logout(req);
72
- res.clearCookie("refresh_token");
73
- res.status(200).json(successResponse("Logout berhasil", 200));
74
- }
75
- static async refreshToken(req: Request, res: Response, next: NextFunction) {
76
- try {
77
- const response = await AuthService.refreshToken(req);
78
- res.status(200).json(
79
- successResponse("Get Access Token Berhasil", 200, {
80
- user: response.user,
81
- accessToken: response.accessToken,
82
- })
83
- );
84
- } catch (error) {
85
- next(error);
86
- }
87
- }
88
- }
1
+ import { NextFunction, Request, Response } from "express";
2
+ import {
3
+ loginRequest,
4
+ CreateUserRequest,
5
+ UpdateUserRequest,
6
+ } from "../dtos/user-dto";
7
+ import { successResponse, successUpdateResponse } from "../utils/response";
8
+ import { AuthService } from "../services/auth-service";
9
+ import { UserRequest } from "../types/type-request";
10
+ import { env } from "../config/env";
11
+
12
+ export class AuthController {
13
+ static async register(req: Request, res: Response, next: NextFunction) {
14
+ try {
15
+ const request: CreateUserRequest = req.body as CreateUserRequest;
16
+ const response = await AuthService.register(request);
17
+ res.status(201).json(successResponse("Register Berhasil", 201, response));
18
+ } catch (error) {
19
+ next(error);
20
+ }
21
+ }
22
+
23
+ static async login(req: Request, res: Response, next: NextFunction) {
24
+ try {
25
+ const request: loginRequest = req.body as loginRequest;
26
+ const response = await AuthService.login(request);
27
+ res.cookie("refresh_token", response.refreshToken, {
28
+ httpOnly: true,
29
+ maxAge: 24 * 60 * 60 * 1000,
30
+ secure: env.NODE_ENV === "production",
31
+ sameSite: "lax",
32
+ path: "/",
33
+ });
34
+ res.status(200).json(
35
+ successResponse("Login Berhasil", 200, {
36
+ user: response.user,
37
+ accessToken: response.accessToken,
38
+ })
39
+ );
40
+ } catch (error) {
41
+ next(error);
42
+ }
43
+ }
44
+
45
+ static async me(req: UserRequest, res: Response, next: NextFunction) {
46
+ try {
47
+ const response = await AuthService.me(req.user!);
48
+ res
49
+ .status(200)
50
+ .json(successResponse("Get Detail User Berhasil", 200, response));
51
+ } catch (error) {
52
+ next(error);
53
+ }
54
+ }
55
+
56
+ static async updateProfile(
57
+ req: UserRequest,
58
+ res: Response,
59
+ next: NextFunction
60
+ ) {
61
+ try {
62
+ const request: UpdateUserRequest = req.body as UpdateUserRequest;
63
+ const response = await AuthService.updateProfile(req.user!, request);
64
+ res.status(200).json(successUpdateResponse(response));
65
+ } catch (error) {
66
+ next(error);
67
+ }
68
+ }
69
+
70
+ static async logout(req: UserRequest, res: Response, next: NextFunction) {
71
+ await AuthService.logout(req);
72
+ res.clearCookie("refresh_token");
73
+ res.status(200).json(successResponse("Logout berhasil", 200));
74
+ }
75
+ static async refreshToken(req: Request, res: Response, next: NextFunction) {
76
+ try {
77
+ const response = await AuthService.refreshToken(req);
78
+ res.status(200).json(
79
+ successResponse("Get Access Token Berhasil", 200, {
80
+ user: response.user,
81
+ accessToken: response.accessToken,
82
+ })
83
+ );
84
+ } catch (error) {
85
+ next(error);
86
+ }
87
+ }
88
+ }
@@ -1,79 +1,79 @@
1
- import { NextFunction, Request, Response } from "express";
2
- import {
3
- CreateUserRequest,
4
- ListUserRequest,
5
- UpdateUserRequest,
6
- } from "../dtos/user-dto";
7
- import { UserService } from "../services/user-service";
8
- import {
9
- successCreateResponse,
10
- successDeleteResponse,
11
- successResponse,
12
- successUpdateResponse,
13
- } from "../utils/response";
14
- import { UserRequest } from "../types/type-request";
15
-
16
- export class UserController {
17
- static async getAll(req: Request, res: Response, next: NextFunction) {
18
- try {
19
- const page = Number(req.query.page) || 1;
20
- const take = Number(req.query.take) || 10;
21
- const request: ListUserRequest = {
22
- page: page,
23
- take: take,
24
- skip: (page - 1) * take,
25
- name: req.query.name as string,
26
- };
27
- const response = await UserService.getAll(request);
28
- res
29
- .status(200)
30
- .json(successResponse("Berhasil Get All Data", 200, response));
31
- } catch (e) {
32
- next(e);
33
- }
34
- }
35
-
36
- static async getOne(req: Request, res: Response, next: NextFunction) {
37
- try {
38
- const id = req.params.id;
39
- const response = await UserService.getOne(id);
40
- res
41
- .status(200)
42
- .json(successResponse("Berhasil Get Detail Data", 200, response));
43
- } catch (e) {
44
- next(e);
45
- }
46
- }
47
-
48
- static async create(req: Request, res: Response, next: NextFunction) {
49
- try {
50
- const request: CreateUserRequest = req.body as CreateUserRequest;
51
- console.log(request);
52
- const response = await UserService.create(request);
53
- res.status(201).json(successCreateResponse(response));
54
- } catch (error) {
55
- next(error);
56
- }
57
- }
58
-
59
- static async update(req: UserRequest, res: Response, next: NextFunction) {
60
- try {
61
- const id = req.params.id;
62
- const request: UpdateUserRequest = req.body as UpdateUserRequest;
63
- const response = await UserService.update(id, request);
64
- res.status(200).json(successUpdateResponse(response));
65
- } catch (error) {
66
- next(error);
67
- }
68
- }
69
-
70
- static async delete(req: Request, res: Response, next: NextFunction) {
71
- try {
72
- const id = req.params.id;
73
- await UserService.delete(id);
74
- res.status(200).json(successDeleteResponse());
75
- } catch (e) {
76
- next(e);
77
- }
78
- }
79
- }
1
+ import { NextFunction, Request, Response } from "express";
2
+ import {
3
+ CreateUserRequest,
4
+ ListUserRequest,
5
+ UpdateUserRequest,
6
+ } from "../dtos/user-dto";
7
+ import { UserService } from "../services/user-service";
8
+ import {
9
+ successCreateResponse,
10
+ successDeleteResponse,
11
+ successResponse,
12
+ successUpdateResponse,
13
+ } from "../utils/response";
14
+ import { UserRequest } from "../types/type-request";
15
+
16
+ export class UserController {
17
+ static async getAll(req: Request, res: Response, next: NextFunction) {
18
+ try {
19
+ const page = Number(req.query.page) || 1;
20
+ const take = Number(req.query.take) || 10;
21
+ const request: ListUserRequest = {
22
+ page: page,
23
+ take: take,
24
+ skip: (page - 1) * take,
25
+ name: req.query.name as string,
26
+ };
27
+ const response = await UserService.getAll(request);
28
+ res
29
+ .status(200)
30
+ .json(successResponse("Berhasil Get All Data", 200, response));
31
+ } catch (e) {
32
+ next(e);
33
+ }
34
+ }
35
+
36
+ static async getOne(req: Request, res: Response, next: NextFunction) {
37
+ try {
38
+ const id = req.params.id;
39
+ const response = await UserService.getOne(id);
40
+ res
41
+ .status(200)
42
+ .json(successResponse("Berhasil Get Detail Data", 200, response));
43
+ } catch (e) {
44
+ next(e);
45
+ }
46
+ }
47
+
48
+ static async create(req: Request, res: Response, next: NextFunction) {
49
+ try {
50
+ const request: CreateUserRequest = req.body as CreateUserRequest;
51
+ console.log(request);
52
+ const response = await UserService.create(request);
53
+ res.status(201).json(successCreateResponse(response));
54
+ } catch (error) {
55
+ next(error);
56
+ }
57
+ }
58
+
59
+ static async update(req: UserRequest, res: Response, next: NextFunction) {
60
+ try {
61
+ const id = req.params.id;
62
+ const request: UpdateUserRequest = req.body as UpdateUserRequest;
63
+ const response = await UserService.update(id, request);
64
+ res.status(200).json(successUpdateResponse(response));
65
+ } catch (error) {
66
+ next(error);
67
+ }
68
+ }
69
+
70
+ static async delete(req: Request, res: Response, next: NextFunction) {
71
+ try {
72
+ const id = req.params.id;
73
+ await UserService.delete(id);
74
+ res.status(200).json(successDeleteResponse());
75
+ } catch (e) {
76
+ next(e);
77
+ }
78
+ }
79
+ }
@@ -1,12 +1,12 @@
1
- export type listResponse = {
2
- data: any;
3
- total_data: number;
4
- paging: any;
5
- };
6
- export function tolistResponse(data: any): listResponse {
7
- return {
8
- data: data.data,
9
- total_data: data.total_data,
10
- paging: data.paging,
11
- };
12
- }
1
+ export type listResponse = {
2
+ data: any;
3
+ total_data: number;
4
+ paging: any;
5
+ };
6
+ export function tolistResponse(data: any): listResponse {
7
+ return {
8
+ data: data.data,
9
+ total_data: data.total_data,
10
+ paging: data.paging,
11
+ };
12
+ }
@@ -1,57 +1,57 @@
1
- import { User } from "@prisma/client";
2
- export type loginRequest = {
3
- email: string;
4
- password: string;
5
- };
6
- export type CreateUserRequest = {
7
- fullName: string;
8
- email: string;
9
- password: string;
10
- };
11
-
12
- export type UpdateUserRequest = {
13
- fullName?: string;
14
- email?: string;
15
- password?: string;
16
- };
17
-
18
- export type ListUserRequest = {
19
- page: number;
20
- take: number;
21
- skip: number;
22
- name?: string;
23
- };
24
- export type UserDetailResponse = {
25
- id: string;
26
- fullName: string;
27
- email: string;
28
- image_id?: string;
29
- image_url?: string;
30
- created_at: Date;
31
- updated_at: Date;
32
- deleted_at?: Date;
33
- };
34
-
35
- export type UserResponse = {
36
- id: string;
37
- fullName: string;
38
- email: string;
39
- };
40
-
41
- export function toUserDetailResponse(user: User): UserDetailResponse {
42
- return {
43
- id: user.id,
44
- fullName: user.fullName,
45
- email: user.email,
46
- created_at: user.created_at,
47
- updated_at: user.updated_at,
48
- deleted_at: user.deleted_at!,
49
- };
50
- }
51
- export function toUserResponse(user: User): UserResponse {
52
- return {
53
- id: user.id,
54
- fullName: user.fullName,
55
- email: user.email,
56
- };
57
- }
1
+ import { User } from "@prisma/client";
2
+ export type loginRequest = {
3
+ email: string;
4
+ password: string;
5
+ };
6
+ export type CreateUserRequest = {
7
+ fullName: string;
8
+ email: string;
9
+ password: string;
10
+ };
11
+
12
+ export type UpdateUserRequest = {
13
+ fullName?: string;
14
+ email?: string;
15
+ password?: string;
16
+ };
17
+
18
+ export type ListUserRequest = {
19
+ page: number;
20
+ take: number;
21
+ skip: number;
22
+ name?: string;
23
+ };
24
+ export type UserDetailResponse = {
25
+ id: string;
26
+ fullName: string;
27
+ email: string;
28
+ image_id?: string;
29
+ image_url?: string;
30
+ created_at: Date;
31
+ updated_at: Date;
32
+ deleted_at?: Date;
33
+ };
34
+
35
+ export type UserResponse = {
36
+ id: string;
37
+ fullName: string;
38
+ email: string;
39
+ };
40
+
41
+ export function toUserDetailResponse(user: User): UserDetailResponse {
42
+ return {
43
+ id: user.id,
44
+ fullName: user.fullName,
45
+ email: user.email,
46
+ created_at: user.created_at,
47
+ updated_at: user.updated_at,
48
+ deleted_at: user.deleted_at!,
49
+ };
50
+ }
51
+ export function toUserResponse(user: User): UserResponse {
52
+ return {
53
+ id: user.id,
54
+ fullName: user.fullName,
55
+ email: user.email,
56
+ };
57
+ }
@@ -1,28 +1,28 @@
1
- import { web } from "./config/web";
2
- import { connectDatabase } from "./config/database";
3
- import { env } from "./config/env";
4
- import { logger } from "./config/logger";
5
-
6
- async function startServer() {
7
- try {
8
- if (
9
- !env.APP_SECRET ||
10
- env.APP_SECRET.trim() === "" ||
11
- !env.JWT_SECRET ||
12
- env.JWT_SECRET.trim() === ""
13
- ) {
14
- logger.error("❌ APP_SECRET or JWT_SECRET is missing in your .env file.");
15
- logger.error("👉 Please run `node craft key:generate` to create them.");
16
- process.exit(0);
17
- }
18
- await connectDatabase();
19
- web.listen(env.PORT, () => {
20
- logger.info(`🚀 Server is listening on: ${env.BASE_URL}`);
21
- logger.info(`🔗 API Docs available at: ${env.BASE_API_URL}/docs`);
22
- });
23
- } catch (error) {
24
- process.exit(0);
25
- }
26
- }
27
-
28
- startServer();
1
+ import { web } from "./config/web";
2
+ import { connectDatabase } from "./config/database";
3
+ import { env } from "./config/env";
4
+ import { logger } from "./config/logger";
5
+
6
+ async function startServer() {
7
+ try {
8
+ if (
9
+ !env.APP_SECRET ||
10
+ env.APP_SECRET.trim() === "" ||
11
+ !env.JWT_SECRET ||
12
+ env.JWT_SECRET.trim() === ""
13
+ ) {
14
+ logger.error("❌ APP_SECRET or JWT_SECRET is missing in your .env file.");
15
+ logger.error("👉 Please run `node craft key:generate` to create them.");
16
+ process.exit(0);
17
+ }
18
+ await connectDatabase();
19
+ web.listen(env.PORT, () => {
20
+ logger.info(`🚀 Server is listening on: ${env.BASE_URL}`);
21
+ logger.info(`🔗 API Docs available at: ${env.BASE_API_URL}/docs`);
22
+ });
23
+ } catch (error) {
24
+ process.exit(0);
25
+ }
26
+ }
27
+
28
+ startServer();