Backend: separate mail domains from mailboxes
This commit is contained in:
parent
272e506281
commit
b9949cdf5e
|
@ -13,6 +13,11 @@ import UserNameComponent from "swaf/auth/models/UserNameComponent";
|
|||
export default class MailboxBackendController extends Controller {
|
||||
public constructor() {
|
||||
super();
|
||||
BackendController.registerMenuElement({
|
||||
getLink: async () => Controller.route('backend-mail-domains'),
|
||||
getDisplayString: async () => 'Mail domains',
|
||||
getDisplayIcon: async () => 'globe',
|
||||
});
|
||||
BackendController.registerMenuElement({
|
||||
getLink: async () => Controller.route('backend-mailboxes'),
|
||||
getDisplayString: async () => 'Mailboxes',
|
||||
|
@ -26,8 +31,9 @@ export default class MailboxBackendController extends Controller {
|
|||
|
||||
public routes(): void {
|
||||
this.get('/', this.getMailboxesBackend, 'backend-mailboxes', RequireAuthMiddleware, RequireAdminMiddleware);
|
||||
this.get('/:id', this.getMailboxBackend, 'backend-mailbox', RequireAuthMiddleware, RequireAdminMiddleware);
|
||||
this.get('/mailbox/:id', this.getMailboxBackend, 'backend-mailbox', RequireAuthMiddleware, RequireAdminMiddleware);
|
||||
|
||||
this.get('/domains', this.getDomainsBackend, 'backend-mail-domains', RequireAuthMiddleware, RequireAdminMiddleware);
|
||||
this.post('/add-domain', this.postAddDomain, 'backend-add-domain', RequireAuthMiddleware, RequireAdminMiddleware);
|
||||
this.get('/edit-domain/:id', this.getEditDomain, 'backend-edit-domain', RequireAuthMiddleware, RequireAdminMiddleware);
|
||||
this.post('/edit-domain/:id', this.postEditDomain, 'backend-edit-domain', RequireAuthMiddleware, RequireAdminMiddleware);
|
||||
|
@ -39,11 +45,6 @@ export default class MailboxBackendController extends Controller {
|
|||
}
|
||||
|
||||
protected async getMailboxesBackend(req: Request, res: Response): Promise<void> {
|
||||
const mailDomains = await MailDomain.select()
|
||||
.with('owner')
|
||||
.with('identities')
|
||||
.get();
|
||||
|
||||
const users = await User.select()
|
||||
.where('main_mail_identity_id', null, WhereTest.NE)
|
||||
.with('mainMailIdentity')
|
||||
|
@ -51,12 +52,6 @@ export default class MailboxBackendController extends Controller {
|
|||
.get();
|
||||
|
||||
res.render('backend/mailboxes', {
|
||||
domains: await Promise.all(mailDomains.map(async domain => ({
|
||||
id: domain.id,
|
||||
name: domain.name,
|
||||
owner_name: (await domain.owner.get())?.as(UserNameComponent).name,
|
||||
identity_count: (await domain.identities.get()).length,
|
||||
}))),
|
||||
users: [{
|
||||
value: 0,
|
||||
display: 'Public',
|
||||
|
@ -102,6 +97,22 @@ export default class MailboxBackendController extends Controller {
|
|||
});
|
||||
}
|
||||
|
||||
protected async getDomainsBackend(req: Request, res: Response): Promise<void> {
|
||||
const mailDomains = await MailDomain.select()
|
||||
.with('owner')
|
||||
.with('identities')
|
||||
.get();
|
||||
|
||||
res.render('backend/mail_domains', {
|
||||
domains: await Promise.all(mailDomains.map(async domain => ({
|
||||
id: domain.id,
|
||||
name: domain.name,
|
||||
owner_name: (await domain.owner.get())?.as(UserNameComponent).name,
|
||||
identity_count: (await domain.identities.get()).length,
|
||||
}))),
|
||||
});
|
||||
}
|
||||
|
||||
protected async postAddDomain(req: Request, res: Response): Promise<void> {
|
||||
const domain = MailDomain.create(req.body);
|
||||
await domain.save();
|
||||
|
|
|
@ -4,9 +4,9 @@
|
|||
|
||||
{% block body %}
|
||||
<div class="container">
|
||||
{{ macros.breadcrumb('Mail domain: ' + domain.name, [
|
||||
{{ macros.breadcrumb(domain.name, [
|
||||
{title: 'Backend', link: route('backend')},
|
||||
{title: 'Mailboxes', link: route('backend-mailboxes')}
|
||||
{title: 'Mail domains', link: route('backend-mail-domains')}
|
||||
]) }}
|
||||
|
||||
<div class="panel">
|
||||
|
|
|
@ -0,0 +1,67 @@
|
|||
{% extends 'layouts/base.njk' %}
|
||||
|
||||
{% set title = app.name + ' - Backend' %}
|
||||
|
||||
{% block body %}
|
||||
<div class="container">
|
||||
{{ macros.breadcrumb('Mail domains', [
|
||||
{title: 'Backend', link: route('backend')}
|
||||
]) }}
|
||||
|
||||
<h1>Domain manager</h1>
|
||||
|
||||
<section class="panel">
|
||||
<h2><i data-feather="globe"></i> Domains</h2>
|
||||
|
||||
<form action="{{ route('backend-add-domain') }}" method="POST" class="sub-panel">
|
||||
<h3>Add domain</h3>
|
||||
{{ macros.field(_locals, 'text', 'name', null, 'Domain name', null, 'required') }}
|
||||
|
||||
{{ macros.field(_locals, 'select', 'user_id', undefined, 'Owner', null, 'required', users) }}
|
||||
|
||||
<button><i data-feather="plus"></i> Add domain</button>
|
||||
|
||||
{{ macros.csrf(getCsrfToken) }}
|
||||
</form>
|
||||
|
||||
<table class="data-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>#</th>
|
||||
<th>Name</th>
|
||||
<th>Owner</th>
|
||||
<th>Identities</th>
|
||||
<th>Actions</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<tbody>
|
||||
{% for domain in domains %}
|
||||
<tr>
|
||||
<td>{{ domain.id }}</td>
|
||||
<td>{{ domain.name }}</td>
|
||||
<td>{{ domain.owner_name | default('Public') }}</td>
|
||||
<td>{{ domain.identity_count }}</td>
|
||||
<td class="actions">
|
||||
<a href="{{ route('backend-edit-domain', domain.id) }}" class="button">
|
||||
<i data-feather="edit-2"></i> <span class="tip">Edit</span>
|
||||
</a>
|
||||
|
||||
<form action="{{ route('backend-remove-domain') }}" method="POST">
|
||||
<input type="hidden" name="id" value="{{ domain.id }}">
|
||||
|
||||
<button class="danger"
|
||||
onclick="return confirm('Are you sure you want to delete {{ domain.name }}?')">
|
||||
<i data-feather="trash"></i> <span class="tip">Remove</span>
|
||||
</button>
|
||||
|
||||
{{ macros.csrf(getCsrfToken) }}
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</section>
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -10,60 +10,6 @@
|
|||
|
||||
<h1>Mailbox manager</h1>
|
||||
|
||||
<section class="panel">
|
||||
<h2><i data-feather="globe"></i> Domains</h2>
|
||||
|
||||
<form action="{{ route('backend-add-domain') }}" method="POST" class="sub-panel">
|
||||
<h3>Add domain</h3>
|
||||
{{ macros.field(_locals, 'text', 'name', null, 'Domain name', null, 'required') }}
|
||||
|
||||
{{ macros.field(_locals, 'select', 'user_id', undefined, 'Owner', null, 'required', users) }}
|
||||
|
||||
<button><i data-feather="plus"></i> Add domain</button>
|
||||
|
||||
{{ macros.csrf(getCsrfToken) }}
|
||||
</form>
|
||||
|
||||
<table class="data-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>#</th>
|
||||
<th>Name</th>
|
||||
<th>Owner</th>
|
||||
<th>Identities</th>
|
||||
<th>Actions</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<tbody>
|
||||
{% for domain in domains %}
|
||||
<tr>
|
||||
<td>{{ domain.id }}</td>
|
||||
<td>{{ domain.name }}</td>
|
||||
<td>{{ domain.owner_name | default('Public') }}</td>
|
||||
<td>{{ domain.identity_count }}</td>
|
||||
<td class="actions">
|
||||
<a href="{{ route('backend-edit-domain', domain.id) }}" class="button">
|
||||
<i data-feather="edit-2"></i> <span class="tip">Edit</span>
|
||||
</a>
|
||||
|
||||
<form action="{{ route('backend-remove-domain') }}" method="POST">
|
||||
<input type="hidden" name="id" value="{{ domain.id }}">
|
||||
|
||||
<button class="danger"
|
||||
onclick="return confirm('Are you sure you want to delete {{ domain.name }}?')">
|
||||
<i data-feather="trash"></i> <span class="tip">Remove</span>
|
||||
</button>
|
||||
|
||||
{{ macros.csrf(getCsrfToken) }}
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</section>
|
||||
|
||||
<section class="panel">
|
||||
<h2><i data-feather="mail"></i> Mailboxes</h2>
|
||||
|
||||
|
|
Loading…
Reference in New Issue