From c6ab315165282cdfb11507f0e72f919bb20519f7 Mon Sep 17 00:00:00 2001 From: Julian Gassner Date: Wed, 8 Jan 2025 05:43:10 +0100 Subject: [PATCH] Add status indicator to certificates and show active domain names --- backend/internal/certificate.js | 2 ++ backend/models/certificate.js | 14 ++++++++++- .../js/app/nginx/certificates/list/item.ejs | 14 +++++++++++ .../js/app/nginx/certificates/list/item.js | 23 ++++++++++++++----- .../js/app/nginx/certificates/list/main.ejs | 2 +- frontend/js/app/nginx/certificates/main.js | 4 ++-- frontend/js/i18n/messages.json | 8 ++++--- 7 files changed, 54 insertions(+), 13 deletions(-) diff --git a/backend/internal/certificate.js b/backend/internal/certificate.js index 34b8fdf5..bdbdb703 100644 --- a/backend/internal/certificate.js +++ b/backend/internal/certificate.js @@ -313,6 +313,7 @@ const internalCertificate = { .where('is_deleted', 0) .andWhere('id', data.id) .allowGraph('[owner]') + .allowGraph('[proxy_hosts]') .first(); if (access_data.permission_visibility !== 'all') { @@ -464,6 +465,7 @@ const internalCertificate = { .where('is_deleted', 0) .groupBy('id') .allowGraph('[owner]') + .allowGraph('[proxy_hosts]') .orderBy('nice_name', 'ASC'); if (access_data.permission_visibility !== 'all') { diff --git a/backend/models/certificate.js b/backend/models/certificate.js index 534d927c..245dfda2 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,8 @@ class Certificate extends Model { } static get relationMappings () { + const ProxyHost = require('./proxy_host'); + const User = require('./user'); return { owner: { relation: Model.HasOneRelation, @@ -79,6 +80,17 @@ 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); + } } }; } diff --git a/frontend/js/app/nginx/certificates/list/item.ejs b/frontend/js/app/nginx/certificates/list/item.ejs index 9a0d6b27..b3d0ab7a 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 (proxy_hosts.length > 0) { %> + <%- i18n('certificates', 'in-use') %> + <% } else { %> + <%- i18n('certificates', 'inactive') %> + <% } %> + <% if (canManage) { %> diff --git a/frontend/js/app/nginx/certificates/list/item.js b/frontend/js/app/nginx/certificates/list/item.js index 7fa1c681..d73466c3 100644 --- a/frontend/js/app/nginx/certificates/list/item.js +++ b/frontend/js/app/nginx/certificates/list/item.js @@ -44,12 +44,23 @@ 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, + proxy_hosts: this.getProxyHosts() + }; + }, + + getProxyHosts: function () { + const hosts = this.model.attributes.proxy_hosts || []; + return hosts.reduce((acc, host) => { + acc.push(...(host.domain_names || [])); + return acc; + }, []); }, initialize: function () { diff --git a/frontend/js/app/nginx/certificates/list/main.ejs b/frontend/js/app/nginx/certificates/list/main.ejs index f0623779..329b5843 100644 --- a/frontend/js/app/nginx/certificates/list/main.ejs +++ b/frontend/js/app/nginx/certificates/list/main.ejs @@ -2,8 +2,8 @@   <%- i18n('str', 'name') %> <%- i18n('all-hosts', 'cert-provider') %> - <%- i18n('str', 'active-hosts') %> <%- 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 89562768..1192873b 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'], 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']) .then(response => { if (!view.isDestroyed()) { if (response && response.length) { diff --git a/frontend/js/i18n/messages.json b/frontend/js/i18n/messages.json index 138e3d72..8eb68d18 100644 --- a/frontend/js/i18n/messages.json +++ b/frontend/js/i18n/messages.json @@ -35,8 +35,7 @@ "value": "Value", "please-wait": "Please wait...", "all": "All", - "any": "Any", - "active-hosts": "Active Hosts" + "any": "Any" }, "login": { "title": "Login to your account" @@ -207,7 +206,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",