@fiado/type-kit 3.523.0 → 3.525.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/_test_/unit/pdfRender/pdfRenderDtos.test.ts +76 -0
- package/bin/index.d.ts +1 -0
- package/bin/index.js +3 -1
- package/bin/pdfRender/dtos/DocumentUrlResponse.d.ts +12 -0
- package/bin/pdfRender/dtos/DocumentUrlResponse.js +7 -0
- package/bin/pdfRender/dtos/GeneratePdfRequest.d.ts +6 -0
- package/bin/pdfRender/dtos/GeneratePdfRequest.js +27 -0
- package/bin/pdfRender/dtos/MergePdfsRequest.d.ts +6 -0
- package/bin/pdfRender/dtos/MergePdfsRequest.js +29 -0
- package/bin/pdfRender/dtos/PdfDocumentResponse.d.ts +16 -0
- package/bin/pdfRender/dtos/PdfDocumentResponse.js +10 -0
- package/bin/pdfRender/dtos/PublishTemplateRequest.d.ts +10 -0
- package/bin/pdfRender/dtos/PublishTemplateRequest.js +40 -0
- package/bin/pdfRender/dtos/PublishTemplateResponse.d.ts +4 -0
- package/bin/pdfRender/dtos/PublishTemplateResponse.js +6 -0
- package/bin/pdfRender/dtos/RenderDocumentRequest.d.ts +8 -0
- package/bin/pdfRender/dtos/RenderDocumentRequest.js +34 -0
- package/bin/pdfRender/dtos/RenderDocumentResponse.d.ts +5 -0
- package/bin/pdfRender/dtos/RenderDocumentResponse.js +7 -0
- package/bin/pdfRender/dtos/TemplateLocationRequest.d.ts +6 -0
- package/bin/pdfRender/dtos/TemplateLocationRequest.js +36 -0
- package/bin/pdfRender/dtos/TemplateRefRequest.d.ts +14 -0
- package/bin/pdfRender/dtos/TemplateRefRequest.js +54 -0
- package/bin/pdfRender/dtos/TemplateSummaryResponse.d.ts +6 -0
- package/bin/pdfRender/dtos/TemplateSummaryResponse.js +6 -0
- package/bin/pdfRender/dtos/UploadAssetRequest.d.ts +9 -0
- package/bin/pdfRender/dtos/UploadAssetRequest.js +49 -0
- package/bin/pdfRender/dtos/UploadAssetResponse.d.ts +4 -0
- package/bin/pdfRender/dtos/UploadAssetResponse.js +6 -0
- package/bin/pdfRender/index.d.ts +13 -0
- package/bin/pdfRender/index.js +30 -0
- package/package.json +1 -1
- package/src/index.ts +3 -0
- package/src/pdfRender/dtos/DocumentUrlResponse.ts +12 -0
- package/src/pdfRender/dtos/GeneratePdfRequest.ts +11 -0
- package/src/pdfRender/dtos/MergePdfsRequest.ts +11 -0
- package/src/pdfRender/dtos/PdfDocumentResponse.ts +16 -0
- package/src/pdfRender/dtos/PublishTemplateRequest.ts +18 -0
- package/src/pdfRender/dtos/PublishTemplateResponse.ts +4 -0
- package/src/pdfRender/dtos/RenderDocumentRequest.ts +16 -0
- package/src/pdfRender/dtos/RenderDocumentResponse.ts +6 -0
- package/src/pdfRender/dtos/TemplateLocationRequest.ts +15 -0
- package/src/pdfRender/dtos/TemplateRefRequest.ts +28 -0
- package/src/pdfRender/dtos/TemplateSummaryResponse.ts +6 -0
- package/src/pdfRender/dtos/UploadAssetRequest.ts +25 -0
- package/src/pdfRender/dtos/UploadAssetResponse.ts +4 -0
- package/src/pdfRender/index.ts +14 -0
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { plainToInstance } from 'class-transformer';
|
|
3
|
+
import { validate } from 'class-validator';
|
|
4
|
+
import {
|
|
5
|
+
GeneratePdfRequest, MergePdfsRequest, PublishTemplateRequest, RenderDocumentRequest,
|
|
6
|
+
TemplateLocationRequest, UploadAssetRequest,
|
|
7
|
+
} from '../../../src/pdfRender';
|
|
8
|
+
|
|
9
|
+
const errorsOf = async <T extends object>(cls: new () => T, body: unknown) =>
|
|
10
|
+
(await validate(plainToInstance(cls, body) as object, { whitelist: true })).map(e => e.property);
|
|
11
|
+
|
|
12
|
+
describe('pdfRender render DTOs', () => {
|
|
13
|
+
it('accepts a deep template ref with data', async () => {
|
|
14
|
+
expect(await errorsOf(RenderDocumentRequest, {
|
|
15
|
+
template: { enterprise: 'FIADOSA', partnerId: 'UNE', category: 'CREDITS', documentType: 'CREDIT_CONTRATO_SIMPLE', version: '2' },
|
|
16
|
+
data: { cliente: { nombre: 'Ana' } },
|
|
17
|
+
})).toEqual([]);
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it('accepts a flat template ref without version', async () => {
|
|
21
|
+
expect(await errorsOf(RenderDocumentRequest, { template: { enterprise: 'PAGO_CONFIADO', documentType: 'TERMS_WALLET_PAGO' }, data: {} })).toEqual([]);
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
it('rejects path traversal and slashes in segments', async () => {
|
|
25
|
+
expect(await errorsOf(RenderDocumentRequest, { template: { enterprise: '../FIADOSA', documentType: 'A/B' }, data: {} })).toEqual(['template']);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it('rejects a non numeric version', async () => {
|
|
29
|
+
expect(await errorsOf(RenderDocumentRequest, { template: { enterprise: 'FIADOSA', documentType: 'X', version: 'V2' }, data: {} })).toEqual(['template']);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it('requires data to be an object', async () => {
|
|
33
|
+
expect(await errorsOf(RenderDocumentRequest, { template: { enterprise: 'FIADOSA', documentType: 'X' }, data: 'nope' })).toEqual(['data']);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it('requires non empty html', async () => {
|
|
37
|
+
expect(await errorsOf(GeneratePdfRequest, { html: '' })).toEqual(['html']);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it('requires between 1 and 50 pdfs', async () => {
|
|
41
|
+
expect(await errorsOf(MergePdfsRequest, { pdfs: [] })).toEqual(['pdfs']);
|
|
42
|
+
expect(await errorsOf(MergePdfsRequest, { pdfs: Array(51).fill('JVBERi0=') })).toEqual(['pdfs']);
|
|
43
|
+
expect(await errorsOf(MergePdfsRequest, { pdfs: ['JVBERi0='] })).toEqual([]);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
describe('pdfRender admin DTOs', () => {
|
|
48
|
+
it('publish: requires documentType and html, and drops any version', async () => {
|
|
49
|
+
expect(await errorsOf(PublishTemplateRequest, { template: { enterprise: 'FIADOSA', documentType: 'X' }, html: '<p/>' })).toEqual([]);
|
|
50
|
+
expect(await errorsOf(PublishTemplateRequest, { template: { enterprise: 'FIADOSA', documentType: 'X' }, html: '' })).toEqual(['html']);
|
|
51
|
+
const withVersion = plainToInstance(PublishTemplateRequest, { template: { enterprise: 'FIADOSA', documentType: 'X', version: '9' }, html: '<p/>' });
|
|
52
|
+
await validate(withVersion, { whitelist: true });
|
|
53
|
+
expect((withVersion.template as unknown as Record<string, unknown>).version).toBeUndefined();
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it('asset: accepts nested folders and known types, rejects traversal and other types', async () => {
|
|
57
|
+
expect(await errorsOf(UploadAssetRequest, { enterprise: 'FIADOSA', path: 'fonts/Carlito-Bold.ttf', contentType: 'font/ttf', contentBase64: 'AAAA' })).toEqual([]);
|
|
58
|
+
expect(await errorsOf(UploadAssetRequest, { enterprise: 'FIADOSA', path: '../x.ttf', contentType: 'font/ttf', contentBase64: 'AAAA' })).toEqual(['path']);
|
|
59
|
+
expect(await errorsOf(UploadAssetRequest, { enterprise: 'FIADOSA', path: 'x.exe', contentType: 'application/x-msdownload', contentBase64: 'AAAA' })).toEqual(['path', 'contentType']);
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it('location: enterprise required, partnerId optional', async () => {
|
|
63
|
+
expect(await errorsOf(TemplateLocationRequest, { enterprise: 'FIADOSA', partnerId: 'UNE', category: 'CREDITS' })).toEqual([]);
|
|
64
|
+
expect(await errorsOf(TemplateLocationRequest, {})).toEqual(['enterprise']);
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
describe('pdfRender includeContent', () => {
|
|
69
|
+
it('is optional and must be boolean on the three generation requests', async () => {
|
|
70
|
+
const template = { enterprise: 'FIADOSA', documentType: 'X' };
|
|
71
|
+
expect(await errorsOf(RenderDocumentRequest, { template, data: {}, includeContent: true })).toEqual([]);
|
|
72
|
+
expect(await errorsOf(RenderDocumentRequest, { template, data: {}, includeContent: 'yes' })).toEqual(['includeContent']);
|
|
73
|
+
expect(await errorsOf(GeneratePdfRequest, { html: '<p/>', includeContent: false })).toEqual([]);
|
|
74
|
+
expect(await errorsOf(MergePdfsRequest, { pdfs: ['JVBERi0='], includeContent: 1 })).toEqual(['includeContent']);
|
|
75
|
+
});
|
|
76
|
+
});
|
package/bin/index.d.ts
CHANGED
package/bin/index.js
CHANGED
|
@@ -38,7 +38,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
39
|
exports.Blacklist = exports.CentralPayments = exports.Helpdesk = exports.FiadoApiResponse = exports.Auth = exports.LegalDocumentsBusiness = exports.Role = exports.STPAccount = exports.RiskProfile = exports.FraudPreventionEngine = exports.BBVARst = exports.Stp = exports.BenefitCenter = exports.BankAccount = exports.P2pContact = exports.CreditContract = exports.Contract = exports.ProductCatalog = exports.ContactInfo = exports.TransactionAnalytics = exports.Transaction = exports.TransactionProcessor = exports.GenericMessage = exports.EventBridgeMessage = exports.SessionActivity = exports.MessageMoments = exports.NotificationMessages = exports.ServicePayment = exports.Header = exports.Identity = exports.UserTags = exports.Group = exports.File = exports.ExchangeRate = exports.Directory = exports.Currency = exports.Country = exports.Card = exports.Authentication = exports.AppContent = exports.App = exports.Offices = exports.Places = exports.Address = exports.Beneficiary = exports.Activity = exports.Biometrics = exports.MetamapConnector = exports.Account = exports.Crypto = void 0;
|
|
40
40
|
exports.RetailWizard = exports.RetailCustomer = exports.RetailCards = exports.RetailCatalog = exports.RetailCommission = exports.RetailOrg = exports.EmailVerification = exports.NetworkConnector = exports.Modelias = exports.TotpSecurity = exports.Passport = exports.WalletFunding = exports.Remittance = exports.PlatformRbac = exports.CognitoBackofficeConnector = exports.WhatsappConnector = exports.TwilioConnector = exports.MessagesConnector = exports.Mdm = exports.MilestoneBusiness = exports.CirculoCredito = exports.CreditStatements = exports.Sentry = exports.AiEngine = exports.Funnel = exports.TeamsConnector = exports.PlatformErrorEvents = exports.CustomerFile = exports.CreditBackoffice = exports.CreditDashboard = exports.CreditEngine = exports.Credit = exports.ComissionBusiness = exports.ReferralBusiness = exports.ZendeskMessaging = exports.NotificationWS = exports.Event = exports.PayrollBusiness = exports.Cnbv = exports.DirectorySetting = exports.InvoiceCollector = exports.Collector = exports.Pricelist = exports.Company = exports.Services = exports.AccountIssuanceBusiness = exports.AppSelectionData = exports.Device = exports.Observations = exports.IssuanceBusiness = void 0;
|
|
41
|
-
exports.DatalakeReports = exports.RewardsEligibility = exports.Rewards = exports.DynamicForm = exports.FileStorage = exports.MoneyTransfer = exports.RetailLoan = exports.Membership = exports.WebhookBusiness = exports.PeopleBusiness = exports.UserConfirmations = exports.Collection = exports.Shipping = exports.PhoneSales = exports.Onboarding = exports.Kyc = exports.LoanScoring = exports.LoanCredit = exports.LoanCollectorAssignment = exports.LoanOfferings = exports.Shortlink = exports.LoanConfig = exports.DatalakeQuery = exports.RetailIntegration = exports.RetailPromotions = void 0;
|
|
41
|
+
exports.PdfRender = exports.DatalakeReports = exports.RewardsEligibility = exports.Rewards = exports.DynamicForm = exports.FileStorage = exports.MoneyTransfer = exports.RetailLoan = exports.Membership = exports.WebhookBusiness = exports.PeopleBusiness = exports.UserConfirmations = exports.Collection = exports.Shipping = exports.PhoneSales = exports.Onboarding = exports.Kyc = exports.LoanScoring = exports.LoanCredit = exports.LoanCollectorAssignment = exports.LoanOfferings = exports.Shortlink = exports.LoanConfig = exports.DatalakeQuery = exports.RetailIntegration = exports.RetailPromotions = void 0;
|
|
42
42
|
exports.Crypto = __importStar(require("./crypto"));
|
|
43
43
|
exports.Account = __importStar(require("./account"));
|
|
44
44
|
exports.MetamapConnector = __importStar(require("./metamapConnector"));
|
|
@@ -246,3 +246,5 @@ exports.Rewards = __importStar(require("./rewards"));
|
|
|
246
246
|
// servicios emisores: POST /events (request/response) y GET /runs/{id}.
|
|
247
247
|
exports.RewardsEligibility = __importStar(require("./rewardsEligibility"));
|
|
248
248
|
exports.DatalakeReports = __importStar(require("./datalakeReports"));
|
|
249
|
+
// PdfRender: DTOs del lambda pdf-render-business (plantilla HTML → PDF multitenant y su backoffice).
|
|
250
|
+
exports.PdfRender = __importStar(require("./pdfRender"));
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** Nueva URL firmada para un documento ya guardado. */
|
|
2
|
+
export declare class DocumentUrlResponse {
|
|
3
|
+
documentId: string;
|
|
4
|
+
url: string;
|
|
5
|
+
/** ISO-8601. */
|
|
6
|
+
expiresAt: string;
|
|
7
|
+
sha256: string;
|
|
8
|
+
pages: number;
|
|
9
|
+
bytes: number;
|
|
10
|
+
/** ISO-8601 de la generación. */
|
|
11
|
+
createdAt: string;
|
|
12
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.GeneratePdfRequest = void 0;
|
|
13
|
+
const class_validator_1 = require("class-validator");
|
|
14
|
+
/** HTML ya resuelto por el consumidor; se imprime en A4 con márgenes de 2 mm. */
|
|
15
|
+
class GeneratePdfRequest {
|
|
16
|
+
}
|
|
17
|
+
exports.GeneratePdfRequest = GeneratePdfRequest;
|
|
18
|
+
__decorate([
|
|
19
|
+
(0, class_validator_1.IsString)(),
|
|
20
|
+
(0, class_validator_1.IsNotEmpty)(),
|
|
21
|
+
__metadata("design:type", String)
|
|
22
|
+
], GeneratePdfRequest.prototype, "html", void 0);
|
|
23
|
+
__decorate([
|
|
24
|
+
(0, class_validator_1.IsOptional)(),
|
|
25
|
+
(0, class_validator_1.IsBoolean)(),
|
|
26
|
+
__metadata("design:type", Boolean)
|
|
27
|
+
], GeneratePdfRequest.prototype, "includeContent", void 0);
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.MergePdfsRequest = void 0;
|
|
13
|
+
const class_validator_1 = require("class-validator");
|
|
14
|
+
/** PDFs en base64, en el orden en que deben quedar en el documento final. */
|
|
15
|
+
class MergePdfsRequest {
|
|
16
|
+
}
|
|
17
|
+
exports.MergePdfsRequest = MergePdfsRequest;
|
|
18
|
+
__decorate([
|
|
19
|
+
(0, class_validator_1.IsArray)(),
|
|
20
|
+
(0, class_validator_1.ArrayMinSize)(1),
|
|
21
|
+
(0, class_validator_1.ArrayMaxSize)(50),
|
|
22
|
+
(0, class_validator_1.IsString)({ each: true }),
|
|
23
|
+
__metadata("design:type", Array)
|
|
24
|
+
], MergePdfsRequest.prototype, "pdfs", void 0);
|
|
25
|
+
__decorate([
|
|
26
|
+
(0, class_validator_1.IsOptional)(),
|
|
27
|
+
(0, class_validator_1.IsBoolean)(),
|
|
28
|
+
__metadata("design:type", Boolean)
|
|
29
|
+
], MergePdfsRequest.prototype, "includeContent", void 0);
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Documento PDF generado y guardado por pdf-render-business.
|
|
3
|
+
* La URL firmada vence en `expiresAt`; para una nueva se usa GET /documents/{documentId}/url.
|
|
4
|
+
*/
|
|
5
|
+
export declare class PdfDocumentResponse {
|
|
6
|
+
documentId: string;
|
|
7
|
+
url: string;
|
|
8
|
+
/** ISO-8601. */
|
|
9
|
+
expiresAt: string;
|
|
10
|
+
/** SHA-256 en hexadecimal del PDF exacto que quedó guardado. */
|
|
11
|
+
sha256: string;
|
|
12
|
+
pages: number;
|
|
13
|
+
bytes: number;
|
|
14
|
+
/** Sólo cuando el request pidió `includeContent: true`. */
|
|
15
|
+
base64?: string;
|
|
16
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PdfDocumentResponse = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Documento PDF generado y guardado por pdf-render-business.
|
|
6
|
+
* La URL firmada vence en `expiresAt`; para una nueva se usa GET /documents/{documentId}/url.
|
|
7
|
+
*/
|
|
8
|
+
class PdfDocumentResponse {
|
|
9
|
+
}
|
|
10
|
+
exports.PdfDocumentResponse = PdfDocumentResponse;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { TemplateLocationRequest } from "./TemplateLocationRequest";
|
|
2
|
+
/** Tipo de documento al que se le publica una versión nueva. */
|
|
3
|
+
export declare class PublishTemplateTarget extends TemplateLocationRequest {
|
|
4
|
+
documentType: string;
|
|
5
|
+
}
|
|
6
|
+
/** Publica el HTML como la siguiente versión del tipo de documento. La versión la asigna el servicio. */
|
|
7
|
+
export declare class PublishTemplateRequest {
|
|
8
|
+
template: PublishTemplateTarget;
|
|
9
|
+
html: string;
|
|
10
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.PublishTemplateRequest = exports.PublishTemplateTarget = void 0;
|
|
13
|
+
const class_validator_1 = require("class-validator");
|
|
14
|
+
const class_transformer_1 = require("class-transformer");
|
|
15
|
+
const TemplateLocationRequest_1 = require("./TemplateLocationRequest");
|
|
16
|
+
/** Tipo de documento al que se le publica una versión nueva. */
|
|
17
|
+
class PublishTemplateTarget extends TemplateLocationRequest_1.TemplateLocationRequest {
|
|
18
|
+
}
|
|
19
|
+
exports.PublishTemplateTarget = PublishTemplateTarget;
|
|
20
|
+
__decorate([
|
|
21
|
+
(0, class_validator_1.IsString)(),
|
|
22
|
+
(0, class_validator_1.IsNotEmpty)(),
|
|
23
|
+
(0, class_validator_1.Matches)(/^[A-Za-z0-9_-]{1,64}$/),
|
|
24
|
+
__metadata("design:type", String)
|
|
25
|
+
], PublishTemplateTarget.prototype, "documentType", void 0);
|
|
26
|
+
/** Publica el HTML como la siguiente versión del tipo de documento. La versión la asigna el servicio. */
|
|
27
|
+
class PublishTemplateRequest {
|
|
28
|
+
}
|
|
29
|
+
exports.PublishTemplateRequest = PublishTemplateRequest;
|
|
30
|
+
__decorate([
|
|
31
|
+
(0, class_validator_1.IsDefined)(),
|
|
32
|
+
(0, class_validator_1.ValidateNested)(),
|
|
33
|
+
(0, class_transformer_1.Type)(() => PublishTemplateTarget),
|
|
34
|
+
__metadata("design:type", PublishTemplateTarget)
|
|
35
|
+
], PublishTemplateRequest.prototype, "template", void 0);
|
|
36
|
+
__decorate([
|
|
37
|
+
(0, class_validator_1.IsString)(),
|
|
38
|
+
(0, class_validator_1.IsNotEmpty)(),
|
|
39
|
+
__metadata("design:type", String)
|
|
40
|
+
], PublishTemplateRequest.prototype, "html", void 0);
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { TemplateRefRequest } from "./TemplateRefRequest";
|
|
2
|
+
export declare class RenderDocumentRequest {
|
|
3
|
+
template: TemplateRefRequest;
|
|
4
|
+
/** Variables de la plantilla. Se escapan como HTML salvo que la plantilla use {{{triple}}}. */
|
|
5
|
+
data: Record<string, unknown>;
|
|
6
|
+
/** Además de la URL, devuelve el PDF en base64 en la respuesta (tope de 4 MiB). */
|
|
7
|
+
includeContent?: boolean;
|
|
8
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.RenderDocumentRequest = void 0;
|
|
13
|
+
const class_validator_1 = require("class-validator");
|
|
14
|
+
const class_transformer_1 = require("class-transformer");
|
|
15
|
+
const TemplateRefRequest_1 = require("./TemplateRefRequest");
|
|
16
|
+
class RenderDocumentRequest {
|
|
17
|
+
}
|
|
18
|
+
exports.RenderDocumentRequest = RenderDocumentRequest;
|
|
19
|
+
__decorate([
|
|
20
|
+
(0, class_validator_1.IsDefined)(),
|
|
21
|
+
(0, class_validator_1.ValidateNested)(),
|
|
22
|
+
(0, class_transformer_1.Type)(() => TemplateRefRequest_1.TemplateRefRequest),
|
|
23
|
+
__metadata("design:type", TemplateRefRequest_1.TemplateRefRequest)
|
|
24
|
+
], RenderDocumentRequest.prototype, "template", void 0);
|
|
25
|
+
__decorate([
|
|
26
|
+
(0, class_validator_1.IsDefined)(),
|
|
27
|
+
(0, class_validator_1.IsObject)(),
|
|
28
|
+
__metadata("design:type", Object)
|
|
29
|
+
], RenderDocumentRequest.prototype, "data", void 0);
|
|
30
|
+
__decorate([
|
|
31
|
+
(0, class_validator_1.IsOptional)(),
|
|
32
|
+
(0, class_validator_1.IsBoolean)(),
|
|
33
|
+
__metadata("design:type", Boolean)
|
|
34
|
+
], RenderDocumentRequest.prototype, "includeContent", void 0);
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RenderDocumentResponse = void 0;
|
|
4
|
+
const PdfDocumentResponse_1 = require("./PdfDocumentResponse");
|
|
5
|
+
class RenderDocumentResponse extends PdfDocumentResponse_1.PdfDocumentResponse {
|
|
6
|
+
}
|
|
7
|
+
exports.RenderDocumentResponse = RenderDocumentResponse;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.TemplateLocationRequest = void 0;
|
|
13
|
+
const class_validator_1 = require("class-validator");
|
|
14
|
+
const SEGMENT = /^[A-Za-z0-9_-]{1,64}$/;
|
|
15
|
+
/** Carpeta del bucket de plantillas: empresa, y opcionalmente partner + categoría. */
|
|
16
|
+
class TemplateLocationRequest {
|
|
17
|
+
}
|
|
18
|
+
exports.TemplateLocationRequest = TemplateLocationRequest;
|
|
19
|
+
__decorate([
|
|
20
|
+
(0, class_validator_1.IsString)(),
|
|
21
|
+
(0, class_validator_1.IsNotEmpty)(),
|
|
22
|
+
(0, class_validator_1.Matches)(SEGMENT),
|
|
23
|
+
__metadata("design:type", String)
|
|
24
|
+
], TemplateLocationRequest.prototype, "enterprise", void 0);
|
|
25
|
+
__decorate([
|
|
26
|
+
(0, class_validator_1.IsOptional)(),
|
|
27
|
+
(0, class_validator_1.IsString)(),
|
|
28
|
+
(0, class_validator_1.Matches)(SEGMENT),
|
|
29
|
+
__metadata("design:type", String)
|
|
30
|
+
], TemplateLocationRequest.prototype, "partnerId", void 0);
|
|
31
|
+
__decorate([
|
|
32
|
+
(0, class_validator_1.IsOptional)(),
|
|
33
|
+
(0, class_validator_1.IsString)(),
|
|
34
|
+
(0, class_validator_1.Matches)(SEGMENT),
|
|
35
|
+
__metadata("design:type", String)
|
|
36
|
+
], TemplateLocationRequest.prototype, "category", void 0);
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Referencia a una plantilla del bucket de plantillas.
|
|
3
|
+
* Layout profundo: {enterprise}/{partnerId}/{category}/{documentType}/V{version}.html
|
|
4
|
+
* Layout plano: {enterprise}/{documentType}/V{version}.html
|
|
5
|
+
* partnerId y category van juntos o no van.
|
|
6
|
+
*/
|
|
7
|
+
export declare class TemplateRefRequest {
|
|
8
|
+
enterprise: string;
|
|
9
|
+
partnerId?: string;
|
|
10
|
+
category?: string;
|
|
11
|
+
documentType: string;
|
|
12
|
+
/** Número de versión sin la "V". Sin valor se usa la versión más alta publicada. */
|
|
13
|
+
version?: string;
|
|
14
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.TemplateRefRequest = void 0;
|
|
13
|
+
const class_validator_1 = require("class-validator");
|
|
14
|
+
/** Segmento de ruta S3 permitido: letras, dígitos, guion y guion bajo. */
|
|
15
|
+
const SEGMENT = /^[A-Za-z0-9_-]{1,64}$/;
|
|
16
|
+
/**
|
|
17
|
+
* Referencia a una plantilla del bucket de plantillas.
|
|
18
|
+
* Layout profundo: {enterprise}/{partnerId}/{category}/{documentType}/V{version}.html
|
|
19
|
+
* Layout plano: {enterprise}/{documentType}/V{version}.html
|
|
20
|
+
* partnerId y category van juntos o no van.
|
|
21
|
+
*/
|
|
22
|
+
class TemplateRefRequest {
|
|
23
|
+
}
|
|
24
|
+
exports.TemplateRefRequest = TemplateRefRequest;
|
|
25
|
+
__decorate([
|
|
26
|
+
(0, class_validator_1.IsString)(),
|
|
27
|
+
(0, class_validator_1.IsNotEmpty)(),
|
|
28
|
+
(0, class_validator_1.Matches)(SEGMENT),
|
|
29
|
+
__metadata("design:type", String)
|
|
30
|
+
], TemplateRefRequest.prototype, "enterprise", void 0);
|
|
31
|
+
__decorate([
|
|
32
|
+
(0, class_validator_1.IsOptional)(),
|
|
33
|
+
(0, class_validator_1.IsString)(),
|
|
34
|
+
(0, class_validator_1.Matches)(SEGMENT),
|
|
35
|
+
__metadata("design:type", String)
|
|
36
|
+
], TemplateRefRequest.prototype, "partnerId", void 0);
|
|
37
|
+
__decorate([
|
|
38
|
+
(0, class_validator_1.IsOptional)(),
|
|
39
|
+
(0, class_validator_1.IsString)(),
|
|
40
|
+
(0, class_validator_1.Matches)(SEGMENT),
|
|
41
|
+
__metadata("design:type", String)
|
|
42
|
+
], TemplateRefRequest.prototype, "category", void 0);
|
|
43
|
+
__decorate([
|
|
44
|
+
(0, class_validator_1.IsString)(),
|
|
45
|
+
(0, class_validator_1.IsNotEmpty)(),
|
|
46
|
+
(0, class_validator_1.Matches)(SEGMENT),
|
|
47
|
+
__metadata("design:type", String)
|
|
48
|
+
], TemplateRefRequest.prototype, "documentType", void 0);
|
|
49
|
+
__decorate([
|
|
50
|
+
(0, class_validator_1.IsOptional)(),
|
|
51
|
+
(0, class_validator_1.IsString)(),
|
|
52
|
+
(0, class_validator_1.Matches)(/^[0-9]{1,6}$/),
|
|
53
|
+
__metadata("design:type", String)
|
|
54
|
+
], TemplateRefRequest.prototype, "version", void 0);
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const ASSET_CONTENT_TYPES: string[];
|
|
2
|
+
/** Fuente, imagen u hoja de estilo para la carpeta _assets de una empresa o partner. */
|
|
3
|
+
export declare class UploadAssetRequest {
|
|
4
|
+
enterprise: string;
|
|
5
|
+
partnerId?: string;
|
|
6
|
+
path: string;
|
|
7
|
+
contentType: string;
|
|
8
|
+
contentBase64: string;
|
|
9
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.UploadAssetRequest = exports.ASSET_CONTENT_TYPES = void 0;
|
|
13
|
+
const class_validator_1 = require("class-validator");
|
|
14
|
+
const SEGMENT = /^[A-Za-z0-9_-]{1,64}$/;
|
|
15
|
+
/** Ruta relativa dentro de _assets/: hasta 4 carpetas y un archivo, sin "..", con extensión permitida. */
|
|
16
|
+
const ASSET_PATH = /^(?!.*\.\.)([A-Za-z0-9_-]+\/){0,4}[A-Za-z0-9_.()-]+\.(ttf|otf|woff|woff2|png|jpg|jpeg|svg|gif|css)$/;
|
|
17
|
+
exports.ASSET_CONTENT_TYPES = ['font/ttf', 'font/otf', 'font/woff', 'font/woff2', 'image/png', 'image/jpeg', 'image/svg+xml', 'image/gif', 'text/css'];
|
|
18
|
+
/** Fuente, imagen u hoja de estilo para la carpeta _assets de una empresa o partner. */
|
|
19
|
+
class UploadAssetRequest {
|
|
20
|
+
}
|
|
21
|
+
exports.UploadAssetRequest = UploadAssetRequest;
|
|
22
|
+
__decorate([
|
|
23
|
+
(0, class_validator_1.IsString)(),
|
|
24
|
+
(0, class_validator_1.IsNotEmpty)(),
|
|
25
|
+
(0, class_validator_1.Matches)(SEGMENT),
|
|
26
|
+
__metadata("design:type", String)
|
|
27
|
+
], UploadAssetRequest.prototype, "enterprise", void 0);
|
|
28
|
+
__decorate([
|
|
29
|
+
(0, class_validator_1.IsOptional)(),
|
|
30
|
+
(0, class_validator_1.IsString)(),
|
|
31
|
+
(0, class_validator_1.Matches)(SEGMENT),
|
|
32
|
+
__metadata("design:type", String)
|
|
33
|
+
], UploadAssetRequest.prototype, "partnerId", void 0);
|
|
34
|
+
__decorate([
|
|
35
|
+
(0, class_validator_1.IsString)(),
|
|
36
|
+
(0, class_validator_1.Matches)(ASSET_PATH),
|
|
37
|
+
__metadata("design:type", String)
|
|
38
|
+
], UploadAssetRequest.prototype, "path", void 0);
|
|
39
|
+
__decorate([
|
|
40
|
+
(0, class_validator_1.IsString)(),
|
|
41
|
+
(0, class_validator_1.IsIn)(exports.ASSET_CONTENT_TYPES),
|
|
42
|
+
__metadata("design:type", String)
|
|
43
|
+
], UploadAssetRequest.prototype, "contentType", void 0);
|
|
44
|
+
__decorate([
|
|
45
|
+
(0, class_validator_1.IsString)(),
|
|
46
|
+
(0, class_validator_1.IsNotEmpty)(),
|
|
47
|
+
(0, class_validator_1.IsBase64)(),
|
|
48
|
+
__metadata("design:type", String)
|
|
49
|
+
], UploadAssetRequest.prototype, "contentBase64", void 0);
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export * from './dtos/TemplateRefRequest';
|
|
2
|
+
export * from './dtos/RenderDocumentRequest';
|
|
3
|
+
export * from './dtos/GeneratePdfRequest';
|
|
4
|
+
export * from './dtos/MergePdfsRequest';
|
|
5
|
+
export * from './dtos/PdfDocumentResponse';
|
|
6
|
+
export * from './dtos/RenderDocumentResponse';
|
|
7
|
+
export * from './dtos/TemplateLocationRequest';
|
|
8
|
+
export * from './dtos/PublishTemplateRequest';
|
|
9
|
+
export * from './dtos/PublishTemplateResponse';
|
|
10
|
+
export * from './dtos/UploadAssetRequest';
|
|
11
|
+
export * from './dtos/UploadAssetResponse';
|
|
12
|
+
export * from './dtos/TemplateSummaryResponse';
|
|
13
|
+
export * from './dtos/DocumentUrlResponse';
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
//dtos
|
|
18
|
+
__exportStar(require("./dtos/TemplateRefRequest"), exports);
|
|
19
|
+
__exportStar(require("./dtos/RenderDocumentRequest"), exports);
|
|
20
|
+
__exportStar(require("./dtos/GeneratePdfRequest"), exports);
|
|
21
|
+
__exportStar(require("./dtos/MergePdfsRequest"), exports);
|
|
22
|
+
__exportStar(require("./dtos/PdfDocumentResponse"), exports);
|
|
23
|
+
__exportStar(require("./dtos/RenderDocumentResponse"), exports);
|
|
24
|
+
__exportStar(require("./dtos/TemplateLocationRequest"), exports);
|
|
25
|
+
__exportStar(require("./dtos/PublishTemplateRequest"), exports);
|
|
26
|
+
__exportStar(require("./dtos/PublishTemplateResponse"), exports);
|
|
27
|
+
__exportStar(require("./dtos/UploadAssetRequest"), exports);
|
|
28
|
+
__exportStar(require("./dtos/UploadAssetResponse"), exports);
|
|
29
|
+
__exportStar(require("./dtos/TemplateSummaryResponse"), exports);
|
|
30
|
+
__exportStar(require("./dtos/DocumentUrlResponse"), exports);
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -209,3 +209,6 @@ export * as Rewards from './rewards';
|
|
|
209
209
|
// servicios emisores: POST /events (request/response) y GET /runs/{id}.
|
|
210
210
|
export * as RewardsEligibility from './rewardsEligibility';
|
|
211
211
|
export * as DatalakeReports from './datalakeReports';
|
|
212
|
+
|
|
213
|
+
// PdfRender: DTOs del lambda pdf-render-business (plantilla HTML → PDF multitenant y su backoffice).
|
|
214
|
+
export * as PdfRender from './pdfRender';
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** Nueva URL firmada para un documento ya guardado. */
|
|
2
|
+
export class DocumentUrlResponse {
|
|
3
|
+
documentId!: string;
|
|
4
|
+
url!: string;
|
|
5
|
+
/** ISO-8601. */
|
|
6
|
+
expiresAt!: string;
|
|
7
|
+
sha256!: string;
|
|
8
|
+
pages!: number;
|
|
9
|
+
bytes!: number;
|
|
10
|
+
/** ISO-8601 de la generación. */
|
|
11
|
+
createdAt!: string;
|
|
12
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { IsBoolean, IsNotEmpty, IsOptional, IsString } from "class-validator";
|
|
2
|
+
|
|
3
|
+
/** HTML ya resuelto por el consumidor; se imprime en A4 con márgenes de 2 mm. */
|
|
4
|
+
export class GeneratePdfRequest {
|
|
5
|
+
@IsString() @IsNotEmpty()
|
|
6
|
+
html!: string;
|
|
7
|
+
|
|
8
|
+
/** Además de la URL, devuelve el PDF en base64 en la respuesta (tope de 4 MiB). */
|
|
9
|
+
@IsOptional() @IsBoolean()
|
|
10
|
+
includeContent?: boolean;
|
|
11
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ArrayMaxSize, ArrayMinSize, IsArray, IsBoolean, IsOptional, IsString } from "class-validator";
|
|
2
|
+
|
|
3
|
+
/** PDFs en base64, en el orden en que deben quedar en el documento final. */
|
|
4
|
+
export class MergePdfsRequest {
|
|
5
|
+
@IsArray() @ArrayMinSize(1) @ArrayMaxSize(50) @IsString({ each: true })
|
|
6
|
+
pdfs!: string[];
|
|
7
|
+
|
|
8
|
+
/** Además de la URL, devuelve el PDF en base64 en la respuesta (tope de 4 MiB). */
|
|
9
|
+
@IsOptional() @IsBoolean()
|
|
10
|
+
includeContent?: boolean;
|
|
11
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Documento PDF generado y guardado por pdf-render-business.
|
|
3
|
+
* La URL firmada vence en `expiresAt`; para una nueva se usa GET /documents/{documentId}/url.
|
|
4
|
+
*/
|
|
5
|
+
export class PdfDocumentResponse {
|
|
6
|
+
documentId!: string;
|
|
7
|
+
url!: string;
|
|
8
|
+
/** ISO-8601. */
|
|
9
|
+
expiresAt!: string;
|
|
10
|
+
/** SHA-256 en hexadecimal del PDF exacto que quedó guardado. */
|
|
11
|
+
sha256!: string;
|
|
12
|
+
pages!: number;
|
|
13
|
+
bytes!: number;
|
|
14
|
+
/** Sólo cuando el request pidió `includeContent: true`. */
|
|
15
|
+
base64?: string;
|
|
16
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { IsDefined, IsNotEmpty, IsString, Matches, ValidateNested } from "class-validator";
|
|
2
|
+
import { Type } from "class-transformer";
|
|
3
|
+
import { TemplateLocationRequest } from "./TemplateLocationRequest";
|
|
4
|
+
|
|
5
|
+
/** Tipo de documento al que se le publica una versión nueva. */
|
|
6
|
+
export class PublishTemplateTarget extends TemplateLocationRequest {
|
|
7
|
+
@IsString() @IsNotEmpty() @Matches(/^[A-Za-z0-9_-]{1,64}$/)
|
|
8
|
+
documentType!: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/** Publica el HTML como la siguiente versión del tipo de documento. La versión la asigna el servicio. */
|
|
12
|
+
export class PublishTemplateRequest {
|
|
13
|
+
@IsDefined() @ValidateNested() @Type(() => PublishTemplateTarget)
|
|
14
|
+
template!: PublishTemplateTarget;
|
|
15
|
+
|
|
16
|
+
@IsString() @IsNotEmpty()
|
|
17
|
+
html!: string;
|
|
18
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { IsBoolean, IsDefined, IsObject, IsOptional, ValidateNested } from "class-validator";
|
|
2
|
+
import { Type } from "class-transformer";
|
|
3
|
+
import { TemplateRefRequest } from "./TemplateRefRequest";
|
|
4
|
+
|
|
5
|
+
export class RenderDocumentRequest {
|
|
6
|
+
@IsDefined() @ValidateNested() @Type(() => TemplateRefRequest)
|
|
7
|
+
template!: TemplateRefRequest;
|
|
8
|
+
|
|
9
|
+
/** Variables de la plantilla. Se escapan como HTML salvo que la plantilla use {{{triple}}}. */
|
|
10
|
+
@IsDefined() @IsObject()
|
|
11
|
+
data!: Record<string, unknown>;
|
|
12
|
+
|
|
13
|
+
/** Además de la URL, devuelve el PDF en base64 en la respuesta (tope de 4 MiB). */
|
|
14
|
+
@IsOptional() @IsBoolean()
|
|
15
|
+
includeContent?: boolean;
|
|
16
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { IsNotEmpty, IsOptional, IsString, Matches } from "class-validator";
|
|
2
|
+
|
|
3
|
+
const SEGMENT = /^[A-Za-z0-9_-]{1,64}$/;
|
|
4
|
+
|
|
5
|
+
/** Carpeta del bucket de plantillas: empresa, y opcionalmente partner + categoría. */
|
|
6
|
+
export class TemplateLocationRequest {
|
|
7
|
+
@IsString() @IsNotEmpty() @Matches(SEGMENT)
|
|
8
|
+
enterprise!: string;
|
|
9
|
+
|
|
10
|
+
@IsOptional() @IsString() @Matches(SEGMENT)
|
|
11
|
+
partnerId?: string;
|
|
12
|
+
|
|
13
|
+
@IsOptional() @IsString() @Matches(SEGMENT)
|
|
14
|
+
category?: string;
|
|
15
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { IsNotEmpty, IsOptional, IsString, Matches } from "class-validator";
|
|
2
|
+
|
|
3
|
+
/** Segmento de ruta S3 permitido: letras, dígitos, guion y guion bajo. */
|
|
4
|
+
const SEGMENT = /^[A-Za-z0-9_-]{1,64}$/;
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Referencia a una plantilla del bucket de plantillas.
|
|
8
|
+
* Layout profundo: {enterprise}/{partnerId}/{category}/{documentType}/V{version}.html
|
|
9
|
+
* Layout plano: {enterprise}/{documentType}/V{version}.html
|
|
10
|
+
* partnerId y category van juntos o no van.
|
|
11
|
+
*/
|
|
12
|
+
export class TemplateRefRequest {
|
|
13
|
+
@IsString() @IsNotEmpty() @Matches(SEGMENT)
|
|
14
|
+
enterprise!: string;
|
|
15
|
+
|
|
16
|
+
@IsOptional() @IsString() @Matches(SEGMENT)
|
|
17
|
+
partnerId?: string;
|
|
18
|
+
|
|
19
|
+
@IsOptional() @IsString() @Matches(SEGMENT)
|
|
20
|
+
category?: string;
|
|
21
|
+
|
|
22
|
+
@IsString() @IsNotEmpty() @Matches(SEGMENT)
|
|
23
|
+
documentType!: string;
|
|
24
|
+
|
|
25
|
+
/** Número de versión sin la "V". Sin valor se usa la versión más alta publicada. */
|
|
26
|
+
@IsOptional() @IsString() @Matches(/^[0-9]{1,6}$/)
|
|
27
|
+
version?: string;
|
|
28
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { IsBase64, IsIn, IsNotEmpty, IsOptional, IsString, Matches } from "class-validator";
|
|
2
|
+
|
|
3
|
+
const SEGMENT = /^[A-Za-z0-9_-]{1,64}$/;
|
|
4
|
+
/** Ruta relativa dentro de _assets/: hasta 4 carpetas y un archivo, sin "..", con extensión permitida. */
|
|
5
|
+
const ASSET_PATH = /^(?!.*\.\.)([A-Za-z0-9_-]+\/){0,4}[A-Za-z0-9_.()-]+\.(ttf|otf|woff|woff2|png|jpg|jpeg|svg|gif|css)$/;
|
|
6
|
+
|
|
7
|
+
export const ASSET_CONTENT_TYPES = ['font/ttf', 'font/otf', 'font/woff', 'font/woff2', 'image/png', 'image/jpeg', 'image/svg+xml', 'image/gif', 'text/css'];
|
|
8
|
+
|
|
9
|
+
/** Fuente, imagen u hoja de estilo para la carpeta _assets de una empresa o partner. */
|
|
10
|
+
export class UploadAssetRequest {
|
|
11
|
+
@IsString() @IsNotEmpty() @Matches(SEGMENT)
|
|
12
|
+
enterprise!: string;
|
|
13
|
+
|
|
14
|
+
@IsOptional() @IsString() @Matches(SEGMENT)
|
|
15
|
+
partnerId?: string;
|
|
16
|
+
|
|
17
|
+
@IsString() @Matches(ASSET_PATH)
|
|
18
|
+
path!: string;
|
|
19
|
+
|
|
20
|
+
@IsString() @IsIn(ASSET_CONTENT_TYPES)
|
|
21
|
+
contentType!: string;
|
|
22
|
+
|
|
23
|
+
@IsString() @IsNotEmpty() @IsBase64()
|
|
24
|
+
contentBase64!: string;
|
|
25
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
//dtos
|
|
2
|
+
export * from './dtos/TemplateRefRequest';
|
|
3
|
+
export * from './dtos/RenderDocumentRequest';
|
|
4
|
+
export * from './dtos/GeneratePdfRequest';
|
|
5
|
+
export * from './dtos/MergePdfsRequest';
|
|
6
|
+
export * from './dtos/PdfDocumentResponse';
|
|
7
|
+
export * from './dtos/RenderDocumentResponse';
|
|
8
|
+
export * from './dtos/TemplateLocationRequest';
|
|
9
|
+
export * from './dtos/PublishTemplateRequest';
|
|
10
|
+
export * from './dtos/PublishTemplateResponse';
|
|
11
|
+
export * from './dtos/UploadAssetRequest';
|
|
12
|
+
export * from './dtos/UploadAssetResponse';
|
|
13
|
+
export * from './dtos/TemplateSummaryResponse';
|
|
14
|
+
export * from './dtos/DocumentUrlResponse';
|