@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,19 +1,18 @@
1
- import OpenAI from 'openai';
2
1
  import textGeneration from '../prompts/textGeneration.js';
3
2
  import textGenerationMulti from '../prompts/textGenerationMulti.js';
4
3
  import ProjectModel from '../models/project.model.js';
5
4
  import LoggingService from './logging.service.js';
6
5
  import LoggingModel from '../models/logging.model.js';
7
6
  import dayjs from 'dayjs';
7
+ import { GoogleGenAI, ThinkingLevel } from '@google/genai';
8
8
  export class Ai {
9
- constructor(provider, key) {
9
+ constructor(key, model) {
10
10
  if (key) {
11
- if (provider === 'openai') {
12
- this.provider = new OpenAI({
13
- apiKey: key,
14
- });
15
- }
11
+ this.provider = new GoogleGenAI({
12
+ apiKey: key,
13
+ });
16
14
  }
15
+ this.model = model;
17
16
  }
18
17
  async tokenUsage(date, options) {
19
18
  if (date) {
@@ -65,36 +64,30 @@ export class Ai {
65
64
  return { input: 0, output: 0, calls: 0 };
66
65
  }
67
66
  async generateTextForProject(input, instructions, element, context, options) {
68
- const projectContext = await ProjectModel.db.findOne({ id: options.project }, { projection: { aiDescription: 1, aiTone: 1 } });
67
+ const projectContext = await ProjectModel.db.findOne({ company: options.company, id: options.project }, { projection: { aiDescription: 1, aiTone: 1 } });
69
68
  return this.generateText(input, instructions, element, { ...context, project: projectContext?.aiDescription, tone: projectContext?.aiTone }, options);
70
69
  }
71
70
  async generateText(input, instructions, element, context, options) {
72
71
  const content = options.type === 'single' ? textGeneration(input, element, context) : textGenerationMulti(input, context);
73
- const response = await this.provider.chat.completions.create({
74
- model: 'gpt-4.1-mini',
75
- response_format: { type: 'json_object' },
76
- store: true,
77
- messages: [
78
- {
79
- role: 'system',
80
- content,
72
+ const response = await this.provider.models.generateContent({
73
+ model: this.model,
74
+ config: {
75
+ systemInstruction: content,
76
+ thinkingConfig: {
77
+ thinkingLevel: ThinkingLevel.LOW,
81
78
  },
82
- {
83
- role: 'user',
84
- content: JSON.stringify({
85
- input,
86
- instructions,
87
- context,
88
- }),
89
- },
90
- ],
91
- }, {
92
- timeout: 30000,
79
+ responseMimeType: 'application/json'
80
+ },
81
+ contents: JSON.stringify({
82
+ input,
83
+ instructions,
84
+ context,
85
+ }),
93
86
  });
94
87
  await LoggingService.add({ input: { input, instructions, context }, response }, { type: 'ai', company: options.company, project: options.project, app: options.app, user: options.user });
95
- const responseData = JSON.parse(response.choices[0].message?.content);
88
+ const responseData = JSON.parse(response.text);
96
89
  return { output: responseData.input };
97
90
  }
98
91
  }
99
- export default new Ai('openai', process.env.OPENAI_API_KEY);
92
+ export default new Ai(process.env.GOOGLE_API_KEY, process.env.AI_MODEL);
100
93
  //# sourceMappingURL=ai.service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ai.service.js","sourceRoot":"","sources":["../../../src/services/ai.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ai.service.js","sourceRoot":"","sources":["../../../src/services/ai.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ declare class AuthService {
2
+ private tokenCache;
3
+ url: string;
4
+ constructor(url: string);
5
+ token(clientId: string, clientSecret: string): Promise<string>;
6
+ getToken(clientId: string, clientSecret: string): Promise<string>;
7
+ private buildTokenUrl;
8
+ }
9
+ declare const _default: AuthService;
10
+ export default _default;
@@ -0,0 +1,63 @@
1
+ import logger from "../logger.js";
2
+ import querystring from 'querystring';
3
+ class AuthService {
4
+ constructor(url) {
5
+ this.tokenCache = null;
6
+ this.url = url;
7
+ }
8
+ async token(clientId, clientSecret) {
9
+ // Check if we have a valid cached token
10
+ if (this.tokenCache && Date.now() < this.tokenCache.expiresAt) {
11
+ logger.debug('authservice.token.cached');
12
+ return this.tokenCache.accessToken;
13
+ }
14
+ // No valid token, fetch a new one and return it directly
15
+ logger.debug('authservice.token.fetching');
16
+ return await this.getToken(clientId, clientSecret);
17
+ }
18
+ async getToken(clientId, clientSecret) {
19
+ if (!this.url)
20
+ throw new Error('OAUTH_URL is not configured');
21
+ const tokenUrl = this.buildTokenUrl();
22
+ const body = querystring.stringify({
23
+ client_id: clientId,
24
+ client_secret: clientSecret,
25
+ audience: 'https://editor.lilaquadrat.de/api',
26
+ grant_type: 'client_credentials',
27
+ });
28
+ const response = await fetch(tokenUrl, {
29
+ method: 'POST',
30
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
31
+ body,
32
+ });
33
+ if (!response.ok) {
34
+ const errorData = await response.json().catch(() => ({}));
35
+ logger.error({ message: 'Token request failed', status: response.status, errorData });
36
+ throw new Error(`Token request failed with status ${response.status}`);
37
+ }
38
+ const token = await response.json();
39
+ if (!token.access_token || !token.expires_in) {
40
+ logger.error({ message: 'Invalid token response', token });
41
+ throw new Error('Invalid token response from OAuth server');
42
+ }
43
+ this.tokenCache = {
44
+ accessToken: token.access_token,
45
+ expiresAt: Date.now() + (token.expires_in - 60) * 1000,
46
+ };
47
+ logger.debug('authservice.token.get.success');
48
+ return token.access_token;
49
+ }
50
+ buildTokenUrl() {
51
+ try {
52
+ const url = new URL(`https://${this.url}/oauth/token`);
53
+ logger.debug(`authservice.token.url: ${url.toString()}`);
54
+ return url.toString();
55
+ }
56
+ catch (error) {
57
+ logger.error({ message: 'Invalid OAUTH_URL', url: this.url, error });
58
+ throw new Error(`Invalid OAUTH_URL: ${this.url}`);
59
+ }
60
+ }
61
+ }
62
+ export default new AuthService(process.env.OAUTH_URL);
63
+ //# sourceMappingURL=auth.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.service.js","sourceRoot":"","sources":["../../../src/services/auth.service.ts"],"names":[],"mappings":"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"}
@@ -1,35 +1,7 @@
1
- import { ShareClientInterface, DomainConf, HostingWithSettings } from '@lilaquadrat/interfaces';
2
1
  export declare class ConfService {
3
- shareClient: ShareClientInterface;
4
- /**
5
- *
6
- * load the base nginx conf file for further rendering
7
- */
8
- getBase(folder: string, name: string): Promise<Buffer<ArrayBufferLike>>;
9
- constructor();
10
- /**
11
- * generates nginx config
12
- *
13
- */
14
- render(http: DomainConf | undefined, https: DomainConf[] | undefined, defaultDomain: DomainConf | undefined, redirectDomains: DomainConf[] | undefined, company: string, project: string, baseConf: string, hosting?: HostingWithSettings): string;
15
- renderStreamConf(domains: DomainConf[], confString: string): string;
16
- getComposeObject(domains: DomainConf[], baseFolder: string, image?: string): {
17
- [key: string]: any;
18
- };
19
- getKey(company: string, project: string): string;
20
- validateDomains(domains: string[]): string[];
21
- /**
22
- * validate domains and remove double entries
23
- */
24
- validateStreamDomains(domains: DomainConf[]): DomainConf[];
25
- /**
26
- * docker: docker, stream: nginx main stream conf, proxy: nginx main proxy config, project: project nginx
27
- */
28
- refresh(type: 'project', company: string, project: string): Promise<boolean>;
29
- refresh(type: 'docker' | 'stream' | 'proxy'): Promise<boolean>;
30
- refreshDockerCompose(base?: string): Promise<boolean>;
31
- refreshNginx(type: 'stream' | 'proxy' | 'project', company: string | undefined, project: string | undefined): Promise<boolean>;
32
- createFolderRecursive(base: string, path: string): Promise<boolean>;
2
+ refresh(company: string, project: string): Promise<void>;
3
+ generate(company: string, project: string): Promise<Buffer<ArrayBuffer> | undefined>;
4
+ remove(company: string, project: string): Promise<void>;
33
5
  }
34
6
  declare const _default: ConfService;
35
7
  export default _default;
@@ -1,181 +1,72 @@
1
1
  import handlebars from 'handlebars';
2
- import ShareClientFactory from '../ShareClientFactory.class.js';
3
- import DomainsService from './domains.service.js';
2
+ import domainsService from "./domains.service.js";
3
+ import storageSdkFactory from '../helpers/storageSdkFactory.js';
4
+ import StorageService from './storage.service.js';
4
5
  import HostingService from './hosting.service.js';
5
6
  export class ConfService {
6
- /**
7
- *
8
- * load the base nginx conf file for further rendering
9
- */
10
- getBase(folder, name) {
11
- return this.shareClient.get(folder, name);
12
- }
13
- constructor() {
14
- this.shareClient = ShareClientFactory('azureStorage', {
15
- connectionString: process.env.HOSTING_STORAGE_CONNECTION,
16
- shareName: 'customer-apps',
17
- accountName: process.env.STORAGE_ACCOUNT,
18
- });
19
- }
20
- /**
21
- * generates nginx config
22
- *
23
- */
24
- render(http, https, defaultDomain, redirectDomains, company, project, baseConf, hosting) {
25
- const template = handlebars.compile(baseConf);
26
- const conf = template({
27
- http, https, company, project, defaultDomain, hosting, redirectDomains,
28
- }).trim();
29
- if (conf.length === 0) {
30
- return `#
31
- #
32
- # NO CONF CONTENT
33
- #
34
- #
35
- `;
36
- }
37
- return conf;
38
- }
39
- renderStreamConf(domains, confString) {
40
- const template = handlebars.compile(confString);
41
- const conf = template({
42
- domains,
43
- }).trim();
44
- if (conf.length === 0) {
45
- return `#
46
- #
47
- # NO CONF CONTENT
48
- #
49
- #
50
- `;
51
- }
52
- return conf;
53
- }
54
- getComposeObject(domains, baseFolder, image = 'nginx:alpine') {
55
- const composeObject = {
56
- version: '3',
57
- services: {},
58
- };
59
- domains.map((domain) => {
60
- const domainObject = {
61
- image,
62
- container_name: this.getKey(domain.company, domain.project),
63
- ports: [
64
- `${domain.ports?.http}:80`,
65
- `${domain.ports?.https}:443`,
66
- ],
67
- volumes: [
68
- `${baseFolder}/${domain.company}/${domain.project}/hosting:/var/www/hosting:ro`,
69
- `${baseFolder}/${domain.company}/${domain.project}/conf:/etc/nginx/conf.d/`,
70
- `${baseFolder}/${domain.company}/${domain.project}/certs:/var/www/certs`,
71
- '/base/data/certs:/var/www/base/certs',
72
- ],
73
- };
74
- composeObject.services[this.getKey(domain.company, domain.project)] = domainObject;
75
- return domainObject;
7
+ async refresh(company, project) {
8
+ const storageSdk = await storageSdkFactory();
9
+ const confBuffer = await this.generate(company, project);
10
+ if (!confBuffer)
11
+ throw new Error('CONF_FAILED');
12
+ await storageSdk.upload({
13
+ pathOrBuffer: confBuffer,
14
+ filename: `{company}-${project}.caddy`,
15
+ relativePath: `caddy/customers/${company}-${project}.caddy`,
16
+ mimetype: 'text/plain',
17
+ size: confBuffer.length,
18
+ }, {
19
+ app: 'internal',
20
+ company: 'lilaquadrat',
21
+ project: 'studio',
22
+ overwrite: true
76
23
  });
77
- return composeObject;
78
24
  }
79
- getKey(company, project) {
80
- return `${company}-${project}`;
81
- }
82
- validateDomains(domains) {
83
- const fileredDomains = [...new Set(domains)];
84
- return fileredDomains.filter((domain) => {
85
- if (!domain)
86
- return false;
87
- if (!domain.length)
88
- return false;
89
- return true;
90
- });
91
- }
92
- /**
93
- * validate domains and remove double entries
94
- */
95
- validateStreamDomains(domains) {
96
- const filteredDomains = [];
97
- domains.map((domain) => {
98
- /**
99
- * skip all with missing values
100
- */
101
- if (!domain)
102
- return false;
103
- if (!domain?.domains?.length)
104
- return false;
105
- if (!domain.company.length)
106
- return false;
107
- if (!domain.project.length)
108
- return false;
109
- if (!domain.ports?.http)
110
- return false;
111
- if (!domain.ports?.https)
112
- return false;
113
- /**
114
- * skip double entries
115
- */
116
- const unique = filteredDomains.filter((searchDomain) => {
117
- // if (domain.domains.includes(searchDomain.domain)) return true;
118
- if (searchDomain.company === domain.company && searchDomain.project === domain.project)
119
- return true;
120
- if (searchDomain.port === domain.port)
121
- return true;
122
- return false;
25
+ async generate(company, project) {
26
+ const storageSdk = await storageSdkFactory();
27
+ let template;
28
+ try {
29
+ template = await storageSdk.download({
30
+ company: 'lilaquadrat',
31
+ project: 'studio',
32
+ app: 'internal',
33
+ filename: 'customers.caddy.hbs',
34
+ prefix: 'caddy'
123
35
  });
124
- if (unique.length)
125
- return false;
126
- return filteredDomains.push(domain);
127
- });
128
- return filteredDomains;
129
- }
130
- refresh(type, company, project) {
131
- if (type === 'docker') {
132
- return this.refreshDockerCompose();
133
36
  }
134
- if (['stream', 'proxy', 'project'].includes(type)) {
135
- return this.refreshNginx(type, company, project);
37
+ catch (error) {
38
+ console.error(error);
39
+ return;
136
40
  }
137
- return null;
138
- }
139
- async refreshDockerCompose(base = '/base/data/user') {
140
- const domains = await HostingService.getActive();
141
- const mappedDomains = DomainsService.mapPortToRealPorts(domains, { http: 8000, https: 9000 });
142
- return this.shareClient.create('', 'docker-compose.json', JSON.stringify(this.getComposeObject(mappedDomains, base)));
143
- }
144
- async refreshNginx(type, company, project) {
145
- let template = '';
146
- let targetFile = '';
147
- let targetFolder = '';
148
- let renderedConf = '';
149
- if (type === 'stream') {
150
- template = 'stream.conf';
151
- targetFile = 'stream.conf';
152
- targetFolder = 'conf';
153
- }
154
- if (type === 'proxy') {
155
- template = 'proxy_http.conf';
156
- targetFile = 'proxy_http.conf';
157
- targetFolder = 'conf';
158
- }
159
- if (type === 'project') {
160
- template = '.conf';
161
- targetFile = 'nginx.conf';
162
- targetFolder = `user/${company}/${project}/conf`;
163
- }
164
- const confBase = (await this.getBase('base', template)).toString();
165
- if (type === 'stream' || type === 'proxy') {
166
- const domains = await DomainsService.getAllDomainsWithPorts();
167
- renderedConf = this.renderStreamConf(DomainsService.mapPortToRealPorts(domains, { http: 8000, https: 9000 }), confBase);
41
+ const hosting = await HostingService.single(company, project);
42
+ const domains = await domainsService.getDomainsWithMain(company, project);
43
+ const templateVars = {
44
+ company,
45
+ project,
46
+ domains: domains.domains,
47
+ isApp: hosting?.isApp
48
+ };
49
+ if (!domains.domains?.length && !domains.main)
50
+ throw new Error('NO_DOMAINS');
51
+ /**
52
+ * only add the redirect block if we have a main domain and domain to redirect
53
+ */
54
+ if (domains.main && domains.domains.length) {
55
+ templateVars.mainDomain = domains.main;
168
56
  }
169
- if (type === 'project' && company && project) {
170
- const hosting = await HostingService.single(company, project);
171
- const domains = await DomainsService.getDomainsWithPorts(company, project);
172
- const mappedDomains = DomainsService.mapDomainsProject(domains, { http: 8000, https: 9000, redirectToMainDomain: hosting?.redirectToMainDomain });
173
- renderedConf = this.render(mappedDomains?.http, mappedDomains?.https, mappedDomains?.defaultDomain, mappedDomains?.redirectDomains, company, project, confBase);
57
+ else if (domains.main && !domains.domains.length) {
58
+ templateVars.domains.push(domains.main);
174
59
  }
175
- return this.shareClient.create(targetFolder, targetFile, renderedConf);
60
+ const compiledTemplate = handlebars.compile(template.toString());
61
+ const conf = compiledTemplate(templateVars).trim();
62
+ return Buffer.from(conf);
176
63
  }
177
- createFolderRecursive(base, path) {
178
- return this.shareClient.createFolder(base, path);
64
+ async remove(company, project) {
65
+ const conf = await StorageService.getByFilename(`${company}-${project}.caddy`, 'caddy/customers', 'internal', { company: 'lilaquadrat', project: 'studio' });
66
+ if (!conf || !conf._id)
67
+ return;
68
+ const storageSdk = await storageSdkFactory();
69
+ await storageSdk.remove(conf._id.toString(), { company: 'lilaquadrat', project: 'studio', app: 'internal' });
179
70
  }
180
71
  }
181
72
  export default new ConfService();
@@ -1 +1 @@
1
- {"version":3,"file":"conf.service.js","sourceRoot":"","sources":["../../../src/services/conf.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"conf.service.js","sourceRoot":"","sources":["../../../src/services/conf.service.ts"],"names":[],"mappings":"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"}
@@ -41,6 +41,8 @@ export declare class CustomersService extends Immutable<CustomerPerson | Custome
41
41
  * also sets an email confirmation code if none exists
42
42
  */
43
43
  getMe(account: string, company: string, options: Required<UserAppWithOptions>): Promise<BasicData<CustomerPerson>>;
44
+ resendConfirmationEmail(account: string, company: string, options: Required<UserAppWithOptions>): Promise<boolean>;
45
+ sendConfirmationEmail(customerId: ObjectId, options: Required<UserAppWithOptions>): Promise<void | CreateResult<BasicData<import("@lilaquadrat/interfaces").Publish>>>;
44
46
  isConnected(account: string, app: string): Promise<boolean>;
45
47
  emailConfirmed(account: string, app: string): Promise<boolean>;
46
48
  getCustomerByAccount(account: string, app: string, projection?: Record<string, number>): Promise<WithId<Customers> | null>;
@@ -49,18 +51,20 @@ export declare class CustomersService extends Immutable<CustomerPerson | Custome
49
51
  /**
50
52
  * connects a auth0 account with a customer
51
53
  */
52
- connectToAccount(internalId: ObjectId, account: string, options: Required<UserAppWithOptions>): Promise<UpdateResult<BasicData<CustomerCompany | CustomerPerson>>>;
54
+ connectToAccount(internalId: ObjectId, account: string, options: Required<UserAppWithOptions>): Promise<UpdateResult<import("bson").Document>>;
53
55
  /**
54
56
  * connects a auth0 account with a customer
55
57
  */
56
- confirmEmail(account: string, emailConfirmationCode: string, options: Required<UserAppWithOptions>): Promise<UpdateResult<BasicData<CustomerCompany | CustomerPerson>>>;
57
- disconnectFromAccount(internalId: ObjectId, account: string, options: Required<UserAppWithOptions>): Promise<UpdateResult<BasicData<CustomerCompany | CustomerPerson>>>;
58
+ confirmEmail(account: string, emailConfirmationCode: string, options: Required<UserAppWithOptions>): Promise<UpdateResult<import("bson").Document>>;
59
+ setEmailToConfirmed(internalId: ObjectId, options: Required<UserAppWithOptions>): Promise<UpdateResult<import("bson").Document>>;
60
+ disconnectFromAccount(internalId: ObjectId, account: string, options: Required<UserAppWithOptions>): Promise<UpdateResult<import("bson").Document>>;
58
61
  /**
59
62
  * sets a new email confirmation code
60
63
  */
61
- setEmailConfirmationCode(internalId: ObjectId, options: Required<UserAppWithOptions>): Promise<UpdateResult<BasicData<CustomerCompany | CustomerPerson>>>;
64
+ setEmailConfirmationCode(internalId: ObjectId, options: Required<UserAppWithOptions>): Promise<UpdateResult<import("bson").Document>>;
62
65
  createEmailConfirmationCode(length: number): string;
63
66
  getStructure(type: 'person' | 'company'): string[];
67
+ getEmail(customerId: ObjectId): Promise<string | undefined>;
64
68
  importManual(importData: BasicData<Customers>[], options: Required<UserAppWithOptions>): Promise<CustomerImportResult>;
65
69
  updateImportIds(importData: BasicData<Customers>[], options: Required<Options>): Record<string, ObjectId>;
66
70
  export(options: Options): Promise<WithId<Customers>[]>;
@@ -13,6 +13,7 @@ import { structure as listParticipantsStructure } from '../models/listsParticipa
13
13
  import ListsModel from '../models/lists.model.js';
14
14
  import { MeService } from './me.service.js';
15
15
  import ForbiddenError from '../classes/errors/Forbidden.error.js';
16
+ import EmailLimitService from './emailLimit.service.js';
16
17
  export class CustomersService extends Immutable {
17
18
  constructor() {
18
19
  super(...arguments);
@@ -28,10 +29,6 @@ export class CustomersService extends Immutable {
28
29
  }
29
30
  createPerson(data, modelAction, options) {
30
31
  data.company = options.company;
31
- if (data.email) {
32
- data.emailConfirmed = false;
33
- data.emailConfirmationCode = this.createEmailConfirmationCode(6);
34
- }
35
32
  return this.create(data, options.user, options.app, undefined, undefined, modelAction, options);
36
33
  }
37
34
  updateWithType(internalId, data, options) {
@@ -157,15 +154,38 @@ export class CustomersService extends Immutable {
157
154
  customer = await this.model.db.findOne({ 'accounts.account': account, company }, { projection });
158
155
  if (customer) {
159
156
  customer.emailConfirmed = customer?.emailConfirmed === true;
160
- // if email is not confirmed and no confirmation code is set, set a new one
157
+ // if email is not confirmed and no confirmation code is set, set a new one and send the email
161
158
  if (!customer.emailConfirmed && !customer.emailConfirmationCode) {
162
159
  await this.setEmailConfirmationCode(customer._id, options);
163
- await publishService.emailViaId('email-confirmation-mail', customer._id, undefined, options);
160
+ await this.sendConfirmationEmail(customer._id, options);
164
161
  }
165
162
  delete customer.emailConfirmationCode;
166
163
  }
167
164
  return customer;
168
165
  }
166
+ async resendConfirmationEmail(account, company, options) {
167
+ const projection = {
168
+ email: 1,
169
+ emailConfirmed: 1,
170
+ emailConfirmationCode: 1,
171
+ };
172
+ const customer = await this.model.db.findOne({ 'accounts.account': account, company }, { projection });
173
+ if (customer && !customer.emailConfirmed) {
174
+ if (!customer.emailConfirmationCode) {
175
+ await this.setEmailConfirmationCode(customer._id, options);
176
+ }
177
+ await this.sendConfirmationEmail(customer._id, options);
178
+ }
179
+ return true;
180
+ }
181
+ async sendConfirmationEmail(customerId, options) {
182
+ if (await EmailLimitService.isLimitedViaCustomer(customerId, 'email-confirmation-mail')) {
183
+ throw new Error('EMAIL_LIMITED');
184
+ }
185
+ const publish = await publishService.emailViaId('email-confirmation-mail', customerId, undefined, options);
186
+ await EmailLimitService.createViaCustomer(customerId, 'email-confirmation-mail');
187
+ return publish;
188
+ }
169
189
  async isConnected(account, app) {
170
190
  return await this.model.db.countDocuments({ 'accounts.account': account, 'accounts.app': app }) > 0;
171
191
  }
@@ -203,9 +223,12 @@ export class CustomersService extends Immutable {
203
223
  async confirmEmail(account, emailConfirmationCode, options) {
204
224
  const user = await this.model.db.findOne({ 'accounts.account': account, 'accounts.app': options.app, company: options.company, emailConfirmationCode }, { projection: { emailConfirmationCode: 1 } });
205
225
  if (!user)
206
- throw new Error('USER_NOT_FOUND');
226
+ throw new Error('EMAIL_CONFIRMATION_FAILED');
207
227
  return this.immutable({ _id: user._id }, { emailConfirmed: true }, options.user, 'change', options.app, undefined, undefined, 'confirmEmail');
208
228
  }
229
+ async setEmailToConfirmed(internalId, options) {
230
+ return this.immutable(internalId, { emailConfirmed: true }, options.user, 'change', options.app, undefined, undefined, 'confirmEmail');
231
+ }
209
232
  async disconnectFromAccount(internalId, account, options) {
210
233
  const user = await this.model.db.findOne({ _id: internalId, company: options.company }, { projection: { _id: 0, history: 0 } });
211
234
  const accounts = user?.accounts || [];
@@ -247,6 +270,10 @@ export class CustomersService extends Immutable {
247
270
  }
248
271
  return [];
249
272
  }
273
+ async getEmail(customerId) {
274
+ const customer = await this.model.db.findOne({ _id: customerId }, { projection: { email: 1 } });
275
+ return customer?.email;
276
+ }
250
277
  async importManual(importData, options) {
251
278
  const statistics = {
252
279
  success: 0,