@lilaquadrat/studio 10.0.0-beta.9 → 10.1.0

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