@lilaquadrat/studio 10.0.0-beta.5 → 10.0.0-beta.51
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/eslint.config.js +146 -0
- package/lib/fastify-plugins.d.ts +4 -0
- package/lib/fastify-plugins.js +5 -0
- package/lib/fastify-plugins.js.map +1 -0
- package/lib/helpers.d.ts +4 -2
- package/lib/helpers.js +13 -2
- package/lib/helpers.js.map +1 -1
- package/lib/main.d.ts +1 -3
- package/lib/main.js +7 -3
- package/lib/main.js.map +1 -1
- package/lib/models.d.ts +4 -4
- package/lib/models.js +4 -4
- package/lib/models.js.map +1 -1
- package/lib/services.d.ts +5 -8
- package/lib/services.js +27 -9
- package/lib/services.js.map +1 -1
- package/lib/src/Immutable.class.d.ts +8 -1
- package/lib/src/Immutable.class.js +52 -8
- package/lib/src/Immutable.class.js.map +1 -1
- package/lib/src/ShareClientFactory.class.d.ts +1 -3
- package/lib/src/ShareClientFactory.class.js +1 -9
- package/lib/src/ShareClientFactory.class.js.map +1 -1
- package/lib/src/classes/models.class.js.map +1 -1
- package/lib/src/classes/modelv2.class.d.ts +2 -0
- package/lib/src/classes/modelv2.class.js +1 -1
- package/lib/src/classes/modelv2.class.js.map +1 -1
- package/lib/src/classes/mongo.class.js +4 -14
- package/lib/src/classes/mongo.class.js.map +1 -1
- package/lib/src/functions/handleError.d.ts +2 -3
- package/lib/src/functions/handleError.js +3 -16
- package/lib/src/functions/handleError.js.map +1 -1
- package/lib/src/functions/optionsHelper.d.ts +4 -4
- package/lib/src/functions/optionsHelper.js +5 -4
- package/lib/src/functions/optionsHelper.js.map +1 -1
- package/lib/src/functions/respondCode.d.ts +2 -1
- package/lib/src/functions/respondCode.js +1 -1
- package/lib/src/functions/respondCode.js.map +1 -1
- package/lib/src/helpers/ControllerHelper.d.ts +73 -0
- package/lib/src/helpers/ControllerHelper.js +242 -0
- package/lib/src/helpers/ControllerHelper.js.map +1 -0
- package/lib/src/helpers/EnvMapper.d.ts +0 -0
- package/lib/src/helpers/EnvMapper.js +1 -0
- package/lib/src/helpers/EnvMapper.js.map +1 -0
- package/lib/src/helpers/auth0config.d.ts +6 -0
- package/lib/src/helpers/auth0config.js +23 -0
- package/lib/src/helpers/auth0config.js.map +1 -0
- package/lib/src/helpers/authPlugin.d.ts +29 -0
- package/lib/src/helpers/authPlugin.js +77 -0
- package/lib/src/helpers/authPlugin.js.map +1 -0
- package/lib/src/helpers/cacheHelper.d.ts +69 -0
- package/lib/src/helpers/cacheHelper.js +235 -0
- package/lib/src/helpers/cacheHelper.js.map +1 -0
- package/lib/src/helpers/createSasToken.d.ts +0 -2
- package/lib/src/helpers/createSasToken.js +35 -32
- package/lib/src/helpers/createSasToken.js.map +1 -1
- package/lib/src/helpers/getSecrets.d.ts +1 -1
- package/lib/src/helpers/getSecrets.js +10 -12
- package/lib/src/helpers/getSecrets.js.map +1 -1
- package/lib/src/helpers/queryAssertionPlugin.d.ts +3 -0
- package/lib/src/helpers/queryAssertionPlugin.js +20 -0
- package/lib/src/helpers/queryAssertionPlugin.js.map +1 -0
- package/lib/src/helpers/safeObjectId.d.ts +1 -1
- package/lib/src/helpers/safeObjectId.js +5 -1
- package/lib/src/helpers/safeObjectId.js.map +1 -1
- package/lib/src/helpers/storageSdkFactory.d.ts +2 -0
- package/lib/src/helpers/storageSdkFactory.js +11 -0
- package/lib/src/helpers/storageSdkFactory.js.map +1 -0
- package/lib/src/helpers/studioAppPlugin.d.ts +3 -0
- package/lib/src/helpers/studioAppPlugin.js +16 -0
- package/lib/src/helpers/studioAppPlugin.js.map +1 -0
- package/lib/src/logger.js +154 -32
- package/lib/src/logger.js.map +1 -1
- package/lib/src/models/customers.model.js +14 -4
- package/lib/src/models/customers.model.js.map +1 -1
- package/lib/src/models/design.model.d.ts +4 -0
- package/lib/src/models/design.model.js +58 -0
- package/lib/src/models/design.model.js.map +1 -0
- package/lib/src/models/domain.model.js +1 -1
- package/lib/src/models/domain.model.js.map +1 -1
- package/lib/src/models/editor.model.js +7 -0
- package/lib/src/models/editor.model.js.map +1 -1
- package/lib/src/models/emailLimit.model.d.ts +4 -0
- package/lib/src/models/emailLimit.model.js +31 -0
- package/lib/src/models/emailLimit.model.js.map +1 -0
- package/lib/src/models/hosting.model.js +1 -3
- package/lib/src/models/hosting.model.js.map +1 -1
- package/lib/src/models/hostingSettings.model.js +6 -4
- package/lib/src/models/hostingSettings.model.js.map +1 -1
- package/lib/src/models/invoice.model.d.ts +4 -0
- package/lib/src/models/invoice.model.js +235 -0
- package/lib/src/models/invoice.model.js.map +1 -0
- package/lib/src/models/mailFrom.model.js +53 -10
- package/lib/src/models/mailFrom.model.js.map +1 -1
- package/lib/src/models/project.model.js +2 -4
- package/lib/src/models/project.model.js.map +1 -1
- package/lib/src/models/publish-method.model.js +79 -430
- package/lib/src/models/publish-method.model.js.map +1 -1
- package/lib/src/models/storage.model.js +11 -3
- package/lib/src/models/storage.model.js.map +1 -1
- package/lib/src/prompts/textGeneration.js +88 -0
- package/lib/src/prompts/textGeneration.js.map +1 -1
- package/lib/src/prompts/textGenerationMulti.js +78 -44
- package/lib/src/prompts/textGenerationMulti.js.map +1 -1
- package/lib/src/services/access.service.d.ts +0 -37
- package/lib/src/services/access.service.js +119 -108
- package/lib/src/services/access.service.js.map +1 -1
- package/lib/src/services/ai.service.d.ts +4 -3
- package/lib/src/services/ai.service.js +22 -29
- package/lib/src/services/ai.service.js.map +1 -1
- package/lib/src/services/auth.service.d.ts +10 -0
- package/lib/src/services/auth.service.js +63 -0
- package/lib/src/services/auth.service.js.map +1 -0
- package/lib/src/services/conf.service.d.ts +3 -31
- package/lib/src/services/conf.service.js +58 -167
- package/lib/src/services/conf.service.js.map +1 -1
- package/lib/src/services/customers.service.d.ts +8 -4
- package/lib/src/services/customers.service.js +34 -7
- package/lib/src/services/customers.service.js.map +1 -1
- package/lib/src/services/designs.service.d.ts +7 -0
- package/lib/src/services/designs.service.js +10 -0
- package/lib/src/services/designs.service.js.map +1 -0
- package/lib/src/services/domains.service.d.ts +18 -91
- package/lib/src/services/domains.service.js +91 -559
- package/lib/src/services/domains.service.js.map +1 -1
- package/lib/src/services/editor.service.d.ts +4 -0
- package/lib/src/services/editor.service.js +28 -0
- package/lib/src/services/editor.service.js.map +1 -1
- package/lib/src/services/emailLimit.service.d.ts +21 -0
- package/lib/src/services/emailLimit.service.js +51 -0
- package/lib/src/services/emailLimit.service.js.map +1 -0
- package/lib/src/services/hosting.service.d.ts +12 -24
- package/lib/src/services/hosting.service.js +32 -122
- package/lib/src/services/hosting.service.js.map +1 -1
- package/lib/src/services/hostingAdmin.service.d.ts +1 -1
- package/lib/src/services/hostingAdmin.service.js +2 -2
- package/lib/src/services/hostingAdmin.service.js.map +1 -1
- package/lib/src/services/import.service.d.ts +6 -22
- package/lib/src/services/import.service.js +63 -65
- package/lib/src/services/import.service.js.map +1 -1
- package/lib/src/services/invoices.service.d.ts +30 -0
- package/lib/src/services/invoices.service.js +265 -0
- package/lib/src/services/invoices.service.js.map +1 -0
- package/lib/src/services/jetstream.service.d.ts +5 -3
- package/lib/src/services/jetstream.service.js +63 -7
- package/lib/src/services/jetstream.service.js.map +1 -1
- package/lib/src/services/listParticipants.service.d.ts +2 -5
- package/lib/src/services/listParticipants.service.js +17 -14
- package/lib/src/services/listParticipants.service.js.map +1 -1
- package/lib/src/services/mailFrom.service.d.ts +14 -1
- package/lib/src/services/mailFrom.service.js +55 -0
- package/lib/src/services/mailFrom.service.js.map +1 -1
- package/lib/src/services/me.service.d.ts +22 -12
- package/lib/src/services/me.service.js +58 -89
- package/lib/src/services/me.service.js.map +1 -1
- package/lib/src/services/publish.service.d.ts +3 -7
- package/lib/src/services/publish.service.js +32 -32
- package/lib/src/services/publish.service.js.map +1 -1
- package/lib/src/services/publishData.service.d.ts +10 -7
- package/lib/src/services/publishData.service.js +32 -75
- package/lib/src/services/publishData.service.js.map +1 -1
- package/lib/src/services/spamAnalasys.service.d.ts +4 -4
- package/lib/src/services/spamAnalasys.service.js +36 -44
- package/lib/src/services/spamAnalasys.service.js.map +1 -1
- package/lib/src/services/storage.service.d.ts +22 -29
- package/lib/src/services/storage.service.js +123 -57
- package/lib/src/services/storage.service.js.map +1 -1
- package/lib/src/services/structures.service.d.ts +1 -1
- package/lib/src/services/upload.service.js +6 -1
- package/lib/src/services/upload.service.js.map +1 -1
- package/package.json +28 -29
- package/lib/src/AzureBlobStorage.share.d.ts +0 -19
- package/lib/src/AzureBlobStorage.share.js +0 -162
- package/lib/src/AzureBlobStorage.share.js.map +0 -1
- package/lib/src/AzureFileStorage.share.d.ts +0 -22
- package/lib/src/AzureFileStorage.share.js +0 -139
- package/lib/src/AzureFileStorage.share.js.map +0 -1
- package/lib/src/AzureVault.d.ts +0 -14
- package/lib/src/AzureVault.js +0 -28
- package/lib/src/AzureVault.js.map +0 -1
- package/lib/src/dns.challenge.class.d.ts +0 -17
- package/lib/src/dns.challenge.class.js +0 -41
- package/lib/src/dns.challenge.class.js.map +0 -1
- package/lib/src/http.challenge.class.d.ts +0 -33
- package/lib/src/http.challenge.class.js +0 -58
- package/lib/src/http.challenge.class.js.map +0 -1
- package/lib/src/models/certificate-action.model.d.ts +0 -5
- package/lib/src/models/certificate-action.model.js +0 -230
- package/lib/src/models/certificate-action.model.js.map +0 -1
- package/lib/src/models/certificate.model.d.ts +0 -4
- package/lib/src/models/certificate.model.js +0 -96
- package/lib/src/models/certificate.model.js.map +0 -1
- package/lib/src/models/editorBase.model.d.ts +0 -4
- package/lib/src/models/editorBase.model.js +0 -39
- package/lib/src/models/editorBase.model.js.map +0 -1
- package/lib/src/services/certificates.service.d.ts +0 -56
- package/lib/src/services/certificates.service.js +0 -169
- package/lib/src/services/certificates.service.js.map +0 -1
- package/lib/src/services/certificatesAction.service.d.ts +0 -41
- package/lib/src/services/certificatesAction.service.js +0 -188
- package/lib/src/services/certificatesAction.service.js.map +0 -1
- package/lib/src/services/editorBase.service.d.ts +0 -46
- package/lib/src/services/editorBase.service.js +0 -161
- package/lib/src/services/editorBase.service.js.map +0 -1
- package/lib/src/services/handleFile.service.d.ts +0 -9
- package/lib/src/services/handleFile.service.js +0 -45
- package/lib/src/services/handleFile.service.js.map +0 -1
- package/lib/src/services/media.service.d.ts +0 -35
- package/lib/src/services/media.service.js +0 -418
- package/lib/src/services/media.service.js.map +0 -1
- package/lib/src/services/share.service.d.ts +0 -6
- package/lib/src/services/share.service.js +0 -4
- package/lib/src/services/share.service.js.map +0 -1
|
@@ -1,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(
|
|
9
|
+
constructor(key, model) {
|
|
10
10
|
if (key) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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.
|
|
74
|
-
model:
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
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
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
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.
|
|
88
|
+
const responseData = JSON.parse(response.text);
|
|
96
89
|
return { output: responseData.input };
|
|
97
90
|
}
|
|
98
91
|
}
|
|
99
|
-
export default new Ai(
|
|
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":"AACA,OAAO,
|
|
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
|
-
|
|
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
|
|
3
|
-
import
|
|
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
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
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
|
-
|
|
135
|
-
|
|
37
|
+
catch (error) {
|
|
38
|
+
console.error(error);
|
|
39
|
+
return;
|
|
136
40
|
}
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
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 (
|
|
170
|
-
|
|
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
|
-
|
|
60
|
+
const compiledTemplate = handlebars.compile(template.toString());
|
|
61
|
+
const conf = compiledTemplate(templateVars).trim();
|
|
62
|
+
return Buffer.from(conf);
|
|
176
63
|
}
|
|
177
|
-
|
|
178
|
-
|
|
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":"AAAA,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,
|
|
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<
|
|
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<
|
|
57
|
-
|
|
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<
|
|
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
|
|
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('
|
|
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,
|