@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.
Files changed (212) hide show
  1. package/eslint.config.js +146 -0
  2. package/lib/fastify-plugins.d.ts +4 -0
  3. package/lib/fastify-plugins.js +5 -0
  4. package/lib/fastify-plugins.js.map +1 -0
  5. package/lib/helpers.d.ts +4 -2
  6. package/lib/helpers.js +13 -2
  7. package/lib/helpers.js.map +1 -1
  8. package/lib/main.d.ts +1 -3
  9. package/lib/main.js +7 -3
  10. package/lib/main.js.map +1 -1
  11. package/lib/models.d.ts +4 -4
  12. package/lib/models.js +4 -4
  13. package/lib/models.js.map +1 -1
  14. package/lib/services.d.ts +5 -8
  15. package/lib/services.js +27 -9
  16. package/lib/services.js.map +1 -1
  17. package/lib/src/Immutable.class.d.ts +8 -1
  18. package/lib/src/Immutable.class.js +52 -8
  19. package/lib/src/Immutable.class.js.map +1 -1
  20. package/lib/src/ShareClientFactory.class.d.ts +1 -3
  21. package/lib/src/ShareClientFactory.class.js +1 -9
  22. package/lib/src/ShareClientFactory.class.js.map +1 -1
  23. package/lib/src/classes/models.class.js.map +1 -1
  24. package/lib/src/classes/modelv2.class.d.ts +2 -0
  25. package/lib/src/classes/modelv2.class.js +1 -1
  26. package/lib/src/classes/modelv2.class.js.map +1 -1
  27. package/lib/src/classes/mongo.class.js +4 -14
  28. package/lib/src/classes/mongo.class.js.map +1 -1
  29. package/lib/src/functions/handleError.d.ts +2 -3
  30. package/lib/src/functions/handleError.js +3 -16
  31. package/lib/src/functions/handleError.js.map +1 -1
  32. package/lib/src/functions/optionsHelper.d.ts +4 -4
  33. package/lib/src/functions/optionsHelper.js +5 -4
  34. package/lib/src/functions/optionsHelper.js.map +1 -1
  35. package/lib/src/functions/respondCode.d.ts +2 -1
  36. package/lib/src/functions/respondCode.js +1 -1
  37. package/lib/src/functions/respondCode.js.map +1 -1
  38. package/lib/src/helpers/ControllerHelper.d.ts +73 -0
  39. package/lib/src/helpers/ControllerHelper.js +242 -0
  40. package/lib/src/helpers/ControllerHelper.js.map +1 -0
  41. package/lib/src/helpers/EnvMapper.d.ts +0 -0
  42. package/lib/src/helpers/EnvMapper.js +1 -0
  43. package/lib/src/helpers/EnvMapper.js.map +1 -0
  44. package/lib/src/helpers/auth0config.d.ts +6 -0
  45. package/lib/src/helpers/auth0config.js +23 -0
  46. package/lib/src/helpers/auth0config.js.map +1 -0
  47. package/lib/src/helpers/authPlugin.d.ts +29 -0
  48. package/lib/src/helpers/authPlugin.js +77 -0
  49. package/lib/src/helpers/authPlugin.js.map +1 -0
  50. package/lib/src/helpers/cacheHelper.d.ts +69 -0
  51. package/lib/src/helpers/cacheHelper.js +235 -0
  52. package/lib/src/helpers/cacheHelper.js.map +1 -0
  53. package/lib/src/helpers/createSasToken.d.ts +0 -2
  54. package/lib/src/helpers/createSasToken.js +35 -32
  55. package/lib/src/helpers/createSasToken.js.map +1 -1
  56. package/lib/src/helpers/getSecrets.d.ts +1 -1
  57. package/lib/src/helpers/getSecrets.js +10 -12
  58. package/lib/src/helpers/getSecrets.js.map +1 -1
  59. package/lib/src/helpers/queryAssertionPlugin.d.ts +3 -0
  60. package/lib/src/helpers/queryAssertionPlugin.js +20 -0
  61. package/lib/src/helpers/queryAssertionPlugin.js.map +1 -0
  62. package/lib/src/helpers/safeObjectId.d.ts +1 -1
  63. package/lib/src/helpers/safeObjectId.js +5 -1
  64. package/lib/src/helpers/safeObjectId.js.map +1 -1
  65. package/lib/src/helpers/storageSdkFactory.d.ts +2 -0
  66. package/lib/src/helpers/storageSdkFactory.js +11 -0
  67. package/lib/src/helpers/storageSdkFactory.js.map +1 -0
  68. package/lib/src/helpers/studioAppPlugin.d.ts +3 -0
  69. package/lib/src/helpers/studioAppPlugin.js +16 -0
  70. package/lib/src/helpers/studioAppPlugin.js.map +1 -0
  71. package/lib/src/logger.js +154 -32
  72. package/lib/src/logger.js.map +1 -1
  73. package/lib/src/models/customers.model.js +14 -4
  74. package/lib/src/models/customers.model.js.map +1 -1
  75. package/lib/src/models/design.model.d.ts +4 -0
  76. package/lib/src/models/design.model.js +58 -0
  77. package/lib/src/models/design.model.js.map +1 -0
  78. package/lib/src/models/domain.model.js +1 -1
  79. package/lib/src/models/domain.model.js.map +1 -1
  80. package/lib/src/models/editor.model.js +7 -0
  81. package/lib/src/models/editor.model.js.map +1 -1
  82. package/lib/src/models/emailLimit.model.d.ts +4 -0
  83. package/lib/src/models/emailLimit.model.js +31 -0
  84. package/lib/src/models/emailLimit.model.js.map +1 -0
  85. package/lib/src/models/hosting.model.js +1 -3
  86. package/lib/src/models/hosting.model.js.map +1 -1
  87. package/lib/src/models/hostingSettings.model.js +6 -4
  88. package/lib/src/models/hostingSettings.model.js.map +1 -1
  89. package/lib/src/models/invoice.model.d.ts +4 -0
  90. package/lib/src/models/invoice.model.js +235 -0
  91. package/lib/src/models/invoice.model.js.map +1 -0
  92. package/lib/src/models/mailFrom.model.js +53 -10
  93. package/lib/src/models/mailFrom.model.js.map +1 -1
  94. package/lib/src/models/project.model.js +2 -4
  95. package/lib/src/models/project.model.js.map +1 -1
  96. package/lib/src/models/publish-method.model.js +79 -430
  97. package/lib/src/models/publish-method.model.js.map +1 -1
  98. package/lib/src/models/storage.model.js +11 -3
  99. package/lib/src/models/storage.model.js.map +1 -1
  100. package/lib/src/prompts/textGeneration.js +88 -0
  101. package/lib/src/prompts/textGeneration.js.map +1 -1
  102. package/lib/src/prompts/textGenerationMulti.js +78 -44
  103. package/lib/src/prompts/textGenerationMulti.js.map +1 -1
  104. package/lib/src/services/access.service.d.ts +0 -37
  105. package/lib/src/services/access.service.js +119 -108
  106. package/lib/src/services/access.service.js.map +1 -1
  107. package/lib/src/services/ai.service.d.ts +4 -3
  108. package/lib/src/services/ai.service.js +22 -29
  109. package/lib/src/services/ai.service.js.map +1 -1
  110. package/lib/src/services/auth.service.d.ts +10 -0
  111. package/lib/src/services/auth.service.js +63 -0
  112. package/lib/src/services/auth.service.js.map +1 -0
  113. package/lib/src/services/conf.service.d.ts +3 -31
  114. package/lib/src/services/conf.service.js +58 -167
  115. package/lib/src/services/conf.service.js.map +1 -1
  116. package/lib/src/services/customers.service.d.ts +8 -4
  117. package/lib/src/services/customers.service.js +34 -7
  118. package/lib/src/services/customers.service.js.map +1 -1
  119. package/lib/src/services/designs.service.d.ts +7 -0
  120. package/lib/src/services/designs.service.js +10 -0
  121. package/lib/src/services/designs.service.js.map +1 -0
  122. package/lib/src/services/domains.service.d.ts +18 -91
  123. package/lib/src/services/domains.service.js +91 -559
  124. package/lib/src/services/domains.service.js.map +1 -1
  125. package/lib/src/services/editor.service.d.ts +4 -0
  126. package/lib/src/services/editor.service.js +28 -0
  127. package/lib/src/services/editor.service.js.map +1 -1
  128. package/lib/src/services/emailLimit.service.d.ts +21 -0
  129. package/lib/src/services/emailLimit.service.js +51 -0
  130. package/lib/src/services/emailLimit.service.js.map +1 -0
  131. package/lib/src/services/hosting.service.d.ts +12 -24
  132. package/lib/src/services/hosting.service.js +32 -122
  133. package/lib/src/services/hosting.service.js.map +1 -1
  134. package/lib/src/services/hostingAdmin.service.d.ts +1 -1
  135. package/lib/src/services/hostingAdmin.service.js +2 -2
  136. package/lib/src/services/hostingAdmin.service.js.map +1 -1
  137. package/lib/src/services/import.service.d.ts +6 -22
  138. package/lib/src/services/import.service.js +63 -65
  139. package/lib/src/services/import.service.js.map +1 -1
  140. package/lib/src/services/invoices.service.d.ts +30 -0
  141. package/lib/src/services/invoices.service.js +265 -0
  142. package/lib/src/services/invoices.service.js.map +1 -0
  143. package/lib/src/services/jetstream.service.d.ts +5 -3
  144. package/lib/src/services/jetstream.service.js +63 -7
  145. package/lib/src/services/jetstream.service.js.map +1 -1
  146. package/lib/src/services/listParticipants.service.d.ts +2 -5
  147. package/lib/src/services/listParticipants.service.js +17 -14
  148. package/lib/src/services/listParticipants.service.js.map +1 -1
  149. package/lib/src/services/mailFrom.service.d.ts +14 -1
  150. package/lib/src/services/mailFrom.service.js +55 -0
  151. package/lib/src/services/mailFrom.service.js.map +1 -1
  152. package/lib/src/services/me.service.d.ts +22 -12
  153. package/lib/src/services/me.service.js +58 -89
  154. package/lib/src/services/me.service.js.map +1 -1
  155. package/lib/src/services/publish.service.d.ts +3 -7
  156. package/lib/src/services/publish.service.js +32 -32
  157. package/lib/src/services/publish.service.js.map +1 -1
  158. package/lib/src/services/publishData.service.d.ts +10 -7
  159. package/lib/src/services/publishData.service.js +32 -75
  160. package/lib/src/services/publishData.service.js.map +1 -1
  161. package/lib/src/services/spamAnalasys.service.d.ts +4 -4
  162. package/lib/src/services/spamAnalasys.service.js +36 -44
  163. package/lib/src/services/spamAnalasys.service.js.map +1 -1
  164. package/lib/src/services/storage.service.d.ts +22 -29
  165. package/lib/src/services/storage.service.js +123 -57
  166. package/lib/src/services/storage.service.js.map +1 -1
  167. package/lib/src/services/structures.service.d.ts +1 -1
  168. package/lib/src/services/upload.service.js +6 -1
  169. package/lib/src/services/upload.service.js.map +1 -1
  170. package/package.json +28 -29
  171. package/lib/src/AzureBlobStorage.share.d.ts +0 -19
  172. package/lib/src/AzureBlobStorage.share.js +0 -162
  173. package/lib/src/AzureBlobStorage.share.js.map +0 -1
  174. package/lib/src/AzureFileStorage.share.d.ts +0 -22
  175. package/lib/src/AzureFileStorage.share.js +0 -139
  176. package/lib/src/AzureFileStorage.share.js.map +0 -1
  177. package/lib/src/AzureVault.d.ts +0 -14
  178. package/lib/src/AzureVault.js +0 -28
  179. package/lib/src/AzureVault.js.map +0 -1
  180. package/lib/src/dns.challenge.class.d.ts +0 -17
  181. package/lib/src/dns.challenge.class.js +0 -41
  182. package/lib/src/dns.challenge.class.js.map +0 -1
  183. package/lib/src/http.challenge.class.d.ts +0 -33
  184. package/lib/src/http.challenge.class.js +0 -58
  185. package/lib/src/http.challenge.class.js.map +0 -1
  186. package/lib/src/models/certificate-action.model.d.ts +0 -5
  187. package/lib/src/models/certificate-action.model.js +0 -230
  188. package/lib/src/models/certificate-action.model.js.map +0 -1
  189. package/lib/src/models/certificate.model.d.ts +0 -4
  190. package/lib/src/models/certificate.model.js +0 -96
  191. package/lib/src/models/certificate.model.js.map +0 -1
  192. package/lib/src/models/editorBase.model.d.ts +0 -4
  193. package/lib/src/models/editorBase.model.js +0 -39
  194. package/lib/src/models/editorBase.model.js.map +0 -1
  195. package/lib/src/services/certificates.service.d.ts +0 -56
  196. package/lib/src/services/certificates.service.js +0 -169
  197. package/lib/src/services/certificates.service.js.map +0 -1
  198. package/lib/src/services/certificatesAction.service.d.ts +0 -41
  199. package/lib/src/services/certificatesAction.service.js +0 -188
  200. package/lib/src/services/certificatesAction.service.js.map +0 -1
  201. package/lib/src/services/editorBase.service.d.ts +0 -46
  202. package/lib/src/services/editorBase.service.js +0 -161
  203. package/lib/src/services/editorBase.service.js.map +0 -1
  204. package/lib/src/services/handleFile.service.d.ts +0 -9
  205. package/lib/src/services/handleFile.service.js +0 -45
  206. package/lib/src/services/handleFile.service.js.map +0 -1
  207. package/lib/src/services/media.service.d.ts +0 -35
  208. package/lib/src/services/media.service.js +0 -418
  209. package/lib/src/services/media.service.js.map +0 -1
  210. package/lib/src/services/share.service.d.ts +0 -6
  211. package/lib/src/services/share.service.js +0 -4
  212. 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
- const records = await dns.resolveTxt(domain);
172
- const searchString = `lila-studio-${key}`;
173
- return records.some(record => record.some(entry => entry.includes(searchString)));
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
- const records = await dns.resolve4(domain);
181
- return records.some((record) => record.includes(ip));
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
- * get all domains for specific project with ports and certificates
205
- */
206
- async getDomainsWithPorts(company, project) {
207
- const hostingPorts = await HostingModel.db.findOne({ company, project, active: true });
208
- if (!hostingPorts)
209
- return [];
210
- return this.model.db.aggregate([
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
- $lookup: {
327
- from: 'certificates',
328
- as: 'certificate',
329
- let: { certificateId: '$certificate' },
330
- pipeline: [
331
- {
332
- $match: {
333
- $and: [
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
- $or: [
463
- { $eq: ['$certificate.valid.isValid', false] },
464
- { $eq: [{ $type: '$certificate.valid.isValid' }, 'missing'] },
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
- $project: {
475
- history: 0,
142
+ {
143
+ $unwind: {
144
+ path: '$secret',
145
+ preserveNullAndEmptyArrays: true,
146
+ },
476
147
  },
477
- },
478
- {
479
- $match: matchLate,
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
- mapDomainsProject(domains, options) {
531
- if (!domains.length)
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();