This commit is contained in:
romantarkin 2025-07-22 16:11:08 +05:00
parent 1062116c8e
commit e0076fab43
31 changed files with 877 additions and 0 deletions

View File

@ -0,0 +1,49 @@
import { Permission } from '../models/index.js';
export default {
async create(req, res) {
try {
const permission = await Permission.create(req.body);
res.status(201).json(permission);
} catch (err) {
res.status(400).json({ error: err.message });
}
},
async getAll(req, res) {
try {
const permissions = await Permission.findAll();
res.json(permissions);
} catch (err) {
res.status(500).json({ error: err.message });
}
},
async getById(req, res) {
try {
const permission = await Permission.findByPk(req.params.id);
if (!permission) return res.status(404).json({ error: 'Permission not found' });
res.json(permission);
} catch (err) {
res.status(500).json({ error: err.message });
}
},
async update(req, res) {
try {
const permission = await Permission.findByPk(req.params.id);
if (!permission) return res.status(404).json({ error: 'Permission not found' });
await permission.update(req.body);
res.json(permission);
} catch (err) {
res.status(400).json({ error: err.message });
}
},
async delete(req, res) {
try {
const permission = await Permission.findByPk(req.params.id);
if (!permission) return res.status(404).json({ error: 'Permission not found' });
await permission.destroy();
res.json({ message: 'Permission deleted' });
} catch (err) {
res.status(500).json({ error: err.message });
}
},
};

View File

@ -0,0 +1,49 @@
import { Role, Permission } from '../models/index.js';
export default {
async create(req, res) {
try {
const role = await Role.create(req.body);
res.status(201).json(role);
} catch (err) {
res.status(400).json({ error: err.message });
}
},
async getAll(req, res) {
try {
const roles = await Role.findAll({ include: Permission });
res.json(roles);
} catch (err) {
res.status(500).json({ error: err.message });
}
},
async getById(req, res) {
try {
const role = await Role.findByPk(req.params.id, { include: Permission });
if (!role) return res.status(404).json({ error: 'Role not found' });
res.json(role);
} catch (err) {
res.status(500).json({ error: err.message });
}
},
async update(req, res) {
try {
const role = await Role.findByPk(req.params.id);
if (!role) return res.status(404).json({ error: 'Role not found' });
await role.update(req.body);
res.json(role);
} catch (err) {
res.status(400).json({ error: err.message });
}
},
async delete(req, res) {
try {
const role = await Role.findByPk(req.params.id);
if (!role) return res.status(404).json({ error: 'Role not found' });
await role.destroy();
res.json({ message: 'Role deleted' });
} catch (err) {
res.status(500).json({ error: err.message });
}
},
};

View File

@ -0,0 +1,49 @@
import { RolePermission, Role, Permission } from '../models/index.js';
export default {
async create(req, res) {
try {
const rolePermission = await RolePermission.create(req.body);
res.status(201).json(rolePermission);
} catch (err) {
res.status(400).json({ error: err.message });
}
},
async getAll(req, res) {
try {
const rolePermissions = await RolePermission.findAll({ include: [Role, Permission] });
res.json(rolePermissions);
} catch (err) {
res.status(500).json({ error: err.message });
}
},
async getById(req, res) {
try {
const rolePermission = await RolePermission.findByPk(req.params.id, { include: [Role, Permission] });
if (!rolePermission) return res.status(404).json({ error: 'RolePermission not found' });
res.json(rolePermission);
} catch (err) {
res.status(500).json({ error: err.message });
}
},
async update(req, res) {
try {
const rolePermission = await RolePermission.findByPk(req.params.id);
if (!rolePermission) return res.status(404).json({ error: 'RolePermission not found' });
await rolePermission.update(req.body);
res.json(rolePermission);
} catch (err) {
res.status(400).json({ error: err.message });
}
},
async delete(req, res) {
try {
const rolePermission = await RolePermission.findByPk(req.params.id);
if (!rolePermission) return res.status(404).json({ error: 'RolePermission not found' });
await rolePermission.destroy();
res.json({ message: 'RolePermission deleted' });
} catch (err) {
res.status(500).json({ error: err.message });
}
},
};

View File

@ -0,0 +1,49 @@
import { User, Role } from '../models/index.js';
export default {
async create(req, res) {
try {
const user = await User.create(req.body);
res.status(201).json(user);
} catch (err) {
res.status(400).json({ error: err.message });
}
},
async getAll(req, res) {
try {
const users = await User.findAll({ include: Role });
res.json(users);
} catch (err) {
res.status(500).json({ error: err.message });
}
},
async getById(req, res) {
try {
const user = await User.findByPk(req.params.id, { include: Role });
if (!user) return res.status(404).json({ error: 'User not found' });
res.json(user);
} catch (err) {
res.status(500).json({ error: err.message });
}
},
async update(req, res) {
try {
const user = await User.findByPk(req.params.id);
if (!user) return res.status(404).json({ error: 'User not found' });
await user.update(req.body);
res.json(user);
} catch (err) {
res.status(400).json({ error: err.message });
}
},
async delete(req, res) {
try {
const user = await User.findByPk(req.params.id);
if (!user) return res.status(404).json({ error: 'User not found' });
await user.destroy();
res.json({ message: 'User deleted' });
} catch (err) {
res.status(500).json({ error: err.message });
}
},
};

View File

@ -2,9 +2,11 @@ import dotenv from 'dotenv';
dotenv.config(); dotenv.config();
import express from 'express'; import express from 'express';
import { sequelize } from './models/index.js'; import { sequelize } from './models/index.js';
import routes from './routes/index.js';
const app = express(); const app = express();
app.use(express.json()); app.use(express.json());
app.use('/api/auth', routes);
app.get('/', (req, res) => { app.get('/', (req, res) => {
res.send('Auth Service is running'); res.send('Auth Service is running');

View File

@ -0,0 +1,14 @@
import { Router } from 'express';
import userRoutes from './user.js';
import roleRoutes from './role.js';
import permissionRoutes from './permission.js';
import rolePermissionRoutes from './rolePermission.js';
const router = Router();
router.use('/users', userRoutes);
router.use('/roles', roleRoutes);
router.use('/permissions', permissionRoutes);
router.use('/role-permissions', rolePermissionRoutes);
export default router;

View File

@ -0,0 +1,12 @@
import { Router } from 'express';
import permissionController from '../controllers/permissionController.js';
const router = Router();
router.post('/', permissionController.create);
router.get('/', permissionController.getAll);
router.get('/:id', permissionController.getById);
router.put('/:id', permissionController.update);
router.delete('/:id', permissionController.delete);
export default router;

View File

@ -0,0 +1,12 @@
import { Router } from 'express';
import roleController from '../controllers/roleController.js';
const router = Router();
router.post('/', roleController.create);
router.get('/', roleController.getAll);
router.get('/:id', roleController.getById);
router.put('/:id', roleController.update);
router.delete('/:id', roleController.delete);
export default router;

View File

@ -0,0 +1,12 @@
import { Router } from 'express';
import rolePermissionController from '../controllers/rolePermissionController.js';
const router = Router();
router.post('/', rolePermissionController.create);
router.get('/', rolePermissionController.getAll);
router.get('/:id', rolePermissionController.getById);
router.put('/:id', rolePermissionController.update);
router.delete('/:id', rolePermissionController.delete);
export default router;

View File

@ -0,0 +1,12 @@
import { Router } from 'express';
import userController from '../controllers/userController.js';
const router = Router();
router.post('/', userController.create);
router.get('/', userController.getAll);
router.get('/:id', userController.getById);
router.put('/:id', userController.update);
router.delete('/:id', userController.delete);
export default router;

View File

View File

View File

@ -0,0 +1,104 @@
# ------------------------------------------------------------
# project.ru
# ------------------------------------------------------------
map $scheme $hsts_header {
https "max-age=63072000; preload";
}
server {
set $forward_scheme http;
set $server "client";
set $port 80;
listen 80;
listen [::]:80;
server_name project.ru;
http2 off;
access_log /data/logs/proxy-host-1_access.log proxy;
error_log /data/logs/proxy-host-1_error.log warn;
location /api/auth {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Scheme $scheme;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://auth-service:3000;
}
location /api/mail {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Scheme $scheme;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://mail-service:3000;
}
location / {
# Proxy!
include conf.d/include/proxy.conf;
}
# Custom
include /data/nginx/custom/server_proxy[.]conf;
}

View File

@ -0,0 +1,49 @@
import { Campaign, EmailTemplateVersion, MailingGroup } from '../models/index.js';
export default {
async create(req, res) {
try {
const campaign = await Campaign.create(req.body);
res.status(201).json(campaign);
} catch (err) {
res.status(400).json({ error: err.message });
}
},
async getAll(req, res) {
try {
const campaigns = await Campaign.findAll({ include: [EmailTemplateVersion, MailingGroup] });
res.json(campaigns);
} catch (err) {
res.status(500).json({ error: err.message });
}
},
async getById(req, res) {
try {
const campaign = await Campaign.findByPk(req.params.id, { include: [EmailTemplateVersion, MailingGroup] });
if (!campaign) return res.status(404).json({ error: 'Campaign not found' });
res.json(campaign);
} catch (err) {
res.status(500).json({ error: err.message });
}
},
async update(req, res) {
try {
const campaign = await Campaign.findByPk(req.params.id);
if (!campaign) return res.status(404).json({ error: 'Campaign not found' });
await campaign.update(req.body);
res.json(campaign);
} catch (err) {
res.status(400).json({ error: err.message });
}
},
async delete(req, res) {
try {
const campaign = await Campaign.findByPk(req.params.id);
if (!campaign) return res.status(404).json({ error: 'Campaign not found' });
await campaign.destroy();
res.json({ message: 'Campaign deleted' });
} catch (err) {
res.status(500).json({ error: err.message });
}
},
};

View File

@ -0,0 +1,49 @@
import { DeliveryLog, Campaign, Subscriber } from '../models/index.js';
export default {
async create(req, res) {
try {
const log = await DeliveryLog.create(req.body);
res.status(201).json(log);
} catch (err) {
res.status(400).json({ error: err.message });
}
},
async getAll(req, res) {
try {
const logs = await DeliveryLog.findAll({ include: [Campaign, Subscriber] });
res.json(logs);
} catch (err) {
res.status(500).json({ error: err.message });
}
},
async getById(req, res) {
try {
const log = await DeliveryLog.findByPk(req.params.id, { include: [Campaign, Subscriber] });
if (!log) return res.status(404).json({ error: 'DeliveryLog not found' });
res.json(log);
} catch (err) {
res.status(500).json({ error: err.message });
}
},
async update(req, res) {
try {
const log = await DeliveryLog.findByPk(req.params.id);
if (!log) return res.status(404).json({ error: 'DeliveryLog not found' });
await log.update(req.body);
res.json(log);
} catch (err) {
res.status(400).json({ error: err.message });
}
},
async delete(req, res) {
try {
const log = await DeliveryLog.findByPk(req.params.id);
if (!log) return res.status(404).json({ error: 'DeliveryLog not found' });
await log.destroy();
res.json({ message: 'DeliveryLog deleted' });
} catch (err) {
res.status(500).json({ error: err.message });
}
},
};

View File

@ -0,0 +1,49 @@
import { EmailTemplate, EmailTemplateVersion } from '../models/index.js';
export default {
async create(req, res) {
try {
const template = await EmailTemplate.create(req.body);
res.status(201).json(template);
} catch (err) {
res.status(400).json({ error: err.message });
}
},
async getAll(req, res) {
try {
const templates = await EmailTemplate.findAll({ include: EmailTemplateVersion });
res.json(templates);
} catch (err) {
res.status(500).json({ error: err.message });
}
},
async getById(req, res) {
try {
const template = await EmailTemplate.findByPk(req.params.id, { include: EmailTemplateVersion });
if (!template) return res.status(404).json({ error: 'EmailTemplate not found' });
res.json(template);
} catch (err) {
res.status(500).json({ error: err.message });
}
},
async update(req, res) {
try {
const template = await EmailTemplate.findByPk(req.params.id);
if (!template) return res.status(404).json({ error: 'EmailTemplate not found' });
await template.update(req.body);
res.json(template);
} catch (err) {
res.status(400).json({ error: err.message });
}
},
async delete(req, res) {
try {
const template = await EmailTemplate.findByPk(req.params.id);
if (!template) return res.status(404).json({ error: 'EmailTemplate not found' });
await template.destroy();
res.json({ message: 'EmailTemplate deleted' });
} catch (err) {
res.status(500).json({ error: err.message });
}
},
};

View File

@ -0,0 +1,49 @@
import { EmailTemplateVersion, EmailTemplate } from '../models/index.js';
export default {
async create(req, res) {
try {
const version = await EmailTemplateVersion.create(req.body);
res.status(201).json(version);
} catch (err) {
res.status(400).json({ error: err.message });
}
},
async getAll(req, res) {
try {
const versions = await EmailTemplateVersion.findAll({ include: EmailTemplate });
res.json(versions);
} catch (err) {
res.status(500).json({ error: err.message });
}
},
async getById(req, res) {
try {
const version = await EmailTemplateVersion.findByPk(req.params.id, { include: EmailTemplate });
if (!version) return res.status(404).json({ error: 'EmailTemplateVersion not found' });
res.json(version);
} catch (err) {
res.status(500).json({ error: err.message });
}
},
async update(req, res) {
try {
const version = await EmailTemplateVersion.findByPk(req.params.id);
if (!version) return res.status(404).json({ error: 'EmailTemplateVersion not found' });
await version.update(req.body);
res.json(version);
} catch (err) {
res.status(400).json({ error: err.message });
}
},
async delete(req, res) {
try {
const version = await EmailTemplateVersion.findByPk(req.params.id);
if (!version) return res.status(404).json({ error: 'EmailTemplateVersion not found' });
await version.destroy();
res.json({ message: 'EmailTemplateVersion deleted' });
} catch (err) {
res.status(500).json({ error: err.message });
}
},
};

View File

@ -0,0 +1,49 @@
import { GroupSubscriber, MailingGroup, Subscriber } from '../models/index.js';
export default {
async create(req, res) {
try {
const groupSubscriber = await GroupSubscriber.create(req.body);
res.status(201).json(groupSubscriber);
} catch (err) {
res.status(400).json({ error: err.message });
}
},
async getAll(req, res) {
try {
const groupSubscribers = await GroupSubscriber.findAll({ include: [MailingGroup, Subscriber] });
res.json(groupSubscribers);
} catch (err) {
res.status(500).json({ error: err.message });
}
},
async getById(req, res) {
try {
const groupSubscriber = await GroupSubscriber.findByPk(req.params.id, { include: [MailingGroup, Subscriber] });
if (!groupSubscriber) return res.status(404).json({ error: 'GroupSubscriber not found' });
res.json(groupSubscriber);
} catch (err) {
res.status(500).json({ error: err.message });
}
},
async update(req, res) {
try {
const groupSubscriber = await GroupSubscriber.findByPk(req.params.id);
if (!groupSubscriber) return res.status(404).json({ error: 'GroupSubscriber not found' });
await groupSubscriber.update(req.body);
res.json(groupSubscriber);
} catch (err) {
res.status(400).json({ error: err.message });
}
},
async delete(req, res) {
try {
const groupSubscriber = await GroupSubscriber.findByPk(req.params.id);
if (!groupSubscriber) return res.status(404).json({ error: 'GroupSubscriber not found' });
await groupSubscriber.destroy();
res.json({ message: 'GroupSubscriber deleted' });
} catch (err) {
res.status(500).json({ error: err.message });
}
},
};

View File

@ -0,0 +1,49 @@
import { MailingGroup, SmtpServer } from '../models/index.js';
export default {
async create(req, res) {
try {
const group = await MailingGroup.create(req.body);
res.status(201).json(group);
} catch (err) {
res.status(400).json({ error: err.message });
}
},
async getAll(req, res) {
try {
const groups = await MailingGroup.findAll({ include: SmtpServer });
res.json(groups);
} catch (err) {
res.status(500).json({ error: err.message });
}
},
async getById(req, res) {
try {
const group = await MailingGroup.findByPk(req.params.id, { include: SmtpServer });
if (!group) return res.status(404).json({ error: 'MailingGroup not found' });
res.json(group);
} catch (err) {
res.status(500).json({ error: err.message });
}
},
async update(req, res) {
try {
const group = await MailingGroup.findByPk(req.params.id);
if (!group) return res.status(404).json({ error: 'MailingGroup not found' });
await group.update(req.body);
res.json(group);
} catch (err) {
res.status(400).json({ error: err.message });
}
},
async delete(req, res) {
try {
const group = await MailingGroup.findByPk(req.params.id);
if (!group) return res.status(404).json({ error: 'MailingGroup not found' });
await group.destroy();
res.json({ message: 'MailingGroup deleted' });
} catch (err) {
res.status(500).json({ error: err.message });
}
},
};

View File

@ -0,0 +1,49 @@
import { SmtpServer, MailingGroup } from '../models/index.js';
export default {
async create(req, res) {
try {
const smtp = await SmtpServer.create(req.body);
res.status(201).json(smtp);
} catch (err) {
res.status(400).json({ error: err.message });
}
},
async getAll(req, res) {
try {
const servers = await SmtpServer.findAll({ include: MailingGroup });
res.json(servers);
} catch (err) {
res.status(500).json({ error: err.message });
}
},
async getById(req, res) {
try {
const smtp = await SmtpServer.findByPk(req.params.id, { include: MailingGroup });
if (!smtp) return res.status(404).json({ error: 'SmtpServer not found' });
res.json(smtp);
} catch (err) {
res.status(500).json({ error: err.message });
}
},
async update(req, res) {
try {
const smtp = await SmtpServer.findByPk(req.params.id);
if (!smtp) return res.status(404).json({ error: 'SmtpServer not found' });
await smtp.update(req.body);
res.json(smtp);
} catch (err) {
res.status(400).json({ error: err.message });
}
},
async delete(req, res) {
try {
const smtp = await SmtpServer.findByPk(req.params.id);
if (!smtp) return res.status(404).json({ error: 'SmtpServer not found' });
await smtp.destroy();
res.json({ message: 'SmtpServer deleted' });
} catch (err) {
res.status(500).json({ error: err.message });
}
},
};

View File

@ -0,0 +1,49 @@
import { Subscriber } from '../models/index.js';
export default {
async create(req, res) {
try {
const subscriber = await Subscriber.create(req.body);
res.status(201).json(subscriber);
} catch (err) {
res.status(400).json({ error: err.message });
}
},
async getAll(req, res) {
try {
const subscribers = await Subscriber.findAll();
res.json(subscribers);
} catch (err) {
res.status(500).json({ error: err.message });
}
},
async getById(req, res) {
try {
const subscriber = await Subscriber.findByPk(req.params.id);
if (!subscriber) return res.status(404).json({ error: 'Subscriber not found' });
res.json(subscriber);
} catch (err) {
res.status(500).json({ error: err.message });
}
},
async update(req, res) {
try {
const subscriber = await Subscriber.findByPk(req.params.id);
if (!subscriber) return res.status(404).json({ error: 'Subscriber not found' });
await subscriber.update(req.body);
res.json(subscriber);
} catch (err) {
res.status(400).json({ error: err.message });
}
},
async delete(req, res) {
try {
const subscriber = await Subscriber.findByPk(req.params.id);
if (!subscriber) return res.status(404).json({ error: 'Subscriber not found' });
await subscriber.destroy();
res.json({ message: 'Subscriber deleted' });
} catch (err) {
res.status(500).json({ error: err.message });
}
},
};

View File

@ -2,6 +2,7 @@ import dotenv from 'dotenv';
dotenv.config(); dotenv.config();
import express from 'express'; import express from 'express';
import { sequelize } from './models/index.js'; import { sequelize } from './models/index.js';
import routes from './routes/index.js';
const app = express(); const app = express();
app.use(express.json()); app.use(express.json());
@ -10,6 +11,8 @@ app.get('/', (req, res) => {
res.send('Mail Service is running'); res.send('Mail Service is running');
}); });
app.use('/api/mail', routes);
(async () => { (async () => {
try { try {
await sequelize.authenticate(); await sequelize.authenticate();

View File

@ -0,0 +1,12 @@
import { Router } from 'express';
import campaignController from '../controllers/campaignController.js';
const router = Router();
router.post('/', campaignController.create);
router.get('/', campaignController.getAll);
router.get('/:id', campaignController.getById);
router.put('/:id', campaignController.update);
router.delete('/:id', campaignController.delete);
export default router;

View File

@ -0,0 +1,12 @@
import { Router } from 'express';
import deliveryLogController from '../controllers/deliveryLogController.js';
const router = Router();
router.post('/', deliveryLogController.create);
router.get('/', deliveryLogController.getAll);
router.get('/:id', deliveryLogController.getById);
router.put('/:id', deliveryLogController.update);
router.delete('/:id', deliveryLogController.delete);
export default router;

View File

@ -0,0 +1,12 @@
import { Router } from 'express';
import emailTemplateController from '../controllers/emailTemplateController.js';
const router = Router();
router.post('/', emailTemplateController.create);
router.get('/', emailTemplateController.getAll);
router.get('/:id', emailTemplateController.getById);
router.put('/:id', emailTemplateController.update);
router.delete('/:id', emailTemplateController.delete);
export default router;

View File

@ -0,0 +1,12 @@
import { Router } from 'express';
import emailTemplateVersionController from '../controllers/emailTemplateVersionController.js';
const router = Router();
router.post('/', emailTemplateVersionController.create);
router.get('/', emailTemplateVersionController.getAll);
router.get('/:id', emailTemplateVersionController.getById);
router.put('/:id', emailTemplateVersionController.update);
router.delete('/:id', emailTemplateVersionController.delete);
export default router;

View File

@ -0,0 +1,12 @@
import { Router } from 'express';
import groupSubscriberController from '../controllers/groupSubscriberController.js';
const router = Router();
router.post('/', groupSubscriberController.create);
router.get('/', groupSubscriberController.getAll);
router.get('/:id', groupSubscriberController.getById);
router.put('/:id', groupSubscriberController.update);
router.delete('/:id', groupSubscriberController.delete);
export default router;

View File

@ -0,0 +1,22 @@
import { Router } from 'express';
import subscriberRoutes from './subscriber.js';
import mailingGroupRoutes from './mailingGroup.js';
import groupSubscriberRoutes from './groupSubscriber.js';
import emailTemplateRoutes from './emailTemplate.js';
import emailTemplateVersionRoutes from './emailTemplateVersion.js';
import campaignRoutes from './campaign.js';
import deliveryLogRoutes from './deliveryLog.js';
import smtpServerRoutes from './smtpServer.js';
const router = Router();
router.use('/subscribers', subscriberRoutes);
router.use('/mailing-groups', mailingGroupRoutes);
router.use('/group-subscribers', groupSubscriberRoutes);
router.use('/email-templates', emailTemplateRoutes);
router.use('/email-template-versions', emailTemplateVersionRoutes);
router.use('/campaigns', campaignRoutes);
router.use('/delivery-logs', deliveryLogRoutes);
router.use('/smtp-servers', smtpServerRoutes);
export default router;

View File

@ -0,0 +1,12 @@
import { Router } from 'express';
import mailingGroupController from '../controllers/mailingGroupController.js';
const router = Router();
router.post('/', mailingGroupController.create);
router.get('/', mailingGroupController.getAll);
router.get('/:id', mailingGroupController.getById);
router.put('/:id', mailingGroupController.update);
router.delete('/:id', mailingGroupController.delete);
export default router;

View File

@ -0,0 +1,12 @@
import { Router } from 'express';
import smtpServerController from '../controllers/smtpServerController.js';
const router = Router();
router.post('/', smtpServerController.create);
router.get('/', smtpServerController.getAll);
router.get('/:id', smtpServerController.getById);
router.put('/:id', smtpServerController.update);
router.delete('/:id', smtpServerController.delete);
export default router;

View File

@ -0,0 +1,12 @@
import { Router } from 'express';
import subscriberController from '../controllers/subscriberController.js';
const router = Router();
router.post('/', subscriberController.create);
router.get('/', subscriberController.getAll);
router.get('/:id', subscriberController.getById);
router.put('/:id', subscriberController.update);
router.delete('/:id', subscriberController.delete);
export default router;