Skip to content
This repository was archived by the owner on Jul 20, 2026. It is now read-only.

Commit d71bd65

Browse files
committed
helo
1 parent b5617d5 commit d71bd65

97 files changed

Lines changed: 5337 additions & 247 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
-- V2_0_3__adding_admin.sql
2+
3+
INSERT INTO account (first_name, last_name, email, password_hash, role, phone)
4+
VALUES ('Admin', 'Admin', 'admin@test.com', '$2b$10$e.CGNoC2nJ4cyiHfkqwAbez9b166sURtLFccIbEQspQhQrUxEtrme', 'admin', '0011223344'); -- 123456 for password

backend/dist/app.js

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
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+
const express_1 = __importDefault(require("express"));
7+
const cors_1 = __importDefault(require("cors"));
8+
const helmet_1 = __importDefault(require("helmet"));
9+
const morgan_1 = __importDefault(require("morgan"));
10+
const routes_1 = __importDefault(require("./routes"));
11+
const error_middleware_1 = require("./middlewares/error.middleware");
12+
const mongo_1 = require("./config/mongo");
13+
const postgres_1 = require("./config/postgres");
14+
const env_1 = require("./config/env");
15+
class App {
16+
app;
17+
constructor() {
18+
this.app = (0, express_1.default)();
19+
this.initializeMiddlewares();
20+
this.initializeRoutes();
21+
this.initializeErrorHandling();
22+
}
23+
initializeMiddlewares() {
24+
const allowedOrigins = new Set(env_1.env.CORS_ORIGINS
25+
.split(',')
26+
.map(origin => origin.trim())
27+
.filter(Boolean));
28+
this.app.use((0, helmet_1.default)());
29+
this.app.use((0, cors_1.default)({
30+
origin: (origin, callback) => {
31+
if (!origin || allowedOrigins.has(origin)) {
32+
callback(null, true);
33+
}
34+
else {
35+
callback(new error_middleware_1.AppError('Origin not allowed', 403));
36+
}
37+
},
38+
methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'],
39+
allowedHeaders: ['Content-Type', 'Authorization'],
40+
credentials: true,
41+
}));
42+
this.app.use(express_1.default.json());
43+
this.app.use(express_1.default.urlencoded({ extended: true }));
44+
this.app.use((0, morgan_1.default)('combined'));
45+
}
46+
initializeRoutes() {
47+
this.app.use('/api', routes_1.default);
48+
this.app.get('/api/health', (req, res) => {
49+
res.json({ status: 'OK', timestamp: new Date() });
50+
});
51+
}
52+
initializeErrorHandling() {
53+
this.app.use(error_middleware_1.errorMiddleware);
54+
}
55+
async init() {
56+
try {
57+
await Promise.all([
58+
// Initialize PostgreSQL
59+
postgres_1.pgPool.query('SELECT 1'),
60+
// Initialize MongoDB
61+
(0, mongo_1.connectMongoDB)(),
62+
]);
63+
}
64+
catch (error) {
65+
console.error('Database initialization failed:', error);
66+
process.exit(1);
67+
}
68+
}
69+
getApp() {
70+
return this.app;
71+
}
72+
}
73+
exports.default = new App();

backend/dist/config/env.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
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.env = void 0;
7+
const dotenv_1 = __importDefault(require("dotenv"));
8+
dotenv_1.default.config();
9+
exports.env = {
10+
// General
11+
NODE_ENV: process.env.NODE_ENV || 'development',
12+
JWT_SECRET: process.env.JWT_SECRET || 'your-secret-key',
13+
JWT_EXPIRES_IN: process.env.JWT_EXPIRES_IN || '7d',
14+
CORS_ORIGINS: process.env.CORS_ORIGINS || '*',
15+
// PostgreSQL
16+
PG_HOST: process.env.POSTGRES_HOST || 'localhost',
17+
PG_PORT: Number(process.env.POSTGRES_PORT) || 5432,
18+
PG_DB: process.env.POSTGRES_DB || '',
19+
PG_USER: process.env.POSTGRES_APP_USER || '',
20+
PG_PASSWORD: process.env.POSTGRES_APP_PASSWORD || '',
21+
// MongoDB
22+
MONGO_URI: process.env.MONGO_URI || '',
23+
};

backend/dist/config/mongo.js

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
"use strict";
2+
Object.defineProperty(exports, "__esModule", { value: true });
3+
exports.getCollection = exports.getDB = exports.closeMongoDB = exports.connectMongoDB = void 0;
4+
const mongodb_1 = require("mongodb");
5+
const env_1 = require("./env");
6+
let client = null;
7+
let db = null;
8+
const options = {
9+
maxPoolSize: 20,
10+
minPoolSize: 2,
11+
maxIdleTimeMS: 30000,
12+
connectTimeoutMS: 5000,
13+
socketTimeoutMS: 45000,
14+
};
15+
const connectMongoDB = async () => {
16+
try {
17+
const uri = env_1.env.MONGO_URI;
18+
client = new mongodb_1.MongoClient(uri, options);
19+
await client.connect();
20+
db = client.db();
21+
console.log('Connected to MongoDB');
22+
return db;
23+
}
24+
catch (error) {
25+
console.error('Error connecting to MongoDB:', error);
26+
throw error;
27+
}
28+
};
29+
exports.connectMongoDB = connectMongoDB;
30+
const closeMongoDB = async () => {
31+
if (client) {
32+
await client.close();
33+
console.log('MongoDB connection closed');
34+
}
35+
};
36+
exports.closeMongoDB = closeMongoDB;
37+
const getDB = () => {
38+
if (!db) {
39+
throw new Error('MongoDB not connected. Call connectMongoDB first.');
40+
}
41+
return db;
42+
};
43+
exports.getDB = getDB;
44+
const getCollection = (name) => {
45+
return (0, exports.getDB)().collection(name);
46+
};
47+
exports.getCollection = getCollection;

backend/dist/config/postgres.js

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
"use strict";
2+
Object.defineProperty(exports, "__esModule", { value: true });
3+
exports.pgPool = void 0;
4+
const pg_1 = require("pg");
5+
const env_1 = require("./env");
6+
exports.pgPool = new pg_1.Pool({
7+
host: env_1.env.PG_HOST,
8+
port: env_1.env.PG_PORT,
9+
database: env_1.env.PG_DB,
10+
user: env_1.env.PG_USER,
11+
password: env_1.env.PG_PASSWORD,
12+
max: 20,
13+
idleTimeoutMillis: 30000,
14+
connectionTimeoutMillis: 2000,
15+
});
16+
/*export const connectPostgres = async (): Promise<void> => {
17+
const client = await pgPool.connect();
18+
console.log('Connected to PostgreSQL');
19+
client.release();
20+
};
21+
22+
export default pgPool;*/
23+
exports.pgPool.connect((err, client, release) => {
24+
if (err) {
25+
console.error('Error acquiring PostgreSQL client:', err.stack);
26+
}
27+
else {
28+
console.log('Connected to PostgreSQL');
29+
release();
30+
}
31+
});
32+
exports.pgPool.on('error', (err) => {
33+
console.error('Unexpected error on idle PostgreSQL client:', err);
34+
});

backend/dist/container.js

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
"use strict";
2+
/**
3+
* container.ts
4+
*/
5+
Object.defineProperty(exports, "__esModule", { value: true });
6+
exports.menuController = exports.menuService = exports.menuRepository = exports.productController = exports.productFacade = exports.productService = exports.productRepository = exports.optionController = exports.customizationController = exports.customizationFacade = exports.customizationService = exports.customizationRepository = exports.optionService = exports.optionRepository = exports.supplierController = exports.supplierService = exports.supplierRepository = exports.categoryController = exports.categoryService = exports.categoryRepository = exports.accountController = exports.accountService = exports.accountRepository = void 0;
7+
const account_repository_1 = require("./repositories/account.repository");
8+
const account_service_1 = require("./services/account.service");
9+
const account_controller_1 = require("./controllers/account.controller");
10+
const category_repository_1 = require("./repositories/category.repository");
11+
const category_service_1 = require("./services/category.service");
12+
const category_controller_1 = require("./controllers/category.controller");
13+
const supplier_repository_1 = require("./repositories/supplier.repository");
14+
const supplier_service_1 = require("./services/supplier.service");
15+
const supplier_controller_1 = require("./controllers/supplier.controller");
16+
const customization_repository_1 = require("./repositories/customization.repository");
17+
const customization_service_1 = require("./services/customization.service");
18+
const customization_controller_1 = require("./controllers/customization.controller");
19+
const customization_facade_1 = require("./services/customization.facade");
20+
const option_repository_1 = require("./repositories/option.repository");
21+
const option_service_1 = require("./services/option.service");
22+
const option_controller_1 = require("./controllers/option.controller");
23+
const product_repository_1 = require("./repositories/product.repository");
24+
const product_service_1 = require("./services/product.service");
25+
const product_facade_1 = require("./services/product.facade");
26+
const product_controller_1 = require("./controllers/product.controller");
27+
const menu_repository_1 = require("./repositories/menu.repository");
28+
const menu_service_1 = require("./services/menu.service");
29+
const menu_controller_1 = require("./controllers/menu.controller");
30+
exports.accountRepository = new account_repository_1.AccountRepository();
31+
exports.accountService = new account_service_1.AccountService(exports.accountRepository);
32+
exports.accountController = new account_controller_1.AccountController(exports.accountService);
33+
exports.categoryRepository = new category_repository_1.CategoryRepository();
34+
exports.categoryService = new category_service_1.CategoryService(exports.categoryRepository);
35+
exports.categoryController = new category_controller_1.CategoryController(exports.categoryService);
36+
exports.supplierRepository = new supplier_repository_1.SupplierRepository();
37+
exports.supplierService = new supplier_service_1.SupplierService(exports.supplierRepository);
38+
exports.supplierController = new supplier_controller_1.SupplierController(exports.supplierService);
39+
exports.optionRepository = new option_repository_1.CustomizationOptionRepository();
40+
exports.optionService = new option_service_1.OptionService(exports.optionRepository);
41+
exports.customizationRepository = new customization_repository_1.CustomizationSlotRepository();
42+
exports.customizationService = new customization_service_1.CustomizationService(exports.customizationRepository);
43+
exports.customizationFacade = new customization_facade_1.CustomizationFacade(exports.customizationService, exports.optionService);
44+
exports.customizationController = new customization_controller_1.CustomizationController(exports.customizationService, exports.customizationFacade);
45+
exports.optionController = new option_controller_1.OptionController(exports.optionService, exports.customizationFacade);
46+
exports.productRepository = new product_repository_1.ProductRepository();
47+
exports.productService = new product_service_1.ProductService(exports.productRepository);
48+
exports.productFacade = new product_facade_1.ProductFacade(exports.productService, exports.customizationFacade, exports.categoryService, exports.supplierService);
49+
exports.productController = new product_controller_1.ProductController(exports.productService, exports.productFacade);
50+
exports.menuRepository = new menu_repository_1.MenuRepository();
51+
exports.menuService = new menu_service_1.MenuService(exports.menuRepository, exports.productFacade);
52+
exports.menuController = new menu_controller_1.MenuController(exports.menuService);
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
"use strict";
2+
/**
3+
* account.controller.ts
4+
*/
5+
Object.defineProperty(exports, "__esModule", { value: true });
6+
exports.AccountController = void 0;
7+
const base_controller_1 = require("./base.controller");
8+
const account_model_1 = require("../models/account.model");
9+
class AccountController extends base_controller_1.BaseController {
10+
service;
11+
constructor(service) {
12+
super();
13+
this.service = service;
14+
}
15+
register = async (req, res, next) => {
16+
try {
17+
const result = await this.service.register(req.body);
18+
this.sendResponse(res, 201 /* HttpStatus.CREATED */, 'Account created succesfully', result);
19+
}
20+
catch (error) {
21+
next(error);
22+
}
23+
};
24+
login = async (req, res, next) => {
25+
try {
26+
const { email, password } = req.body;
27+
const result = await this.service.login(email, password);
28+
this.sendResponse(res, 200 /* HttpStatus.OK */, 'Login successful', result);
29+
}
30+
catch (error) {
31+
next(error);
32+
}
33+
};
34+
getProfile = async (req, res, next) => {
35+
try {
36+
const userId = req.user.userId;
37+
const result = await this.service.getById(userId);
38+
this.sendResponse(res, 200 /* HttpStatus.OK */, 'Account retrieved successfully', result);
39+
}
40+
catch (error) {
41+
next(error);
42+
}
43+
};
44+
getAccountById = async (req, res, next) => {
45+
try {
46+
const id = parseInt(req.params.id);
47+
const result = await this.service.getById(id);
48+
this.sendResponse(res, 200 /* HttpStatus.OK */, 'Account retrieved successfully', result);
49+
}
50+
catch (error) {
51+
next(error);
52+
}
53+
};
54+
getAllAccounts = async (req, res, next) => {
55+
try {
56+
if (req.user.role !== account_model_1.Role.Admin) {
57+
this.sendResponse(res, 403 /* HttpStatus.FORBIDDEN */, 'Permission denied');
58+
return;
59+
}
60+
const { role } = req.query;
61+
if (role !== undefined) {
62+
if (typeof role !== 'string' || !Object.values(account_model_1.Role).includes(role)) {
63+
this.sendResponse(res, 400 /* HttpStatus.BAD_REQUEST */, 'Invalid role filter');
64+
return;
65+
}
66+
}
67+
const result = await this.service.getAll(role);
68+
this.sendResponse(res, 200 /* HttpStatus.OK */, 'Accounts retrieved successfully', result);
69+
}
70+
catch (error) {
71+
next(error);
72+
}
73+
};
74+
updateAccount = async (req, res, next) => {
75+
try {
76+
const id = parseInt(req.params.id);
77+
const userId = req.user?.userId;
78+
if (!userId) {
79+
res.status(401 /* HttpStatus.UNAUTHORIZED */).json({ message: 'User not authenticated' });
80+
return;
81+
}
82+
const result = await this.service.update(id, req.body, userId);
83+
this.sendResponse(res, 200 /* HttpStatus.OK */, 'Account updated successfully', result);
84+
}
85+
catch (error) {
86+
next(error);
87+
}
88+
};
89+
deleteAccount = async (req, res, next) => {
90+
try {
91+
const id = parseInt(req.params.id);
92+
const userId = req.user?.userId;
93+
if (!userId) {
94+
res.status(401 /* HttpStatus.UNAUTHORIZED */).json({ message: 'User not authenticated' });
95+
return;
96+
}
97+
await this.service.delete(id, userId);
98+
this.sendResponse(res, 200 /* HttpStatus.OK */, 'Account deleted successfully');
99+
}
100+
catch (error) {
101+
next(error);
102+
}
103+
};
104+
}
105+
exports.AccountController = AccountController;
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
"use strict";
2+
Object.defineProperty(exports, "__esModule", { value: true });
3+
exports.BaseController = void 0;
4+
class BaseController {
5+
sendResponse(res, status = 200 /* HttpStatus.OK */, message = "OK", data = null) {
6+
const response = {
7+
success: status < 400 /* HttpStatus.BAD_REQUEST */,
8+
message,
9+
data
10+
};
11+
if (Array.isArray(data)) {
12+
response.count = data.length;
13+
}
14+
res.status(status).json(response);
15+
}
16+
}
17+
exports.BaseController = BaseController;

0 commit comments

Comments
 (0)