@diagramers/cli 1.0.22 → 1.0.24

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 (65) hide show
  1. package/README.md +17 -3
  2. package/dist/services/template-updater.d.ts +2 -0
  3. package/dist/services/template-updater.d.ts.map +1 -1
  4. package/dist/services/template-updater.js +66 -14
  5. package/dist/services/template-updater.js.map +1 -1
  6. package/package.json +5 -1
  7. package/templates/api/certs/auth-app-cert.json +13 -0
  8. package/templates/api/main.ts +10 -0
  9. package/templates/api/package.json +70 -0
  10. package/templates/api/src/assets/css/email-template.css +8 -0
  11. package/templates/api/src/assets/images/logo_large.png +0 -0
  12. package/templates/api/src/assets/keys/certificate.pem +22 -0
  13. package/templates/api/src/assets/keys/private-key.pem +28 -0
  14. package/templates/api/src/config/config-interface.ts +191 -0
  15. package/templates/api/src/config/development.ts +145 -0
  16. package/templates/api/src/config/index.ts +59 -0
  17. package/templates/api/src/config/production.ts +145 -0
  18. package/templates/api/src/config/staging.ts +144 -0
  19. package/templates/api/src/config/uat.ts +144 -0
  20. package/templates/api/src/controllers/account-controller.ts +162 -0
  21. package/templates/api/src/entities/audit.ts +12 -0
  22. package/templates/api/src/entities/base-entity.ts +10 -0
  23. package/templates/api/src/entities/user.ts +71 -0
  24. package/templates/api/src/helpers/FrameworkHelper.ts +157 -0
  25. package/templates/api/src/helpers/auth.ts +971 -0
  26. package/templates/api/src/helpers/cronHelper.ts +170 -0
  27. package/templates/api/src/helpers/dbcontext.ts +83 -0
  28. package/templates/api/src/helpers/encryptionHelper.ts +76 -0
  29. package/templates/api/src/helpers/enums.ts +258 -0
  30. package/templates/api/src/helpers/handle-response.ts +49 -0
  31. package/templates/api/src/helpers/httpHelper.ts +75 -0
  32. package/templates/api/src/helpers/mailer.ts +152 -0
  33. package/templates/api/src/helpers/result.ts +47 -0
  34. package/templates/api/src/helpers/string-helper.ts +27 -0
  35. package/templates/api/src/routes/account-routes.ts +37 -0
  36. package/templates/api/src/routes/auth-routes.ts +286 -0
  37. package/templates/api/src/routes/index.ts +92 -0
  38. package/templates/api/src/schemas/audit.ts +36 -0
  39. package/templates/api/src/schemas/otp.ts +52 -0
  40. package/templates/api/src/schemas/session.ts +57 -0
  41. package/templates/api/src/schemas/user.ts +125 -0
  42. package/templates/api/src/server/index.ts +86 -0
  43. package/templates/api/src/server/socket-server-provider.ts +209 -0
  44. package/templates/api/src/services/account-service.ts +243 -0
  45. package/templates/api/src/services/audit-service.ts +56 -0
  46. package/templates/api/tsconfig.json +16 -0
  47. package/templates/api/webpack.config.js +66 -0
  48. package/scripts/publish.sh +0 -58
  49. package/scripts/setup.sh +0 -38
  50. package/scripts/version.sh +0 -80
  51. package/src/commands/api.ts +0 -76
  52. package/src/commands/extend.ts +0 -35
  53. package/src/commands/init.ts +0 -32
  54. package/src/commands/update.ts +0 -25
  55. package/src/config/template-config.ts +0 -111
  56. package/src/index.ts +0 -41
  57. package/src/services/api-generator.ts +0 -378
  58. package/src/services/project-extender.ts +0 -330
  59. package/src/services/project-initializer.ts +0 -335
  60. package/src/services/project-updater.ts +0 -117
  61. package/src/services/relation-generator.ts +0 -203
  62. package/src/services/table-generator.ts +0 -114
  63. package/src/services/template-processor.ts +0 -166
  64. package/src/services/template-updater.ts +0 -184
  65. package/tsconfig.json +0 -19
@@ -0,0 +1,162 @@
1
+ import { AuditMessageType, ResponseCode } from "../helpers/enums";
2
+ import handleResponse from "../helpers/handle-response";
3
+ import { Result } from "../helpers/result";
4
+ import { AccountService } from "../services/account-service";
5
+
6
+ export default class AccountController {
7
+
8
+ async verifyToken(req, res) {
9
+ const result = new Result(null, ResponseCode.Incompelete, [], [], req.body.requestIdentifier);
10
+ const accountService = new AccountService(result);
11
+ const serviceResult = await accountService.VerifyToken(req.body.idToken);
12
+ return handleResponse(req, res, serviceResult);
13
+ }
14
+
15
+ async activateEmail(req, res) {
16
+ const result = new Result(null, ResponseCode.Incompelete, [], [], req.body.requestIdentifier);
17
+ try {
18
+ result.addMessage(AuditMessageType.info, req.baseUrl, 'activateEmail', `Started`);
19
+ const accountService = new AccountService(result);
20
+ const serviceResult = await accountService.confirmEmail(req.body);
21
+ result.addMessage(AuditMessageType.info, req.baseUrl, 'activateEmail', `Finished`);
22
+ return handleResponse(req, res, serviceResult);
23
+ } catch (ex) {
24
+ result.addException(req.baseUrl, 'activateEmail', ex);
25
+ return handleResponse(req, res, result);
26
+ }
27
+ }
28
+
29
+ async register(req, res) {
30
+ const result = res.locals.result;
31
+ try {
32
+ result.addMessage(AuditMessageType.info, req.baseUrl, 'register', `Started`);
33
+ const accountService = new AccountService(result);
34
+ const serviceResult = await accountService.register(req.body);
35
+ result.addMessage(AuditMessageType.info, req.baseUrl, 'register', `Finished`);
36
+ return handleResponse(req, res, serviceResult);
37
+ } catch (ex) {
38
+ result.addException(req.baseUrl, 'register', ex);
39
+ return handleResponse(req, res, result);
40
+ }
41
+ }
42
+
43
+ async login(req, res) {
44
+ const result = res.locals.result;
45
+ try {
46
+ result.addMessage(AuditMessageType.info, req.baseUrl, 'login', `Started`);
47
+ const accountService = new AccountService(result);
48
+ const serviceResult = await accountService.login(req.body);
49
+ result.addMessage(AuditMessageType.info, req.baseUrl, 'login', `Finished`);
50
+ return handleResponse(req, res, serviceResult);
51
+ } catch (ex) {
52
+ result.addException(req.baseUrl, 'login', ex);
53
+ return handleResponse(req, res, result);
54
+ }
55
+ }
56
+
57
+ async verifySignupCode(req, res) {
58
+ const result = res.locals.result;
59
+ try {
60
+ result.addMessage(AuditMessageType.info, req.baseUrl, 'verifySignupCode', `Started`);
61
+ const accountService = new AccountService(result);
62
+ const serviceResult = await accountService.VerifyMobileVerificationCode(req.body);
63
+ result.addMessage(AuditMessageType.info, req.baseUrl, 'verifySignupCode', `Finished`);
64
+ return handleResponse(req, res, serviceResult);
65
+ } catch (ex) {
66
+ result.addException(req.baseUrl, 'verifySignupCode', ex);
67
+ return handleResponse(req, res, result);
68
+ }
69
+ }
70
+
71
+ async completeSignup(req, res) {
72
+ const result = res.locals.result;
73
+ try {
74
+ result.addMessage(AuditMessageType.info, req.baseUrl, 'completeSignup', `Started`);
75
+ const accountService = new AccountService(result);
76
+ const serviceResult = await accountService.completeSignup(req.body);
77
+ result.addMessage(AuditMessageType.info, req.baseUrl, 'completeSignup', `Finished`);
78
+ return handleResponse(req, res, serviceResult);
79
+ } catch (ex) {
80
+ result.addException(req.baseUrl, 'completeSignup', ex);
81
+ return handleResponse(req, res, result);
82
+ }
83
+ }
84
+
85
+ async sendSignUpEmail(req, res) {
86
+ const result = res.locals.result;
87
+ const accountService = new AccountService(result);
88
+ // Implement sendSignupEmail if needed
89
+ return handleResponse(req, res, new Result(true, ResponseCode.Ok, [], []));
90
+ }
91
+
92
+ async checkEmailIsExistForBusiness(req, res) {
93
+ const result = res.locals.result;
94
+ try {
95
+ result.addMessage(AuditMessageType.info, req.baseUrl, 'checkEmailIsExistForBusiness', `Started`);
96
+ const accountService = new AccountService(result);
97
+ const serviceResult = await accountService.checkEmailIsExistForBusiness(req.body);
98
+ result.addMessage(AuditMessageType.info, req.baseUrl, 'checkEmailIsExistForBusiness', `Finished`);
99
+ return handleResponse(req, res, serviceResult);
100
+ } catch (ex) {
101
+ result.addException(req.baseUrl, 'checkEmailIsExistForBusiness', ex);
102
+ return handleResponse(req, res, result);
103
+ }
104
+ }
105
+
106
+ async checkPhoneIsExistForBusiness(req, res) {
107
+ const result = res.locals.result;
108
+ try {
109
+ result.addMessage(AuditMessageType.info, req.baseUrl, 'checkPhoneIsExistForBusiness', `Started`);
110
+ const accountService = new AccountService(result);
111
+ const serviceResult = await accountService.checkPhoneIsExistForBusiness(req.body);
112
+ result.addMessage(AuditMessageType.info, req.baseUrl, 'checkPhoneIsExistForBusiness', `Finished`);
113
+ return handleResponse(req, res, serviceResult);
114
+ } catch (ex) {
115
+ result.addException(req.baseUrl, 'checkPhoneIsExistForBusiness', ex);
116
+ return handleResponse(req, res, result);
117
+ }
118
+ }
119
+
120
+ async resetUserPassword(req, res) {
121
+ const result = res.locals.result;
122
+ try {
123
+ result.addMessage(AuditMessageType.info, req.baseUrl, 'resetUserPassword', `Started`);
124
+ const accountService = new AccountService(result);
125
+ const serviceResult = await accountService.resetUserPassword(req.body);
126
+ result.addMessage(AuditMessageType.info, req.baseUrl, 'resetUserPassword', `Finished`);
127
+ return handleResponse(req, res, serviceResult);
128
+ } catch (ex) {
129
+ result.addException(req.baseUrl, 'resetUserPassword', ex);
130
+ return handleResponse(req, res, result);
131
+ }
132
+ }
133
+
134
+ async requestResetUserPassword(req, res) {
135
+ const result = res.locals.result;
136
+ try {
137
+ result.addMessage(AuditMessageType.info, req.baseUrl, 'requestResetUserPassword', `Started`);
138
+ const accountService = new AccountService(result);
139
+ const serviceResult = await accountService.requestResettUserPassword(req.body);
140
+ result.addMessage(AuditMessageType.info, req.baseUrl, 'requestResetUserPassword', `Finished`);
141
+ return handleResponse(req, res, serviceResult);
142
+ } catch (ex) {
143
+ result.addException(req.baseUrl, 'requestResetUserPassword', ex);
144
+ return handleResponse(req, res, result);
145
+ }
146
+ }
147
+
148
+ // ✅ NEW: Seed user method for seeding admin user
149
+ async seedUser(req, res) {
150
+ const result = new Result(null, ResponseCode.Incompelete, [], [], req.body?.requestIdentifier);
151
+ try {
152
+ result.addMessage(AuditMessageType.info, req.baseUrl, 'seedUser', `Started`);
153
+ const accountService = new AccountService(result);
154
+ const serviceResult = await accountService.seedUser();
155
+ result.addMessage(AuditMessageType.info, req.baseUrl, 'seedUser', `Finished`);
156
+ return handleResponse(req, res, serviceResult);
157
+ } catch (ex) {
158
+ result.addException(req.baseUrl, 'seedUser', ex);
159
+ return handleResponse(req, res, result);
160
+ }
161
+ }
162
+ }
@@ -0,0 +1,12 @@
1
+ import * as mongoose from 'mongoose';
2
+ import { ObjectId } from 'bson';
3
+ import { IBaseEntity } from './base-entity';
4
+
5
+ export interface IAudit extends IBaseEntity {
6
+ type: string;
7
+ auditTime: string;
8
+ className: string;
9
+ methodName: string;
10
+ message: string;
11
+ additionalInfo: JSON;
12
+ }
@@ -0,0 +1,10 @@
1
+ import * as mongoose from 'mongoose';
2
+ import { ObjectId } from 'bson';
3
+
4
+ export interface IBaseEntity extends mongoose.Document {
5
+ _id: ObjectId,
6
+ _createdBy: ObjectId,
7
+ createdAt: Date,
8
+ _updatedBy: ObjectId,
9
+ updatedAt: Date
10
+ }
@@ -0,0 +1,71 @@
1
+ import * as mongoose from 'mongoose';
2
+ import { ObjectId } from "bson";
3
+ import { AuthProvider, AuthMethod } from '../helpers/enums';
4
+
5
+ export interface IUser extends mongoose.Document {
6
+ _id: ObjectId,
7
+ name: string,
8
+ email: string,
9
+ emailVerified: boolean,
10
+ username: string,
11
+
12
+ // Authentication fields
13
+ auth_providers: AuthProviderInfo[],
14
+ primary_auth_provider: AuthProvider,
15
+
16
+ // Legacy fields (for backward compatibility)
17
+ hashedPassword?: string,
18
+ firebaseUID?: string,
19
+
20
+ // Contact information
21
+ phone?: string,
22
+ phoneVerified: boolean,
23
+
24
+ // Profile information
25
+ identity: string,
26
+ address?: any,
27
+ invitationCode?: string,
28
+ registerationStatus?: boolean,
29
+ userType: string,
30
+ status: number,
31
+
32
+ // Timestamps
33
+ createdAt: Date,
34
+ updatedAt: Date
35
+ }
36
+
37
+ export interface AuthProviderInfo {
38
+ provider: AuthProvider;
39
+ provider_user_id?: string; // External provider user ID
40
+ provider_access_token?: string;
41
+ provider_refresh_token?: string;
42
+ provider_metadata?: any; // Additional provider-specific data
43
+ is_verified: boolean;
44
+ last_used: Date;
45
+ created_at: Date;
46
+ }
47
+
48
+ export interface UserSession {
49
+ session_id: string;
50
+ user_id: ObjectId;
51
+ auth_provider: AuthProvider;
52
+ auth_method: AuthMethod;
53
+ ip_address: string;
54
+ user_agent: string;
55
+ is_active: boolean;
56
+ expires_at: Date;
57
+ created_at: Date;
58
+ last_activity: Date;
59
+ }
60
+
61
+ export interface OTPCode {
62
+ code: string;
63
+ user_id: ObjectId;
64
+ auth_provider: AuthProvider;
65
+ purpose: 'email_verification' | 'phone_verification' | 'password_reset' | 'login';
66
+ expires_at: Date;
67
+ attempts: number;
68
+ max_attempts: number;
69
+ is_used: boolean;
70
+ created_at: Date;
71
+ }
@@ -0,0 +1,157 @@
1
+ /* eslint-disable */
2
+ import * as base64Encryption from "base-64";
3
+ import { date } from "yup";
4
+ import { ResponseCode } from "./enums";
5
+ import { Result } from "./result";
6
+ const momentTZ = require("moment-timezone");
7
+
8
+ class FrameworkHelper {
9
+
10
+ listAllTimeZones = () => {
11
+ var aryIannaTimeZones = Intl.supportedValuesOf("timeZone");
12
+
13
+ const date = new Date();
14
+ const timeZones = [];
15
+ aryIannaTimeZones.forEach((timeZone) => {
16
+ let strTime = date.toLocaleString("en-US", { timeZone: `${timeZone}` });
17
+ timeZones.push({
18
+ value: timeZone,
19
+ label: timeZone + " (" + strTime + ")",
20
+ });
21
+ });
22
+ return timeZones;
23
+ };
24
+
25
+ convertTimeToFriendly = (timeSpan, isPretty = true) => {
26
+ try {
27
+ var time = momentTZ.unix(timeSpan).format("MM/DD/YYYY hh:mm:ss.SSS a");
28
+ if (!isPretty) return momentTZ(time).toLocaleString();
29
+ return momentTZ(time).fromNow().toLocaleLowerCase();
30
+ } catch (ex) {
31
+ return new momentTZ().fromNow();
32
+ }
33
+ };
34
+
35
+ sortList(list, sortField, dir = 1) {
36
+ try {
37
+ var sortedList = list.sort((a, b) => {
38
+ if (a[sortField] > b[sortField]) {
39
+ return 1;
40
+ }
41
+ if (a[sortField] < b[sortField]) {
42
+ return -1;
43
+ }
44
+ return 0;
45
+ });
46
+ if (dir == -1) {
47
+ return sortedList.reverse();
48
+ }
49
+ return sortedList;
50
+ } catch (ex) {
51
+ return [];
52
+ }
53
+ }
54
+
55
+ deepEqual(obj1, obj2) {
56
+ // Check if both are objects
57
+ if (
58
+ typeof obj1 === "object" &&
59
+ obj1 !== null &&
60
+ typeof obj2 === "object" &&
61
+ obj2 !== null
62
+ ) {
63
+ // Get the keys of the objects
64
+ const keys1 = Object.keys(obj1);
65
+ const keys2 = Object.keys(obj2);
66
+
67
+ // Check if the number of keys is the same
68
+ if (keys1.length !== keys2.length) {
69
+ return false;
70
+ }
71
+
72
+ // Check each property
73
+ for (const key of keys1) {
74
+ if (!keys2.includes(key) || !this.deepEqual(obj1[key], obj2[key])) {
75
+ return false;
76
+ }
77
+ }
78
+
79
+ return true;
80
+ } else {
81
+ // If not objects, use strict equality
82
+ return obj1 === obj2;
83
+ }
84
+ }
85
+
86
+ uniqueObjects = (dataArray) => {
87
+ return Array.from(
88
+ new Map(dataArray.map((obj) => [JSON.stringify(obj), obj])).values()
89
+ );
90
+ };
91
+
92
+ clearTextSpaces = (text) => {
93
+ let wordsArray = text.split(" ").filter((word) => word !== "");
94
+ let stringWithoutSpaces = wordsArray.join("");
95
+ return stringWithoutSpaces;
96
+ };
97
+
98
+ filterDictionaryObject = (inputObject, targetKey, targetValue) => {
99
+ return Object.keys(inputObject)
100
+ .filter(key => inputObject[key][targetKey] === targetValue)
101
+ .map(key => inputObject[key]);
102
+ };
103
+
104
+ generateRandomString(length) {
105
+ const crypto = require('crypto');
106
+ return crypto.randomBytes(Math.ceil(length / 2))
107
+ .toString('hex') // Convert to hexadecimal format
108
+ .slice(0, length); // Return required number of characters
109
+ }
110
+
111
+ mapObjectsToType(source, TargetType) {
112
+ const target = new TargetType();
113
+ if (source) {
114
+ // Iterate over the properties of the target object
115
+ Object.keys(target).forEach(key => {
116
+ if (key in source) {
117
+ const descriptor = Object.getOwnPropertyDescriptor(source, key);
118
+ if (descriptor && (descriptor.get || descriptor.set)) {
119
+ // Handle getters and setters
120
+ Object.defineProperty(target, key, descriptor);
121
+ } else {
122
+ // Direct value copy for normal properties
123
+ target[key] = source[key];
124
+ }
125
+ }
126
+ });
127
+ return target;
128
+ }
129
+ return null;
130
+ };
131
+
132
+ formatTextAsCode(input: String): String {
133
+ // Remove spaces and special characters using regex
134
+ let processedText = input.replace(/[^a-zA-Z0-9]/g, '');
135
+ // Capitalize all characters
136
+ processedText = processedText.toUpperCase();
137
+ return processedText;
138
+ }
139
+
140
+ getDifferenceDatesInDays(date1, date2) {
141
+ // Convert both dates to milliseconds
142
+ const date1Time = new Date(date1).getTime();
143
+ const date2Time = new Date(date2).getTime();
144
+
145
+ // Calculate the difference in milliseconds
146
+ const diffTime = Math.abs(date2Time - date1Time);
147
+
148
+ // Convert the difference to days
149
+ const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
150
+
151
+ return diffDays;
152
+ }
153
+
154
+
155
+ }
156
+
157
+ export const frameworkHelper = new FrameworkHelper();