@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.
- package/README.md +17 -3
- package/dist/services/template-updater.d.ts +2 -0
- package/dist/services/template-updater.d.ts.map +1 -1
- package/dist/services/template-updater.js +66 -14
- package/dist/services/template-updater.js.map +1 -1
- package/package.json +5 -1
- package/templates/api/certs/auth-app-cert.json +13 -0
- package/templates/api/main.ts +10 -0
- package/templates/api/package.json +70 -0
- package/templates/api/src/assets/css/email-template.css +8 -0
- package/templates/api/src/assets/images/logo_large.png +0 -0
- package/templates/api/src/assets/keys/certificate.pem +22 -0
- package/templates/api/src/assets/keys/private-key.pem +28 -0
- package/templates/api/src/config/config-interface.ts +191 -0
- package/templates/api/src/config/development.ts +145 -0
- package/templates/api/src/config/index.ts +59 -0
- package/templates/api/src/config/production.ts +145 -0
- package/templates/api/src/config/staging.ts +144 -0
- package/templates/api/src/config/uat.ts +144 -0
- package/templates/api/src/controllers/account-controller.ts +162 -0
- package/templates/api/src/entities/audit.ts +12 -0
- package/templates/api/src/entities/base-entity.ts +10 -0
- package/templates/api/src/entities/user.ts +71 -0
- package/templates/api/src/helpers/FrameworkHelper.ts +157 -0
- package/templates/api/src/helpers/auth.ts +971 -0
- package/templates/api/src/helpers/cronHelper.ts +170 -0
- package/templates/api/src/helpers/dbcontext.ts +83 -0
- package/templates/api/src/helpers/encryptionHelper.ts +76 -0
- package/templates/api/src/helpers/enums.ts +258 -0
- package/templates/api/src/helpers/handle-response.ts +49 -0
- package/templates/api/src/helpers/httpHelper.ts +75 -0
- package/templates/api/src/helpers/mailer.ts +152 -0
- package/templates/api/src/helpers/result.ts +47 -0
- package/templates/api/src/helpers/string-helper.ts +27 -0
- package/templates/api/src/routes/account-routes.ts +37 -0
- package/templates/api/src/routes/auth-routes.ts +286 -0
- package/templates/api/src/routes/index.ts +92 -0
- package/templates/api/src/schemas/audit.ts +36 -0
- package/templates/api/src/schemas/otp.ts +52 -0
- package/templates/api/src/schemas/session.ts +57 -0
- package/templates/api/src/schemas/user.ts +125 -0
- package/templates/api/src/server/index.ts +86 -0
- package/templates/api/src/server/socket-server-provider.ts +209 -0
- package/templates/api/src/services/account-service.ts +243 -0
- package/templates/api/src/services/audit-service.ts +56 -0
- package/templates/api/tsconfig.json +16 -0
- package/templates/api/webpack.config.js +66 -0
- package/scripts/publish.sh +0 -58
- package/scripts/setup.sh +0 -38
- package/scripts/version.sh +0 -80
- package/src/commands/api.ts +0 -76
- package/src/commands/extend.ts +0 -35
- package/src/commands/init.ts +0 -32
- package/src/commands/update.ts +0 -25
- package/src/config/template-config.ts +0 -111
- package/src/index.ts +0 -41
- package/src/services/api-generator.ts +0 -378
- package/src/services/project-extender.ts +0 -330
- package/src/services/project-initializer.ts +0 -335
- package/src/services/project-updater.ts +0 -117
- package/src/services/relation-generator.ts +0 -203
- package/src/services/table-generator.ts +0 -114
- package/src/services/template-processor.ts +0 -166
- package/src/services/template-updater.ts +0 -184
- 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,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();
|