@goatlab/node-backend 0.0.16 → 0.1.1
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/README.md +54 -38
- package/dist/container/Container.d.ts +441 -0
- package/dist/container/Container.js +895 -0
- package/dist/container/Container.js.map +1 -0
- package/dist/container/DistributedCacheInvalidator.d.ts +84 -0
- package/dist/container/DistributedCacheInvalidator.js +213 -0
- package/dist/container/DistributedCacheInvalidator.js.map +1 -0
- package/dist/container/LruCache.d.ts +14 -0
- package/dist/container/LruCache.js +23 -0
- package/dist/container/LruCache.js.map +1 -0
- package/dist/container/types.d.ts +128 -0
- package/dist/container/types.js +6 -0
- package/dist/container/types.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.js +53 -1
- package/dist/index.js.map +1 -1
- package/dist/server/bootstraps/getExpressTrpcApp.d.ts +17 -0
- package/dist/server/bootstraps/getExpressTrpcApp.js +98 -0
- package/dist/server/bootstraps/getExpressTrpcApp.js.map +1 -0
- package/dist/server/consts.d.ts +35 -0
- package/dist/server/consts.js +33 -0
- package/dist/server/consts.js.map +1 -0
- package/dist/server/context/context.model.d.ts +13 -0
- package/dist/server/context/context.model.js +3 -0
- package/dist/server/context/context.model.js.map +1 -0
- package/dist/server/context/request.context.d.ts +40 -0
- package/dist/server/context/request.context.js +91 -0
- package/dist/server/context/request.context.js.map +1 -0
- package/dist/server/context/trpc.context.d.ts +11 -0
- package/dist/server/context/trpc.context.js +67 -0
- package/dist/server/context/trpc.context.js.map +1 -0
- package/dist/server/initOpenApiDocs.d.ts +9 -0
- package/dist/server/initOpenApiDocs.js +18 -0
- package/dist/server/initOpenApiDocs.js.map +1 -0
- package/dist/server/middleware/cloudTaskDecrypt.middleware.d.ts +6 -0
- package/dist/server/middleware/cloudTaskDecrypt.middleware.js +44 -0
- package/dist/server/middleware/cloudTaskDecrypt.middleware.js.map +1 -0
- package/dist/server/middleware/error.middleware.d.ts +17 -0
- package/dist/server/middleware/error.middleware.js +66 -0
- package/dist/server/middleware/error.middleware.js.map +1 -0
- package/dist/server/middleware/handleRequest.middleware.d.ts +7 -0
- package/dist/server/middleware/handleRequest.middleware.js +40 -0
- package/dist/server/middleware/handleRequest.middleware.js.map +1 -0
- package/dist/server/middleware/logger/cloudRun.logger.d.ts +27 -0
- package/dist/server/middleware/logger/cloudRun.logger.js +87 -0
- package/dist/server/middleware/logger/cloudRun.logger.js.map +1 -0
- package/dist/server/middleware/logger/logger.service.d.ts +6 -0
- package/dist/server/middleware/logger/logger.service.js +17 -0
- package/dist/server/middleware/logger/logger.service.js.map +1 -0
- package/dist/server/middleware/logs.middleware.d.ts +7 -0
- package/dist/server/middleware/logs.middleware.js +130 -0
- package/dist/server/middleware/logs.middleware.js.map +1 -0
- package/dist/server/middleware/requireAuthenticated.d.ts +2 -0
- package/dist/server/middleware/requireAuthenticated.js +13 -0
- package/dist/server/middleware/requireAuthenticated.js.map +1 -0
- package/dist/server/middleware/trpcError.middleware.d.ts +4 -0
- package/dist/server/middleware/trpcError.middleware.js +38 -0
- package/dist/server/middleware/trpcError.middleware.js.map +1 -0
- package/dist/server/schemas/user.schema.d.ts +109 -0
- package/dist/server/schemas/user.schema.js +28 -0
- package/dist/server/schemas/user.schema.js.map +1 -0
- package/dist/server/sentry/getSentry.d.ts +6 -0
- package/dist/server/sentry/getSentry.js +45 -0
- package/dist/server/sentry/getSentry.js.map +1 -0
- package/dist/server/sentry/sentry.service.d.ts +34 -0
- package/dist/server/sentry/sentry.service.js +110 -0
- package/dist/server/sentry/sentry.service.js.map +1 -0
- package/dist/server/services/email/email.model.d.ts +84 -0
- package/dist/server/services/email/email.model.js +62 -0
- package/dist/server/services/email/email.model.js.map +1 -0
- package/dist/server/services/email/email.service.d.ts +23 -0
- package/dist/server/services/email/email.service.js +139 -0
- package/dist/server/services/email/email.service.js.map +1 -0
- package/dist/server/services/gcp/getGcpServiceAccountFromBase64.d.ts +15 -0
- package/dist/server/services/gcp/getGcpServiceAccountFromBase64.js +9 -0
- package/dist/server/services/gcp/getGcpServiceAccountFromBase64.js.map +1 -0
- package/dist/server/services/secrets/secret.service.d.ts +32 -0
- package/dist/server/services/secrets/secret.service.js +220 -0
- package/dist/server/services/secrets/secret.service.js.map +1 -0
- package/dist/server/services/sendgrid/sendgrid.model.d.ts +118 -0
- package/dist/server/services/sendgrid/sendgrid.model.js +3 -0
- package/dist/server/services/sendgrid/sendgrid.model.js.map +1 -0
- package/dist/server/services/sendgrid/sendgridApi.service.d.ts +13 -0
- package/dist/server/services/sendgrid/sendgridApi.service.js +79 -0
- package/dist/server/services/sendgrid/sendgridApi.service.js.map +1 -0
- package/dist/server/services/sendgrid/sendgridHooks.model.d.ts +27 -0
- package/dist/server/services/sendgrid/sendgridHooks.model.js +19 -0
- package/dist/server/services/sendgrid/sendgridHooks.model.js.map +1 -0
- package/dist/server/services/translations/template.util.d.ts +7 -0
- package/dist/server/services/translations/template.util.js +11 -0
- package/dist/server/services/translations/template.util.js.map +1 -0
- package/dist/server/services/translations/translation.model.d.ts +4 -0
- package/dist/server/services/translations/translation.model.js +6 -0
- package/dist/server/services/translations/translation.model.js.map +1 -0
- package/dist/server/services/translations/translation.service.d.ts +25 -0
- package/dist/server/services/translations/translation.service.js +97 -0
- package/dist/server/services/translations/translation.service.js.map +1 -0
- package/dist/server/services/util/benchmarker.d.ts +13 -0
- package/dist/server/services/util/benchmarker.js +34 -0
- package/dist/server/services/util/benchmarker.js.map +1 -0
- package/dist/server/services/util/pagination.d.ts +50 -0
- package/dist/server/services/util/pagination.js +57 -0
- package/dist/server/services/util/pagination.js.map +1 -0
- package/dist/server/services/util/url.service.d.ts +75 -0
- package/dist/server/services/util/url.service.js +139 -0
- package/dist/server/services/util/url.service.js.map +1 -0
- package/dist/server/test/express.mock.d.ts +6 -0
- package/dist/server/test/express.mock.js +49 -0
- package/dist/server/test/express.mock.js.map +1 -0
- package/dist/server/test/firebase.mock.d.ts +4 -0
- package/dist/server/test/firebase.mock.js +30 -0
- package/dist/server/test/firebase.mock.js.map +1 -0
- package/dist/server/test/mock.model.d.ts +5 -0
- package/dist/server/test/mock.model.js +3 -0
- package/dist/server/test/mock.model.js.map +1 -0
- package/dist/server/test/trpc.mock.d.ts +6 -0
- package/dist/server/test/trpc.mock.js +14 -0
- package/dist/server/test/trpc.mock.js.map +1 -0
- package/dist/server/trpc.d.ts +364 -0
- package/dist/server/trpc.js +87 -0
- package/dist/server/trpc.js.map +1 -0
- package/dist/server/types/Envinronment.d.ts +1 -0
- package/dist/server/types/Envinronment.js +3 -0
- package/dist/server/types/Envinronment.js.map +1 -0
- package/dist/test/const.d.ts +4 -0
- package/dist/test/const.js +11 -1
- package/dist/test/const.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +34 -3
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.translationService = void 0;
|
|
4
|
+
exports.tr = tr;
|
|
5
|
+
exports.trIfExists = trIfExists;
|
|
6
|
+
const pupa_1 = require("@goatlab/js-utils/dist/Strings/pupa");
|
|
7
|
+
const consts_1 = require("../../consts");
|
|
8
|
+
const template_util_1 = require("./template.util");
|
|
9
|
+
const translation_model_1 = require("./translation.model");
|
|
10
|
+
class TranslationService {
|
|
11
|
+
// @Memo.syncMethod()
|
|
12
|
+
getLocale(lang) {
|
|
13
|
+
try {
|
|
14
|
+
return { ...require(`${consts_1.config.langDir}/${lang}.json`) };
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
console.warn(`Unsupported lang ${lang}`);
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
getLocaleMap() {
|
|
22
|
+
return translation_model_1.SUPPORTED_LANGUAGES.reduce((map, lang) => {
|
|
23
|
+
map[lang] = this.getLocale(lang);
|
|
24
|
+
return map;
|
|
25
|
+
}, {});
|
|
26
|
+
}
|
|
27
|
+
missingKey(key) {
|
|
28
|
+
return `[${key}]`;
|
|
29
|
+
}
|
|
30
|
+
translate(key, acc, args = {}) {
|
|
31
|
+
const v = this.translateIfExists(key, acc, args);
|
|
32
|
+
if (!v) {
|
|
33
|
+
this.reportMissing(key, acc);
|
|
34
|
+
if (process.env.MOCK_LANG && process.env.MOCK_LANG_THROW_IF_NOT_FOUND) {
|
|
35
|
+
throw new Error(`key ${key} does not exist`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return v ?? this.missingKey(key);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Implementation based on static ./src/lang/*.json files
|
|
42
|
+
*/
|
|
43
|
+
translateIfExists(key, user, args = {}) {
|
|
44
|
+
const fallbackLocale = this.getLocale(translation_model_1.LANG_DEFAULT);
|
|
45
|
+
const locale = this.getLocale(user.language);
|
|
46
|
+
const value = locale[key] ?? fallbackLocale[key];
|
|
47
|
+
return value && this.formatResult(key, value, args);
|
|
48
|
+
}
|
|
49
|
+
formatResult(key, text, args = {}) {
|
|
50
|
+
if (process.env.MOCK_LANG) {
|
|
51
|
+
return `** ${key} **`;
|
|
52
|
+
}
|
|
53
|
+
if (Object.keys(args).length) {
|
|
54
|
+
try {
|
|
55
|
+
return template_util_1.templateUtil.renderString(text, args);
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
if (err instanceof pupa_1.MissingValueError) {
|
|
59
|
+
// sentryService.captureMessage(
|
|
60
|
+
// `template value missing for key=${key}, param=${err.key}`,
|
|
61
|
+
// )
|
|
62
|
+
return template_util_1.templateUtil.renderString(text, args, { ignoreMissing: true });
|
|
63
|
+
}
|
|
64
|
+
throw err;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
return text;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
reportMissing(key, opt) {
|
|
72
|
+
console.log(opt); // For Sentry
|
|
73
|
+
//sentryService.captureMessage(`translation missing for key=${key}}`)
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Based on: https://nodejs.org/api/intl.html#intl_detecting_internationalization_support
|
|
77
|
+
*/
|
|
78
|
+
hasFullICU() {
|
|
79
|
+
try {
|
|
80
|
+
const january = new Date(9e8);
|
|
81
|
+
const spanish = new Intl.DateTimeFormat('es', { month: 'long' });
|
|
82
|
+
return spanish.format(january) === 'enero';
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
exports.translationService = new TranslationService();
|
|
90
|
+
// Alias
|
|
91
|
+
function tr(key, user, args = {}) {
|
|
92
|
+
return exports.translationService.translate(key, user, args);
|
|
93
|
+
}
|
|
94
|
+
function trIfExists(key, user, args = {}) {
|
|
95
|
+
return exports.translationService.translateIfExists(key, user, args);
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=translation.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"translation.service.js","sourceRoot":"","sources":["../../../../src/server/services/translations/translation.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface BenchmarkResult {
|
|
2
|
+
'Task name': string;
|
|
3
|
+
'Latency avg (ns)': string;
|
|
4
|
+
'Latency med (ns)': string;
|
|
5
|
+
'Throughput avg (ops/s)': string;
|
|
6
|
+
'Throughput med (ops/s)': string;
|
|
7
|
+
Samples: number;
|
|
8
|
+
}
|
|
9
|
+
export declare function analyzeBenchmarkResults(results: BenchmarkResult[]): {
|
|
10
|
+
name: string;
|
|
11
|
+
latencyImprovement: number;
|
|
12
|
+
throughputImprovement: number;
|
|
13
|
+
}[];
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.analyzeBenchmarkResults = analyzeBenchmarkResults;
|
|
4
|
+
function analyzeBenchmarkResults(results) {
|
|
5
|
+
const parseValue = (value) => parseFloat(value.split(' ± ')[0]);
|
|
6
|
+
// Extract numeric values
|
|
7
|
+
const parsedResults = results.map((r) => ({
|
|
8
|
+
name: r['Task name'],
|
|
9
|
+
latencyAvg: parseValue(r['Latency avg (ns)']),
|
|
10
|
+
latencyMed: parseValue(r['Latency med (ns)']),
|
|
11
|
+
throughputAvg: parseValue(r['Throughput avg (ops/s)']),
|
|
12
|
+
throughputMed: parseValue(r['Throughput med (ops/s)']),
|
|
13
|
+
samples: r.Samples,
|
|
14
|
+
}));
|
|
15
|
+
console.log({ parsedResults });
|
|
16
|
+
// Find the best performers
|
|
17
|
+
const bestLatency = Math.min(...parsedResults.map((r) => r.latencyAvg)); // Lower is better
|
|
18
|
+
const bestThroughput = Math.max(...parsedResults.map((r) => r.throughputAvg)); // Higher is better
|
|
19
|
+
// Calculate improvements
|
|
20
|
+
const analysis = parsedResults.map((r) => ({
|
|
21
|
+
name: r.name,
|
|
22
|
+
latencyImprovement: ((bestLatency - r.latencyAvg) / bestLatency) * 100, // Lower is better
|
|
23
|
+
throughputImprovement: ((r.throughputAvg - bestThroughput) / bestThroughput) * 100, // Higher is better
|
|
24
|
+
}));
|
|
25
|
+
// Sort results from best to worst (by latency)
|
|
26
|
+
const sortedAnalysis = analysis.sort((a, b) => b.latencyImprovement - a.latencyImprovement);
|
|
27
|
+
console.table(sortedAnalysis.map(({ name, latencyImprovement, throughputImprovement }) => ({
|
|
28
|
+
'Task Name': name,
|
|
29
|
+
'Latency Improvement (%)': latencyImprovement.toFixed(2),
|
|
30
|
+
'Throughput Improvement (%)': throughputImprovement.toFixed(2),
|
|
31
|
+
})));
|
|
32
|
+
return sortedAnalysis;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=benchmarker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"benchmarker.js","sourceRoot":"","sources":["../../../../src/server/services/util/benchmarker.ts"],"names":[],"mappings":";;AASA,0DA4CC;AA5CD,SAAgB,uBAAuB,CAAC,OAA0B;IAChE,MAAM,UAAU,GAAG,CAAC,KAAa,EAAU,EAAE,CAC3C,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAEnC,yBAAyB;IACzB,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACxC,IAAI,EAAE,CAAC,CAAC,WAAW,CAAC;QACpB,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;QAC7C,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;QAC7C,aAAa,EAAE,UAAU,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC;QACtD,aAAa,EAAE,UAAU,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC;QACtD,OAAO,EAAE,CAAC,CAAC,OAAO;KACnB,CAAC,CAAC,CAAA;IAEH,OAAO,CAAC,GAAG,CAAC,EAAE,aAAa,EAAE,CAAC,CAAA;IAE9B,2BAA2B;IAC3B,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAA,CAAC,kBAAkB;IAC1F,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAA,CAAC,mBAAmB;IAEjG,yBAAyB;IACzB,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACzC,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,kBAAkB,EAAE,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,UAAU,CAAC,GAAG,WAAW,CAAC,GAAG,GAAG,EAAE,kBAAkB;QAC1F,qBAAqB,EACnB,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,cAAc,CAAC,GAAG,cAAc,CAAC,GAAG,GAAG,EAAE,mBAAmB;KACnF,CAAC,CAAC,CAAA;IAEH,+CAA+C;IAC/C,MAAM,cAAc,GAAG,QAAQ,CAAC,IAAI,CAClC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,kBAAkB,GAAG,CAAC,CAAC,kBAAkB,CACtD,CAAA;IAED,OAAO,CAAC,KAAK,CACX,cAAc,CAAC,GAAG,CAChB,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,EAAE,EAAE,CAAC,CAAC;QACxD,WAAW,EAAE,IAAI;QACjB,yBAAyB,EAAE,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC;QACxD,4BAA4B,EAAE,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC;KAC/D,CAAC,CACH,CACF,CAAA;IAED,OAAO,cAAc,CAAA;AACvB,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { z, ZodTypeAny } from 'zod';
|
|
2
|
+
interface PaginationParams<T> {
|
|
3
|
+
cursor?: number | null;
|
|
4
|
+
perPage?: number;
|
|
5
|
+
total: number;
|
|
6
|
+
items: T[];
|
|
7
|
+
}
|
|
8
|
+
interface PaginationResult<T> {
|
|
9
|
+
total: number;
|
|
10
|
+
perPage: number;
|
|
11
|
+
currentPage: number;
|
|
12
|
+
lastPage: number;
|
|
13
|
+
nextPage: number | null;
|
|
14
|
+
previousPage: number | null;
|
|
15
|
+
data: T[];
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Class to handle pagination calculations and operations.
|
|
19
|
+
*/
|
|
20
|
+
declare class PaginationUtility {
|
|
21
|
+
/**
|
|
22
|
+
* Calculates the page number and the number of items to skip based on the cursor and items per page.
|
|
23
|
+
* @param cursor The current page number, defaults to 1 if not provided.
|
|
24
|
+
* @param perPage The number of items per page, defaults to 10 if not provided.
|
|
25
|
+
* @returns An object with the calculated page number and skip count.
|
|
26
|
+
*/
|
|
27
|
+
calculatePaginationCursor({ cursor, perPage, }: {
|
|
28
|
+
cursor?: number | null;
|
|
29
|
+
perPage?: number | null;
|
|
30
|
+
}): {
|
|
31
|
+
page: number;
|
|
32
|
+
skip: number;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Paginates an array of items.
|
|
36
|
+
* @param cursor The page number to retrieve.
|
|
37
|
+
* @param perPage The number of items per page.
|
|
38
|
+
* @param total The total number of items.
|
|
39
|
+
* @param items The array of items to paginate.
|
|
40
|
+
* @returns The paginated result including metadata.
|
|
41
|
+
*/
|
|
42
|
+
paginate<T>({ cursor, perPage, total, items, }: PaginationParams<T>): PaginationResult<T>;
|
|
43
|
+
getNextCursor<T extends ZodTypeAny>({ limit, items, schema, }: {
|
|
44
|
+
limit: number;
|
|
45
|
+
items: any[];
|
|
46
|
+
schema: T;
|
|
47
|
+
}): z.infer<T> | undefined;
|
|
48
|
+
}
|
|
49
|
+
export declare const paginationUtility: PaginationUtility;
|
|
50
|
+
export {};
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.paginationUtility = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Class to handle pagination calculations and operations.
|
|
6
|
+
*/
|
|
7
|
+
class PaginationUtility {
|
|
8
|
+
/**
|
|
9
|
+
* Calculates the page number and the number of items to skip based on the cursor and items per page.
|
|
10
|
+
* @param cursor The current page number, defaults to 1 if not provided.
|
|
11
|
+
* @param perPage The number of items per page, defaults to 10 if not provided.
|
|
12
|
+
* @returns An object with the calculated page number and skip count.
|
|
13
|
+
*/
|
|
14
|
+
calculatePaginationCursor({ cursor = 1, perPage = 10, }) {
|
|
15
|
+
const page = Math.max(1, cursor ?? 1);
|
|
16
|
+
const itemsPerPage = Math.max(1, perPage ?? 10);
|
|
17
|
+
const skip = (page - 1) * itemsPerPage;
|
|
18
|
+
return { page, skip };
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Paginates an array of items.
|
|
22
|
+
* @param cursor The page number to retrieve.
|
|
23
|
+
* @param perPage The number of items per page.
|
|
24
|
+
* @param total The total number of items.
|
|
25
|
+
* @param items The array of items to paginate.
|
|
26
|
+
* @returns The paginated result including metadata.
|
|
27
|
+
*/
|
|
28
|
+
paginate({ cursor = 1, perPage = 10, total, items, }) {
|
|
29
|
+
const page = Math.max(1, cursor ?? 1);
|
|
30
|
+
const itemsPerPage = Math.max(1, perPage || 10);
|
|
31
|
+
const lastPage = Math.ceil(total / itemsPerPage);
|
|
32
|
+
const nextPage = page + 1 <= lastPage ? page + 1 : null;
|
|
33
|
+
const previousPage = page - 1 >= 1 ? page - 1 : null;
|
|
34
|
+
return {
|
|
35
|
+
total,
|
|
36
|
+
perPage: itemsPerPage,
|
|
37
|
+
currentPage: page,
|
|
38
|
+
lastPage,
|
|
39
|
+
nextPage,
|
|
40
|
+
previousPage,
|
|
41
|
+
data: items,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
getNextCursor({ limit, items, schema, }) {
|
|
45
|
+
let nextCursor;
|
|
46
|
+
if (items.length > limit) {
|
|
47
|
+
const nextItem = items.pop();
|
|
48
|
+
if (nextItem) {
|
|
49
|
+
// Validate and pick properties based on the provided Zod schema
|
|
50
|
+
nextCursor = schema.safeParse(nextItem).data;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return nextCursor;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
exports.paginationUtility = new PaginationUtility();
|
|
57
|
+
//# sourceMappingURL=pagination.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../../../src/server/services/util/pagination.ts"],"names":[],"mappings":";;;AAmBA;;GAEG;AACH,MAAM,iBAAiB;IACrB;;;;;OAKG;IACH,yBAAyB,CAAC,EACxB,MAAM,GAAG,CAAC,EACV,OAAO,GAAG,EAAE,GAIb;QACC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,CAAA;QACrC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC,CAAA;QAC/C,MAAM,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,YAAY,CAAA;QAEtC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;IACvB,CAAC;IAED;;;;;;;OAOG;IACH,QAAQ,CAAI,EACV,MAAM,GAAG,CAAC,EACV,OAAO,GAAG,EAAE,EACZ,KAAK,EACL,KAAK,GACe;QACpB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,CAAA;QACrC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC,CAAA;QAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,YAAY,CAAC,CAAA;QAChD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QACvD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QAEpD,OAAO;YACL,KAAK;YACL,OAAO,EAAE,YAAY;YACrB,WAAW,EAAE,IAAI;YACjB,QAAQ;YACR,QAAQ;YACR,YAAY;YACZ,IAAI,EAAE,KAAK;SACZ,CAAA;IACH,CAAC;IAED,aAAa,CAAuB,EAClC,KAAK,EACL,KAAK,EACL,MAAM,GAKP;QACC,IAAI,UAAkC,CAAA;QAEtC,IAAI,KAAK,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,EAAE,CAAA;YAE5B,IAAI,QAAQ,EAAE,CAAC;gBACb,gEAAgE;gBAChE,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAA;YAC9C,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAA;IACnB,CAAC;CACF;AAEY,QAAA,iBAAiB,GAAG,IAAI,iBAAiB,EAAE,CAAA"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type { Environment } from '../../types/Envinronment';
|
|
2
|
+
interface UrlServiceProps {
|
|
3
|
+
isMobile?: boolean;
|
|
4
|
+
useIP?: boolean;
|
|
5
|
+
preferPublicIp?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export type PaymentSuccessRedirectURL = `${string}/payment/processed?orderId=${string}`;
|
|
8
|
+
export type PaymentFailedRedirectURL = `${string}/payment/cancelled?paymentFailed=true&orderId=${string}`;
|
|
9
|
+
export type PaymentCancelledRedirectURL = `${string}/payment/cancelled?orderId=${string}`;
|
|
10
|
+
export declare class UrlService {
|
|
11
|
+
publicBucketName: string;
|
|
12
|
+
privateBucketName: string;
|
|
13
|
+
baseDomain: string;
|
|
14
|
+
backendApiBaseUrl: string;
|
|
15
|
+
environment: Environment;
|
|
16
|
+
constructor({ publicBucketName, privateBucketName, baseDomain, backendApiBaseUrl, environment, }: {
|
|
17
|
+
publicBucketName: string;
|
|
18
|
+
privateBucketName: string;
|
|
19
|
+
baseDomain: string;
|
|
20
|
+
backendApiBaseUrl: string;
|
|
21
|
+
environment: Environment;
|
|
22
|
+
});
|
|
23
|
+
getBackendUrl: ({ isMobile, useIP }?: UrlServiceProps) => string;
|
|
24
|
+
/**
|
|
25
|
+
* When running locally, the storage can be accessed
|
|
26
|
+
* either using localhost, the localIp of the host or Nginx URL
|
|
27
|
+
*
|
|
28
|
+
* We mainly use this for local testing as Chrome forces us to have
|
|
29
|
+
* an HTTPS endpoint to upload assets to the Firebase Emulator
|
|
30
|
+
* @returns
|
|
31
|
+
*/
|
|
32
|
+
getLocalStorageHostUrl: ({ isMobile, useIP, }: UrlServiceProps) => Promise<string>;
|
|
33
|
+
getPublicStorageUrl: ({ isMobile, useIP }: UrlServiceProps) => Promise<string>;
|
|
34
|
+
getPrivateStorageUrl: ({ isMobile, useIP, }: UrlServiceProps) => Promise<string>;
|
|
35
|
+
getFrontendUrl: () => string;
|
|
36
|
+
/**
|
|
37
|
+
* Decides where to send the user back after the payment has been completed
|
|
38
|
+
* if we already decided on an origin, it will use that origin
|
|
39
|
+
*
|
|
40
|
+
* @param origin
|
|
41
|
+
* @returns
|
|
42
|
+
*/
|
|
43
|
+
getFrontendRedirectURL(origin?: string): string;
|
|
44
|
+
/**
|
|
45
|
+
* Decides which backend the payment provider should reply to
|
|
46
|
+
* It can be either dev, prod or local. Transbank queries the backend from
|
|
47
|
+
* the frontend, so you will still be able to use local urls
|
|
48
|
+
* @param origin
|
|
49
|
+
* @returns
|
|
50
|
+
*/
|
|
51
|
+
getBackendRedirectURLForTransBankPayments({ origin, orderId, storeId, }: {
|
|
52
|
+
origin?: string;
|
|
53
|
+
orderId?: string;
|
|
54
|
+
storeId?: string;
|
|
55
|
+
}): string;
|
|
56
|
+
/**
|
|
57
|
+
* Redirección de pago exitoso
|
|
58
|
+
* @param origin
|
|
59
|
+
* @param orderId
|
|
60
|
+
*/
|
|
61
|
+
getPaymentSuccessRedirectURL(origin: string | undefined, orderId: string): PaymentSuccessRedirectURL;
|
|
62
|
+
/**
|
|
63
|
+
* Redirección de pago con error (fallo en commit, etc)
|
|
64
|
+
* @param origin
|
|
65
|
+
* @param orderId
|
|
66
|
+
*/
|
|
67
|
+
getPaymentFailedRedirectURL(origin: string | undefined, orderId: string): PaymentFailedRedirectURL;
|
|
68
|
+
/**
|
|
69
|
+
* Redirección de pago cancelado por el usuario
|
|
70
|
+
* @param origin
|
|
71
|
+
* @param orderId
|
|
72
|
+
*/
|
|
73
|
+
getPaymentCancelledRedirectURL(origin: string | undefined, orderId: string): PaymentCancelledRedirectURL;
|
|
74
|
+
}
|
|
75
|
+
export {};
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.UrlService = void 0;
|
|
4
|
+
const node_utils_1 = require("@goatlab/node-utils");
|
|
5
|
+
const localIpAddress = node_utils_1.Ips.getLocalIpAddress();
|
|
6
|
+
class UrlService {
|
|
7
|
+
publicBucketName;
|
|
8
|
+
privateBucketName;
|
|
9
|
+
baseDomain;
|
|
10
|
+
backendApiBaseUrl;
|
|
11
|
+
environment;
|
|
12
|
+
constructor({ publicBucketName, privateBucketName, baseDomain, backendApiBaseUrl, environment, }) {
|
|
13
|
+
this.publicBucketName = publicBucketName;
|
|
14
|
+
this.privateBucketName = privateBucketName;
|
|
15
|
+
this.baseDomain = baseDomain;
|
|
16
|
+
this.backendApiBaseUrl = backendApiBaseUrl;
|
|
17
|
+
this.environment = environment;
|
|
18
|
+
}
|
|
19
|
+
getBackendUrl = ({ isMobile, useIP } = { isMobile: false, useIP: false }) => {
|
|
20
|
+
if (this.environment === 'local') {
|
|
21
|
+
return this.backendApiBaseUrl;
|
|
22
|
+
}
|
|
23
|
+
if (isMobile || useIP) {
|
|
24
|
+
return `http://${localIpAddress}:8086`;
|
|
25
|
+
}
|
|
26
|
+
return `https://api.a.getsodium.com`;
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* When running locally, the storage can be accessed
|
|
30
|
+
* either using localhost, the localIp of the host or Nginx URL
|
|
31
|
+
*
|
|
32
|
+
* We mainly use this for local testing as Chrome forces us to have
|
|
33
|
+
* an HTTPS endpoint to upload assets to the Firebase Emulator
|
|
34
|
+
* @returns
|
|
35
|
+
*/
|
|
36
|
+
getLocalStorageHostUrl = async ({ isMobile, useIP, }) => {
|
|
37
|
+
if (isMobile || useIP) {
|
|
38
|
+
return `http://${localIpAddress}:9199`;
|
|
39
|
+
}
|
|
40
|
+
return `https://assets.a.getsodium.com`;
|
|
41
|
+
};
|
|
42
|
+
getPublicStorageUrl = async ({ isMobile, useIP }) => {
|
|
43
|
+
if (this.environment === 'local') {
|
|
44
|
+
const storageServiceUrl = await this.getLocalStorageHostUrl({
|
|
45
|
+
isMobile,
|
|
46
|
+
useIP,
|
|
47
|
+
});
|
|
48
|
+
return `${storageServiceUrl}/${this.publicBucketName}`;
|
|
49
|
+
}
|
|
50
|
+
if (this.environment === 'prod') {
|
|
51
|
+
return `https://assets.${this.baseDomain}`;
|
|
52
|
+
}
|
|
53
|
+
return `https://assets-dev.${this.baseDomain}`;
|
|
54
|
+
};
|
|
55
|
+
getPrivateStorageUrl = async ({ isMobile, useIP, }) => {
|
|
56
|
+
if (this.environment === 'local') {
|
|
57
|
+
const storageServiceUrl = await this.getLocalStorageHostUrl({
|
|
58
|
+
isMobile,
|
|
59
|
+
useIP,
|
|
60
|
+
});
|
|
61
|
+
return `${storageServiceUrl}/${this.privateBucketName}`;
|
|
62
|
+
}
|
|
63
|
+
if (this.environment === 'prod') {
|
|
64
|
+
return `https://private-assets.${this.baseDomain}`;
|
|
65
|
+
}
|
|
66
|
+
return `https://private-assets-dev.${this.baseDomain}`;
|
|
67
|
+
};
|
|
68
|
+
getFrontendUrl = () => {
|
|
69
|
+
if (this.environment === 'local') {
|
|
70
|
+
return 'https://frontend.a.getsodium.com';
|
|
71
|
+
}
|
|
72
|
+
if (this.environment === 'prod') {
|
|
73
|
+
return `https://dev.${this.baseDomain}`;
|
|
74
|
+
}
|
|
75
|
+
return `https://${this.baseDomain}`;
|
|
76
|
+
};
|
|
77
|
+
/**
|
|
78
|
+
* Decides where to send the user back after the payment has been completed
|
|
79
|
+
* if we already decided on an origin, it will use that origin
|
|
80
|
+
*
|
|
81
|
+
* @param origin
|
|
82
|
+
* @returns
|
|
83
|
+
*/
|
|
84
|
+
getFrontendRedirectURL(origin) {
|
|
85
|
+
// This is the frontend url
|
|
86
|
+
const baseRedirect = origin ||
|
|
87
|
+
// Just in case origin is not provided (should not happen)
|
|
88
|
+
(this.environment === 'prod'
|
|
89
|
+
? `https://${this.baseDomain}`
|
|
90
|
+
: // DEV running in cloud run
|
|
91
|
+
this.environment === 'dev' && process.env.K_SERVICE
|
|
92
|
+
? `https://dev.${this.baseDomain}`
|
|
93
|
+
: 'https://localhost:4430');
|
|
94
|
+
return baseRedirect;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Decides which backend the payment provider should reply to
|
|
98
|
+
* It can be either dev, prod or local. Transbank queries the backend from
|
|
99
|
+
* the frontend, so you will still be able to use local urls
|
|
100
|
+
* @param origin
|
|
101
|
+
* @returns
|
|
102
|
+
*/
|
|
103
|
+
getBackendRedirectURLForTransBankPayments({ origin, orderId, storeId, }) {
|
|
104
|
+
const redirectUrl = this.getBackendUrl({
|
|
105
|
+
useIP: true,
|
|
106
|
+
preferPublicIp: true,
|
|
107
|
+
});
|
|
108
|
+
return `${redirectUrl}/payments/process?origin=${origin}&storeId=${storeId}&orderId=${orderId}`;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Redirección de pago exitoso
|
|
112
|
+
* @param origin
|
|
113
|
+
* @param orderId
|
|
114
|
+
*/
|
|
115
|
+
getPaymentSuccessRedirectURL(origin, orderId) {
|
|
116
|
+
const base = this.getFrontendRedirectURL(origin);
|
|
117
|
+
return `${base}/payment/processed?orderId=${encodeURIComponent(orderId)}`;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Redirección de pago con error (fallo en commit, etc)
|
|
121
|
+
* @param origin
|
|
122
|
+
* @param orderId
|
|
123
|
+
*/
|
|
124
|
+
getPaymentFailedRedirectURL(origin, orderId) {
|
|
125
|
+
const base = this.getFrontendRedirectURL(origin);
|
|
126
|
+
return `${base}/payment/cancelled?paymentFailed=true&orderId=${encodeURIComponent(orderId)}`;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Redirección de pago cancelado por el usuario
|
|
130
|
+
* @param origin
|
|
131
|
+
* @param orderId
|
|
132
|
+
*/
|
|
133
|
+
getPaymentCancelledRedirectURL(origin, orderId) {
|
|
134
|
+
const base = this.getFrontendRedirectURL(origin);
|
|
135
|
+
return `${base}/payment/cancelled?orderId=${encodeURIComponent(orderId)}`;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
exports.UrlService = UrlService;
|
|
139
|
+
//# sourceMappingURL=url.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url.service.js","sourceRoot":"","sources":["../../../../src/server/services/util/url.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { MockRequest as ExpressMockRequest, RequestOptions } from 'node-mocks-http';
|
|
2
|
+
import { BasicAccount } from './mock.model';
|
|
3
|
+
type MockRequest = Record<string, unknown> & ExpressMockRequest<any>;
|
|
4
|
+
export declare function mockRequest(options?: RequestOptions): MockRequest;
|
|
5
|
+
export declare const mockedRegisteredAccountRequest: (account?: Partial<BasicAccount>, patch?: RequestOptions) => MockRequest;
|
|
6
|
+
export {};
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mockedRegisteredAccountRequest = void 0;
|
|
4
|
+
exports.mockRequest = mockRequest;
|
|
5
|
+
const node_mocks_http_1 = require("node-mocks-http");
|
|
6
|
+
const firebase_mock_1 = require("./firebase.mock");
|
|
7
|
+
function mockRequest(options = {}) {
|
|
8
|
+
const request = (0, node_mocks_http_1.createRequest)(options);
|
|
9
|
+
if (options.ip) {
|
|
10
|
+
Object.assign(request, {
|
|
11
|
+
ip: options.ip,
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
Object.assign(request, {
|
|
15
|
+
acceptsLanguages: () => options.acceptsLanguages || [],
|
|
16
|
+
});
|
|
17
|
+
request.log = console.log;
|
|
18
|
+
request.warn = console.log;
|
|
19
|
+
request.error = console.log;
|
|
20
|
+
return request;
|
|
21
|
+
}
|
|
22
|
+
function defaultRequestOptions() {
|
|
23
|
+
return {
|
|
24
|
+
method: 'GET',
|
|
25
|
+
url: '/',
|
|
26
|
+
headers: {
|
|
27
|
+
Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
|
|
28
|
+
'Accept-Encoding': 'gzip, deflate, br',
|
|
29
|
+
// Request from Iphone
|
|
30
|
+
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) CriOS/39.0.2171.50 Mobile/12A365 Safari/600.1.4 (000206)',
|
|
31
|
+
},
|
|
32
|
+
acceptsLanguages: ['en', 'es'],
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
const mockedRegisteredAccountRequest = (account, patch = {}) => {
|
|
36
|
+
const defOptions = defaultRequestOptions();
|
|
37
|
+
const mockedToken = (0, firebase_mock_1.mockFirebaseToken)(account);
|
|
38
|
+
return mockRequest({
|
|
39
|
+
...defOptions,
|
|
40
|
+
headers: {
|
|
41
|
+
authorization: `Bearer ${mockedToken}`,
|
|
42
|
+
...defOptions.headers,
|
|
43
|
+
// We can extend the headers
|
|
44
|
+
},
|
|
45
|
+
...patch,
|
|
46
|
+
});
|
|
47
|
+
};
|
|
48
|
+
exports.mockedRegisteredAccountRequest = mockedRegisteredAccountRequest;
|
|
49
|
+
//# sourceMappingURL=express.mock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"express.mock.js","sourceRoot":"","sources":["../../../src/server/test/express.mock.ts"],"names":[],"mappings":";;;AAUA,kCAiBC;AAvBD,qDAA+C;AAC/C,mDAAmD;AAKnD,SAAgB,WAAW,CAAC,UAA0B,EAAE;IACtD,MAAM,OAAO,GAAG,IAAA,+BAAa,EAAC,OAAO,CAAC,CAAA;IACtC,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE;YACrB,EAAE,EAAE,OAAO,CAAC,EAAE;SACf,CAAC,CAAA;IACJ,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE;QACrB,gBAAgB,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,gBAAgB,IAAI,EAAE;KACvD,CAAC,CAAA;IAEF,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAA;IACzB,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,CAAA;IAC1B,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,CAAA;IAE3B,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,SAAS,qBAAqB;IAC5B,OAAO;QACL,MAAM,EAAE,KAAK;QACb,GAAG,EAAE,GAAG;QACR,OAAO,EAAE;YACP,MAAM,EACJ,uFAAuF;YACzF,iBAAiB,EAAE,mBAAmB;YACtC,sBAAsB;YACtB,YAAY,EACV,wJAAwJ;SAC3J;QACD,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;KAC/B,CAAA;AACH,CAAC;AAEM,MAAM,8BAA8B,GAAG,CAC5C,OAA+B,EAC/B,QAAwB,EAAE,EACb,EAAE;IACf,MAAM,UAAU,GAAG,qBAAqB,EAAE,CAAA;IAC1C,MAAM,WAAW,GAAG,IAAA,iCAAiB,EAAC,OAAO,CAAC,CAAA;IAE9C,OAAO,WAAW,CAAC;QACjB,GAAG,UAAU;QACb,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,WAAW,EAAE;YACtC,GAAG,UAAU,CAAC,OAAO;YACrB,4BAA4B;SAC7B;QACD,GAAG,KAAK;KACT,CAAC,CAAA;AACJ,CAAC,CAAA;AAhBY,QAAA,8BAA8B,kCAgB1C"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { FirebaseDecodedToken } from '../schemas/user.schema';
|
|
2
|
+
import { BasicAccount } from './mock.model';
|
|
3
|
+
export declare const mockedFirebaseDecodedToken: (mockedAccount?: Partial<BasicAccount>) => FirebaseDecodedToken;
|
|
4
|
+
export declare const mockFirebaseToken: (account?: Partial<BasicAccount>) => string;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mockFirebaseToken = exports.mockedFirebaseDecodedToken = void 0;
|
|
4
|
+
const mockedFirebaseDecodedToken = (mockedAccount) => {
|
|
5
|
+
const account = mockedAccount || {
|
|
6
|
+
email: 'testemail@test.com',
|
|
7
|
+
firebaseId: 'testfirebaseId',
|
|
8
|
+
};
|
|
9
|
+
const payload = {
|
|
10
|
+
aud: 'someFakeAudience',
|
|
11
|
+
auth_time: 1664050702,
|
|
12
|
+
email: account.email || '',
|
|
13
|
+
email_verified: true,
|
|
14
|
+
exp: 1695579492,
|
|
15
|
+
iat: 1664050702,
|
|
16
|
+
iss: 'someFakeProject',
|
|
17
|
+
sub: '12312312312',
|
|
18
|
+
uid: account.firebaseId ?? 'someFakeFirebaseId',
|
|
19
|
+
firebase: true,
|
|
20
|
+
};
|
|
21
|
+
return payload;
|
|
22
|
+
};
|
|
23
|
+
exports.mockedFirebaseDecodedToken = mockedFirebaseDecodedToken;
|
|
24
|
+
const mockFirebaseToken = (account) => {
|
|
25
|
+
const payload = (0, exports.mockedFirebaseDecodedToken)(account);
|
|
26
|
+
// This should be a JWT, but it is just a mock
|
|
27
|
+
return JSON.stringify(payload);
|
|
28
|
+
};
|
|
29
|
+
exports.mockFirebaseToken = mockFirebaseToken;
|
|
30
|
+
//# sourceMappingURL=firebase.mock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"firebase.mock.js","sourceRoot":"","sources":["../../../src/server/test/firebase.mock.ts"],"names":[],"mappings":";;;AAGO,MAAM,0BAA0B,GAAG,CACxC,aAAqC,EACf,EAAE;IACxB,MAAM,OAAO,GAAG,aAAa,IAAI;QAC/B,KAAK,EAAE,oBAAoB;QAC3B,UAAU,EAAE,gBAAgB;KAC7B,CAAA;IAED,MAAM,OAAO,GAAyB;QACpC,GAAG,EAAE,kBAAkB;QACvB,SAAS,EAAE,UAAU;QACrB,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE;QAC1B,cAAc,EAAE,IAAI;QACpB,GAAG,EAAE,UAAU;QACf,GAAG,EAAE,UAAU;QACf,GAAG,EAAE,iBAAiB;QACtB,GAAG,EAAE,aAAa;QAClB,GAAG,EAAE,OAAO,CAAC,UAAU,IAAI,oBAAoB;QAC/C,QAAQ,EAAE,IAAI;KACf,CAAA;IACD,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AArBY,QAAA,0BAA0B,8BAqBtC;AAEM,MAAM,iBAAiB,GAAG,CAAC,OAA+B,EAAU,EAAE;IAC3E,MAAM,OAAO,GAAG,IAAA,kCAA0B,EAAC,OAAO,CAAC,CAAA;IACnD,8CAA8C;IAC9C,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;AAChC,CAAC,CAAA;AAJY,QAAA,iBAAiB,qBAI7B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock.model.js","sourceRoot":"","sources":["../../../src/server/test/mock.model.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { AnyRootTypes, RouterCaller, RouterRecord } from '@trpc/server/unstable-core-do-not-import';
|
|
2
|
+
import { BasicAccount } from './mock.model';
|
|
3
|
+
export declare const mockedAuthenticatedTrpcRouter: <TRoot extends AnyRootTypes, TRecord extends RouterRecord>({ mockedAccount, createCaller, }: {
|
|
4
|
+
mockedAccount?: Partial<BasicAccount>;
|
|
5
|
+
createCaller: RouterCaller<TRoot, TRecord>;
|
|
6
|
+
}) => Promise<import("@trpc/server/unstable-core-do-not-import").DecorateRouterRecord<TRecord>>;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mockedAuthenticatedTrpcRouter = void 0;
|
|
4
|
+
const request_context_1 = require("../context/request.context");
|
|
5
|
+
const express_mock_1 = require("./express.mock");
|
|
6
|
+
const firebase_mock_1 = require("./firebase.mock");
|
|
7
|
+
const mockedAuthenticatedTrpcRouter = async ({ mockedAccount, createCaller, }) => {
|
|
8
|
+
const mockedRequest = (0, express_mock_1.mockedRegisteredAccountRequest)(mockedAccount);
|
|
9
|
+
const user = (0, firebase_mock_1.mockedFirebaseDecodedToken)(mockedAccount);
|
|
10
|
+
const ctx = (0, request_context_1.requestContext)(mockedRequest, user);
|
|
11
|
+
return createCaller(ctx);
|
|
12
|
+
};
|
|
13
|
+
exports.mockedAuthenticatedTrpcRouter = mockedAuthenticatedTrpcRouter;
|
|
14
|
+
//# sourceMappingURL=trpc.mock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trpc.mock.js","sourceRoot":"","sources":["../../../src/server/test/trpc.mock.ts"],"names":[],"mappings":";;;AAKA,gEAA2D;AAC3D,iDAA+D;AAC/D,mDAA4D;AAGrD,MAAM,6BAA6B,GAAG,KAAK,EAGhD,EACA,aAAa,EACb,YAAY,GAIb,EAAE,EAAE;IACH,MAAM,aAAa,GAAG,IAAA,6CAA8B,EAAC,aAAa,CAAC,CAAA;IACnE,MAAM,IAAI,GAAG,IAAA,0CAA0B,EAAC,aAAa,CAAC,CAAA;IACtD,MAAM,GAAG,GAAG,IAAA,gCAAc,EAAC,aAAa,EAAE,IAAI,CAAC,CAAA;IAE/C,OAAO,YAAY,CAAC,GAAG,CAAC,CAAA;AAC1B,CAAC,CAAA;AAfY,QAAA,6BAA6B,iCAezC"}
|