From e0076fab43a2adc7156e75f0d627818d0e3d7a59 Mon Sep 17 00:00:00 2001 From: romantarkin Date: Tue, 22 Jul 2025 16:11:08 +0500 Subject: [PATCH] api --- .../src/controllers/permissionController.js | 49 +++++++++ .../src/controllers/roleController.js | 49 +++++++++ .../controllers/rolePermissionController.js | 49 +++++++++ .../src/controllers/userController.js | 49 +++++++++ auth-service/src/index.js | 2 + auth-service/src/routes/index.js | 14 +++ auth-service/src/routes/permission.js | 12 ++ auth-service/src/routes/role.js | 12 ++ auth-service/src/routes/rolePermission.js | 12 ++ auth-service/src/routes/user.js | 12 ++ data/logs/proxy-host-1_access.log | 0 data/logs/proxy-host-1_error.log | 0 data/nginx/proxy_host/1.conf | 104 ++++++++++++++++++ .../src/controllers/campaignController.js | 49 +++++++++ .../src/controllers/deliveryLogController.js | 49 +++++++++ .../controllers/emailTemplateController.js | 49 +++++++++ .../emailTemplateVersionController.js | 49 +++++++++ .../controllers/groupSubscriberController.js | 49 +++++++++ .../src/controllers/mailingGroupController.js | 49 +++++++++ .../src/controllers/smtpServerController.js | 49 +++++++++ .../src/controllers/subscriberController.js | 49 +++++++++ mail-service/src/index.js | 3 + mail-service/src/routes/campaign.js | 12 ++ mail-service/src/routes/deliveryLog.js | 12 ++ mail-service/src/routes/emailTemplate.js | 12 ++ .../src/routes/emailTemplateVersion.js | 12 ++ mail-service/src/routes/groupSubscriber.js | 12 ++ mail-service/src/routes/index.js | 22 ++++ mail-service/src/routes/mailingGroup.js | 12 ++ mail-service/src/routes/smtpServer.js | 12 ++ mail-service/src/routes/subscriber.js | 12 ++ 31 files changed, 877 insertions(+) create mode 100644 auth-service/src/controllers/permissionController.js create mode 100644 auth-service/src/controllers/roleController.js create mode 100644 auth-service/src/controllers/rolePermissionController.js create mode 100644 auth-service/src/controllers/userController.js create mode 100644 auth-service/src/routes/index.js create mode 100644 auth-service/src/routes/permission.js create mode 100644 auth-service/src/routes/role.js create mode 100644 auth-service/src/routes/rolePermission.js create mode 100644 auth-service/src/routes/user.js create mode 100644 data/logs/proxy-host-1_access.log create mode 100644 data/logs/proxy-host-1_error.log create mode 100644 data/nginx/proxy_host/1.conf create mode 100644 mail-service/src/controllers/campaignController.js create mode 100644 mail-service/src/controllers/deliveryLogController.js create mode 100644 mail-service/src/controllers/emailTemplateController.js create mode 100644 mail-service/src/controllers/emailTemplateVersionController.js create mode 100644 mail-service/src/controllers/groupSubscriberController.js create mode 100644 mail-service/src/controllers/mailingGroupController.js create mode 100644 mail-service/src/controllers/smtpServerController.js create mode 100644 mail-service/src/controllers/subscriberController.js create mode 100644 mail-service/src/routes/campaign.js create mode 100644 mail-service/src/routes/deliveryLog.js create mode 100644 mail-service/src/routes/emailTemplate.js create mode 100644 mail-service/src/routes/emailTemplateVersion.js create mode 100644 mail-service/src/routes/groupSubscriber.js create mode 100644 mail-service/src/routes/index.js create mode 100644 mail-service/src/routes/mailingGroup.js create mode 100644 mail-service/src/routes/smtpServer.js create mode 100644 mail-service/src/routes/subscriber.js diff --git a/auth-service/src/controllers/permissionController.js b/auth-service/src/controllers/permissionController.js new file mode 100644 index 0000000..8a537ab --- /dev/null +++ b/auth-service/src/controllers/permissionController.js @@ -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 }); + } + }, +}; \ No newline at end of file diff --git a/auth-service/src/controllers/roleController.js b/auth-service/src/controllers/roleController.js new file mode 100644 index 0000000..394b745 --- /dev/null +++ b/auth-service/src/controllers/roleController.js @@ -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 }); + } + }, +}; \ No newline at end of file diff --git a/auth-service/src/controllers/rolePermissionController.js b/auth-service/src/controllers/rolePermissionController.js new file mode 100644 index 0000000..316ce5f --- /dev/null +++ b/auth-service/src/controllers/rolePermissionController.js @@ -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 }); + } + }, +}; \ No newline at end of file diff --git a/auth-service/src/controllers/userController.js b/auth-service/src/controllers/userController.js new file mode 100644 index 0000000..89d630a --- /dev/null +++ b/auth-service/src/controllers/userController.js @@ -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 }); + } + }, +}; \ No newline at end of file diff --git a/auth-service/src/index.js b/auth-service/src/index.js index 7f470ad..5359ca6 100644 --- a/auth-service/src/index.js +++ b/auth-service/src/index.js @@ -2,9 +2,11 @@ import dotenv from 'dotenv'; dotenv.config(); import express from 'express'; import { sequelize } from './models/index.js'; +import routes from './routes/index.js'; const app = express(); app.use(express.json()); +app.use('/api/auth', routes); app.get('/', (req, res) => { res.send('Auth Service is running'); diff --git a/auth-service/src/routes/index.js b/auth-service/src/routes/index.js new file mode 100644 index 0000000..9a5e3c0 --- /dev/null +++ b/auth-service/src/routes/index.js @@ -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; \ No newline at end of file diff --git a/auth-service/src/routes/permission.js b/auth-service/src/routes/permission.js new file mode 100644 index 0000000..c7f0c19 --- /dev/null +++ b/auth-service/src/routes/permission.js @@ -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; \ No newline at end of file diff --git a/auth-service/src/routes/role.js b/auth-service/src/routes/role.js new file mode 100644 index 0000000..680998e --- /dev/null +++ b/auth-service/src/routes/role.js @@ -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; \ No newline at end of file diff --git a/auth-service/src/routes/rolePermission.js b/auth-service/src/routes/rolePermission.js new file mode 100644 index 0000000..e6ab23d --- /dev/null +++ b/auth-service/src/routes/rolePermission.js @@ -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; \ No newline at end of file diff --git a/auth-service/src/routes/user.js b/auth-service/src/routes/user.js new file mode 100644 index 0000000..b3c4023 --- /dev/null +++ b/auth-service/src/routes/user.js @@ -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; \ No newline at end of file diff --git a/data/logs/proxy-host-1_access.log b/data/logs/proxy-host-1_access.log new file mode 100644 index 0000000..e69de29 diff --git a/data/logs/proxy-host-1_error.log b/data/logs/proxy-host-1_error.log new file mode 100644 index 0000000..e69de29 diff --git a/data/nginx/proxy_host/1.conf b/data/nginx/proxy_host/1.conf new file mode 100644 index 0000000..a904151 --- /dev/null +++ b/data/nginx/proxy_host/1.conf @@ -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; +} + diff --git a/mail-service/src/controllers/campaignController.js b/mail-service/src/controllers/campaignController.js new file mode 100644 index 0000000..543e586 --- /dev/null +++ b/mail-service/src/controllers/campaignController.js @@ -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 }); + } + }, +}; \ No newline at end of file diff --git a/mail-service/src/controllers/deliveryLogController.js b/mail-service/src/controllers/deliveryLogController.js new file mode 100644 index 0000000..04696c4 --- /dev/null +++ b/mail-service/src/controllers/deliveryLogController.js @@ -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 }); + } + }, +}; \ No newline at end of file diff --git a/mail-service/src/controllers/emailTemplateController.js b/mail-service/src/controllers/emailTemplateController.js new file mode 100644 index 0000000..9a44386 --- /dev/null +++ b/mail-service/src/controllers/emailTemplateController.js @@ -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 }); + } + }, +}; \ No newline at end of file diff --git a/mail-service/src/controllers/emailTemplateVersionController.js b/mail-service/src/controllers/emailTemplateVersionController.js new file mode 100644 index 0000000..61cba50 --- /dev/null +++ b/mail-service/src/controllers/emailTemplateVersionController.js @@ -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 }); + } + }, +}; \ No newline at end of file diff --git a/mail-service/src/controllers/groupSubscriberController.js b/mail-service/src/controllers/groupSubscriberController.js new file mode 100644 index 0000000..0e6ec36 --- /dev/null +++ b/mail-service/src/controllers/groupSubscriberController.js @@ -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 }); + } + }, +}; \ No newline at end of file diff --git a/mail-service/src/controllers/mailingGroupController.js b/mail-service/src/controllers/mailingGroupController.js new file mode 100644 index 0000000..161bf3e --- /dev/null +++ b/mail-service/src/controllers/mailingGroupController.js @@ -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 }); + } + }, +}; \ No newline at end of file diff --git a/mail-service/src/controllers/smtpServerController.js b/mail-service/src/controllers/smtpServerController.js new file mode 100644 index 0000000..352d0ca --- /dev/null +++ b/mail-service/src/controllers/smtpServerController.js @@ -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 }); + } + }, +}; \ No newline at end of file diff --git a/mail-service/src/controllers/subscriberController.js b/mail-service/src/controllers/subscriberController.js new file mode 100644 index 0000000..9e989ef --- /dev/null +++ b/mail-service/src/controllers/subscriberController.js @@ -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 }); + } + }, +}; \ No newline at end of file diff --git a/mail-service/src/index.js b/mail-service/src/index.js index 7c83a9a..f9721be 100644 --- a/mail-service/src/index.js +++ b/mail-service/src/index.js @@ -2,6 +2,7 @@ import dotenv from 'dotenv'; dotenv.config(); import express from 'express'; import { sequelize } from './models/index.js'; +import routes from './routes/index.js'; const app = express(); app.use(express.json()); @@ -10,6 +11,8 @@ app.get('/', (req, res) => { res.send('Mail Service is running'); }); +app.use('/api/mail', routes); + (async () => { try { await sequelize.authenticate(); diff --git a/mail-service/src/routes/campaign.js b/mail-service/src/routes/campaign.js new file mode 100644 index 0000000..ceaa6e0 --- /dev/null +++ b/mail-service/src/routes/campaign.js @@ -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; \ No newline at end of file diff --git a/mail-service/src/routes/deliveryLog.js b/mail-service/src/routes/deliveryLog.js new file mode 100644 index 0000000..66f99e9 --- /dev/null +++ b/mail-service/src/routes/deliveryLog.js @@ -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; \ No newline at end of file diff --git a/mail-service/src/routes/emailTemplate.js b/mail-service/src/routes/emailTemplate.js new file mode 100644 index 0000000..8f58ff6 --- /dev/null +++ b/mail-service/src/routes/emailTemplate.js @@ -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; \ No newline at end of file diff --git a/mail-service/src/routes/emailTemplateVersion.js b/mail-service/src/routes/emailTemplateVersion.js new file mode 100644 index 0000000..c0104ff --- /dev/null +++ b/mail-service/src/routes/emailTemplateVersion.js @@ -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; \ No newline at end of file diff --git a/mail-service/src/routes/groupSubscriber.js b/mail-service/src/routes/groupSubscriber.js new file mode 100644 index 0000000..bb1b565 --- /dev/null +++ b/mail-service/src/routes/groupSubscriber.js @@ -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; \ No newline at end of file diff --git a/mail-service/src/routes/index.js b/mail-service/src/routes/index.js new file mode 100644 index 0000000..8dcb244 --- /dev/null +++ b/mail-service/src/routes/index.js @@ -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; \ No newline at end of file diff --git a/mail-service/src/routes/mailingGroup.js b/mail-service/src/routes/mailingGroup.js new file mode 100644 index 0000000..1832fe8 --- /dev/null +++ b/mail-service/src/routes/mailingGroup.js @@ -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; \ No newline at end of file diff --git a/mail-service/src/routes/smtpServer.js b/mail-service/src/routes/smtpServer.js new file mode 100644 index 0000000..dd7c9fd --- /dev/null +++ b/mail-service/src/routes/smtpServer.js @@ -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; \ No newline at end of file diff --git a/mail-service/src/routes/subscriber.js b/mail-service/src/routes/subscriber.js new file mode 100644 index 0000000..6f2e1d3 --- /dev/null +++ b/mail-service/src/routes/subscriber.js @@ -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; \ No newline at end of file