@organizasyon/meeting-nanaman-app-backend 1.0.0

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 (101) hide show
  1. package/dist/controllers/auth/index.d.ts +65 -0
  2. package/dist/controllers/auth/index.js +525 -0
  3. package/dist/controllers/employees/index.d.ts +38 -0
  4. package/dist/controllers/employees/index.js +185 -0
  5. package/dist/controllers/health/index.d.ts +9 -0
  6. package/dist/controllers/health/index.js +42 -0
  7. package/dist/controllers/index.d.ts +16 -0
  8. package/dist/controllers/index.js +19 -0
  9. package/dist/controllers/meetings/index.d.ts +23 -0
  10. package/dist/controllers/meetings/index.js +233 -0
  11. package/dist/controllers/modules/index.d.ts +5 -0
  12. package/dist/controllers/modules/index.js +104 -0
  13. package/dist/controllers/users/index.d.ts +103 -0
  14. package/dist/controllers/users/index.js +841 -0
  15. package/dist/data/modules.json +94 -0
  16. package/dist/database/config/index.d.ts +2 -0
  17. package/dist/database/config/index.js +32 -0
  18. package/dist/database/index.d.ts +9 -0
  19. package/dist/database/index.js +9 -0
  20. package/dist/database/seeder/employees/index.d.ts +1 -0
  21. package/dist/database/seeder/employees/index.js +40 -0
  22. package/dist/database/seeder/index.d.ts +4 -0
  23. package/dist/database/seeder/index.js +20 -0
  24. package/dist/database/seeder/users/index.d.ts +1 -0
  25. package/dist/database/seeder/users/index.js +46 -0
  26. package/dist/index.d.ts +9 -0
  27. package/dist/index.js +23 -0
  28. package/dist/jobs/index.d.ts +1 -0
  29. package/dist/jobs/index.js +18 -0
  30. package/dist/jobs/mailer/index.d.ts +4 -0
  31. package/dist/jobs/mailer/index.js +186 -0
  32. package/dist/jobs/mailer/templates/auth.d.ts +11 -0
  33. package/dist/jobs/mailer/templates/auth.js +117 -0
  34. package/dist/jobs/mailer/templates/index.d.ts +1 -0
  35. package/dist/jobs/mailer/templates/index.js +17 -0
  36. package/dist/jobs/queues/index.d.ts +3 -0
  37. package/dist/jobs/queues/index.js +115 -0
  38. package/dist/middlewares/audit/index.d.ts +0 -0
  39. package/dist/middlewares/audit/index.js +1 -0
  40. package/dist/middlewares/guard/index.d.ts +11 -0
  41. package/dist/middlewares/guard/index.js +53 -0
  42. package/dist/middlewares/index.d.ts +2 -0
  43. package/dist/middlewares/index.js +7 -0
  44. package/dist/middlewares/meeting.d.ts +9 -0
  45. package/dist/middlewares/meeting.js +34 -0
  46. package/dist/models/employees/index.d.ts +83 -0
  47. package/dist/models/employees/index.js +70 -0
  48. package/dist/models/index.d.ts +570 -0
  49. package/dist/models/index.js +17 -0
  50. package/dist/models/meetings/index.d.ts +227 -0
  51. package/dist/models/meetings/index.js +112 -0
  52. package/dist/models/passkeys/index.d.ts +77 -0
  53. package/dist/models/passkeys/index.js +55 -0
  54. package/dist/models/queues/index.d.ts +77 -0
  55. package/dist/models/queues/index.js +57 -0
  56. package/dist/models/users/index.d.ts +107 -0
  57. package/dist/models/users/index.js +92 -0
  58. package/dist/queues/index.d.ts +1 -0
  59. package/dist/queues/index.js +17 -0
  60. package/dist/queues/mailer/index.d.ts +4 -0
  61. package/dist/queues/mailer/index.js +74 -0
  62. package/dist/types/index.d.ts +33 -0
  63. package/dist/types/index.js +2 -0
  64. package/dist/utils/notifications.d.ts +2 -0
  65. package/dist/utils/notifications.js +51 -0
  66. package/package.json +39 -0
  67. package/public/health.html +215 -0
  68. package/src/controllers/auth/index.ts +609 -0
  69. package/src/controllers/employees/index.ts +210 -0
  70. package/src/controllers/health/index.ts +41 -0
  71. package/src/controllers/index.ts +9 -0
  72. package/src/controllers/meetings/index.ts +251 -0
  73. package/src/controllers/modules/index.ts +74 -0
  74. package/src/controllers/users/index.ts +981 -0
  75. package/src/data/modules.json +94 -0
  76. package/src/database/config/index.ts +26 -0
  77. package/src/database/index.ts +5 -0
  78. package/src/database/seeder/employees/index.ts +35 -0
  79. package/src/database/seeder/index.ts +18 -0
  80. package/src/database/seeder/users/index.ts +44 -0
  81. package/src/index.ts +10 -0
  82. package/src/jobs/index.ts +2 -0
  83. package/src/jobs/mailer/index.ts +154 -0
  84. package/src/jobs/mailer/templates/auth.ts +113 -0
  85. package/src/jobs/mailer/templates/index.ts +1 -0
  86. package/src/jobs/queues/index.ts +125 -0
  87. package/src/middlewares/audit/index.ts +0 -0
  88. package/src/middlewares/guard/index.ts +64 -0
  89. package/src/middlewares/index.ts +5 -0
  90. package/src/middlewares/meeting.ts +45 -0
  91. package/src/models/employees/index.ts +70 -0
  92. package/src/models/index.ts +8 -0
  93. package/src/models/meetings/index.ts +112 -0
  94. package/src/models/passkeys/index.ts +53 -0
  95. package/src/models/queues/index.ts +55 -0
  96. package/src/models/users/index.ts +92 -0
  97. package/src/queues/index.ts +1 -0
  98. package/src/queues/mailer/index.ts +80 -0
  99. package/src/types/index.ts +38 -0
  100. package/src/utils/notifications.ts +66 -0
  101. package/tsconfig.json +18 -0
@@ -0,0 +1,94 @@
1
+ {
2
+ "modules": [
3
+ {
4
+ "id": "dashboard",
5
+ "name": "Dashboard",
6
+ "icon": "LayoutDashboard",
7
+ "path": "/dashboard",
8
+ "children": []
9
+ },
10
+ {
11
+ "id": "inventory",
12
+ "name": "Inventory",
13
+ "icon": "Package",
14
+ "path": "/inventory",
15
+ "children": [
16
+ {
17
+ "id": "products",
18
+ "name": "Products",
19
+ "path": "/inventory/products"
20
+ },
21
+ {
22
+ "id": "categories",
23
+ "name": "Categories",
24
+ "path": "/inventory/categories"
25
+ },
26
+ {
27
+ "id": "suppliers",
28
+ "name": "Suppliers",
29
+ "path": "/inventory/suppliers"
30
+ }
31
+ ]
32
+ },
33
+ {
34
+ "id": "reports",
35
+ "name": "Reports",
36
+ "icon": "BarChart3",
37
+ "path": "/reports",
38
+ "children": [
39
+ {
40
+ "id": "sales",
41
+ "name": "Sales",
42
+ "path": "/reports/sales"
43
+ },
44
+ {
45
+ "id": "inventory-reports",
46
+ "name": "Inventory",
47
+ "path": "/reports/inventory"
48
+ },
49
+ {
50
+ "id": "financial",
51
+ "name": "Financial",
52
+ "path": "/reports/financial"
53
+ }
54
+ ]
55
+ },
56
+ {
57
+ "id": "settings",
58
+ "name": "Settings",
59
+ "icon": "Settings",
60
+ "path": "/settings",
61
+ "children": [
62
+ {
63
+ "id": "general",
64
+ "name": "General",
65
+ "path": "/settings/general"
66
+ },
67
+ {
68
+ "id": "users",
69
+ "name": "Users",
70
+ "icon": "Users",
71
+ "path": "/settings/users",
72
+ "children": [
73
+ {
74
+ "id": "roles",
75
+ "name": "Roles",
76
+ "path": "/settings/users/roles"
77
+ },
78
+ {
79
+ "id": "permissions",
80
+ "name": "Permissions",
81
+ "path": "/settings/users/permissions"
82
+ }
83
+ ]
84
+ },
85
+ {
86
+ "id": "notifications",
87
+ "name": "Notifications",
88
+ "icon": "Bell",
89
+ "path": "/settings/notifications"
90
+ }
91
+ ]
92
+ }
93
+ ]
94
+ }
@@ -0,0 +1,2 @@
1
+ export declare function connectDB(): Promise<void>;
2
+ export declare function disconnectDB(): Promise<void>;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.connectDB = connectDB;
7
+ exports.disconnectDB = disconnectDB;
8
+ const mongoose_1 = __importDefault(require("mongoose"));
9
+ const mongoUri = process.env.APP_MONGO_URI;
10
+ if (!mongoUri) {
11
+ throw new Error('APP_MONGO_URI environment variable is not set');
12
+ }
13
+ async function connectDB() {
14
+ try {
15
+ await mongoose_1.default.connect(mongoUri);
16
+ console.log('MongoDB connected');
17
+ }
18
+ catch (err) {
19
+ console.error('MongoDB connection error:', err);
20
+ throw err;
21
+ }
22
+ }
23
+ async function disconnectDB() {
24
+ try {
25
+ await mongoose_1.default.disconnect();
26
+ console.log('MongoDB disconnected');
27
+ }
28
+ catch (err) {
29
+ console.error('MongoDB disconnection error:', err);
30
+ throw err;
31
+ }
32
+ }
@@ -0,0 +1,9 @@
1
+ import { connectDB, disconnectDB } from './config';
2
+ import { runSeeders } from './seeder';
3
+ export { connectDB, disconnectDB, runSeeders };
4
+ declare const _default: {
5
+ connectDB: typeof connectDB;
6
+ disconnectDB: typeof disconnectDB;
7
+ runSeeders: () => Promise<void>;
8
+ };
9
+ export default _default;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runSeeders = exports.disconnectDB = exports.connectDB = void 0;
4
+ const config_1 = require("./config");
5
+ Object.defineProperty(exports, "connectDB", { enumerable: true, get: function () { return config_1.connectDB; } });
6
+ Object.defineProperty(exports, "disconnectDB", { enumerable: true, get: function () { return config_1.disconnectDB; } });
7
+ const seeder_1 = require("./seeder");
8
+ Object.defineProperty(exports, "runSeeders", { enumerable: true, get: function () { return seeder_1.runSeeders; } });
9
+ exports.default = { connectDB: config_1.connectDB, disconnectDB: config_1.disconnectDB, runSeeders: seeder_1.runSeeders };
@@ -0,0 +1 @@
1
+ export declare const seedEmployees: () => Promise<void>;
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.seedEmployees = void 0;
7
+ const employees_1 = __importDefault(require("../../../models/employees"));
8
+ const seedEmployees = async () => {
9
+ try {
10
+ const existingEmployees = await employees_1.default.find({}).lean().exec();
11
+ if (existingEmployees.length === 0) {
12
+ const seederEmail = process.env.SEEDER_USER_EMAIL;
13
+ if (!seederEmail) {
14
+ throw new Error('SEEDER_USER_EMAIL environment variable is required');
15
+ }
16
+ const sampleEmployee = {
17
+ first_name: 'System',
18
+ middle_name: '',
19
+ last_name: 'Administrator',
20
+ email: seederEmail,
21
+ contact_number: '+1234567890',
22
+ position: 'System Administrator',
23
+ department: 'IT',
24
+ address: 'System Administration',
25
+ created_at: Date.now(),
26
+ updated_at: Date.now()
27
+ };
28
+ await employees_1.default.create(sampleEmployee);
29
+ console.log('Sample employee seeded successfully');
30
+ }
31
+ else {
32
+ console.log('Employees already exist, skipping seeding');
33
+ }
34
+ }
35
+ catch (error) {
36
+ console.error('Error seeding employees:', error);
37
+ throw error;
38
+ }
39
+ };
40
+ exports.seedEmployees = seedEmployees;
@@ -0,0 +1,4 @@
1
+ import { seedEmployees } from './employees';
2
+ import { seedUsers } from './users';
3
+ export declare const runSeeders: () => Promise<void>;
4
+ export { seedEmployees, seedUsers };
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.seedUsers = exports.seedEmployees = exports.runSeeders = void 0;
4
+ const employees_1 = require("./employees");
5
+ Object.defineProperty(exports, "seedEmployees", { enumerable: true, get: function () { return employees_1.seedEmployees; } });
6
+ const users_1 = require("./users");
7
+ Object.defineProperty(exports, "seedUsers", { enumerable: true, get: function () { return users_1.seedUsers; } });
8
+ const runSeeders = async () => {
9
+ try {
10
+ console.log('Running database seeders...');
11
+ await (0, employees_1.seedEmployees)();
12
+ await (0, users_1.seedUsers)();
13
+ console.log('All seeders completed successfully');
14
+ }
15
+ catch (error) {
16
+ console.error('Error running seeders:', error);
17
+ throw error;
18
+ }
19
+ };
20
+ exports.runSeeders = runSeeders;
@@ -0,0 +1 @@
1
+ export declare const seedUsers: () => Promise<void>;
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.seedUsers = void 0;
7
+ const users_1 = __importDefault(require("../../../models/users"));
8
+ const employees_1 = __importDefault(require("../../../models/employees"));
9
+ const bcrypt_1 = __importDefault(require("bcrypt"));
10
+ const seedUsers = async () => {
11
+ try {
12
+ const existingUsers = await users_1.default.find({}).lean().exec();
13
+ if (existingUsers.length === 0) {
14
+ // Get employees to link with users
15
+ const employees = await employees_1.default.find({}).lean().exec();
16
+ const seederPassword = process.env.SEEDER_USER_PASSWORD;
17
+ const seederEmail = process.env.SEEDER_USER_EMAIL;
18
+ if (!seederPassword || !seederEmail) {
19
+ throw new Error('SEEDER_USER_EMAIL and SEEDER_USER_PASSWORD environment variables are required');
20
+ }
21
+ const hashedPassword = await bcrypt_1.default.hash(seederPassword, 10);
22
+ const sampleUser = {
23
+ email: seederEmail,
24
+ password: hashedPassword,
25
+ first_name: 'System',
26
+ middle_name: '',
27
+ last_name: 'Administrator',
28
+ role: 'admin',
29
+ employee_id: employees[0]?._id || null,
30
+ is_active: true,
31
+ created_at: Date.now(),
32
+ updated_at: Date.now()
33
+ };
34
+ await users_1.default.create(sampleUser);
35
+ console.log('Sample user seeded successfully');
36
+ }
37
+ else {
38
+ console.log('Users already exist, skipping seeding');
39
+ }
40
+ }
41
+ catch (error) {
42
+ console.error('Error seeding users:', error);
43
+ throw error;
44
+ }
45
+ };
46
+ exports.seedUsers = seedUsers;
@@ -0,0 +1,9 @@
1
+ import 'dotenv/config';
2
+ import { connectDB } from './database/config';
3
+ import { EmployeesController, UsersController, ModulesController, AuthController, HealthController, MeetingsController } from './controllers';
4
+ import { authenticateToken } from './middlewares';
5
+ import { runSeeders } from './database/seeder';
6
+ import { Employees, Users, Passkeys, Queues, Meetings } from './models';
7
+ import type { MulterRequest } from './types';
8
+ export { connectDB, EmployeesController, UsersController, ModulesController, AuthController, authenticateToken, HealthController, MeetingsController, runSeeders, Employees, Users, Passkeys, Queues, Meetings };
9
+ export type { MulterRequest };
package/dist/index.js ADDED
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Meetings = exports.Queues = exports.Passkeys = exports.Users = exports.Employees = exports.runSeeders = exports.MeetingsController = exports.HealthController = exports.authenticateToken = exports.AuthController = exports.ModulesController = exports.UsersController = exports.EmployeesController = exports.connectDB = void 0;
4
+ require("dotenv/config");
5
+ const config_1 = require("./database/config");
6
+ Object.defineProperty(exports, "connectDB", { enumerable: true, get: function () { return config_1.connectDB; } });
7
+ const controllers_1 = require("./controllers");
8
+ Object.defineProperty(exports, "EmployeesController", { enumerable: true, get: function () { return controllers_1.EmployeesController; } });
9
+ Object.defineProperty(exports, "UsersController", { enumerable: true, get: function () { return controllers_1.UsersController; } });
10
+ Object.defineProperty(exports, "ModulesController", { enumerable: true, get: function () { return controllers_1.ModulesController; } });
11
+ Object.defineProperty(exports, "AuthController", { enumerable: true, get: function () { return controllers_1.AuthController; } });
12
+ Object.defineProperty(exports, "HealthController", { enumerable: true, get: function () { return controllers_1.HealthController; } });
13
+ Object.defineProperty(exports, "MeetingsController", { enumerable: true, get: function () { return controllers_1.MeetingsController; } });
14
+ const middlewares_1 = require("./middlewares");
15
+ Object.defineProperty(exports, "authenticateToken", { enumerable: true, get: function () { return middlewares_1.authenticateToken; } });
16
+ const seeder_1 = require("./database/seeder");
17
+ Object.defineProperty(exports, "runSeeders", { enumerable: true, get: function () { return seeder_1.runSeeders; } });
18
+ const models_1 = require("./models");
19
+ Object.defineProperty(exports, "Employees", { enumerable: true, get: function () { return models_1.Employees; } });
20
+ Object.defineProperty(exports, "Users", { enumerable: true, get: function () { return models_1.Users; } });
21
+ Object.defineProperty(exports, "Passkeys", { enumerable: true, get: function () { return models_1.Passkeys; } });
22
+ Object.defineProperty(exports, "Queues", { enumerable: true, get: function () { return models_1.Queues; } });
23
+ Object.defineProperty(exports, "Meetings", { enumerable: true, get: function () { return models_1.Meetings; } });
@@ -0,0 +1 @@
1
+ export * from '../queues';
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ // Export queue modules and worker starters
18
+ __exportStar(require("../queues"), exports);
@@ -0,0 +1,4 @@
1
+ export declare const sendEmail: (to: string, subject: string, html: string) => Promise<void>;
2
+ export declare const sendPasswordResetEmail: (email: string, name: string, resetToken: string) => Promise<void>;
3
+ export declare const sendPasswordChangedEmail: (email: string, name: string) => Promise<void>;
4
+ export declare const sendPasskeyRegisteredEmail: (email: string, name: string, deviceName: string) => Promise<void>;
@@ -0,0 +1,186 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.sendPasskeyRegisteredEmail = exports.sendPasswordChangedEmail = exports.sendPasswordResetEmail = exports.sendEmail = void 0;
37
+ const nodemailer = __importStar(require("nodemailer"));
38
+ const transporter = nodemailer.createTransport({
39
+ host: process.env.APP_MAILER_HOST,
40
+ port: Number(process.env.APP_MAILER_PORT) || 587,
41
+ secure: process.env.APP_MAILER_SERVICE === 'gmail' ? false : true,
42
+ service: process.env.APP_MAILER_SERVICE,
43
+ auth: {
44
+ user: process.env.APP_MAILER_USER,
45
+ pass: process.env.APP_MAILER_PASS,
46
+ },
47
+ });
48
+ const sendEmail = async (to, subject, html) => {
49
+ try {
50
+ const mailOptions = {
51
+ from: process.env.APP_MAILER_USER,
52
+ to,
53
+ subject,
54
+ html,
55
+ };
56
+ await transporter.sendMail(mailOptions);
57
+ console.log(`Email sent successfully to ${to}`);
58
+ }
59
+ catch (error) {
60
+ console.error('Error sending email:', error);
61
+ throw error;
62
+ }
63
+ };
64
+ exports.sendEmail = sendEmail;
65
+ const sendPasswordResetEmail = async (email, name, resetToken) => {
66
+ const subject = 'Password Reset Request - Inventory Management System';
67
+ const html = `<!DOCTYPE html>
68
+ <html lang="en">
69
+ <head>
70
+ <meta charset="UTF-8">
71
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
72
+ <title>Password Reset - Inventory Management System</title>
73
+ <style>
74
+ body { font-family: Arial, sans-serif; line-height: 1.6; color: #333; }
75
+ .container { max-width: 600px; margin: 0 auto; padding: 20px; }
76
+ .header { background: #f8f9fa; padding: 20px; text-align: center; border-radius: 8px 8px 0 0; }
77
+ .content { background: #ffffff; padding: 30px; border-radius: 0 0 8px 8px; }
78
+ .button { display: inline-block; padding: 12px 24px; background: #007bff; color: white; text-decoration: none; border-radius: 5px; margin: 20px 0; }
79
+ .footer { text-align: center; padding: 20px; font-size: 12px; color: #666; }
80
+ </style>
81
+ </head>
82
+ <body>
83
+ <div class="container">
84
+ <div class="header">
85
+ <h1>🔐 Password Reset Request</h1>
86
+ </div>
87
+ <div class="content">
88
+ <p>Hello <strong>${name}</strong>,</p>
89
+ <p>We received a request to reset your password for the Inventory Management System. Click the button below to reset your password:</p>
90
+ <p style="text-align: center;">
91
+ <a href="${process.env.APP_MOBILE_APP_URL}/reset-password?token=${resetToken}" class="button">Reset Password</a>
92
+ </p>
93
+ <p>This link will expire in 1 hour for security reasons.</p>
94
+ <p>If you didn't request this password reset, please ignore this email.</p>
95
+ </div>
96
+ <div class="footer">
97
+ <p>© 2024 Inventory Management System. All rights reserved.</p>
98
+ </div>
99
+ </div>
100
+ </body>
101
+ </html>`;
102
+ await (0, exports.sendEmail)(email, subject, html);
103
+ };
104
+ exports.sendPasswordResetEmail = sendPasswordResetEmail;
105
+ const sendPasswordChangedEmail = async (email, name) => {
106
+ const subject = 'Password Changed - Inventory Management System';
107
+ const html = `<!DOCTYPE html>
108
+ <html lang="en">
109
+ <head>
110
+ <meta charset="UTF-8">
111
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
112
+ <title>Password Changed - Inventory Management System</title>
113
+ <style>
114
+ body { font-family: Arial, sans-serif; line-height: 1.6; color: #333; }
115
+ .container { max-width: 600px; margin: 0 auto; padding: 20px; }
116
+ .header { background: #28a745; padding: 20px; text-align: center; border-radius: 8px 8px 0 0; color: white; }
117
+ .content { background: #ffffff; padding: 30px; border-radius: 0 0 8px 8px; }
118
+ .button { display: inline-block; padding: 12px 24px; background: #007bff; color: white; text-decoration: none; border-radius: 5px; margin: 20px 0; }
119
+ .footer { text-align: center; padding: 20px; font-size: 12px; color: #666; }
120
+ </style>
121
+ </head>
122
+ <body>
123
+ <div class="container">
124
+ <div class="header">
125
+ <h1>✅ Password Successfully Changed</h1>
126
+ </div>
127
+ <div class="content">
128
+ <p>Hello <strong>${name}</strong>,</p>
129
+ <p>Your password for the Inventory Management System has been successfully changed.</p>
130
+ <p>If you didn't make this change, please contact our support team immediately.</p>
131
+ <p>For security reasons, we recommend:</p>
132
+ <ul>
133
+ <li>Using a strong, unique password</li>
134
+ <li>Not sharing your password with anyone</li>
135
+ <li>Enabling two-factor authentication if available</li>
136
+ </ul>
137
+ </div>
138
+ <div class="footer">
139
+ <p>© 2024 Inventory Management System. All rights reserved.</p>
140
+ </div>
141
+ </div>
142
+ </body>
143
+ </html>`;
144
+ await (0, exports.sendEmail)(email, subject, html);
145
+ };
146
+ exports.sendPasswordChangedEmail = sendPasswordChangedEmail;
147
+ const sendPasskeyRegisteredEmail = async (email, name, deviceName) => {
148
+ const subject = 'New Passkey Registered - Inventory Management System';
149
+ const html = `<!DOCTYPE html>
150
+ <html lang="en">
151
+ <head>
152
+ <meta charset="UTF-8">
153
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
154
+ <title>Passkey Registered - Inventory Management System</title>
155
+ <style>
156
+ body { font-family: Arial, sans-serif; line-height: 1.6; color: #333; }
157
+ .container { max-width: 600px; margin: 0 auto; padding: 20px; }
158
+ .header { background: #6f42c1; padding: 20px; text-align: center; border-radius: 8px 8px 0 0; color: white; }
159
+ .content { background: #ffffff; padding: 30px; border-radius: 0 0 8px 8px; }
160
+ .button { display: inline-block; padding: 12px 24px; background: #007bff; color: white; text-decoration: none; border-radius: 5px; margin: 20px 0; }
161
+ .footer { text-align: center; padding: 20px; font-size: 12px; color: #666; }
162
+ </style>
163
+ </head>
164
+ <body>
165
+ <div class="container">
166
+ <div class="header">
167
+ <h1>🔑 New Passkey Registered</h1>
168
+ </div>
169
+ <div class="content">
170
+ <p>Hello <strong>${name}</strong>,</p>
171
+ <p>A new passkey has been registered for your Inventory Management System account:</p>
172
+ <div style="background: #f8f9fa; padding: 15px; border-radius: 5px; margin: 20px 0;">
173
+ <p><strong>Device:</strong> ${deviceName}</p>
174
+ </div>
175
+ <p>You can now use this passkey to sign in to your account without a password.</p>
176
+ <p>If you didn't register this passkey, please secure your account immediately.</p>
177
+ </div>
178
+ <div class="footer">
179
+ <p>© 2024 Inventory Management System. All rights reserved.</p>
180
+ </div>
181
+ </div>
182
+ </body>
183
+ </html>`;
184
+ await (0, exports.sendEmail)(email, subject, html);
185
+ };
186
+ exports.sendPasskeyRegisteredEmail = sendPasskeyRegisteredEmail;
@@ -0,0 +1,11 @@
1
+ export declare const forgotPasswordTemplate: (data: {
2
+ name: string;
3
+ reset_token: string;
4
+ }) => string;
5
+ export declare const passwordChangedTemplate: (data: {
6
+ name: string;
7
+ }) => string;
8
+ export declare const passkeyRegisteredTemplate: (data: {
9
+ name: string;
10
+ device_name: string;
11
+ }) => string;
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.passkeyRegisteredTemplate = exports.passwordChangedTemplate = exports.forgotPasswordTemplate = void 0;
4
+ const forgotPasswordTemplate = (data) => `
5
+ <!DOCTYPE html>
6
+ <html lang="en">
7
+ <head>
8
+ <meta charset="UTF-8">
9
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
10
+ <title>Password Reset - Inventory Management System</title>
11
+ <style>
12
+ body { font-family: Arial, sans-serif; line-height: 1.6; color: #333; }
13
+ .container { max-width: 600px; margin: 0 auto; padding: 20px; }
14
+ .header { background: #f8f9fa; padding: 20px; text-align: center; border-radius: 8px 8px 0 0; }
15
+ .content { background: #ffffff; padding: 30px; border-radius: 0 0 8px 8px; }
16
+ .button { display: inline-block; padding: 12px 24px; background: #007bff; color: white; text-decoration: none; border-radius: 5px; margin: 20px 0; }
17
+ .footer { text-align: center; padding: 20px; font-size: 12px; color: #666; }
18
+ </style>
19
+ </head>
20
+ <body>
21
+ <div class="container">
22
+ <div class="header">
23
+ <h1>🔐 Password Reset Request</h1>
24
+ </div>
25
+ <div class="content">
26
+ <p>Hello <strong>${data.name}</strong>,</p>
27
+ <p>We received a request to reset your password for the Inventory Management System. Click the button below to reset your password:</p>
28
+ <p style="text-align: center;">
29
+ <a href="${process.env.APP_MOBILE_APP_URL}/reset-password?token=${data.reset_token}" class="button">Reset Password</a>
30
+ </p>
31
+ <p>This link will expire in 1 hour for security reasons.</p>
32
+ <p>If you didn't request this password reset, please ignore this email.</p>
33
+ </div>
34
+ <div class="footer">
35
+ <p>© 2024 Inventory Management System. All rights reserved.</p>
36
+ </div>
37
+ </div>
38
+ </body>
39
+ </html>
40
+ `;
41
+ exports.forgotPasswordTemplate = forgotPasswordTemplate;
42
+ const passwordChangedTemplate = (data) => `
43
+ <!DOCTYPE html>
44
+ <html lang="en">
45
+ <head>
46
+ <meta charset="UTF-8">
47
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
48
+ <title>Password Changed - Inventory Management System</title>
49
+ <style>
50
+ body { font-family: Arial, sans-serif; line-height: 1.6; color: #333; }
51
+ .container { max-width: 600px; margin: 0 auto; padding: 20px; }
52
+ .header { background: #28a745; padding: 20px; text-align: center; border-radius: 8px 8px 0 0; color: white; }
53
+ .content { background: #ffffff; padding: 30px; border-radius: 0 0 8px 8px; }
54
+ .footer { text-align: center; padding: 20px; font-size: 12px; color: #666; }
55
+ </style>
56
+ </head>
57
+ <body>
58
+ <div class="container">
59
+ <div class="header">
60
+ <h1>✅ Password Successfully Changed</h1>
61
+ </div>
62
+ <div class="content">
63
+ <p>Hello <strong>${data.name}</strong>,</p>
64
+ <p>Your password for the Inventory Management System has been successfully changed.</p>
65
+ <p>If you didn't make this change, please contact our support team immediately.</p>
66
+ <p>For security reasons, we recommend:</p>
67
+ <ul>
68
+ <li>Using a strong, unique password</li>
69
+ <li>Not sharing your password with anyone</li>
70
+ <li>Enabling two-factor authentication if available</li>
71
+ </ul>
72
+ </div>
73
+ <div class="footer">
74
+ <p>© 2024 Inventory Management System. All rights reserved.</p>
75
+ </div>
76
+ </div>
77
+ </body>
78
+ </html>
79
+ `;
80
+ exports.passwordChangedTemplate = passwordChangedTemplate;
81
+ const passkeyRegisteredTemplate = (data) => `
82
+ <!DOCTYPE html>
83
+ <html lang="en">
84
+ <head>
85
+ <meta charset="UTF-8">
86
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
87
+ <title>Passkey Registered - Inventory Management System</title>
88
+ <style>
89
+ body { font-family: Arial, sans-serif; line-height: 1.6; color: #333; }
90
+ .container { max-width: 600px; margin: 0 auto; padding: 20px; }
91
+ .header { background: #6f42c1; padding: 20px; text-align: center; border-radius: 8px 8px 0 0; color: white; }
92
+ .content { background: #ffffff; padding: 30px; border-radius: 0 0 8px 8px; }
93
+ .footer { text-align: center; padding: 20px; font-size: 12px; color: #666; }
94
+ </style>
95
+ </head>
96
+ <body>
97
+ <div class="container">
98
+ <div class="header">
99
+ <h1>🔑 New Passkey Registered</h1>
100
+ </div>
101
+ <div class="content">
102
+ <p>Hello <strong>${data.name}</strong>,</p>
103
+ <p>A new passkey has been registered for your Inventory Management System account:</p>
104
+ <div style="background: #f8f9fa; padding: 15px; border-radius: 5px; margin: 20px 0;">
105
+ <p><strong>Device:</strong> ${data.device_name}</p>
106
+ </div>
107
+ <p>You can now use this passkey to sign in to your account without a password.</p>
108
+ <p>If you didn't register this passkey, please secure your account immediately.</p>
109
+ </div>
110
+ <div class="footer">
111
+ <p>© 2024 Inventory Management System. All rights reserved.</p>
112
+ </div>
113
+ </div>
114
+ </body>
115
+ </html>
116
+ `;
117
+ exports.passkeyRegisteredTemplate = passkeyRegisteredTemplate;
@@ -0,0 +1 @@
1
+ export * from './auth';