@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.
Files changed (129) hide show
  1. package/README.md +54 -38
  2. package/dist/container/Container.d.ts +441 -0
  3. package/dist/container/Container.js +895 -0
  4. package/dist/container/Container.js.map +1 -0
  5. package/dist/container/DistributedCacheInvalidator.d.ts +84 -0
  6. package/dist/container/DistributedCacheInvalidator.js +213 -0
  7. package/dist/container/DistributedCacheInvalidator.js.map +1 -0
  8. package/dist/container/LruCache.d.ts +14 -0
  9. package/dist/container/LruCache.js +23 -0
  10. package/dist/container/LruCache.js.map +1 -0
  11. package/dist/container/types.d.ts +128 -0
  12. package/dist/container/types.js +6 -0
  13. package/dist/container/types.js.map +1 -0
  14. package/dist/index.d.ts +31 -0
  15. package/dist/index.js +53 -1
  16. package/dist/index.js.map +1 -1
  17. package/dist/server/bootstraps/getExpressTrpcApp.d.ts +17 -0
  18. package/dist/server/bootstraps/getExpressTrpcApp.js +98 -0
  19. package/dist/server/bootstraps/getExpressTrpcApp.js.map +1 -0
  20. package/dist/server/consts.d.ts +35 -0
  21. package/dist/server/consts.js +33 -0
  22. package/dist/server/consts.js.map +1 -0
  23. package/dist/server/context/context.model.d.ts +13 -0
  24. package/dist/server/context/context.model.js +3 -0
  25. package/dist/server/context/context.model.js.map +1 -0
  26. package/dist/server/context/request.context.d.ts +40 -0
  27. package/dist/server/context/request.context.js +91 -0
  28. package/dist/server/context/request.context.js.map +1 -0
  29. package/dist/server/context/trpc.context.d.ts +11 -0
  30. package/dist/server/context/trpc.context.js +67 -0
  31. package/dist/server/context/trpc.context.js.map +1 -0
  32. package/dist/server/initOpenApiDocs.d.ts +9 -0
  33. package/dist/server/initOpenApiDocs.js +18 -0
  34. package/dist/server/initOpenApiDocs.js.map +1 -0
  35. package/dist/server/middleware/cloudTaskDecrypt.middleware.d.ts +6 -0
  36. package/dist/server/middleware/cloudTaskDecrypt.middleware.js +44 -0
  37. package/dist/server/middleware/cloudTaskDecrypt.middleware.js.map +1 -0
  38. package/dist/server/middleware/error.middleware.d.ts +17 -0
  39. package/dist/server/middleware/error.middleware.js +66 -0
  40. package/dist/server/middleware/error.middleware.js.map +1 -0
  41. package/dist/server/middleware/handleRequest.middleware.d.ts +7 -0
  42. package/dist/server/middleware/handleRequest.middleware.js +40 -0
  43. package/dist/server/middleware/handleRequest.middleware.js.map +1 -0
  44. package/dist/server/middleware/logger/cloudRun.logger.d.ts +27 -0
  45. package/dist/server/middleware/logger/cloudRun.logger.js +87 -0
  46. package/dist/server/middleware/logger/cloudRun.logger.js.map +1 -0
  47. package/dist/server/middleware/logger/logger.service.d.ts +6 -0
  48. package/dist/server/middleware/logger/logger.service.js +17 -0
  49. package/dist/server/middleware/logger/logger.service.js.map +1 -0
  50. package/dist/server/middleware/logs.middleware.d.ts +7 -0
  51. package/dist/server/middleware/logs.middleware.js +130 -0
  52. package/dist/server/middleware/logs.middleware.js.map +1 -0
  53. package/dist/server/middleware/requireAuthenticated.d.ts +2 -0
  54. package/dist/server/middleware/requireAuthenticated.js +13 -0
  55. package/dist/server/middleware/requireAuthenticated.js.map +1 -0
  56. package/dist/server/middleware/trpcError.middleware.d.ts +4 -0
  57. package/dist/server/middleware/trpcError.middleware.js +38 -0
  58. package/dist/server/middleware/trpcError.middleware.js.map +1 -0
  59. package/dist/server/schemas/user.schema.d.ts +109 -0
  60. package/dist/server/schemas/user.schema.js +28 -0
  61. package/dist/server/schemas/user.schema.js.map +1 -0
  62. package/dist/server/sentry/getSentry.d.ts +6 -0
  63. package/dist/server/sentry/getSentry.js +45 -0
  64. package/dist/server/sentry/getSentry.js.map +1 -0
  65. package/dist/server/sentry/sentry.service.d.ts +34 -0
  66. package/dist/server/sentry/sentry.service.js +110 -0
  67. package/dist/server/sentry/sentry.service.js.map +1 -0
  68. package/dist/server/services/email/email.model.d.ts +84 -0
  69. package/dist/server/services/email/email.model.js +62 -0
  70. package/dist/server/services/email/email.model.js.map +1 -0
  71. package/dist/server/services/email/email.service.d.ts +23 -0
  72. package/dist/server/services/email/email.service.js +139 -0
  73. package/dist/server/services/email/email.service.js.map +1 -0
  74. package/dist/server/services/gcp/getGcpServiceAccountFromBase64.d.ts +15 -0
  75. package/dist/server/services/gcp/getGcpServiceAccountFromBase64.js +9 -0
  76. package/dist/server/services/gcp/getGcpServiceAccountFromBase64.js.map +1 -0
  77. package/dist/server/services/secrets/secret.service.d.ts +32 -0
  78. package/dist/server/services/secrets/secret.service.js +220 -0
  79. package/dist/server/services/secrets/secret.service.js.map +1 -0
  80. package/dist/server/services/sendgrid/sendgrid.model.d.ts +118 -0
  81. package/dist/server/services/sendgrid/sendgrid.model.js +3 -0
  82. package/dist/server/services/sendgrid/sendgrid.model.js.map +1 -0
  83. package/dist/server/services/sendgrid/sendgridApi.service.d.ts +13 -0
  84. package/dist/server/services/sendgrid/sendgridApi.service.js +79 -0
  85. package/dist/server/services/sendgrid/sendgridApi.service.js.map +1 -0
  86. package/dist/server/services/sendgrid/sendgridHooks.model.d.ts +27 -0
  87. package/dist/server/services/sendgrid/sendgridHooks.model.js +19 -0
  88. package/dist/server/services/sendgrid/sendgridHooks.model.js.map +1 -0
  89. package/dist/server/services/translations/template.util.d.ts +7 -0
  90. package/dist/server/services/translations/template.util.js +11 -0
  91. package/dist/server/services/translations/template.util.js.map +1 -0
  92. package/dist/server/services/translations/translation.model.d.ts +4 -0
  93. package/dist/server/services/translations/translation.model.js +6 -0
  94. package/dist/server/services/translations/translation.model.js.map +1 -0
  95. package/dist/server/services/translations/translation.service.d.ts +25 -0
  96. package/dist/server/services/translations/translation.service.js +97 -0
  97. package/dist/server/services/translations/translation.service.js.map +1 -0
  98. package/dist/server/services/util/benchmarker.d.ts +13 -0
  99. package/dist/server/services/util/benchmarker.js +34 -0
  100. package/dist/server/services/util/benchmarker.js.map +1 -0
  101. package/dist/server/services/util/pagination.d.ts +50 -0
  102. package/dist/server/services/util/pagination.js +57 -0
  103. package/dist/server/services/util/pagination.js.map +1 -0
  104. package/dist/server/services/util/url.service.d.ts +75 -0
  105. package/dist/server/services/util/url.service.js +139 -0
  106. package/dist/server/services/util/url.service.js.map +1 -0
  107. package/dist/server/test/express.mock.d.ts +6 -0
  108. package/dist/server/test/express.mock.js +49 -0
  109. package/dist/server/test/express.mock.js.map +1 -0
  110. package/dist/server/test/firebase.mock.d.ts +4 -0
  111. package/dist/server/test/firebase.mock.js +30 -0
  112. package/dist/server/test/firebase.mock.js.map +1 -0
  113. package/dist/server/test/mock.model.d.ts +5 -0
  114. package/dist/server/test/mock.model.js +3 -0
  115. package/dist/server/test/mock.model.js.map +1 -0
  116. package/dist/server/test/trpc.mock.d.ts +6 -0
  117. package/dist/server/test/trpc.mock.js +14 -0
  118. package/dist/server/test/trpc.mock.js.map +1 -0
  119. package/dist/server/trpc.d.ts +364 -0
  120. package/dist/server/trpc.js +87 -0
  121. package/dist/server/trpc.js.map +1 -0
  122. package/dist/server/types/Envinronment.d.ts +1 -0
  123. package/dist/server/types/Envinronment.js +3 -0
  124. package/dist/server/types/Envinronment.js.map +1 -0
  125. package/dist/test/const.d.ts +4 -0
  126. package/dist/test/const.js +11 -1
  127. package/dist/test/const.js.map +1 -1
  128. package/dist/tsconfig.tsbuildinfo +1 -1
  129. 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,5 @@
1
+ export type BasicAccount = {
2
+ email?: string | null;
3
+ firebaseId?: string | null;
4
+ [key: string]: unknown;
5
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=mock.model.js.map
@@ -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"}