diff --git a/backend/internal/certificate.js b/backend/internal/certificate.js
index 34b8fdf..f2e845a 100644
--- a/backend/internal/certificate.js
+++ b/backend/internal/certificate.js
@@ -313,6 +313,9 @@ const internalCertificate = {
.where('is_deleted', 0)
.andWhere('id', data.id)
.allowGraph('[owner]')
+ .allowGraph('[proxy_hosts]')
+ .allowGraph('[redirection_hosts]')
+ .allowGraph('[dead_hosts]')
.first();
if (access_data.permission_visibility !== 'all') {
@@ -464,6 +467,9 @@ const internalCertificate = {
.where('is_deleted', 0)
.groupBy('id')
.allowGraph('[owner]')
+ .allowGraph('[proxy_hosts]')
+ .allowGraph('[redirection_hosts]')
+ .allowGraph('[dead_hosts]')
.orderBy('nice_name', 'ASC');
if (access_data.permission_visibility !== 'all') {
diff --git a/backend/models/certificate.js b/backend/models/certificate.js
index 534d927..d4ea21a 100644
--- a/backend/models/certificate.js
+++ b/backend/models/certificate.js
@@ -4,7 +4,6 @@
const db = require('../db');
const helpers = require('../lib/helpers');
const Model = require('objection').Model;
-const User = require('./user');
const now = require('./now_helper');
Model.knex(db);
@@ -68,6 +67,11 @@ class Certificate extends Model {
}
static get relationMappings () {
+ const ProxyHost = require('./proxy_host');
+ const DeadHost = require('./dead_host');
+ const User = require('./user');
+ const RedirectionHost = require('./redirection_host');
+
return {
owner: {
relation: Model.HasOneRelation,
@@ -79,6 +83,39 @@ class Certificate extends Model {
modify: function (qb) {
qb.where('user.is_deleted', 0);
}
+ },
+ proxy_hosts: {
+ relation: Model.HasManyRelation,
+ modelClass: ProxyHost,
+ join: {
+ from: 'certificate.id',
+ to: 'proxy_host.certificate_id'
+ },
+ modify: function (qb) {
+ qb.where('proxy_host.is_deleted', 0);
+ }
+ },
+ dead_hosts: {
+ relation: Model.HasManyRelation,
+ modelClass: DeadHost,
+ join: {
+ from: 'certificate.id',
+ to: 'dead_host.certificate_id'
+ },
+ modify: function (qb) {
+ qb.where('dead_host.is_deleted', 0);
+ }
+ },
+ redirection_hosts: {
+ relation: Model.HasManyRelation,
+ modelClass: RedirectionHost,
+ join: {
+ from: 'certificate.id',
+ to: 'redirection_host.certificate_id'
+ },
+ modify: function (qb) {
+ qb.where('redirection_host.is_deleted', 0);
+ }
}
};
}
diff --git a/frontend/js/app/dashboard/main.js b/frontend/js/app/dashboard/main.js
index c2e82f8..4765d06 100644
--- a/frontend/js/app/dashboard/main.js
+++ b/frontend/js/app/dashboard/main.js
@@ -50,8 +50,7 @@ module.exports = Mn.View.extend({
onRender: function () {
let view = this;
- if (typeof view.stats.hosts === 'undefined') {
- Api.Reports.getHostStats()
+ Api.Reports.getHostStats()
.then(response => {
if (!view.isDestroyed()) {
view.stats.hosts = response;
@@ -61,7 +60,6 @@ module.exports = Mn.View.extend({
.catch(err => {
console.log(err);
});
- }
},
/**
diff --git a/frontend/js/app/nginx/certificates/list/item.ejs b/frontend/js/app/nginx/certificates/list/item.ejs
index 9a0d6b2..179a819 100644
--- a/frontend/js/app/nginx/certificates/list/item.ejs
+++ b/frontend/js/app/nginx/certificates/list/item.ejs
@@ -33,6 +33,13 @@
<%- formatDbDate(expires_on, 'Do MMMM YYYY, h:mm a') %>
|
+
+ <% if (active_domain_names().length > 0) { %>
+ <%- i18n('certificates', 'in-use') %>
+ <% } else { %>
+ <%- i18n('certificates', 'inactive') %>
+ <% } %>
+ |
<% if (canManage) { %>
@@ -48,7 +55,14 @@
<% } %>
<%- i18n('str', 'delete') %>
+ <% if (active_domain_names().length > 0) { %>
+
+
+ <% active_domain_names().forEach(function(host) { %>
+ <%- host %>
+ <% }); %>
+ <% } %>
|
-<% } %>
+<% } %>
\ No newline at end of file
diff --git a/frontend/js/app/nginx/certificates/list/item.js b/frontend/js/app/nginx/certificates/list/item.js
index 7fa1c68..b9a927a 100644
--- a/frontend/js/app/nginx/certificates/list/item.js
+++ b/frontend/js/app/nginx/certificates/list/item.js
@@ -44,14 +44,24 @@ module.exports = Mn.View.extend({
},
},
- templateContext: {
- canManage: App.Cache.User.canManage('certificates'),
- isExpired: function () {
- return moment(this.expires_on).isBefore(moment());
- },
- dns_providers: dns_providers
+ templateContext: function () {
+ return {
+ canManage: App.Cache.User.canManage('certificates'),
+ isExpired: function () {
+ return moment(this.expires_on).isBefore(moment());
+ },
+ dns_providers: dns_providers,
+ active_domain_names: function () {
+ const { proxy_hosts = [], redirect_hosts = [], dead_hosts = [] } = this;
+ return [...proxy_hosts, ...redirect_hosts, ...dead_hosts].reduce((acc, host) => {
+ acc.push(...(host.domain_names || []));
+ return acc;
+ }, []);
+ }
+ };
},
+
initialize: function () {
this.listenTo(this.model, 'change', this.render);
}
diff --git a/frontend/js/app/nginx/certificates/list/main.ejs b/frontend/js/app/nginx/certificates/list/main.ejs
index aa49a27..329b584 100644
--- a/frontend/js/app/nginx/certificates/list/main.ejs
+++ b/frontend/js/app/nginx/certificates/list/main.ejs
@@ -3,6 +3,7 @@
<%- i18n('str', 'name') %> |
<%- i18n('all-hosts', 'cert-provider') %> |
<%- i18n('str', 'expires') %> |
+ <%- i18n('str', 'status') %> |
<% if (canManage) { %>
|
<% } %>
diff --git a/frontend/js/app/nginx/certificates/main.js b/frontend/js/app/nginx/certificates/main.js
index 8956276..3f9f022 100644
--- a/frontend/js/app/nginx/certificates/main.js
+++ b/frontend/js/app/nginx/certificates/main.js
@@ -74,7 +74,7 @@ module.exports = Mn.View.extend({
e.preventDefault();
let query = this.ui.query.val();
- this.fetch(['owner'], query)
+ this.fetch(['owner','proxy_hosts', 'dead_hosts', 'redirection_hosts'], query)
.then(response => this.showData(response))
.catch(err => {
this.showError(err);
@@ -89,7 +89,7 @@ module.exports = Mn.View.extend({
onRender: function () {
let view = this;
- view.fetch(['owner'])
+ view.fetch(['owner','proxy_hosts', 'dead_hosts', 'redirection_hosts'])
.then(response => {
if (!view.isDestroyed()) {
if (response && response.length) {
diff --git a/frontend/js/i18n/messages.json b/frontend/js/i18n/messages.json
index aa42cbb..a154921 100644
--- a/frontend/js/i18n/messages.json
+++ b/frontend/js/i18n/messages.json
@@ -208,7 +208,10 @@
"reachability-other": "There is a server found at this domain but it returned an unexpected status code {code}. Is it the NPM server? Please make sure your domain points to the IP where your NPM instance is running.",
"download": "Download",
"renew-title": "Renew Let's Encrypt Certificate",
- "search": "Search Certificate…"
+ "search": "Search Certificate…",
+ "in-use" : "In use",
+ "inactive": "Inactive",
+ "active-domain_names": "Active domain names"
},
"access-lists": {
"title": "Access Lists",