@lilaquadrat/studio 10.0.0-beta.5 → 10.0.0-beta.51
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/eslint.config.js +146 -0
- package/lib/fastify-plugins.d.ts +4 -0
- package/lib/fastify-plugins.js +5 -0
- package/lib/fastify-plugins.js.map +1 -0
- package/lib/helpers.d.ts +4 -2
- package/lib/helpers.js +13 -2
- package/lib/helpers.js.map +1 -1
- package/lib/main.d.ts +1 -3
- package/lib/main.js +7 -3
- package/lib/main.js.map +1 -1
- package/lib/models.d.ts +4 -4
- package/lib/models.js +4 -4
- package/lib/models.js.map +1 -1
- package/lib/services.d.ts +5 -8
- package/lib/services.js +27 -9
- package/lib/services.js.map +1 -1
- package/lib/src/Immutable.class.d.ts +8 -1
- package/lib/src/Immutable.class.js +52 -8
- package/lib/src/Immutable.class.js.map +1 -1
- package/lib/src/ShareClientFactory.class.d.ts +1 -3
- package/lib/src/ShareClientFactory.class.js +1 -9
- package/lib/src/ShareClientFactory.class.js.map +1 -1
- package/lib/src/classes/models.class.js.map +1 -1
- package/lib/src/classes/modelv2.class.d.ts +2 -0
- package/lib/src/classes/modelv2.class.js +1 -1
- package/lib/src/classes/modelv2.class.js.map +1 -1
- package/lib/src/classes/mongo.class.js +4 -14
- package/lib/src/classes/mongo.class.js.map +1 -1
- package/lib/src/functions/handleError.d.ts +2 -3
- package/lib/src/functions/handleError.js +3 -16
- package/lib/src/functions/handleError.js.map +1 -1
- package/lib/src/functions/optionsHelper.d.ts +4 -4
- package/lib/src/functions/optionsHelper.js +5 -4
- package/lib/src/functions/optionsHelper.js.map +1 -1
- package/lib/src/functions/respondCode.d.ts +2 -1
- package/lib/src/functions/respondCode.js +1 -1
- package/lib/src/functions/respondCode.js.map +1 -1
- package/lib/src/helpers/ControllerHelper.d.ts +73 -0
- package/lib/src/helpers/ControllerHelper.js +242 -0
- package/lib/src/helpers/ControllerHelper.js.map +1 -0
- package/lib/src/helpers/EnvMapper.d.ts +0 -0
- package/lib/src/helpers/EnvMapper.js +1 -0
- package/lib/src/helpers/EnvMapper.js.map +1 -0
- package/lib/src/helpers/auth0config.d.ts +6 -0
- package/lib/src/helpers/auth0config.js +23 -0
- package/lib/src/helpers/auth0config.js.map +1 -0
- package/lib/src/helpers/authPlugin.d.ts +29 -0
- package/lib/src/helpers/authPlugin.js +77 -0
- package/lib/src/helpers/authPlugin.js.map +1 -0
- package/lib/src/helpers/cacheHelper.d.ts +69 -0
- package/lib/src/helpers/cacheHelper.js +235 -0
- package/lib/src/helpers/cacheHelper.js.map +1 -0
- package/lib/src/helpers/createSasToken.d.ts +0 -2
- package/lib/src/helpers/createSasToken.js +35 -32
- package/lib/src/helpers/createSasToken.js.map +1 -1
- package/lib/src/helpers/getSecrets.d.ts +1 -1
- package/lib/src/helpers/getSecrets.js +10 -12
- package/lib/src/helpers/getSecrets.js.map +1 -1
- package/lib/src/helpers/queryAssertionPlugin.d.ts +3 -0
- package/lib/src/helpers/queryAssertionPlugin.js +20 -0
- package/lib/src/helpers/queryAssertionPlugin.js.map +1 -0
- package/lib/src/helpers/safeObjectId.d.ts +1 -1
- package/lib/src/helpers/safeObjectId.js +5 -1
- package/lib/src/helpers/safeObjectId.js.map +1 -1
- package/lib/src/helpers/storageSdkFactory.d.ts +2 -0
- package/lib/src/helpers/storageSdkFactory.js +11 -0
- package/lib/src/helpers/storageSdkFactory.js.map +1 -0
- package/lib/src/helpers/studioAppPlugin.d.ts +3 -0
- package/lib/src/helpers/studioAppPlugin.js +16 -0
- package/lib/src/helpers/studioAppPlugin.js.map +1 -0
- package/lib/src/logger.js +154 -32
- package/lib/src/logger.js.map +1 -1
- package/lib/src/models/customers.model.js +14 -4
- package/lib/src/models/customers.model.js.map +1 -1
- package/lib/src/models/design.model.d.ts +4 -0
- package/lib/src/models/design.model.js +58 -0
- package/lib/src/models/design.model.js.map +1 -0
- package/lib/src/models/domain.model.js +1 -1
- package/lib/src/models/domain.model.js.map +1 -1
- package/lib/src/models/editor.model.js +7 -0
- package/lib/src/models/editor.model.js.map +1 -1
- package/lib/src/models/emailLimit.model.d.ts +4 -0
- package/lib/src/models/emailLimit.model.js +31 -0
- package/lib/src/models/emailLimit.model.js.map +1 -0
- package/lib/src/models/hosting.model.js +1 -3
- package/lib/src/models/hosting.model.js.map +1 -1
- package/lib/src/models/hostingSettings.model.js +6 -4
- package/lib/src/models/hostingSettings.model.js.map +1 -1
- package/lib/src/models/invoice.model.d.ts +4 -0
- package/lib/src/models/invoice.model.js +235 -0
- package/lib/src/models/invoice.model.js.map +1 -0
- package/lib/src/models/mailFrom.model.js +53 -10
- package/lib/src/models/mailFrom.model.js.map +1 -1
- package/lib/src/models/project.model.js +2 -4
- package/lib/src/models/project.model.js.map +1 -1
- package/lib/src/models/publish-method.model.js +79 -430
- package/lib/src/models/publish-method.model.js.map +1 -1
- package/lib/src/models/storage.model.js +11 -3
- package/lib/src/models/storage.model.js.map +1 -1
- package/lib/src/prompts/textGeneration.js +88 -0
- package/lib/src/prompts/textGeneration.js.map +1 -1
- package/lib/src/prompts/textGenerationMulti.js +78 -44
- package/lib/src/prompts/textGenerationMulti.js.map +1 -1
- package/lib/src/services/access.service.d.ts +0 -37
- package/lib/src/services/access.service.js +119 -108
- package/lib/src/services/access.service.js.map +1 -1
- package/lib/src/services/ai.service.d.ts +4 -3
- package/lib/src/services/ai.service.js +22 -29
- package/lib/src/services/ai.service.js.map +1 -1
- package/lib/src/services/auth.service.d.ts +10 -0
- package/lib/src/services/auth.service.js +63 -0
- package/lib/src/services/auth.service.js.map +1 -0
- package/lib/src/services/conf.service.d.ts +3 -31
- package/lib/src/services/conf.service.js +58 -167
- package/lib/src/services/conf.service.js.map +1 -1
- package/lib/src/services/customers.service.d.ts +8 -4
- package/lib/src/services/customers.service.js +34 -7
- package/lib/src/services/customers.service.js.map +1 -1
- package/lib/src/services/designs.service.d.ts +7 -0
- package/lib/src/services/designs.service.js +10 -0
- package/lib/src/services/designs.service.js.map +1 -0
- package/lib/src/services/domains.service.d.ts +18 -91
- package/lib/src/services/domains.service.js +91 -559
- package/lib/src/services/domains.service.js.map +1 -1
- package/lib/src/services/editor.service.d.ts +4 -0
- package/lib/src/services/editor.service.js +28 -0
- package/lib/src/services/editor.service.js.map +1 -1
- package/lib/src/services/emailLimit.service.d.ts +21 -0
- package/lib/src/services/emailLimit.service.js +51 -0
- package/lib/src/services/emailLimit.service.js.map +1 -0
- package/lib/src/services/hosting.service.d.ts +12 -24
- package/lib/src/services/hosting.service.js +32 -122
- package/lib/src/services/hosting.service.js.map +1 -1
- package/lib/src/services/hostingAdmin.service.d.ts +1 -1
- package/lib/src/services/hostingAdmin.service.js +2 -2
- package/lib/src/services/hostingAdmin.service.js.map +1 -1
- package/lib/src/services/import.service.d.ts +6 -22
- package/lib/src/services/import.service.js +63 -65
- package/lib/src/services/import.service.js.map +1 -1
- package/lib/src/services/invoices.service.d.ts +30 -0
- package/lib/src/services/invoices.service.js +265 -0
- package/lib/src/services/invoices.service.js.map +1 -0
- package/lib/src/services/jetstream.service.d.ts +5 -3
- package/lib/src/services/jetstream.service.js +63 -7
- package/lib/src/services/jetstream.service.js.map +1 -1
- package/lib/src/services/listParticipants.service.d.ts +2 -5
- package/lib/src/services/listParticipants.service.js +17 -14
- package/lib/src/services/listParticipants.service.js.map +1 -1
- package/lib/src/services/mailFrom.service.d.ts +14 -1
- package/lib/src/services/mailFrom.service.js +55 -0
- package/lib/src/services/mailFrom.service.js.map +1 -1
- package/lib/src/services/me.service.d.ts +22 -12
- package/lib/src/services/me.service.js +58 -89
- package/lib/src/services/me.service.js.map +1 -1
- package/lib/src/services/publish.service.d.ts +3 -7
- package/lib/src/services/publish.service.js +32 -32
- package/lib/src/services/publish.service.js.map +1 -1
- package/lib/src/services/publishData.service.d.ts +10 -7
- package/lib/src/services/publishData.service.js +32 -75
- package/lib/src/services/publishData.service.js.map +1 -1
- package/lib/src/services/spamAnalasys.service.d.ts +4 -4
- package/lib/src/services/spamAnalasys.service.js +36 -44
- package/lib/src/services/spamAnalasys.service.js.map +1 -1
- package/lib/src/services/storage.service.d.ts +22 -29
- package/lib/src/services/storage.service.js +123 -57
- package/lib/src/services/storage.service.js.map +1 -1
- package/lib/src/services/structures.service.d.ts +1 -1
- package/lib/src/services/upload.service.js +6 -1
- package/lib/src/services/upload.service.js.map +1 -1
- package/package.json +28 -29
- package/lib/src/AzureBlobStorage.share.d.ts +0 -19
- package/lib/src/AzureBlobStorage.share.js +0 -162
- package/lib/src/AzureBlobStorage.share.js.map +0 -1
- package/lib/src/AzureFileStorage.share.d.ts +0 -22
- package/lib/src/AzureFileStorage.share.js +0 -139
- package/lib/src/AzureFileStorage.share.js.map +0 -1
- package/lib/src/AzureVault.d.ts +0 -14
- package/lib/src/AzureVault.js +0 -28
- package/lib/src/AzureVault.js.map +0 -1
- package/lib/src/dns.challenge.class.d.ts +0 -17
- package/lib/src/dns.challenge.class.js +0 -41
- package/lib/src/dns.challenge.class.js.map +0 -1
- package/lib/src/http.challenge.class.d.ts +0 -33
- package/lib/src/http.challenge.class.js +0 -58
- package/lib/src/http.challenge.class.js.map +0 -1
- package/lib/src/models/certificate-action.model.d.ts +0 -5
- package/lib/src/models/certificate-action.model.js +0 -230
- package/lib/src/models/certificate-action.model.js.map +0 -1
- package/lib/src/models/certificate.model.d.ts +0 -4
- package/lib/src/models/certificate.model.js +0 -96
- package/lib/src/models/certificate.model.js.map +0 -1
- package/lib/src/models/editorBase.model.d.ts +0 -4
- package/lib/src/models/editorBase.model.js +0 -39
- package/lib/src/models/editorBase.model.js.map +0 -1
- package/lib/src/services/certificates.service.d.ts +0 -56
- package/lib/src/services/certificates.service.js +0 -169
- package/lib/src/services/certificates.service.js.map +0 -1
- package/lib/src/services/certificatesAction.service.d.ts +0 -41
- package/lib/src/services/certificatesAction.service.js +0 -188
- package/lib/src/services/certificatesAction.service.js.map +0 -1
- package/lib/src/services/editorBase.service.d.ts +0 -46
- package/lib/src/services/editorBase.service.js +0 -161
- package/lib/src/services/editorBase.service.js.map +0 -1
- package/lib/src/services/handleFile.service.d.ts +0 -9
- package/lib/src/services/handleFile.service.js +0 -45
- package/lib/src/services/handleFile.service.js.map +0 -1
- package/lib/src/services/media.service.d.ts +0 -35
- package/lib/src/services/media.service.js +0 -418
- package/lib/src/services/media.service.js.map +0 -1
- package/lib/src/services/share.service.d.ts +0 -6
- package/lib/src/services/share.service.js +0 -4
- package/lib/src/services/share.service.js.map +0 -1
|
@@ -1,10 +1,6 @@
|
|
|
1
|
-
import { ObjectId } from 'mongodb';
|
|
2
1
|
import DNS from 'dns';
|
|
3
2
|
import Immutable from '../Immutable.class.js';
|
|
4
3
|
import DomainModel from '../models/domain.model.js';
|
|
5
|
-
import certificatesService from './certificates.service.js';
|
|
6
|
-
import HostingModel from '../models/hosting.model.js';
|
|
7
|
-
import certificatesActionService from './certificatesAction.service.js';
|
|
8
4
|
import secretService from './secret.service.js';
|
|
9
5
|
const dns = DNS.promises;
|
|
10
6
|
class DomainsService extends Immutable {
|
|
@@ -12,112 +8,6 @@ class DomainsService extends Immutable {
|
|
|
12
8
|
super(...arguments);
|
|
13
9
|
this.model = DomainModel;
|
|
14
10
|
}
|
|
15
|
-
async single(internalId, options) {
|
|
16
|
-
const projection = {};
|
|
17
|
-
const aggregationArray = [
|
|
18
|
-
{
|
|
19
|
-
$match: {
|
|
20
|
-
$and: [
|
|
21
|
-
{ $expr: { $eq: ['$_id', internalId] } },
|
|
22
|
-
],
|
|
23
|
-
},
|
|
24
|
-
},
|
|
25
|
-
];
|
|
26
|
-
if (!options?.includeSecret) {
|
|
27
|
-
projection.secret = false;
|
|
28
|
-
}
|
|
29
|
-
if (!options?.certificate) {
|
|
30
|
-
projection.certificate = false;
|
|
31
|
-
}
|
|
32
|
-
if (Object.keys(projection).length) {
|
|
33
|
-
aggregationArray.push({
|
|
34
|
-
$project: projection,
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
if (options?.includeSecret) {
|
|
38
|
-
aggregationArray.push({
|
|
39
|
-
$lookup: {
|
|
40
|
-
from: 'secrets',
|
|
41
|
-
as: 'secret',
|
|
42
|
-
let: { referenceId: '$secret' },
|
|
43
|
-
pipeline: [
|
|
44
|
-
{
|
|
45
|
-
$match: {
|
|
46
|
-
$and: [
|
|
47
|
-
{ $expr: { $eq: ['$_id', '$$referenceId'] } },
|
|
48
|
-
],
|
|
49
|
-
},
|
|
50
|
-
},
|
|
51
|
-
{
|
|
52
|
-
$project: {
|
|
53
|
-
key: 1,
|
|
54
|
-
id: 1,
|
|
55
|
-
_id: 0,
|
|
56
|
-
},
|
|
57
|
-
},
|
|
58
|
-
],
|
|
59
|
-
},
|
|
60
|
-
});
|
|
61
|
-
aggregationArray.push({
|
|
62
|
-
$unwind: {
|
|
63
|
-
path: '$secret',
|
|
64
|
-
preserveNullAndEmptyArrays: true,
|
|
65
|
-
},
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
if (options?.certificate) {
|
|
69
|
-
aggregationArray.push({
|
|
70
|
-
$lookup: {
|
|
71
|
-
from: 'certificates',
|
|
72
|
-
as: 'certificate',
|
|
73
|
-
let: { certificateId: '$certificate' },
|
|
74
|
-
pipeline: [
|
|
75
|
-
{
|
|
76
|
-
$match: {
|
|
77
|
-
$and: [
|
|
78
|
-
{ $expr: { $eq: ['$_id', { $toObjectId: '$$certificateId' }] } },
|
|
79
|
-
],
|
|
80
|
-
},
|
|
81
|
-
},
|
|
82
|
-
{
|
|
83
|
-
$project: {
|
|
84
|
-
_id: 1,
|
|
85
|
-
domains: 1,
|
|
86
|
-
valid: 1,
|
|
87
|
-
type: 1,
|
|
88
|
-
contentType: 1,
|
|
89
|
-
filename: 1,
|
|
90
|
-
},
|
|
91
|
-
},
|
|
92
|
-
],
|
|
93
|
-
},
|
|
94
|
-
});
|
|
95
|
-
aggregationArray.push({
|
|
96
|
-
$unwind: {
|
|
97
|
-
path: '$certificate',
|
|
98
|
-
preserveNullAndEmptyArrays: true,
|
|
99
|
-
},
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
const domain = await this.model.db.aggregate(aggregationArray).toArray();
|
|
103
|
-
if (domain[0])
|
|
104
|
-
return domain[0];
|
|
105
|
-
return undefined;
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* @deprecated
|
|
109
|
-
*/
|
|
110
|
-
async createWithSSL(data, user, app) {
|
|
111
|
-
const newDomain = await this.create({ ...data, validated: false }, user, app);
|
|
112
|
-
const secret = await secretService.singleUpsert(data.company, data.project, undefined, undefined, data.domain, 10, user, app);
|
|
113
|
-
/** set the dns validation secret */
|
|
114
|
-
await this.immutable(newDomain._id, { secret: secret._id }, user, 'change', app, undefined, undefined, 'setSecret');
|
|
115
|
-
const certOrRequest = await certificatesService.getOrRequest(data.domain, data.company, data.project, user, app);
|
|
116
|
-
if (certOrRequest.type === 'certificate') {
|
|
117
|
-
await this.linkCertificate(new ObjectId(certOrRequest.data?._id), data.domain, data.company, data.project, user, app);
|
|
118
|
-
}
|
|
119
|
-
return newDomain;
|
|
120
|
-
}
|
|
121
11
|
async createWithSecret(data, options) {
|
|
122
12
|
const newDomain = await this.create({ ...data, validated: false }, options.user, options.app);
|
|
123
13
|
const secret = await secretService.singleUpsert(data.company, data.project, undefined, undefined, data.domain, 10, options.user, options.app);
|
|
@@ -125,29 +15,6 @@ class DomainsService extends Immutable {
|
|
|
125
15
|
await this.immutable(newDomain._id, { secret: secret._id }, options.user, 'change', options.app, undefined, undefined, 'setSecret');
|
|
126
16
|
return newDomain;
|
|
127
17
|
}
|
|
128
|
-
async createWithWildcard(data, options) {
|
|
129
|
-
const newDomain = await this.create({ ...data, validated: true }, options.user, options.app);
|
|
130
|
-
const certOrRequest = await certificatesService.getOrRequestWildcard(data.domain, options);
|
|
131
|
-
if (certOrRequest.type === 'certificate') {
|
|
132
|
-
await this.linkCertificate(new ObjectId(certOrRequest.data?._id), data.domain, undefined, undefined, options.user, options.app);
|
|
133
|
-
}
|
|
134
|
-
return newDomain;
|
|
135
|
-
}
|
|
136
|
-
/**
|
|
137
|
-
* start a new certification action based upon the last failed for this domain
|
|
138
|
-
*/
|
|
139
|
-
async retrySSL(data, user, app) {
|
|
140
|
-
const failedAction = await certificatesActionService.latest(data.domain, data.company, data.project);
|
|
141
|
-
if (failedAction?.state === 'failed') {
|
|
142
|
-
return certificatesActionService.request(failedAction.domains, failedAction.type, failedAction.contentType, failedAction.renew, {
|
|
143
|
-
company: failedAction.company,
|
|
144
|
-
project: failedAction.project,
|
|
145
|
-
user,
|
|
146
|
-
app,
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
return null;
|
|
150
|
-
}
|
|
151
18
|
async remove(_id, user, app) {
|
|
152
19
|
const domain = await this.model.db.findOne({ _id });
|
|
153
20
|
if (!domain)
|
|
@@ -156,29 +23,49 @@ class DomainsService extends Immutable {
|
|
|
156
23
|
throw new Error('DOMAIN_IS_DEFAULT');
|
|
157
24
|
return this.delete(_id, user, app);
|
|
158
25
|
}
|
|
159
|
-
linkCertificate(certificateInternalId, domain, company, project, user, app) {
|
|
160
|
-
return this.immutable({ domain, company, project }, { certificate: certificateInternalId }, user, 'change', app, undefined, undefined, 'setCertificate');
|
|
161
|
-
}
|
|
162
|
-
linkMultipleDomains(certificateInternalId, domains, company, project, user, app) {
|
|
163
|
-
const PROMISEARRAY = domains.map((domain) => this.linkCertificate(new ObjectId(certificateInternalId), domain, company, project, user, app));
|
|
164
|
-
return Promise.all(PROMISEARRAY);
|
|
165
|
-
}
|
|
166
26
|
/**
|
|
167
27
|
* In order to bind a domain to lilaquadrat STUDIO, the ownership of the domains needs to be validated.
|
|
168
28
|
* a TXT entry with ``lila-studio-SECRET`` needs to be added to the DNS
|
|
169
29
|
*/
|
|
170
30
|
async validateDnsSecret(domain, key) {
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
31
|
+
try {
|
|
32
|
+
const records = await dns.resolveTxt(domain);
|
|
33
|
+
const searchString = `lila-studio-${key}`;
|
|
34
|
+
return records.some(record => record.some(entry => entry.includes(searchString)));
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
// ENODATA means no TXT records exist, which means validation fails
|
|
38
|
+
if (error.code === 'ENODATA' || error.code === 'ENOTFOUND') {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
throw error;
|
|
42
|
+
}
|
|
174
43
|
}
|
|
175
|
-
/**
|
|
176
|
-
* In order to bind a domain to lilaquadrat STUDIO, the ownership of the domains needs to be validated.
|
|
177
|
-
* a TXT entry with ``lila-studio-SECRET`` needs to be added to the DNS
|
|
178
|
-
*/
|
|
179
44
|
async validateDnsARecord(domain, ip) {
|
|
180
|
-
|
|
181
|
-
|
|
45
|
+
try {
|
|
46
|
+
const records = await dns.resolve4(domain);
|
|
47
|
+
return records.some((record) => record.includes(ip));
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
// ENODATA/ENOTFOUND means no A records exist, which means validation fails
|
|
51
|
+
if (error.code === 'ENODATA' || error.code === 'ENOTFOUND') {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
throw error;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async validateDnsAAAARecord(domain, ip) {
|
|
58
|
+
try {
|
|
59
|
+
const records = await dns.resolve6(domain);
|
|
60
|
+
return records.some((record) => record.includes(ip));
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
// ENODATA/ENOTFOUND means no AAAA records exist, which means validation fails
|
|
64
|
+
if (error.code === 'ENODATA' || error.code === 'ENOTFOUND') {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
throw error;
|
|
68
|
+
}
|
|
182
69
|
}
|
|
183
70
|
getDefaultDomain(company, project, hostingDomain) {
|
|
184
71
|
return `${company}-${project}.${hostingDomain}`;
|
|
@@ -186,6 +73,25 @@ class DomainsService extends Immutable {
|
|
|
186
73
|
getAllDomains() {
|
|
187
74
|
return this.model.db.find().toArray();
|
|
188
75
|
}
|
|
76
|
+
/**
|
|
77
|
+
* returns a string of domains and if a domain is set as "main" it will be not in the last
|
|
78
|
+
* @param company
|
|
79
|
+
* @param project
|
|
80
|
+
* @returns
|
|
81
|
+
*/
|
|
82
|
+
async getDomainsWithMain(company, project) {
|
|
83
|
+
const allDomains = await this.getDomains(company, project);
|
|
84
|
+
const mainDomain = allDomains.find(domain => domain.isMain);
|
|
85
|
+
// If there's a main domain, exclude it from the domains array
|
|
86
|
+
// If there's no main domain, include all domains in the array
|
|
87
|
+
const domains = mainDomain
|
|
88
|
+
? allDomains.filter(domain => !domain.isMain).map(domain => domain.domain)
|
|
89
|
+
: allDomains.map(domain => domain.domain);
|
|
90
|
+
return {
|
|
91
|
+
domains,
|
|
92
|
+
main: mainDomain?.domain,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
189
95
|
createDefaultDomain(company, project, options) {
|
|
190
96
|
return this.immutableUpsert({
|
|
191
97
|
company,
|
|
@@ -200,430 +106,56 @@ class DomainsService extends Immutable {
|
|
|
200
106
|
validated: true,
|
|
201
107
|
}, options.user, 'create', options.app);
|
|
202
108
|
}
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
{
|
|
212
|
-
$match: {
|
|
213
|
-
$and: [
|
|
214
|
-
{
|
|
215
|
-
$expr: {
|
|
216
|
-
$eq: ['$project', project],
|
|
217
|
-
},
|
|
218
|
-
},
|
|
219
|
-
{
|
|
220
|
-
$expr: {
|
|
221
|
-
$eq: ['$company', company],
|
|
222
|
-
},
|
|
223
|
-
},
|
|
224
|
-
{
|
|
225
|
-
$expr: {
|
|
226
|
-
$eq: ['$active', true],
|
|
227
|
-
},
|
|
228
|
-
},
|
|
229
|
-
{
|
|
230
|
-
$expr: {
|
|
231
|
-
$eq: ['$validated', true],
|
|
232
|
-
},
|
|
233
|
-
},
|
|
234
|
-
],
|
|
235
|
-
},
|
|
236
|
-
},
|
|
237
|
-
{
|
|
238
|
-
$lookup: {
|
|
239
|
-
from: 'certificates',
|
|
240
|
-
as: 'certificate',
|
|
241
|
-
let: { certificateId: '$certificate' },
|
|
242
|
-
pipeline: [
|
|
243
|
-
{
|
|
244
|
-
$match: {
|
|
245
|
-
$and: [
|
|
246
|
-
{ $expr: { $eq: ['$_id', { $toObjectId: '$$certificateId' }] } },
|
|
247
|
-
],
|
|
248
|
-
},
|
|
249
|
-
},
|
|
250
|
-
{
|
|
251
|
-
$project: {
|
|
252
|
-
_id: 1,
|
|
253
|
-
domains: 1,
|
|
254
|
-
valid: 1,
|
|
255
|
-
type: 1,
|
|
256
|
-
contentType: 1,
|
|
257
|
-
filename: 1,
|
|
258
|
-
},
|
|
259
|
-
},
|
|
260
|
-
],
|
|
261
|
-
},
|
|
262
|
-
},
|
|
263
|
-
{
|
|
264
|
-
$unwind: {
|
|
265
|
-
path: '$certificate',
|
|
266
|
-
preserveNullAndEmptyArrays: true,
|
|
267
|
-
},
|
|
268
|
-
},
|
|
269
|
-
{
|
|
270
|
-
$project: {
|
|
271
|
-
history: 0,
|
|
272
|
-
},
|
|
273
|
-
},
|
|
274
|
-
{
|
|
275
|
-
$addFields: {
|
|
276
|
-
port: hostingPorts.port,
|
|
277
|
-
},
|
|
278
|
-
},
|
|
279
|
-
]).toArray();
|
|
280
|
-
}
|
|
281
|
-
/**
|
|
282
|
-
* get all domains from active hosting with ports and certificates
|
|
283
|
-
*/
|
|
284
|
-
async getAllDomainsWithPorts() {
|
|
285
|
-
return HostingModel.db.aggregate([
|
|
286
|
-
{
|
|
287
|
-
$match: {
|
|
288
|
-
$and: [
|
|
289
|
-
{
|
|
290
|
-
$expr: {
|
|
291
|
-
$eq: ['$active', true],
|
|
292
|
-
},
|
|
293
|
-
},
|
|
294
|
-
],
|
|
295
|
-
},
|
|
296
|
-
},
|
|
297
|
-
{
|
|
298
|
-
$lookup: {
|
|
299
|
-
from: 'domains',
|
|
300
|
-
as: 'domains',
|
|
301
|
-
let: {
|
|
302
|
-
company: '$company',
|
|
303
|
-
project: '$project',
|
|
109
|
+
single(internalId, options) {
|
|
110
|
+
if (options?.includeSecret) {
|
|
111
|
+
const aggregationArray = [
|
|
112
|
+
{
|
|
113
|
+
$match: {
|
|
114
|
+
_id: internalId,
|
|
115
|
+
company: options.company,
|
|
116
|
+
project: options.project,
|
|
304
117
|
},
|
|
305
|
-
pipeline: [
|
|
306
|
-
{
|
|
307
|
-
$match: {
|
|
308
|
-
$and: [
|
|
309
|
-
{ $expr: { $eq: ['$company', '$$company'] } },
|
|
310
|
-
{ $expr: { $eq: ['$project', '$$project'] } },
|
|
311
|
-
{ $expr: { $eq: ['$active', true] } },
|
|
312
|
-
],
|
|
313
|
-
},
|
|
314
|
-
},
|
|
315
|
-
{
|
|
316
|
-
$project: {
|
|
317
|
-
isDefault: 1,
|
|
318
|
-
domain: 1,
|
|
319
|
-
_id: 0,
|
|
320
|
-
},
|
|
321
|
-
},
|
|
322
|
-
],
|
|
323
118
|
},
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
{ $expr: { $eq: ['$_id', { $toObjectId: '$$certificateId' }] } },
|
|
335
|
-
],
|
|
336
|
-
},
|
|
337
|
-
},
|
|
338
|
-
{
|
|
339
|
-
$project: {
|
|
340
|
-
_id: 1,
|
|
341
|
-
domains: 1,
|
|
342
|
-
valid: 1,
|
|
343
|
-
type: 1,
|
|
344
|
-
contentType: 1,
|
|
345
|
-
filename: 1,
|
|
346
|
-
},
|
|
347
|
-
},
|
|
348
|
-
],
|
|
349
|
-
},
|
|
350
|
-
},
|
|
351
|
-
{
|
|
352
|
-
$unwind: {
|
|
353
|
-
path: '$certificate',
|
|
354
|
-
preserveNullAndEmptyArrays: true,
|
|
355
|
-
},
|
|
356
|
-
},
|
|
357
|
-
{
|
|
358
|
-
$project: {
|
|
359
|
-
history: 0,
|
|
360
|
-
},
|
|
361
|
-
},
|
|
362
|
-
]).toArray();
|
|
363
|
-
}
|
|
364
|
-
getCustomQuery(filter, options) {
|
|
365
|
-
const match = {};
|
|
366
|
-
const matchLate = {};
|
|
367
|
-
if (filter?.domain) {
|
|
368
|
-
match.domain = filter.domain;
|
|
369
|
-
}
|
|
370
|
-
if (filter?.filterState?.includes('certificateNeeded')) {
|
|
371
|
-
matchLate.certificateNeeded = true;
|
|
372
|
-
}
|
|
373
|
-
const aggregation = [
|
|
374
|
-
{
|
|
375
|
-
$match: match,
|
|
376
|
-
},
|
|
377
|
-
{
|
|
378
|
-
$project: {
|
|
379
|
-
secret: 0,
|
|
380
|
-
},
|
|
381
|
-
},
|
|
382
|
-
{
|
|
383
|
-
$lookup: {
|
|
384
|
-
from: 'certificates',
|
|
385
|
-
as: 'certificate',
|
|
386
|
-
let: { certificateId: '$certificate' },
|
|
387
|
-
pipeline: [
|
|
388
|
-
{
|
|
389
|
-
$match: {
|
|
390
|
-
$and: [
|
|
391
|
-
{ $expr: { $eq: ['$_id', { $toObjectId: '$$certificateId' }] } },
|
|
392
|
-
],
|
|
393
|
-
},
|
|
394
|
-
},
|
|
395
|
-
{
|
|
396
|
-
$addFields: {
|
|
397
|
-
'valid.isValid': {
|
|
398
|
-
$cond: [
|
|
399
|
-
{ $gt: ['$valid.to', new Date()] }, // condition
|
|
400
|
-
true, // value if true
|
|
401
|
-
false, // value if false
|
|
119
|
+
{
|
|
120
|
+
$lookup: {
|
|
121
|
+
from: 'secrets',
|
|
122
|
+
as: 'secret',
|
|
123
|
+
let: { referenceId: '$secret' },
|
|
124
|
+
pipeline: [
|
|
125
|
+
{
|
|
126
|
+
$match: {
|
|
127
|
+
$and: [
|
|
128
|
+
{ $expr: { $eq: ['$_id', '$$referenceId'] } },
|
|
402
129
|
],
|
|
403
130
|
},
|
|
404
131
|
},
|
|
405
|
-
},
|
|
406
|
-
{
|
|
407
|
-
$project: {
|
|
408
|
-
_id: 1,
|
|
409
|
-
domains: 1,
|
|
410
|
-
valid: 1,
|
|
411
|
-
},
|
|
412
|
-
},
|
|
413
|
-
],
|
|
414
|
-
},
|
|
415
|
-
},
|
|
416
|
-
{
|
|
417
|
-
$lookup: {
|
|
418
|
-
from: 'hosting',
|
|
419
|
-
as: 'hosting',
|
|
420
|
-
let: {
|
|
421
|
-
company: '$company',
|
|
422
|
-
project: '$project',
|
|
423
|
-
},
|
|
424
|
-
pipeline: [
|
|
425
|
-
{
|
|
426
|
-
$match: {
|
|
427
|
-
$and: [
|
|
428
|
-
{ $expr: { $eq: ['$company', '$$company'] } },
|
|
429
|
-
{ $expr: { $eq: ['$project', '$$project'] } },
|
|
430
|
-
],
|
|
431
|
-
},
|
|
432
|
-
},
|
|
433
|
-
{
|
|
434
|
-
$project: {
|
|
435
|
-
history: 0,
|
|
436
|
-
port: 0,
|
|
437
|
-
company: 0,
|
|
438
|
-
project: 0,
|
|
439
|
-
_id: 0,
|
|
440
|
-
},
|
|
441
|
-
},
|
|
442
|
-
],
|
|
443
|
-
},
|
|
444
|
-
},
|
|
445
|
-
{
|
|
446
|
-
$unwind: {
|
|
447
|
-
path: '$certificate',
|
|
448
|
-
preserveNullAndEmptyArrays: true,
|
|
449
|
-
},
|
|
450
|
-
},
|
|
451
|
-
{
|
|
452
|
-
$unwind: {
|
|
453
|
-
path: '$hosting',
|
|
454
|
-
preserveNullAndEmptyArrays: true,
|
|
455
|
-
},
|
|
456
|
-
},
|
|
457
|
-
{
|
|
458
|
-
$addFields: {
|
|
459
|
-
'certificateNeeded': {
|
|
460
|
-
$and: [
|
|
461
132
|
{
|
|
462
|
-
$
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
133
|
+
$project: {
|
|
134
|
+
key: 1,
|
|
135
|
+
id: 1,
|
|
136
|
+
_id: 0,
|
|
137
|
+
},
|
|
466
138
|
},
|
|
467
|
-
{ $eq: ['$hosting.active', true] },
|
|
468
|
-
{ $eq: ['$isDefault', false] },
|
|
469
139
|
],
|
|
470
140
|
},
|
|
471
141
|
},
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
142
|
+
{
|
|
143
|
+
$unwind: {
|
|
144
|
+
path: '$secret',
|
|
145
|
+
preserveNullAndEmptyArrays: true,
|
|
146
|
+
},
|
|
476
147
|
},
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
aggregation.push({
|
|
483
|
-
$sort: options.sort || { _id: -1 },
|
|
484
|
-
});
|
|
485
|
-
if (options.skip) { }
|
|
486
|
-
aggregation.push({
|
|
487
|
-
$skip: options.skip,
|
|
488
|
-
}, {
|
|
489
|
-
$limit: options.limit,
|
|
490
|
-
});
|
|
491
|
-
return { aggregation, countQuery: match };
|
|
492
|
-
}
|
|
493
|
-
/**
|
|
494
|
-
* add the ports to the domains
|
|
495
|
-
*/
|
|
496
|
-
mapPortToRealPorts(domains, port) {
|
|
497
|
-
return domains.map((single) => {
|
|
498
|
-
single.ports = {
|
|
499
|
-
http: port.http + (single.port || 0),
|
|
500
|
-
https: port.https + (single.port || 0),
|
|
501
|
-
};
|
|
502
|
-
return single;
|
|
503
|
-
});
|
|
504
|
-
}
|
|
505
|
-
/**
|
|
506
|
-
*
|
|
507
|
-
* map the database format to the working format
|
|
508
|
-
*/
|
|
509
|
-
mapDomains(domains) {
|
|
510
|
-
const mapped = {};
|
|
511
|
-
domains.forEach((single) => {
|
|
512
|
-
if (!mapped[`${single.company}${single.project}`]) {
|
|
513
|
-
mapped[`${single.company}${single.project}`] = {
|
|
514
|
-
domains: [],
|
|
515
|
-
company: single.company,
|
|
516
|
-
project: single.project,
|
|
517
|
-
port: single.port,
|
|
518
|
-
};
|
|
519
|
-
}
|
|
520
|
-
single.isDefault
|
|
521
|
-
? (mapped[`${single.company}${single.project}`].defaultDomain = single.domain)
|
|
522
|
-
: mapped[`${single.company}${single.project}`].domains.push(single.domain);
|
|
523
|
-
});
|
|
524
|
-
return Object.keys(mapped).map((key) => mapped[key]);
|
|
148
|
+
];
|
|
149
|
+
return this.model.db.aggregate(aggregationArray).toArray()
|
|
150
|
+
.then((document) => document[0] || undefined);
|
|
151
|
+
}
|
|
152
|
+
return this.model.db.findOne({ _id: internalId, company: options.company, project: options.project });
|
|
525
153
|
}
|
|
526
154
|
/**
|
|
527
|
-
*
|
|
528
|
-
* map the database format to the working format
|
|
155
|
+
* get all active and validated domains for specific project
|
|
529
156
|
*/
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
return null;
|
|
533
|
-
let defaultDomain;
|
|
534
|
-
const mappedHttp = {
|
|
535
|
-
domains: [],
|
|
536
|
-
company: domains[0]?.company,
|
|
537
|
-
project: domains[0]?.project,
|
|
538
|
-
port: options.http + domains[0]?.port,
|
|
539
|
-
};
|
|
540
|
-
const mappedHttps = [];
|
|
541
|
-
const redirectDomains = [];
|
|
542
|
-
domains.forEach((single) => {
|
|
543
|
-
if (single.isDefault) {
|
|
544
|
-
defaultDomain = {
|
|
545
|
-
domains: [{ domain: single.domain, company: domains[0]?.company, project: domains[0]?.project }],
|
|
546
|
-
company: domains[0]?.company,
|
|
547
|
-
project: domains[0]?.project,
|
|
548
|
-
isMain: single.isMain,
|
|
549
|
-
ports: {
|
|
550
|
-
http: options.http + single.port,
|
|
551
|
-
https: options.https + single.port,
|
|
552
|
-
},
|
|
553
|
-
};
|
|
554
|
-
return;
|
|
555
|
-
}
|
|
556
|
-
if (single.certificate) {
|
|
557
|
-
const certificate = single.certificate;
|
|
558
|
-
const httpsMapping = {
|
|
559
|
-
domains: [{ domain: single.domain, company: domains[0]?.company, project: domains[0]?.project }],
|
|
560
|
-
company: single.company,
|
|
561
|
-
project: single.project,
|
|
562
|
-
isMain: single.isMain,
|
|
563
|
-
port: options.https + single.port,
|
|
564
|
-
certificate: certificate.filename,
|
|
565
|
-
};
|
|
566
|
-
if (options.redirectToMainDomain && !single.isMain) {
|
|
567
|
-
redirectDomains.push(httpsMapping);
|
|
568
|
-
}
|
|
569
|
-
else {
|
|
570
|
-
mappedHttps.push(httpsMapping);
|
|
571
|
-
}
|
|
572
|
-
// if the certificate is created through the http challenge, the domain must always be reachable through http
|
|
573
|
-
if (certificate.type === 'domain') {
|
|
574
|
-
mappedHttp.domains.push({ domain: single.domain, company: domains[0]?.company, project: domains[0]?.project });
|
|
575
|
-
}
|
|
576
|
-
}
|
|
577
|
-
else {
|
|
578
|
-
mappedHttp.domains.push({ domain: single.domain, company: domains[0]?.company, project: domains[0]?.project });
|
|
579
|
-
}
|
|
580
|
-
});
|
|
581
|
-
const returnObject = {
|
|
582
|
-
http: mappedHttp,
|
|
583
|
-
https: mappedHttps,
|
|
584
|
-
defaultDomain,
|
|
585
|
-
redirectDomains,
|
|
586
|
-
};
|
|
587
|
-
return returnObject;
|
|
588
|
-
}
|
|
589
|
-
async getOrRequestForProject(company, project, options) {
|
|
590
|
-
const domains = await this.model.db.find({
|
|
591
|
-
company,
|
|
592
|
-
project,
|
|
593
|
-
validated: true,
|
|
594
|
-
active: true,
|
|
595
|
-
isDefault: false,
|
|
596
|
-
}).toArray();
|
|
597
|
-
return domains.map((single) => certificatesService.getOrRequest(single.domain, company, project, options.user, options.app));
|
|
598
|
-
}
|
|
599
|
-
async requestCertificateForDomain(internalId, options) {
|
|
600
|
-
const domain = await this.model.db.findOne({ _id: internalId });
|
|
601
|
-
if (!domain)
|
|
602
|
-
return null;
|
|
603
|
-
if (await certificatesActionService.actionExistsForDomain(domain.domain))
|
|
604
|
-
throw new Error('CERTIFICATEACTION_EXISTS');
|
|
605
|
-
if (!domain?.active && domain.company && domain.project)
|
|
606
|
-
throw new Error('DOMAIN_NOT_ACTIVE');
|
|
607
|
-
if (!domain?.validated)
|
|
608
|
-
throw new Error('DOMAIN_NOT_VALIDATED');
|
|
609
|
-
if (!domain.company && !domain.project) {
|
|
610
|
-
return certificatesActionService.request([domain.domain], 'wildcard', 'pem', true, {
|
|
611
|
-
app: options.app,
|
|
612
|
-
user: options.user,
|
|
613
|
-
forceFile: true,
|
|
614
|
-
timeout: 120,
|
|
615
|
-
});
|
|
616
|
-
}
|
|
617
|
-
else if (domain.company && domain.project) {
|
|
618
|
-
return certificatesActionService.request([domain.domain], 'domain', 'pem', true, {
|
|
619
|
-
...options,
|
|
620
|
-
company: domain.company,
|
|
621
|
-
project: domain.project,
|
|
622
|
-
forceFile: true,
|
|
623
|
-
timeout: 120,
|
|
624
|
-
});
|
|
625
|
-
}
|
|
626
|
-
return null;
|
|
157
|
+
async getDomains(company, project) {
|
|
158
|
+
return this.model.db.find({ company, project, active: true, validated: true }).toArray();
|
|
627
159
|
}
|
|
628
160
|
}
|
|
629
161
|
export default new DomainsService();
|